diff options
Diffstat (limited to 'fs/xfs')
-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); |