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

Dave Chinner
2012-10-30T22:14:23Z

On Mon, Oct 29, 2012 at 08:23:09PM -0700, Phil White wrote:
> 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?

No, because there is a case where it isn't set.

In general, when factoring code it's not a good idea to change logic
because that's where bugs most commonly creep in. At some point in
the future this could probably do with a more robust cleanup (rather
than just factoring), but right now that's out-of-scope for what I'm
doing...

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com