1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
4 * Copyright (c) 2013 Red Hat, Inc.
9 #include "xfs_shared.h"
10 #include "xfs_format.h"
11 #include "xfs_log_format.h"
12 #include "xfs_trans_resv.h"
13 #include "xfs_mount.h"
14 #include "xfs_inode.h"
16 #include "xfs_dir2_priv.h"
17 #include "xfs_error.h"
18 #include "xfs_trans.h"
19 #include "xfs_buf_item.h"
21 #include "xfs_health.h"
23 static xfs_failaddr_t
xfs_dir2_data_freefind_verify(
24 struct xfs_dir2_data_hdr
*hdr
, struct xfs_dir2_data_free
*bf
,
25 struct xfs_dir2_data_unused
*dup
,
26 struct xfs_dir2_data_free
**bf_ent
);
28 struct xfs_dir2_data_free
*
29 xfs_dir2_data_bestfree_p(
31 struct xfs_dir2_data_hdr
*hdr
)
34 return ((struct xfs_dir3_data_hdr
*)hdr
)->best_free
;
39 * Pointer to an entry's tag word.
42 xfs_dir2_data_entry_tag_p(
44 struct xfs_dir2_data_entry
*dep
)
46 return (__be16
*)((char *)dep
+
47 xfs_dir2_data_entsize(mp
, dep
->namelen
) - sizeof(__be16
));
51 xfs_dir2_data_get_ftype(
53 struct xfs_dir2_data_entry
*dep
)
55 if (xfs_has_ftype(mp
)) {
56 uint8_t ftype
= dep
->name
[dep
->namelen
];
58 if (likely(ftype
< XFS_DIR3_FT_MAX
))
62 return XFS_DIR3_FT_UNKNOWN
;
66 xfs_dir2_data_put_ftype(
68 struct xfs_dir2_data_entry
*dep
,
71 ASSERT(ftype
< XFS_DIR3_FT_MAX
);
72 ASSERT(dep
->namelen
!= 0);
74 if (xfs_has_ftype(mp
))
75 dep
->name
[dep
->namelen
] = ftype
;
79 * The number of leaf entries is limited by the size of the block and the amount
80 * of space used by the data entries. We don't know how much space is used by
81 * the data entries yet, so just ensure that the count falls somewhere inside
82 * the block right now.
84 static inline unsigned int
85 xfs_dir2_data_max_leaf_entries(
86 struct xfs_da_geometry
*geo
)
88 return (geo
->blksize
- sizeof(struct xfs_dir2_block_tail
) -
89 geo
->data_entry_offset
) /
90 sizeof(struct xfs_dir2_leaf_entry
);
94 * Check the consistency of the data block.
95 * The input can also be a block-format directory.
96 * Return NULL if the buffer is good, otherwise the address of the error.
99 __xfs_dir3_data_check(
100 struct xfs_inode
*dp
, /* incore inode pointer */
101 struct xfs_buf
*bp
) /* data block's buffer */
103 xfs_dir2_dataptr_t addr
; /* addr for leaf lookup */
104 xfs_dir2_data_free_t
*bf
; /* bestfree table */
105 xfs_dir2_block_tail_t
*btp
=NULL
; /* block tail */
106 int count
; /* count of entries found */
107 xfs_dir2_data_hdr_t
*hdr
; /* data block header */
108 xfs_dir2_data_free_t
*dfp
; /* bestfree entry */
109 int freeseen
; /* mask of bestfrees seen */
110 xfs_dahash_t hash
; /* hash of current name */
111 int i
; /* leaf index */
112 int lastfree
; /* last entry was unused */
113 xfs_dir2_leaf_entry_t
*lep
=NULL
; /* block leaf entries */
114 struct xfs_mount
*mp
= bp
->b_mount
;
115 int stale
; /* count of stale leaves */
116 struct xfs_name name
;
119 struct xfs_da_geometry
*geo
= mp
->m_dir_geo
;
122 * If this isn't a directory, something is seriously wrong. Bail out.
124 if (dp
&& !S_ISDIR(VFS_I(dp
)->i_mode
))
125 return __this_address
;
128 offset
= geo
->data_entry_offset
;
130 switch (hdr
->magic
) {
131 case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC
):
132 case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC
):
133 btp
= xfs_dir2_block_tail_p(geo
, hdr
);
134 lep
= xfs_dir2_block_leaf_p(btp
);
136 if (be32_to_cpu(btp
->count
) >=
137 xfs_dir2_data_max_leaf_entries(geo
))
138 return __this_address
;
140 case cpu_to_be32(XFS_DIR3_DATA_MAGIC
):
141 case cpu_to_be32(XFS_DIR2_DATA_MAGIC
):
144 return __this_address
;
146 end
= xfs_dir3_data_end_offset(geo
, hdr
);
148 return __this_address
;
151 * Account for zero bestfree entries.
153 bf
= xfs_dir2_data_bestfree_p(mp
, hdr
);
154 count
= lastfree
= freeseen
= 0;
157 return __this_address
;
162 return __this_address
;
167 return __this_address
;
171 if (be16_to_cpu(bf
[0].length
) < be16_to_cpu(bf
[1].length
))
172 return __this_address
;
173 if (be16_to_cpu(bf
[1].length
) < be16_to_cpu(bf
[2].length
))
174 return __this_address
;
176 * Loop over the data/unused entries.
178 while (offset
< end
) {
179 struct xfs_dir2_data_unused
*dup
= bp
->b_addr
+ offset
;
180 struct xfs_dir2_data_entry
*dep
= bp
->b_addr
+ offset
;
184 * Are the remaining bytes large enough to hold an
187 if (offset
> end
- xfs_dir2_data_unusedsize(1))
188 return __this_address
;
191 * If it's unused, look for the space in the bestfree table.
192 * If we find it, account for that, else make sure it
193 * doesn't need to be there.
195 if (be16_to_cpu(dup
->freetag
) == XFS_DIR2_DATA_FREE_TAG
) {
198 reclen
= xfs_dir2_data_unusedsize(
199 be16_to_cpu(dup
->length
));
201 return __this_address
;
202 if (be16_to_cpu(dup
->length
) != reclen
)
203 return __this_address
;
204 if (offset
+ reclen
> end
)
205 return __this_address
;
206 if (be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup
)) !=
208 return __this_address
;
209 fa
= xfs_dir2_data_freefind_verify(hdr
, bf
, dup
, &dfp
);
214 if ((freeseen
& (1 << i
)) != 0)
215 return __this_address
;
218 if (be16_to_cpu(dup
->length
) >
219 be16_to_cpu(bf
[2].length
))
220 return __this_address
;
228 * This is not an unused entry. Are the remaining bytes
229 * large enough for a dirent with a single-byte name?
231 if (offset
> end
- xfs_dir2_data_entsize(mp
, 1))
232 return __this_address
;
235 * It's a real entry. Validate the fields.
236 * If this is a block directory then make sure it's
237 * in the leaf section of the block.
238 * The linear search is crude but this is DEBUG code.
240 if (dep
->namelen
== 0)
241 return __this_address
;
242 reclen
= xfs_dir2_data_entsize(mp
, dep
->namelen
);
243 if (offset
+ reclen
> end
)
244 return __this_address
;
245 if (!xfs_verify_dir_ino(mp
, be64_to_cpu(dep
->inumber
)))
246 return __this_address
;
247 if (be16_to_cpu(*xfs_dir2_data_entry_tag_p(mp
, dep
)) != offset
)
248 return __this_address
;
249 if (xfs_dir2_data_get_ftype(mp
, dep
) >= XFS_DIR3_FT_MAX
)
250 return __this_address
;
253 if (hdr
->magic
== cpu_to_be32(XFS_DIR2_BLOCK_MAGIC
) ||
254 hdr
->magic
== cpu_to_be32(XFS_DIR3_BLOCK_MAGIC
)) {
255 addr
= xfs_dir2_db_off_to_dataptr(geo
, geo
->datablk
,
256 (xfs_dir2_data_aoff_t
)
257 ((char *)dep
- (char *)hdr
));
258 name
.name
= dep
->name
;
259 name
.len
= dep
->namelen
;
260 hash
= xfs_dir2_hashname(mp
, &name
);
261 for (i
= 0; i
< be32_to_cpu(btp
->count
); i
++) {
262 if (be32_to_cpu(lep
[i
].address
) == addr
&&
263 be32_to_cpu(lep
[i
].hashval
) == hash
)
266 if (i
>= be32_to_cpu(btp
->count
))
267 return __this_address
;
272 * Need to have seen all the entries and all the bestfree slots.
275 return __this_address
;
276 if (hdr
->magic
== cpu_to_be32(XFS_DIR2_BLOCK_MAGIC
) ||
277 hdr
->magic
== cpu_to_be32(XFS_DIR3_BLOCK_MAGIC
)) {
278 for (i
= stale
= 0; i
< be32_to_cpu(btp
->count
); i
++) {
279 if (lep
[i
].address
==
280 cpu_to_be32(XFS_DIR2_NULL_DATAPTR
))
282 if (i
> 0 && be32_to_cpu(lep
[i
].hashval
) <
283 be32_to_cpu(lep
[i
- 1].hashval
))
284 return __this_address
;
286 if (count
!= be32_to_cpu(btp
->count
) - be32_to_cpu(btp
->stale
))
287 return __this_address
;
288 if (stale
!= be32_to_cpu(btp
->stale
))
289 return __this_address
;
297 struct xfs_inode
*dp
,
302 fa
= __xfs_dir3_data_check(dp
, bp
);
305 xfs_corruption_error(__func__
, XFS_ERRLEVEL_LOW
, dp
->i_mount
,
306 bp
->b_addr
, BBTOB(bp
->b_length
), __FILE__
, __LINE__
,
312 static xfs_failaddr_t
313 xfs_dir3_data_verify(
316 struct xfs_mount
*mp
= bp
->b_mount
;
317 struct xfs_dir3_blk_hdr
*hdr3
= bp
->b_addr
;
319 if (!xfs_verify_magic(bp
, hdr3
->magic
))
320 return __this_address
;
322 if (xfs_has_crc(mp
)) {
323 if (!uuid_equal(&hdr3
->uuid
, &mp
->m_sb
.sb_meta_uuid
))
324 return __this_address
;
325 if (be64_to_cpu(hdr3
->blkno
) != xfs_buf_daddr(bp
))
326 return __this_address
;
327 if (!xfs_log_check_lsn(mp
, be64_to_cpu(hdr3
->lsn
)))
328 return __this_address
;
330 return __xfs_dir3_data_check(NULL
, bp
);
334 * Readahead of the first block of the directory when it is opened is completely
335 * oblivious to the format of the directory. Hence we can either get a block
336 * format buffer or a data format buffer on readahead.
339 xfs_dir3_data_reada_verify(
342 struct xfs_dir2_data_hdr
*hdr
= bp
->b_addr
;
344 switch (hdr
->magic
) {
345 case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC
):
346 case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC
):
347 bp
->b_ops
= &xfs_dir3_block_buf_ops
;
348 bp
->b_ops
->verify_read(bp
);
350 case cpu_to_be32(XFS_DIR2_DATA_MAGIC
):
351 case cpu_to_be32(XFS_DIR3_DATA_MAGIC
):
352 bp
->b_ops
= &xfs_dir3_data_buf_ops
;
353 bp
->b_ops
->verify_read(bp
);
356 xfs_verifier_error(bp
, -EFSCORRUPTED
, __this_address
);
362 xfs_dir3_data_read_verify(
365 struct xfs_mount
*mp
= bp
->b_mount
;
368 if (xfs_has_crc(mp
) &&
369 !xfs_buf_verify_cksum(bp
, XFS_DIR3_DATA_CRC_OFF
))
370 xfs_verifier_error(bp
, -EFSBADCRC
, __this_address
);
372 fa
= xfs_dir3_data_verify(bp
);
374 xfs_verifier_error(bp
, -EFSCORRUPTED
, fa
);
379 xfs_dir3_data_write_verify(
382 struct xfs_mount
*mp
= bp
->b_mount
;
383 struct xfs_buf_log_item
*bip
= bp
->b_log_item
;
384 struct xfs_dir3_blk_hdr
*hdr3
= bp
->b_addr
;
387 fa
= xfs_dir3_data_verify(bp
);
389 xfs_verifier_error(bp
, -EFSCORRUPTED
, fa
);
393 if (!xfs_has_crc(mp
))
397 hdr3
->lsn
= cpu_to_be64(bip
->bli_item
.li_lsn
);
399 xfs_buf_update_cksum(bp
, XFS_DIR3_DATA_CRC_OFF
);
402 const struct xfs_buf_ops xfs_dir3_data_buf_ops
= {
403 .name
= "xfs_dir3_data",
404 .magic
= { cpu_to_be32(XFS_DIR2_DATA_MAGIC
),
405 cpu_to_be32(XFS_DIR3_DATA_MAGIC
) },
406 .verify_read
= xfs_dir3_data_read_verify
,
407 .verify_write
= xfs_dir3_data_write_verify
,
408 .verify_struct
= xfs_dir3_data_verify
,
411 static const struct xfs_buf_ops xfs_dir3_data_reada_buf_ops
= {
412 .name
= "xfs_dir3_data_reada",
413 .magic
= { cpu_to_be32(XFS_DIR2_DATA_MAGIC
),
414 cpu_to_be32(XFS_DIR3_DATA_MAGIC
) },
415 .verify_read
= xfs_dir3_data_reada_verify
,
416 .verify_write
= xfs_dir3_data_write_verify
,
420 xfs_dir3_data_header_check(
424 struct xfs_mount
*mp
= bp
->b_mount
;
426 if (xfs_has_crc(mp
)) {
427 struct xfs_dir3_data_hdr
*hdr3
= bp
->b_addr
;
429 if (hdr3
->hdr
.magic
!= cpu_to_be32(XFS_DIR3_DATA_MAGIC
))
430 return __this_address
;
432 if (be64_to_cpu(hdr3
->hdr
.owner
) != owner
)
433 return __this_address
;
441 struct xfs_trans
*tp
,
442 struct xfs_inode
*dp
,
446 struct xfs_buf
**bpp
)
451 err
= xfs_da_read_buf(tp
, dp
, bno
, flags
, bpp
, XFS_DATA_FORK
,
452 &xfs_dir3_data_buf_ops
);
456 /* Check things that we can't do in the verifier. */
457 fa
= xfs_dir3_data_header_check(*bpp
, owner
);
459 __xfs_buf_mark_corrupt(*bpp
, fa
);
460 xfs_trans_brelse(tp
, *bpp
);
462 xfs_dirattr_mark_sick(dp
, XFS_DATA_FORK
);
463 return -EFSCORRUPTED
;
466 xfs_trans_buf_set_type(tp
, *bpp
, XFS_BLFT_DIR_DATA_BUF
);
471 xfs_dir3_data_readahead(
472 struct xfs_inode
*dp
,
476 return xfs_da_reada_buf(dp
, bno
, flags
, XFS_DATA_FORK
,
477 &xfs_dir3_data_reada_buf_ops
);
481 * Find the bestfree entry that exactly coincides with unused directory space
482 * or a verifier error because the bestfree data are bad.
484 static xfs_failaddr_t
485 xfs_dir2_data_freefind_verify(
486 struct xfs_dir2_data_hdr
*hdr
,
487 struct xfs_dir2_data_free
*bf
,
488 struct xfs_dir2_data_unused
*dup
,
489 struct xfs_dir2_data_free
**bf_ent
)
491 struct xfs_dir2_data_free
*dfp
;
492 xfs_dir2_data_aoff_t off
;
493 bool matched
= false;
494 bool seenzero
= false;
497 off
= (xfs_dir2_data_aoff_t
)((char *)dup
- (char *)hdr
);
500 * Validate some consistency in the bestfree table.
501 * Check order, non-overlapping entries, and if we find the
502 * one we're looking for it has to be exact.
504 for (dfp
= &bf
[0]; dfp
< &bf
[XFS_DIR2_DATA_FD_COUNT
]; dfp
++) {
507 return __this_address
;
512 return __this_address
;
513 if (be16_to_cpu(dfp
->offset
) == off
) {
515 if (dfp
->length
!= dup
->length
)
516 return __this_address
;
517 } else if (be16_to_cpu(dfp
->offset
) > off
) {
518 if (off
+ be16_to_cpu(dup
->length
) >
519 be16_to_cpu(dfp
->offset
))
520 return __this_address
;
522 if (be16_to_cpu(dfp
->offset
) +
523 be16_to_cpu(dfp
->length
) > off
)
524 return __this_address
;
527 be16_to_cpu(dfp
->length
) < be16_to_cpu(dup
->length
))
528 return __this_address
;
530 be16_to_cpu(dfp
[-1].length
) < be16_to_cpu(dfp
[0].length
))
531 return __this_address
;
534 /* Looks ok so far; now try to match up with a bestfree entry. */
535 *bf_ent
= xfs_dir2_data_freefind(hdr
, bf
, dup
);
540 * Given a data block and an unused entry from that block,
541 * return the bestfree entry if any that corresponds to it.
543 xfs_dir2_data_free_t
*
544 xfs_dir2_data_freefind(
545 struct xfs_dir2_data_hdr
*hdr
, /* data block header */
546 struct xfs_dir2_data_free
*bf
, /* bestfree table pointer */
547 struct xfs_dir2_data_unused
*dup
) /* unused space */
549 xfs_dir2_data_free_t
*dfp
; /* bestfree entry */
550 xfs_dir2_data_aoff_t off
; /* offset value needed */
552 off
= (xfs_dir2_data_aoff_t
)((char *)dup
- (char *)hdr
);
555 * If this is smaller than the smallest bestfree entry,
556 * it can't be there since they're sorted.
558 if (be16_to_cpu(dup
->length
) <
559 be16_to_cpu(bf
[XFS_DIR2_DATA_FD_COUNT
- 1].length
))
562 * Look at the three bestfree entries for our guy.
564 for (dfp
= &bf
[0]; dfp
< &bf
[XFS_DIR2_DATA_FD_COUNT
]; dfp
++) {
567 if (be16_to_cpu(dfp
->offset
) == off
)
571 * Didn't find it. This only happens if there are duplicate lengths.
577 * Insert an unused-space entry into the bestfree table.
579 xfs_dir2_data_free_t
* /* entry inserted */
580 xfs_dir2_data_freeinsert(
581 struct xfs_dir2_data_hdr
*hdr
, /* data block pointer */
582 struct xfs_dir2_data_free
*dfp
, /* bestfree table pointer */
583 struct xfs_dir2_data_unused
*dup
, /* unused space */
584 int *loghead
) /* log the data header (out) */
586 xfs_dir2_data_free_t
new; /* new bestfree entry */
588 ASSERT(hdr
->magic
== cpu_to_be32(XFS_DIR2_DATA_MAGIC
) ||
589 hdr
->magic
== cpu_to_be32(XFS_DIR2_BLOCK_MAGIC
) ||
590 hdr
->magic
== cpu_to_be32(XFS_DIR3_DATA_MAGIC
) ||
591 hdr
->magic
== cpu_to_be32(XFS_DIR3_BLOCK_MAGIC
));
593 new.length
= dup
->length
;
594 new.offset
= cpu_to_be16((char *)dup
- (char *)hdr
);
597 * Insert at position 0, 1, or 2; or not at all.
599 if (be16_to_cpu(new.length
) > be16_to_cpu(dfp
[0].length
)) {
606 if (be16_to_cpu(new.length
) > be16_to_cpu(dfp
[1].length
)) {
612 if (be16_to_cpu(new.length
) > be16_to_cpu(dfp
[2].length
)) {
621 * Remove a bestfree entry from the table.
624 xfs_dir2_data_freeremove(
625 struct xfs_dir2_data_hdr
*hdr
, /* data block header */
626 struct xfs_dir2_data_free
*bf
, /* bestfree table pointer */
627 struct xfs_dir2_data_free
*dfp
, /* bestfree entry pointer */
628 int *loghead
) /* out: log data header */
631 ASSERT(hdr
->magic
== cpu_to_be32(XFS_DIR2_DATA_MAGIC
) ||
632 hdr
->magic
== cpu_to_be32(XFS_DIR2_BLOCK_MAGIC
) ||
633 hdr
->magic
== cpu_to_be32(XFS_DIR3_DATA_MAGIC
) ||
634 hdr
->magic
== cpu_to_be32(XFS_DIR3_BLOCK_MAGIC
));
637 * It's the first entry, slide the next 2 up.
644 * It's the second entry, slide the 3rd entry up.
646 else if (dfp
== &bf
[1])
649 * Must be the last entry.
652 ASSERT(dfp
== &bf
[2]);
654 * Clear the 3rd entry, must be zero now.
662 * Given a data block, reconstruct its bestfree map.
665 xfs_dir2_data_freescan(
666 struct xfs_mount
*mp
,
667 struct xfs_dir2_data_hdr
*hdr
,
670 struct xfs_da_geometry
*geo
= mp
->m_dir_geo
;
671 struct xfs_dir2_data_free
*bf
= xfs_dir2_data_bestfree_p(mp
, hdr
);
673 unsigned int offset
= geo
->data_entry_offset
;
676 ASSERT(hdr
->magic
== cpu_to_be32(XFS_DIR2_DATA_MAGIC
) ||
677 hdr
->magic
== cpu_to_be32(XFS_DIR3_DATA_MAGIC
) ||
678 hdr
->magic
== cpu_to_be32(XFS_DIR2_BLOCK_MAGIC
) ||
679 hdr
->magic
== cpu_to_be32(XFS_DIR3_BLOCK_MAGIC
));
682 * Start by clearing the table.
684 memset(bf
, 0, sizeof(*bf
) * XFS_DIR2_DATA_FD_COUNT
);
687 end
= xfs_dir3_data_end_offset(geo
, addr
);
688 while (offset
< end
) {
689 struct xfs_dir2_data_unused
*dup
= addr
+ offset
;
690 struct xfs_dir2_data_entry
*dep
= addr
+ offset
;
693 * If it's a free entry, insert it.
695 if (be16_to_cpu(dup
->freetag
) == XFS_DIR2_DATA_FREE_TAG
) {
697 be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup
)));
698 xfs_dir2_data_freeinsert(hdr
, bf
, dup
, loghead
);
699 offset
+= be16_to_cpu(dup
->length
);
704 * For active entries, check their tags and skip them.
707 be16_to_cpu(*xfs_dir2_data_entry_tag_p(mp
, dep
)));
708 offset
+= xfs_dir2_data_entsize(mp
, dep
->namelen
);
713 * Initialize a data block at the given block number in the directory.
714 * Give back the buffer for the created block.
718 struct xfs_da_args
*args
, /* directory operation args */
719 xfs_dir2_db_t blkno
, /* logical dir block number */
720 struct xfs_buf
**bpp
) /* output block buffer */
722 struct xfs_trans
*tp
= args
->trans
;
723 struct xfs_inode
*dp
= args
->dp
;
724 struct xfs_mount
*mp
= dp
->i_mount
;
725 struct xfs_da_geometry
*geo
= args
->geo
;
727 struct xfs_dir2_data_hdr
*hdr
;
728 struct xfs_dir2_data_unused
*dup
;
729 struct xfs_dir2_data_free
*bf
;
734 * Get the buffer set up for the block.
736 error
= xfs_da_get_buf(tp
, dp
, xfs_dir2_db_to_da(args
->geo
, blkno
),
740 bp
->b_ops
= &xfs_dir3_data_buf_ops
;
741 xfs_trans_buf_set_type(tp
, bp
, XFS_BLFT_DIR_DATA_BUF
);
744 * Initialize the header.
747 if (xfs_has_crc(mp
)) {
748 struct xfs_dir3_blk_hdr
*hdr3
= bp
->b_addr
;
750 memset(hdr3
, 0, sizeof(*hdr3
));
751 hdr3
->magic
= cpu_to_be32(XFS_DIR3_DATA_MAGIC
);
752 hdr3
->blkno
= cpu_to_be64(xfs_buf_daddr(bp
));
753 hdr3
->owner
= cpu_to_be64(args
->owner
);
754 uuid_copy(&hdr3
->uuid
, &mp
->m_sb
.sb_meta_uuid
);
757 hdr
->magic
= cpu_to_be32(XFS_DIR2_DATA_MAGIC
);
759 bf
= xfs_dir2_data_bestfree_p(mp
, hdr
);
760 bf
[0].offset
= cpu_to_be16(geo
->data_entry_offset
);
761 bf
[0].length
= cpu_to_be16(geo
->blksize
- geo
->data_entry_offset
);
762 for (i
= 1; i
< XFS_DIR2_DATA_FD_COUNT
; i
++) {
768 * Set up an unused entry for the block's body.
770 dup
= bp
->b_addr
+ geo
->data_entry_offset
;
771 dup
->freetag
= cpu_to_be16(XFS_DIR2_DATA_FREE_TAG
);
772 dup
->length
= bf
[0].length
;
773 *xfs_dir2_data_unused_tag_p(dup
) = cpu_to_be16((char *)dup
- (char *)hdr
);
776 * Log it and return it.
778 xfs_dir2_data_log_header(args
, bp
);
779 xfs_dir2_data_log_unused(args
, bp
, dup
);
785 * Log an active data entry from the block.
788 xfs_dir2_data_log_entry(
789 struct xfs_da_args
*args
,
791 xfs_dir2_data_entry_t
*dep
) /* data entry pointer */
793 struct xfs_mount
*mp
= bp
->b_mount
;
794 struct xfs_dir2_data_hdr
*hdr
= bp
->b_addr
;
796 ASSERT(hdr
->magic
== cpu_to_be32(XFS_DIR2_DATA_MAGIC
) ||
797 hdr
->magic
== cpu_to_be32(XFS_DIR3_DATA_MAGIC
) ||
798 hdr
->magic
== cpu_to_be32(XFS_DIR2_BLOCK_MAGIC
) ||
799 hdr
->magic
== cpu_to_be32(XFS_DIR3_BLOCK_MAGIC
));
801 xfs_trans_log_buf(args
->trans
, bp
, (uint
)((char *)dep
- (char *)hdr
),
802 (uint
)((char *)(xfs_dir2_data_entry_tag_p(mp
, dep
) + 1) -
807 * Log a data block header.
810 xfs_dir2_data_log_header(
811 struct xfs_da_args
*args
,
815 struct xfs_dir2_data_hdr
*hdr
= bp
->b_addr
;
817 ASSERT(hdr
->magic
== cpu_to_be32(XFS_DIR2_DATA_MAGIC
) ||
818 hdr
->magic
== cpu_to_be32(XFS_DIR3_DATA_MAGIC
) ||
819 hdr
->magic
== cpu_to_be32(XFS_DIR2_BLOCK_MAGIC
) ||
820 hdr
->magic
== cpu_to_be32(XFS_DIR3_BLOCK_MAGIC
));
823 xfs_trans_log_buf(args
->trans
, bp
, 0, args
->geo
->data_entry_offset
- 1);
827 * Log a data unused entry.
830 xfs_dir2_data_log_unused(
831 struct xfs_da_args
*args
,
833 xfs_dir2_data_unused_t
*dup
) /* data unused pointer */
835 xfs_dir2_data_hdr_t
*hdr
= bp
->b_addr
;
837 ASSERT(hdr
->magic
== cpu_to_be32(XFS_DIR2_DATA_MAGIC
) ||
838 hdr
->magic
== cpu_to_be32(XFS_DIR3_DATA_MAGIC
) ||
839 hdr
->magic
== cpu_to_be32(XFS_DIR2_BLOCK_MAGIC
) ||
840 hdr
->magic
== cpu_to_be32(XFS_DIR3_BLOCK_MAGIC
));
843 * Log the first part of the unused entry.
845 xfs_trans_log_buf(args
->trans
, bp
, (uint
)((char *)dup
- (char *)hdr
),
846 (uint
)((char *)&dup
->length
+ sizeof(dup
->length
) -
849 * Log the end (tag) of the unused entry.
851 xfs_trans_log_buf(args
->trans
, bp
,
852 (uint
)((char *)xfs_dir2_data_unused_tag_p(dup
) - (char *)hdr
),
853 (uint
)((char *)xfs_dir2_data_unused_tag_p(dup
) - (char *)hdr
+
854 sizeof(xfs_dir2_data_off_t
) - 1));
858 * Make a byte range in the data block unused.
859 * Its current contents are unimportant.
862 xfs_dir2_data_make_free(
863 struct xfs_da_args
*args
,
865 xfs_dir2_data_aoff_t offset
, /* starting byte offset */
866 xfs_dir2_data_aoff_t len
, /* length in bytes */
867 int *needlogp
, /* out: log header */
868 int *needscanp
) /* out: regen bestfree */
870 xfs_dir2_data_hdr_t
*hdr
; /* data block pointer */
871 xfs_dir2_data_free_t
*dfp
; /* bestfree pointer */
872 int needscan
; /* need to regen bestfree */
873 xfs_dir2_data_unused_t
*newdup
; /* new unused entry */
874 xfs_dir2_data_unused_t
*postdup
; /* unused entry after us */
875 xfs_dir2_data_unused_t
*prevdup
; /* unused entry before us */
877 struct xfs_dir2_data_free
*bf
;
882 * Figure out where the end of the data area is.
884 end
= xfs_dir3_data_end_offset(args
->geo
, hdr
);
888 * If this isn't the start of the block, then back up to
889 * the previous entry and see if it's free.
891 if (offset
> args
->geo
->data_entry_offset
) {
892 __be16
*tagp
; /* tag just before us */
894 tagp
= (__be16
*)((char *)hdr
+ offset
) - 1;
895 prevdup
= (xfs_dir2_data_unused_t
*)((char *)hdr
+ be16_to_cpu(*tagp
));
896 if (be16_to_cpu(prevdup
->freetag
) != XFS_DIR2_DATA_FREE_TAG
)
901 * If this isn't the end of the block, see if the entry after
904 if (offset
+ len
< end
) {
906 (xfs_dir2_data_unused_t
*)((char *)hdr
+ offset
+ len
);
907 if (be16_to_cpu(postdup
->freetag
) != XFS_DIR2_DATA_FREE_TAG
)
911 ASSERT(*needscanp
== 0);
914 * Previous and following entries are both free,
915 * merge everything into a single free entry.
917 bf
= xfs_dir2_data_bestfree_p(args
->dp
->i_mount
, hdr
);
918 if (prevdup
&& postdup
) {
919 xfs_dir2_data_free_t
*dfp2
; /* another bestfree pointer */
922 * See if prevdup and/or postdup are in bestfree table.
924 dfp
= xfs_dir2_data_freefind(hdr
, bf
, prevdup
);
925 dfp2
= xfs_dir2_data_freefind(hdr
, bf
, postdup
);
927 * We need a rescan unless there are exactly 2 free entries
928 * namely our two. Then we know what's happening, otherwise
929 * since the third bestfree is there, there might be more
932 needscan
= (bf
[2].length
!= 0);
934 * Fix up the new big freespace.
936 be16_add_cpu(&prevdup
->length
, len
+ be16_to_cpu(postdup
->length
));
937 *xfs_dir2_data_unused_tag_p(prevdup
) =
938 cpu_to_be16((char *)prevdup
- (char *)hdr
);
939 xfs_dir2_data_log_unused(args
, bp
, prevdup
);
942 * Has to be the case that entries 0 and 1 are
943 * dfp and dfp2 (don't know which is which), and
945 * Remove entry 1 first then entry 0.
953 xfs_dir2_data_freeremove(hdr
, bf
, dfp2
, needlogp
);
954 xfs_dir2_data_freeremove(hdr
, bf
, dfp
, needlogp
);
956 * Now insert the new entry.
958 dfp
= xfs_dir2_data_freeinsert(hdr
, bf
, prevdup
,
960 ASSERT(dfp
== &bf
[0]);
961 ASSERT(dfp
->length
== prevdup
->length
);
962 ASSERT(!dfp
[1].length
);
963 ASSERT(!dfp
[2].length
);
967 * The entry before us is free, merge with it.
970 dfp
= xfs_dir2_data_freefind(hdr
, bf
, prevdup
);
971 be16_add_cpu(&prevdup
->length
, len
);
972 *xfs_dir2_data_unused_tag_p(prevdup
) =
973 cpu_to_be16((char *)prevdup
- (char *)hdr
);
974 xfs_dir2_data_log_unused(args
, bp
, prevdup
);
976 * If the previous entry was in the table, the new entry
977 * is longer, so it will be in the table too. Remove
978 * the old one and add the new one.
981 xfs_dir2_data_freeremove(hdr
, bf
, dfp
, needlogp
);
982 xfs_dir2_data_freeinsert(hdr
, bf
, prevdup
, needlogp
);
985 * Otherwise we need a scan if the new entry is big enough.
988 needscan
= be16_to_cpu(prevdup
->length
) >
989 be16_to_cpu(bf
[2].length
);
993 * The following entry is free, merge with it.
996 dfp
= xfs_dir2_data_freefind(hdr
, bf
, postdup
);
997 newdup
= (xfs_dir2_data_unused_t
*)((char *)hdr
+ offset
);
998 newdup
->freetag
= cpu_to_be16(XFS_DIR2_DATA_FREE_TAG
);
999 newdup
->length
= cpu_to_be16(len
+ be16_to_cpu(postdup
->length
));
1000 *xfs_dir2_data_unused_tag_p(newdup
) =
1001 cpu_to_be16((char *)newdup
- (char *)hdr
);
1002 xfs_dir2_data_log_unused(args
, bp
, newdup
);
1004 * If the following entry was in the table, the new entry
1005 * is longer, so it will be in the table too. Remove
1006 * the old one and add the new one.
1009 xfs_dir2_data_freeremove(hdr
, bf
, dfp
, needlogp
);
1010 xfs_dir2_data_freeinsert(hdr
, bf
, newdup
, needlogp
);
1013 * Otherwise we need a scan if the new entry is big enough.
1016 needscan
= be16_to_cpu(newdup
->length
) >
1017 be16_to_cpu(bf
[2].length
);
1021 * Neither neighbor is free. Make a new entry.
1024 newdup
= (xfs_dir2_data_unused_t
*)((char *)hdr
+ offset
);
1025 newdup
->freetag
= cpu_to_be16(XFS_DIR2_DATA_FREE_TAG
);
1026 newdup
->length
= cpu_to_be16(len
);
1027 *xfs_dir2_data_unused_tag_p(newdup
) =
1028 cpu_to_be16((char *)newdup
- (char *)hdr
);
1029 xfs_dir2_data_log_unused(args
, bp
, newdup
);
1030 xfs_dir2_data_freeinsert(hdr
, bf
, newdup
, needlogp
);
1032 *needscanp
= needscan
;
1035 /* Check our free data for obvious signs of corruption. */
1036 static inline xfs_failaddr_t
1037 xfs_dir2_data_check_free(
1038 struct xfs_dir2_data_hdr
*hdr
,
1039 struct xfs_dir2_data_unused
*dup
,
1040 xfs_dir2_data_aoff_t offset
,
1041 xfs_dir2_data_aoff_t len
)
1043 if (hdr
->magic
!= cpu_to_be32(XFS_DIR2_DATA_MAGIC
) &&
1044 hdr
->magic
!= cpu_to_be32(XFS_DIR3_DATA_MAGIC
) &&
1045 hdr
->magic
!= cpu_to_be32(XFS_DIR2_BLOCK_MAGIC
) &&
1046 hdr
->magic
!= cpu_to_be32(XFS_DIR3_BLOCK_MAGIC
))
1047 return __this_address
;
1048 if (be16_to_cpu(dup
->freetag
) != XFS_DIR2_DATA_FREE_TAG
)
1049 return __this_address
;
1050 if (offset
< (char *)dup
- (char *)hdr
)
1051 return __this_address
;
1052 if (offset
+ len
> (char *)dup
+ be16_to_cpu(dup
->length
) - (char *)hdr
)
1053 return __this_address
;
1054 if ((char *)dup
- (char *)hdr
!=
1055 be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup
)))
1056 return __this_address
;
1060 /* Sanity-check a new bestfree entry. */
1061 static inline xfs_failaddr_t
1062 xfs_dir2_data_check_new_free(
1063 struct xfs_dir2_data_hdr
*hdr
,
1064 struct xfs_dir2_data_free
*dfp
,
1065 struct xfs_dir2_data_unused
*newdup
)
1068 return __this_address
;
1069 if (dfp
->length
!= newdup
->length
)
1070 return __this_address
;
1071 if (be16_to_cpu(dfp
->offset
) != (char *)newdup
- (char *)hdr
)
1072 return __this_address
;
1077 * Take a byte range out of an existing unused space and make it un-free.
1080 xfs_dir2_data_use_free(
1081 struct xfs_da_args
*args
,
1083 xfs_dir2_data_unused_t
*dup
, /* unused entry */
1084 xfs_dir2_data_aoff_t offset
, /* starting offset to use */
1085 xfs_dir2_data_aoff_t len
, /* length to use */
1086 int *needlogp
, /* out: need to log header */
1087 int *needscanp
) /* out: need regen bestfree */
1089 xfs_dir2_data_hdr_t
*hdr
; /* data block header */
1090 xfs_dir2_data_free_t
*dfp
; /* bestfree pointer */
1091 xfs_dir2_data_unused_t
*newdup
; /* new unused entry */
1092 xfs_dir2_data_unused_t
*newdup2
; /* another new unused entry */
1093 struct xfs_dir2_data_free
*bf
;
1095 int matchback
; /* matches end of freespace */
1096 int matchfront
; /* matches start of freespace */
1097 int needscan
; /* need to regen bestfree */
1098 int oldlen
; /* old unused entry's length */
1101 fa
= xfs_dir2_data_check_free(hdr
, dup
, offset
, len
);
1105 * Look up the entry in the bestfree table.
1107 oldlen
= be16_to_cpu(dup
->length
);
1108 bf
= xfs_dir2_data_bestfree_p(args
->dp
->i_mount
, hdr
);
1109 dfp
= xfs_dir2_data_freefind(hdr
, bf
, dup
);
1110 ASSERT(dfp
|| oldlen
<= be16_to_cpu(bf
[2].length
));
1112 * Check for alignment with front and back of the entry.
1114 matchfront
= (char *)dup
- (char *)hdr
== offset
;
1115 matchback
= (char *)dup
+ oldlen
- (char *)hdr
== offset
+ len
;
1116 ASSERT(*needscanp
== 0);
1119 * If we matched it exactly we just need to get rid of it from
1120 * the bestfree table.
1122 if (matchfront
&& matchback
) {
1124 needscan
= (bf
[2].offset
!= 0);
1126 xfs_dir2_data_freeremove(hdr
, bf
, dfp
,
1131 * We match the first part of the entry.
1132 * Make a new entry with the remaining freespace.
1134 else if (matchfront
) {
1135 newdup
= (xfs_dir2_data_unused_t
*)((char *)hdr
+ offset
+ len
);
1136 newdup
->freetag
= cpu_to_be16(XFS_DIR2_DATA_FREE_TAG
);
1137 newdup
->length
= cpu_to_be16(oldlen
- len
);
1138 *xfs_dir2_data_unused_tag_p(newdup
) =
1139 cpu_to_be16((char *)newdup
- (char *)hdr
);
1140 xfs_dir2_data_log_unused(args
, bp
, newdup
);
1142 * If it was in the table, remove it and add the new one.
1145 xfs_dir2_data_freeremove(hdr
, bf
, dfp
, needlogp
);
1146 dfp
= xfs_dir2_data_freeinsert(hdr
, bf
, newdup
,
1148 fa
= xfs_dir2_data_check_new_free(hdr
, dfp
, newdup
);
1152 * If we got inserted at the last slot,
1153 * that means we don't know if there was a better
1154 * choice for the last slot, or not. Rescan.
1156 needscan
= dfp
== &bf
[2];
1160 * We match the last part of the entry.
1161 * Trim the allocated space off the tail of the entry.
1163 else if (matchback
) {
1165 newdup
->length
= cpu_to_be16(((char *)hdr
+ offset
) - (char *)newdup
);
1166 *xfs_dir2_data_unused_tag_p(newdup
) =
1167 cpu_to_be16((char *)newdup
- (char *)hdr
);
1168 xfs_dir2_data_log_unused(args
, bp
, newdup
);
1170 * If it was in the table, remove it and add the new one.
1173 xfs_dir2_data_freeremove(hdr
, bf
, dfp
, needlogp
);
1174 dfp
= xfs_dir2_data_freeinsert(hdr
, bf
, newdup
,
1176 fa
= xfs_dir2_data_check_new_free(hdr
, dfp
, newdup
);
1180 * If we got inserted at the last slot,
1181 * that means we don't know if there was a better
1182 * choice for the last slot, or not. Rescan.
1184 needscan
= dfp
== &bf
[2];
1188 * Poking out the middle of an entry.
1189 * Make two new entries.
1193 newdup
->length
= cpu_to_be16(((char *)hdr
+ offset
) - (char *)newdup
);
1194 *xfs_dir2_data_unused_tag_p(newdup
) =
1195 cpu_to_be16((char *)newdup
- (char *)hdr
);
1196 xfs_dir2_data_log_unused(args
, bp
, newdup
);
1197 newdup2
= (xfs_dir2_data_unused_t
*)((char *)hdr
+ offset
+ len
);
1198 newdup2
->freetag
= cpu_to_be16(XFS_DIR2_DATA_FREE_TAG
);
1199 newdup2
->length
= cpu_to_be16(oldlen
- len
- be16_to_cpu(newdup
->length
));
1200 *xfs_dir2_data_unused_tag_p(newdup2
) =
1201 cpu_to_be16((char *)newdup2
- (char *)hdr
);
1202 xfs_dir2_data_log_unused(args
, bp
, newdup2
);
1204 * If the old entry was in the table, we need to scan
1205 * if the 3rd entry was valid, since these entries
1206 * are smaller than the old one.
1207 * If we don't need to scan that means there were 1 or 2
1208 * entries in the table, and removing the old and adding
1209 * the 2 new will work.
1212 needscan
= (bf
[2].length
!= 0);
1214 xfs_dir2_data_freeremove(hdr
, bf
, dfp
,
1216 xfs_dir2_data_freeinsert(hdr
, bf
, newdup
,
1218 xfs_dir2_data_freeinsert(hdr
, bf
, newdup2
,
1223 *needscanp
= needscan
;
1226 xfs_corruption_error(__func__
, XFS_ERRLEVEL_LOW
, args
->dp
->i_mount
,
1227 hdr
, sizeof(*hdr
), __FILE__
, __LINE__
, fa
);
1228 xfs_da_mark_sick(args
);
1229 return -EFSCORRUPTED
;
1232 /* Find the end of the entry data in a data/block format dir block. */
1234 xfs_dir3_data_end_offset(
1235 struct xfs_da_geometry
*geo
,
1236 struct xfs_dir2_data_hdr
*hdr
)
1240 switch (hdr
->magic
) {
1241 case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC
):
1242 case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC
):
1243 p
= xfs_dir2_block_leaf_p(xfs_dir2_block_tail_p(geo
, hdr
));
1244 return p
- (void *)hdr
;
1245 case cpu_to_be32(XFS_DIR3_DATA_MAGIC
):
1246 case cpu_to_be32(XFS_DIR2_DATA_MAGIC
):
1247 return geo
->blksize
;