2 * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it would be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
37 IS_USER_QUOTA
, IS_PROJECT_QUOTA
, IS_GROUP_QUOTA
,
41 DBM_UNKNOWN
, DBM_AGF
, DBM_AGFL
, DBM_AGI
,
42 DBM_ATTR
, DBM_BTBMAPA
, DBM_BTBMAPD
, DBM_BTBNO
,
43 DBM_BTCNT
, DBM_BTINO
, DBM_DATA
, DBM_DIR
,
44 DBM_FREE1
, DBM_FREE2
, DBM_FREELIST
, DBM_INODE
,
45 DBM_LOG
, DBM_MISSING
, DBM_QUOTA
, DBM_RTBITMAP
,
46 DBM_RTDATA
, DBM_RTFREE
, DBM_RTSUM
, DBM_SB
,
47 DBM_SYMLINK
, DBM_BTFINO
, DBM_BTRMAP
, DBM_BTREFC
,
48 DBM_RLDATA
, DBM_COWDATA
,
52 typedef struct inodata
{
61 struct inodata
*parent
;
64 #define MIN_INODATA_HASH_SIZE 256
65 #define MAX_INODATA_HASH_SIZE 65536
66 #define INODATA_AVG_HASH_LENGTH 8
68 typedef struct qinfo
{
74 #define QDATA_HASH_SIZE 256
75 typedef struct qdata
{
82 typedef struct blkent
{
83 xfs_fileoff_t startoff
;
85 xfs_fsblock_t blks
[1];
87 #define BLKENT_SIZE(n) \
88 (offsetof(blkent_t, blks) + (sizeof(xfs_fsblock_t) * (n)))
90 typedef struct blkmap
{
95 #define BLKMAP_SIZE(n) \
96 (offsetof(blkmap_t, ents) + (sizeof(blkent_t *) * (n)))
98 typedef struct freetab
{
101 xfs_dir2_data_off_t ents
[1];
103 #define FREETAB_SIZE(n) \
104 (offsetof(freetab_t, ents) + (sizeof(xfs_dir2_data_off_t) * (n)))
106 typedef struct dirhash
{
107 struct dirhash
*next
;
112 #define DIR_HASH_SIZE 1024
113 #define DIR_HASH_FUNC(h,a) (((h) ^ (a)) % DIR_HASH_SIZE)
115 static xfs_extlen_t agffreeblks
;
116 static xfs_extlen_t agflongest
;
117 static uint64_t agf_aggr_freeblks
; /* aggregate count over all */
118 static uint32_t agfbtreeblks
;
119 static int lazycount
;
120 static xfs_agino_t agicount
;
121 static xfs_agino_t agifreecount
;
122 static xfs_fsblock_t
*blist
;
123 static int blist_size
;
124 static char **dbmap
; /* really dbm_t:8 */
125 static dirhash_t
**dirhash
;
127 static uint64_t fdblocks
;
128 static uint64_t frextents
;
129 static uint64_t icount
;
130 static uint64_t ifree
;
131 static inodata_t
***inodata
;
132 static int inodata_hash_size
;
133 static inodata_t
***inomap
;
137 static qdata_t
**qpdata
;
139 static qdata_t
**qudata
;
141 static qdata_t
**qgdata
;
143 static unsigned sbversion
;
144 static int sbver_err
;
145 static int serious_error
;
147 static xfs_suminfo_t
*sumcompute
;
148 static xfs_suminfo_t
*sumfile
;
149 static const char *typename
[] = {
183 #define CHECK_BLIST(b) (blist_size && check_blist(b))
184 #define CHECK_BLISTA(a,b) \
185 (blist_size && check_blist(XFS_AGB_TO_FSB(mp, a, b)))
187 typedef void (*scan_lbtree_f_t
)(struct xfs_btree_block
*block
,
192 xfs_rfsblock_t
*totd
,
193 xfs_rfsblock_t
*toti
,
199 typedef void (*scan_sbtree_f_t
)(struct xfs_btree_block
*block
,
205 static void add_blist(xfs_fsblock_t bno
);
206 static void add_ilist(xfs_ino_t ino
);
207 static void addlink_inode(inodata_t
*id
);
208 static void addname_inode(inodata_t
*id
, char *name
, int namelen
);
209 static void addparent_inode(inodata_t
*id
, xfs_ino_t parent
);
210 static void blkent_append(blkent_t
**entp
, xfs_fsblock_t b
,
212 static blkent_t
*blkent_new(xfs_fileoff_t o
, xfs_fsblock_t b
,
214 static void blkent_prepend(blkent_t
**entp
, xfs_fsblock_t b
,
216 static blkmap_t
*blkmap_alloc(xfs_extnum_t
);
217 static void blkmap_free(blkmap_t
*blkmap
);
218 static xfs_fsblock_t
blkmap_get(blkmap_t
*blkmap
, xfs_fileoff_t o
);
219 static int blkmap_getn(blkmap_t
*blkmap
, xfs_fileoff_t o
, int nb
,
221 static void blkmap_grow(blkmap_t
**blkmapp
, blkent_t
**entp
,
223 static xfs_fileoff_t
blkmap_next_off(blkmap_t
*blkmap
, xfs_fileoff_t o
,
225 static void blkmap_set_blk(blkmap_t
**blkmapp
, xfs_fileoff_t o
,
227 static void blkmap_set_ext(blkmap_t
**blkmapp
, xfs_fileoff_t o
,
228 xfs_fsblock_t b
, xfs_extlen_t c
);
229 static void blkmap_shrink(blkmap_t
*blkmap
, blkent_t
**entp
);
230 static int blockfree_f(int argc
, char **argv
);
231 static int blockget_f(int argc
, char **argv
);
232 static int blocktrash_f(int argc
, char **argv
);
233 static int blockuse_f(int argc
, char **argv
);
234 static int check_blist(xfs_fsblock_t bno
);
235 static void check_dbmap(xfs_agnumber_t agno
, xfs_agblock_t agbno
,
236 xfs_extlen_t len
, dbm_t type
,
238 static int check_inomap(xfs_agnumber_t agno
, xfs_agblock_t agbno
,
239 xfs_extlen_t len
, xfs_ino_t c_ino
);
240 static void check_linkcounts(xfs_agnumber_t agno
);
241 static int check_range(xfs_agnumber_t agno
, xfs_agblock_t agbno
,
243 static void check_rdbmap(xfs_rfsblock_t bno
, xfs_extlen_t len
,
245 static int check_rinomap(xfs_rfsblock_t bno
, xfs_extlen_t len
,
247 static void check_rootdir(void);
248 static int check_rrange(xfs_rfsblock_t bno
, xfs_extlen_t len
);
249 static void check_set_dbmap(xfs_agnumber_t agno
,
250 xfs_agblock_t agbno
, xfs_extlen_t len
,
251 dbm_t type1
, dbm_t type2
,
252 xfs_agnumber_t c_agno
,
253 xfs_agblock_t c_agbno
);
254 static void check_set_rdbmap(xfs_rfsblock_t bno
, xfs_extlen_t len
,
255 dbm_t type1
, dbm_t type2
);
256 static void check_summary(void);
257 static void checknot_dbmap(xfs_agnumber_t agno
, xfs_agblock_t agbno
,
258 xfs_extlen_t len
, int typemask
);
259 static void checknot_rdbmap(xfs_rfsblock_t bno
, xfs_extlen_t len
,
261 static void dir_hash_add(xfs_dahash_t hash
,
262 xfs_dir2_dataptr_t addr
);
263 static void dir_hash_check(inodata_t
*id
, int v
);
264 static void dir_hash_done(void);
265 static void dir_hash_init(void);
266 static int dir_hash_see(xfs_dahash_t hash
,
267 xfs_dir2_dataptr_t addr
);
268 static inodata_t
*find_inode(xfs_ino_t ino
, int add
);
269 static void free_inodata(xfs_agnumber_t agno
);
270 static int init(int argc
, char **argv
);
271 static char *inode_name(xfs_ino_t ino
, inodata_t
**ipp
);
272 static int ncheck_f(int argc
, char **argv
);
273 static char *prepend_path(char *oldpath
, char *parent
);
274 static xfs_ino_t
process_block_dir_v2(blkmap_t
*blkmap
, int *dot
,
275 int *dotdot
, inodata_t
*id
);
276 static void process_bmbt_reclist(xfs_bmbt_rec_t
*rp
, int numrecs
,
277 dbm_t type
, inodata_t
*id
,
280 static void process_btinode(inodata_t
*id
, xfs_dinode_t
*dip
,
281 dbm_t type
, xfs_rfsblock_t
*totd
,
282 xfs_rfsblock_t
*toti
, xfs_extnum_t
*nex
,
283 blkmap_t
**blkmapp
, int whichfork
);
284 static xfs_ino_t
process_data_dir_v2(int *dot
, int *dotdot
,
285 inodata_t
*id
, int v
,
287 freetab_t
**freetabp
);
288 static xfs_dir2_data_free_t
*process_data_dir_v2_freefind(
289 struct xfs_dir2_data_hdr
*data
,
290 struct xfs_dir2_data_unused
*dup
);
291 static void process_dir(xfs_dinode_t
*dip
, blkmap_t
*blkmap
,
293 static int process_dir_v2(xfs_dinode_t
*dip
, blkmap_t
*blkmap
,
294 int *dot
, int *dotdot
, inodata_t
*id
,
296 static void process_exinode(inodata_t
*id
, xfs_dinode_t
*dip
,
297 dbm_t type
, xfs_rfsblock_t
*totd
,
298 xfs_rfsblock_t
*toti
, xfs_extnum_t
*nex
,
299 blkmap_t
**blkmapp
, int whichfork
);
300 static void process_inode(xfs_agf_t
*agf
, xfs_agino_t agino
,
301 xfs_dinode_t
*dip
, int isfree
);
302 static void process_lclinode(inodata_t
*id
, xfs_dinode_t
*dip
,
303 dbm_t type
, xfs_rfsblock_t
*totd
,
304 xfs_rfsblock_t
*toti
, xfs_extnum_t
*nex
,
305 blkmap_t
**blkmapp
, int whichfork
);
306 static xfs_ino_t
process_leaf_node_dir_v2(blkmap_t
*blkmap
, int *dot
,
307 int *dotdot
, inodata_t
*id
,
308 xfs_fsize_t dirsize
);
309 static void process_leaf_node_dir_v2_free(inodata_t
*id
, int v
,
312 static void process_leaf_node_dir_v2_int(inodata_t
*id
, int v
,
315 static void process_quota(qtype_t qtype
, inodata_t
*id
,
317 static void process_rtbitmap(blkmap_t
*blkmap
);
318 static void process_rtsummary(blkmap_t
*blkmap
);
319 static xfs_ino_t
process_sf_dir_v2(xfs_dinode_t
*dip
, int *dot
,
320 int *dotdot
, inodata_t
*id
);
321 static void quota_add(xfs_dqid_t
*p
, xfs_dqid_t
*g
, xfs_dqid_t
*u
,
322 int dq
, xfs_qcnt_t bc
, xfs_qcnt_t ic
,
324 static void quota_add1(qdata_t
**qt
, xfs_dqid_t id
, int dq
,
325 xfs_qcnt_t bc
, xfs_qcnt_t ic
,
327 static void quota_check(char *s
, qdata_t
**qt
);
328 static void quota_init(void);
329 static void scan_ag(xfs_agnumber_t agno
);
330 static void scan_freelist(xfs_agf_t
*agf
);
331 static void scan_lbtree(xfs_fsblock_t root
, int nlevels
,
332 scan_lbtree_f_t func
, dbm_t type
,
333 inodata_t
*id
, xfs_rfsblock_t
*totd
,
334 xfs_rfsblock_t
*toti
, xfs_extnum_t
*nex
,
335 blkmap_t
**blkmapp
, int isroot
,
337 static void scan_sbtree(xfs_agf_t
*agf
, xfs_agblock_t root
,
338 int nlevels
, int isroot
,
339 scan_sbtree_f_t func
, typnm_t btype
);
340 static void scanfunc_bmap(struct xfs_btree_block
*block
,
341 int level
, dbm_t type
, xfs_fsblock_t bno
,
342 inodata_t
*id
, xfs_rfsblock_t
*totd
,
343 xfs_rfsblock_t
*toti
, xfs_extnum_t
*nex
,
344 blkmap_t
**blkmapp
, int isroot
,
346 static void scanfunc_bno(struct xfs_btree_block
*block
, int level
,
347 xfs_agf_t
*agf
, xfs_agblock_t bno
,
349 static void scanfunc_cnt(struct xfs_btree_block
*block
, int level
,
350 xfs_agf_t
*agf
, xfs_agblock_t bno
,
352 static void scanfunc_ino(struct xfs_btree_block
*block
, int level
,
353 xfs_agf_t
*agf
, xfs_agblock_t bno
,
355 static void scanfunc_fino(struct xfs_btree_block
*block
, int level
,
356 struct xfs_agf
*agf
, xfs_agblock_t bno
,
358 static void scanfunc_rmap(struct xfs_btree_block
*block
, int level
,
359 struct xfs_agf
*agf
, xfs_agblock_t bno
,
361 static void scanfunc_refcnt(struct xfs_btree_block
*block
, int level
,
362 struct xfs_agf
*agf
, xfs_agblock_t bno
,
364 static void set_dbmap(xfs_agnumber_t agno
, xfs_agblock_t agbno
,
365 xfs_extlen_t len
, dbm_t type
,
366 xfs_agnumber_t c_agno
, xfs_agblock_t c_agbno
);
367 static void set_inomap(xfs_agnumber_t agno
, xfs_agblock_t agbno
,
368 xfs_extlen_t len
, inodata_t
*id
);
369 static void set_rdbmap(xfs_rfsblock_t bno
, xfs_extlen_t len
,
371 static void set_rinomap(xfs_rfsblock_t bno
, xfs_extlen_t len
,
373 static void setlink_inode(inodata_t
*id
, nlink_t nlink
, int isdir
,
376 static const cmdinfo_t blockfree_cmd
=
377 { "blockfree", NULL
, blockfree_f
, 0, 0, 0,
378 NULL
, N_("free block usage information"), NULL
};
379 static const cmdinfo_t blockget_cmd
=
380 { "blockget", "check", blockget_f
, 0, -1, 0,
381 N_("[-s|-v] [-n] [-t] [-b bno]... [-i ino] ..."),
382 N_("get block usage and check consistency"), NULL
};
383 static const cmdinfo_t blocktrash_cmd
=
384 { "blocktrash", NULL
, blocktrash_f
, 0, -1, 0,
385 N_("[-n count] [-x minlen] [-y maxlen] [-s seed] [-0123] [-t type] ..."),
386 N_("trash randomly selected block(s)"), NULL
};
387 static const cmdinfo_t blockuse_cmd
=
388 { "blockuse", NULL
, blockuse_f
, 0, 3, 0,
389 N_("[-n] [-c blockcount]"),
390 N_("print usage for current block(s)"), NULL
};
391 static const cmdinfo_t ncheck_cmd
=
392 { "ncheck", NULL
, ncheck_f
, 0, -1, 0,
393 N_("[-s] [-i ino] ..."),
394 N_("print inode-name pairs"), NULL
};
402 blist
= xrealloc(blist
, blist_size
* sizeof(bno
));
403 blist
[blist_size
- 1] = bno
;
412 id
= find_inode(ino
, 1);
414 dbprintf(_("-i %lld bad inode number\n"), ino
);
425 if (verbose
|| id
->ilist
)
426 dbprintf(_("inode %lld add link, now %u\n"), id
->ino
,
436 if (!nflag
|| id
->name
)
438 id
->name
= xmalloc(namelen
+ 1);
439 memcpy(id
->name
, name
, namelen
);
440 id
->name
[namelen
] = '\0';
450 pid
= find_inode(parent
, 1);
452 if (verbose
|| id
->ilist
|| (pid
&& pid
->ilist
))
453 dbprintf(_("inode %lld parent %lld\n"), id
->ino
, parent
);
466 *entp
= ent
= xrealloc(ent
, BLKENT_SIZE(c
+ ent
->nblks
));
467 for (i
= 0; i
< c
; i
++)
468 ent
->blks
[ent
->nblks
+ i
] = b
+ i
;
481 ent
= xmalloc(BLKENT_SIZE(c
));
484 for (i
= 0; i
< c
; i
++)
485 ent
->blks
[i
] = b
+ i
;
500 newent
= xmalloc(BLKENT_SIZE(oldent
->nblks
+ c
));
501 newent
->nblks
= oldent
->nblks
+ c
;
502 newent
->startoff
= oldent
->startoff
- c
;
503 for (i
= 0; i
< c
; i
++)
504 newent
->blks
[i
] = b
+ c
;
505 for (; i
< oldent
->nblks
+ c
; i
++)
506 newent
->blks
[i
] = oldent
->blks
[i
- c
];
519 blkmap
= xmalloc(BLKMAP_SIZE(nex
));
520 blkmap
->naents
= nex
;
532 for (i
= 0, entp
= blkmap
->ents
; i
< blkmap
->nents
; i
++, entp
++)
546 for (i
= 0, entp
= blkmap
->ents
; i
< blkmap
->nents
; i
++, entp
++) {
548 if (o
>= ent
->startoff
&& o
< ent
->startoff
+ ent
->nblks
)
549 return ent
->blks
[o
- ent
->startoff
];
568 for (i
= nex
= 0, bmp
= NULL
, entp
= blkmap
->ents
;
572 if (ent
->startoff
>= o
+ nb
)
574 if (ent
->startoff
+ ent
->nblks
<= o
)
576 for (ento
= ent
->startoff
;
577 ento
< ent
->startoff
+ ent
->nblks
&& ento
< o
+ nb
;
582 bmp
[nex
- 1].startoff
+ bmp
[nex
- 1].blockcount
==
584 bmp
[nex
- 1].startblock
+ bmp
[nex
- 1].blockcount
==
585 ent
->blks
[ento
- ent
->startoff
])
586 bmp
[nex
- 1].blockcount
++;
588 bmp
= realloc(bmp
, ++nex
* sizeof(*bmp
));
589 bmp
[nex
- 1].startoff
= ento
;
590 bmp
[nex
- 1].startblock
=
591 ent
->blks
[ento
- ent
->startoff
];
592 bmp
[nex
- 1].blockcount
= 1;
593 bmp
[nex
- 1].flag
= 0;
612 idx
= (int)(entp
- blkmap
->ents
);
613 if (blkmap
->naents
== blkmap
->nents
) {
614 blkmap
= xrealloc(blkmap
, BLKMAP_SIZE(blkmap
->nents
+ 1));
618 for (i
= blkmap
->nents
; i
> idx
; i
--)
619 blkmap
->ents
[i
] = blkmap
->ents
[i
- 1];
620 blkmap
->ents
[idx
] = newent
;
632 ent
= blkmap
->ents
[blkmap
->nents
- 1];
633 return ent
->startoff
+ ent
->nblks
;
647 if (o
== NULLFILEOFF
) {
649 ent
= blkmap
->ents
[0];
650 return ent
->startoff
;
652 entp
= &blkmap
->ents
[*t
];
654 if (o
< ent
->startoff
+ ent
->nblks
- 1)
657 if (entp
>= &blkmap
->ents
[blkmap
->nents
])
661 return ent
->startoff
;
676 for (entp
= blkmap
->ents
; entp
< &blkmap
->ents
[blkmap
->nents
]; entp
++) {
678 if (o
< ent
->startoff
- 1) {
679 ent
= blkent_new(o
, b
, 1);
680 blkmap_grow(blkmapp
, entp
, ent
);
683 if (o
== ent
->startoff
- 1) {
684 blkent_prepend(entp
, b
, 1);
687 if (o
>= ent
->startoff
&& o
< ent
->startoff
+ ent
->nblks
) {
688 ent
->blks
[o
- ent
->startoff
] = b
;
691 if (o
> ent
->startoff
+ ent
->nblks
)
693 blkent_append(entp
, b
, 1);
694 if (entp
== &blkmap
->ents
[blkmap
->nents
- 1])
698 if (ent
->startoff
+ ent
->nblks
< nextent
->startoff
)
700 blkent_append(entp
, nextent
->blks
[0], nextent
->nblks
);
701 blkmap_shrink(blkmap
, &entp
[1]);
704 ent
= blkent_new(o
, b
, 1);
705 blkmap_grow(blkmapp
, entp
, ent
);
721 if (!blkmap
->nents
) {
722 blkmap
->ents
[0] = blkent_new(o
, b
, c
);
726 entp
= &blkmap
->ents
[blkmap
->nents
- 1];
728 if (ent
->startoff
+ ent
->nblks
== o
) {
729 blkent_append(entp
, b
, c
);
732 if (ent
->startoff
+ ent
->nblks
< o
) {
733 ent
= blkent_new(o
, b
, c
);
734 blkmap_grow(blkmapp
, &blkmap
->ents
[blkmap
->nents
], ent
);
737 for (i
= 0; i
< c
; i
++)
738 blkmap_set_blk(blkmapp
, o
+ i
, b
+ i
);
750 idx
= (int)(entp
- blkmap
->ents
);
751 for (i
= idx
+ 1; i
< blkmap
->nents
; i
++)
752 blkmap
->ents
[i
] = blkmap
->ents
[i
- 1];
766 dbprintf(_("block usage information not allocated\n"));
769 rt
= mp
->m_sb
.sb_rextents
!= 0;
770 for (c
= 0; c
< mp
->m_sb
.sb_agcount
; c
++) {
780 sumcompute
= sumfile
= NULL
;
792 * Check consistency of xfs filesystem contents.
804 dbprintf(_("already have block usage information\n"));
808 if (!init(argc
, argv
)) {
815 oldprefix
= dbprefix
;
817 for (agno
= 0, sbyell
= 0; agno
< mp
->m_sb
.sb_agcount
; agno
++) {
819 if (sbver_err
> 4 && !sbyell
&& sbver_err
>= agno
) {
821 dbprintf(_("WARNING: this may be a newer XFS "
832 dbprefix
= oldprefix
;
837 * Check that there are no blocks either
838 * a) unaccounted for or
839 * b) bno-free but not cnt-free
841 if (!tflag
) { /* are we in test mode, faking out freespace? */
842 for (agno
= 0; agno
< mp
->m_sb
.sb_agcount
; agno
++)
843 checknot_dbmap(agno
, 0, mp
->m_sb
.sb_agblocks
,
844 (1 << DBM_UNKNOWN
) | (1 << DBM_FREE1
));
846 for (agno
= 0; agno
< mp
->m_sb
.sb_agcount
; agno
++)
847 check_linkcounts(agno
);
848 if (mp
->m_sb
.sb_rblocks
) {
850 (xfs_extlen_t
)(mp
->m_sb
.sb_rextents
*
851 mp
->m_sb
.sb_rextsize
),
855 if (mp
->m_sb
.sb_icount
!= icount
) {
857 dbprintf(_("sb_icount %lld, counted %lld\n"),
858 mp
->m_sb
.sb_icount
, icount
);
861 if (mp
->m_sb
.sb_ifree
!= ifree
) {
863 dbprintf(_("sb_ifree %lld, counted %lld\n"),
864 mp
->m_sb
.sb_ifree
, ifree
);
867 if (mp
->m_sb
.sb_fdblocks
!= fdblocks
) {
869 dbprintf(_("sb_fdblocks %lld, counted %lld\n"),
870 mp
->m_sb
.sb_fdblocks
, fdblocks
);
873 if (lazycount
&& mp
->m_sb
.sb_fdblocks
!= agf_aggr_freeblks
) {
875 dbprintf(_("sb_fdblocks %lld, aggregate AGF count %lld\n"),
876 mp
->m_sb
.sb_fdblocks
, agf_aggr_freeblks
);
879 if (mp
->m_sb
.sb_frextents
!= frextents
) {
881 dbprintf(_("sb_frextents %lld, counted %lld\n"),
882 mp
->m_sb
.sb_frextents
, frextents
);
885 if (mp
->m_sb
.sb_bad_features2
!= 0 &&
886 mp
->m_sb
.sb_bad_features2
!= mp
->m_sb
.sb_features2
) {
888 dbprintf(_("sb_features2 (0x%x) not same as "
889 "sb_bad_features2 (0x%x)\n"),
890 mp
->m_sb
.sb_features2
,
891 mp
->m_sb
.sb_bad_features2
);
894 if ((sbversion
& XFS_SB_VERSION_ATTRBIT
) &&
895 !xfs_sb_version_hasattr(&mp
->m_sb
)) {
897 dbprintf(_("sb versionnum missing attr bit %x\n"),
898 XFS_SB_VERSION_ATTRBIT
);
901 if ((sbversion
& XFS_SB_VERSION_QUOTABIT
) &&
902 !xfs_sb_version_hasquota(&mp
->m_sb
)) {
904 dbprintf(_("sb versionnum missing quota bit %x\n"),
905 XFS_SB_VERSION_QUOTABIT
);
908 if (!(sbversion
& XFS_SB_VERSION_ALIGNBIT
) &&
909 xfs_sb_version_hasalign(&mp
->m_sb
)) {
911 dbprintf(_("sb versionnum extra align bit %x\n"),
912 XFS_SB_VERSION_ALIGNBIT
);
916 quota_check("user", qudata
);
918 quota_check("project", qpdata
);
920 quota_check("group", qgdata
);
921 if (sbver_err
> mp
->m_sb
.sb_agcount
/ 2)
922 dbprintf(_("WARNING: this may be a newer XFS filesystem.\n"));
925 dbprefix
= oldprefix
;
929 typedef struct ltab
{
948 const struct xfs_buf_ops
*stashed_ops
;
949 static char *modestr
[] = {
950 N_("zeroed"), N_("set"), N_("flipped"), N_("randomized")
955 agno
= XFS_FSB_TO_AGNO(mp
, XFS_DADDR_TO_FSB(mp
, iocur_top
->bb
));
956 agbno
= XFS_FSB_TO_AGBNO(mp
, XFS_DADDR_TO_FSB(mp
, iocur_top
->bb
));
957 if (iocur_top
->len
== 0) {
958 dbprintf(_("zero-length block %u/%u buffer to trash??\n"),
962 len
= (int)((random() % (ltabp
->max
- ltabp
->min
+ 1)) + ltabp
->min
);
964 * bit_offset >= 0: start fuzzing at this exact bit_offset.
965 * bit_offset < 0: pick an offset at least as high at -(bit_offset + 1).
967 if (bit_offset
< 0) {
968 bit_offset
= -(bit_offset
+ 1);
969 bit_offset
+= (int)(random() % (int)((iocur_top
->len
- bit_offset
) * NBBY
));
971 if (bit_offset
+ len
>= iocur_top
->len
* NBBY
)
972 len
= (iocur_top
->len
* NBBY
) - bit_offset
;
974 stashed_ops
= iocur_top
->bp
->b_ops
;
975 iocur_top
->bp
->b_ops
= NULL
;
976 if ((buf
= iocur_top
->data
) == NULL
) {
977 dbprintf(_("can't read block %u/%u for trashing\n"), agno
, agbno
);
980 for (bitno
= 0; bitno
< len
; bitno
++) {
981 bit
= (bit_offset
+ bitno
) % (mp
->m_sb
.sb_blocksize
* NBBY
);
993 newbit
= (buf
[byte
] & mask
) == 0;
996 newbit
= (int)random() & 1;
1005 iocur_top
->bp
->b_ops
= stashed_ops
;
1006 printf(_("blocktrash: %u/%u %s block %d bit%s starting %d:%d %s\n"),
1007 agno
, agbno
, typename
[type
], len
, len
== 1 ? "" : "s",
1008 bit_offset
/ NBBY
, bit_offset
% NBBY
, modestr
[mode
]);
1016 xfs_agblock_t agbno
;
1017 xfs_agnumber_t agno
;
1019 xfs_rfsblock_t blocks
;
1032 xfs_rfsblock_t randb
;
1036 bool this_block
= false;
1037 int bit_offset
= -1;
1044 gettimeofday(&now
, NULL
);
1045 seed
= (unsigned int)(now
.tv_sec
^ now
.tv_usec
);
1048 goodmask
= (1 << DBM_AGF
) |
1052 (1 << DBM_BTBMAPA
) |
1053 (1 << DBM_BTBMAPD
) |
1061 (1 << DBM_RTBITMAP
) |
1063 (1 << DBM_SYMLINK
) |
1068 while ((c
= getopt(argc
, argv
, "0123n:o:s:t:x:y:z")) != EOF
) {
1083 count
= (int)strtol(optarg
, &p
, 0);
1084 if (*p
!= '\0' || count
<= 0) {
1085 dbprintf(_("bad blocktrash count %s\n"), optarg
);
1091 if (optarg
[0] == '+') {
1095 bit_offset
= (int)strtol(optarg
, &p
, 0);
1096 if (*p
!= '\0' || bit_offset
< 0) {
1097 dbprintf(_("bad blocktrash offset %s\n"), optarg
);
1101 bit_offset
= -bit_offset
- 1;
1105 seed
= (uint
)strtoul(optarg
, &p
, 0);
1109 for (i
= 0; typename
[i
]; i
++) {
1110 if (strcmp(typename
[i
], optarg
) == 0)
1113 if (!typename
[i
] || (((1 << i
) & goodmask
) == 0)) {
1114 dbprintf(_("bad blocktrash type %s\n"), optarg
);
1120 min
= (int)strtol(optarg
, &p
, 0);
1121 if (*p
!= '\0' || min
<= 0 ||
1122 min
> mp
->m_sb
.sb_blocksize
* NBBY
) {
1123 dbprintf(_("bad blocktrash min %s\n"), optarg
);
1128 max
= (int)strtol(optarg
, &p
, 0);
1129 if (*p
!= '\0' || max
<= 0 ||
1130 max
> mp
->m_sb
.sb_blocksize
* NBBY
) {
1131 dbprintf(_("bad blocktrash max %s\n"), optarg
);
1139 dbprintf(_("bad option for blocktrash command\n"));
1143 if (!this_block
&& !dbmap
) {
1144 dbprintf(_("must run blockget first\n"));
1147 if (this_block
&& iocur_sp
== 0) {
1148 dbprintf(_("nothing on stack\n"));
1152 dbprintf(_("bad min/max for blocktrash command\n"));
1156 tmask
= goodmask
& ~((1 << DBM_LOG
) | (1 << DBM_SB
));
1157 lentab
= xmalloc(sizeof(ltab_t
));
1158 lentab
->min
= lentab
->max
= min
;
1160 for (i
= min
+ 1; i
<= max
; i
++) {
1161 if ((i
& (i
- 1)) == 0) {
1162 lentab
= xrealloc(lentab
,
1163 sizeof(ltab_t
) * (lentablen
+ 1));
1164 lentab
[lentablen
].min
= lentab
[lentablen
].max
= i
;
1167 lentab
[lentablen
- 1].max
= i
;
1170 dbprintf(_("blocktrash: seed %u\n"), seed
);
1173 blocktrash_b(bit_offset
, DBM_UNKNOWN
,
1174 &lentab
[random() % lentablen
], mode
);
1177 for (blocks
= 0, agno
= 0; agno
< mp
->m_sb
.sb_agcount
; agno
++) {
1178 for (agbno
= 0, p
= dbmap
[agno
];
1179 agbno
< mp
->m_sb
.sb_agblocks
;
1181 if ((1 << *p
) & tmask
)
1186 dbprintf(_("blocktrash: no matching blocks\n"));
1189 for (i
= 0; i
< count
; i
++) {
1190 randb
= (xfs_rfsblock_t
)((((int64_t)random() << 32) |
1191 random()) % blocks
);
1192 for (bi
= 0, agno
= 0, done
= 0;
1193 !done
&& agno
< mp
->m_sb
.sb_agcount
;
1195 for (agbno
= 0, p
= dbmap
[agno
];
1196 agbno
< mp
->m_sb
.sb_agblocks
;
1198 if (!((1 << *p
) & tmask
))
1204 XFS_AGB_TO_DADDR(mp
, agno
, agbno
),
1205 blkbb
, DB_RING_IGN
, NULL
);
1206 blocktrash_b(bit_offset
, (dbm_t
)*p
,
1207 &lentab
[random() % lentablen
], mode
);
1224 xfs_agblock_t agbno
;
1225 xfs_agnumber_t agno
;
1235 dbprintf(_("must run blockget first\n"));
1240 fsb
= XFS_DADDR_TO_FSB(mp
, iocur_top
->off
>> BBSHIFT
);
1241 agno
= XFS_FSB_TO_AGNO(mp
, fsb
);
1242 end
= agbno
= XFS_FSB_TO_AGBNO(mp
, fsb
);
1243 while ((c
= getopt(argc
, argv
, "c:n")) != EOF
) {
1246 count
= (int)strtol(optarg
, &p
, 0);
1247 end
= agbno
+ count
- 1;
1248 if (*p
!= '\0' || count
<= 0 ||
1249 end
>= mp
->m_sb
.sb_agblocks
) {
1250 dbprintf(_("bad blockuse count %s\n"), optarg
);
1256 dbprintf(_("must run blockget -n first\n"));
1262 dbprintf(_("bad option for blockuse command\n"));
1266 while (agbno
<= end
) {
1267 p
= &dbmap
[agno
][agbno
];
1268 i
= inomap
[agno
][agbno
];
1269 dbprintf(_("block %llu (%u/%u) type %s"),
1270 (xfs_fsblock_t
)XFS_AGB_TO_FSB(mp
, agno
, agbno
),
1271 agno
, agbno
, typename
[(dbm_t
)*p
]);
1273 dbprintf(_(" inode %lld"), i
->ino
);
1274 if (shownames
&& (p
= inode_name(i
->ino
, NULL
))) {
1291 for (i
= 0; i
< blist_size
; i
++) {
1292 if (blist
[i
] == bno
)
1300 xfs_agnumber_t agno
,
1301 xfs_agblock_t agbno
,
1310 for (i
= 0, p
= &dbmap
[agno
][agbno
]; i
< len
; i
++, p
++) {
1312 if (ignore_reflink
&& (d
== DBM_UNKNOWN
|| d
== DBM_DATA
||
1315 if ((dbm_t
)*p
!= type
) {
1316 if (!sflag
|| CHECK_BLISTA(agno
, agbno
+ i
)) {
1317 dbprintf(_("block %u/%u expected type %s got "
1319 agno
, agbno
+ i
, typename
[type
],
1320 typename
[(dbm_t
)*p
]);
1330 add_command(&blockfree_cmd
);
1331 add_command(&blockget_cmd
);
1333 add_command(&blocktrash_cmd
);
1334 add_command(&blockuse_cmd
);
1335 add_command(&ncheck_cmd
);
1340 xfs_agnumber_t agno
,
1341 xfs_agblock_t agbno
,
1349 if (!check_range(agno
, agbno
, len
)) {
1350 dbprintf(_("blocks %u/%u..%u claimed by inode %lld\n"),
1351 agno
, agbno
, agbno
+ len
- 1, c_ino
);
1354 for (i
= 0, rval
= 1, idp
= &inomap
[agno
][agbno
]; i
< len
; i
++, idp
++) {
1355 if (*idp
&& !(*idp
)->isreflink
) {
1356 if (!sflag
|| (*idp
)->ilist
||
1357 CHECK_BLISTA(agno
, agbno
+ i
))
1358 dbprintf(_("block %u/%u claimed by inode %lld, "
1359 "previous inum %lld\n"),
1360 agno
, agbno
+ i
, c_ino
, (*idp
)->ino
);
1370 xfs_agnumber_t agno
)
1378 for (idx
= 0; idx
< inodata_hash_size
; ht
++, idx
++) {
1381 if (ep
->link_set
!= ep
->link_add
|| ep
->link_set
== 0) {
1382 path
= inode_name(ep
->ino
, NULL
);
1383 if (!path
&& ep
->link_add
)
1384 path
= xstrdup("?");
1385 if (!sflag
|| ep
->ilist
) {
1387 dbprintf(_("link count mismatch "
1388 "for inode %lld (name "
1394 else if (ep
->link_set
)
1395 dbprintf(_("disconnected inode "
1396 "%lld, nlink %d\n"),
1397 ep
->ino
, ep
->link_set
);
1399 dbprintf(_("allocated inode %lld "
1400 "has 0 link count\n"),
1406 } else if (verbose
|| ep
->ilist
) {
1407 path
= inode_name(ep
->ino
, NULL
);
1409 dbprintf(_("inode %lld name %s\n"),
1422 xfs_agnumber_t agno
,
1423 xfs_agblock_t agbno
,
1427 xfs_agblock_t low
= 0;
1428 xfs_agblock_t high
= 0;
1429 int valid_range
= 0;
1432 if (agno
>= mp
->m_sb
.sb_agcount
||
1433 agbno
+ len
- 1 >= mp
->m_sb
.sb_agblocks
) {
1434 for (i
= 0; i
< len
; i
++) {
1435 cur
= !sflag
|| CHECK_BLISTA(agno
, agbno
+ i
) ? 1 : 0;
1436 if (cur
== 1 && prev
== 0) {
1437 low
= high
= agbno
+ i
;
1439 } else if (cur
== 0 && prev
== 0) {
1441 } else if (cur
== 0 && prev
== 1) {
1443 dbprintf(_("block %u/%u out of range\n"),
1446 dbprintf(_("blocks %u/%u..%u "
1451 } else if (cur
== 1 && prev
== 1) {
1458 dbprintf(_("block %u/%u out of range\n"),
1461 dbprintf(_("blocks %u/%u..%u "
1481 for (i
= 0, p
= &dbmap
[mp
->m_sb
.sb_agcount
][bno
]; i
< len
; i
++, p
++) {
1482 if ((dbm_t
)*p
!= type
) {
1483 if (!sflag
|| CHECK_BLIST(bno
+ i
))
1484 dbprintf(_("rtblock %llu expected type %s got "
1486 bno
+ i
, typename
[type
],
1487 typename
[(dbm_t
)*p
]);
1503 if (!check_rrange(bno
, len
)) {
1504 dbprintf(_("rtblocks %llu..%llu claimed by inode %lld\n"),
1505 bno
, bno
+ len
- 1, c_ino
);
1508 for (i
= 0, rval
= 1, idp
= &inomap
[mp
->m_sb
.sb_agcount
][bno
];
1512 if (!sflag
|| (*idp
)->ilist
|| CHECK_BLIST(bno
+ i
))
1513 dbprintf(_("rtblock %llu claimed by inode %lld, "
1514 "previous inum %lld\n"),
1515 bno
+ i
, c_ino
, (*idp
)->ino
);
1528 id
= find_inode(mp
->m_sb
.sb_rootino
, 0);
1531 dbprintf(_("root inode %lld is missing\n"),
1532 mp
->m_sb
.sb_rootino
);
1534 } else if (!id
->isdir
) {
1535 if (!sflag
|| id
->ilist
)
1536 dbprintf(_("root inode %lld is not a directory\n"),
1537 mp
->m_sb
.sb_rootino
);
1549 if (bno
+ len
- 1 >= mp
->m_sb
.sb_rblocks
) {
1550 for (i
= 0; i
< len
; i
++) {
1551 if (!sflag
|| CHECK_BLIST(bno
+ i
))
1552 dbprintf(_("rtblock %llu out of range\n"),
1562 * We don't check the accuracy of reference counts -- all we do is ensure
1563 * that a data block never crosses with non-data blocks. repair can check
1564 * those kinds of things.
1566 * So with that in mind, if we're setting a block to be data or rldata,
1567 * don't complain so long as the block is currently unknown, data, or rldata.
1568 * Don't let blocks downgrade from rldata -> data.
1574 if (!xfs_sb_version_hasreflink(&mp
->m_sb
))
1576 if (type2
== DBM_DATA
|| type2
== DBM_RLDATA
)
1583 xfs_agnumber_t agno
,
1584 xfs_agblock_t agbno
,
1588 xfs_agnumber_t c_agno
,
1589 xfs_agblock_t c_agbno
)
1595 if (!check_range(agno
, agbno
, len
)) {
1596 dbprintf(_("blocks %u/%u..%u claimed by block %u/%u\n"), agno
,
1597 agbno
, agbno
+ len
- 1, c_agno
, c_agbno
);
1600 check_dbmap(agno
, agbno
, len
, type1
, is_reflink(type2
));
1601 mayprint
= verbose
| blist_size
;
1602 for (i
= 0, p
= &dbmap
[agno
][agbno
]; i
< len
; i
++, p
++) {
1603 if (*p
== DBM_RLDATA
&& type2
== DBM_DATA
)
1605 else if (*p
== DBM_DATA
&& type2
== DBM_DATA
)
1606 *p
= (char)DBM_RLDATA
;
1609 if (mayprint
&& (verbose
|| CHECK_BLISTA(agno
, agbno
+ i
)))
1610 dbprintf(_("setting block %u/%u to %s\n"), agno
, agbno
+ i
,
1626 if (!check_rrange(bno
, len
))
1628 check_rdbmap(bno
, len
, type1
);
1629 mayprint
= verbose
| blist_size
;
1630 for (i
= 0, p
= &dbmap
[mp
->m_sb
.sb_agcount
][bno
]; i
< len
; i
++, p
++) {
1632 if (mayprint
&& (verbose
|| CHECK_BLIST(bno
+ i
)))
1633 dbprintf(_("setting rtblock %llu to %s\n"),
1634 bno
+ i
, typename
[type2
]);
1648 for (log
= 0; log
< mp
->m_rsumlevels
; log
++) {
1650 bno
< mp
->m_sb
.sb_rbmblocks
;
1651 bno
++, csp
++, fsp
++) {
1654 dbprintf(_("rt summary mismatch, size %d "
1655 "block %llu, file: %d, "
1657 log
, bno
, *fsp
, *csp
);
1666 xfs_agnumber_t agno
,
1667 xfs_agblock_t agbno
,
1674 if (!check_range(agno
, agbno
, len
))
1676 for (i
= 0, p
= &dbmap
[agno
][agbno
]; i
< len
; i
++, p
++) {
1677 if ((1 << *p
) & typemask
) {
1678 if (!sflag
|| CHECK_BLISTA(agno
, agbno
+ i
))
1679 dbprintf(_("block %u/%u type %s not expected\n"),
1680 agno
, agbno
+ i
, typename
[(dbm_t
)*p
]);
1695 if (!check_rrange(bno
, len
))
1697 for (i
= 0, p
= &dbmap
[mp
->m_sb
.sb_agcount
][bno
]; i
< len
; i
++, p
++) {
1698 if ((1 << *p
) & typemask
) {
1699 if (!sflag
|| CHECK_BLIST(bno
+ i
))
1700 dbprintf(_("rtblock %llu type %s not expected\n"),
1701 bno
+ i
, typename
[(dbm_t
)*p
]);
1710 xfs_dir2_dataptr_t addr
)
1715 i
= DIR_HASH_FUNC(hash
, addr
);
1716 p
= malloc(sizeof(*p
));
1717 p
->next
= dirhash
[i
];
1732 for (i
= 0; i
< DIR_HASH_SIZE
; i
++) {
1733 for (p
= dirhash
[i
]; p
; p
= p
->next
) {
1736 if (!sflag
|| id
->ilist
|| v
)
1737 dbprintf(_("dir ino %lld missing leaf entry for "
1739 id
->ino
, p
->hashval
, p
->address
);
1752 for (i
= 0; i
< DIR_HASH_SIZE
; i
++) {
1753 for (p
= dirhash
[i
]; p
; p
= n
) {
1765 dirhash
= calloc(DIR_HASH_SIZE
, sizeof(*dirhash
));
1771 xfs_dir2_dataptr_t addr
)
1776 i
= DIR_HASH_FUNC(hash
, addr
);
1777 for (p
= dirhash
[i
]; p
; p
= p
->next
) {
1778 if (p
->hashval
== hash
&& p
->address
== addr
) {
1794 xfs_agnumber_t agno
;
1799 agno
= XFS_INO_TO_AGNO(mp
, ino
);
1800 agino
= XFS_INO_TO_AGINO(mp
, ino
);
1801 if (agno
>= mp
->m_sb
.sb_agcount
||
1802 XFS_AGINO_TO_INO(mp
, agno
, agino
) != ino
)
1804 htab
= inodata
[agno
];
1805 ih
= agino
% inodata_hash_size
;
1808 if (ent
->ino
== ino
)
1814 ent
= xcalloc(1, sizeof(*ent
));
1816 ent
->next
= htab
[ih
];
1823 xfs_agnumber_t agno
)
1831 for (i
= 0; i
< inodata_hash_size
; i
++) {
1855 if (mp
->m_sb
.sb_magicnum
!= XFS_SB_MAGIC
) {
1856 dbprintf(_("bad superblock magic number %x, giving up\n"),
1857 mp
->m_sb
.sb_magicnum
);
1863 rt
= mp
->m_sb
.sb_rextents
!= 0;
1864 dbmap
= xmalloc((mp
->m_sb
.sb_agcount
+ rt
) * sizeof(*dbmap
));
1865 inomap
= xmalloc((mp
->m_sb
.sb_agcount
+ rt
) * sizeof(*inomap
));
1866 inodata
= xmalloc(mp
->m_sb
.sb_agcount
* sizeof(*inodata
));
1868 (int)MAX(MIN(mp
->m_sb
.sb_icount
/
1869 (INODATA_AVG_HASH_LENGTH
* mp
->m_sb
.sb_agcount
),
1870 MAX_INODATA_HASH_SIZE
),
1871 MIN_INODATA_HASH_SIZE
);
1872 for (c
= 0; c
< mp
->m_sb
.sb_agcount
; c
++) {
1873 dbmap
[c
] = xcalloc(mp
->m_sb
.sb_agblocks
, sizeof(**dbmap
));
1874 inomap
[c
] = xcalloc(mp
->m_sb
.sb_agblocks
, sizeof(**inomap
));
1875 inodata
[c
] = xcalloc(inodata_hash_size
, sizeof(**inodata
));
1878 dbmap
[c
] = xcalloc(mp
->m_sb
.sb_rblocks
, sizeof(**dbmap
));
1879 inomap
[c
] = xcalloc(mp
->m_sb
.sb_rblocks
, sizeof(**inomap
));
1880 sumfile
= xcalloc(mp
->m_rsumsize
, 1);
1881 sumcompute
= xcalloc(mp
->m_rsumsize
, 1);
1883 nflag
= sflag
= tflag
= verbose
= optind
= 0;
1884 while ((c
= getopt(argc
, argv
, "b:i:npstv")) != EOF
) {
1887 bno
= strtoll(optarg
, NULL
, 10);
1891 ino
= strtoll(optarg
, NULL
, 10);
1910 dbprintf(_("bad option for blockget command\n"));
1914 error
= sbver_err
= serious_error
= 0;
1915 fdblocks
= frextents
= icount
= ifree
= 0;
1916 sbversion
= XFS_SB_VERSION_4
;
1918 * Note that inoalignmt == 0 is valid when fsb size is large enough for
1919 * at least one full inode record per block. Check this case explicitly.
1921 if (mp
->m_sb
.sb_inoalignmt
||
1922 (xfs_sb_version_hasalign(&mp
->m_sb
) &&
1923 mp
->m_sb
.sb_inopblock
>= XFS_INODES_PER_CHUNK
))
1924 sbversion
|= XFS_SB_VERSION_ALIGNBIT
;
1925 if ((mp
->m_sb
.sb_uquotino
&& mp
->m_sb
.sb_uquotino
!= NULLFSINO
) ||
1926 (mp
->m_sb
.sb_gquotino
&& mp
->m_sb
.sb_gquotino
!= NULLFSINO
) ||
1927 (mp
->m_sb
.sb_pquotino
&& mp
->m_sb
.sb_pquotino
!= NULLFSINO
))
1928 sbversion
|= XFS_SB_VERSION_QUOTABIT
;
1942 id
= find_inode(ino
, 0);
1947 if (id
->name
== NULL
)
1949 path
= xstrdup(id
->name
);
1950 while (id
->parent
) {
1952 if (id
->name
== NULL
)
1954 npath
= prepend_path(path
, id
->name
);
1966 xfs_agnumber_t agno
;
1979 if (!inodata
|| !nflag
) {
1980 dbprintf(_("must run blockget -n first\n"));
1983 security
= optind
= ilist_size
= 0;
1985 while ((c
= getopt(argc
, argv
, "i:s")) != EOF
) {
1988 ino
= strtoll(optarg
, NULL
, 10);
1989 ilist
= xrealloc(ilist
, (ilist_size
+ 1) *
1991 ilist
[ilist_size
++] = ino
;
1997 dbprintf(_("bad option -%c for ncheck command\n"), c
);
2003 for (ilp
= ilist
; ilp
< &ilist
[ilist_size
]; ilp
++) {
2005 if ((p
= inode_name(ino
, &hp
))) {
2006 dbprintf("%11llu %s", ino
, p
);
2016 for (agno
= 0; agno
< mp
->m_sb
.sb_agcount
; agno
++) {
2018 for (i
= 0; i
< inodata_hash_size
; i
++) {
2020 for (hp
= ht
[i
]; hp
; hp
= hp
->next
) {
2021 ino
= XFS_AGINO_TO_INO(mp
, agno
, hp
->ino
);
2022 p
= inode_name(ino
, &id
);
2025 if (!security
|| id
->security
) {
2026 dbprintf("%11llu %s", ino
, p
);
2046 len
= (int)(strlen(oldpath
) + strlen(parent
) + 2);
2047 path
= xmalloc(len
);
2048 snprintf(path
, len
, "%s/%s", parent
, oldpath
);
2053 process_block_dir_v2(
2067 nex
= blkmap_getn(blkmap
, 0, mp
->m_dir_geo
->fsbcount
, &bmp
);
2068 v
= id
->ilist
|| verbose
;
2071 dbprintf(_("block 0 for directory inode %lld is "
2079 make_bbmap(&bbmap
, nex
, bmp
);
2080 set_cur(&typtab
[TYP_DIR2
], XFS_FSB_TO_DADDR(mp
, bmp
->startblock
),
2081 mp
->m_dir_geo
->fsbcount
* blkbb
, DB_RING_IGN
, nex
> 1 ? &bbmap
: NULL
);
2082 for (x
= 0; !v
&& x
< nex
; x
++) {
2083 for (b
= bmp
[x
].startblock
;
2084 !v
&& b
< bmp
[x
].startblock
+ bmp
[x
].blockcount
;
2089 if (iocur_top
->data
== NULL
) {
2090 if (!sflag
|| id
->ilist
|| v
)
2091 dbprintf(_("can't read block 0 for directory inode "
2099 parent
= process_data_dir_v2(dot
, dotdot
, id
, v
, mp
->m_dir_geo
->datablk
,
2101 dir_hash_check(id
, v
);
2108 process_bmbt_reclist(
2113 xfs_rfsblock_t
*tot
,
2116 xfs_agblock_t agbno
;
2117 xfs_agnumber_t agno
;
2123 xfs_agblock_t iagbno
;
2124 xfs_agnumber_t iagno
;
2131 v
= verbose
|| id
->ilist
;
2132 iagno
= XFS_INO_TO_AGNO(mp
, id
->ino
);
2133 iagbno
= XFS_INO_TO_AGBNO(mp
, id
->ino
);
2134 for (i
= 0; i
< numrecs
; i
++, rp
++) {
2135 convert_extent(rp
, &o
, &s
, &c
, &f
);
2137 dbprintf(_("inode %lld extent [%lld,%lld,%lld,%d]\n"),
2138 id
->ino
, o
, s
, c
, f
);
2139 if (!sflag
&& i
> 0 && op
+ cp
> o
)
2140 dbprintf(_("bmap rec out of order, inode %lld entry %d\n"),
2144 if (type
== DBM_RTDATA
) {
2145 if (!sflag
&& s
>= mp
->m_sb
.sb_rblocks
) {
2146 dbprintf(_("inode %lld bad rt block number %lld, "
2151 } else if (!sflag
) {
2152 agno
= XFS_FSB_TO_AGNO(mp
, s
);
2153 agbno
= XFS_FSB_TO_AGBNO(mp
, s
);
2154 if (agno
>= mp
->m_sb
.sb_agcount
||
2155 agbno
>= mp
->m_sb
.sb_agblocks
) {
2156 dbprintf(_("inode %lld bad block number %lld "
2157 "[%d,%d], offset %lld\n"),
2158 id
->ino
, s
, agno
, agbno
, o
);
2161 if (agbno
+ c
- 1 >= mp
->m_sb
.sb_agblocks
) {
2162 dbprintf(_("inode %lld bad block number %lld "
2163 "[%d,%d], offset %lld\n"),
2164 id
->ino
, s
+ c
- 1, agno
,
2165 agbno
+ (xfs_agblock_t
)c
- 1, o
);
2169 if (blkmapp
&& *blkmapp
)
2170 blkmap_set_ext(blkmapp
, (xfs_fileoff_t
)o
,
2171 (xfs_fsblock_t
)s
, (xfs_extlen_t
)c
);
2172 if (type
== DBM_RTDATA
) {
2173 set_rdbmap((xfs_fsblock_t
)s
, (xfs_extlen_t
)c
,
2175 set_rinomap((xfs_fsblock_t
)s
, (xfs_extlen_t
)c
, id
);
2176 for (b
= (xfs_fsblock_t
)s
;
2177 blist_size
&& b
< s
+ c
;
2180 dbprintf(_("inode %lld block %lld at "
2182 id
->ino
, (xfs_fsblock_t
)b
, o
);
2185 agno
= XFS_FSB_TO_AGNO(mp
, (xfs_fsblock_t
)s
);
2186 agbno
= XFS_FSB_TO_AGBNO(mp
, (xfs_fsblock_t
)s
);
2187 set_dbmap(agno
, agbno
, (xfs_extlen_t
)c
, type
, iagno
,
2189 set_inomap(agno
, agbno
, (xfs_extlen_t
)c
, id
);
2190 for (b
= (xfs_fsblock_t
)s
;
2191 blist_size
&& b
< s
+ c
;
2192 b
++, o
++, agbno
++) {
2194 dbprintf(_("inode %lld block %lld at "
2196 id
->ino
, (xfs_fsblock_t
)b
, o
);
2208 xfs_rfsblock_t
*totd
,
2209 xfs_rfsblock_t
*toti
,
2214 xfs_bmdr_block_t
*dib
;
2218 dib
= (xfs_bmdr_block_t
*)XFS_DFORK_PTR(dip
, whichfork
);
2219 if (be16_to_cpu(dib
->bb_level
) >= XFS_BM_MAXLEVELS(mp
, whichfork
)) {
2220 if (!sflag
|| id
->ilist
)
2221 dbprintf(_("level for ino %lld %s fork bmap root too "
2224 whichfork
== XFS_DATA_FORK
? _("data") : _("attr"),
2225 be16_to_cpu(dib
->bb_level
));
2229 if (be16_to_cpu(dib
->bb_numrecs
) >
2230 libxfs_bmdr_maxrecs(XFS_DFORK_SIZE(dip
, mp
, whichfork
),
2231 be16_to_cpu(dib
->bb_level
) == 0)) {
2232 if (!sflag
|| id
->ilist
)
2233 dbprintf(_("numrecs for ino %lld %s fork bmap root too "
2236 whichfork
== XFS_DATA_FORK
? _("data") : _("attr"),
2237 be16_to_cpu(dib
->bb_numrecs
));
2241 if (be16_to_cpu(dib
->bb_level
) == 0) {
2242 xfs_bmbt_rec_t
*rp
= XFS_BMDR_REC_ADDR(dib
, 1);
2243 process_bmbt_reclist(rp
, be16_to_cpu(dib
->bb_numrecs
), type
,
2245 *nex
+= be16_to_cpu(dib
->bb_numrecs
);
2248 pp
= XFS_BMDR_PTR_ADDR(dib
, 1, libxfs_bmdr_maxrecs(
2249 XFS_DFORK_SIZE(dip
, mp
, whichfork
), 0));
2250 for (i
= 0; i
< be16_to_cpu(dib
->bb_numrecs
); i
++)
2251 scan_lbtree(get_unaligned_be64(&pp
[i
]),
2252 be16_to_cpu(dib
->bb_level
),
2253 scanfunc_bmap
, type
, id
, totd
, toti
,
2255 whichfork
== XFS_DATA_FORK
?
2256 TYP_BMAPBTD
: TYP_BMAPBTA
);
2258 if (*nex
<= XFS_DFORK_SIZE(dip
, mp
, whichfork
) / sizeof(xfs_bmbt_rec_t
)) {
2259 if (!sflag
|| id
->ilist
)
2260 dbprintf(_("extent count for ino %lld %s fork too low "
2261 "(%d) for file format\n"),
2263 whichfork
== XFS_DATA_FORK
? _("data") : _("attr"),
2270 process_data_dir_v2(
2276 freetab_t
**freetabp
)
2278 xfs_dir2_dataptr_t addr
;
2279 xfs_dir2_data_free_t
*bf
;
2281 struct xfs_dir2_data_hdr
*block
;
2282 xfs_dir2_block_tail_t
*btp
= NULL
;
2285 struct xfs_dir2_data_hdr
*data
;
2287 xfs_dir2_data_entry_t
*dep
;
2288 xfs_dir2_data_free_t
*dfp
;
2289 xfs_dir2_data_unused_t
*dup
;
2296 xfs_dir2_leaf_entry_t
*lep
= NULL
;
2298 xfs_ino_t parent
= 0;
2303 struct xfs_name xname
;
2305 data
= iocur_top
->data
;
2306 block
= iocur_top
->data
;
2307 if (be32_to_cpu(block
->magic
) != XFS_DIR2_BLOCK_MAGIC
&&
2308 be32_to_cpu(data
->magic
) != XFS_DIR2_DATA_MAGIC
&&
2309 be32_to_cpu(block
->magic
) != XFS_DIR3_BLOCK_MAGIC
&&
2310 be32_to_cpu(data
->magic
) != XFS_DIR3_DATA_MAGIC
) {
2312 dbprintf(_("bad directory data magic # %#x for dir ino "
2314 be32_to_cpu(data
->magic
), id
->ino
, dabno
);
2318 db
= xfs_dir2_da_to_db(mp
->m_dir_geo
, dabno
);
2319 bf
= M_DIROPS(mp
)->data_bestfree_p(data
);
2320 ptr
= (char *)M_DIROPS(mp
)->data_unused_p(data
);
2321 if (be32_to_cpu(block
->magic
) == XFS_DIR2_BLOCK_MAGIC
||
2322 be32_to_cpu(block
->magic
) == XFS_DIR3_BLOCK_MAGIC
) {
2323 btp
= xfs_dir2_block_tail_p(mp
->m_dir_geo
, block
);
2324 lep
= xfs_dir2_block_leaf_p(btp
);
2325 endptr
= (char *)lep
;
2326 if (endptr
<= ptr
|| endptr
> (char *)btp
) {
2327 endptr
= (char *)data
+ mp
->m_dir_geo
->blksize
;
2330 dbprintf(_("bad block directory tail for dir ino "
2336 endptr
= (char *)data
+ mp
->m_dir_geo
->blksize
;
2337 bf_err
= lastfree_err
= tag_err
= 0;
2338 count
= lastfree
= freeseen
= 0;
2339 if (be16_to_cpu(bf
[0].length
) == 0) {
2340 bf_err
+= be16_to_cpu(bf
[0].offset
) != 0;
2343 if (be16_to_cpu(bf
[1].length
) == 0) {
2344 bf_err
+= be16_to_cpu(bf
[1].offset
) != 0;
2347 if (be16_to_cpu(bf
[2].length
) == 0) {
2348 bf_err
+= be16_to_cpu(bf
[2].offset
) != 0;
2351 bf_err
+= be16_to_cpu(bf
[0].length
) < be16_to_cpu(bf
[1].length
);
2352 bf_err
+= be16_to_cpu(bf
[1].length
) < be16_to_cpu(bf
[2].length
);
2354 freetab
= *freetabp
;
2355 if (freetab
->naents
<= db
) {
2356 *freetabp
= freetab
=
2357 realloc(freetab
, FREETAB_SIZE(db
+ 1));
2358 for (i
= freetab
->naents
; i
< db
; i
++)
2359 freetab
->ents
[i
] = NULLDATAOFF
;
2360 freetab
->naents
= db
+ 1;
2362 if (freetab
->nents
< db
+ 1)
2363 freetab
->nents
= db
+ 1;
2364 freetab
->ents
[db
] = be16_to_cpu(bf
[0].length
);
2366 while (ptr
< endptr
) {
2367 dup
= (xfs_dir2_data_unused_t
*)ptr
;
2368 if (be16_to_cpu(dup
->freetag
) == XFS_DIR2_DATA_FREE_TAG
) {
2369 lastfree_err
+= lastfree
!= 0;
2370 tagp
= xfs_dir2_data_unused_tag_p(dup
);
2371 if ((be16_to_cpu(dup
->length
) & (XFS_DIR2_DATA_ALIGN
- 1)) ||
2372 be16_to_cpu(dup
->length
) == 0 ||
2373 (char *)tagp
>= endptr
) {
2375 dbprintf(_("dir %lld block %d bad free "
2383 tag_err
+= be16_to_cpu(*tagp
) != (char *)dup
- (char *)data
;
2384 dfp
= process_data_dir_v2_freefind(data
, dup
);
2386 i
= (int)(dfp
- bf
);
2387 bf_err
+= (freeseen
& (1 << i
)) != 0;
2390 bf_err
+= be16_to_cpu(dup
->length
) >
2391 be16_to_cpu(bf
[2].length
);
2392 ptr
+= be16_to_cpu(dup
->length
);
2396 dep
= (xfs_dir2_data_entry_t
*)dup
;
2397 if (dep
->namelen
== 0) {
2399 dbprintf(_("dir %lld block %d zero length entry "
2402 (int)((char *)dep
- (char *)data
));
2405 tagp
= M_DIROPS(mp
)->data_entry_tag_p(dep
);
2406 if ((char *)tagp
>= endptr
) {
2408 dbprintf(_("dir %lld block %d bad entry at %d\n"),
2410 (int)((char *)dep
- (char *)data
));
2414 tag_err
+= be16_to_cpu(*tagp
) != (char *)dep
- (char *)data
;
2415 addr
= xfs_dir2_db_off_to_dataptr(mp
->m_dir_geo
, db
,
2416 (char *)dep
- (char *)data
);
2417 xname
.name
= dep
->name
;
2418 xname
.len
= dep
->namelen
;
2419 dir_hash_add(mp
->m_dirnameops
->hashname(&xname
), addr
);
2420 ptr
+= M_DIROPS(mp
)->data_entsize(dep
->namelen
);
2423 lino
= be64_to_cpu(dep
->inumber
);
2424 cid
= find_inode(lino
, 1);
2426 dbprintf(_("dir %lld block %d entry %*.*s %lld\n"),
2427 id
->ino
, dabno
, dep
->namelen
, dep
->namelen
,
2433 dbprintf(_("dir %lld block %d entry %*.*s bad "
2434 "inode number %lld\n"),
2435 id
->ino
, dabno
, dep
->namelen
,
2436 dep
->namelen
, dep
->name
, lino
);
2439 if (dep
->namelen
== 2 && dep
->name
[0] == '.' &&
2440 dep
->name
[1] == '.') {
2443 dbprintf(_("multiple .. entries in dir "
2444 "%lld (%lld, %lld)\n"),
2445 id
->ino
, parent
, lino
);
2448 parent
= cid
? lino
: NULLFSINO
;
2450 } else if (dep
->namelen
!= 1 || dep
->name
[0] != '.') {
2454 addname_inode(cid
, (char *)dep
->name
,
2458 if (lino
!= id
->ino
) {
2460 dbprintf(_("dir %lld entry . inode "
2461 "number mismatch (%lld)\n"),
2468 if (be32_to_cpu(data
->magic
) == XFS_DIR2_BLOCK_MAGIC
||
2469 be32_to_cpu(data
->magic
) == XFS_DIR3_BLOCK_MAGIC
) {
2470 endptr
= (char *)data
+ mp
->m_dir_geo
->blksize
;
2471 for (i
= stale
= 0; lep
&& i
< be32_to_cpu(btp
->count
); i
++) {
2472 if ((char *)&lep
[i
] >= endptr
) {
2474 dbprintf(_("dir %lld block %d bad count "
2475 "%u\n"), id
->ino
, dabno
,
2476 be32_to_cpu(btp
->count
));
2480 if (be32_to_cpu(lep
[i
].address
) == XFS_DIR2_NULL_DATAPTR
)
2482 else if (dir_hash_see(be32_to_cpu(lep
[i
].hashval
),
2483 be32_to_cpu(lep
[i
].address
))) {
2485 dbprintf(_("dir %lld block %d extra leaf "
2488 be32_to_cpu(lep
[i
].hashval
),
2489 be32_to_cpu(lep
[i
].address
));
2494 bf_err
+= freeseen
!= 7;
2497 dbprintf(_("dir %lld block %d bad bestfree data\n"),
2501 if ((be32_to_cpu(data
->magic
) == XFS_DIR2_BLOCK_MAGIC
||
2502 be32_to_cpu(data
->magic
) == XFS_DIR3_BLOCK_MAGIC
) &&
2503 count
!= be32_to_cpu(btp
->count
) - be32_to_cpu(btp
->stale
)) {
2505 dbprintf(_("dir %lld block %d bad block tail count %d "
2507 id
->ino
, dabno
, be32_to_cpu(btp
->count
),
2508 be32_to_cpu(btp
->stale
));
2511 if ((be32_to_cpu(data
->magic
) == XFS_DIR2_BLOCK_MAGIC
||
2512 be32_to_cpu(data
->magic
) == XFS_DIR2_BLOCK_MAGIC
) &&
2513 stale
!= be32_to_cpu(btp
->stale
)) {
2515 dbprintf(_("dir %lld block %d bad stale tail count %d\n"),
2516 id
->ino
, dabno
, be32_to_cpu(btp
->stale
));
2521 dbprintf(_("dir %lld block %d consecutive free entries\n"),
2527 dbprintf(_("dir %lld block %d entry/unused tag "
2535 static xfs_dir2_data_free_t
*
2536 process_data_dir_v2_freefind(
2537 struct xfs_dir2_data_hdr
*data
,
2538 xfs_dir2_data_unused_t
*dup
)
2540 struct xfs_dir2_data_free
*bf
;
2541 struct xfs_dir2_data_free
*dfp
;
2542 xfs_dir2_data_aoff_t off
;
2544 off
= (xfs_dir2_data_aoff_t
)((char *)dup
- (char *)data
);
2545 bf
= M_DIROPS(mp
)->data_bestfree_p(data
);
2546 if (be16_to_cpu(dup
->length
) <
2547 be16_to_cpu(bf
[XFS_DIR2_DATA_FD_COUNT
- 1].length
))
2549 for (dfp
= bf
; dfp
< &bf
[XFS_DIR2_DATA_FD_COUNT
]; dfp
++) {
2550 if (be16_to_cpu(dfp
->offset
) == 0)
2552 if (be16_to_cpu(dfp
->offset
) == off
)
2570 if (process_dir_v2(dip
, blkmap
, &dot
, &dotdot
, id
, &parent
))
2573 bno
= XFS_INO_TO_FSB(mp
, id
->ino
);
2575 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
2576 dbprintf(_("no . entry for directory %lld\n"), id
->ino
);
2580 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
2581 dbprintf(_("no .. entry for directory %lld\n"), id
->ino
);
2583 } else if (parent
== id
->ino
&& id
->ino
!= mp
->m_sb
.sb_rootino
) {
2584 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
2585 dbprintf(_(". and .. same for non-root directory %lld\n"),
2588 } else if (id
->ino
== mp
->m_sb
.sb_rootino
&& id
->ino
!= parent
) {
2589 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
2590 dbprintf(_("root directory %lld has .. %lld\n"), id
->ino
,
2593 } else if (parent
!= NULLFSINO
&& id
->ino
!= parent
)
2594 addparent_inode(id
, parent
);
2606 xfs_fileoff_t last
= 0;
2607 xfs_fsize_t size
= be64_to_cpu(dip
->di_size
);
2610 last
= blkmap_last_off(blkmap
);
2611 if (size
<= XFS_DFORK_DSIZE(dip
, mp
) &&
2612 dip
->di_format
== XFS_DINODE_FMT_LOCAL
)
2613 *parent
= process_sf_dir_v2(dip
, dot
, dotdot
, id
);
2614 else if (last
== mp
->m_dir_geo
->fsbcount
&&
2615 (dip
->di_format
== XFS_DINODE_FMT_EXTENTS
||
2616 dip
->di_format
== XFS_DINODE_FMT_BTREE
))
2617 *parent
= process_block_dir_v2(blkmap
, dot
, dotdot
, id
);
2618 else if (last
>= mp
->m_dir_geo
->leafblk
+ mp
->m_dir_geo
->fsbcount
&&
2619 (dip
->di_format
== XFS_DINODE_FMT_EXTENTS
||
2620 dip
->di_format
== XFS_DINODE_FMT_BTREE
))
2621 *parent
= process_leaf_node_dir_v2(blkmap
, dot
, dotdot
, id
, size
);
2623 dbprintf(_("bad size (%lld) or format (%d) for directory inode "
2625 size
, dip
->di_format
, id
->ino
);
2638 xfs_rfsblock_t
*totd
,
2639 xfs_rfsblock_t
*toti
,
2646 rp
= (xfs_bmbt_rec_t
*)XFS_DFORK_PTR(dip
, whichfork
);
2647 *nex
= XFS_DFORK_NEXTENTS(dip
, whichfork
);
2648 if (*nex
< 0 || *nex
> XFS_DFORK_SIZE(dip
, mp
, whichfork
) /
2649 sizeof(xfs_bmbt_rec_t
)) {
2650 if (!sflag
|| id
->ilist
)
2651 dbprintf(_("bad number of extents %d for inode %lld\n"),
2656 process_bmbt_reclist(rp
, *nex
, type
, id
, totd
, blkmapp
);
2667 xfs_fsblock_t bno
= 0;
2668 struct xfs_inode xino
;
2669 inodata_t
*id
= NULL
;
2671 xfs_extnum_t nextents
= 0;
2673 xfs_rfsblock_t totblocks
;
2674 xfs_rfsblock_t totdblocks
= 0;
2675 xfs_rfsblock_t totiblocks
= 0;
2677 xfs_extnum_t anextents
= 0;
2678 xfs_rfsblock_t atotdblocks
= 0;
2679 xfs_rfsblock_t atotiblocks
= 0;
2686 static char okfmts
[] = {
2687 0, /* type 0 unused */
2688 1 << XFS_DINODE_FMT_DEV
, /* FIFO */
2689 1 << XFS_DINODE_FMT_DEV
, /* CHR */
2690 0, /* type 3 unused */
2691 (1 << XFS_DINODE_FMT_LOCAL
) |
2692 (1 << XFS_DINODE_FMT_EXTENTS
) |
2693 (1 << XFS_DINODE_FMT_BTREE
), /* DIR */
2694 0, /* type 5 unused */
2695 1 << XFS_DINODE_FMT_DEV
, /* BLK */
2696 0, /* type 7 unused */
2697 (1 << XFS_DINODE_FMT_EXTENTS
) |
2698 (1 << XFS_DINODE_FMT_BTREE
), /* REG */
2699 0, /* type 9 unused */
2700 (1 << XFS_DINODE_FMT_LOCAL
) |
2701 (1 << XFS_DINODE_FMT_EXTENTS
), /* LNK */
2702 0, /* type 11 unused */
2703 1 << XFS_DINODE_FMT_DEV
, /* SOCK */
2704 0, /* type 13 unused */
2705 1 << XFS_DINODE_FMT_UUID
, /* MNT */
2706 0 /* type 15 unused */
2708 static char *fmtnames
[] = {
2709 "dev", "local", "extents", "btree", "uuid"
2712 libxfs_inode_from_disk(&xino
, dip
);
2714 ino
= XFS_AGINO_TO_INO(mp
, be32_to_cpu(agf
->agf_seqno
), agino
);
2716 id
= find_inode(ino
, 1);
2717 bno
= XFS_INO_TO_FSB(mp
, ino
);
2720 v
= (!sflag
|| (id
&& id
->ilist
) || CHECK_BLIST(bno
));
2721 if (dip
->di_magic
!= cpu_to_be16(XFS_DINODE_MAGIC
)) {
2723 dbprintf(_("bad magic number %#x for inode %lld\n"),
2724 be16_to_cpu(dip
->di_magic
), ino
);
2728 if (!libxfs_dinode_good_version(mp
, xino
.i_d
.di_version
)) {
2730 dbprintf(_("bad version number %#x for inode %lld\n"),
2731 xino
.i_d
.di_version
, ino
);
2736 if (xino
.i_d
.di_nblocks
!= 0) {
2738 dbprintf(_("bad nblocks %lld for free inode "
2740 xino
.i_d
.di_nblocks
, ino
);
2743 if (dip
->di_nlink
!= 0) {
2745 dbprintf(_("bad nlink %d for free inode %lld\n"),
2746 be32_to_cpu(dip
->di_nlink
), ino
);
2749 if (dip
->di_mode
!= 0) {
2751 dbprintf(_("bad mode %#o for free inode %lld\n"),
2752 be16_to_cpu(dip
->di_mode
), ino
);
2758 if (be32_to_cpu(dip
->di_next_unlinked
) != NULLAGINO
) {
2760 dbprintf(_("bad next unlinked %#x for inode %lld\n"),
2761 be32_to_cpu(dip
->di_next_unlinked
), ino
);
2765 * di_mode is a 16-bit uint so no need to check the < 0 case
2767 mode
= be16_to_cpu(dip
->di_mode
);
2768 if ((((mode
& S_IFMT
) >> 12) > 15) ||
2769 (!(okfmts
[(mode
& S_IFMT
) >> 12] & (1 << xino
.i_d
.di_format
)))) {
2771 dbprintf(_("bad format %d for inode %lld type %#o\n"),
2772 xino
.i_d
.di_format
, id
->ino
, mode
& S_IFMT
);
2776 if ((unsigned int)XFS_DFORK_ASIZE(dip
, mp
) >=
2777 XFS_LITINO(mp
, xino
.i_d
.di_version
)) {
2779 dbprintf(_("bad fork offset %d for inode %lld\n"),
2780 xino
.i_d
.di_forkoff
, id
->ino
);
2784 if ((unsigned int)xino
.i_d
.di_aformat
> XFS_DINODE_FMT_BTREE
) {
2786 dbprintf(_("bad attribute format %d for inode %lld\n"),
2787 xino
.i_d
.di_aformat
, id
->ino
);
2791 if (verbose
|| (id
&& id
->ilist
) || CHECK_BLIST(bno
))
2792 dbprintf(_("inode %lld mode %#o fmt %s "
2794 "nex %d anex %d nblk %lld sz %lld%s%s%s%s%s%s%s\n"),
2795 id
->ino
, mode
, fmtnames
[(int)xino
.i_d
.di_format
],
2796 fmtnames
[(int)xino
.i_d
.di_aformat
],
2797 xino
.i_d
.di_nextents
,
2798 xino
.i_d
.di_anextents
,
2799 xino
.i_d
.di_nblocks
, xino
.i_d
.di_size
,
2800 xino
.i_d
.di_flags
& XFS_DIFLAG_REALTIME
? " rt" : "",
2801 xino
.i_d
.di_flags
& XFS_DIFLAG_PREALLOC
? " pre" : "",
2802 xino
.i_d
.di_flags
& XFS_DIFLAG_IMMUTABLE
? " imm" : "",
2803 xino
.i_d
.di_flags
& XFS_DIFLAG_APPEND
? " app" : "",
2804 xino
.i_d
.di_flags
& XFS_DIFLAG_SYNC
? " syn" : "",
2805 xino
.i_d
.di_flags
& XFS_DIFLAG_NOATIME
? " noa" : "",
2806 xino
.i_d
.di_flags
& XFS_DIFLAG_NODUMP
? " nod" : "");
2808 switch (mode
& S_IFMT
) {
2811 if (xino
.i_d
.di_format
== XFS_DINODE_FMT_LOCAL
)
2813 blkmap
= blkmap_alloc(xino
.i_d
.di_nextents
);
2816 if (xino
.i_d
.di_flags
& XFS_DIFLAG_REALTIME
)
2818 else if (id
->ino
== mp
->m_sb
.sb_rbmino
) {
2819 type
= DBM_RTBITMAP
;
2820 blkmap
= blkmap_alloc(xino
.i_d
.di_nextents
);
2822 } else if (id
->ino
== mp
->m_sb
.sb_rsumino
) {
2824 blkmap
= blkmap_alloc(xino
.i_d
.di_nextents
);
2827 else if (id
->ino
== mp
->m_sb
.sb_uquotino
||
2828 id
->ino
== mp
->m_sb
.sb_gquotino
||
2829 id
->ino
== mp
->m_sb
.sb_pquotino
) {
2831 blkmap
= blkmap_alloc(xino
.i_d
.di_nextents
);
2836 if (mode
& (S_ISUID
| S_ISGID
))
2848 id
->isreflink
= !!(xino
.i_d
.di_flags2
& XFS_DIFLAG2_REFLINK
);
2849 setlink_inode(id
, VFS_I(&xino
)->i_nlink
, type
== DBM_DIR
, security
);
2851 switch (xino
.i_d
.di_format
) {
2852 case XFS_DINODE_FMT_LOCAL
:
2853 process_lclinode(id
, dip
, type
, &totdblocks
, &totiblocks
,
2854 &nextents
, &blkmap
, XFS_DATA_FORK
);
2856 case XFS_DINODE_FMT_EXTENTS
:
2857 process_exinode(id
, dip
, type
, &totdblocks
, &totiblocks
,
2858 &nextents
, &blkmap
, XFS_DATA_FORK
);
2860 case XFS_DINODE_FMT_BTREE
:
2861 process_btinode(id
, dip
, type
, &totdblocks
, &totiblocks
,
2862 &nextents
, &blkmap
, XFS_DATA_FORK
);
2865 if (XFS_DFORK_Q(dip
)) {
2866 sbversion
|= XFS_SB_VERSION_ATTRBIT
;
2867 switch (xino
.i_d
.di_aformat
) {
2868 case XFS_DINODE_FMT_LOCAL
:
2869 process_lclinode(id
, dip
, DBM_ATTR
, &atotdblocks
,
2870 &atotiblocks
, &anextents
, NULL
, XFS_ATTR_FORK
);
2872 case XFS_DINODE_FMT_EXTENTS
:
2873 process_exinode(id
, dip
, DBM_ATTR
, &atotdblocks
,
2874 &atotiblocks
, &anextents
, NULL
, XFS_ATTR_FORK
);
2876 case XFS_DINODE_FMT_BTREE
:
2877 process_btinode(id
, dip
, DBM_ATTR
, &atotdblocks
,
2878 &atotiblocks
, &anextents
, NULL
, XFS_ATTR_FORK
);
2882 if (qgdo
|| qpdo
|| qudo
) {
2890 bc
= totdblocks
+ totiblocks
+
2891 atotdblocks
+ atotiblocks
;
2895 bc
= totiblocks
+ atotdblocks
+ atotiblocks
;
2903 dqprid
= xfs_get_projid(&xino
.i_d
); /* dquot ID is u32 */
2904 quota_add(&dqprid
, &xino
.i_d
.di_gid
, &xino
.i_d
.di_uid
,
2908 totblocks
= totdblocks
+ totiblocks
+ atotdblocks
+ atotiblocks
;
2909 if (totblocks
!= xino
.i_d
.di_nblocks
) {
2911 dbprintf(_("bad nblocks %lld for inode %lld, counted "
2913 xino
.i_d
.di_nblocks
, id
->ino
, totblocks
);
2916 if (nextents
!= xino
.i_d
.di_nextents
) {
2918 dbprintf(_("bad nextents %d for inode %lld, counted %d\n"),
2919 xino
.i_d
.di_nextents
, id
->ino
, nextents
);
2922 if (anextents
!= xino
.i_d
.di_anextents
) {
2924 dbprintf(_("bad anextents %d for inode %lld, counted "
2926 xino
.i_d
.di_anextents
, id
->ino
, anextents
);
2929 if (type
== DBM_DIR
)
2930 process_dir(dip
, blkmap
, id
);
2931 else if (type
== DBM_RTBITMAP
)
2932 process_rtbitmap(blkmap
);
2933 else if (type
== DBM_RTSUM
)
2934 process_rtsummary(blkmap
);
2936 * If the CHKD flag is not set, this can legitimately contain garbage;
2937 * xfs_repair may have cleared that bit.
2939 else if (type
== DBM_QUOTA
) {
2940 if (id
->ino
== mp
->m_sb
.sb_uquotino
&&
2941 (mp
->m_sb
.sb_qflags
& XFS_UQUOTA_ACCT
) &&
2942 (mp
->m_sb
.sb_qflags
& XFS_UQUOTA_CHKD
))
2943 process_quota(IS_USER_QUOTA
, id
, blkmap
);
2944 else if (id
->ino
== mp
->m_sb
.sb_gquotino
&&
2945 (mp
->m_sb
.sb_qflags
& XFS_GQUOTA_ACCT
) &&
2946 (mp
->m_sb
.sb_qflags
& XFS_GQUOTA_CHKD
))
2947 process_quota(IS_GROUP_QUOTA
, id
, blkmap
);
2948 else if (id
->ino
== mp
->m_sb
.sb_pquotino
&&
2949 (mp
->m_sb
.sb_qflags
& XFS_PQUOTA_ACCT
) &&
2950 (mp
->m_sb
.sb_qflags
& XFS_PQUOTA_CHKD
))
2951 process_quota(IS_PROJECT_QUOTA
, id
, blkmap
);
2954 blkmap_free(blkmap
);
2963 xfs_rfsblock_t
*totd
,
2964 xfs_rfsblock_t
*toti
,
2969 xfs_attr_shortform_t
*asf
;
2972 bno
= XFS_INO_TO_FSB(mp
, id
->ino
);
2973 if (whichfork
== XFS_DATA_FORK
&& be64_to_cpu(dip
->di_size
) >
2974 XFS_DFORK_DSIZE(dip
, mp
)) {
2975 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
2976 dbprintf(_("local inode %lld data is too large (size "
2978 id
->ino
, be64_to_cpu(dip
->di_size
));
2981 else if (whichfork
== XFS_ATTR_FORK
) {
2982 asf
= (xfs_attr_shortform_t
*)XFS_DFORK_APTR(dip
);
2983 if (be16_to_cpu(asf
->hdr
.totsize
) > XFS_DFORK_ASIZE(dip
, mp
)) {
2984 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
2985 dbprintf(_("local inode %lld attr is too large "
2987 id
->ino
, be16_to_cpu(asf
->hdr
.totsize
));
2994 process_leaf_node_dir_v2(
2999 xfs_fsize_t dirsize
)
3015 v2
= verbose
|| id
->ilist
;
3018 freetab
= malloc(FREETAB_SIZE(dirsize
/ mp
->m_dir_geo
->blksize
));
3019 freetab
->naents
= (int)(dirsize
/ mp
->m_dir_geo
->blksize
);
3021 for (i
= 0; i
< freetab
->naents
; i
++)
3022 freetab
->ents
[i
] = NULLDATAOFF
;
3024 while ((dbno
= blkmap_next_off(blkmap
, dbno
, &t
)) != NULLFILEOFF
) {
3025 nex
= blkmap_getn(blkmap
, dbno
, mp
->m_dir_geo
->fsbcount
, &bmp
);
3027 for (v
= v2
, x
= 0; !v
&& x
< nex
; x
++) {
3028 for (b
= bmp
[x
].startblock
;
3029 !v
&& b
< bmp
[x
].startblock
+ bmp
[x
].blockcount
;
3034 dbprintf(_("dir inode %lld block %u=%llu\n"), id
->ino
,
3036 (xfs_fsblock_t
)bmp
->startblock
);
3039 make_bbmap(&bbmap
, nex
, bmp
);
3040 set_cur(&typtab
[TYP_DIR2
], XFS_FSB_TO_DADDR(mp
, bmp
->startblock
),
3041 mp
->m_dir_geo
->fsbcount
* blkbb
, DB_RING_IGN
,
3042 nex
> 1 ? &bbmap
: NULL
);
3044 if (iocur_top
->data
== NULL
) {
3046 dbprintf(_("can't read block %u for directory "
3048 (uint32_t)dbno
, id
->ino
);
3051 dbno
+= mp
->m_dir_geo
->fsbcount
- 1;
3054 if (dbno
< mp
->m_dir_geo
->leafblk
) {
3055 lino
= process_data_dir_v2(dot
, dotdot
, id
, v
,
3056 (xfs_dablk_t
)dbno
, &freetab
);
3060 dbprintf(_("multiple .. entries "
3067 } else if (dbno
< mp
->m_dir_geo
->freeblk
) {
3068 process_leaf_node_dir_v2_int(id
, v
, (xfs_dablk_t
)dbno
,
3071 process_leaf_node_dir_v2_free(id
, v
, (xfs_dablk_t
)dbno
,
3075 dbno
+= mp
->m_dir_geo
->fsbcount
- 1;
3077 dir_hash_check(id
, v
);
3079 for (i
= 0; i
< freetab
->nents
; i
++) {
3080 if (freetab
->ents
[i
] != NULLDATAOFF
) {
3082 dbprintf(_("missing free index for data block %d "
3083 "in dir ino %lld\n"),
3084 xfs_dir2_db_to_da(mp
->m_dir_geo
, i
), id
->ino
);
3093 process_leaf_node_dir_v3_free(
3099 xfs_dir2_data_off_t ent
;
3100 struct xfs_dir3_free
*free
;
3105 free
= iocur_top
->data
;
3106 maxent
= M_DIROPS(mp
)->free_max_bests(mp
->m_dir_geo
);
3107 if (be32_to_cpu(free
->hdr
.firstdb
) != xfs_dir2_da_to_db(mp
->m_dir_geo
,
3108 dabno
- mp
->m_dir_geo
->freeblk
) * maxent
) {
3110 dbprintf(_("bad free block firstdb %d for dir ino %lld "
3112 be32_to_cpu(free
->hdr
.firstdb
), id
->ino
, dabno
);
3116 if (be32_to_cpu(free
->hdr
.nvalid
) > maxent
||
3117 be32_to_cpu(free
->hdr
.nused
) > maxent
||
3118 be32_to_cpu(free
->hdr
.nused
) >
3119 be32_to_cpu(free
->hdr
.nvalid
)) {
3121 dbprintf(_("bad free block nvalid/nused %d/%d for dir "
3122 "ino %lld block %d\n"),
3123 be32_to_cpu(free
->hdr
.nvalid
),
3124 be32_to_cpu(free
->hdr
.nused
), id
->ino
, dabno
);
3128 for (used
= i
= 0; i
< be32_to_cpu(free
->hdr
.nvalid
); i
++) {
3129 if (freetab
->nents
<= be32_to_cpu(free
->hdr
.firstdb
) + i
)
3132 ent
= freetab
->ents
[be32_to_cpu(free
->hdr
.firstdb
) + i
];
3133 if (ent
!= be16_to_cpu(free
->bests
[i
])) {
3135 dbprintf(_("bad free block ent %d is %d should "
3136 "be %d for dir ino %lld block %d\n"),
3137 i
, be16_to_cpu(free
->bests
[i
]), ent
,
3141 if (be16_to_cpu(free
->bests
[i
]) != NULLDATAOFF
)
3143 if (ent
!= NULLDATAOFF
)
3144 freetab
->ents
[be32_to_cpu(free
->hdr
.firstdb
) + i
] =
3147 if (used
!= be32_to_cpu(free
->hdr
.nused
)) {
3149 dbprintf(_("bad free block nused %d should be %d for dir "
3150 "ino %lld block %d\n"),
3151 be32_to_cpu(free
->hdr
.nused
), used
, id
->ino
,
3158 process_leaf_node_dir_v2_free(
3164 xfs_dir2_data_off_t ent
;
3165 xfs_dir2_free_t
*free
;
3170 free
= iocur_top
->data
;
3171 if (be32_to_cpu(free
->hdr
.magic
) != XFS_DIR2_FREE_MAGIC
&&
3172 be32_to_cpu(free
->hdr
.magic
) != XFS_DIR3_FREE_MAGIC
) {
3174 dbprintf(_("bad free block magic # %#x for dir ino %lld "
3176 be32_to_cpu(free
->hdr
.magic
), id
->ino
, dabno
);
3180 if (be32_to_cpu(free
->hdr
.magic
) == XFS_DIR3_FREE_MAGIC
) {
3181 process_leaf_node_dir_v3_free(id
, v
, dabno
, freetab
);
3184 maxent
= M_DIROPS(mp
)->free_max_bests(mp
->m_dir_geo
);
3185 if (be32_to_cpu(free
->hdr
.firstdb
) != xfs_dir2_da_to_db(mp
->m_dir_geo
,
3186 dabno
- mp
->m_dir_geo
->freeblk
) * maxent
) {
3188 dbprintf(_("bad free block firstdb %d for dir ino %lld "
3190 be32_to_cpu(free
->hdr
.firstdb
), id
->ino
, dabno
);
3194 if (be32_to_cpu(free
->hdr
.nvalid
) > maxent
||
3195 be32_to_cpu(free
->hdr
.nused
) > maxent
||
3196 be32_to_cpu(free
->hdr
.nused
) >
3197 be32_to_cpu(free
->hdr
.nvalid
)) {
3199 dbprintf(_("bad free block nvalid/nused %d/%d for dir "
3200 "ino %lld block %d\n"),
3201 be32_to_cpu(free
->hdr
.nvalid
),
3202 be32_to_cpu(free
->hdr
.nused
), id
->ino
, dabno
);
3206 for (used
= i
= 0; i
< be32_to_cpu(free
->hdr
.nvalid
); i
++) {
3207 if (freetab
->nents
<= be32_to_cpu(free
->hdr
.firstdb
) + i
)
3210 ent
= freetab
->ents
[be32_to_cpu(free
->hdr
.firstdb
) + i
];
3211 if (ent
!= be16_to_cpu(free
->bests
[i
])) {
3213 dbprintf(_("bad free block ent %d is %d should "
3214 "be %d for dir ino %lld block %d\n"),
3215 i
, be16_to_cpu(free
->bests
[i
]), ent
,
3219 if (be16_to_cpu(free
->bests
[i
]) != NULLDATAOFF
)
3221 if (ent
!= NULLDATAOFF
)
3222 freetab
->ents
[be32_to_cpu(free
->hdr
.firstdb
) + i
] =
3225 if (used
!= be32_to_cpu(free
->hdr
.nused
)) {
3227 dbprintf(_("bad free block nused %d should be %d for dir "
3228 "ino %lld block %d\n"),
3229 be32_to_cpu(free
->hdr
.nused
), used
, id
->ino
,
3236 * Get address of the bestcount field in the single-leaf block.
3239 xfs_dir3_leaf_ents_count(struct xfs_dir2_leaf
*lp
)
3241 if (lp
->hdr
.info
.magic
== cpu_to_be16(XFS_DIR3_LEAF1_MAGIC
) ||
3242 lp
->hdr
.info
.magic
== cpu_to_be16(XFS_DIR3_LEAFN_MAGIC
)) {
3243 struct xfs_dir3_leaf
*lp3
= (struct xfs_dir3_leaf
*)lp
;
3245 return be16_to_cpu(lp3
->hdr
.count
);
3247 return be16_to_cpu(lp
->hdr
.count
);
3251 process_leaf_node_dir_v2_int(
3259 xfs_dir2_leaf_t
*leaf
;
3260 struct xfs_dir3_leaf
*leaf3
= NULL
;
3261 xfs_dir2_leaf_entry_t
*lep
;
3262 xfs_dir2_leaf_tail_t
*ltp
;
3263 xfs_da_intnode_t
*node
;
3265 struct xfs_da3_icnode_hdr nodehdr
;
3267 leaf
= iocur_top
->data
;
3268 switch (be16_to_cpu(leaf
->hdr
.info
.magic
)) {
3269 case XFS_DIR3_LEAF1_MAGIC
:
3270 case XFS_DIR3_LEAFN_MAGIC
:
3271 case XFS_DA3_NODE_MAGIC
:
3272 leaf3
= iocur_top
->data
;
3275 switch (be16_to_cpu(leaf
->hdr
.info
.magic
)) {
3276 case XFS_DIR2_LEAF1_MAGIC
:
3277 case XFS_DIR3_LEAF1_MAGIC
:
3278 if (be32_to_cpu(leaf
->hdr
.info
.forw
) ||
3279 be32_to_cpu(leaf
->hdr
.info
.back
)) {
3281 dbprintf(_("bad leaf block forw/back pointers "
3282 "%d/%d for dir ino %lld block %d\n"),
3283 be32_to_cpu(leaf
->hdr
.info
.forw
),
3284 be32_to_cpu(leaf
->hdr
.info
.back
),
3288 if (dabno
!= mp
->m_dir_geo
->leafblk
) {
3290 dbprintf(_("single leaf block for dir ino %lld "
3291 "block %d should be at block %d\n"),
3293 (xfs_dablk_t
)mp
->m_dir_geo
->leafblk
);
3296 ltp
= xfs_dir2_leaf_tail_p(mp
->m_dir_geo
, leaf
);
3297 lbp
= xfs_dir2_leaf_bests_p(ltp
);
3298 for (i
= 0; i
< be32_to_cpu(ltp
->bestcount
); i
++) {
3299 if (freetab
->nents
<= i
|| freetab
->ents
[i
] !=
3300 be16_to_cpu(lbp
[i
])) {
3302 dbprintf(_("bestfree %d for dir ino %lld "
3303 "block %d doesn't match table "
3305 freetab
->nents
<= i
?
3309 xfs_dir2_db_to_da(mp
->m_dir_geo
, i
),
3310 be16_to_cpu(lbp
[i
]));
3312 if (freetab
->nents
> i
)
3313 freetab
->ents
[i
] = NULLDATAOFF
;
3316 case XFS_DIR2_LEAFN_MAGIC
:
3317 case XFS_DIR3_LEAFN_MAGIC
:
3318 /* if it's at the root location then we can check the
3319 * pointers are null XXX */
3321 case XFS_DA_NODE_MAGIC
:
3322 case XFS_DA3_NODE_MAGIC
:
3323 node
= iocur_top
->data
;
3324 M_DIROPS(mp
)->node_hdr_from_disk(&nodehdr
, node
);
3325 if (nodehdr
.level
< 1 || nodehdr
.level
> XFS_DA_NODE_MAXDEPTH
) {
3327 dbprintf(_("bad node block level %d for dir ino "
3329 nodehdr
.level
, id
->ino
,
3336 dbprintf(_("bad directory data magic # %#x for dir ino "
3338 be16_to_cpu(leaf
->hdr
.info
.magic
), id
->ino
,
3343 lep
= M_DIROPS(mp
)->leaf_ents_p(leaf
);
3344 for (i
= stale
= 0; i
< xfs_dir3_leaf_ents_count(leaf
); i
++) {
3345 if (be32_to_cpu(lep
[i
].address
) == XFS_DIR2_NULL_DATAPTR
)
3347 else if (dir_hash_see(be32_to_cpu(lep
[i
].hashval
),
3348 be32_to_cpu(lep
[i
].address
))) {
3350 dbprintf(_("dir %lld block %d extra leaf entry "
3351 "%x %x\n"), id
->ino
, dabno
,
3352 be32_to_cpu(lep
[i
].hashval
),
3353 be32_to_cpu(lep
[i
].address
));
3357 if (leaf3
&& stale
!= be16_to_cpu(leaf3
->hdr
.stale
)) {
3359 dbprintf(_("dir3 %lld block %d stale mismatch "
3361 id
->ino
, dabno
, stale
,
3362 be16_to_cpu(leaf3
->hdr
.stale
));
3364 } else if (!leaf
&& stale
!= be16_to_cpu(leaf
->hdr
.stale
)) {
3366 dbprintf(_("dir %lld block %d stale mismatch "
3368 id
->ino
, dabno
, stale
,
3369 be16_to_cpu(leaf
->hdr
.stale
));
3384 uint8_t exp_flags
= 0;
3395 exp_flags
= XFS_DQ_USER
;
3397 case IS_PROJECT_QUOTA
:
3399 exp_flags
= XFS_DQ_PROJ
;
3401 case IS_GROUP_QUOTA
:
3403 exp_flags
= XFS_DQ_GROUP
;
3409 perblock
= (uint
)(mp
->m_sb
.sb_blocksize
/ sizeof(*dqb
));
3412 while ((qbno
= blkmap_next_off(blkmap
, qbno
, &t
)) != NULLFILEOFF
) {
3413 bno
= blkmap_get(blkmap
, qbno
);
3414 dqid
= (xfs_dqid_t
)qbno
* perblock
;
3415 cb
= CHECK_BLIST(bno
);
3416 scicb
= !sflag
|| id
->ilist
|| cb
;
3418 set_cur(&typtab
[TYP_DQBLK
], XFS_FSB_TO_DADDR(mp
, bno
), blkbb
,
3420 if ((dqb
= iocur_top
->data
) == NULL
) {
3422 dbprintf(_("can't read block %lld for %s quota "
3423 "inode (fsblock %lld)\n"),
3424 (xfs_fileoff_t
)qbno
, s
,
3425 (xfs_fsblock_t
)bno
);
3430 for (i
= 0; i
< perblock
; i
++, dqid
++, dqb
++) {
3431 if (verbose
|| id
->ilist
|| cb
)
3432 dbprintf(_("%s dqblk %lld entry %d id %u bc "
3433 "%lld ic %lld rc %lld\n"),
3434 s
, (xfs_fileoff_t
)qbno
, i
, dqid
,
3435 be64_to_cpu(dqb
->dd_diskdq
.d_bcount
),
3436 be64_to_cpu(dqb
->dd_diskdq
.d_icount
),
3437 be64_to_cpu(dqb
->dd_diskdq
.d_rtbcount
));
3438 if (be16_to_cpu(dqb
->dd_diskdq
.d_magic
) != XFS_DQUOT_MAGIC
) {
3440 dbprintf(_("bad magic number %#x for %s "
3441 "dqblk %lld entry %d id %u\n"),
3442 be16_to_cpu(dqb
->dd_diskdq
.d_magic
), s
,
3443 (xfs_fileoff_t
)qbno
, i
, dqid
);
3447 if (dqb
->dd_diskdq
.d_version
!= XFS_DQUOT_VERSION
) {
3449 dbprintf(_("bad version number %#x for "
3450 "%s dqblk %lld entry %d id "
3452 dqb
->dd_diskdq
.d_version
, s
,
3453 (xfs_fileoff_t
)qbno
, i
, dqid
);
3457 if (dqb
->dd_diskdq
.d_flags
!= exp_flags
) {
3459 dbprintf(_("bad flags %#x for %s dqblk "
3460 "%lld entry %d id %u\n"),
3461 dqb
->dd_diskdq
.d_flags
, s
,
3462 (xfs_fileoff_t
)qbno
, i
, dqid
);
3466 if (be32_to_cpu(dqb
->dd_diskdq
.d_id
) != dqid
) {
3468 dbprintf(_("bad id %u for %s dqblk %lld "
3469 "entry %d id %u\n"),
3470 be32_to_cpu(dqb
->dd_diskdq
.d_id
), s
,
3471 (xfs_fileoff_t
)qbno
, i
, dqid
);
3475 quota_add((qtype
== IS_PROJECT_QUOTA
) ? &dqid
: NULL
,
3476 (qtype
== IS_GROUP_QUOTA
) ? &dqid
: NULL
,
3477 (qtype
== IS_USER_QUOTA
) ? &dqid
: NULL
,
3479 be64_to_cpu(dqb
->dd_diskdq
.d_bcount
),
3480 be64_to_cpu(dqb
->dd_diskdq
.d_icount
),
3481 be64_to_cpu(dqb
->dd_diskdq
.d_rtbcount
));
3493 xfs_fileoff_t bmbno
;
3495 xfs_rtblock_t extno
;
3500 xfs_rfsblock_t rtbno
;
3504 xfs_rtword_t
*words
;
3506 bitsperblock
= mp
->m_sb
.sb_blocksize
* NBBY
;
3507 bit
= extno
= prevbit
= start_bmbno
= start_bit
= 0;
3508 bmbno
= NULLFILEOFF
;
3509 while ((bmbno
= blkmap_next_off(blkmap
, bmbno
, &t
)) !=
3511 bno
= blkmap_get(blkmap
, bmbno
);
3512 if (bno
== NULLFSBLOCK
) {
3514 dbprintf(_("block %lld for rtbitmap inode is "
3516 (xfs_fileoff_t
)bmbno
);
3521 set_cur(&typtab
[TYP_RTBITMAP
], XFS_FSB_TO_DADDR(mp
, bno
), blkbb
,
3523 if ((words
= iocur_top
->data
) == NULL
) {
3525 dbprintf(_("can't read block %lld for rtbitmap "
3527 (xfs_fileoff_t
)bmbno
);
3533 bit
< bitsperblock
&& extno
< mp
->m_sb
.sb_rextents
;
3535 if (xfs_isset(words
, bit
)) {
3536 rtbno
= extno
* mp
->m_sb
.sb_rextsize
;
3537 set_rdbmap(rtbno
, mp
->m_sb
.sb_rextsize
,
3541 start_bmbno
= (int)bmbno
;
3545 } else if (prevbit
== 1) {
3546 len
= ((int)bmbno
- start_bmbno
) *
3547 bitsperblock
+ (bit
- start_bit
);
3548 log
= XFS_RTBLOCKLOG(len
);
3549 offs
= XFS_SUMOFFS(mp
, log
, start_bmbno
);
3555 if (extno
== mp
->m_sb
.sb_rextents
)
3559 len
= ((int)bmbno
- start_bmbno
) * bitsperblock
+
3561 log
= XFS_RTBLOCKLOG(len
);
3562 offs
= XFS_SUMOFFS(mp
, log
, start_bmbno
);
3573 xfs_fileoff_t sumbno
;
3576 sumbno
= NULLFILEOFF
;
3577 while ((sumbno
= blkmap_next_off(blkmap
, sumbno
, &t
)) != NULLFILEOFF
) {
3578 bno
= blkmap_get(blkmap
, sumbno
);
3579 if (bno
== NULLFSBLOCK
) {
3581 dbprintf(_("block %lld for rtsummary inode is "
3583 (xfs_fileoff_t
)sumbno
);
3588 set_cur(&typtab
[TYP_RTSUMMARY
], XFS_FSB_TO_DADDR(mp
, bno
),
3589 blkbb
, DB_RING_IGN
, NULL
);
3590 if ((bytes
= iocur_top
->data
) == NULL
) {
3592 dbprintf(_("can't read block %lld for rtsummary "
3594 (xfs_fileoff_t
)sumbno
);
3599 memcpy((char *)sumfile
+ sumbno
* mp
->m_sb
.sb_blocksize
, bytes
,
3600 mp
->m_sb
.sb_blocksize
);
3617 struct xfs_dir2_sf_hdr
*sf
;
3618 xfs_dir2_sf_entry_t
*sfe
;
3621 sf
= (struct xfs_dir2_sf_hdr
*)XFS_DFORK_DPTR(dip
);
3623 v
= verbose
|| id
->ilist
;
3625 dbprintf(_("dir %lld entry . %lld\n"), id
->ino
, id
->ino
);
3627 sfe
= xfs_dir2_sf_firstentry(sf
);
3628 offset
= M_DIROPS(mp
)->data_first_offset
;
3629 for (i
= sf
->count
- 1, i8
= 0; i
>= 0; i
--) {
3630 if ((intptr_t)sfe
+ M_DIROPS(mp
)->sf_entsize(sf
, sfe
->namelen
) -
3631 (intptr_t)sf
> be64_to_cpu(dip
->di_size
)) {
3633 dbprintf(_("dir %llu bad size in entry at %d\n"),
3635 (int)((char *)sfe
- (char *)sf
));
3639 lino
= M_DIROPS(mp
)->sf_get_ino(sf
, sfe
);
3640 if (lino
> XFS_DIR2_MAX_SHORT_INUM
)
3642 cid
= find_inode(lino
, 1);
3645 dbprintf(_("dir %lld entry %*.*s bad inode "
3647 id
->ino
, sfe
->namelen
, sfe
->namelen
,
3654 addname_inode(cid
, (char *)sfe
->name
, sfe
->namelen
);
3657 dbprintf(_("dir %lld entry %*.*s offset %d %lld\n"),
3658 id
->ino
, sfe
->namelen
, sfe
->namelen
, sfe
->name
,
3659 xfs_dir2_sf_get_offset(sfe
), lino
);
3660 if (xfs_dir2_sf_get_offset(sfe
) < offset
) {
3662 dbprintf(_("dir %lld entry %*.*s bad offset %d\n"),
3663 id
->ino
, sfe
->namelen
, sfe
->namelen
,
3664 sfe
->name
, xfs_dir2_sf_get_offset(sfe
));
3668 xfs_dir2_sf_get_offset(sfe
) +
3669 M_DIROPS(mp
)->sf_entsize(sf
, sfe
->namelen
);
3670 sfe
= M_DIROPS(mp
)->sf_nextentry(sf
, sfe
);
3672 if (i
< 0 && (intptr_t)sfe
- (intptr_t)sf
!=
3673 be64_to_cpu(dip
->di_size
)) {
3675 dbprintf(_("dir %llu size is %lld, should be %u\n"),
3676 id
->ino
, be64_to_cpu(dip
->di_size
),
3677 (uint
)((char *)sfe
- (char *)sf
));
3680 if (offset
+ (sf
->count
+ 2) * sizeof(xfs_dir2_leaf_entry_t
) +
3681 sizeof(xfs_dir2_block_tail_t
) > mp
->m_dir_geo
->blksize
) {
3683 dbprintf(_("dir %llu offsets too high\n"), id
->ino
);
3686 lino
= M_DIROPS(mp
)->sf_get_parent_ino(sf
);
3687 if (lino
> XFS_DIR2_MAX_SHORT_INUM
)
3689 cid
= find_inode(lino
, 1);
3694 dbprintf(_("dir %lld entry .. bad inode number %lld\n"),
3699 dbprintf(_("dir %lld entry .. %lld\n"), id
->ino
, lino
);
3700 if (i8
!= sf
->i8count
) {
3702 dbprintf(_("dir %lld i8count mismatch is %d should be "
3704 id
->ino
, sf
->i8count
, i8
);
3708 return cid
? lino
: NULLFSINO
;
3722 if (qudo
&& usrid
!= NULL
)
3723 quota_add1(qudata
, *usrid
, dq
, bc
, ic
, rc
);
3724 if (qgdo
&& grpid
!= NULL
)
3725 quota_add1(qgdata
, *grpid
, dq
, bc
, ic
, rc
);
3726 if (qpdo
&& prjid
!= NULL
)
3727 quota_add1(qpdata
, *prjid
, dq
, bc
, ic
, rc
);
3743 qh
= (int)(id
% QDATA_HASH_SIZE
);
3747 qi
= dq
? &qe
->dq
: &qe
->count
;
3755 qe
= xmalloc(sizeof(*qe
));
3757 qi
= dq
? &qe
->dq
: &qe
->count
;
3761 qi
= dq
? &qe
->count
: &qe
->dq
;
3762 qi
->bc
= qi
->ic
= qi
->rc
= 0;
3776 for (i
= 0; i
< QDATA_HASH_SIZE
; i
++) {
3780 if (qp
->count
.bc
!= qp
->dq
.bc
||
3781 qp
->count
.ic
!= qp
->dq
.ic
||
3782 qp
->count
.rc
!= qp
->dq
.rc
) {
3784 dbprintf(_("%s quota id %u, have/exp"),
3786 if (qp
->count
.bc
!= qp
->dq
.bc
)
3787 dbprintf(_(" bc %lld/%lld"),
3790 if (qp
->count
.ic
!= qp
->dq
.ic
)
3791 dbprintf(_(" ic %lld/%lld"),
3794 if (qp
->count
.rc
!= qp
->dq
.rc
)
3795 dbprintf(_(" rc %lld/%lld"),
3812 qudo
= mp
->m_sb
.sb_uquotino
!= 0 &&
3813 mp
->m_sb
.sb_uquotino
!= NULLFSINO
&&
3814 (mp
->m_sb
.sb_qflags
& XFS_UQUOTA_ACCT
) &&
3815 (mp
->m_sb
.sb_qflags
& XFS_UQUOTA_CHKD
);
3816 qgdo
= mp
->m_sb
.sb_gquotino
!= 0 &&
3817 mp
->m_sb
.sb_gquotino
!= NULLFSINO
&&
3818 (mp
->m_sb
.sb_qflags
& XFS_GQUOTA_ACCT
) &&
3819 (mp
->m_sb
.sb_qflags
& XFS_GQUOTA_CHKD
);
3820 qpdo
= mp
->m_sb
.sb_pquotino
!= 0 &&
3821 mp
->m_sb
.sb_pquotino
!= NULLFSINO
&&
3822 (mp
->m_sb
.sb_qflags
& XFS_PQUOTA_ACCT
) &&
3823 (mp
->m_sb
.sb_qflags
& XFS_PQUOTA_CHKD
);
3825 qudata
= xcalloc(QDATA_HASH_SIZE
, sizeof(qdata_t
*));
3827 qgdata
= xcalloc(QDATA_HASH_SIZE
, sizeof(qdata_t
*));
3829 qpdata
= xcalloc(QDATA_HASH_SIZE
, sizeof(qdata_t
*));
3834 xfs_agnumber_t agno
)
3840 xfs_sb_t
*sb
= &tsb
;
3842 agffreeblks
= agflongest
= 0;
3844 agicount
= agifreecount
= 0;
3845 push_cur(); /* 1 pushed */
3846 set_cur(&typtab
[TYP_SB
],
3847 XFS_AG_DADDR(mp
, agno
, XFS_SB_DADDR
),
3848 XFS_FSS_TO_BB(mp
, 1), DB_RING_IGN
, NULL
);
3850 if (!iocur_top
->data
) {
3851 dbprintf(_("can't read superblock for ag %u\n"), agno
);
3856 libxfs_sb_from_disk(sb
, iocur_top
->data
);
3858 if (sb
->sb_magicnum
!= XFS_SB_MAGIC
) {
3860 dbprintf(_("bad sb magic # %#x in ag %u\n"),
3861 sb
->sb_magicnum
, agno
);
3864 if (!xfs_sb_good_version(sb
)) {
3866 dbprintf(_("bad sb version # %#x in ag %u\n"),
3867 sb
->sb_versionnum
, agno
);
3871 if (!lazycount
&& xfs_sb_version_haslazysbcount(sb
)) {
3874 if (agno
== 0 && sb
->sb_inprogress
!= 0) {
3876 dbprintf(_("mkfs not completed successfully\n"));
3879 set_dbmap(agno
, XFS_SB_BLOCK(mp
), 1, DBM_SB
, agno
, XFS_SB_BLOCK(mp
));
3880 if (sb
->sb_logstart
&& XFS_FSB_TO_AGNO(mp
, sb
->sb_logstart
) == agno
)
3881 set_dbmap(agno
, XFS_FSB_TO_AGBNO(mp
, sb
->sb_logstart
),
3882 sb
->sb_logblocks
, DBM_LOG
, agno
, XFS_SB_BLOCK(mp
));
3883 push_cur(); /* 2 pushed */
3884 set_cur(&typtab
[TYP_AGF
],
3885 XFS_AG_DADDR(mp
, agno
, XFS_AGF_DADDR(mp
)),
3886 XFS_FSS_TO_BB(mp
, 1), DB_RING_IGN
, NULL
);
3887 if ((agf
= iocur_top
->data
) == NULL
) {
3888 dbprintf(_("can't read agf block for ag %u\n"), agno
);
3892 if (be32_to_cpu(agf
->agf_magicnum
) != XFS_AGF_MAGIC
) {
3894 dbprintf(_("bad agf magic # %#x in ag %u\n"),
3895 be32_to_cpu(agf
->agf_magicnum
), agno
);
3898 if (!XFS_AGF_GOOD_VERSION(be32_to_cpu(agf
->agf_versionnum
))) {
3900 dbprintf(_("bad agf version # %#x in ag %u\n"),
3901 be32_to_cpu(agf
->agf_versionnum
), agno
);
3904 if (XFS_SB_BLOCK(mp
) != XFS_AGF_BLOCK(mp
))
3905 set_dbmap(agno
, XFS_AGF_BLOCK(mp
), 1, DBM_AGF
, agno
,
3907 if (sb
->sb_agblocks
> be32_to_cpu(agf
->agf_length
))
3908 set_dbmap(agno
, be32_to_cpu(agf
->agf_length
),
3909 sb
->sb_agblocks
- be32_to_cpu(agf
->agf_length
),
3910 DBM_MISSING
, agno
, XFS_SB_BLOCK(mp
));
3911 push_cur(); /* 3 pushed */
3912 set_cur(&typtab
[TYP_AGI
],
3913 XFS_AG_DADDR(mp
, agno
, XFS_AGI_DADDR(mp
)),
3914 XFS_FSS_TO_BB(mp
, 1), DB_RING_IGN
, NULL
);
3915 if ((agi
= iocur_top
->data
) == NULL
) {
3916 dbprintf(_("can't read agi block for ag %u\n"), agno
);
3920 if (be32_to_cpu(agi
->agi_magicnum
) != XFS_AGI_MAGIC
) {
3922 dbprintf(_("bad agi magic # %#x in ag %u\n"),
3923 be32_to_cpu(agi
->agi_magicnum
), agno
);
3926 if (!XFS_AGI_GOOD_VERSION(be32_to_cpu(agi
->agi_versionnum
))) {
3928 dbprintf(_("bad agi version # %#x in ag %u\n"),
3929 be32_to_cpu(agi
->agi_versionnum
), agno
);
3932 if (XFS_SB_BLOCK(mp
) != XFS_AGI_BLOCK(mp
) &&
3933 XFS_AGF_BLOCK(mp
) != XFS_AGI_BLOCK(mp
))
3934 set_dbmap(agno
, XFS_AGI_BLOCK(mp
), 1, DBM_AGI
, agno
,
3939 be32_to_cpu(agf
->agf_roots
[XFS_BTNUM_BNO
]),
3940 be32_to_cpu(agf
->agf_levels
[XFS_BTNUM_BNO
]),
3941 1, scanfunc_bno
, TYP_BNOBT
);
3944 be32_to_cpu(agf
->agf_roots
[XFS_BTNUM_CNT
]),
3945 be32_to_cpu(agf
->agf_levels
[XFS_BTNUM_CNT
]),
3946 1, scanfunc_cnt
, TYP_CNTBT
);
3947 if (agf
->agf_roots
[XFS_BTNUM_RMAP
]) {
3949 be32_to_cpu(agf
->agf_roots
[XFS_BTNUM_RMAP
]),
3950 be32_to_cpu(agf
->agf_levels
[XFS_BTNUM_RMAP
]),
3951 1, scanfunc_rmap
, TYP_RMAPBT
);
3953 if (agf
->agf_refcount_root
) {
3955 be32_to_cpu(agf
->agf_refcount_root
),
3956 be32_to_cpu(agf
->agf_refcount_level
),
3957 1, scanfunc_refcnt
, TYP_REFCBT
);
3960 be32_to_cpu(agi
->agi_root
),
3961 be32_to_cpu(agi
->agi_level
),
3962 1, scanfunc_ino
, TYP_INOBT
);
3963 if (agi
->agi_free_root
) {
3965 be32_to_cpu(agi
->agi_free_root
),
3966 be32_to_cpu(agi
->agi_free_level
),
3967 1, scanfunc_fino
, TYP_FINOBT
);
3969 if (be32_to_cpu(agf
->agf_freeblks
) != agffreeblks
) {
3971 dbprintf(_("agf_freeblks %u, counted %u in ag %u\n"),
3972 be32_to_cpu(agf
->agf_freeblks
),
3976 if (be32_to_cpu(agf
->agf_longest
) != agflongest
) {
3978 dbprintf(_("agf_longest %u, counted %u in ag %u\n"),
3979 be32_to_cpu(agf
->agf_longest
),
3984 be32_to_cpu(agf
->agf_btreeblks
) != agfbtreeblks
) {
3986 dbprintf(_("agf_btreeblks %u, counted %u in ag %u\n"),
3987 be32_to_cpu(agf
->agf_btreeblks
),
3988 agfbtreeblks
, agno
);
3991 agf_aggr_freeblks
+= agffreeblks
+ agfbtreeblks
;
3992 if (be32_to_cpu(agi
->agi_count
) != agicount
) {
3994 dbprintf(_("agi_count %u, counted %u in ag %u\n"),
3995 be32_to_cpu(agi
->agi_count
),
3999 if (be32_to_cpu(agi
->agi_freecount
) != agifreecount
) {
4001 dbprintf(_("agi_freecount %u, counted %u in ag %u\n"),
4002 be32_to_cpu(agi
->agi_freecount
),
4003 agifreecount
, agno
);
4006 for (i
= 0; i
< XFS_AGI_UNLINKED_BUCKETS
; i
++) {
4007 if (be32_to_cpu(agi
->agi_unlinked
[i
]) != NULLAGINO
) {
4009 xfs_agino_t agino
=be32_to_cpu(agi
->agi_unlinked
[i
]);
4010 dbprintf(_("agi unlinked bucket %d is %u in ag "
4011 "%u (inode=%lld)\n"), i
, agino
, agno
,
4012 XFS_AGINO_TO_INO(mp
, agno
, agino
));
4029 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4036 if (XFS_SB_BLOCK(mp
) != XFS_AGFL_BLOCK(mp
) &&
4037 XFS_AGF_BLOCK(mp
) != XFS_AGFL_BLOCK(mp
) &&
4038 XFS_AGI_BLOCK(mp
) != XFS_AGFL_BLOCK(mp
))
4039 set_dbmap(seqno
, XFS_AGFL_BLOCK(mp
), 1, DBM_AGFL
, seqno
,
4041 if (be32_to_cpu(agf
->agf_flcount
) == 0)
4044 set_cur(&typtab
[TYP_AGFL
],
4045 XFS_AG_DADDR(mp
, seqno
, XFS_AGFL_DADDR(mp
)),
4046 XFS_FSS_TO_BB(mp
, 1), DB_RING_IGN
, NULL
);
4047 if ((agfl
= iocur_top
->data
) == NULL
) {
4048 dbprintf(_("can't read agfl block for ag %u\n"), seqno
);
4053 i
= be32_to_cpu(agf
->agf_flfirst
);
4055 /* verify agf values before proceeding */
4056 if (be32_to_cpu(agf
->agf_flfirst
) >= XFS_AGFL_SIZE(mp
) ||
4057 be32_to_cpu(agf
->agf_fllast
) >= XFS_AGFL_SIZE(mp
)) {
4058 dbprintf(_("agf %d freelist blocks bad, skipping "
4059 "freelist scan\n"), i
);
4064 /* open coded XFS_BUF_TO_AGFL_BNO */
4065 freelist
= xfs_sb_version_hascrc(&((mp
)->m_sb
)) ? &agfl
->agfl_bno
[0]
4069 bno
= be32_to_cpu(freelist
[i
]);
4070 set_dbmap(seqno
, bno
, 1, DBM_FREELIST
, seqno
,
4071 XFS_AGFL_BLOCK(mp
));
4073 if (i
== be32_to_cpu(agf
->agf_fllast
))
4075 if (++i
== XFS_AGFL_SIZE(mp
))
4078 if (count
!= be32_to_cpu(agf
->agf_flcount
)) {
4080 dbprintf(_("freeblk count %u != flcount %u in ag %u\n"),
4081 count
, be32_to_cpu(agf
->agf_flcount
),
4086 agf_aggr_freeblks
+= count
;
4094 scan_lbtree_f_t func
,
4097 xfs_rfsblock_t
*totd
,
4098 xfs_rfsblock_t
*toti
,
4105 set_cur(&typtab
[btype
], XFS_FSB_TO_DADDR(mp
, root
), blkbb
, DB_RING_IGN
,
4107 if (iocur_top
->data
== NULL
) {
4109 dbprintf(_("can't read btree block %u/%u\n"),
4110 XFS_FSB_TO_AGNO(mp
, root
),
4111 XFS_FSB_TO_AGBNO(mp
, root
));
4116 (*func
)(iocur_top
->data
, nlevels
- 1, type
, root
, id
, totd
, toti
, nex
,
4117 blkmapp
, isroot
, btype
);
4127 scan_sbtree_f_t func
,
4130 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4133 set_cur(&typtab
[btype
],
4134 XFS_AGB_TO_DADDR(mp
, seqno
, root
), blkbb
, DB_RING_IGN
, NULL
);
4135 if (iocur_top
->data
== NULL
) {
4137 dbprintf(_("can't read btree block %u/%u\n"), seqno
, root
);
4142 (*func
)(iocur_top
->data
, nlevels
- 1, agf
, root
, isroot
);
4148 struct xfs_btree_block
*block
,
4153 xfs_rfsblock_t
*totd
,
4154 xfs_rfsblock_t
*toti
,
4160 xfs_agblock_t agbno
;
4161 xfs_agnumber_t agno
;
4166 agno
= XFS_FSB_TO_AGNO(mp
, bno
);
4167 agbno
= XFS_FSB_TO_AGBNO(mp
, bno
);
4168 if (be32_to_cpu(block
->bb_magic
) != XFS_BMAP_MAGIC
&&
4169 be32_to_cpu(block
->bb_magic
) != XFS_BMAP_CRC_MAGIC
) {
4170 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
4171 dbprintf(_("bad magic # %#x in inode %lld bmbt block "
4173 be32_to_cpu(block
->bb_magic
), id
->ino
, agno
, agbno
);
4176 if (be16_to_cpu(block
->bb_level
) != level
) {
4177 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
4178 dbprintf(_("expected level %d got %d in inode %lld bmbt "
4180 level
, be16_to_cpu(block
->bb_level
), id
->ino
, agno
, agbno
);
4183 set_dbmap(agno
, agbno
, 1, type
, agno
, agbno
);
4184 set_inomap(agno
, agbno
, 1, id
);
4187 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_bmap_dmxr
[0] ||
4188 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_bmap_dmnr
[0])) {
4189 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
4190 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) "
4191 "in inode %lld bmap block %lld\n"),
4192 be16_to_cpu(block
->bb_numrecs
), mp
->m_bmap_dmnr
[0],
4193 mp
->m_bmap_dmxr
[0], id
->ino
,
4194 (xfs_fsblock_t
)bno
);
4198 rp
= XFS_BMBT_REC_ADDR(mp
, block
, 1);
4199 *nex
+= be16_to_cpu(block
->bb_numrecs
);
4200 process_bmbt_reclist(rp
, be16_to_cpu(block
->bb_numrecs
), type
, id
, totd
,
4204 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_bmap_dmxr
[1] ||
4205 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_bmap_dmnr
[1])) {
4206 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
4207 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in "
4208 "inode %lld bmap block %lld\n"),
4209 be16_to_cpu(block
->bb_numrecs
), mp
->m_bmap_dmnr
[1],
4210 mp
->m_bmap_dmxr
[1], id
->ino
, (xfs_fsblock_t
)bno
);
4214 pp
= XFS_BMBT_PTR_ADDR(mp
, block
, 1, mp
->m_bmap_dmxr
[0]);
4215 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++)
4216 scan_lbtree(be64_to_cpu(pp
[i
]), level
, scanfunc_bmap
, type
, id
,
4217 totd
, toti
, nex
, blkmapp
, 0, btype
);
4222 struct xfs_btree_block
*block
,
4229 xfs_alloc_ptr_t
*pp
;
4230 xfs_alloc_rec_t
*rp
;
4231 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4232 xfs_agblock_t lastblock
;
4234 if (be32_to_cpu(block
->bb_magic
) != XFS_ABTB_MAGIC
&&
4235 be32_to_cpu(block
->bb_magic
) != XFS_ABTB_CRC_MAGIC
) {
4236 dbprintf(_("bad magic # %#x in btbno block %u/%u\n"),
4237 be32_to_cpu(block
->bb_magic
), seqno
, bno
);
4243 if (be16_to_cpu(block
->bb_level
) != level
) {
4245 dbprintf(_("expected level %d got %d in btbno block "
4247 level
, be16_to_cpu(block
->bb_level
), seqno
, bno
);
4250 set_dbmap(seqno
, bno
, 1, DBM_BTBNO
, seqno
, bno
);
4252 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_alloc_mxr
[0] ||
4253 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_alloc_mnr
[0])) {
4254 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in "
4255 "btbno block %u/%u\n"),
4256 be16_to_cpu(block
->bb_numrecs
), mp
->m_alloc_mnr
[0],
4257 mp
->m_alloc_mxr
[0], seqno
, bno
);
4261 rp
= XFS_ALLOC_REC_ADDR(mp
, block
, 1);
4263 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++) {
4264 set_dbmap(seqno
, be32_to_cpu(rp
[i
].ar_startblock
),
4265 be32_to_cpu(rp
[i
].ar_blockcount
), DBM_FREE1
,
4267 if (be32_to_cpu(rp
[i
].ar_startblock
) <= lastblock
) {
4269 "out-of-order bno btree record %d (%u %u) block %u/%u\n"),
4270 i
, be32_to_cpu(rp
[i
].ar_startblock
),
4271 be32_to_cpu(rp
[i
].ar_blockcount
),
4272 be32_to_cpu(agf
->agf_seqno
), bno
);
4275 lastblock
= be32_to_cpu(rp
[i
].ar_startblock
);
4280 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_alloc_mxr
[1] ||
4281 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_alloc_mnr
[1])) {
4282 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in btbno block "
4284 be16_to_cpu(block
->bb_numrecs
), mp
->m_alloc_mnr
[1],
4285 mp
->m_alloc_mxr
[1], seqno
, bno
);
4289 pp
= XFS_ALLOC_PTR_ADDR(mp
, block
, 1, mp
->m_alloc_mxr
[1]);
4290 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++)
4291 scan_sbtree(agf
, be32_to_cpu(pp
[i
]), level
, 0, scanfunc_bno
, TYP_BNOBT
);
4296 struct xfs_btree_block
*block
,
4302 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4304 xfs_alloc_ptr_t
*pp
;
4305 xfs_alloc_rec_t
*rp
;
4306 xfs_extlen_t lastcount
;
4308 if (be32_to_cpu(block
->bb_magic
) != XFS_ABTC_MAGIC
&&
4309 be32_to_cpu(block
->bb_magic
) != XFS_ABTC_CRC_MAGIC
) {
4310 dbprintf(_("bad magic # %#x in btcnt block %u/%u\n"),
4311 be32_to_cpu(block
->bb_magic
), seqno
, bno
);
4317 if (be16_to_cpu(block
->bb_level
) != level
) {
4319 dbprintf(_("expected level %d got %d in btcnt block "
4321 level
, be16_to_cpu(block
->bb_level
), seqno
, bno
);
4324 set_dbmap(seqno
, bno
, 1, DBM_BTCNT
, seqno
, bno
);
4326 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_alloc_mxr
[0] ||
4327 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_alloc_mnr
[0])) {
4328 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in "
4329 "btbno block %u/%u\n"),
4330 be16_to_cpu(block
->bb_numrecs
), mp
->m_alloc_mnr
[0],
4331 mp
->m_alloc_mxr
[0], seqno
, bno
);
4335 rp
= XFS_ALLOC_REC_ADDR(mp
, block
, 1);
4337 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++) {
4338 check_set_dbmap(seqno
, be32_to_cpu(rp
[i
].ar_startblock
),
4339 be32_to_cpu(rp
[i
].ar_blockcount
), DBM_FREE1
, DBM_FREE2
,
4341 fdblocks
+= be32_to_cpu(rp
[i
].ar_blockcount
);
4342 agffreeblks
+= be32_to_cpu(rp
[i
].ar_blockcount
);
4343 if (be32_to_cpu(rp
[i
].ar_blockcount
) > agflongest
)
4344 agflongest
= be32_to_cpu(rp
[i
].ar_blockcount
);
4345 if (be32_to_cpu(rp
[i
].ar_blockcount
) < lastcount
) {
4347 "out-of-order cnt btree record %d (%u %u) block %u/%u\n"),
4348 i
, be32_to_cpu(rp
[i
].ar_startblock
),
4349 be32_to_cpu(rp
[i
].ar_blockcount
),
4350 be32_to_cpu(agf
->agf_seqno
), bno
);
4352 lastcount
= be32_to_cpu(rp
[i
].ar_blockcount
);
4357 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_alloc_mxr
[1] ||
4358 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_alloc_mnr
[1])) {
4359 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in btbno block "
4361 be16_to_cpu(block
->bb_numrecs
), mp
->m_alloc_mnr
[1],
4362 mp
->m_alloc_mxr
[1], seqno
, bno
);
4366 pp
= XFS_ALLOC_PTR_ADDR(mp
, block
, 1, mp
->m_alloc_mxr
[1]);
4367 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++)
4368 scan_sbtree(agf
, be32_to_cpu(pp
[i
]), level
, 0, scanfunc_cnt
, TYP_CNTBT
);
4373 struct xfs_btree_block
*block
,
4380 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4387 xfs_inobt_ptr_t
*pp
;
4388 xfs_inobt_rec_t
*rp
;
4389 xfs_agblock_t agbno
;
4390 xfs_agblock_t end_agbno
;
4391 struct xfs_dinode
*dip
;
4396 if (xfs_sb_version_hassparseinodes(&mp
->m_sb
))
4397 blks_per_buf
= xfs_icluster_size_fsb(mp
);
4399 blks_per_buf
= mp
->m_ialloc_blks
;
4400 inodes_per_buf
= min(blks_per_buf
<< mp
->m_sb
.sb_inopblog
,
4401 XFS_INODES_PER_CHUNK
);
4403 if (be32_to_cpu(block
->bb_magic
) != XFS_IBT_MAGIC
&&
4404 be32_to_cpu(block
->bb_magic
) != XFS_IBT_CRC_MAGIC
) {
4405 dbprintf(_("bad magic # %#x in inobt block %u/%u\n"),
4406 be32_to_cpu(block
->bb_magic
), seqno
, bno
);
4410 if (be16_to_cpu(block
->bb_level
) != level
) {
4412 dbprintf(_("expected level %d got %d in inobt block "
4414 level
, be16_to_cpu(block
->bb_level
), seqno
, bno
);
4417 set_dbmap(seqno
, bno
, 1, DBM_BTINO
, seqno
, bno
);
4419 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_inobt_mxr
[0] ||
4420 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_inobt_mnr
[0])) {
4421 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in "
4422 "inobt block %u/%u\n"),
4423 be16_to_cpu(block
->bb_numrecs
), mp
->m_inobt_mnr
[0],
4424 mp
->m_inobt_mxr
[0], seqno
, bno
);
4428 rp
= XFS_INOBT_REC_ADDR(mp
, block
, 1);
4429 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++) {
4430 agino
= be32_to_cpu(rp
[i
].ir_startino
);
4431 agbno
= XFS_AGINO_TO_AGBNO(mp
, agino
);
4432 off
= XFS_AGINO_TO_OFFSET(mp
, agino
);
4433 end_agbno
= agbno
+ mp
->m_ialloc_blks
;
4435 if ((sbversion
& XFS_SB_VERSION_ALIGNBIT
) &&
4436 mp
->m_sb
.sb_inoalignmt
&&
4437 (XFS_INO_TO_AGBNO(mp
, agino
) %
4438 mp
->m_sb
.sb_inoalignmt
))
4439 sbversion
&= ~XFS_SB_VERSION_ALIGNBIT
;
4446 while (agbno
< end_agbno
&&
4447 ioff
< XFS_INODES_PER_CHUNK
) {
4448 if (xfs_inobt_is_sparse_disk(&rp
[i
], ioff
))
4451 if (off
< XFS_INODES_PER_CHUNK
)
4452 set_dbmap(seqno
, agbno
, blks_per_buf
,
4453 DBM_INODE
, seqno
, bno
);
4455 icount
+= inodes_per_buf
;
4456 agicount
+= inodes_per_buf
;
4458 set_cur(&typtab
[TYP_INODE
],
4459 XFS_AGB_TO_DADDR(mp
, seqno
, agbno
),
4460 XFS_FSB_TO_BB(mp
, blks_per_buf
),
4462 if (iocur_top
->data
== NULL
) {
4464 dbprintf(_("can't read inode block "
4471 for (j
= 0; j
< inodes_per_buf
; j
++) {
4472 isfree
= XFS_INOBT_IS_FREE_DISK(&rp
[i
], ioff
+ j
);
4475 dip
= (xfs_dinode_t
*)((char *)iocur_top
->data
+
4476 ((off
+ j
) << mp
->m_sb
.sb_inodelog
));
4477 process_inode(agf
, agino
+ ioff
+ j
, dip
, isfree
);
4481 agbno
+= blks_per_buf
;
4482 ioff
+= inodes_per_buf
;
4485 if (xfs_sb_version_hassparseinodes(&mp
->m_sb
))
4486 freecount
= rp
[i
].ir_u
.sp
.ir_freecount
;
4488 freecount
= be32_to_cpu(rp
[i
].ir_u
.f
.ir_freecount
);
4491 agifreecount
+= freecount
;
4493 if (nfree
!= freecount
) {
4495 dbprintf(_("ir_freecount/free mismatch, "
4496 "inode chunk %u/%u, freecount "
4498 seqno
, agino
, freecount
, nfree
);
4505 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_inobt_mxr
[1] ||
4506 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_inobt_mnr
[1])) {
4507 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in inobt block "
4509 be16_to_cpu(block
->bb_numrecs
), mp
->m_inobt_mnr
[1],
4510 mp
->m_inobt_mxr
[1], seqno
, bno
);
4514 pp
= XFS_INOBT_PTR_ADDR(mp
, block
, 1, mp
->m_inobt_mxr
[1]);
4515 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++)
4516 scan_sbtree(agf
, be32_to_cpu(pp
[i
]), level
, 0, scanfunc_ino
, TYP_INOBT
);
4521 struct xfs_btree_block
*block
,
4523 struct xfs_agf
*agf
,
4528 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4531 xfs_inobt_ptr_t
*pp
;
4532 struct xfs_inobt_rec
*rp
;
4533 xfs_agblock_t agbno
;
4534 xfs_agblock_t end_agbno
;
4539 if (xfs_sb_version_hassparseinodes(&mp
->m_sb
))
4540 blks_per_buf
= xfs_icluster_size_fsb(mp
);
4542 blks_per_buf
= mp
->m_ialloc_blks
;
4543 inodes_per_buf
= min(blks_per_buf
<< mp
->m_sb
.sb_inopblog
,
4544 XFS_INODES_PER_CHUNK
);
4546 if (be32_to_cpu(block
->bb_magic
) != XFS_FIBT_MAGIC
&&
4547 be32_to_cpu(block
->bb_magic
) != XFS_FIBT_CRC_MAGIC
) {
4548 dbprintf(_("bad magic # %#x in finobt block %u/%u\n"),
4549 be32_to_cpu(block
->bb_magic
), seqno
, bno
);
4553 if (be16_to_cpu(block
->bb_level
) != level
) {
4555 dbprintf(_("expected level %d got %d in finobt block "
4557 level
, be16_to_cpu(block
->bb_level
), seqno
, bno
);
4560 set_dbmap(seqno
, bno
, 1, DBM_BTFINO
, seqno
, bno
);
4562 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_inobt_mxr
[0] ||
4563 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_inobt_mnr
[0])) {
4564 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in "
4565 "finobt block %u/%u\n"),
4566 be16_to_cpu(block
->bb_numrecs
), mp
->m_inobt_mnr
[0],
4567 mp
->m_inobt_mxr
[0], seqno
, bno
);
4571 rp
= XFS_INOBT_REC_ADDR(mp
, block
, 1);
4572 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++) {
4573 agino
= be32_to_cpu(rp
[i
].ir_startino
);
4574 agbno
= XFS_AGINO_TO_AGBNO(mp
, agino
);
4575 off
= XFS_AGINO_TO_OFFSET(mp
, agino
);
4576 end_agbno
= agbno
+ mp
->m_ialloc_blks
;
4578 if ((sbversion
& XFS_SB_VERSION_ALIGNBIT
) &&
4579 mp
->m_sb
.sb_inoalignmt
&&
4580 (XFS_INO_TO_AGBNO(mp
, agino
) %
4581 mp
->m_sb
.sb_inoalignmt
))
4582 sbversion
&= ~XFS_SB_VERSION_ALIGNBIT
;
4586 while (agbno
< end_agbno
&&
4587 ioff
< XFS_INODES_PER_CHUNK
) {
4588 if (xfs_inobt_is_sparse_disk(&rp
[i
], ioff
))
4591 check_set_dbmap(seqno
, agbno
,
4592 (xfs_extlen_t
)MAX(1,
4594 mp
->m_sb
.sb_inopblog
),
4595 DBM_INODE
, DBM_INODE
, seqno
, bno
);
4598 agbno
+= blks_per_buf
;
4599 ioff
+= inodes_per_buf
;
4605 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_inobt_mxr
[1] ||
4606 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_inobt_mnr
[1])) {
4607 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in finobt block "
4609 be16_to_cpu(block
->bb_numrecs
), mp
->m_inobt_mnr
[1],
4610 mp
->m_inobt_mxr
[1], seqno
, bno
);
4614 pp
= XFS_INOBT_PTR_ADDR(mp
, block
, 1, mp
->m_inobt_mxr
[1]);
4615 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++)
4616 scan_sbtree(agf
, be32_to_cpu(pp
[i
]), level
, 0, scanfunc_fino
, TYP_FINOBT
);
4621 struct xfs_btree_block
*block
,
4623 struct xfs_agf
*agf
,
4627 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4630 struct xfs_rmap_rec
*rp
;
4631 xfs_agblock_t lastblock
;
4633 if (be32_to_cpu(block
->bb_magic
) != XFS_RMAP_CRC_MAGIC
) {
4634 dbprintf(_("bad magic # %#x in rmapbt block %u/%u\n"),
4635 be32_to_cpu(block
->bb_magic
), seqno
, bno
);
4639 if (be16_to_cpu(block
->bb_level
) != level
) {
4641 dbprintf(_("expected level %d got %d in rmapbt block "
4643 level
, be16_to_cpu(block
->bb_level
), seqno
, bno
);
4650 set_dbmap(seqno
, bno
, 1, DBM_BTRMAP
, seqno
, bno
);
4652 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_rmap_mxr
[0] ||
4653 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_rmap_mnr
[0])) {
4654 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in "
4655 "rmapbt block %u/%u\n"),
4656 be16_to_cpu(block
->bb_numrecs
), mp
->m_rmap_mnr
[0],
4657 mp
->m_rmap_mxr
[0], seqno
, bno
);
4661 rp
= XFS_RMAP_REC_ADDR(block
, 1);
4663 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++) {
4664 if (be32_to_cpu(rp
[i
].rm_startblock
) < lastblock
) {
4666 "out-of-order rmap btree record %d (%u %u) block %u/%u\n"),
4667 i
, be32_to_cpu(rp
[i
].rm_startblock
),
4668 be32_to_cpu(rp
[i
].rm_startblock
),
4669 be32_to_cpu(agf
->agf_seqno
), bno
);
4671 lastblock
= be32_to_cpu(rp
[i
].rm_startblock
);
4676 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_rmap_mxr
[1] ||
4677 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_rmap_mnr
[1])) {
4678 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in rmapbt "
4680 be16_to_cpu(block
->bb_numrecs
), mp
->m_rmap_mnr
[1],
4681 mp
->m_rmap_mxr
[1], seqno
, bno
);
4685 pp
= XFS_RMAP_PTR_ADDR(block
, 1, mp
->m_rmap_mxr
[1]);
4686 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++)
4687 scan_sbtree(agf
, be32_to_cpu(pp
[i
]), level
, 0, scanfunc_rmap
,
4693 struct xfs_btree_block
*block
,
4695 struct xfs_agf
*agf
,
4699 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4701 xfs_refcount_ptr_t
*pp
;
4702 struct xfs_refcount_rec
*rp
;
4703 xfs_agblock_t lastblock
;
4705 if (be32_to_cpu(block
->bb_magic
) != XFS_REFC_CRC_MAGIC
) {
4706 dbprintf(_("bad magic # %#x in refcntbt block %u/%u\n"),
4707 be32_to_cpu(block
->bb_magic
), seqno
, bno
);
4711 if (be16_to_cpu(block
->bb_level
) != level
) {
4713 dbprintf(_("expected level %d got %d in refcntbt block "
4715 level
, be16_to_cpu(block
->bb_level
), seqno
, bno
);
4718 set_dbmap(seqno
, bno
, 1, DBM_BTREFC
, seqno
, bno
);
4720 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_refc_mxr
[0] ||
4721 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_refc_mnr
[0])) {
4722 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in "
4723 "refcntbt block %u/%u\n"),
4724 be16_to_cpu(block
->bb_numrecs
), mp
->m_refc_mnr
[0],
4725 mp
->m_refc_mxr
[0], seqno
, bno
);
4729 rp
= XFS_REFCOUNT_REC_ADDR(block
, 1);
4731 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++) {
4732 if (be32_to_cpu(rp
[i
].rc_refcount
) == 1) {
4733 xfs_agblock_t agbno
;
4736 agbno
= be32_to_cpu(rp
[i
].rc_startblock
);
4737 if (agbno
>= XFS_REFC_COW_START
) {
4738 agbno
-= XFS_REFC_COW_START
;
4740 "leftover CoW extent (%u/%u) len %u\n");
4743 "leftover CoW extent at unexpected address (%u/%u) len %u\n");
4748 be32_to_cpu(rp
[i
].rc_blockcount
));
4751 be32_to_cpu(rp
[i
].rc_blockcount
),
4752 DBM_COWDATA
, seqno
, bno
);
4755 be32_to_cpu(rp
[i
].rc_startblock
),
4756 be32_to_cpu(rp
[i
].rc_blockcount
),
4757 DBM_RLDATA
, seqno
, bno
);
4759 if (be32_to_cpu(rp
[i
].rc_startblock
) < lastblock
) {
4761 "out-of-order refcnt btree record %d (%u %u) block %u/%u\n"),
4762 i
, be32_to_cpu(rp
[i
].rc_startblock
),
4763 be32_to_cpu(rp
[i
].rc_startblock
),
4764 be32_to_cpu(agf
->agf_seqno
), bno
);
4766 lastblock
= be32_to_cpu(rp
[i
].rc_startblock
) +
4767 be32_to_cpu(rp
[i
].rc_blockcount
);
4772 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_refc_mxr
[1] ||
4773 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_refc_mnr
[1])) {
4774 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in refcntbt "
4776 be16_to_cpu(block
->bb_numrecs
), mp
->m_refc_mnr
[1],
4777 mp
->m_refc_mxr
[1], seqno
, bno
);
4781 pp
= XFS_REFCOUNT_PTR_ADDR(block
, 1, mp
->m_refc_mxr
[1]);
4782 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++)
4783 scan_sbtree(agf
, be32_to_cpu(pp
[i
]), level
, 0, scanfunc_refcnt
,
4789 xfs_agnumber_t agno
,
4790 xfs_agblock_t agbno
,
4793 xfs_agnumber_t c_agno
,
4794 xfs_agblock_t c_agbno
)
4796 check_set_dbmap(agno
, agbno
, len
, DBM_UNKNOWN
, type
, c_agno
, c_agbno
);
4801 xfs_agnumber_t agno
,
4802 xfs_agblock_t agbno
,
4810 if (!check_inomap(agno
, agbno
, len
, id
->ino
))
4812 mayprint
= verbose
| id
->ilist
| blist_size
;
4813 for (i
= 0, idp
= &inomap
[agno
][agbno
]; i
< len
; i
++, idp
++) {
4816 (verbose
|| id
->ilist
|| CHECK_BLISTA(agno
, agbno
+ i
)))
4817 dbprintf(_("setting inode to %lld for block %u/%u\n"),
4818 id
->ino
, agno
, agbno
+ i
);
4828 check_set_rdbmap(bno
, len
, DBM_UNKNOWN
, type
);
4841 if (!check_rinomap(bno
, len
, id
->ino
))
4843 mayprint
= verbose
| id
->ilist
| blist_size
;
4844 for (i
= 0, idp
= &inomap
[mp
->m_sb
.sb_agcount
][bno
];
4848 if (mayprint
&& (verbose
|| id
->ilist
|| CHECK_BLIST(bno
+ i
)))
4849 dbprintf(_("setting inode to %lld for rtblock %llu\n"),
4861 id
->link_set
= nlink
;
4863 id
->security
= security
;
4864 if (verbose
|| id
->ilist
)
4865 dbprintf(_("inode %lld nlink %u %s dir\n"), id
->ino
, nlink
,
4866 isdir
? "is" : "not");