1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
25 IS_USER_QUOTA
, IS_PROJECT_QUOTA
, IS_GROUP_QUOTA
,
29 DBM_UNKNOWN
, DBM_AGF
, DBM_AGFL
, DBM_AGI
,
30 DBM_ATTR
, DBM_BTBMAPA
, DBM_BTBMAPD
, DBM_BTBNO
,
31 DBM_BTCNT
, DBM_BTINO
, DBM_DATA
, DBM_DIR
,
32 DBM_FREE1
, DBM_FREE2
, DBM_FREELIST
, DBM_INODE
,
33 DBM_LOG
, DBM_MISSING
, DBM_QUOTA
, DBM_RTBITMAP
,
34 DBM_RTDATA
, DBM_RTFREE
, DBM_RTSUM
, DBM_SB
,
35 DBM_SYMLINK
, DBM_BTFINO
, DBM_BTRMAP
, DBM_BTREFC
,
36 DBM_RLDATA
, DBM_COWDATA
,
40 typedef struct inodata
{
49 struct inodata
*parent
;
52 #define MIN_INODATA_HASH_SIZE 256
53 #define MAX_INODATA_HASH_SIZE 65536
54 #define INODATA_AVG_HASH_LENGTH 8
56 typedef struct qinfo
{
62 #define QDATA_HASH_SIZE 256
63 typedef struct qdata
{
70 typedef struct blkent
{
71 xfs_fileoff_t startoff
;
73 xfs_fsblock_t blks
[1];
75 #define BLKENT_SIZE(n) \
76 (offsetof(blkent_t, blks) + (sizeof(xfs_fsblock_t) * (n)))
78 typedef struct blkmap
{
83 #define BLKMAP_SIZE(n) \
84 (offsetof(blkmap_t, ents) + (sizeof(blkent_t *) * (n)))
86 typedef struct freetab
{
89 xfs_dir2_data_off_t ents
[1];
91 #define FREETAB_SIZE(n) \
92 (offsetof(freetab_t, ents) + (sizeof(xfs_dir2_data_off_t) * (n)))
94 typedef struct dirhash
{
100 #define DIR_HASH_SIZE 1024
101 #define DIR_HASH_FUNC(h,a) (((h) ^ (a)) % DIR_HASH_SIZE)
103 static xfs_extlen_t agffreeblks
;
104 static xfs_extlen_t agflongest
;
105 static uint64_t agf_aggr_freeblks
; /* aggregate count over all */
106 static uint32_t agfbtreeblks
;
107 static int lazycount
;
108 static xfs_agino_t agicount
;
109 static xfs_agino_t agifreecount
;
110 static xfs_fsblock_t
*blist
;
111 static int blist_size
;
112 static char **dbmap
; /* really dbm_t:8 */
113 static dirhash_t
**dirhash
;
115 static uint64_t fdblocks
;
116 static uint64_t frextents
;
117 static uint64_t icount
;
118 static uint64_t ifree
;
119 static inodata_t
***inodata
;
120 static int inodata_hash_size
;
121 static inodata_t
***inomap
;
125 static qdata_t
**qpdata
;
127 static qdata_t
**qudata
;
129 static qdata_t
**qgdata
;
131 static unsigned sbversion
;
132 static int sbver_err
;
133 static int serious_error
;
135 static xfs_suminfo_t
*sumcompute
;
136 static xfs_suminfo_t
*sumfile
;
137 static const char *typename
[] = {
171 #define CHECK_BLIST(b) (blist_size && check_blist(b))
172 #define CHECK_BLISTA(a,b) \
173 (blist_size && check_blist(XFS_AGB_TO_FSB(mp, a, b)))
175 typedef void (*scan_lbtree_f_t
)(struct xfs_btree_block
*block
,
180 xfs_rfsblock_t
*totd
,
181 xfs_rfsblock_t
*toti
,
187 typedef void (*scan_sbtree_f_t
)(struct xfs_btree_block
*block
,
193 static void add_blist(xfs_fsblock_t bno
);
194 static void add_ilist(xfs_ino_t ino
);
195 static void addlink_inode(inodata_t
*id
);
196 static void addname_inode(inodata_t
*id
, char *name
, int namelen
);
197 static void addparent_inode(inodata_t
*id
, xfs_ino_t parent
);
198 static void blkent_append(blkent_t
**entp
, xfs_fsblock_t b
,
200 static blkent_t
*blkent_new(xfs_fileoff_t o
, xfs_fsblock_t b
,
202 static void blkent_prepend(blkent_t
**entp
, xfs_fsblock_t b
,
204 static blkmap_t
*blkmap_alloc(xfs_extnum_t
);
205 static void blkmap_free(blkmap_t
*blkmap
);
206 static xfs_fsblock_t
blkmap_get(blkmap_t
*blkmap
, xfs_fileoff_t o
);
207 static int blkmap_getn(blkmap_t
*blkmap
, xfs_fileoff_t o
, int nb
,
209 static void blkmap_grow(blkmap_t
**blkmapp
, blkent_t
**entp
,
211 static xfs_fileoff_t
blkmap_next_off(blkmap_t
*blkmap
, xfs_fileoff_t o
,
213 static void blkmap_set_blk(blkmap_t
**blkmapp
, xfs_fileoff_t o
,
215 static void blkmap_set_ext(blkmap_t
**blkmapp
, xfs_fileoff_t o
,
216 xfs_fsblock_t b
, xfs_extlen_t c
);
217 static void blkmap_shrink(blkmap_t
*blkmap
, blkent_t
**entp
);
218 static int blockfree_f(int argc
, char **argv
);
219 static int blockget_f(int argc
, char **argv
);
220 static int blocktrash_f(int argc
, char **argv
);
221 static int blockuse_f(int argc
, char **argv
);
222 static int check_blist(xfs_fsblock_t bno
);
223 static void check_dbmap(xfs_agnumber_t agno
, xfs_agblock_t agbno
,
224 xfs_extlen_t len
, dbm_t type
,
226 static int check_inomap(xfs_agnumber_t agno
, xfs_agblock_t agbno
,
227 xfs_extlen_t len
, xfs_ino_t c_ino
);
228 static void check_linkcounts(xfs_agnumber_t agno
);
229 static int check_range(xfs_agnumber_t agno
, xfs_agblock_t agbno
,
231 static void check_rdbmap(xfs_rfsblock_t bno
, xfs_extlen_t len
,
233 static int check_rinomap(xfs_rfsblock_t bno
, xfs_extlen_t len
,
235 static void check_rootdir(void);
236 static int check_rrange(xfs_rfsblock_t bno
, xfs_extlen_t len
);
237 static void check_set_dbmap(xfs_agnumber_t agno
,
238 xfs_agblock_t agbno
, xfs_extlen_t len
,
239 dbm_t type1
, dbm_t type2
,
240 xfs_agnumber_t c_agno
,
241 xfs_agblock_t c_agbno
);
242 static void check_set_rdbmap(xfs_rfsblock_t bno
, xfs_extlen_t len
,
243 dbm_t type1
, dbm_t type2
);
244 static void check_summary(void);
245 static void checknot_dbmap(xfs_agnumber_t agno
, xfs_agblock_t agbno
,
246 xfs_extlen_t len
, int typemask
);
247 static void checknot_rdbmap(xfs_rfsblock_t bno
, xfs_extlen_t len
,
249 static void dir_hash_add(xfs_dahash_t hash
,
250 xfs_dir2_dataptr_t addr
);
251 static void dir_hash_check(inodata_t
*id
, int v
);
252 static void dir_hash_done(void);
253 static void dir_hash_init(void);
254 static int dir_hash_see(xfs_dahash_t hash
,
255 xfs_dir2_dataptr_t addr
);
256 static inodata_t
*find_inode(xfs_ino_t ino
, int add
);
257 static void free_inodata(xfs_agnumber_t agno
);
258 static int init(int argc
, char **argv
);
259 static char *inode_name(xfs_ino_t ino
, inodata_t
**ipp
);
260 static int ncheck_f(int argc
, char **argv
);
261 static char *prepend_path(char *oldpath
, char *parent
);
262 static xfs_ino_t
process_block_dir_v2(blkmap_t
*blkmap
, int *dot
,
263 int *dotdot
, inodata_t
*id
);
264 static void process_bmbt_reclist(xfs_bmbt_rec_t
*rp
, int numrecs
,
265 dbm_t type
, inodata_t
*id
,
268 static void process_btinode(inodata_t
*id
, xfs_dinode_t
*dip
,
269 dbm_t type
, xfs_rfsblock_t
*totd
,
270 xfs_rfsblock_t
*toti
, xfs_extnum_t
*nex
,
271 blkmap_t
**blkmapp
, int whichfork
);
272 static xfs_ino_t
process_data_dir_v2(int *dot
, int *dotdot
,
273 inodata_t
*id
, int v
,
275 freetab_t
**freetabp
);
276 static xfs_dir2_data_free_t
*process_data_dir_v2_freefind(
277 struct xfs_dir2_data_hdr
*data
,
278 struct xfs_dir2_data_unused
*dup
);
279 static void process_dir(xfs_dinode_t
*dip
, blkmap_t
*blkmap
,
281 static int process_dir_v2(xfs_dinode_t
*dip
, blkmap_t
*blkmap
,
282 int *dot
, int *dotdot
, inodata_t
*id
,
284 static void process_exinode(inodata_t
*id
, xfs_dinode_t
*dip
,
285 dbm_t type
, xfs_rfsblock_t
*totd
,
286 xfs_rfsblock_t
*toti
, xfs_extnum_t
*nex
,
287 blkmap_t
**blkmapp
, int whichfork
);
288 static void process_inode(xfs_agf_t
*agf
, xfs_agino_t agino
,
289 xfs_dinode_t
*dip
, int isfree
);
290 static void process_lclinode(inodata_t
*id
, xfs_dinode_t
*dip
,
291 dbm_t type
, xfs_rfsblock_t
*totd
,
292 xfs_rfsblock_t
*toti
, xfs_extnum_t
*nex
,
293 blkmap_t
**blkmapp
, int whichfork
);
294 static xfs_ino_t
process_leaf_node_dir_v2(blkmap_t
*blkmap
, int *dot
,
295 int *dotdot
, inodata_t
*id
,
296 xfs_fsize_t dirsize
);
297 static void process_leaf_node_dir_v2_free(inodata_t
*id
, int v
,
300 static void process_leaf_node_dir_v2_int(inodata_t
*id
, int v
,
303 static void process_quota(qtype_t qtype
, inodata_t
*id
,
305 static void process_rtbitmap(blkmap_t
*blkmap
);
306 static void process_rtsummary(blkmap_t
*blkmap
);
307 static xfs_ino_t
process_sf_dir_v2(xfs_dinode_t
*dip
, int *dot
,
308 int *dotdot
, inodata_t
*id
);
309 static void quota_add(xfs_dqid_t
*p
, xfs_dqid_t
*g
, xfs_dqid_t
*u
,
310 int dq
, xfs_qcnt_t bc
, xfs_qcnt_t ic
,
312 static void quota_add1(qdata_t
**qt
, xfs_dqid_t id
, int dq
,
313 xfs_qcnt_t bc
, xfs_qcnt_t ic
,
315 static void quota_check(char *s
, qdata_t
**qt
);
316 static void quota_init(void);
317 static void scan_ag(xfs_agnumber_t agno
);
318 static void scan_freelist(xfs_agf_t
*agf
);
319 static void scan_lbtree(xfs_fsblock_t root
, int nlevels
,
320 scan_lbtree_f_t func
, dbm_t type
,
321 inodata_t
*id
, xfs_rfsblock_t
*totd
,
322 xfs_rfsblock_t
*toti
, xfs_extnum_t
*nex
,
323 blkmap_t
**blkmapp
, int isroot
,
325 static void scan_sbtree(xfs_agf_t
*agf
, xfs_agblock_t root
,
326 int nlevels
, int isroot
,
327 scan_sbtree_f_t func
, typnm_t btype
);
328 static void scanfunc_bmap(struct xfs_btree_block
*block
,
329 int level
, dbm_t type
, xfs_fsblock_t bno
,
330 inodata_t
*id
, xfs_rfsblock_t
*totd
,
331 xfs_rfsblock_t
*toti
, xfs_extnum_t
*nex
,
332 blkmap_t
**blkmapp
, int isroot
,
334 static void scanfunc_bno(struct xfs_btree_block
*block
, int level
,
335 xfs_agf_t
*agf
, xfs_agblock_t bno
,
337 static void scanfunc_cnt(struct xfs_btree_block
*block
, int level
,
338 xfs_agf_t
*agf
, xfs_agblock_t bno
,
340 static void scanfunc_ino(struct xfs_btree_block
*block
, int level
,
341 xfs_agf_t
*agf
, xfs_agblock_t bno
,
343 static void scanfunc_fino(struct xfs_btree_block
*block
, int level
,
344 struct xfs_agf
*agf
, xfs_agblock_t bno
,
346 static void scanfunc_rmap(struct xfs_btree_block
*block
, int level
,
347 struct xfs_agf
*agf
, xfs_agblock_t bno
,
349 static void scanfunc_refcnt(struct xfs_btree_block
*block
, int level
,
350 struct xfs_agf
*agf
, xfs_agblock_t bno
,
352 static void set_dbmap(xfs_agnumber_t agno
, xfs_agblock_t agbno
,
353 xfs_extlen_t len
, dbm_t type
,
354 xfs_agnumber_t c_agno
, xfs_agblock_t c_agbno
);
355 static void set_inomap(xfs_agnumber_t agno
, xfs_agblock_t agbno
,
356 xfs_extlen_t len
, inodata_t
*id
);
357 static void set_rdbmap(xfs_rfsblock_t bno
, xfs_extlen_t len
,
359 static void set_rinomap(xfs_rfsblock_t bno
, xfs_extlen_t len
,
361 static void setlink_inode(inodata_t
*id
, nlink_t nlink
, int isdir
,
364 static const cmdinfo_t blockfree_cmd
=
365 { "blockfree", NULL
, blockfree_f
, 0, 0, 0,
366 NULL
, N_("free block usage information"), NULL
};
367 static const cmdinfo_t blockget_cmd
=
368 { "blockget", "check", blockget_f
, 0, -1, 0,
369 N_("[-s|-v] [-n] [-t] [-b bno]... [-i ino] ..."),
370 N_("get block usage and check consistency"), NULL
};
371 static const cmdinfo_t blocktrash_cmd
=
372 { "blocktrash", NULL
, blocktrash_f
, 0, -1, 0,
373 N_("[-n count] [-x minlen] [-y maxlen] [-s seed] [-0123] [-t type] ..."),
374 N_("trash randomly selected block(s)"), NULL
};
375 static const cmdinfo_t blockuse_cmd
=
376 { "blockuse", NULL
, blockuse_f
, 0, 3, 0,
377 N_("[-n] [-c blockcount]"),
378 N_("print usage for current block(s)"), NULL
};
379 static const cmdinfo_t ncheck_cmd
=
380 { "ncheck", NULL
, ncheck_f
, 0, -1, 0,
381 N_("[-s] [-i ino] ..."),
382 N_("print inode-name pairs"), NULL
};
390 blist
= xrealloc(blist
, blist_size
* sizeof(bno
));
391 blist
[blist_size
- 1] = bno
;
400 id
= find_inode(ino
, 1);
402 dbprintf(_("-i %lld bad inode number\n"), ino
);
413 if (verbose
|| id
->ilist
)
414 dbprintf(_("inode %lld add link, now %u\n"), id
->ino
,
424 if (!nflag
|| id
->name
)
426 id
->name
= xmalloc(namelen
+ 1);
427 memcpy(id
->name
, name
, namelen
);
428 id
->name
[namelen
] = '\0';
438 pid
= find_inode(parent
, 1);
440 if (verbose
|| id
->ilist
|| (pid
&& pid
->ilist
))
441 dbprintf(_("inode %lld parent %lld\n"), id
->ino
, parent
);
454 *entp
= ent
= xrealloc(ent
, BLKENT_SIZE(c
+ ent
->nblks
));
455 for (i
= 0; i
< c
; i
++)
456 ent
->blks
[ent
->nblks
+ i
] = b
+ i
;
469 ent
= xmalloc(BLKENT_SIZE(c
));
472 for (i
= 0; i
< c
; i
++)
473 ent
->blks
[i
] = b
+ i
;
488 newent
= xmalloc(BLKENT_SIZE(oldent
->nblks
+ c
));
489 newent
->nblks
= oldent
->nblks
+ c
;
490 newent
->startoff
= oldent
->startoff
- c
;
491 for (i
= 0; i
< c
; i
++)
492 newent
->blks
[i
] = b
+ c
;
493 for (; i
< oldent
->nblks
+ c
; i
++)
494 newent
->blks
[i
] = oldent
->blks
[i
- c
];
507 blkmap
= xmalloc(BLKMAP_SIZE(nex
));
508 blkmap
->naents
= nex
;
520 for (i
= 0, entp
= blkmap
->ents
; i
< blkmap
->nents
; i
++, entp
++)
534 for (i
= 0, entp
= blkmap
->ents
; i
< blkmap
->nents
; i
++, entp
++) {
536 if (o
>= ent
->startoff
&& o
< ent
->startoff
+ ent
->nblks
)
537 return ent
->blks
[o
- ent
->startoff
];
556 for (i
= nex
= 0, bmp
= NULL
, entp
= blkmap
->ents
;
560 if (ent
->startoff
>= o
+ nb
)
562 if (ent
->startoff
+ ent
->nblks
<= o
)
564 for (ento
= ent
->startoff
;
565 ento
< ent
->startoff
+ ent
->nblks
&& ento
< o
+ nb
;
570 bmp
[nex
- 1].startoff
+ bmp
[nex
- 1].blockcount
==
572 bmp
[nex
- 1].startblock
+ bmp
[nex
- 1].blockcount
==
573 ent
->blks
[ento
- ent
->startoff
])
574 bmp
[nex
- 1].blockcount
++;
576 bmp
= realloc(bmp
, ++nex
* sizeof(*bmp
));
577 bmp
[nex
- 1].startoff
= ento
;
578 bmp
[nex
- 1].startblock
=
579 ent
->blks
[ento
- ent
->startoff
];
580 bmp
[nex
- 1].blockcount
= 1;
581 bmp
[nex
- 1].flag
= 0;
600 idx
= (int)(entp
- blkmap
->ents
);
601 if (blkmap
->naents
== blkmap
->nents
) {
602 blkmap
= xrealloc(blkmap
, BLKMAP_SIZE(blkmap
->nents
+ 1));
606 for (i
= blkmap
->nents
; i
> idx
; i
--)
607 blkmap
->ents
[i
] = blkmap
->ents
[i
- 1];
608 blkmap
->ents
[idx
] = newent
;
620 ent
= blkmap
->ents
[blkmap
->nents
- 1];
621 return ent
->startoff
+ ent
->nblks
;
635 if (o
== NULLFILEOFF
) {
637 ent
= blkmap
->ents
[0];
638 return ent
->startoff
;
640 entp
= &blkmap
->ents
[*t
];
642 if (o
< ent
->startoff
+ ent
->nblks
- 1)
645 if (entp
>= &blkmap
->ents
[blkmap
->nents
])
649 return ent
->startoff
;
664 for (entp
= blkmap
->ents
; entp
< &blkmap
->ents
[blkmap
->nents
]; entp
++) {
666 if (o
< ent
->startoff
- 1) {
667 ent
= blkent_new(o
, b
, 1);
668 blkmap_grow(blkmapp
, entp
, ent
);
671 if (o
== ent
->startoff
- 1) {
672 blkent_prepend(entp
, b
, 1);
675 if (o
>= ent
->startoff
&& o
< ent
->startoff
+ ent
->nblks
) {
676 ent
->blks
[o
- ent
->startoff
] = b
;
679 if (o
> ent
->startoff
+ ent
->nblks
)
681 blkent_append(entp
, b
, 1);
682 if (entp
== &blkmap
->ents
[blkmap
->nents
- 1])
686 if (ent
->startoff
+ ent
->nblks
< nextent
->startoff
)
688 blkent_append(entp
, nextent
->blks
[0], nextent
->nblks
);
689 blkmap_shrink(blkmap
, &entp
[1]);
692 ent
= blkent_new(o
, b
, 1);
693 blkmap_grow(blkmapp
, entp
, ent
);
709 if (!blkmap
->nents
) {
710 blkmap
->ents
[0] = blkent_new(o
, b
, c
);
714 entp
= &blkmap
->ents
[blkmap
->nents
- 1];
716 if (ent
->startoff
+ ent
->nblks
== o
) {
717 blkent_append(entp
, b
, c
);
720 if (ent
->startoff
+ ent
->nblks
< o
) {
721 ent
= blkent_new(o
, b
, c
);
722 blkmap_grow(blkmapp
, &blkmap
->ents
[blkmap
->nents
], ent
);
725 for (i
= 0; i
< c
; i
++)
726 blkmap_set_blk(blkmapp
, o
+ i
, b
+ i
);
738 idx
= (int)(entp
- blkmap
->ents
);
739 for (i
= idx
+ 1; i
< blkmap
->nents
; i
++)
740 blkmap
->ents
[i
] = blkmap
->ents
[i
- 1];
754 dbprintf(_("block usage information not allocated\n"));
757 rt
= mp
->m_sb
.sb_rextents
!= 0;
758 for (c
= 0; c
< mp
->m_sb
.sb_agcount
; c
++) {
768 sumcompute
= sumfile
= NULL
;
780 * Check consistency of xfs filesystem contents.
792 dbprintf(_("already have block usage information\n"));
796 if (!init(argc
, argv
)) {
803 oldprefix
= dbprefix
;
805 for (agno
= 0, sbyell
= 0; agno
< mp
->m_sb
.sb_agcount
; agno
++) {
807 if (sbver_err
> 4 && !sbyell
&& sbver_err
>= agno
) {
809 dbprintf(_("WARNING: this may be a newer XFS "
820 dbprefix
= oldprefix
;
825 * Check that there are no blocks either
826 * a) unaccounted for or
827 * b) bno-free but not cnt-free
829 if (!tflag
) { /* are we in test mode, faking out freespace? */
830 for (agno
= 0; agno
< mp
->m_sb
.sb_agcount
; agno
++)
831 checknot_dbmap(agno
, 0, mp
->m_sb
.sb_agblocks
,
832 (1 << DBM_UNKNOWN
) | (1 << DBM_FREE1
));
834 for (agno
= 0; agno
< mp
->m_sb
.sb_agcount
; agno
++)
835 check_linkcounts(agno
);
836 if (mp
->m_sb
.sb_rblocks
) {
838 (xfs_extlen_t
)(mp
->m_sb
.sb_rextents
*
839 mp
->m_sb
.sb_rextsize
),
843 if (mp
->m_sb
.sb_icount
!= icount
) {
845 dbprintf(_("sb_icount %lld, counted %lld\n"),
846 mp
->m_sb
.sb_icount
, icount
);
849 if (mp
->m_sb
.sb_ifree
!= ifree
) {
851 dbprintf(_("sb_ifree %lld, counted %lld\n"),
852 mp
->m_sb
.sb_ifree
, ifree
);
855 if (mp
->m_sb
.sb_fdblocks
!= fdblocks
) {
857 dbprintf(_("sb_fdblocks %lld, counted %lld\n"),
858 mp
->m_sb
.sb_fdblocks
, fdblocks
);
861 if (lazycount
&& mp
->m_sb
.sb_fdblocks
!= agf_aggr_freeblks
) {
863 dbprintf(_("sb_fdblocks %lld, aggregate AGF count %lld\n"),
864 mp
->m_sb
.sb_fdblocks
, agf_aggr_freeblks
);
867 if (mp
->m_sb
.sb_frextents
!= frextents
) {
869 dbprintf(_("sb_frextents %lld, counted %lld\n"),
870 mp
->m_sb
.sb_frextents
, frextents
);
873 if (mp
->m_sb
.sb_bad_features2
!= 0 &&
874 mp
->m_sb
.sb_bad_features2
!= mp
->m_sb
.sb_features2
) {
876 dbprintf(_("sb_features2 (0x%x) not same as "
877 "sb_bad_features2 (0x%x)\n"),
878 mp
->m_sb
.sb_features2
,
879 mp
->m_sb
.sb_bad_features2
);
882 if ((sbversion
& XFS_SB_VERSION_ATTRBIT
) &&
883 !xfs_sb_version_hasattr(&mp
->m_sb
)) {
885 dbprintf(_("sb versionnum missing attr bit %x\n"),
886 XFS_SB_VERSION_ATTRBIT
);
889 if ((sbversion
& XFS_SB_VERSION_QUOTABIT
) &&
890 !xfs_sb_version_hasquota(&mp
->m_sb
)) {
892 dbprintf(_("sb versionnum missing quota bit %x\n"),
893 XFS_SB_VERSION_QUOTABIT
);
896 if (!(sbversion
& XFS_SB_VERSION_ALIGNBIT
) &&
897 xfs_sb_version_hasalign(&mp
->m_sb
)) {
899 dbprintf(_("sb versionnum extra align bit %x\n"),
900 XFS_SB_VERSION_ALIGNBIT
);
904 quota_check("user", qudata
);
906 quota_check("project", qpdata
);
908 quota_check("group", qgdata
);
909 if (sbver_err
> mp
->m_sb
.sb_agcount
/ 2)
910 dbprintf(_("WARNING: this may be a newer XFS filesystem.\n"));
913 dbprefix
= oldprefix
;
917 typedef struct ltab
{
936 const struct xfs_buf_ops
*stashed_ops
;
937 static char *modestr
[] = {
938 N_("zeroed"), N_("set"), N_("flipped"), N_("randomized")
943 agno
= XFS_FSB_TO_AGNO(mp
, XFS_DADDR_TO_FSB(mp
, iocur_top
->bb
));
944 agbno
= XFS_FSB_TO_AGBNO(mp
, XFS_DADDR_TO_FSB(mp
, iocur_top
->bb
));
945 if (iocur_top
->len
== 0) {
946 dbprintf(_("zero-length block %u/%u buffer to trash??\n"),
950 len
= (int)((random() % (ltabp
->max
- ltabp
->min
+ 1)) + ltabp
->min
);
952 * bit_offset >= 0: start fuzzing at this exact bit_offset.
953 * bit_offset < 0: pick an offset at least as high at -(bit_offset + 1).
955 if (bit_offset
< 0) {
956 bit_offset
= -(bit_offset
+ 1);
957 bit_offset
+= (int)(random() % (int)((iocur_top
->len
- bit_offset
) * NBBY
));
959 if (bit_offset
+ len
>= iocur_top
->len
* NBBY
)
960 len
= (iocur_top
->len
* NBBY
) - bit_offset
;
962 stashed_ops
= iocur_top
->bp
->b_ops
;
963 iocur_top
->bp
->b_ops
= NULL
;
964 if ((buf
= iocur_top
->data
) == NULL
) {
965 dbprintf(_("can't read block %u/%u for trashing\n"), agno
, agbno
);
968 for (bitno
= 0; bitno
< len
; bitno
++) {
969 bit
= (bit_offset
+ bitno
) % (mp
->m_sb
.sb_blocksize
* NBBY
);
981 newbit
= (buf
[byte
] & mask
) == 0;
984 newbit
= (int)random() & 1;
993 iocur_top
->bp
->b_ops
= stashed_ops
;
994 printf(_("blocktrash: %u/%u %s block %d bit%s starting %d:%d %s\n"),
995 agno
, agbno
, typename
[type
], len
, len
== 1 ? "" : "s",
996 bit_offset
/ NBBY
, bit_offset
% NBBY
, modestr
[mode
]);
1004 xfs_agblock_t agbno
;
1005 xfs_agnumber_t agno
;
1007 xfs_rfsblock_t blocks
;
1020 xfs_rfsblock_t randb
;
1024 bool this_block
= false;
1025 int bit_offset
= -1;
1032 gettimeofday(&now
, NULL
);
1033 seed
= (unsigned int)(now
.tv_sec
^ now
.tv_usec
);
1036 goodmask
= (1 << DBM_AGF
) |
1040 (1 << DBM_BTBMAPA
) |
1041 (1 << DBM_BTBMAPD
) |
1049 (1 << DBM_RTBITMAP
) |
1051 (1 << DBM_SYMLINK
) |
1056 while ((c
= getopt(argc
, argv
, "0123n:o:s:t:x:y:z")) != EOF
) {
1071 count
= (int)strtol(optarg
, &p
, 0);
1072 if (*p
!= '\0' || count
<= 0) {
1073 dbprintf(_("bad blocktrash count %s\n"), optarg
);
1079 if (optarg
[0] == '+') {
1083 bit_offset
= (int)strtol(optarg
, &p
, 0);
1084 if (*p
!= '\0' || bit_offset
< 0) {
1085 dbprintf(_("bad blocktrash offset %s\n"), optarg
);
1089 bit_offset
= -bit_offset
- 1;
1093 seed
= (uint
)strtoul(optarg
, &p
, 0);
1097 for (i
= 0; typename
[i
]; i
++) {
1098 if (strcmp(typename
[i
], optarg
) == 0)
1101 if (!typename
[i
] || (((1 << i
) & goodmask
) == 0)) {
1102 dbprintf(_("bad blocktrash type %s\n"), optarg
);
1108 min
= (int)strtol(optarg
, &p
, 0);
1109 if (*p
!= '\0' || min
<= 0 ||
1110 min
> mp
->m_sb
.sb_blocksize
* NBBY
) {
1111 dbprintf(_("bad blocktrash min %s\n"), optarg
);
1116 max
= (int)strtol(optarg
, &p
, 0);
1117 if (*p
!= '\0' || max
<= 0 ||
1118 max
> mp
->m_sb
.sb_blocksize
* NBBY
) {
1119 dbprintf(_("bad blocktrash max %s\n"), optarg
);
1127 dbprintf(_("bad option for blocktrash command\n"));
1131 if (!this_block
&& !dbmap
) {
1132 dbprintf(_("must run blockget first\n"));
1135 if (this_block
&& iocur_sp
== 0) {
1136 dbprintf(_("nothing on stack\n"));
1140 dbprintf(_("bad min/max for blocktrash command\n"));
1144 tmask
= goodmask
& ~((1 << DBM_LOG
) | (1 << DBM_SB
));
1145 lentab
= xmalloc(sizeof(ltab_t
));
1146 lentab
->min
= lentab
->max
= min
;
1148 for (i
= min
+ 1; i
<= max
; i
++) {
1149 if ((i
& (i
- 1)) == 0) {
1150 lentab
= xrealloc(lentab
,
1151 sizeof(ltab_t
) * (lentablen
+ 1));
1152 lentab
[lentablen
].min
= lentab
[lentablen
].max
= i
;
1155 lentab
[lentablen
- 1].max
= i
;
1158 dbprintf(_("blocktrash: seed %u\n"), seed
);
1161 blocktrash_b(bit_offset
, DBM_UNKNOWN
,
1162 &lentab
[random() % lentablen
], mode
);
1165 for (blocks
= 0, agno
= 0; agno
< mp
->m_sb
.sb_agcount
; agno
++) {
1166 for (agbno
= 0, p
= dbmap
[agno
];
1167 agbno
< mp
->m_sb
.sb_agblocks
;
1169 if ((1 << *p
) & tmask
)
1174 dbprintf(_("blocktrash: no matching blocks\n"));
1177 for (i
= 0; i
< count
; i
++) {
1178 randb
= (xfs_rfsblock_t
)((((int64_t)random() << 32) |
1179 random()) % blocks
);
1180 for (bi
= 0, agno
= 0, done
= 0;
1181 !done
&& agno
< mp
->m_sb
.sb_agcount
;
1183 for (agbno
= 0, p
= dbmap
[agno
];
1184 agbno
< mp
->m_sb
.sb_agblocks
;
1186 if (!((1 << *p
) & tmask
))
1192 XFS_AGB_TO_DADDR(mp
, agno
, agbno
),
1193 blkbb
, DB_RING_IGN
, NULL
);
1194 blocktrash_b(bit_offset
, (dbm_t
)*p
,
1195 &lentab
[random() % lentablen
], mode
);
1212 xfs_agblock_t agbno
;
1213 xfs_agnumber_t agno
;
1223 dbprintf(_("must run blockget first\n"));
1228 fsb
= XFS_DADDR_TO_FSB(mp
, iocur_top
->off
>> BBSHIFT
);
1229 agno
= XFS_FSB_TO_AGNO(mp
, fsb
);
1230 end
= agbno
= XFS_FSB_TO_AGBNO(mp
, fsb
);
1231 while ((c
= getopt(argc
, argv
, "c:n")) != EOF
) {
1234 count
= (int)strtol(optarg
, &p
, 0);
1235 end
= agbno
+ count
- 1;
1236 if (*p
!= '\0' || count
<= 0 ||
1237 end
>= mp
->m_sb
.sb_agblocks
) {
1238 dbprintf(_("bad blockuse count %s\n"), optarg
);
1244 dbprintf(_("must run blockget -n first\n"));
1250 dbprintf(_("bad option for blockuse command\n"));
1254 while (agbno
<= end
) {
1255 p
= &dbmap
[agno
][agbno
];
1256 i
= inomap
[agno
][agbno
];
1257 dbprintf(_("block %llu (%u/%u) type %s"),
1258 (xfs_fsblock_t
)XFS_AGB_TO_FSB(mp
, agno
, agbno
),
1259 agno
, agbno
, typename
[(dbm_t
)*p
]);
1261 dbprintf(_(" inode %lld"), i
->ino
);
1262 if (shownames
&& (p
= inode_name(i
->ino
, NULL
))) {
1279 for (i
= 0; i
< blist_size
; i
++) {
1280 if (blist
[i
] == bno
)
1288 xfs_agnumber_t agno
,
1289 xfs_agblock_t agbno
,
1298 for (i
= 0, p
= &dbmap
[agno
][agbno
]; i
< len
; i
++, p
++) {
1300 if (ignore_reflink
&& (d
== DBM_UNKNOWN
|| d
== DBM_DATA
||
1303 if ((dbm_t
)*p
!= type
) {
1304 if (!sflag
|| CHECK_BLISTA(agno
, agbno
+ i
)) {
1305 dbprintf(_("block %u/%u expected type %s got "
1307 agno
, agbno
+ i
, typename
[type
],
1308 typename
[(dbm_t
)*p
]);
1318 add_command(&blockfree_cmd
);
1319 add_command(&blockget_cmd
);
1321 add_command(&blocktrash_cmd
);
1322 add_command(&blockuse_cmd
);
1323 add_command(&ncheck_cmd
);
1328 xfs_agnumber_t agno
,
1329 xfs_agblock_t agbno
,
1337 if (!check_range(agno
, agbno
, len
)) {
1338 dbprintf(_("blocks %u/%u..%u claimed by inode %lld\n"),
1339 agno
, agbno
, agbno
+ len
- 1, c_ino
);
1342 for (i
= 0, rval
= 1, idp
= &inomap
[agno
][agbno
]; i
< len
; i
++, idp
++) {
1343 if (*idp
&& !(*idp
)->isreflink
) {
1344 if (!sflag
|| (*idp
)->ilist
||
1345 CHECK_BLISTA(agno
, agbno
+ i
))
1346 dbprintf(_("block %u/%u claimed by inode %lld, "
1347 "previous inum %lld\n"),
1348 agno
, agbno
+ i
, c_ino
, (*idp
)->ino
);
1358 xfs_agnumber_t agno
)
1366 for (idx
= 0; idx
< inodata_hash_size
; ht
++, idx
++) {
1369 if (ep
->link_set
!= ep
->link_add
|| ep
->link_set
== 0) {
1370 path
= inode_name(ep
->ino
, NULL
);
1371 if (!path
&& ep
->link_add
)
1372 path
= xstrdup("?");
1373 if (!sflag
|| ep
->ilist
) {
1375 dbprintf(_("link count mismatch "
1376 "for inode %lld (name "
1382 else if (ep
->link_set
)
1383 dbprintf(_("disconnected inode "
1384 "%lld, nlink %d\n"),
1385 ep
->ino
, ep
->link_set
);
1387 dbprintf(_("allocated inode %lld "
1388 "has 0 link count\n"),
1394 } else if (verbose
|| ep
->ilist
) {
1395 path
= inode_name(ep
->ino
, NULL
);
1397 dbprintf(_("inode %lld name %s\n"),
1410 xfs_agnumber_t agno
,
1411 xfs_agblock_t agbno
,
1415 xfs_agblock_t low
= 0;
1416 xfs_agblock_t high
= 0;
1417 int valid_range
= 0;
1420 if (agno
>= mp
->m_sb
.sb_agcount
||
1421 agbno
+ len
- 1 >= mp
->m_sb
.sb_agblocks
) {
1422 for (i
= 0; i
< len
; i
++) {
1423 cur
= !sflag
|| CHECK_BLISTA(agno
, agbno
+ i
) ? 1 : 0;
1424 if (cur
== 1 && prev
== 0) {
1425 low
= high
= agbno
+ i
;
1427 } else if (cur
== 0 && prev
== 0) {
1429 } else if (cur
== 0 && prev
== 1) {
1431 dbprintf(_("block %u/%u out of range\n"),
1434 dbprintf(_("blocks %u/%u..%u "
1439 } else if (cur
== 1 && prev
== 1) {
1446 dbprintf(_("block %u/%u out of range\n"),
1449 dbprintf(_("blocks %u/%u..%u "
1469 for (i
= 0, p
= &dbmap
[mp
->m_sb
.sb_agcount
][bno
]; i
< len
; i
++, p
++) {
1470 if ((dbm_t
)*p
!= type
) {
1471 if (!sflag
|| CHECK_BLIST(bno
+ i
))
1472 dbprintf(_("rtblock %llu expected type %s got "
1474 bno
+ i
, typename
[type
],
1475 typename
[(dbm_t
)*p
]);
1491 if (!check_rrange(bno
, len
)) {
1492 dbprintf(_("rtblocks %llu..%llu claimed by inode %lld\n"),
1493 bno
, bno
+ len
- 1, c_ino
);
1496 for (i
= 0, rval
= 1, idp
= &inomap
[mp
->m_sb
.sb_agcount
][bno
];
1500 if (!sflag
|| (*idp
)->ilist
|| CHECK_BLIST(bno
+ i
))
1501 dbprintf(_("rtblock %llu claimed by inode %lld, "
1502 "previous inum %lld\n"),
1503 bno
+ i
, c_ino
, (*idp
)->ino
);
1516 id
= find_inode(mp
->m_sb
.sb_rootino
, 0);
1519 dbprintf(_("root inode %lld is missing\n"),
1520 mp
->m_sb
.sb_rootino
);
1522 } else if (!id
->isdir
) {
1523 if (!sflag
|| id
->ilist
)
1524 dbprintf(_("root inode %lld is not a directory\n"),
1525 mp
->m_sb
.sb_rootino
);
1537 if (bno
+ len
- 1 >= mp
->m_sb
.sb_rblocks
) {
1538 for (i
= 0; i
< len
; i
++) {
1539 if (!sflag
|| CHECK_BLIST(bno
+ i
))
1540 dbprintf(_("rtblock %llu out of range\n"),
1550 * We don't check the accuracy of reference counts -- all we do is ensure
1551 * that a data block never crosses with non-data blocks. repair can check
1552 * those kinds of things.
1554 * So with that in mind, if we're setting a block to be data or rldata,
1555 * don't complain so long as the block is currently unknown, data, or rldata.
1556 * Don't let blocks downgrade from rldata -> data.
1562 if (!xfs_sb_version_hasreflink(&mp
->m_sb
))
1564 if (type2
== DBM_DATA
|| type2
== DBM_RLDATA
)
1571 xfs_agnumber_t agno
,
1572 xfs_agblock_t agbno
,
1576 xfs_agnumber_t c_agno
,
1577 xfs_agblock_t c_agbno
)
1583 if (!check_range(agno
, agbno
, len
)) {
1584 dbprintf(_("blocks %u/%u..%u claimed by block %u/%u\n"), agno
,
1585 agbno
, agbno
+ len
- 1, c_agno
, c_agbno
);
1588 check_dbmap(agno
, agbno
, len
, type1
, is_reflink(type2
));
1589 mayprint
= verbose
| blist_size
;
1590 for (i
= 0, p
= &dbmap
[agno
][agbno
]; i
< len
; i
++, p
++) {
1591 if (*p
== DBM_RLDATA
&& type2
== DBM_DATA
)
1593 else if (*p
== DBM_DATA
&& type2
== DBM_DATA
)
1594 *p
= (char)DBM_RLDATA
;
1597 if (mayprint
&& (verbose
|| CHECK_BLISTA(agno
, agbno
+ i
)))
1598 dbprintf(_("setting block %u/%u to %s\n"), agno
, agbno
+ i
,
1614 if (!check_rrange(bno
, len
))
1616 check_rdbmap(bno
, len
, type1
);
1617 mayprint
= verbose
| blist_size
;
1618 for (i
= 0, p
= &dbmap
[mp
->m_sb
.sb_agcount
][bno
]; i
< len
; i
++, p
++) {
1620 if (mayprint
&& (verbose
|| CHECK_BLIST(bno
+ i
)))
1621 dbprintf(_("setting rtblock %llu to %s\n"),
1622 bno
+ i
, typename
[type2
]);
1636 for (log
= 0; log
< mp
->m_rsumlevels
; log
++) {
1638 bno
< mp
->m_sb
.sb_rbmblocks
;
1639 bno
++, csp
++, fsp
++) {
1642 dbprintf(_("rt summary mismatch, size %d "
1643 "block %llu, file: %d, "
1645 log
, bno
, *fsp
, *csp
);
1654 xfs_agnumber_t agno
,
1655 xfs_agblock_t agbno
,
1662 if (!check_range(agno
, agbno
, len
))
1664 for (i
= 0, p
= &dbmap
[agno
][agbno
]; i
< len
; i
++, p
++) {
1665 if ((1 << *p
) & typemask
) {
1666 if (!sflag
|| CHECK_BLISTA(agno
, agbno
+ i
))
1667 dbprintf(_("block %u/%u type %s not expected\n"),
1668 agno
, agbno
+ i
, typename
[(dbm_t
)*p
]);
1683 if (!check_rrange(bno
, len
))
1685 for (i
= 0, p
= &dbmap
[mp
->m_sb
.sb_agcount
][bno
]; i
< len
; i
++, p
++) {
1686 if ((1 << *p
) & typemask
) {
1687 if (!sflag
|| CHECK_BLIST(bno
+ i
))
1688 dbprintf(_("rtblock %llu type %s not expected\n"),
1689 bno
+ i
, typename
[(dbm_t
)*p
]);
1698 xfs_dir2_dataptr_t addr
)
1703 i
= DIR_HASH_FUNC(hash
, addr
);
1704 p
= malloc(sizeof(*p
));
1705 p
->next
= dirhash
[i
];
1720 for (i
= 0; i
< DIR_HASH_SIZE
; i
++) {
1721 for (p
= dirhash
[i
]; p
; p
= p
->next
) {
1724 if (!sflag
|| id
->ilist
|| v
)
1725 dbprintf(_("dir ino %lld missing leaf entry for "
1727 id
->ino
, p
->hashval
, p
->address
);
1740 for (i
= 0; i
< DIR_HASH_SIZE
; i
++) {
1741 for (p
= dirhash
[i
]; p
; p
= n
) {
1753 dirhash
= calloc(DIR_HASH_SIZE
, sizeof(*dirhash
));
1759 xfs_dir2_dataptr_t addr
)
1764 i
= DIR_HASH_FUNC(hash
, addr
);
1765 for (p
= dirhash
[i
]; p
; p
= p
->next
) {
1766 if (p
->hashval
== hash
&& p
->address
== addr
) {
1782 xfs_agnumber_t agno
;
1787 agno
= XFS_INO_TO_AGNO(mp
, ino
);
1788 agino
= XFS_INO_TO_AGINO(mp
, ino
);
1789 if (agno
>= mp
->m_sb
.sb_agcount
||
1790 XFS_AGINO_TO_INO(mp
, agno
, agino
) != ino
)
1792 htab
= inodata
[agno
];
1793 ih
= agino
% inodata_hash_size
;
1796 if (ent
->ino
== ino
)
1802 ent
= xcalloc(1, sizeof(*ent
));
1804 ent
->next
= htab
[ih
];
1811 xfs_agnumber_t agno
)
1819 for (i
= 0; i
< inodata_hash_size
; i
++) {
1843 if (mp
->m_sb
.sb_magicnum
!= XFS_SB_MAGIC
) {
1844 dbprintf(_("bad superblock magic number %x, giving up\n"),
1845 mp
->m_sb
.sb_magicnum
);
1851 rt
= mp
->m_sb
.sb_rextents
!= 0;
1852 dbmap
= xmalloc((mp
->m_sb
.sb_agcount
+ rt
) * sizeof(*dbmap
));
1853 inomap
= xmalloc((mp
->m_sb
.sb_agcount
+ rt
) * sizeof(*inomap
));
1854 inodata
= xmalloc(mp
->m_sb
.sb_agcount
* sizeof(*inodata
));
1856 (int)max(min(mp
->m_sb
.sb_icount
/
1857 (INODATA_AVG_HASH_LENGTH
* mp
->m_sb
.sb_agcount
),
1858 MAX_INODATA_HASH_SIZE
),
1859 MIN_INODATA_HASH_SIZE
);
1860 for (c
= 0; c
< mp
->m_sb
.sb_agcount
; c
++) {
1861 dbmap
[c
] = xcalloc(mp
->m_sb
.sb_agblocks
, sizeof(**dbmap
));
1862 inomap
[c
] = xcalloc(mp
->m_sb
.sb_agblocks
, sizeof(**inomap
));
1863 inodata
[c
] = xcalloc(inodata_hash_size
, sizeof(**inodata
));
1866 dbmap
[c
] = xcalloc(mp
->m_sb
.sb_rblocks
, sizeof(**dbmap
));
1867 inomap
[c
] = xcalloc(mp
->m_sb
.sb_rblocks
, sizeof(**inomap
));
1868 sumfile
= xcalloc(mp
->m_rsumsize
, 1);
1869 sumcompute
= xcalloc(mp
->m_rsumsize
, 1);
1871 nflag
= sflag
= tflag
= verbose
= optind
= 0;
1872 while ((c
= getopt(argc
, argv
, "b:i:npstv")) != EOF
) {
1875 bno
= strtoll(optarg
, NULL
, 10);
1879 ino
= strtoll(optarg
, NULL
, 10);
1898 dbprintf(_("bad option for blockget command\n"));
1902 error
= sbver_err
= serious_error
= 0;
1903 fdblocks
= frextents
= icount
= ifree
= 0;
1904 sbversion
= XFS_SB_VERSION_4
;
1906 * Note that inoalignmt == 0 is valid when fsb size is large enough for
1907 * at least one full inode record per block. Check this case explicitly.
1909 if (mp
->m_sb
.sb_inoalignmt
||
1910 (xfs_sb_version_hasalign(&mp
->m_sb
) &&
1911 mp
->m_sb
.sb_inopblock
>= XFS_INODES_PER_CHUNK
))
1912 sbversion
|= XFS_SB_VERSION_ALIGNBIT
;
1913 if ((mp
->m_sb
.sb_uquotino
&& mp
->m_sb
.sb_uquotino
!= NULLFSINO
) ||
1914 (mp
->m_sb
.sb_gquotino
&& mp
->m_sb
.sb_gquotino
!= NULLFSINO
) ||
1915 (mp
->m_sb
.sb_pquotino
&& mp
->m_sb
.sb_pquotino
!= NULLFSINO
))
1916 sbversion
|= XFS_SB_VERSION_QUOTABIT
;
1930 id
= find_inode(ino
, 0);
1935 if (id
->name
== NULL
)
1937 path
= xstrdup(id
->name
);
1938 while (id
->parent
) {
1940 if (id
->name
== NULL
)
1942 npath
= prepend_path(path
, id
->name
);
1954 xfs_agnumber_t agno
;
1967 if (!inodata
|| !nflag
) {
1968 dbprintf(_("must run blockget -n first\n"));
1971 security
= optind
= ilist_size
= 0;
1973 while ((c
= getopt(argc
, argv
, "i:s")) != EOF
) {
1976 ino
= strtoll(optarg
, NULL
, 10);
1977 ilist
= xrealloc(ilist
, (ilist_size
+ 1) *
1979 ilist
[ilist_size
++] = ino
;
1985 dbprintf(_("bad option -%c for ncheck command\n"), c
);
1991 for (ilp
= ilist
; ilp
< &ilist
[ilist_size
]; ilp
++) {
1993 if ((p
= inode_name(ino
, &hp
))) {
1994 dbprintf("%11llu %s", ino
, p
);
2004 for (agno
= 0; agno
< mp
->m_sb
.sb_agcount
; agno
++) {
2006 for (i
= 0; i
< inodata_hash_size
; i
++) {
2008 for (hp
= ht
[i
]; hp
; hp
= hp
->next
) {
2009 ino
= XFS_AGINO_TO_INO(mp
, agno
, hp
->ino
);
2010 p
= inode_name(ino
, &id
);
2013 if (!security
|| id
->security
) {
2014 dbprintf("%11llu %s", ino
, p
);
2034 len
= (int)(strlen(oldpath
) + strlen(parent
) + 2);
2035 path
= xmalloc(len
);
2036 snprintf(path
, len
, "%s/%s", parent
, oldpath
);
2041 process_block_dir_v2(
2055 nex
= blkmap_getn(blkmap
, 0, mp
->m_dir_geo
->fsbcount
, &bmp
);
2056 v
= id
->ilist
|| verbose
;
2059 dbprintf(_("block 0 for directory inode %lld is "
2067 make_bbmap(&bbmap
, nex
, bmp
);
2068 set_cur(&typtab
[TYP_DIR2
], XFS_FSB_TO_DADDR(mp
, bmp
->startblock
),
2069 mp
->m_dir_geo
->fsbcount
* blkbb
, DB_RING_IGN
, nex
> 1 ? &bbmap
: NULL
);
2070 for (x
= 0; !v
&& x
< nex
; x
++) {
2071 for (b
= bmp
[x
].startblock
;
2072 !v
&& b
< bmp
[x
].startblock
+ bmp
[x
].blockcount
;
2077 if (iocur_top
->data
== NULL
) {
2078 if (!sflag
|| id
->ilist
|| v
)
2079 dbprintf(_("can't read block 0 for directory inode "
2087 parent
= process_data_dir_v2(dot
, dotdot
, id
, v
, mp
->m_dir_geo
->datablk
,
2089 dir_hash_check(id
, v
);
2096 process_bmbt_reclist(
2101 xfs_rfsblock_t
*tot
,
2104 xfs_agblock_t agbno
;
2105 xfs_agnumber_t agno
;
2111 xfs_agblock_t iagbno
;
2112 xfs_agnumber_t iagno
;
2119 v
= verbose
|| id
->ilist
;
2120 iagno
= XFS_INO_TO_AGNO(mp
, id
->ino
);
2121 iagbno
= XFS_INO_TO_AGBNO(mp
, id
->ino
);
2122 for (i
= 0; i
< numrecs
; i
++, rp
++) {
2123 convert_extent(rp
, &o
, &s
, &c
, &f
);
2125 dbprintf(_("inode %lld extent [%lld,%lld,%lld,%d]\n"),
2126 id
->ino
, o
, s
, c
, f
);
2127 if (!sflag
&& i
> 0 && op
+ cp
> o
)
2128 dbprintf(_("bmap rec out of order, inode %lld entry %d\n"),
2132 if (type
== DBM_RTDATA
) {
2133 if (!sflag
&& s
>= mp
->m_sb
.sb_rblocks
) {
2134 dbprintf(_("inode %lld bad rt block number %lld, "
2139 } else if (!sflag
) {
2140 agno
= XFS_FSB_TO_AGNO(mp
, s
);
2141 agbno
= XFS_FSB_TO_AGBNO(mp
, s
);
2142 if (agno
>= mp
->m_sb
.sb_agcount
||
2143 agbno
>= mp
->m_sb
.sb_agblocks
) {
2144 dbprintf(_("inode %lld bad block number %lld "
2145 "[%d,%d], offset %lld\n"),
2146 id
->ino
, s
, agno
, agbno
, o
);
2149 if (agbno
+ c
- 1 >= mp
->m_sb
.sb_agblocks
) {
2150 dbprintf(_("inode %lld bad block number %lld "
2151 "[%d,%d], offset %lld\n"),
2152 id
->ino
, s
+ c
- 1, agno
,
2153 agbno
+ (xfs_agblock_t
)c
- 1, o
);
2157 if (blkmapp
&& *blkmapp
)
2158 blkmap_set_ext(blkmapp
, (xfs_fileoff_t
)o
,
2159 (xfs_fsblock_t
)s
, (xfs_extlen_t
)c
);
2160 if (type
== DBM_RTDATA
) {
2161 set_rdbmap((xfs_fsblock_t
)s
, (xfs_extlen_t
)c
,
2163 set_rinomap((xfs_fsblock_t
)s
, (xfs_extlen_t
)c
, id
);
2164 for (b
= (xfs_fsblock_t
)s
;
2165 blist_size
&& b
< s
+ c
;
2168 dbprintf(_("inode %lld block %lld at "
2170 id
->ino
, (xfs_fsblock_t
)b
, o
);
2173 agno
= XFS_FSB_TO_AGNO(mp
, (xfs_fsblock_t
)s
);
2174 agbno
= XFS_FSB_TO_AGBNO(mp
, (xfs_fsblock_t
)s
);
2175 set_dbmap(agno
, agbno
, (xfs_extlen_t
)c
, type
, iagno
,
2177 set_inomap(agno
, agbno
, (xfs_extlen_t
)c
, id
);
2178 for (b
= (xfs_fsblock_t
)s
;
2179 blist_size
&& b
< s
+ c
;
2180 b
++, o
++, agbno
++) {
2182 dbprintf(_("inode %lld block %lld at "
2184 id
->ino
, (xfs_fsblock_t
)b
, o
);
2196 xfs_rfsblock_t
*totd
,
2197 xfs_rfsblock_t
*toti
,
2202 xfs_bmdr_block_t
*dib
;
2206 dib
= (xfs_bmdr_block_t
*)XFS_DFORK_PTR(dip
, whichfork
);
2207 if (be16_to_cpu(dib
->bb_level
) >= XFS_BM_MAXLEVELS(mp
, whichfork
)) {
2208 if (!sflag
|| id
->ilist
)
2209 dbprintf(_("level for ino %lld %s fork bmap root too "
2212 whichfork
== XFS_DATA_FORK
? _("data") : _("attr"),
2213 be16_to_cpu(dib
->bb_level
));
2217 if (be16_to_cpu(dib
->bb_numrecs
) >
2218 libxfs_bmdr_maxrecs(XFS_DFORK_SIZE(dip
, mp
, whichfork
),
2219 be16_to_cpu(dib
->bb_level
) == 0)) {
2220 if (!sflag
|| id
->ilist
)
2221 dbprintf(_("numrecs for ino %lld %s fork bmap root too "
2224 whichfork
== XFS_DATA_FORK
? _("data") : _("attr"),
2225 be16_to_cpu(dib
->bb_numrecs
));
2229 if (be16_to_cpu(dib
->bb_level
) == 0) {
2230 xfs_bmbt_rec_t
*rp
= XFS_BMDR_REC_ADDR(dib
, 1);
2231 process_bmbt_reclist(rp
, be16_to_cpu(dib
->bb_numrecs
), type
,
2233 *nex
+= be16_to_cpu(dib
->bb_numrecs
);
2236 pp
= XFS_BMDR_PTR_ADDR(dib
, 1, libxfs_bmdr_maxrecs(
2237 XFS_DFORK_SIZE(dip
, mp
, whichfork
), 0));
2238 for (i
= 0; i
< be16_to_cpu(dib
->bb_numrecs
); i
++)
2239 scan_lbtree(get_unaligned_be64(&pp
[i
]),
2240 be16_to_cpu(dib
->bb_level
),
2241 scanfunc_bmap
, type
, id
, totd
, toti
,
2243 whichfork
== XFS_DATA_FORK
?
2244 TYP_BMAPBTD
: TYP_BMAPBTA
);
2246 if (*nex
<= XFS_DFORK_SIZE(dip
, mp
, whichfork
) / sizeof(xfs_bmbt_rec_t
)) {
2247 if (!sflag
|| id
->ilist
)
2248 dbprintf(_("extent count for ino %lld %s fork too low "
2249 "(%d) for file format\n"),
2251 whichfork
== XFS_DATA_FORK
? _("data") : _("attr"),
2258 process_data_dir_v2(
2264 freetab_t
**freetabp
)
2266 xfs_dir2_dataptr_t addr
;
2267 xfs_dir2_data_free_t
*bf
;
2269 struct xfs_dir2_data_hdr
*block
;
2270 xfs_dir2_block_tail_t
*btp
= NULL
;
2273 struct xfs_dir2_data_hdr
*data
;
2275 xfs_dir2_data_entry_t
*dep
;
2276 xfs_dir2_data_free_t
*dfp
;
2277 xfs_dir2_data_unused_t
*dup
;
2284 xfs_dir2_leaf_entry_t
*lep
= NULL
;
2286 xfs_ino_t parent
= 0;
2291 struct xfs_name xname
;
2293 data
= iocur_top
->data
;
2294 block
= iocur_top
->data
;
2295 if (be32_to_cpu(block
->magic
) != XFS_DIR2_BLOCK_MAGIC
&&
2296 be32_to_cpu(data
->magic
) != XFS_DIR2_DATA_MAGIC
&&
2297 be32_to_cpu(block
->magic
) != XFS_DIR3_BLOCK_MAGIC
&&
2298 be32_to_cpu(data
->magic
) != XFS_DIR3_DATA_MAGIC
) {
2300 dbprintf(_("bad directory data magic # %#x for dir ino "
2302 be32_to_cpu(data
->magic
), id
->ino
, dabno
);
2306 db
= xfs_dir2_da_to_db(mp
->m_dir_geo
, dabno
);
2307 bf
= M_DIROPS(mp
)->data_bestfree_p(data
);
2308 ptr
= (char *)M_DIROPS(mp
)->data_unused_p(data
);
2309 if (be32_to_cpu(block
->magic
) == XFS_DIR2_BLOCK_MAGIC
||
2310 be32_to_cpu(block
->magic
) == XFS_DIR3_BLOCK_MAGIC
) {
2311 btp
= xfs_dir2_block_tail_p(mp
->m_dir_geo
, block
);
2312 lep
= xfs_dir2_block_leaf_p(btp
);
2313 endptr
= (char *)lep
;
2314 if (endptr
<= ptr
|| endptr
> (char *)btp
) {
2315 endptr
= (char *)data
+ mp
->m_dir_geo
->blksize
;
2318 dbprintf(_("bad block directory tail for dir ino "
2324 endptr
= (char *)data
+ mp
->m_dir_geo
->blksize
;
2325 bf_err
= lastfree_err
= tag_err
= 0;
2326 count
= lastfree
= freeseen
= 0;
2327 if (be16_to_cpu(bf
[0].length
) == 0) {
2328 bf_err
+= be16_to_cpu(bf
[0].offset
) != 0;
2331 if (be16_to_cpu(bf
[1].length
) == 0) {
2332 bf_err
+= be16_to_cpu(bf
[1].offset
) != 0;
2335 if (be16_to_cpu(bf
[2].length
) == 0) {
2336 bf_err
+= be16_to_cpu(bf
[2].offset
) != 0;
2339 bf_err
+= be16_to_cpu(bf
[0].length
) < be16_to_cpu(bf
[1].length
);
2340 bf_err
+= be16_to_cpu(bf
[1].length
) < be16_to_cpu(bf
[2].length
);
2342 freetab
= *freetabp
;
2343 if (freetab
->naents
<= db
) {
2344 *freetabp
= freetab
=
2345 realloc(freetab
, FREETAB_SIZE(db
+ 1));
2346 for (i
= freetab
->naents
; i
< db
; i
++)
2347 freetab
->ents
[i
] = NULLDATAOFF
;
2348 freetab
->naents
= db
+ 1;
2350 if (freetab
->nents
< db
+ 1)
2351 freetab
->nents
= db
+ 1;
2352 freetab
->ents
[db
] = be16_to_cpu(bf
[0].length
);
2354 while (ptr
< endptr
) {
2355 dup
= (xfs_dir2_data_unused_t
*)ptr
;
2356 if (be16_to_cpu(dup
->freetag
) == XFS_DIR2_DATA_FREE_TAG
) {
2357 lastfree_err
+= lastfree
!= 0;
2358 tagp
= xfs_dir2_data_unused_tag_p(dup
);
2359 if ((be16_to_cpu(dup
->length
) & (XFS_DIR2_DATA_ALIGN
- 1)) ||
2360 be16_to_cpu(dup
->length
) == 0 ||
2361 (char *)tagp
>= endptr
) {
2363 dbprintf(_("dir %lld block %d bad free "
2371 tag_err
+= be16_to_cpu(*tagp
) != (char *)dup
- (char *)data
;
2372 dfp
= process_data_dir_v2_freefind(data
, dup
);
2374 i
= (int)(dfp
- bf
);
2375 bf_err
+= (freeseen
& (1 << i
)) != 0;
2378 bf_err
+= be16_to_cpu(dup
->length
) >
2379 be16_to_cpu(bf
[2].length
);
2380 ptr
+= be16_to_cpu(dup
->length
);
2384 dep
= (xfs_dir2_data_entry_t
*)dup
;
2385 if (dep
->namelen
== 0) {
2387 dbprintf(_("dir %lld block %d zero length entry "
2390 (int)((char *)dep
- (char *)data
));
2393 tagp
= M_DIROPS(mp
)->data_entry_tag_p(dep
);
2394 if ((char *)tagp
>= endptr
) {
2396 dbprintf(_("dir %lld block %d bad entry at %d\n"),
2398 (int)((char *)dep
- (char *)data
));
2402 tag_err
+= be16_to_cpu(*tagp
) != (char *)dep
- (char *)data
;
2403 addr
= xfs_dir2_db_off_to_dataptr(mp
->m_dir_geo
, db
,
2404 (char *)dep
- (char *)data
);
2405 xname
.name
= dep
->name
;
2406 xname
.len
= dep
->namelen
;
2407 dir_hash_add(mp
->m_dirnameops
->hashname(&xname
), addr
);
2408 ptr
+= M_DIROPS(mp
)->data_entsize(dep
->namelen
);
2411 lino
= be64_to_cpu(dep
->inumber
);
2412 cid
= find_inode(lino
, 1);
2414 dbprintf(_("dir %lld block %d entry %*.*s %lld\n"),
2415 id
->ino
, dabno
, dep
->namelen
, dep
->namelen
,
2421 dbprintf(_("dir %lld block %d entry %*.*s bad "
2422 "inode number %lld\n"),
2423 id
->ino
, dabno
, dep
->namelen
,
2424 dep
->namelen
, dep
->name
, lino
);
2427 if (dep
->namelen
== 2 && dep
->name
[0] == '.' &&
2428 dep
->name
[1] == '.') {
2431 dbprintf(_("multiple .. entries in dir "
2432 "%lld (%lld, %lld)\n"),
2433 id
->ino
, parent
, lino
);
2436 parent
= cid
? lino
: NULLFSINO
;
2438 } else if (dep
->namelen
!= 1 || dep
->name
[0] != '.') {
2442 addname_inode(cid
, (char *)dep
->name
,
2446 if (lino
!= id
->ino
) {
2448 dbprintf(_("dir %lld entry . inode "
2449 "number mismatch (%lld)\n"),
2456 if (be32_to_cpu(data
->magic
) == XFS_DIR2_BLOCK_MAGIC
||
2457 be32_to_cpu(data
->magic
) == XFS_DIR3_BLOCK_MAGIC
) {
2458 endptr
= (char *)data
+ mp
->m_dir_geo
->blksize
;
2459 for (i
= stale
= 0; lep
&& i
< be32_to_cpu(btp
->count
); i
++) {
2460 if ((char *)&lep
[i
] >= endptr
) {
2462 dbprintf(_("dir %lld block %d bad count "
2463 "%u\n"), id
->ino
, dabno
,
2464 be32_to_cpu(btp
->count
));
2468 if (be32_to_cpu(lep
[i
].address
) == XFS_DIR2_NULL_DATAPTR
)
2470 else if (dir_hash_see(be32_to_cpu(lep
[i
].hashval
),
2471 be32_to_cpu(lep
[i
].address
))) {
2473 dbprintf(_("dir %lld block %d extra leaf "
2476 be32_to_cpu(lep
[i
].hashval
),
2477 be32_to_cpu(lep
[i
].address
));
2482 bf_err
+= freeseen
!= 7;
2485 dbprintf(_("dir %lld block %d bad bestfree data\n"),
2489 if ((be32_to_cpu(data
->magic
) == XFS_DIR2_BLOCK_MAGIC
||
2490 be32_to_cpu(data
->magic
) == XFS_DIR3_BLOCK_MAGIC
) &&
2491 count
!= be32_to_cpu(btp
->count
) - be32_to_cpu(btp
->stale
)) {
2493 dbprintf(_("dir %lld block %d bad block tail count %d "
2495 id
->ino
, dabno
, be32_to_cpu(btp
->count
),
2496 be32_to_cpu(btp
->stale
));
2499 if ((be32_to_cpu(data
->magic
) == XFS_DIR2_BLOCK_MAGIC
||
2500 be32_to_cpu(data
->magic
) == XFS_DIR2_BLOCK_MAGIC
) &&
2501 stale
!= be32_to_cpu(btp
->stale
)) {
2503 dbprintf(_("dir %lld block %d bad stale tail count %d\n"),
2504 id
->ino
, dabno
, be32_to_cpu(btp
->stale
));
2509 dbprintf(_("dir %lld block %d consecutive free entries\n"),
2515 dbprintf(_("dir %lld block %d entry/unused tag "
2523 static xfs_dir2_data_free_t
*
2524 process_data_dir_v2_freefind(
2525 struct xfs_dir2_data_hdr
*data
,
2526 xfs_dir2_data_unused_t
*dup
)
2528 struct xfs_dir2_data_free
*bf
;
2529 struct xfs_dir2_data_free
*dfp
;
2530 xfs_dir2_data_aoff_t off
;
2532 off
= (xfs_dir2_data_aoff_t
)((char *)dup
- (char *)data
);
2533 bf
= M_DIROPS(mp
)->data_bestfree_p(data
);
2534 if (be16_to_cpu(dup
->length
) <
2535 be16_to_cpu(bf
[XFS_DIR2_DATA_FD_COUNT
- 1].length
))
2537 for (dfp
= bf
; dfp
< &bf
[XFS_DIR2_DATA_FD_COUNT
]; dfp
++) {
2538 if (be16_to_cpu(dfp
->offset
) == 0)
2540 if (be16_to_cpu(dfp
->offset
) == off
)
2558 if (process_dir_v2(dip
, blkmap
, &dot
, &dotdot
, id
, &parent
))
2561 bno
= XFS_INO_TO_FSB(mp
, id
->ino
);
2563 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
2564 dbprintf(_("no . entry for directory %lld\n"), id
->ino
);
2568 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
2569 dbprintf(_("no .. entry for directory %lld\n"), id
->ino
);
2571 } else if (parent
== id
->ino
&& id
->ino
!= mp
->m_sb
.sb_rootino
) {
2572 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
2573 dbprintf(_(". and .. same for non-root directory %lld\n"),
2576 } else if (id
->ino
== mp
->m_sb
.sb_rootino
&& id
->ino
!= parent
) {
2577 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
2578 dbprintf(_("root directory %lld has .. %lld\n"), id
->ino
,
2581 } else if (parent
!= NULLFSINO
&& id
->ino
!= parent
)
2582 addparent_inode(id
, parent
);
2594 xfs_fileoff_t last
= 0;
2595 xfs_fsize_t size
= be64_to_cpu(dip
->di_size
);
2598 last
= blkmap_last_off(blkmap
);
2599 if (size
<= XFS_DFORK_DSIZE(dip
, mp
) &&
2600 dip
->di_format
== XFS_DINODE_FMT_LOCAL
)
2601 *parent
= process_sf_dir_v2(dip
, dot
, dotdot
, id
);
2602 else if (last
== mp
->m_dir_geo
->fsbcount
&&
2603 (dip
->di_format
== XFS_DINODE_FMT_EXTENTS
||
2604 dip
->di_format
== XFS_DINODE_FMT_BTREE
))
2605 *parent
= process_block_dir_v2(blkmap
, dot
, dotdot
, id
);
2606 else if (last
>= mp
->m_dir_geo
->leafblk
+ mp
->m_dir_geo
->fsbcount
&&
2607 (dip
->di_format
== XFS_DINODE_FMT_EXTENTS
||
2608 dip
->di_format
== XFS_DINODE_FMT_BTREE
))
2609 *parent
= process_leaf_node_dir_v2(blkmap
, dot
, dotdot
, id
, size
);
2611 dbprintf(_("bad size (%lld) or format (%d) for directory inode "
2613 size
, dip
->di_format
, id
->ino
);
2626 xfs_rfsblock_t
*totd
,
2627 xfs_rfsblock_t
*toti
,
2634 rp
= (xfs_bmbt_rec_t
*)XFS_DFORK_PTR(dip
, whichfork
);
2635 *nex
= XFS_DFORK_NEXTENTS(dip
, whichfork
);
2636 if (*nex
< 0 || *nex
> XFS_DFORK_SIZE(dip
, mp
, whichfork
) /
2637 sizeof(xfs_bmbt_rec_t
)) {
2638 if (!sflag
|| id
->ilist
)
2639 dbprintf(_("bad number of extents %d for inode %lld\n"),
2644 process_bmbt_reclist(rp
, *nex
, type
, id
, totd
, blkmapp
);
2655 xfs_fsblock_t bno
= 0;
2656 struct xfs_inode xino
;
2657 inodata_t
*id
= NULL
;
2659 xfs_extnum_t nextents
= 0;
2661 xfs_rfsblock_t totblocks
;
2662 xfs_rfsblock_t totdblocks
= 0;
2663 xfs_rfsblock_t totiblocks
= 0;
2665 xfs_extnum_t anextents
= 0;
2666 xfs_rfsblock_t atotdblocks
= 0;
2667 xfs_rfsblock_t atotiblocks
= 0;
2674 static char okfmts
[] = {
2675 0, /* type 0 unused */
2676 1 << XFS_DINODE_FMT_DEV
, /* FIFO */
2677 1 << XFS_DINODE_FMT_DEV
, /* CHR */
2678 0, /* type 3 unused */
2679 (1 << XFS_DINODE_FMT_LOCAL
) |
2680 (1 << XFS_DINODE_FMT_EXTENTS
) |
2681 (1 << XFS_DINODE_FMT_BTREE
), /* DIR */
2682 0, /* type 5 unused */
2683 1 << XFS_DINODE_FMT_DEV
, /* BLK */
2684 0, /* type 7 unused */
2685 (1 << XFS_DINODE_FMT_EXTENTS
) |
2686 (1 << XFS_DINODE_FMT_BTREE
), /* REG */
2687 0, /* type 9 unused */
2688 (1 << XFS_DINODE_FMT_LOCAL
) |
2689 (1 << XFS_DINODE_FMT_EXTENTS
), /* LNK */
2690 0, /* type 11 unused */
2691 1 << XFS_DINODE_FMT_DEV
, /* SOCK */
2692 0, /* type 13 unused */
2693 1 << XFS_DINODE_FMT_UUID
, /* MNT */
2694 0 /* type 15 unused */
2696 static char *fmtnames
[] = {
2697 "dev", "local", "extents", "btree", "uuid"
2700 libxfs_inode_from_disk(&xino
, dip
);
2702 ino
= XFS_AGINO_TO_INO(mp
, be32_to_cpu(agf
->agf_seqno
), agino
);
2704 id
= find_inode(ino
, 1);
2705 bno
= XFS_INO_TO_FSB(mp
, ino
);
2708 v
= (!sflag
|| (id
&& id
->ilist
) || CHECK_BLIST(bno
));
2709 if (dip
->di_magic
!= cpu_to_be16(XFS_DINODE_MAGIC
)) {
2711 dbprintf(_("bad magic number %#x for inode %lld\n"),
2712 be16_to_cpu(dip
->di_magic
), ino
);
2716 if (!libxfs_dinode_good_version(mp
, xino
.i_d
.di_version
)) {
2718 dbprintf(_("bad version number %#x for inode %lld\n"),
2719 xino
.i_d
.di_version
, ino
);
2724 if (xino
.i_d
.di_nblocks
!= 0) {
2726 dbprintf(_("bad nblocks %lld for free inode "
2728 xino
.i_d
.di_nblocks
, ino
);
2731 if (dip
->di_nlink
!= 0) {
2733 dbprintf(_("bad nlink %d for free inode %lld\n"),
2734 be32_to_cpu(dip
->di_nlink
), ino
);
2737 if (dip
->di_mode
!= 0) {
2739 dbprintf(_("bad mode %#o for free inode %lld\n"),
2740 be16_to_cpu(dip
->di_mode
), ino
);
2746 if (be32_to_cpu(dip
->di_next_unlinked
) != NULLAGINO
) {
2748 dbprintf(_("bad next unlinked %#x for inode %lld\n"),
2749 be32_to_cpu(dip
->di_next_unlinked
), ino
);
2753 * di_mode is a 16-bit uint so no need to check the < 0 case
2755 mode
= be16_to_cpu(dip
->di_mode
);
2756 if ((((mode
& S_IFMT
) >> 12) > 15) ||
2757 (!(okfmts
[(mode
& S_IFMT
) >> 12] & (1 << xino
.i_d
.di_format
)))) {
2759 dbprintf(_("bad format %d for inode %lld type %#o\n"),
2760 xino
.i_d
.di_format
, id
->ino
, mode
& S_IFMT
);
2764 if ((unsigned int)XFS_DFORK_ASIZE(dip
, mp
) >=
2765 XFS_LITINO(mp
, xino
.i_d
.di_version
)) {
2767 dbprintf(_("bad fork offset %d for inode %lld\n"),
2768 xino
.i_d
.di_forkoff
, id
->ino
);
2772 if ((unsigned int)xino
.i_d
.di_aformat
> XFS_DINODE_FMT_BTREE
) {
2774 dbprintf(_("bad attribute format %d for inode %lld\n"),
2775 xino
.i_d
.di_aformat
, id
->ino
);
2779 if (verbose
|| (id
&& id
->ilist
) || CHECK_BLIST(bno
))
2780 dbprintf(_("inode %lld mode %#o fmt %s "
2782 "nex %d anex %d nblk %lld sz %lld%s%s%s%s%s%s%s\n"),
2783 id
->ino
, mode
, fmtnames
[(int)xino
.i_d
.di_format
],
2784 fmtnames
[(int)xino
.i_d
.di_aformat
],
2785 xino
.i_d
.di_nextents
,
2786 xino
.i_d
.di_anextents
,
2787 xino
.i_d
.di_nblocks
, xino
.i_d
.di_size
,
2788 xino
.i_d
.di_flags
& XFS_DIFLAG_REALTIME
? " rt" : "",
2789 xino
.i_d
.di_flags
& XFS_DIFLAG_PREALLOC
? " pre" : "",
2790 xino
.i_d
.di_flags
& XFS_DIFLAG_IMMUTABLE
? " imm" : "",
2791 xino
.i_d
.di_flags
& XFS_DIFLAG_APPEND
? " app" : "",
2792 xino
.i_d
.di_flags
& XFS_DIFLAG_SYNC
? " syn" : "",
2793 xino
.i_d
.di_flags
& XFS_DIFLAG_NOATIME
? " noa" : "",
2794 xino
.i_d
.di_flags
& XFS_DIFLAG_NODUMP
? " nod" : "");
2796 switch (mode
& S_IFMT
) {
2799 if (xino
.i_d
.di_format
== XFS_DINODE_FMT_LOCAL
)
2801 blkmap
= blkmap_alloc(xino
.i_d
.di_nextents
);
2804 if (xino
.i_d
.di_flags
& XFS_DIFLAG_REALTIME
)
2806 else if (id
->ino
== mp
->m_sb
.sb_rbmino
) {
2807 type
= DBM_RTBITMAP
;
2808 blkmap
= blkmap_alloc(xino
.i_d
.di_nextents
);
2810 } else if (id
->ino
== mp
->m_sb
.sb_rsumino
) {
2812 blkmap
= blkmap_alloc(xino
.i_d
.di_nextents
);
2815 else if (id
->ino
== mp
->m_sb
.sb_uquotino
||
2816 id
->ino
== mp
->m_sb
.sb_gquotino
||
2817 id
->ino
== mp
->m_sb
.sb_pquotino
) {
2819 blkmap
= blkmap_alloc(xino
.i_d
.di_nextents
);
2824 if (mode
& (S_ISUID
| S_ISGID
))
2836 id
->isreflink
= !!(xino
.i_d
.di_flags2
& XFS_DIFLAG2_REFLINK
);
2837 setlink_inode(id
, VFS_I(&xino
)->i_nlink
, type
== DBM_DIR
, security
);
2839 switch (xino
.i_d
.di_format
) {
2840 case XFS_DINODE_FMT_LOCAL
:
2841 process_lclinode(id
, dip
, type
, &totdblocks
, &totiblocks
,
2842 &nextents
, &blkmap
, XFS_DATA_FORK
);
2844 case XFS_DINODE_FMT_EXTENTS
:
2845 process_exinode(id
, dip
, type
, &totdblocks
, &totiblocks
,
2846 &nextents
, &blkmap
, XFS_DATA_FORK
);
2848 case XFS_DINODE_FMT_BTREE
:
2849 process_btinode(id
, dip
, type
, &totdblocks
, &totiblocks
,
2850 &nextents
, &blkmap
, XFS_DATA_FORK
);
2853 if (XFS_DFORK_Q(dip
)) {
2854 sbversion
|= XFS_SB_VERSION_ATTRBIT
;
2855 switch (xino
.i_d
.di_aformat
) {
2856 case XFS_DINODE_FMT_LOCAL
:
2857 process_lclinode(id
, dip
, DBM_ATTR
, &atotdblocks
,
2858 &atotiblocks
, &anextents
, NULL
, XFS_ATTR_FORK
);
2860 case XFS_DINODE_FMT_EXTENTS
:
2861 process_exinode(id
, dip
, DBM_ATTR
, &atotdblocks
,
2862 &atotiblocks
, &anextents
, NULL
, XFS_ATTR_FORK
);
2864 case XFS_DINODE_FMT_BTREE
:
2865 process_btinode(id
, dip
, DBM_ATTR
, &atotdblocks
,
2866 &atotiblocks
, &anextents
, NULL
, XFS_ATTR_FORK
);
2870 if (qgdo
|| qpdo
|| qudo
) {
2878 bc
= totdblocks
+ totiblocks
+
2879 atotdblocks
+ atotiblocks
;
2883 bc
= totiblocks
+ atotdblocks
+ atotiblocks
;
2891 dqprid
= xfs_get_projid(&xino
.i_d
); /* dquot ID is u32 */
2892 quota_add(&dqprid
, &xino
.i_d
.di_gid
, &xino
.i_d
.di_uid
,
2896 totblocks
= totdblocks
+ totiblocks
+ atotdblocks
+ atotiblocks
;
2897 if (totblocks
!= xino
.i_d
.di_nblocks
) {
2899 dbprintf(_("bad nblocks %lld for inode %lld, counted "
2901 xino
.i_d
.di_nblocks
, id
->ino
, totblocks
);
2904 if (nextents
!= xino
.i_d
.di_nextents
) {
2906 dbprintf(_("bad nextents %d for inode %lld, counted %d\n"),
2907 xino
.i_d
.di_nextents
, id
->ino
, nextents
);
2910 if (anextents
!= xino
.i_d
.di_anextents
) {
2912 dbprintf(_("bad anextents %d for inode %lld, counted "
2914 xino
.i_d
.di_anextents
, id
->ino
, anextents
);
2917 if (type
== DBM_DIR
)
2918 process_dir(dip
, blkmap
, id
);
2919 else if (type
== DBM_RTBITMAP
)
2920 process_rtbitmap(blkmap
);
2921 else if (type
== DBM_RTSUM
)
2922 process_rtsummary(blkmap
);
2924 * If the CHKD flag is not set, this can legitimately contain garbage;
2925 * xfs_repair may have cleared that bit.
2927 else if (type
== DBM_QUOTA
) {
2928 if (id
->ino
== mp
->m_sb
.sb_uquotino
&&
2929 (mp
->m_sb
.sb_qflags
& XFS_UQUOTA_ACCT
) &&
2930 (mp
->m_sb
.sb_qflags
& XFS_UQUOTA_CHKD
))
2931 process_quota(IS_USER_QUOTA
, id
, blkmap
);
2932 else if (id
->ino
== mp
->m_sb
.sb_gquotino
&&
2933 (mp
->m_sb
.sb_qflags
& XFS_GQUOTA_ACCT
) &&
2934 (mp
->m_sb
.sb_qflags
& XFS_GQUOTA_CHKD
))
2935 process_quota(IS_GROUP_QUOTA
, id
, blkmap
);
2936 else if (id
->ino
== mp
->m_sb
.sb_pquotino
&&
2937 (mp
->m_sb
.sb_qflags
& XFS_PQUOTA_ACCT
) &&
2938 (mp
->m_sb
.sb_qflags
& XFS_PQUOTA_CHKD
))
2939 process_quota(IS_PROJECT_QUOTA
, id
, blkmap
);
2942 blkmap_free(blkmap
);
2951 xfs_rfsblock_t
*totd
,
2952 xfs_rfsblock_t
*toti
,
2957 xfs_attr_shortform_t
*asf
;
2960 bno
= XFS_INO_TO_FSB(mp
, id
->ino
);
2961 if (whichfork
== XFS_DATA_FORK
&& be64_to_cpu(dip
->di_size
) >
2962 XFS_DFORK_DSIZE(dip
, mp
)) {
2963 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
2964 dbprintf(_("local inode %lld data is too large (size "
2966 id
->ino
, be64_to_cpu(dip
->di_size
));
2969 else if (whichfork
== XFS_ATTR_FORK
) {
2970 asf
= (xfs_attr_shortform_t
*)XFS_DFORK_APTR(dip
);
2971 if (be16_to_cpu(asf
->hdr
.totsize
) > XFS_DFORK_ASIZE(dip
, mp
)) {
2972 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
2973 dbprintf(_("local inode %lld attr is too large "
2975 id
->ino
, be16_to_cpu(asf
->hdr
.totsize
));
2982 process_leaf_node_dir_v2(
2987 xfs_fsize_t dirsize
)
3003 v2
= verbose
|| id
->ilist
;
3006 freetab
= malloc(FREETAB_SIZE(dirsize
/ mp
->m_dir_geo
->blksize
));
3007 freetab
->naents
= (int)(dirsize
/ mp
->m_dir_geo
->blksize
);
3009 for (i
= 0; i
< freetab
->naents
; i
++)
3010 freetab
->ents
[i
] = NULLDATAOFF
;
3012 while ((dbno
= blkmap_next_off(blkmap
, dbno
, &t
)) != NULLFILEOFF
) {
3013 nex
= blkmap_getn(blkmap
, dbno
, mp
->m_dir_geo
->fsbcount
, &bmp
);
3015 for (v
= v2
, x
= 0; !v
&& x
< nex
; x
++) {
3016 for (b
= bmp
[x
].startblock
;
3017 !v
&& b
< bmp
[x
].startblock
+ bmp
[x
].blockcount
;
3022 dbprintf(_("dir inode %lld block %u=%llu\n"), id
->ino
,
3024 (xfs_fsblock_t
)bmp
->startblock
);
3027 make_bbmap(&bbmap
, nex
, bmp
);
3028 set_cur(&typtab
[TYP_DIR2
], XFS_FSB_TO_DADDR(mp
, bmp
->startblock
),
3029 mp
->m_dir_geo
->fsbcount
* blkbb
, DB_RING_IGN
,
3030 nex
> 1 ? &bbmap
: NULL
);
3032 if (iocur_top
->data
== NULL
) {
3034 dbprintf(_("can't read block %u for directory "
3036 (uint32_t)dbno
, id
->ino
);
3039 dbno
+= mp
->m_dir_geo
->fsbcount
- 1;
3042 if (dbno
< mp
->m_dir_geo
->leafblk
) {
3043 lino
= process_data_dir_v2(dot
, dotdot
, id
, v
,
3044 (xfs_dablk_t
)dbno
, &freetab
);
3048 dbprintf(_("multiple .. entries "
3055 } else if (dbno
< mp
->m_dir_geo
->freeblk
) {
3056 process_leaf_node_dir_v2_int(id
, v
, (xfs_dablk_t
)dbno
,
3059 process_leaf_node_dir_v2_free(id
, v
, (xfs_dablk_t
)dbno
,
3063 dbno
+= mp
->m_dir_geo
->fsbcount
- 1;
3065 dir_hash_check(id
, v
);
3067 for (i
= 0; i
< freetab
->nents
; i
++) {
3068 if (freetab
->ents
[i
] != NULLDATAOFF
) {
3070 dbprintf(_("missing free index for data block %d "
3071 "in dir ino %lld\n"),
3072 xfs_dir2_db_to_da(mp
->m_dir_geo
, i
), id
->ino
);
3081 process_leaf_node_dir_v3_free(
3087 xfs_dir2_data_off_t ent
;
3088 struct xfs_dir3_free
*free
;
3093 free
= iocur_top
->data
;
3094 maxent
= M_DIROPS(mp
)->free_max_bests(mp
->m_dir_geo
);
3095 if (be32_to_cpu(free
->hdr
.firstdb
) != xfs_dir2_da_to_db(mp
->m_dir_geo
,
3096 dabno
- mp
->m_dir_geo
->freeblk
) * maxent
) {
3098 dbprintf(_("bad free block firstdb %d for dir ino %lld "
3100 be32_to_cpu(free
->hdr
.firstdb
), id
->ino
, dabno
);
3104 if (be32_to_cpu(free
->hdr
.nvalid
) > maxent
||
3105 be32_to_cpu(free
->hdr
.nused
) > maxent
||
3106 be32_to_cpu(free
->hdr
.nused
) >
3107 be32_to_cpu(free
->hdr
.nvalid
)) {
3109 dbprintf(_("bad free block nvalid/nused %d/%d for dir "
3110 "ino %lld block %d\n"),
3111 be32_to_cpu(free
->hdr
.nvalid
),
3112 be32_to_cpu(free
->hdr
.nused
), id
->ino
, dabno
);
3116 for (used
= i
= 0; i
< be32_to_cpu(free
->hdr
.nvalid
); i
++) {
3117 if (freetab
->nents
<= be32_to_cpu(free
->hdr
.firstdb
) + i
)
3120 ent
= freetab
->ents
[be32_to_cpu(free
->hdr
.firstdb
) + i
];
3121 if (ent
!= be16_to_cpu(free
->bests
[i
])) {
3123 dbprintf(_("bad free block ent %d is %d should "
3124 "be %d for dir ino %lld block %d\n"),
3125 i
, be16_to_cpu(free
->bests
[i
]), ent
,
3129 if (be16_to_cpu(free
->bests
[i
]) != NULLDATAOFF
)
3131 if (ent
!= NULLDATAOFF
)
3132 freetab
->ents
[be32_to_cpu(free
->hdr
.firstdb
) + i
] =
3135 if (used
!= be32_to_cpu(free
->hdr
.nused
)) {
3137 dbprintf(_("bad free block nused %d should be %d for dir "
3138 "ino %lld block %d\n"),
3139 be32_to_cpu(free
->hdr
.nused
), used
, id
->ino
,
3146 process_leaf_node_dir_v2_free(
3152 xfs_dir2_data_off_t ent
;
3153 xfs_dir2_free_t
*free
;
3158 free
= iocur_top
->data
;
3159 if (be32_to_cpu(free
->hdr
.magic
) != XFS_DIR2_FREE_MAGIC
&&
3160 be32_to_cpu(free
->hdr
.magic
) != XFS_DIR3_FREE_MAGIC
) {
3162 dbprintf(_("bad free block magic # %#x for dir ino %lld "
3164 be32_to_cpu(free
->hdr
.magic
), id
->ino
, dabno
);
3168 if (be32_to_cpu(free
->hdr
.magic
) == XFS_DIR3_FREE_MAGIC
) {
3169 process_leaf_node_dir_v3_free(id
, v
, dabno
, freetab
);
3172 maxent
= M_DIROPS(mp
)->free_max_bests(mp
->m_dir_geo
);
3173 if (be32_to_cpu(free
->hdr
.firstdb
) != xfs_dir2_da_to_db(mp
->m_dir_geo
,
3174 dabno
- mp
->m_dir_geo
->freeblk
) * maxent
) {
3176 dbprintf(_("bad free block firstdb %d for dir ino %lld "
3178 be32_to_cpu(free
->hdr
.firstdb
), id
->ino
, dabno
);
3182 if (be32_to_cpu(free
->hdr
.nvalid
) > maxent
||
3183 be32_to_cpu(free
->hdr
.nused
) > maxent
||
3184 be32_to_cpu(free
->hdr
.nused
) >
3185 be32_to_cpu(free
->hdr
.nvalid
)) {
3187 dbprintf(_("bad free block nvalid/nused %d/%d for dir "
3188 "ino %lld block %d\n"),
3189 be32_to_cpu(free
->hdr
.nvalid
),
3190 be32_to_cpu(free
->hdr
.nused
), id
->ino
, dabno
);
3194 for (used
= i
= 0; i
< be32_to_cpu(free
->hdr
.nvalid
); i
++) {
3195 if (freetab
->nents
<= be32_to_cpu(free
->hdr
.firstdb
) + i
)
3198 ent
= freetab
->ents
[be32_to_cpu(free
->hdr
.firstdb
) + i
];
3199 if (ent
!= be16_to_cpu(free
->bests
[i
])) {
3201 dbprintf(_("bad free block ent %d is %d should "
3202 "be %d for dir ino %lld block %d\n"),
3203 i
, be16_to_cpu(free
->bests
[i
]), ent
,
3207 if (be16_to_cpu(free
->bests
[i
]) != NULLDATAOFF
)
3209 if (ent
!= NULLDATAOFF
)
3210 freetab
->ents
[be32_to_cpu(free
->hdr
.firstdb
) + i
] =
3213 if (used
!= be32_to_cpu(free
->hdr
.nused
)) {
3215 dbprintf(_("bad free block nused %d should be %d for dir "
3216 "ino %lld block %d\n"),
3217 be32_to_cpu(free
->hdr
.nused
), used
, id
->ino
,
3224 * Get address of the bestcount field in the single-leaf block.
3227 xfs_dir3_leaf_ents_count(struct xfs_dir2_leaf
*lp
)
3229 if (lp
->hdr
.info
.magic
== cpu_to_be16(XFS_DIR3_LEAF1_MAGIC
) ||
3230 lp
->hdr
.info
.magic
== cpu_to_be16(XFS_DIR3_LEAFN_MAGIC
)) {
3231 struct xfs_dir3_leaf
*lp3
= (struct xfs_dir3_leaf
*)lp
;
3233 return be16_to_cpu(lp3
->hdr
.count
);
3235 return be16_to_cpu(lp
->hdr
.count
);
3239 process_leaf_node_dir_v2_int(
3247 xfs_dir2_leaf_t
*leaf
;
3248 struct xfs_dir3_leaf
*leaf3
= NULL
;
3249 xfs_dir2_leaf_entry_t
*lep
;
3250 xfs_dir2_leaf_tail_t
*ltp
;
3251 xfs_da_intnode_t
*node
;
3253 struct xfs_da3_icnode_hdr nodehdr
;
3255 leaf
= iocur_top
->data
;
3256 switch (be16_to_cpu(leaf
->hdr
.info
.magic
)) {
3257 case XFS_DIR3_LEAF1_MAGIC
:
3258 case XFS_DIR3_LEAFN_MAGIC
:
3259 case XFS_DA3_NODE_MAGIC
:
3260 leaf3
= iocur_top
->data
;
3263 switch (be16_to_cpu(leaf
->hdr
.info
.magic
)) {
3264 case XFS_DIR2_LEAF1_MAGIC
:
3265 case XFS_DIR3_LEAF1_MAGIC
:
3266 if (be32_to_cpu(leaf
->hdr
.info
.forw
) ||
3267 be32_to_cpu(leaf
->hdr
.info
.back
)) {
3269 dbprintf(_("bad leaf block forw/back pointers "
3270 "%d/%d for dir ino %lld block %d\n"),
3271 be32_to_cpu(leaf
->hdr
.info
.forw
),
3272 be32_to_cpu(leaf
->hdr
.info
.back
),
3276 if (dabno
!= mp
->m_dir_geo
->leafblk
) {
3278 dbprintf(_("single leaf block for dir ino %lld "
3279 "block %d should be at block %d\n"),
3281 (xfs_dablk_t
)mp
->m_dir_geo
->leafblk
);
3284 ltp
= xfs_dir2_leaf_tail_p(mp
->m_dir_geo
, leaf
);
3285 lbp
= xfs_dir2_leaf_bests_p(ltp
);
3286 for (i
= 0; i
< be32_to_cpu(ltp
->bestcount
); i
++) {
3287 if (freetab
->nents
<= i
|| freetab
->ents
[i
] !=
3288 be16_to_cpu(lbp
[i
])) {
3290 dbprintf(_("bestfree %d for dir ino %lld "
3291 "block %d doesn't match table "
3293 freetab
->nents
<= i
?
3297 xfs_dir2_db_to_da(mp
->m_dir_geo
, i
),
3298 be16_to_cpu(lbp
[i
]));
3300 if (freetab
->nents
> i
)
3301 freetab
->ents
[i
] = NULLDATAOFF
;
3304 case XFS_DIR2_LEAFN_MAGIC
:
3305 case XFS_DIR3_LEAFN_MAGIC
:
3306 /* if it's at the root location then we can check the
3307 * pointers are null XXX */
3309 case XFS_DA_NODE_MAGIC
:
3310 case XFS_DA3_NODE_MAGIC
:
3311 node
= iocur_top
->data
;
3312 M_DIROPS(mp
)->node_hdr_from_disk(&nodehdr
, node
);
3313 if (nodehdr
.level
< 1 || nodehdr
.level
> XFS_DA_NODE_MAXDEPTH
) {
3315 dbprintf(_("bad node block level %d for dir ino "
3317 nodehdr
.level
, id
->ino
,
3324 dbprintf(_("bad directory data magic # %#x for dir ino "
3326 be16_to_cpu(leaf
->hdr
.info
.magic
), id
->ino
,
3331 lep
= M_DIROPS(mp
)->leaf_ents_p(leaf
);
3332 for (i
= stale
= 0; i
< xfs_dir3_leaf_ents_count(leaf
); i
++) {
3333 if (be32_to_cpu(lep
[i
].address
) == XFS_DIR2_NULL_DATAPTR
)
3335 else if (dir_hash_see(be32_to_cpu(lep
[i
].hashval
),
3336 be32_to_cpu(lep
[i
].address
))) {
3338 dbprintf(_("dir %lld block %d extra leaf entry "
3339 "%x %x\n"), id
->ino
, dabno
,
3340 be32_to_cpu(lep
[i
].hashval
),
3341 be32_to_cpu(lep
[i
].address
));
3345 if (leaf3
&& stale
!= be16_to_cpu(leaf3
->hdr
.stale
)) {
3347 dbprintf(_("dir3 %lld block %d stale mismatch "
3349 id
->ino
, dabno
, stale
,
3350 be16_to_cpu(leaf3
->hdr
.stale
));
3352 } else if (!leaf
&& stale
!= be16_to_cpu(leaf
->hdr
.stale
)) {
3354 dbprintf(_("dir %lld block %d stale mismatch "
3356 id
->ino
, dabno
, stale
,
3357 be16_to_cpu(leaf
->hdr
.stale
));
3372 uint8_t exp_flags
= 0;
3383 exp_flags
= XFS_DQ_USER
;
3385 case IS_PROJECT_QUOTA
:
3387 exp_flags
= XFS_DQ_PROJ
;
3389 case IS_GROUP_QUOTA
:
3391 exp_flags
= XFS_DQ_GROUP
;
3397 perblock
= (uint
)(mp
->m_sb
.sb_blocksize
/ sizeof(*dqb
));
3400 while ((qbno
= blkmap_next_off(blkmap
, qbno
, &t
)) != NULLFILEOFF
) {
3401 bno
= blkmap_get(blkmap
, qbno
);
3402 dqid
= (xfs_dqid_t
)qbno
* perblock
;
3403 cb
= CHECK_BLIST(bno
);
3404 scicb
= !sflag
|| id
->ilist
|| cb
;
3406 set_cur(&typtab
[TYP_DQBLK
], XFS_FSB_TO_DADDR(mp
, bno
), blkbb
,
3408 if ((dqb
= iocur_top
->data
) == NULL
) {
3410 dbprintf(_("can't read block %lld for %s quota "
3411 "inode (fsblock %lld)\n"),
3412 (xfs_fileoff_t
)qbno
, s
,
3413 (xfs_fsblock_t
)bno
);
3418 for (i
= 0; i
< perblock
; i
++, dqid
++, dqb
++) {
3419 if (verbose
|| id
->ilist
|| cb
)
3420 dbprintf(_("%s dqblk %lld entry %d id %u bc "
3421 "%lld ic %lld rc %lld\n"),
3422 s
, (xfs_fileoff_t
)qbno
, i
, dqid
,
3423 be64_to_cpu(dqb
->dd_diskdq
.d_bcount
),
3424 be64_to_cpu(dqb
->dd_diskdq
.d_icount
),
3425 be64_to_cpu(dqb
->dd_diskdq
.d_rtbcount
));
3426 if (be16_to_cpu(dqb
->dd_diskdq
.d_magic
) != XFS_DQUOT_MAGIC
) {
3428 dbprintf(_("bad magic number %#x for %s "
3429 "dqblk %lld entry %d id %u\n"),
3430 be16_to_cpu(dqb
->dd_diskdq
.d_magic
), s
,
3431 (xfs_fileoff_t
)qbno
, i
, dqid
);
3435 if (dqb
->dd_diskdq
.d_version
!= XFS_DQUOT_VERSION
) {
3437 dbprintf(_("bad version number %#x for "
3438 "%s dqblk %lld entry %d id "
3440 dqb
->dd_diskdq
.d_version
, s
,
3441 (xfs_fileoff_t
)qbno
, i
, dqid
);
3445 if (dqb
->dd_diskdq
.d_flags
!= exp_flags
) {
3447 dbprintf(_("bad flags %#x for %s dqblk "
3448 "%lld entry %d id %u\n"),
3449 dqb
->dd_diskdq
.d_flags
, s
,
3450 (xfs_fileoff_t
)qbno
, i
, dqid
);
3454 if (be32_to_cpu(dqb
->dd_diskdq
.d_id
) != dqid
) {
3456 dbprintf(_("bad id %u for %s dqblk %lld "
3457 "entry %d id %u\n"),
3458 be32_to_cpu(dqb
->dd_diskdq
.d_id
), s
,
3459 (xfs_fileoff_t
)qbno
, i
, dqid
);
3463 quota_add((qtype
== IS_PROJECT_QUOTA
) ? &dqid
: NULL
,
3464 (qtype
== IS_GROUP_QUOTA
) ? &dqid
: NULL
,
3465 (qtype
== IS_USER_QUOTA
) ? &dqid
: NULL
,
3467 be64_to_cpu(dqb
->dd_diskdq
.d_bcount
),
3468 be64_to_cpu(dqb
->dd_diskdq
.d_icount
),
3469 be64_to_cpu(dqb
->dd_diskdq
.d_rtbcount
));
3481 xfs_fileoff_t bmbno
;
3483 xfs_rtblock_t extno
;
3488 xfs_rfsblock_t rtbno
;
3492 xfs_rtword_t
*words
;
3494 bitsperblock
= mp
->m_sb
.sb_blocksize
* NBBY
;
3495 bit
= extno
= prevbit
= start_bmbno
= start_bit
= 0;
3496 bmbno
= NULLFILEOFF
;
3497 while ((bmbno
= blkmap_next_off(blkmap
, bmbno
, &t
)) !=
3499 bno
= blkmap_get(blkmap
, bmbno
);
3500 if (bno
== NULLFSBLOCK
) {
3502 dbprintf(_("block %lld for rtbitmap inode is "
3504 (xfs_fileoff_t
)bmbno
);
3509 set_cur(&typtab
[TYP_RTBITMAP
], XFS_FSB_TO_DADDR(mp
, bno
), blkbb
,
3511 if ((words
= iocur_top
->data
) == NULL
) {
3513 dbprintf(_("can't read block %lld for rtbitmap "
3515 (xfs_fileoff_t
)bmbno
);
3521 bit
< bitsperblock
&& extno
< mp
->m_sb
.sb_rextents
;
3523 if (xfs_isset(words
, bit
)) {
3524 rtbno
= extno
* mp
->m_sb
.sb_rextsize
;
3525 set_rdbmap(rtbno
, mp
->m_sb
.sb_rextsize
,
3529 start_bmbno
= (int)bmbno
;
3533 } else if (prevbit
== 1) {
3534 len
= ((int)bmbno
- start_bmbno
) *
3535 bitsperblock
+ (bit
- start_bit
);
3536 log
= XFS_RTBLOCKLOG(len
);
3537 offs
= XFS_SUMOFFS(mp
, log
, start_bmbno
);
3543 if (extno
== mp
->m_sb
.sb_rextents
)
3547 len
= ((int)bmbno
- start_bmbno
) * bitsperblock
+
3549 log
= XFS_RTBLOCKLOG(len
);
3550 offs
= XFS_SUMOFFS(mp
, log
, start_bmbno
);
3561 xfs_fileoff_t sumbno
;
3564 sumbno
= NULLFILEOFF
;
3565 while ((sumbno
= blkmap_next_off(blkmap
, sumbno
, &t
)) != NULLFILEOFF
) {
3566 bno
= blkmap_get(blkmap
, sumbno
);
3567 if (bno
== NULLFSBLOCK
) {
3569 dbprintf(_("block %lld for rtsummary inode is "
3571 (xfs_fileoff_t
)sumbno
);
3576 set_cur(&typtab
[TYP_RTSUMMARY
], XFS_FSB_TO_DADDR(mp
, bno
),
3577 blkbb
, DB_RING_IGN
, NULL
);
3578 if ((bytes
= iocur_top
->data
) == NULL
) {
3580 dbprintf(_("can't read block %lld for rtsummary "
3582 (xfs_fileoff_t
)sumbno
);
3587 memcpy((char *)sumfile
+ sumbno
* mp
->m_sb
.sb_blocksize
, bytes
,
3588 mp
->m_sb
.sb_blocksize
);
3605 struct xfs_dir2_sf_hdr
*sf
;
3606 xfs_dir2_sf_entry_t
*sfe
;
3609 sf
= (struct xfs_dir2_sf_hdr
*)XFS_DFORK_DPTR(dip
);
3611 v
= verbose
|| id
->ilist
;
3613 dbprintf(_("dir %lld entry . %lld\n"), id
->ino
, id
->ino
);
3615 sfe
= xfs_dir2_sf_firstentry(sf
);
3616 offset
= M_DIROPS(mp
)->data_first_offset
;
3617 for (i
= sf
->count
- 1, i8
= 0; i
>= 0; i
--) {
3618 if ((intptr_t)sfe
+ M_DIROPS(mp
)->sf_entsize(sf
, sfe
->namelen
) -
3619 (intptr_t)sf
> be64_to_cpu(dip
->di_size
)) {
3621 dbprintf(_("dir %llu bad size in entry at %d\n"),
3623 (int)((char *)sfe
- (char *)sf
));
3627 lino
= M_DIROPS(mp
)->sf_get_ino(sf
, sfe
);
3628 if (lino
> XFS_DIR2_MAX_SHORT_INUM
)
3630 cid
= find_inode(lino
, 1);
3633 dbprintf(_("dir %lld entry %*.*s bad inode "
3635 id
->ino
, sfe
->namelen
, sfe
->namelen
,
3642 addname_inode(cid
, (char *)sfe
->name
, sfe
->namelen
);
3645 dbprintf(_("dir %lld entry %*.*s offset %d %lld\n"),
3646 id
->ino
, sfe
->namelen
, sfe
->namelen
, sfe
->name
,
3647 xfs_dir2_sf_get_offset(sfe
), lino
);
3648 if (xfs_dir2_sf_get_offset(sfe
) < offset
) {
3650 dbprintf(_("dir %lld entry %*.*s bad offset %d\n"),
3651 id
->ino
, sfe
->namelen
, sfe
->namelen
,
3652 sfe
->name
, xfs_dir2_sf_get_offset(sfe
));
3656 xfs_dir2_sf_get_offset(sfe
) +
3657 M_DIROPS(mp
)->sf_entsize(sf
, sfe
->namelen
);
3658 sfe
= M_DIROPS(mp
)->sf_nextentry(sf
, sfe
);
3660 if (i
< 0 && (intptr_t)sfe
- (intptr_t)sf
!=
3661 be64_to_cpu(dip
->di_size
)) {
3663 dbprintf(_("dir %llu size is %lld, should be %u\n"),
3664 id
->ino
, be64_to_cpu(dip
->di_size
),
3665 (uint
)((char *)sfe
- (char *)sf
));
3668 if (offset
+ (sf
->count
+ 2) * sizeof(xfs_dir2_leaf_entry_t
) +
3669 sizeof(xfs_dir2_block_tail_t
) > mp
->m_dir_geo
->blksize
) {
3671 dbprintf(_("dir %llu offsets too high\n"), id
->ino
);
3674 lino
= M_DIROPS(mp
)->sf_get_parent_ino(sf
);
3675 if (lino
> XFS_DIR2_MAX_SHORT_INUM
)
3677 cid
= find_inode(lino
, 1);
3682 dbprintf(_("dir %lld entry .. bad inode number %lld\n"),
3687 dbprintf(_("dir %lld entry .. %lld\n"), id
->ino
, lino
);
3688 if (i8
!= sf
->i8count
) {
3690 dbprintf(_("dir %lld i8count mismatch is %d should be "
3692 id
->ino
, sf
->i8count
, i8
);
3696 return cid
? lino
: NULLFSINO
;
3710 if (qudo
&& usrid
!= NULL
)
3711 quota_add1(qudata
, *usrid
, dq
, bc
, ic
, rc
);
3712 if (qgdo
&& grpid
!= NULL
)
3713 quota_add1(qgdata
, *grpid
, dq
, bc
, ic
, rc
);
3714 if (qpdo
&& prjid
!= NULL
)
3715 quota_add1(qpdata
, *prjid
, dq
, bc
, ic
, rc
);
3731 qh
= (int)(id
% QDATA_HASH_SIZE
);
3735 qi
= dq
? &qe
->dq
: &qe
->count
;
3743 qe
= xmalloc(sizeof(*qe
));
3745 qi
= dq
? &qe
->dq
: &qe
->count
;
3749 qi
= dq
? &qe
->count
: &qe
->dq
;
3750 qi
->bc
= qi
->ic
= qi
->rc
= 0;
3764 for (i
= 0; i
< QDATA_HASH_SIZE
; i
++) {
3768 if (qp
->count
.bc
!= qp
->dq
.bc
||
3769 qp
->count
.ic
!= qp
->dq
.ic
||
3770 qp
->count
.rc
!= qp
->dq
.rc
) {
3772 dbprintf(_("%s quota id %u, have/exp"),
3774 if (qp
->count
.bc
!= qp
->dq
.bc
)
3775 dbprintf(_(" bc %lld/%lld"),
3778 if (qp
->count
.ic
!= qp
->dq
.ic
)
3779 dbprintf(_(" ic %lld/%lld"),
3782 if (qp
->count
.rc
!= qp
->dq
.rc
)
3783 dbprintf(_(" rc %lld/%lld"),
3800 qudo
= mp
->m_sb
.sb_uquotino
!= 0 &&
3801 mp
->m_sb
.sb_uquotino
!= NULLFSINO
&&
3802 (mp
->m_sb
.sb_qflags
& XFS_UQUOTA_ACCT
) &&
3803 (mp
->m_sb
.sb_qflags
& XFS_UQUOTA_CHKD
);
3804 qgdo
= mp
->m_sb
.sb_gquotino
!= 0 &&
3805 mp
->m_sb
.sb_gquotino
!= NULLFSINO
&&
3806 (mp
->m_sb
.sb_qflags
& XFS_GQUOTA_ACCT
) &&
3807 (mp
->m_sb
.sb_qflags
& XFS_GQUOTA_CHKD
);
3808 qpdo
= mp
->m_sb
.sb_pquotino
!= 0 &&
3809 mp
->m_sb
.sb_pquotino
!= NULLFSINO
&&
3810 (mp
->m_sb
.sb_qflags
& XFS_PQUOTA_ACCT
) &&
3811 (mp
->m_sb
.sb_qflags
& XFS_PQUOTA_CHKD
);
3813 qudata
= xcalloc(QDATA_HASH_SIZE
, sizeof(qdata_t
*));
3815 qgdata
= xcalloc(QDATA_HASH_SIZE
, sizeof(qdata_t
*));
3817 qpdata
= xcalloc(QDATA_HASH_SIZE
, sizeof(qdata_t
*));
3822 xfs_agnumber_t agno
)
3828 xfs_sb_t
*sb
= &tsb
;
3830 agffreeblks
= agflongest
= 0;
3832 agicount
= agifreecount
= 0;
3833 push_cur(); /* 1 pushed */
3834 set_cur(&typtab
[TYP_SB
],
3835 XFS_AG_DADDR(mp
, agno
, XFS_SB_DADDR
),
3836 XFS_FSS_TO_BB(mp
, 1), DB_RING_IGN
, NULL
);
3838 if (!iocur_top
->data
) {
3839 dbprintf(_("can't read superblock for ag %u\n"), agno
);
3844 libxfs_sb_from_disk(sb
, iocur_top
->data
);
3846 if (sb
->sb_magicnum
!= XFS_SB_MAGIC
) {
3848 dbprintf(_("bad sb magic # %#x in ag %u\n"),
3849 sb
->sb_magicnum
, agno
);
3852 if (!xfs_sb_good_version(sb
)) {
3854 dbprintf(_("bad sb version # %#x in ag %u\n"),
3855 sb
->sb_versionnum
, agno
);
3859 if (!lazycount
&& xfs_sb_version_haslazysbcount(sb
)) {
3862 if (agno
== 0 && sb
->sb_inprogress
!= 0) {
3864 dbprintf(_("mkfs not completed successfully\n"));
3867 set_dbmap(agno
, XFS_SB_BLOCK(mp
), 1, DBM_SB
, agno
, XFS_SB_BLOCK(mp
));
3868 if (sb
->sb_logstart
&& XFS_FSB_TO_AGNO(mp
, sb
->sb_logstart
) == agno
)
3869 set_dbmap(agno
, XFS_FSB_TO_AGBNO(mp
, sb
->sb_logstart
),
3870 sb
->sb_logblocks
, DBM_LOG
, agno
, XFS_SB_BLOCK(mp
));
3871 push_cur(); /* 2 pushed */
3872 set_cur(&typtab
[TYP_AGF
],
3873 XFS_AG_DADDR(mp
, agno
, XFS_AGF_DADDR(mp
)),
3874 XFS_FSS_TO_BB(mp
, 1), DB_RING_IGN
, NULL
);
3875 if ((agf
= iocur_top
->data
) == NULL
) {
3876 dbprintf(_("can't read agf block for ag %u\n"), agno
);
3880 if (be32_to_cpu(agf
->agf_magicnum
) != XFS_AGF_MAGIC
) {
3882 dbprintf(_("bad agf magic # %#x in ag %u\n"),
3883 be32_to_cpu(agf
->agf_magicnum
), agno
);
3886 if (!XFS_AGF_GOOD_VERSION(be32_to_cpu(agf
->agf_versionnum
))) {
3888 dbprintf(_("bad agf version # %#x in ag %u\n"),
3889 be32_to_cpu(agf
->agf_versionnum
), agno
);
3892 if (XFS_SB_BLOCK(mp
) != XFS_AGF_BLOCK(mp
))
3893 set_dbmap(agno
, XFS_AGF_BLOCK(mp
), 1, DBM_AGF
, agno
,
3895 if (sb
->sb_agblocks
> be32_to_cpu(agf
->agf_length
))
3896 set_dbmap(agno
, be32_to_cpu(agf
->agf_length
),
3897 sb
->sb_agblocks
- be32_to_cpu(agf
->agf_length
),
3898 DBM_MISSING
, agno
, XFS_SB_BLOCK(mp
));
3899 push_cur(); /* 3 pushed */
3900 set_cur(&typtab
[TYP_AGI
],
3901 XFS_AG_DADDR(mp
, agno
, XFS_AGI_DADDR(mp
)),
3902 XFS_FSS_TO_BB(mp
, 1), DB_RING_IGN
, NULL
);
3903 if ((agi
= iocur_top
->data
) == NULL
) {
3904 dbprintf(_("can't read agi block for ag %u\n"), agno
);
3908 if (be32_to_cpu(agi
->agi_magicnum
) != XFS_AGI_MAGIC
) {
3910 dbprintf(_("bad agi magic # %#x in ag %u\n"),
3911 be32_to_cpu(agi
->agi_magicnum
), agno
);
3914 if (!XFS_AGI_GOOD_VERSION(be32_to_cpu(agi
->agi_versionnum
))) {
3916 dbprintf(_("bad agi version # %#x in ag %u\n"),
3917 be32_to_cpu(agi
->agi_versionnum
), agno
);
3920 if (XFS_SB_BLOCK(mp
) != XFS_AGI_BLOCK(mp
) &&
3921 XFS_AGF_BLOCK(mp
) != XFS_AGI_BLOCK(mp
))
3922 set_dbmap(agno
, XFS_AGI_BLOCK(mp
), 1, DBM_AGI
, agno
,
3927 be32_to_cpu(agf
->agf_roots
[XFS_BTNUM_BNO
]),
3928 be32_to_cpu(agf
->agf_levels
[XFS_BTNUM_BNO
]),
3929 1, scanfunc_bno
, TYP_BNOBT
);
3932 be32_to_cpu(agf
->agf_roots
[XFS_BTNUM_CNT
]),
3933 be32_to_cpu(agf
->agf_levels
[XFS_BTNUM_CNT
]),
3934 1, scanfunc_cnt
, TYP_CNTBT
);
3935 if (agf
->agf_roots
[XFS_BTNUM_RMAP
]) {
3937 be32_to_cpu(agf
->agf_roots
[XFS_BTNUM_RMAP
]),
3938 be32_to_cpu(agf
->agf_levels
[XFS_BTNUM_RMAP
]),
3939 1, scanfunc_rmap
, TYP_RMAPBT
);
3941 if (agf
->agf_refcount_root
) {
3943 be32_to_cpu(agf
->agf_refcount_root
),
3944 be32_to_cpu(agf
->agf_refcount_level
),
3945 1, scanfunc_refcnt
, TYP_REFCBT
);
3948 be32_to_cpu(agi
->agi_root
),
3949 be32_to_cpu(agi
->agi_level
),
3950 1, scanfunc_ino
, TYP_INOBT
);
3951 if (agi
->agi_free_root
) {
3953 be32_to_cpu(agi
->agi_free_root
),
3954 be32_to_cpu(agi
->agi_free_level
),
3955 1, scanfunc_fino
, TYP_FINOBT
);
3957 if (be32_to_cpu(agf
->agf_freeblks
) != agffreeblks
) {
3959 dbprintf(_("agf_freeblks %u, counted %u in ag %u\n"),
3960 be32_to_cpu(agf
->agf_freeblks
),
3964 if (be32_to_cpu(agf
->agf_longest
) != agflongest
) {
3966 dbprintf(_("agf_longest %u, counted %u in ag %u\n"),
3967 be32_to_cpu(agf
->agf_longest
),
3972 be32_to_cpu(agf
->agf_btreeblks
) != agfbtreeblks
) {
3974 dbprintf(_("agf_btreeblks %u, counted %u in ag %u\n"),
3975 be32_to_cpu(agf
->agf_btreeblks
),
3976 agfbtreeblks
, agno
);
3979 agf_aggr_freeblks
+= agffreeblks
+ agfbtreeblks
;
3980 if (be32_to_cpu(agi
->agi_count
) != agicount
) {
3982 dbprintf(_("agi_count %u, counted %u in ag %u\n"),
3983 be32_to_cpu(agi
->agi_count
),
3987 if (be32_to_cpu(agi
->agi_freecount
) != agifreecount
) {
3989 dbprintf(_("agi_freecount %u, counted %u in ag %u\n"),
3990 be32_to_cpu(agi
->agi_freecount
),
3991 agifreecount
, agno
);
3994 for (i
= 0; i
< XFS_AGI_UNLINKED_BUCKETS
; i
++) {
3995 if (be32_to_cpu(agi
->agi_unlinked
[i
]) != NULLAGINO
) {
3997 xfs_agino_t agino
=be32_to_cpu(agi
->agi_unlinked
[i
]);
3998 dbprintf(_("agi unlinked bucket %d is %u in ag "
3999 "%u (inode=%lld)\n"), i
, agino
, agno
,
4000 XFS_AGINO_TO_INO(mp
, agno
, agino
));
4014 xfs_agnumber_t agno
;
4020 struct xfs_mount
*mp
,
4024 struct agfl_state
*as
= priv
;
4026 set_dbmap(as
->agno
, bno
, 1, DBM_FREELIST
, as
->agno
, XFS_AGFL_BLOCK(mp
));
4035 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4036 struct agfl_state state
;
4038 if (XFS_SB_BLOCK(mp
) != XFS_AGFL_BLOCK(mp
) &&
4039 XFS_AGF_BLOCK(mp
) != XFS_AGFL_BLOCK(mp
) &&
4040 XFS_AGI_BLOCK(mp
) != XFS_AGFL_BLOCK(mp
))
4041 set_dbmap(seqno
, XFS_AGFL_BLOCK(mp
), 1, DBM_AGFL
, seqno
,
4043 if (be32_to_cpu(agf
->agf_flcount
) == 0)
4046 set_cur(&typtab
[TYP_AGFL
],
4047 XFS_AG_DADDR(mp
, seqno
, XFS_AGFL_DADDR(mp
)),
4048 XFS_FSS_TO_BB(mp
, 1), DB_RING_IGN
, NULL
);
4049 if (iocur_top
->data
== NULL
) {
4050 dbprintf(_("can't read agfl block for ag %u\n"), seqno
);
4056 /* verify agf values before proceeding */
4057 if (be32_to_cpu(agf
->agf_flfirst
) >= libxfs_agfl_size(mp
) ||
4058 be32_to_cpu(agf
->agf_fllast
) >= libxfs_agfl_size(mp
)) {
4059 dbprintf(_("agf %d freelist blocks bad, skipping "
4060 "freelist scan\n"), seqno
);
4065 /* open coded XFS_BUF_TO_AGFL_BNO */
4068 libxfs_agfl_walk(mp
, agf
, iocur_top
->bp
, scan_agfl
, &state
);
4069 if (state
.count
!= be32_to_cpu(agf
->agf_flcount
)) {
4071 dbprintf(_("freeblk count %u != flcount %u in ag %u\n"),
4073 be32_to_cpu(agf
->agf_flcount
),
4077 fdblocks
+= state
.count
;
4078 agf_aggr_freeblks
+= state
.count
;
4086 scan_lbtree_f_t func
,
4089 xfs_rfsblock_t
*totd
,
4090 xfs_rfsblock_t
*toti
,
4097 set_cur(&typtab
[btype
], XFS_FSB_TO_DADDR(mp
, root
), blkbb
, DB_RING_IGN
,
4099 if (iocur_top
->data
== NULL
) {
4101 dbprintf(_("can't read btree block %u/%u\n"),
4102 XFS_FSB_TO_AGNO(mp
, root
),
4103 XFS_FSB_TO_AGBNO(mp
, root
));
4108 (*func
)(iocur_top
->data
, nlevels
- 1, type
, root
, id
, totd
, toti
, nex
,
4109 blkmapp
, isroot
, btype
);
4119 scan_sbtree_f_t func
,
4122 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4125 set_cur(&typtab
[btype
],
4126 XFS_AGB_TO_DADDR(mp
, seqno
, root
), blkbb
, DB_RING_IGN
, NULL
);
4127 if (iocur_top
->data
== NULL
) {
4129 dbprintf(_("can't read btree block %u/%u\n"), seqno
, root
);
4134 (*func
)(iocur_top
->data
, nlevels
- 1, agf
, root
, isroot
);
4140 struct xfs_btree_block
*block
,
4145 xfs_rfsblock_t
*totd
,
4146 xfs_rfsblock_t
*toti
,
4152 xfs_agblock_t agbno
;
4153 xfs_agnumber_t agno
;
4158 agno
= XFS_FSB_TO_AGNO(mp
, bno
);
4159 agbno
= XFS_FSB_TO_AGBNO(mp
, bno
);
4160 if (be32_to_cpu(block
->bb_magic
) != XFS_BMAP_MAGIC
&&
4161 be32_to_cpu(block
->bb_magic
) != XFS_BMAP_CRC_MAGIC
) {
4162 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
4163 dbprintf(_("bad magic # %#x in inode %lld bmbt block "
4165 be32_to_cpu(block
->bb_magic
), id
->ino
, agno
, agbno
);
4168 if (be16_to_cpu(block
->bb_level
) != level
) {
4169 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
4170 dbprintf(_("expected level %d got %d in inode %lld bmbt "
4172 level
, be16_to_cpu(block
->bb_level
), id
->ino
, agno
, agbno
);
4175 set_dbmap(agno
, agbno
, 1, type
, agno
, agbno
);
4176 set_inomap(agno
, agbno
, 1, id
);
4179 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_bmap_dmxr
[0] ||
4180 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_bmap_dmnr
[0])) {
4181 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
4182 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) "
4183 "in inode %lld bmap block %lld\n"),
4184 be16_to_cpu(block
->bb_numrecs
), mp
->m_bmap_dmnr
[0],
4185 mp
->m_bmap_dmxr
[0], id
->ino
,
4186 (xfs_fsblock_t
)bno
);
4190 rp
= XFS_BMBT_REC_ADDR(mp
, block
, 1);
4191 *nex
+= be16_to_cpu(block
->bb_numrecs
);
4192 process_bmbt_reclist(rp
, be16_to_cpu(block
->bb_numrecs
), type
, id
, totd
,
4196 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_bmap_dmxr
[1] ||
4197 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_bmap_dmnr
[1])) {
4198 if (!sflag
|| id
->ilist
|| CHECK_BLIST(bno
))
4199 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in "
4200 "inode %lld bmap block %lld\n"),
4201 be16_to_cpu(block
->bb_numrecs
), mp
->m_bmap_dmnr
[1],
4202 mp
->m_bmap_dmxr
[1], id
->ino
, (xfs_fsblock_t
)bno
);
4206 pp
= XFS_BMBT_PTR_ADDR(mp
, block
, 1, mp
->m_bmap_dmxr
[0]);
4207 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++)
4208 scan_lbtree(be64_to_cpu(pp
[i
]), level
, scanfunc_bmap
, type
, id
,
4209 totd
, toti
, nex
, blkmapp
, 0, btype
);
4214 struct xfs_btree_block
*block
,
4221 xfs_alloc_ptr_t
*pp
;
4222 xfs_alloc_rec_t
*rp
;
4223 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4224 xfs_agblock_t lastblock
;
4226 if (be32_to_cpu(block
->bb_magic
) != XFS_ABTB_MAGIC
&&
4227 be32_to_cpu(block
->bb_magic
) != XFS_ABTB_CRC_MAGIC
) {
4228 dbprintf(_("bad magic # %#x in btbno block %u/%u\n"),
4229 be32_to_cpu(block
->bb_magic
), seqno
, bno
);
4235 if (be16_to_cpu(block
->bb_level
) != level
) {
4237 dbprintf(_("expected level %d got %d in btbno block "
4239 level
, be16_to_cpu(block
->bb_level
), seqno
, bno
);
4242 set_dbmap(seqno
, bno
, 1, DBM_BTBNO
, seqno
, bno
);
4244 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_alloc_mxr
[0] ||
4245 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_alloc_mnr
[0])) {
4246 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in "
4247 "btbno block %u/%u\n"),
4248 be16_to_cpu(block
->bb_numrecs
), mp
->m_alloc_mnr
[0],
4249 mp
->m_alloc_mxr
[0], seqno
, bno
);
4253 rp
= XFS_ALLOC_REC_ADDR(mp
, block
, 1);
4255 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++) {
4256 set_dbmap(seqno
, be32_to_cpu(rp
[i
].ar_startblock
),
4257 be32_to_cpu(rp
[i
].ar_blockcount
), DBM_FREE1
,
4259 if (be32_to_cpu(rp
[i
].ar_startblock
) <= lastblock
) {
4261 "out-of-order bno btree record %d (%u %u) block %u/%u\n"),
4262 i
, be32_to_cpu(rp
[i
].ar_startblock
),
4263 be32_to_cpu(rp
[i
].ar_blockcount
),
4264 be32_to_cpu(agf
->agf_seqno
), bno
);
4267 lastblock
= be32_to_cpu(rp
[i
].ar_startblock
);
4272 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_alloc_mxr
[1] ||
4273 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_alloc_mnr
[1])) {
4274 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in btbno block "
4276 be16_to_cpu(block
->bb_numrecs
), mp
->m_alloc_mnr
[1],
4277 mp
->m_alloc_mxr
[1], seqno
, bno
);
4281 pp
= XFS_ALLOC_PTR_ADDR(mp
, block
, 1, mp
->m_alloc_mxr
[1]);
4282 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++)
4283 scan_sbtree(agf
, be32_to_cpu(pp
[i
]), level
, 0, scanfunc_bno
, TYP_BNOBT
);
4288 struct xfs_btree_block
*block
,
4294 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4296 xfs_alloc_ptr_t
*pp
;
4297 xfs_alloc_rec_t
*rp
;
4298 xfs_extlen_t lastcount
;
4300 if (be32_to_cpu(block
->bb_magic
) != XFS_ABTC_MAGIC
&&
4301 be32_to_cpu(block
->bb_magic
) != XFS_ABTC_CRC_MAGIC
) {
4302 dbprintf(_("bad magic # %#x in btcnt block %u/%u\n"),
4303 be32_to_cpu(block
->bb_magic
), seqno
, bno
);
4309 if (be16_to_cpu(block
->bb_level
) != level
) {
4311 dbprintf(_("expected level %d got %d in btcnt block "
4313 level
, be16_to_cpu(block
->bb_level
), seqno
, bno
);
4316 set_dbmap(seqno
, bno
, 1, DBM_BTCNT
, seqno
, bno
);
4318 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_alloc_mxr
[0] ||
4319 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_alloc_mnr
[0])) {
4320 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in "
4321 "btbno block %u/%u\n"),
4322 be16_to_cpu(block
->bb_numrecs
), mp
->m_alloc_mnr
[0],
4323 mp
->m_alloc_mxr
[0], seqno
, bno
);
4327 rp
= XFS_ALLOC_REC_ADDR(mp
, block
, 1);
4329 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++) {
4330 check_set_dbmap(seqno
, be32_to_cpu(rp
[i
].ar_startblock
),
4331 be32_to_cpu(rp
[i
].ar_blockcount
), DBM_FREE1
, DBM_FREE2
,
4333 fdblocks
+= be32_to_cpu(rp
[i
].ar_blockcount
);
4334 agffreeblks
+= be32_to_cpu(rp
[i
].ar_blockcount
);
4335 if (be32_to_cpu(rp
[i
].ar_blockcount
) > agflongest
)
4336 agflongest
= be32_to_cpu(rp
[i
].ar_blockcount
);
4337 if (be32_to_cpu(rp
[i
].ar_blockcount
) < lastcount
) {
4339 "out-of-order cnt btree record %d (%u %u) block %u/%u\n"),
4340 i
, be32_to_cpu(rp
[i
].ar_startblock
),
4341 be32_to_cpu(rp
[i
].ar_blockcount
),
4342 be32_to_cpu(agf
->agf_seqno
), bno
);
4344 lastcount
= be32_to_cpu(rp
[i
].ar_blockcount
);
4349 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_alloc_mxr
[1] ||
4350 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_alloc_mnr
[1])) {
4351 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in btbno block "
4353 be16_to_cpu(block
->bb_numrecs
), mp
->m_alloc_mnr
[1],
4354 mp
->m_alloc_mxr
[1], seqno
, bno
);
4358 pp
= XFS_ALLOC_PTR_ADDR(mp
, block
, 1, mp
->m_alloc_mxr
[1]);
4359 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++)
4360 scan_sbtree(agf
, be32_to_cpu(pp
[i
]), level
, 0, scanfunc_cnt
, TYP_CNTBT
);
4365 struct xfs_btree_block
*block
,
4372 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4379 xfs_inobt_ptr_t
*pp
;
4380 xfs_inobt_rec_t
*rp
;
4381 xfs_agblock_t agbno
;
4382 xfs_agblock_t end_agbno
;
4383 struct xfs_dinode
*dip
;
4388 if (xfs_sb_version_hassparseinodes(&mp
->m_sb
))
4389 blks_per_buf
= xfs_icluster_size_fsb(mp
);
4391 blks_per_buf
= mp
->m_ialloc_blks
;
4392 inodes_per_buf
= min(blks_per_buf
<< mp
->m_sb
.sb_inopblog
,
4393 XFS_INODES_PER_CHUNK
);
4395 if (be32_to_cpu(block
->bb_magic
) != XFS_IBT_MAGIC
&&
4396 be32_to_cpu(block
->bb_magic
) != XFS_IBT_CRC_MAGIC
) {
4397 dbprintf(_("bad magic # %#x in inobt block %u/%u\n"),
4398 be32_to_cpu(block
->bb_magic
), seqno
, bno
);
4402 if (be16_to_cpu(block
->bb_level
) != level
) {
4404 dbprintf(_("expected level %d got %d in inobt block "
4406 level
, be16_to_cpu(block
->bb_level
), seqno
, bno
);
4409 set_dbmap(seqno
, bno
, 1, DBM_BTINO
, seqno
, bno
);
4411 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_inobt_mxr
[0] ||
4412 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_inobt_mnr
[0])) {
4413 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in "
4414 "inobt block %u/%u\n"),
4415 be16_to_cpu(block
->bb_numrecs
), mp
->m_inobt_mnr
[0],
4416 mp
->m_inobt_mxr
[0], seqno
, bno
);
4420 rp
= XFS_INOBT_REC_ADDR(mp
, block
, 1);
4421 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++) {
4422 agino
= be32_to_cpu(rp
[i
].ir_startino
);
4423 agbno
= XFS_AGINO_TO_AGBNO(mp
, agino
);
4424 off
= XFS_AGINO_TO_OFFSET(mp
, agino
);
4425 end_agbno
= agbno
+ mp
->m_ialloc_blks
;
4427 if ((sbversion
& XFS_SB_VERSION_ALIGNBIT
) &&
4428 mp
->m_sb
.sb_inoalignmt
&&
4429 (XFS_INO_TO_AGBNO(mp
, agino
) %
4430 mp
->m_sb
.sb_inoalignmt
))
4431 sbversion
&= ~XFS_SB_VERSION_ALIGNBIT
;
4438 while (agbno
< end_agbno
&&
4439 ioff
< XFS_INODES_PER_CHUNK
) {
4440 if (xfs_inobt_is_sparse_disk(&rp
[i
], ioff
))
4443 if (off
< XFS_INODES_PER_CHUNK
)
4444 set_dbmap(seqno
, agbno
, blks_per_buf
,
4445 DBM_INODE
, seqno
, bno
);
4447 icount
+= inodes_per_buf
;
4448 agicount
+= inodes_per_buf
;
4450 set_cur(&typtab
[TYP_INODE
],
4451 XFS_AGB_TO_DADDR(mp
, seqno
, agbno
),
4452 XFS_FSB_TO_BB(mp
, blks_per_buf
),
4454 if (iocur_top
->data
== NULL
) {
4456 dbprintf(_("can't read inode block "
4463 for (j
= 0; j
< inodes_per_buf
; j
++) {
4464 isfree
= XFS_INOBT_IS_FREE_DISK(&rp
[i
], ioff
+ j
);
4467 dip
= (xfs_dinode_t
*)((char *)iocur_top
->data
+
4468 ((off
+ j
) << mp
->m_sb
.sb_inodelog
));
4469 process_inode(agf
, agino
+ ioff
+ j
, dip
, isfree
);
4473 agbno
+= blks_per_buf
;
4474 ioff
+= inodes_per_buf
;
4477 if (xfs_sb_version_hassparseinodes(&mp
->m_sb
))
4478 freecount
= rp
[i
].ir_u
.sp
.ir_freecount
;
4480 freecount
= be32_to_cpu(rp
[i
].ir_u
.f
.ir_freecount
);
4483 agifreecount
+= freecount
;
4485 if (nfree
!= freecount
) {
4487 dbprintf(_("ir_freecount/free mismatch, "
4488 "inode chunk %u/%u, freecount "
4490 seqno
, agino
, freecount
, nfree
);
4497 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_inobt_mxr
[1] ||
4498 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_inobt_mnr
[1])) {
4499 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in inobt block "
4501 be16_to_cpu(block
->bb_numrecs
), mp
->m_inobt_mnr
[1],
4502 mp
->m_inobt_mxr
[1], seqno
, bno
);
4506 pp
= XFS_INOBT_PTR_ADDR(mp
, block
, 1, mp
->m_inobt_mxr
[1]);
4507 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++)
4508 scan_sbtree(agf
, be32_to_cpu(pp
[i
]), level
, 0, scanfunc_ino
, TYP_INOBT
);
4513 struct xfs_btree_block
*block
,
4515 struct xfs_agf
*agf
,
4520 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4523 xfs_inobt_ptr_t
*pp
;
4524 struct xfs_inobt_rec
*rp
;
4525 xfs_agblock_t agbno
;
4526 xfs_agblock_t end_agbno
;
4531 if (xfs_sb_version_hassparseinodes(&mp
->m_sb
))
4532 blks_per_buf
= xfs_icluster_size_fsb(mp
);
4534 blks_per_buf
= mp
->m_ialloc_blks
;
4535 inodes_per_buf
= min(blks_per_buf
<< mp
->m_sb
.sb_inopblog
,
4536 XFS_INODES_PER_CHUNK
);
4538 if (be32_to_cpu(block
->bb_magic
) != XFS_FIBT_MAGIC
&&
4539 be32_to_cpu(block
->bb_magic
) != XFS_FIBT_CRC_MAGIC
) {
4540 dbprintf(_("bad magic # %#x in finobt block %u/%u\n"),
4541 be32_to_cpu(block
->bb_magic
), seqno
, bno
);
4545 if (be16_to_cpu(block
->bb_level
) != level
) {
4547 dbprintf(_("expected level %d got %d in finobt block "
4549 level
, be16_to_cpu(block
->bb_level
), seqno
, bno
);
4552 set_dbmap(seqno
, bno
, 1, DBM_BTFINO
, seqno
, bno
);
4554 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_inobt_mxr
[0] ||
4555 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_inobt_mnr
[0])) {
4556 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in "
4557 "finobt block %u/%u\n"),
4558 be16_to_cpu(block
->bb_numrecs
), mp
->m_inobt_mnr
[0],
4559 mp
->m_inobt_mxr
[0], seqno
, bno
);
4563 rp
= XFS_INOBT_REC_ADDR(mp
, block
, 1);
4564 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++) {
4565 agino
= be32_to_cpu(rp
[i
].ir_startino
);
4566 agbno
= XFS_AGINO_TO_AGBNO(mp
, agino
);
4567 off
= XFS_AGINO_TO_OFFSET(mp
, agino
);
4568 end_agbno
= agbno
+ mp
->m_ialloc_blks
;
4570 if ((sbversion
& XFS_SB_VERSION_ALIGNBIT
) &&
4571 mp
->m_sb
.sb_inoalignmt
&&
4572 (XFS_INO_TO_AGBNO(mp
, agino
) %
4573 mp
->m_sb
.sb_inoalignmt
))
4574 sbversion
&= ~XFS_SB_VERSION_ALIGNBIT
;
4578 while (agbno
< end_agbno
&&
4579 ioff
< XFS_INODES_PER_CHUNK
) {
4580 if (xfs_inobt_is_sparse_disk(&rp
[i
], ioff
))
4583 check_set_dbmap(seqno
, agbno
,
4584 (xfs_extlen_t
)max(1,
4586 mp
->m_sb
.sb_inopblog
),
4587 DBM_INODE
, DBM_INODE
, seqno
, bno
);
4590 agbno
+= blks_per_buf
;
4591 ioff
+= inodes_per_buf
;
4597 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_inobt_mxr
[1] ||
4598 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_inobt_mnr
[1])) {
4599 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in finobt block "
4601 be16_to_cpu(block
->bb_numrecs
), mp
->m_inobt_mnr
[1],
4602 mp
->m_inobt_mxr
[1], seqno
, bno
);
4606 pp
= XFS_INOBT_PTR_ADDR(mp
, block
, 1, mp
->m_inobt_mxr
[1]);
4607 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++)
4608 scan_sbtree(agf
, be32_to_cpu(pp
[i
]), level
, 0, scanfunc_fino
, TYP_FINOBT
);
4613 struct xfs_btree_block
*block
,
4615 struct xfs_agf
*agf
,
4619 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4622 struct xfs_rmap_rec
*rp
;
4623 xfs_agblock_t lastblock
;
4625 if (be32_to_cpu(block
->bb_magic
) != XFS_RMAP_CRC_MAGIC
) {
4626 dbprintf(_("bad magic # %#x in rmapbt block %u/%u\n"),
4627 be32_to_cpu(block
->bb_magic
), seqno
, bno
);
4631 if (be16_to_cpu(block
->bb_level
) != level
) {
4633 dbprintf(_("expected level %d got %d in rmapbt block "
4635 level
, be16_to_cpu(block
->bb_level
), seqno
, bno
);
4642 set_dbmap(seqno
, bno
, 1, DBM_BTRMAP
, seqno
, bno
);
4644 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_rmap_mxr
[0] ||
4645 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_rmap_mnr
[0])) {
4646 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in "
4647 "rmapbt block %u/%u\n"),
4648 be16_to_cpu(block
->bb_numrecs
), mp
->m_rmap_mnr
[0],
4649 mp
->m_rmap_mxr
[0], seqno
, bno
);
4653 rp
= XFS_RMAP_REC_ADDR(block
, 1);
4655 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++) {
4656 if (be32_to_cpu(rp
[i
].rm_startblock
) < lastblock
) {
4658 "out-of-order rmap btree record %d (%u %u) block %u/%u\n"),
4659 i
, be32_to_cpu(rp
[i
].rm_startblock
),
4660 be32_to_cpu(rp
[i
].rm_startblock
),
4661 be32_to_cpu(agf
->agf_seqno
), bno
);
4663 lastblock
= be32_to_cpu(rp
[i
].rm_startblock
);
4668 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_rmap_mxr
[1] ||
4669 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_rmap_mnr
[1])) {
4670 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in rmapbt "
4672 be16_to_cpu(block
->bb_numrecs
), mp
->m_rmap_mnr
[1],
4673 mp
->m_rmap_mxr
[1], seqno
, bno
);
4677 pp
= XFS_RMAP_PTR_ADDR(block
, 1, mp
->m_rmap_mxr
[1]);
4678 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++)
4679 scan_sbtree(agf
, be32_to_cpu(pp
[i
]), level
, 0, scanfunc_rmap
,
4685 struct xfs_btree_block
*block
,
4687 struct xfs_agf
*agf
,
4691 xfs_agnumber_t seqno
= be32_to_cpu(agf
->agf_seqno
);
4693 xfs_refcount_ptr_t
*pp
;
4694 struct xfs_refcount_rec
*rp
;
4695 xfs_agblock_t lastblock
;
4697 if (be32_to_cpu(block
->bb_magic
) != XFS_REFC_CRC_MAGIC
) {
4698 dbprintf(_("bad magic # %#x in refcntbt block %u/%u\n"),
4699 be32_to_cpu(block
->bb_magic
), seqno
, bno
);
4703 if (be16_to_cpu(block
->bb_level
) != level
) {
4705 dbprintf(_("expected level %d got %d in refcntbt block "
4707 level
, be16_to_cpu(block
->bb_level
), seqno
, bno
);
4710 set_dbmap(seqno
, bno
, 1, DBM_BTREFC
, seqno
, bno
);
4712 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_refc_mxr
[0] ||
4713 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_refc_mnr
[0])) {
4714 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in "
4715 "refcntbt block %u/%u\n"),
4716 be16_to_cpu(block
->bb_numrecs
), mp
->m_refc_mnr
[0],
4717 mp
->m_refc_mxr
[0], seqno
, bno
);
4721 rp
= XFS_REFCOUNT_REC_ADDR(block
, 1);
4723 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++) {
4724 if (be32_to_cpu(rp
[i
].rc_refcount
) == 1) {
4725 xfs_agblock_t agbno
;
4728 agbno
= be32_to_cpu(rp
[i
].rc_startblock
);
4729 if (agbno
>= XFS_REFC_COW_START
) {
4730 agbno
-= XFS_REFC_COW_START
;
4732 "leftover CoW extent (%u/%u) len %u\n");
4735 "leftover CoW extent at unexpected address (%u/%u) len %u\n");
4740 be32_to_cpu(rp
[i
].rc_blockcount
));
4743 be32_to_cpu(rp
[i
].rc_blockcount
),
4744 DBM_COWDATA
, seqno
, bno
);
4747 be32_to_cpu(rp
[i
].rc_startblock
),
4748 be32_to_cpu(rp
[i
].rc_blockcount
),
4749 DBM_RLDATA
, seqno
, bno
);
4751 if (be32_to_cpu(rp
[i
].rc_startblock
) < lastblock
) {
4753 "out-of-order refcnt btree record %d (%u %u) block %u/%u\n"),
4754 i
, be32_to_cpu(rp
[i
].rc_startblock
),
4755 be32_to_cpu(rp
[i
].rc_startblock
),
4756 be32_to_cpu(agf
->agf_seqno
), bno
);
4758 lastblock
= be32_to_cpu(rp
[i
].rc_startblock
) +
4759 be32_to_cpu(rp
[i
].rc_blockcount
);
4764 if (be16_to_cpu(block
->bb_numrecs
) > mp
->m_refc_mxr
[1] ||
4765 (isroot
== 0 && be16_to_cpu(block
->bb_numrecs
) < mp
->m_refc_mnr
[1])) {
4766 dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in refcntbt "
4768 be16_to_cpu(block
->bb_numrecs
), mp
->m_refc_mnr
[1],
4769 mp
->m_refc_mxr
[1], seqno
, bno
);
4773 pp
= XFS_REFCOUNT_PTR_ADDR(block
, 1, mp
->m_refc_mxr
[1]);
4774 for (i
= 0; i
< be16_to_cpu(block
->bb_numrecs
); i
++)
4775 scan_sbtree(agf
, be32_to_cpu(pp
[i
]), level
, 0, scanfunc_refcnt
,
4781 xfs_agnumber_t agno
,
4782 xfs_agblock_t agbno
,
4785 xfs_agnumber_t c_agno
,
4786 xfs_agblock_t c_agbno
)
4788 check_set_dbmap(agno
, agbno
, len
, DBM_UNKNOWN
, type
, c_agno
, c_agbno
);
4793 xfs_agnumber_t agno
,
4794 xfs_agblock_t agbno
,
4802 if (!check_inomap(agno
, agbno
, len
, id
->ino
))
4804 mayprint
= verbose
| id
->ilist
| blist_size
;
4805 for (i
= 0, idp
= &inomap
[agno
][agbno
]; i
< len
; i
++, idp
++) {
4808 (verbose
|| id
->ilist
|| CHECK_BLISTA(agno
, agbno
+ i
)))
4809 dbprintf(_("setting inode to %lld for block %u/%u\n"),
4810 id
->ino
, agno
, agbno
+ i
);
4820 check_set_rdbmap(bno
, len
, DBM_UNKNOWN
, type
);
4833 if (!check_rinomap(bno
, len
, id
->ino
))
4835 mayprint
= verbose
| id
->ilist
| blist_size
;
4836 for (i
= 0, idp
= &inomap
[mp
->m_sb
.sb_agcount
][bno
];
4840 if (mayprint
&& (verbose
|| id
->ilist
|| CHECK_BLIST(bno
+ i
)))
4841 dbprintf(_("setting inode to %lld for rtblock %llu\n"),
4853 id
->link_set
= nlink
;
4855 id
->security
= security
;
4856 if (verbose
|| id
->ilist
)
4857 dbprintf(_("inode %lld nlink %u %s dir\n"), id
->ino
, nlink
,
4858 isdir
? "is" : "not");