]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: xfs_attr_shortform_allfit() does not handle attr3 format.
authorDave Chinner <dchinner@redhat.com>
Fri, 7 Jun 2013 12:24:52 +0000 (22:24 +1000)
committerBen Myers <bpm@sgi.com>
Tue, 6 Aug 2013 21:25:27 +0000 (16:25 -0500)
xfstests generic/117 fails with:

XFS: Assertion failed: leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)

indicating a function that does not handle the attr3 format
correctly. Fix it.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Ben Myers <bpm@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
libxfs/xfs_attr_leaf.c

index b28266a2e0ff7fa9f28d7feed800868cfe6d094c..881f4172a8b3c12a44003385c48d670a48d34f66 100644 (file)
@@ -720,20 +720,22 @@ out:
  */
 int
 xfs_attr_shortform_allfit(
-       struct xfs_buf  *bp,
-       struct xfs_inode *dp)
+       struct xfs_buf          *bp,
+       struct xfs_inode        *dp)
 {
-       xfs_attr_leafblock_t *leaf;
-       xfs_attr_leaf_entry_t *entry;
+       struct xfs_attr_leafblock *leaf;
+       struct xfs_attr_leaf_entry *entry;
        xfs_attr_leaf_name_local_t *name_loc;
-       int bytes, i;
+       struct xfs_attr3_icleaf_hdr leafhdr;
+       int                     bytes;
+       int                     i;
 
        leaf = bp->b_addr;
-       ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC));
+       xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf);
+       entry = xfs_attr3_leaf_entryp(leaf);
 
-       entry = &leaf->entries[0];
        bytes = sizeof(struct xfs_attr_sf_hdr);
-       for (i = 0; i < be16_to_cpu(leaf->hdr.count); entry++, i++) {
+       for (i = 0; i < leafhdr.count; entry++, i++) {
                if (entry->flags & XFS_ATTR_INCOMPLETE)
                        continue;               /* don't copy partial entries */
                if (!(entry->flags & XFS_ATTR_LOCAL))
@@ -743,15 +745,15 @@ xfs_attr_shortform_allfit(
                        return(0);
                if (be16_to_cpu(name_loc->valuelen) >= XFS_ATTR_SF_ENTSIZE_MAX)
                        return(0);
-               bytes += sizeof(struct xfs_attr_sf_entry)-1
+               bytes += sizeof(struct xfs_attr_sf_entry) - 1
                                + name_loc->namelen
                                + be16_to_cpu(name_loc->valuelen);
        }
        if ((dp->i_mount->m_flags & XFS_MOUNT_ATTR2) &&
            (dp->i_d.di_format != XFS_DINODE_FMT_BTREE) &&
            (bytes == sizeof(struct xfs_attr_sf_hdr)))
-               return(-1);
-       return(xfs_attr_shortform_bytesfit(dp, bytes));
+               return -1;
+       return xfs_attr_shortform_bytesfit(dp, bytes);
 }
 
 /*