diff options
author | Dave Chinner <dchinner@redhat.com> | 2010-03-07 19:26:03 -0500 |
---|---|---|
committer | Alex Elder <aelder@sgi.com> | 2010-05-19 10:58:08 -0400 |
commit | 8e123850863366b738d6dfb9a84045018ff038fc (patch) | |
tree | ffa0185553c55d235b920e5ff384310be33034c6 /fs/xfs/xfs_buf_item.c | |
parent | 4aaf15d1aa9673dd2cc45c48957c946cb4aa2694 (diff) |
xfs: remove stale parameter from ->iop_unpin method
The staleness of a object being unpinned can be directly derived
from the object itself - there is no need to extract it from the
object then pass it as a parameter into IOP_UNPIN().
This means we can kill the XFS_LID_BUF_STALE flag - it is set,
checked and cleared in the same places XFS_BLI_STALE flag in the
xfs_buf_log_item so it is now redundant and hence safe to remove.
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'fs/xfs/xfs_buf_item.c')
-rw-r--r-- | fs/xfs/xfs_buf_item.c | 50 |
1 files changed, 22 insertions, 28 deletions
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index aace237b4f46..240340a4727b 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c | |||
@@ -372,12 +372,12 @@ xfs_buf_item_pin( | |||
372 | */ | 372 | */ |
373 | STATIC void | 373 | STATIC void |
374 | xfs_buf_item_unpin( | 374 | xfs_buf_item_unpin( |
375 | xfs_buf_log_item_t *bip, | 375 | xfs_buf_log_item_t *bip) |
376 | int stale) | ||
377 | { | 376 | { |
378 | struct xfs_ail *ailp; | 377 | struct xfs_ail *ailp; |
379 | xfs_buf_t *bp; | 378 | xfs_buf_t *bp; |
380 | int freed; | 379 | int freed; |
380 | int stale = bip->bli_flags & XFS_BLI_STALE; | ||
381 | 381 | ||
382 | bp = bip->bli_buf; | 382 | bp = bip->bli_buf; |
383 | ASSERT(bp != NULL); | 383 | ASSERT(bp != NULL); |
@@ -428,40 +428,34 @@ xfs_buf_item_unpin_remove( | |||
428 | xfs_buf_log_item_t *bip, | 428 | xfs_buf_log_item_t *bip, |
429 | xfs_trans_t *tp) | 429 | xfs_trans_t *tp) |
430 | { | 430 | { |
431 | xfs_buf_t *bp; | 431 | /* will xfs_buf_item_unpin() call xfs_buf_item_relse()? */ |
432 | xfs_log_item_desc_t *lidp; | ||
433 | int stale = 0; | ||
434 | |||
435 | bp = bip->bli_buf; | ||
436 | /* | ||
437 | * will xfs_buf_item_unpin() call xfs_buf_item_relse()? | ||
438 | */ | ||
439 | if ((atomic_read(&bip->bli_refcount) == 1) && | 432 | if ((atomic_read(&bip->bli_refcount) == 1) && |
440 | (bip->bli_flags & XFS_BLI_STALE)) { | 433 | (bip->bli_flags & XFS_BLI_STALE)) { |
434 | /* | ||
435 | * yes -- We can safely do some work here and then call | ||
436 | * buf_item_unpin to do the rest because we are | ||
437 | * are holding the buffer locked so no one else will be | ||
438 | * able to bump up the refcount. We have to remove the | ||
439 | * log item from the transaction as we are about to release | ||
440 | * our reference to the buffer. If we don't, the unlock that | ||
441 | * occurs later in the xfs_trans_uncommit() will try to | ||
442 | * reference the buffer which we no longer have a hold on. | ||
443 | */ | ||
444 | struct xfs_log_item_desc *lidp; | ||
445 | |||
441 | ASSERT(XFS_BUF_VALUSEMA(bip->bli_buf) <= 0); | 446 | ASSERT(XFS_BUF_VALUSEMA(bip->bli_buf) <= 0); |
442 | trace_xfs_buf_item_unpin_stale(bip); | 447 | trace_xfs_buf_item_unpin_stale(bip); |
443 | 448 | ||
444 | /* | 449 | lidp = xfs_trans_find_item(tp, (xfs_log_item_t *)bip); |
445 | * yes -- clear the xaction descriptor in-use flag | ||
446 | * and free the chunk if required. We can safely | ||
447 | * do some work here and then call buf_item_unpin | ||
448 | * to do the rest because if the if is true, then | ||
449 | * we are holding the buffer locked so no one else | ||
450 | * will be able to bump up the refcount. | ||
451 | */ | ||
452 | lidp = xfs_trans_find_item(tp, (xfs_log_item_t *) bip); | ||
453 | stale = lidp->lid_flags & XFS_LID_BUF_STALE; | ||
454 | xfs_trans_free_item(tp, lidp); | 450 | xfs_trans_free_item(tp, lidp); |
451 | |||
455 | /* | 452 | /* |
456 | * Since the transaction no longer refers to the buffer, | 453 | * Since the transaction no longer refers to the buffer, the |
457 | * the buffer should no longer refer to the transaction. | 454 | * buffer should no longer refer to the transaction. |
458 | */ | 455 | */ |
459 | XFS_BUF_SET_FSPRIVATE2(bp, NULL); | 456 | XFS_BUF_SET_FSPRIVATE2(bip->bli_buf, NULL); |
460 | } | 457 | } |
461 | 458 | xfs_buf_item_unpin(bip); | |
462 | xfs_buf_item_unpin(bip, stale); | ||
463 | |||
464 | return; | ||
465 | } | 459 | } |
466 | 460 | ||
467 | /* | 461 | /* |
@@ -675,7 +669,7 @@ static struct xfs_item_ops xfs_buf_item_ops = { | |||
675 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) | 669 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) |
676 | xfs_buf_item_format, | 670 | xfs_buf_item_format, |
677 | .iop_pin = (void(*)(xfs_log_item_t*))xfs_buf_item_pin, | 671 | .iop_pin = (void(*)(xfs_log_item_t*))xfs_buf_item_pin, |
678 | .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_buf_item_unpin, | 672 | .iop_unpin = (void(*)(xfs_log_item_t*))xfs_buf_item_unpin, |
679 | .iop_unpin_remove = (void(*)(xfs_log_item_t*, xfs_trans_t *)) | 673 | .iop_unpin_remove = (void(*)(xfs_log_item_t*, xfs_trans_t *)) |
680 | xfs_buf_item_unpin_remove, | 674 | xfs_buf_item_unpin_remove, |
681 | .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_buf_item_trylock, | 675 | .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_buf_item_trylock, |