Re: [PATCH 13/25] xfs: factor dir2 block read operations

Phil White
2012-10-30T17:56:15Z

On Thu, Oct 25, 2012 at 05:34:02PM +1100, Dave Chinner wrote:
> +static void
> +xfs_dir2_block_need_space(
> ...
> + /*
> + * If there are stale entries we'll use one for the leaf.
> + */
> + if (btp->stale) {
> + if (be16_to_cpu(bf[0].length) >= len) {
> + /*
> + * The biggest entry enough to avoid compaction.
> + */
> + dup = (xfs_dir2_data_unused_t *)
> + ((char *)hdr + be16_to_cpu(bf[0].offset));
> + goto out;
> + }
> +
> + /*
> + * Will need to compact to make this work.
> + * Tag just before the first leaf entry.
> + */
> + *compact = 1;
> + tagp = (__be16 *)blp - 1;
> +
> + /* Data object just before the first leaf entry. */
> + dup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp));
> +
> + /*
> + * If it's not free then the data will go where the
> + * leaf data starts now, if it works at all.
> + */
> + if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) {
> + if (be16_to_cpu(dup->length) + (be32_to_cpu(btp->stale) - 1) *
> + (uint)sizeof(*blp) < len)
> + dup = NULL;
> + } else if ((be32_to_cpu(btp->stale) - 1) * (uint)sizeof(*blp) < len)
> + dup = NULL;
> + else
> + dup = (xfs_dir2_data_unused_t *)blp;
> + goto out;
> + }
> +
> + /*
> + * no stale entries, so just use free space.
> + * Tag just before the first leaf entry.
> + */
> + tagp = (__be16 *)blp - 1;

Shouldn't tagp just be set before this if statement rather than inside of it
and outside of it? In both cases it's equated to blp-1 and the value of blp
doesn't change to the best of my knowledge, so it's confusing to have two
assignments.

-Phil