xfs: use xfs_ilock_attr_map_shared in xfs_attr_list_int
We might not have read in the extent list at this point, so make sure we take the ilock exclusively if we have to do so. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
committed by
Ben Myers
parent
683cb94159
commit
568d994e9f
@@ -507,17 +507,17 @@ xfs_attr_list_int(
|
|||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
xfs_inode_t *dp = context->dp;
|
xfs_inode_t *dp = context->dp;
|
||||||
|
uint lock_mode;
|
||||||
|
|
||||||
XFS_STATS_INC(xs_attr_list);
|
XFS_STATS_INC(xs_attr_list);
|
||||||
|
|
||||||
if (XFS_FORCED_SHUTDOWN(dp->i_mount))
|
if (XFS_FORCED_SHUTDOWN(dp->i_mount))
|
||||||
return EIO;
|
return EIO;
|
||||||
|
|
||||||
xfs_ilock(dp, XFS_ILOCK_SHARED);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Decide on what work routines to call based on the inode size.
|
* Decide on what work routines to call based on the inode size.
|
||||||
*/
|
*/
|
||||||
|
lock_mode = xfs_ilock_attr_map_shared(dp);
|
||||||
if (!xfs_inode_hasattr(dp)) {
|
if (!xfs_inode_hasattr(dp)) {
|
||||||
error = 0;
|
error = 0;
|
||||||
} else if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) {
|
} else if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) {
|
||||||
@@ -527,9 +527,7 @@ xfs_attr_list_int(
|
|||||||
} else {
|
} else {
|
||||||
error = xfs_attr_node_list(context);
|
error = xfs_attr_node_list(context);
|
||||||
}
|
}
|
||||||
|
xfs_iunlock(dp, lock_mode);
|
||||||
xfs_iunlock(dp, XFS_ILOCK_SHARED);
|
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user