526
526
* set the appropriate number of extents
527
* this iterates block by block, this can be optimised using extents
528
529
for (b = irec->br_startblock; b < irec->br_startblock +
529
530
irec->br_blockcount; b += mp->m_sb.sb_rextsize) {
548
state = get_rtbno_state(mp, ext);
549
state = get_rtbmap(ext);
553
set_rtbno_state(mp, ext, XR_E_INUSE);
553
set_rtbmap(ext, XR_E_INUSE);
556
do_error(_("bad state in rt block map %llu\n"), ext);
560
do_error(_("data fork in rt inode %llu found "
561
"metadata block %llu in rt bmap\n"),
557
do_error(_("bad state in rt block map %llu\n"),
563
do_error(_("data fork in rt inode %llu found "
564
"metadata block %llu in rt bmap\n"),
567
set_rtbmap(ext, XR_E_MULT);
568
do_warn(_("data fork in rt inode %llu claims "
569
"used rt block %llu\n"),
572
set_rtbno_state(mp, ext, XR_E_MULT);
573
do_warn(_("data fork in rt inode %llu claims "
574
"used rt block %llu\n"),
580
do_error(_("illegal state %d in rt block map "
581
"%llu\n"), state, b);
574
do_error(_("illegal state %d in rt block map "
575
"%llu\n"), state, b);
726
721
agno = XFS_FSB_TO_AGNO(mp, irec.br_startblock);
727
722
agbno = XFS_FSB_TO_AGBNO(mp, irec.br_startblock);
728
e = irec.br_startblock + irec.br_blockcount;
723
ebno = agbno + irec.br_blockcount;
729
724
if (agno != locked_agno) {
730
725
if (locked_agno != -1)
731
726
pthread_mutex_unlock(&ag_locks[locked_agno]);
740
735
* checking each entry without setting the
743
for (b = irec.br_startblock; b < e; b++, agbno++) {
744
if (search_dup_extent(mp, agno, agbno)) {
745
do_warn(_("%s fork in ino %llu claims "
746
"dup extent, off - %llu, "
747
"start - %llu, cnt %llu\n"),
748
forkname, ino, irec.br_startoff,
738
if (search_dup_extent(agno, agbno, ebno)) {
739
do_warn(_("%s fork in ino %llu claims "
740
"dup extent, off - %llu, "
741
"start - %llu, cnt %llu\n"),
742
forkname, ino, irec.br_startoff,
754
747
*tot += irec.br_blockcount;
758
for (b = irec.br_startblock; b < e; b++, agbno++) {
760
* Process in chunks of 16 (XR_BB_UNIT/XR_BB)
761
* for common XR_E_UNKNOWN to XR_E_INUSE transition
763
if (((agbno & XR_BB_MASK) == 0) && ((irec.br_startblock + irec.br_blockcount - b) >= (XR_BB_UNIT/XR_BB))) {
764
if (ba_bmap[agno][agbno>>XR_BB] == XR_E_UNKNOWN_LL) {
765
ba_bmap[agno][agbno>>XR_BB] = XR_E_INUSE_LL;
766
agbno += (XR_BB_UNIT/XR_BB) - 1;
767
b += (XR_BB_UNIT/XR_BB) - 1;
773
state = get_agbno_state(mp, agno, agbno);
751
for (b = irec.br_startblock;
753
b += blen, agbno += blen) {
754
state = get_bmap_ext(agno, agbno, ebno, &blen);
780
760
forkname, ino, (__uint64_t) b);
781
761
/* fall through ... */
782
762
case XR_E_UNKNOWN:
783
set_agbno_state(mp, agno, agbno, XR_E_INUSE);
763
set_bmap_ext(agno, agbno, blen, XR_E_INUSE);
786
766
case XR_E_BAD_STATE:
799
set_agbno_state(mp, agno, agbno, XR_E_MULT);
779
set_bmap_ext(agno, agbno, blen, XR_E_MULT);
800
780
do_warn(_("%s fork in %s inode %llu claims "
801
781
"used block %llu\n"),
802
782
forkname, ftype, ino, (__uint64_t) b);
2052
2032
if (dinoc->di_format != XFS_DINODE_FMT_LOCAL && type != XR_INO_RTDATA)
2053
*dblkmap = blkmap_alloc(*nextents);
2033
*dblkmap = blkmap_alloc(*nextents, XFS_DATA_FORK);
2056
2036
switch (dinoc->di_format) {
2172
2152
err = process_lclinode(mp, agno, ino, dino, XFS_ATTR_FORK);
2174
2154
case XFS_DINODE_FMT_EXTENTS:
2175
ablkmap = blkmap_alloc(*anextents);
2155
ablkmap = blkmap_alloc(*anextents, XFS_ATTR_FORK);
2176
2156
*anextents = 0;
2177
2157
err = process_exinode(mp, agno, ino, dino, type, dirty,
2178
2158
atotblocks, anextents, &ablkmap,
2179
2159
XFS_ATTR_FORK, check_dups);
2181
2161
case XFS_DINODE_FMT_BTREE:
2182
ablkmap = blkmap_alloc(*anextents);
2162
ablkmap = blkmap_alloc(*anextents, XFS_ATTR_FORK);
2183
2163
*anextents = 0;
2184
2164
err = process_btinode(mp, agno, ino, dino, type, dirty,
2185
2165
atotblocks, anextents, &ablkmap,