Merge tag 'docs-5.7-2' of git://git.lwn.net/linux
[linux-block.git] / fs / xfs / xfs_inode_item.c
index 4a3d13d4a022889cbb50819c2e7d4b08ee315064..f779cca2346f393f8f7d075abf17e41faf6b92d6 100644 (file)
@@ -552,7 +552,8 @@ xfs_inode_item_push(
                if (!xfs_buf_delwri_queue(bp, buffer_list))
                        rval = XFS_ITEM_FLUSHING;
                xfs_buf_relse(bp);
-       }
+       } else if (error == -EAGAIN)
+               rval = XFS_ITEM_LOCKED;
 
        spin_lock(&lip->li_ailp->ail_lock);
 out_unlock:
@@ -730,29 +731,27 @@ xfs_iflush_done(
         * holding the lock before removing the inode from the AIL.
         */
        if (need_ail) {
-               bool                    mlip_changed = false;
+               xfs_lsn_t       tail_lsn = 0;
 
                /* this is an opencoded batch version of xfs_trans_ail_delete */
                spin_lock(&ailp->ail_lock);
                list_for_each_entry(blip, &tmp, li_bio_list) {
                        if (INODE_ITEM(blip)->ili_logged &&
-                           blip->li_lsn == INODE_ITEM(blip)->ili_flush_lsn)
-                               mlip_changed |= xfs_ail_delete_one(ailp, blip);
-                       else {
+                           blip->li_lsn == INODE_ITEM(blip)->ili_flush_lsn) {
+                               /*
+                                * xfs_ail_update_finish() only cares about the
+                                * lsn of the first tail item removed, any
+                                * others will be at the same or higher lsn so
+                                * we just ignore them.
+                                */
+                               xfs_lsn_t lsn = xfs_ail_delete_one(ailp, blip);
+                               if (!tail_lsn && lsn)
+                                       tail_lsn = lsn;
+                       } else {
                                xfs_clear_li_failed(blip);
                        }
                }
-
-               if (mlip_changed) {
-                       if (!XFS_FORCED_SHUTDOWN(ailp->ail_mount))
-                               xlog_assign_tail_lsn_locked(ailp->ail_mount);
-                       if (list_empty(&ailp->ail_head))
-                               wake_up_all(&ailp->ail_empty);
-               }
-               spin_unlock(&ailp->ail_lock);
-
-               if (mlip_changed)
-                       xfs_log_space_wake(ailp->ail_mount);
+               xfs_ail_update_finish(ailp, tail_lsn);
        }
 
        /*