[PATCH 10/11] xfs: use xfs_ilock_attr_map_shared in xfs_attr_list_int

Christoph Hellwig
2013-12-06T20:31:30Z

[-- Attachment #1: xfs-attr-locking-2 --]
[-- Type: text/plain, Size: 1184 bytes --]

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>

Index: xfs/fs/xfs/xfs_attr_list.c
===================================================================
--- xfs.orig/fs/xfs/xfs_attr_list.c 2013-12-06 17:20:27.371331603 +0100
+++ xfs/fs/xfs/xfs_attr_list.c 2013-12-06 19:41:42.779157674 +0100
@@ -507,17 +507,17 @@ xfs_attr_list_int(
{
int error;
xfs_inode_t *dp = context->dp;
+ uint lock_mode;

XFS_STATS_INC(xs_attr_list);

if (XFS_FORCED_SHUTDOWN(dp->i_mount))
return EIO;

- xfs_ilock(dp, XFS_ILOCK_SHARED);
-
/*
* 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)) {
error = 0;
} else if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) {
@@ -527,9 +527,7 @@ xfs_attr_list_int(
} else {
error = xfs_attr_node_list(context);
}
-
- xfs_iunlock(dp, XFS_ILOCK_SHARED);
-
+ xfs_iunlock(dp, lock_mode);
return error;
}