diff options
author | Christoph Hellwig <hch@infradead.org> | 2013-12-18 05:14:39 -0500 |
---|---|---|
committer | Ben Myers <bpm@sgi.com> | 2013-12-18 16:48:44 -0500 |
commit | efa70be165497826f674846f681e6e2364af906c (patch) | |
tree | 484e876ef92c632e062ccac613f9a066f4b714db /fs/xfs/xfs_inode.c | |
parent | 309ecac8e7c937c5811ef8f0efc14b3d1bd18775 (diff) |
xfs: add xfs_ilock_attr_map_shared
Equivalent to xfs_ilock_data_map_shared, except for the attribute fork.
Make xfs_getbmap use it if called for the attribute fork instead of
xfs_ilock_data_map_shared.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Ben Myers <bpm@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_inode.c')
-rw-r--r-- | fs/xfs/xfs_inode.c | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index fdd483783365..e655bb07e8bb 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
@@ -77,17 +77,18 @@ xfs_get_extsz_hint( | |||
77 | } | 77 | } |
78 | 78 | ||
79 | /* | 79 | /* |
80 | * This is a wrapper routine around the xfs_ilock() routine used to centralize | 80 | * These two are wrapper routines around the xfs_ilock() routine used to |
81 | * some grungy code. It is used in places that wish to lock the inode solely | 81 | * centralize some grungy code. They are used in places that wish to lock the |
82 | * for reading the extents. The reason these places can't just call | 82 | * inode solely for reading the extents. The reason these places can't just |
83 | * xfs_ilock(SHARED) is that the inode lock also guards to bringing in of the | 83 | * call xfs_ilock(ip, XFS_ILOCK_SHARED) is that the inode lock also guards to |
84 | * extents from disk for a file in b-tree format. If the inode is in b-tree | 84 | * bringing in of the extents from disk for a file in b-tree format. If the |
85 | * format, then we need to lock the inode exclusively until the extents are read | 85 | * inode is in b-tree format, then we need to lock the inode exclusively until |
86 | * in. Locking it exclusively all the time would limit our parallelism | 86 | * the extents are read in. Locking it exclusively all the time would limit |
87 | * unnecessarily, though. What we do instead is check to see if the extents | 87 | * our parallelism unnecessarily, though. What we do instead is check to see |
88 | * have been read in yet, and only lock the inode exclusively if they have not. | 88 | * if the extents have been read in yet, and only lock the inode exclusively |
89 | * if they have not. | ||
89 | * | 90 | * |
90 | * The function returns a value which should be given to the corresponding | 91 | * The functions return a value which should be given to the corresponding |
91 | * xfs_iunlock() call. | 92 | * xfs_iunlock() call. |
92 | */ | 93 | */ |
93 | uint | 94 | uint |
@@ -103,6 +104,19 @@ xfs_ilock_data_map_shared( | |||
103 | return lock_mode; | 104 | return lock_mode; |
104 | } | 105 | } |
105 | 106 | ||
107 | uint | ||
108 | xfs_ilock_attr_map_shared( | ||
109 | struct xfs_inode *ip) | ||
110 | { | ||
111 | uint lock_mode = XFS_ILOCK_SHARED; | ||
112 | |||
113 | if (ip->i_d.di_aformat == XFS_DINODE_FMT_BTREE && | ||
114 | (ip->i_afp->if_flags & XFS_IFEXTENTS) == 0) | ||
115 | lock_mode = XFS_ILOCK_EXCL; | ||
116 | xfs_ilock(ip, lock_mode); | ||
117 | return lock_mode; | ||
118 | } | ||
119 | |||
106 | /* | 120 | /* |
107 | * The xfs inode contains 2 locks: a multi-reader lock called the | 121 | * The xfs inode contains 2 locks: a multi-reader lock called the |
108 | * i_iolock and a multi-reader lock called the i_lock. This routine | 122 | * i_iolock and a multi-reader lock called the i_lock. This routine |