diff options
| -rw-r--r-- | fs/xfs/xfs_buf_item.c | 3 | ||||
| -rw-r--r-- | fs/xfs/xfs_dquot_item.c | 10 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode_item.c | 10 | ||||
| -rw-r--r-- | fs/xfs/xfs_trans.h | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_trans_ail.c | 9 |
5 files changed, 24 insertions, 10 deletions
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index cac2ecfa6746..ef43fce519a1 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c | |||
| @@ -629,7 +629,7 @@ xfs_buf_item_push( | |||
| 629 | * the xfsbufd to get this buffer written. We have to unlock the buffer | 629 | * the xfsbufd to get this buffer written. We have to unlock the buffer |
| 630 | * to allow the xfsbufd to write it, too. | 630 | * to allow the xfsbufd to write it, too. |
| 631 | */ | 631 | */ |
| 632 | STATIC void | 632 | STATIC bool |
| 633 | xfs_buf_item_pushbuf( | 633 | xfs_buf_item_pushbuf( |
| 634 | struct xfs_log_item *lip) | 634 | struct xfs_log_item *lip) |
| 635 | { | 635 | { |
| @@ -643,6 +643,7 @@ xfs_buf_item_pushbuf( | |||
| 643 | 643 | ||
| 644 | xfs_buf_delwri_promote(bp); | 644 | xfs_buf_delwri_promote(bp); |
| 645 | xfs_buf_relse(bp); | 645 | xfs_buf_relse(bp); |
| 646 | return true; | ||
| 646 | } | 647 | } |
| 647 | 648 | ||
| 648 | STATIC void | 649 | STATIC void |
diff --git a/fs/xfs/xfs_dquot_item.c b/fs/xfs/xfs_dquot_item.c index 9e0e2fa3f2c8..bb3f71d236d2 100644 --- a/fs/xfs/xfs_dquot_item.c +++ b/fs/xfs/xfs_dquot_item.c | |||
| @@ -183,13 +183,14 @@ xfs_qm_dqunpin_wait( | |||
| 183 | * search the buffer cache can be a time consuming thing, and AIL lock is a | 183 | * search the buffer cache can be a time consuming thing, and AIL lock is a |
| 184 | * spinlock. | 184 | * spinlock. |
| 185 | */ | 185 | */ |
| 186 | STATIC void | 186 | STATIC bool |
| 187 | xfs_qm_dquot_logitem_pushbuf( | 187 | xfs_qm_dquot_logitem_pushbuf( |
| 188 | struct xfs_log_item *lip) | 188 | struct xfs_log_item *lip) |
| 189 | { | 189 | { |
| 190 | struct xfs_dq_logitem *qlip = DQUOT_ITEM(lip); | 190 | struct xfs_dq_logitem *qlip = DQUOT_ITEM(lip); |
| 191 | struct xfs_dquot *dqp = qlip->qli_dquot; | 191 | struct xfs_dquot *dqp = qlip->qli_dquot; |
| 192 | struct xfs_buf *bp; | 192 | struct xfs_buf *bp; |
| 193 | bool ret = true; | ||
| 193 | 194 | ||
| 194 | ASSERT(XFS_DQ_IS_LOCKED(dqp)); | 195 | ASSERT(XFS_DQ_IS_LOCKED(dqp)); |
| 195 | 196 | ||
| @@ -201,17 +202,20 @@ xfs_qm_dquot_logitem_pushbuf( | |||
| 201 | if (completion_done(&dqp->q_flush) || | 202 | if (completion_done(&dqp->q_flush) || |
| 202 | !(lip->li_flags & XFS_LI_IN_AIL)) { | 203 | !(lip->li_flags & XFS_LI_IN_AIL)) { |
| 203 | xfs_dqunlock(dqp); | 204 | xfs_dqunlock(dqp); |
| 204 | return; | 205 | return true; |
| 205 | } | 206 | } |
| 206 | 207 | ||
| 207 | bp = xfs_incore(dqp->q_mount->m_ddev_targp, qlip->qli_format.qlf_blkno, | 208 | bp = xfs_incore(dqp->q_mount->m_ddev_targp, qlip->qli_format.qlf_blkno, |
| 208 | dqp->q_mount->m_quotainfo->qi_dqchunklen, XBF_TRYLOCK); | 209 | dqp->q_mount->m_quotainfo->qi_dqchunklen, XBF_TRYLOCK); |
| 209 | xfs_dqunlock(dqp); | 210 | xfs_dqunlock(dqp); |
| 210 | if (!bp) | 211 | if (!bp) |
| 211 | return; | 212 | return true; |
| 212 | if (XFS_BUF_ISDELAYWRITE(bp)) | 213 | if (XFS_BUF_ISDELAYWRITE(bp)) |
| 213 | xfs_buf_delwri_promote(bp); | 214 | xfs_buf_delwri_promote(bp); |
| 215 | if (xfs_buf_ispinned(bp)) | ||
| 216 | ret = false; | ||
| 214 | xfs_buf_relse(bp); | 217 | xfs_buf_relse(bp); |
| 218 | return ret; | ||
| 215 | } | 219 | } |
| 216 | 220 | ||
| 217 | /* | 221 | /* |
diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 588406dc6a35..836ad80d4f2b 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c | |||
| @@ -708,13 +708,14 @@ xfs_inode_item_committed( | |||
| 708 | * marked delayed write. If that's the case, we'll promote it and that will | 708 | * marked delayed write. If that's the case, we'll promote it and that will |
| 709 | * allow the caller to write the buffer by triggering the xfsbufd to run. | 709 | * allow the caller to write the buffer by triggering the xfsbufd to run. |
| 710 | */ | 710 | */ |
| 711 | STATIC void | 711 | STATIC bool |
| 712 | xfs_inode_item_pushbuf( | 712 | xfs_inode_item_pushbuf( |
| 713 | struct xfs_log_item *lip) | 713 | struct xfs_log_item *lip) |
| 714 | { | 714 | { |
| 715 | struct xfs_inode_log_item *iip = INODE_ITEM(lip); | 715 | struct xfs_inode_log_item *iip = INODE_ITEM(lip); |
| 716 | struct xfs_inode *ip = iip->ili_inode; | 716 | struct xfs_inode *ip = iip->ili_inode; |
| 717 | struct xfs_buf *bp; | 717 | struct xfs_buf *bp; |
| 718 | bool ret = true; | ||
| 718 | 719 | ||
| 719 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED)); | 720 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED)); |
| 720 | 721 | ||
| @@ -725,7 +726,7 @@ xfs_inode_item_pushbuf( | |||
| 725 | if (completion_done(&ip->i_flush) || | 726 | if (completion_done(&ip->i_flush) || |
| 726 | !(lip->li_flags & XFS_LI_IN_AIL)) { | 727 | !(lip->li_flags & XFS_LI_IN_AIL)) { |
| 727 | xfs_iunlock(ip, XFS_ILOCK_SHARED); | 728 | xfs_iunlock(ip, XFS_ILOCK_SHARED); |
| 728 | return; | 729 | return true; |
| 729 | } | 730 | } |
| 730 | 731 | ||
| 731 | bp = xfs_incore(ip->i_mount->m_ddev_targp, iip->ili_format.ilf_blkno, | 732 | bp = xfs_incore(ip->i_mount->m_ddev_targp, iip->ili_format.ilf_blkno, |
| @@ -733,10 +734,13 @@ xfs_inode_item_pushbuf( | |||
| 733 | 734 | ||
| 734 | xfs_iunlock(ip, XFS_ILOCK_SHARED); | 735 | xfs_iunlock(ip, XFS_ILOCK_SHARED); |
| 735 | if (!bp) | 736 | if (!bp) |
| 736 | return; | 737 | return true; |
| 737 | if (XFS_BUF_ISDELAYWRITE(bp)) | 738 | if (XFS_BUF_ISDELAYWRITE(bp)) |
| 738 | xfs_buf_delwri_promote(bp); | 739 | xfs_buf_delwri_promote(bp); |
| 740 | if (xfs_buf_ispinned(bp)) | ||
| 741 | ret = false; | ||
| 739 | xfs_buf_relse(bp); | 742 | xfs_buf_relse(bp); |
| 743 | return ret; | ||
| 740 | } | 744 | } |
| 741 | 745 | ||
| 742 | /* | 746 | /* |
diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 06a9759b6352..53597f4db9b5 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h | |||
| @@ -350,7 +350,7 @@ typedef struct xfs_item_ops { | |||
| 350 | void (*iop_unlock)(xfs_log_item_t *); | 350 | void (*iop_unlock)(xfs_log_item_t *); |
| 351 | xfs_lsn_t (*iop_committed)(xfs_log_item_t *, xfs_lsn_t); | 351 | xfs_lsn_t (*iop_committed)(xfs_log_item_t *, xfs_lsn_t); |
| 352 | void (*iop_push)(xfs_log_item_t *); | 352 | void (*iop_push)(xfs_log_item_t *); |
| 353 | void (*iop_pushbuf)(xfs_log_item_t *); | 353 | bool (*iop_pushbuf)(xfs_log_item_t *); |
| 354 | void (*iop_committing)(xfs_log_item_t *, xfs_lsn_t); | 354 | void (*iop_committing)(xfs_log_item_t *, xfs_lsn_t); |
| 355 | } xfs_item_ops_t; | 355 | } xfs_item_ops_t; |
| 356 | 356 | ||
diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 9bd1ee55ef6a..e4cd9180d33a 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c | |||
| @@ -427,8 +427,13 @@ xfs_ail_worker( | |||
| 427 | 427 | ||
| 428 | case XFS_ITEM_PUSHBUF: | 428 | case XFS_ITEM_PUSHBUF: |
| 429 | XFS_STATS_INC(xs_push_ail_pushbuf); | 429 | XFS_STATS_INC(xs_push_ail_pushbuf); |
| 430 | IOP_PUSHBUF(lip); | 430 | |
| 431 | ailp->xa_last_pushed_lsn = lsn; | 431 | if (!IOP_PUSHBUF(lip)) { |
| 432 | stuck++; | ||
| 433 | flush_log = 1; | ||
| 434 | } else { | ||
| 435 | ailp->xa_last_pushed_lsn = lsn; | ||
| 436 | } | ||
| 432 | push_xfsbufd = 1; | 437 | push_xfsbufd = 1; |
| 433 | break; | 438 | break; |
| 434 | 439 | ||
