diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-12-30 20:48:25 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-12-30 20:48:25 -0500 |
commit | 6a94cb73064c952255336cc57731904174b2c58f (patch) | |
tree | d19cc835db0a21e01909a92772868e1ad96f99ff /fs/xfs/xfs_extfree_item.c | |
parent | f57fa1d6a6b3414e853d3d17e339ac48816e4406 (diff) | |
parent | 0a8c5395f90f06d128247844b2515c8bf3f2826b (diff) |
Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
* 'for-linus' of git://oss.sgi.com/xfs/xfs: (184 commits)
[XFS] Fix race in xfs_write() between direct and buffered I/O with DMAPI
[XFS] handle unaligned data in xfs_bmbt_disk_get_all
[XFS] avoid memory allocations in xfs_fs_vcmn_err
[XFS] Fix speculative allocation beyond eof
[XFS] Remove XFS_BUF_SHUT() and friends
[XFS] Use the incore inode size in xfs_file_readdir()
[XFS] set b_error from bio error in xfs_buf_bio_end_io
[XFS] use inode_change_ok for setattr permission checking
[XFS] add a FMODE flag to make XFS invisible I/O less hacky
[XFS] resync headers with libxfs
[XFS] simplify projid check in xfs_rename
[XFS] replace b_fspriv with b_mount
[XFS] Remove unused tracing code
[XFS] Remove unnecessary assertion
[XFS] Remove unused variable in ktrace_free()
[XFS] Check return value of xfs_buf_get_noaddr()
[XFS] Fix hang after disallowed rename across directory quota domains
[XFS] Fix compile with CONFIG_COMPAT enabled
move inode tracing out of xfs_vnode.
move vn_iowait / vn_iowake into xfs_aops.c
...
Diffstat (limited to 'fs/xfs/xfs_extfree_item.c')
-rw-r--r-- | fs/xfs/xfs_extfree_item.c | 45 |
1 files changed, 19 insertions, 26 deletions
diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index 8aa28f751b2a..05a4bdd4be39 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c | |||
@@ -108,19 +108,16 @@ xfs_efi_item_pin(xfs_efi_log_item_t *efip) | |||
108 | STATIC void | 108 | STATIC void |
109 | xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale) | 109 | xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale) |
110 | { | 110 | { |
111 | xfs_mount_t *mp; | 111 | struct xfs_ail *ailp = efip->efi_item.li_ailp; |
112 | 112 | ||
113 | mp = efip->efi_item.li_mountp; | 113 | spin_lock(&ailp->xa_lock); |
114 | spin_lock(&mp->m_ail_lock); | ||
115 | if (efip->efi_flags & XFS_EFI_CANCELED) { | 114 | if (efip->efi_flags & XFS_EFI_CANCELED) { |
116 | /* | 115 | /* xfs_trans_ail_delete() drops the AIL lock. */ |
117 | * xfs_trans_delete_ail() drops the AIL lock. | 116 | xfs_trans_ail_delete(ailp, (xfs_log_item_t *)efip); |
118 | */ | ||
119 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip); | ||
120 | xfs_efi_item_free(efip); | 117 | xfs_efi_item_free(efip); |
121 | } else { | 118 | } else { |
122 | efip->efi_flags |= XFS_EFI_COMMITTED; | 119 | efip->efi_flags |= XFS_EFI_COMMITTED; |
123 | spin_unlock(&mp->m_ail_lock); | 120 | spin_unlock(&ailp->xa_lock); |
124 | } | 121 | } |
125 | } | 122 | } |
126 | 123 | ||
@@ -134,26 +131,23 @@ xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale) | |||
134 | STATIC void | 131 | STATIC void |
135 | xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp) | 132 | xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp) |
136 | { | 133 | { |
137 | xfs_mount_t *mp; | 134 | struct xfs_ail *ailp = efip->efi_item.li_ailp; |
138 | xfs_log_item_desc_t *lidp; | 135 | xfs_log_item_desc_t *lidp; |
139 | 136 | ||
140 | mp = efip->efi_item.li_mountp; | 137 | spin_lock(&ailp->xa_lock); |
141 | spin_lock(&mp->m_ail_lock); | ||
142 | if (efip->efi_flags & XFS_EFI_CANCELED) { | 138 | if (efip->efi_flags & XFS_EFI_CANCELED) { |
143 | /* | 139 | /* |
144 | * free the xaction descriptor pointing to this item | 140 | * free the xaction descriptor pointing to this item |
145 | */ | 141 | */ |
146 | lidp = xfs_trans_find_item(tp, (xfs_log_item_t *) efip); | 142 | lidp = xfs_trans_find_item(tp, (xfs_log_item_t *) efip); |
147 | xfs_trans_free_item(tp, lidp); | 143 | xfs_trans_free_item(tp, lidp); |
148 | /* | 144 | |
149 | * pull the item off the AIL. | 145 | /* xfs_trans_ail_delete() drops the AIL lock. */ |
150 | * xfs_trans_delete_ail() drops the AIL lock. | 146 | xfs_trans_ail_delete(ailp, (xfs_log_item_t *)efip); |
151 | */ | ||
152 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip); | ||
153 | xfs_efi_item_free(efip); | 147 | xfs_efi_item_free(efip); |
154 | } else { | 148 | } else { |
155 | efip->efi_flags |= XFS_EFI_COMMITTED; | 149 | efip->efi_flags |= XFS_EFI_COMMITTED; |
156 | spin_unlock(&mp->m_ail_lock); | 150 | spin_unlock(&ailp->xa_lock); |
157 | } | 151 | } |
158 | } | 152 | } |
159 | 153 | ||
@@ -268,6 +262,7 @@ xfs_efi_init(xfs_mount_t *mp, | |||
268 | efip->efi_item.li_type = XFS_LI_EFI; | 262 | efip->efi_item.li_type = XFS_LI_EFI; |
269 | efip->efi_item.li_ops = &xfs_efi_item_ops; | 263 | efip->efi_item.li_ops = &xfs_efi_item_ops; |
270 | efip->efi_item.li_mountp = mp; | 264 | efip->efi_item.li_mountp = mp; |
265 | efip->efi_item.li_ailp = mp->m_ail; | ||
271 | efip->efi_format.efi_nextents = nextents; | 266 | efip->efi_format.efi_nextents = nextents; |
272 | efip->efi_format.efi_id = (__psint_t)(void*)efip; | 267 | efip->efi_format.efi_id = (__psint_t)(void*)efip; |
273 | 268 | ||
@@ -345,25 +340,22 @@ void | |||
345 | xfs_efi_release(xfs_efi_log_item_t *efip, | 340 | xfs_efi_release(xfs_efi_log_item_t *efip, |
346 | uint nextents) | 341 | uint nextents) |
347 | { | 342 | { |
348 | xfs_mount_t *mp; | 343 | struct xfs_ail *ailp = efip->efi_item.li_ailp; |
349 | int extents_left; | 344 | int extents_left; |
350 | 345 | ||
351 | mp = efip->efi_item.li_mountp; | ||
352 | ASSERT(efip->efi_next_extent > 0); | 346 | ASSERT(efip->efi_next_extent > 0); |
353 | ASSERT(efip->efi_flags & XFS_EFI_COMMITTED); | 347 | ASSERT(efip->efi_flags & XFS_EFI_COMMITTED); |
354 | 348 | ||
355 | spin_lock(&mp->m_ail_lock); | 349 | spin_lock(&ailp->xa_lock); |
356 | ASSERT(efip->efi_next_extent >= nextents); | 350 | ASSERT(efip->efi_next_extent >= nextents); |
357 | efip->efi_next_extent -= nextents; | 351 | efip->efi_next_extent -= nextents; |
358 | extents_left = efip->efi_next_extent; | 352 | extents_left = efip->efi_next_extent; |
359 | if (extents_left == 0) { | 353 | if (extents_left == 0) { |
360 | /* | 354 | /* xfs_trans_ail_delete() drops the AIL lock. */ |
361 | * xfs_trans_delete_ail() drops the AIL lock. | 355 | xfs_trans_ail_delete(ailp, (xfs_log_item_t *)efip); |
362 | */ | ||
363 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip); | ||
364 | xfs_efi_item_free(efip); | 356 | xfs_efi_item_free(efip); |
365 | } else { | 357 | } else { |
366 | spin_unlock(&mp->m_ail_lock); | 358 | spin_unlock(&ailp->xa_lock); |
367 | } | 359 | } |
368 | } | 360 | } |
369 | 361 | ||
@@ -565,6 +557,7 @@ xfs_efd_init(xfs_mount_t *mp, | |||
565 | efdp->efd_item.li_type = XFS_LI_EFD; | 557 | efdp->efd_item.li_type = XFS_LI_EFD; |
566 | efdp->efd_item.li_ops = &xfs_efd_item_ops; | 558 | efdp->efd_item.li_ops = &xfs_efd_item_ops; |
567 | efdp->efd_item.li_mountp = mp; | 559 | efdp->efd_item.li_mountp = mp; |
560 | efdp->efd_item.li_ailp = mp->m_ail; | ||
568 | efdp->efd_efip = efip; | 561 | efdp->efd_efip = efip; |
569 | efdp->efd_format.efd_nextents = nextents; | 562 | efdp->efd_format.efd_nextents = nextents; |
570 | efdp->efd_format.efd_efi_id = efip->efi_format.efi_id; | 563 | efdp->efd_format.efd_efi_id = efip->efi_format.efi_id; |