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 | |
| 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)
| -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 | /* |
