diff options
author | Dave Chinner <dchinner@redhat.com> | 2013-05-19 19:51:14 -0400 |
---|---|---|
committer | Ben Myers <bpm@sgi.com> | 2013-05-24 17:29:56 -0400 |
commit | cf257abf02709dba3cc745d950f144ce49432b4f (patch) | |
tree | 0f4a99c719be780ba023094459df39c5240a00bb /fs | |
parent | 7ced60cae46cb37273a03c196e6f473b089bd8e1 (diff) |
xfs: xfs_attr_shortform_allfit() does not handle attr3 format.
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>
(cherry picked from commit b38958d715316031fe9ea0cc6c22043072a55f49)
Diffstat (limited to 'fs')
-rw-r--r-- | fs/xfs/xfs_attr_leaf.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 08d5457c948e..8eeb88fb3201 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c | |||
@@ -931,20 +931,22 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) | |||
931 | */ | 931 | */ |
932 | int | 932 | int |
933 | xfs_attr_shortform_allfit( | 933 | xfs_attr_shortform_allfit( |
934 | struct xfs_buf *bp, | 934 | struct xfs_buf *bp, |
935 | struct xfs_inode *dp) | 935 | struct xfs_inode *dp) |
936 | { | 936 | { |
937 | xfs_attr_leafblock_t *leaf; | 937 | struct xfs_attr_leafblock *leaf; |
938 | xfs_attr_leaf_entry_t *entry; | 938 | struct xfs_attr_leaf_entry *entry; |
939 | xfs_attr_leaf_name_local_t *name_loc; | 939 | xfs_attr_leaf_name_local_t *name_loc; |
940 | int bytes, i; | 940 | struct xfs_attr3_icleaf_hdr leafhdr; |
941 | int bytes; | ||
942 | int i; | ||
941 | 943 | ||
942 | leaf = bp->b_addr; | 944 | leaf = bp->b_addr; |
943 | ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); | 945 | xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); |
946 | entry = xfs_attr3_leaf_entryp(leaf); | ||
944 | 947 | ||
945 | entry = &leaf->entries[0]; | ||
946 | bytes = sizeof(struct xfs_attr_sf_hdr); | 948 | bytes = sizeof(struct xfs_attr_sf_hdr); |
947 | for (i = 0; i < be16_to_cpu(leaf->hdr.count); entry++, i++) { | 949 | for (i = 0; i < leafhdr.count; entry++, i++) { |
948 | if (entry->flags & XFS_ATTR_INCOMPLETE) | 950 | if (entry->flags & XFS_ATTR_INCOMPLETE) |
949 | continue; /* don't copy partial entries */ | 951 | continue; /* don't copy partial entries */ |
950 | if (!(entry->flags & XFS_ATTR_LOCAL)) | 952 | if (!(entry->flags & XFS_ATTR_LOCAL)) |
@@ -954,15 +956,15 @@ xfs_attr_shortform_allfit( | |||
954 | return(0); | 956 | return(0); |
955 | if (be16_to_cpu(name_loc->valuelen) >= XFS_ATTR_SF_ENTSIZE_MAX) | 957 | if (be16_to_cpu(name_loc->valuelen) >= XFS_ATTR_SF_ENTSIZE_MAX) |
956 | return(0); | 958 | return(0); |
957 | bytes += sizeof(struct xfs_attr_sf_entry)-1 | 959 | bytes += sizeof(struct xfs_attr_sf_entry) - 1 |
958 | + name_loc->namelen | 960 | + name_loc->namelen |
959 | + be16_to_cpu(name_loc->valuelen); | 961 | + be16_to_cpu(name_loc->valuelen); |
960 | } | 962 | } |
961 | if ((dp->i_mount->m_flags & XFS_MOUNT_ATTR2) && | 963 | if ((dp->i_mount->m_flags & XFS_MOUNT_ATTR2) && |
962 | (dp->i_d.di_format != XFS_DINODE_FMT_BTREE) && | 964 | (dp->i_d.di_format != XFS_DINODE_FMT_BTREE) && |
963 | (bytes == sizeof(struct xfs_attr_sf_hdr))) | 965 | (bytes == sizeof(struct xfs_attr_sf_hdr))) |
964 | return(-1); | 966 | return -1; |
965 | return(xfs_attr_shortform_bytesfit(dp, bytes)); | 967 | return xfs_attr_shortform_bytesfit(dp, bytes); |
966 | } | 968 | } |
967 | 969 | ||
968 | /* | 970 | /* |