diff options
author | Christoph Hellwig <hch@infradead.org> | 2008-08-13 02:18:07 -0400 |
---|---|---|
committer | Lachlan McIlroy <lachlan@redback.melbourne.sgi.com> | 2008-08-13 02:18:07 -0400 |
commit | e1cccd917be7364f81b5dc4e33ee3a6e0db21a99 (patch) | |
tree | 9722a113d77695d886e6d2c1bc504e98cdb97b67 /fs/xfs/xfs_dfrag.c | |
parent | 1550d0b0b08bc34c0c37a86bd884b1a70782104e (diff) |
[XFS] kill xfs_lock_dir_and_entry
When multiple inodes are locked in XFS it happens in order of the inode
number, with the everything but the first inode trylocked if any of the
previous inodes is in the AIL.
Except for the sorting of the inodes this logic is implemented in
xfs_lock_inodes, but also partially duplicated in xfs_lock_dir_and_entry
in a particularly stupid way adds a lock roundtrip if the inode ordering
is not optimal.
This patch adds a new helper xfs_lock_two_inodes that takes two inodes and
locks them in the most optimal way according to the above locking protocol
and uses it for all places that want to lock two inodes.
The only caller of xfs_lock_inodes is xfs_rename which might lock up to
four inodes.
SGI-PV: 981498
SGI-Modid: xfs-linux-melb:xfs-kern:31772a
Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Donald Douwsma <donaldd@sgi.com>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_dfrag.c')
-rw-r--r-- | fs/xfs/xfs_dfrag.c | 14 |
1 files changed, 2 insertions, 12 deletions
diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c index d92407842e3b..5ce91a00425f 100644 --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c | |||
@@ -128,7 +128,6 @@ xfs_swap_extents( | |||
128 | xfs_swapext_t *sxp) | 128 | xfs_swapext_t *sxp) |
129 | { | 129 | { |
130 | xfs_mount_t *mp; | 130 | xfs_mount_t *mp; |
131 | xfs_inode_t *ips[2]; | ||
132 | xfs_trans_t *tp; | 131 | xfs_trans_t *tp; |
133 | xfs_bstat_t *sbp = &sxp->sx_stat; | 132 | xfs_bstat_t *sbp = &sxp->sx_stat; |
134 | bhv_vnode_t *vp, *tvp; | 133 | bhv_vnode_t *vp, *tvp; |
@@ -153,16 +152,7 @@ xfs_swap_extents( | |||
153 | vp = VFS_I(ip); | 152 | vp = VFS_I(ip); |
154 | tvp = VFS_I(tip); | 153 | tvp = VFS_I(tip); |
155 | 154 | ||
156 | /* Lock in i_ino order */ | 155 | xfs_lock_two_inodes(ip, tip, lock_flags); |
157 | if (ip->i_ino < tip->i_ino) { | ||
158 | ips[0] = ip; | ||
159 | ips[1] = tip; | ||
160 | } else { | ||
161 | ips[0] = tip; | ||
162 | ips[1] = ip; | ||
163 | } | ||
164 | |||
165 | xfs_lock_inodes(ips, 2, lock_flags); | ||
166 | locked = 1; | 156 | locked = 1; |
167 | 157 | ||
168 | /* Verify that both files have the same format */ | 158 | /* Verify that both files have the same format */ |
@@ -265,7 +255,7 @@ xfs_swap_extents( | |||
265 | locked = 0; | 255 | locked = 0; |
266 | goto error0; | 256 | goto error0; |
267 | } | 257 | } |
268 | xfs_lock_inodes(ips, 2, XFS_ILOCK_EXCL); | 258 | xfs_lock_two_inodes(ip, tip, XFS_ILOCK_EXCL); |
269 | 259 | ||
270 | /* | 260 | /* |
271 | * Count the number of extended attribute blocks | 261 | * Count the number of extended attribute blocks |