diff options
author | Christoph Hellwig <hch@infradead.org> | 2012-02-19 21:31:22 -0500 |
---|---|---|
committer | Ben Myers <bpm@sgi.com> | 2012-02-22 23:17:00 -0500 |
commit | 5b03ff1b2444ddf7b8084b7505101e97257aff5a (patch) | |
tree | 25f783fa62973601e40d6af29ccf44a51b35267a /fs | |
parent | 3af1de753b3caf9fa3762b4b1b85d833c121847e (diff) |
xfs: remove xfs_trans_unlocked_item
There is no reason to wake up log space waiters when unlocking inodes or
dquots, and the commit log has no explanation for this function either.
Given that we now have exact log space wakeups everywhere we can assume
the reason for this function was to paper over log space races in earlier
XFS versions.
Reviewed-by: Mark Tinguely <tinguely@sgi.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/xfs/xfs_dquot.c | 11 | ||||
-rw-r--r-- | fs/xfs/xfs_dquot.h | 3 | ||||
-rw-r--r-- | fs/xfs/xfs_iget.c | 13 | ||||
-rw-r--r-- | fs/xfs/xfs_inode.h | 4 | ||||
-rw-r--r-- | fs/xfs/xfs_inode_item.c | 6 | ||||
-rw-r--r-- | fs/xfs/xfs_trans_ail.c | 44 | ||||
-rw-r--r-- | fs/xfs/xfs_trans_buf.c | 25 | ||||
-rw-r--r-- | fs/xfs/xfs_trans_priv.h | 3 |
8 files changed, 5 insertions, 104 deletions
diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 4e268edcf3f6..71e615fef174 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c | |||
@@ -1076,17 +1076,6 @@ xfs_qm_dqflush( | |||
1076 | 1076 | ||
1077 | } | 1077 | } |
1078 | 1078 | ||
1079 | void | ||
1080 | xfs_dqunlock( | ||
1081 | xfs_dquot_t *dqp) | ||
1082 | { | ||
1083 | xfs_dqunlock_nonotify(dqp); | ||
1084 | if (dqp->q_logitem.qli_dquot == dqp) { | ||
1085 | xfs_trans_unlocked_item(dqp->q_logitem.qli_item.li_ailp, | ||
1086 | &dqp->q_logitem.qli_item); | ||
1087 | } | ||
1088 | } | ||
1089 | |||
1090 | /* | 1079 | /* |
1091 | * Lock two xfs_dquot structures. | 1080 | * Lock two xfs_dquot structures. |
1092 | * | 1081 | * |
diff --git a/fs/xfs/xfs_dquot.h b/fs/xfs/xfs_dquot.h index 48a795b141b6..60b0d72b0241 100644 --- a/fs/xfs/xfs_dquot.h +++ b/fs/xfs/xfs_dquot.h | |||
@@ -110,7 +110,7 @@ static inline void xfs_dqlock(struct xfs_dquot *dqp) | |||
110 | mutex_lock(&dqp->q_qlock); | 110 | mutex_lock(&dqp->q_qlock); |
111 | } | 111 | } |
112 | 112 | ||
113 | static inline void xfs_dqunlock_nonotify(struct xfs_dquot *dqp) | 113 | static inline void xfs_dqunlock(struct xfs_dquot *dqp) |
114 | { | 114 | { |
115 | mutex_unlock(&dqp->q_qlock); | 115 | mutex_unlock(&dqp->q_qlock); |
116 | } | 116 | } |
@@ -166,7 +166,6 @@ extern int xfs_qm_dqget(xfs_mount_t *, xfs_inode_t *, | |||
166 | extern void xfs_qm_dqput(xfs_dquot_t *); | 166 | extern void xfs_qm_dqput(xfs_dquot_t *); |
167 | 167 | ||
168 | extern void xfs_dqlock2(struct xfs_dquot *, struct xfs_dquot *); | 168 | extern void xfs_dqlock2(struct xfs_dquot *, struct xfs_dquot *); |
169 | extern void xfs_dqunlock(struct xfs_dquot *); | ||
170 | extern void xfs_dqflock_pushbuf_wait(struct xfs_dquot *dqp); | 169 | extern void xfs_dqflock_pushbuf_wait(struct xfs_dquot *dqp); |
171 | 170 | ||
172 | static inline struct xfs_dquot *xfs_qm_dqhold(struct xfs_dquot *dqp) | 171 | static inline struct xfs_dquot *xfs_qm_dqhold(struct xfs_dquot *dqp) |
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 8c3e46394d48..19dcfb2aac9a 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c | |||
@@ -642,8 +642,7 @@ xfs_iunlock( | |||
642 | (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)); | 642 | (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)); |
643 | ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != | 643 | ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != |
644 | (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); | 644 | (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); |
645 | ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_IUNLOCK_NONOTIFY | | 645 | ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); |
646 | XFS_LOCK_DEP_MASK)) == 0); | ||
647 | ASSERT(lock_flags != 0); | 646 | ASSERT(lock_flags != 0); |
648 | 647 | ||
649 | if (lock_flags & XFS_IOLOCK_EXCL) | 648 | if (lock_flags & XFS_IOLOCK_EXCL) |
@@ -656,16 +655,6 @@ xfs_iunlock( | |||
656 | else if (lock_flags & XFS_ILOCK_SHARED) | 655 | else if (lock_flags & XFS_ILOCK_SHARED) |
657 | mrunlock_shared(&ip->i_lock); | 656 | mrunlock_shared(&ip->i_lock); |
658 | 657 | ||
659 | if ((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) && | ||
660 | !(lock_flags & XFS_IUNLOCK_NONOTIFY) && ip->i_itemp) { | ||
661 | /* | ||
662 | * Let the AIL know that this item has been unlocked in case | ||
663 | * it is in the AIL and anyone is waiting on it. Don't do | ||
664 | * this if the caller has asked us not to. | ||
665 | */ | ||
666 | xfs_trans_unlocked_item(ip->i_itemp->ili_item.li_ailp, | ||
667 | (xfs_log_item_t*)(ip->i_itemp)); | ||
668 | } | ||
669 | trace_xfs_iunlock(ip, lock_flags, _RET_IP_); | 658 | trace_xfs_iunlock(ip, lock_flags, _RET_IP_); |
670 | } | 659 | } |
671 | 660 | ||
diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 2f27b7454085..eda493780395 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h | |||
@@ -422,7 +422,6 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) | |||
422 | #define XFS_IOLOCK_SHARED (1<<1) | 422 | #define XFS_IOLOCK_SHARED (1<<1) |
423 | #define XFS_ILOCK_EXCL (1<<2) | 423 | #define XFS_ILOCK_EXCL (1<<2) |
424 | #define XFS_ILOCK_SHARED (1<<3) | 424 | #define XFS_ILOCK_SHARED (1<<3) |
425 | #define XFS_IUNLOCK_NONOTIFY (1<<4) | ||
426 | 425 | ||
427 | #define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \ | 426 | #define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \ |
428 | | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED) | 427 | | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED) |
@@ -431,8 +430,7 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) | |||
431 | { XFS_IOLOCK_EXCL, "IOLOCK_EXCL" }, \ | 430 | { XFS_IOLOCK_EXCL, "IOLOCK_EXCL" }, \ |
432 | { XFS_IOLOCK_SHARED, "IOLOCK_SHARED" }, \ | 431 | { XFS_IOLOCK_SHARED, "IOLOCK_SHARED" }, \ |
433 | { XFS_ILOCK_EXCL, "ILOCK_EXCL" }, \ | 432 | { XFS_ILOCK_EXCL, "ILOCK_EXCL" }, \ |
434 | { XFS_ILOCK_SHARED, "ILOCK_SHARED" }, \ | 433 | { XFS_ILOCK_SHARED, "ILOCK_SHARED" } |
435 | { XFS_IUNLOCK_NONOTIFY, "IUNLOCK_NONOTIFY" } | ||
436 | 434 | ||
437 | 435 | ||
438 | /* | 436 | /* |
diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 91d71dcd4852..adc8a261b5d0 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c | |||
@@ -596,11 +596,7 @@ xfs_inode_item_trylock( | |||
596 | /* Stale items should force out the iclog */ | 596 | /* Stale items should force out the iclog */ |
597 | if (ip->i_flags & XFS_ISTALE) { | 597 | if (ip->i_flags & XFS_ISTALE) { |
598 | xfs_ifunlock(ip); | 598 | xfs_ifunlock(ip); |
599 | /* | 599 | xfs_iunlock(ip, XFS_ILOCK_SHARED); |
600 | * we hold the AIL lock - notify the unlock routine of this | ||
601 | * so it doesn't try to get the lock again. | ||
602 | */ | ||
603 | xfs_iunlock(ip, XFS_ILOCK_SHARED|XFS_IUNLOCK_NONOTIFY); | ||
604 | return XFS_ITEM_PINNED; | 600 | return XFS_ITEM_PINNED; |
605 | } | 601 | } |
606 | 602 | ||
diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index c9234956bcb2..9d5fc089ea2e 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c | |||
@@ -611,50 +611,6 @@ xfs_ail_push_all( | |||
611 | } | 611 | } |
612 | 612 | ||
613 | /* | 613 | /* |
614 | * This is to be called when an item is unlocked that may have | ||
615 | * been in the AIL. It will wake up the first member of the AIL | ||
616 | * wait list if this item's unlocking might allow it to progress. | ||
617 | * If the item is in the AIL, then we need to get the AIL lock | ||
618 | * while doing our checking so we don't race with someone going | ||
619 | * to sleep waiting for this event in xfs_trans_push_ail(). | ||
620 | */ | ||
621 | void | ||
622 | xfs_trans_unlocked_item( | ||
623 | struct xfs_ail *ailp, | ||
624 | xfs_log_item_t *lip) | ||
625 | { | ||
626 | xfs_log_item_t *min_lip; | ||
627 | |||
628 | /* | ||
629 | * If we're forcibly shutting down, we may have | ||
630 | * unlocked log items arbitrarily. The last thing | ||
631 | * we want to do is to move the tail of the log | ||
632 | * over some potentially valid data. | ||
633 | */ | ||
634 | if (!(lip->li_flags & XFS_LI_IN_AIL) || | ||
635 | XFS_FORCED_SHUTDOWN(ailp->xa_mount)) { | ||
636 | return; | ||
637 | } | ||
638 | |||
639 | /* | ||
640 | * This is the one case where we can call into xfs_ail_min() | ||
641 | * without holding the AIL lock because we only care about the | ||
642 | * case where we are at the tail of the AIL. If the object isn't | ||
643 | * at the tail, it doesn't matter what result we get back. This | ||
644 | * is slightly racy because since we were just unlocked, we could | ||
645 | * go to sleep between the call to xfs_ail_min and the call to | ||
646 | * xfs_log_space_wake, have someone else lock us, commit to us disk, | ||
647 | * move us out of the tail of the AIL, and then we wake up. However, | ||
648 | * the call to xfs_log_space_wake() doesn't do anything if there's | ||
649 | * not enough free space to wake people up so we're safe calling it. | ||
650 | */ | ||
651 | min_lip = xfs_ail_min(ailp); | ||
652 | |||
653 | if (min_lip == lip) | ||
654 | xfs_log_space_wake(ailp->xa_mount, true); | ||
655 | } /* xfs_trans_unlocked_item */ | ||
656 | |||
657 | /* | ||
658 | * xfs_trans_ail_update - bulk AIL insertion operation. | 614 | * xfs_trans_ail_update - bulk AIL insertion operation. |
659 | * | 615 | * |
660 | * @xfs_trans_ail_update takes an array of log items that all need to be | 616 | * @xfs_trans_ail_update takes an array of log items that all need to be |
diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 475a4ded4f41..1302d1d95a58 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c | |||
@@ -463,19 +463,7 @@ xfs_trans_brelse(xfs_trans_t *tp, | |||
463 | * Default to a normal brelse() call if the tp is NULL. | 463 | * Default to a normal brelse() call if the tp is NULL. |
464 | */ | 464 | */ |
465 | if (tp == NULL) { | 465 | if (tp == NULL) { |
466 | struct xfs_log_item *lip = bp->b_fspriv; | ||
467 | |||
468 | ASSERT(bp->b_transp == NULL); | 466 | ASSERT(bp->b_transp == NULL); |
469 | |||
470 | /* | ||
471 | * If there's a buf log item attached to the buffer, | ||
472 | * then let the AIL know that the buffer is being | ||
473 | * unlocked. | ||
474 | */ | ||
475 | if (lip != NULL && lip->li_type == XFS_LI_BUF) { | ||
476 | bip = bp->b_fspriv; | ||
477 | xfs_trans_unlocked_item(bip->bli_item.li_ailp, lip); | ||
478 | } | ||
479 | xfs_buf_relse(bp); | 467 | xfs_buf_relse(bp); |
480 | return; | 468 | return; |
481 | } | 469 | } |
@@ -550,21 +538,10 @@ xfs_trans_brelse(xfs_trans_t *tp, | |||
550 | ASSERT(!(bip->bli_item.li_flags & XFS_LI_IN_AIL)); | 538 | ASSERT(!(bip->bli_item.li_flags & XFS_LI_IN_AIL)); |
551 | ASSERT(!(bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF)); | 539 | ASSERT(!(bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF)); |
552 | xfs_buf_item_relse(bp); | 540 | xfs_buf_item_relse(bp); |
553 | bip = NULL; | ||
554 | } | ||
555 | bp->b_transp = NULL; | ||
556 | |||
557 | /* | ||
558 | * If we've still got a buf log item on the buffer, then | ||
559 | * tell the AIL that the buffer is being unlocked. | ||
560 | */ | ||
561 | if (bip != NULL) { | ||
562 | xfs_trans_unlocked_item(bip->bli_item.li_ailp, | ||
563 | (xfs_log_item_t*)bip); | ||
564 | } | 541 | } |
565 | 542 | ||
543 | bp->b_transp = NULL; | ||
566 | xfs_buf_relse(bp); | 544 | xfs_buf_relse(bp); |
567 | return; | ||
568 | } | 545 | } |
569 | 546 | ||
570 | /* | 547 | /* |
diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 44820b9fcb43..8ab2ced415f1 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h | |||
@@ -104,9 +104,6 @@ void xfs_ail_push(struct xfs_ail *, xfs_lsn_t); | |||
104 | void xfs_ail_push_all(struct xfs_ail *); | 104 | void xfs_ail_push_all(struct xfs_ail *); |
105 | xfs_lsn_t xfs_ail_min_lsn(struct xfs_ail *ailp); | 105 | xfs_lsn_t xfs_ail_min_lsn(struct xfs_ail *ailp); |
106 | 106 | ||
107 | void xfs_trans_unlocked_item(struct xfs_ail *, | ||
108 | xfs_log_item_t *); | ||
109 | |||
110 | struct xfs_log_item * xfs_trans_ail_cursor_first(struct xfs_ail *ailp, | 107 | struct xfs_log_item * xfs_trans_ail_cursor_first(struct xfs_ail *ailp, |
111 | struct xfs_ail_cursor *cur, | 108 | struct xfs_ail_cursor *cur, |
112 | xfs_lsn_t lsn); | 109 | xfs_lsn_t lsn); |