xfs: use xfs_ilock_attr_map_shared in xfs_attr_list_int
authorChristoph Hellwig <hch@infradead.org>
Fri, 6 Dec 2013 20:30:16 +0000 (12:30 -0800)
committerBen Myers <bpm@sgi.com>
Wed, 18 Dec 2013 22:08:04 +0000 (16:08 -0600)
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>
fs/xfs/xfs_attr_list.c

index 2d174b12815345b5aafacb7046caf6a0bc98d147..01db96f60cf05abf1f42e20252cdff4de0ebea0d 100644 (file)
@@ -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;
 }