aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/fs-writeback.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
index 3be57189efd5..e3ab1e4dc442 100644
--- a/fs/fs-writeback.c
+++ b/fs/fs-writeback.c
@@ -505,13 +505,16 @@ writeback_single_inode(struct inode *inode, struct bdi_writeback *wb,
505 } 505 }
506 WARN_ON(inode->i_state & I_SYNC); 506 WARN_ON(inode->i_state & I_SYNC);
507 /* 507 /*
508 * Skip inode if it is clean. We don't want to mess with writeback 508 * Skip inode if it is clean and we have no outstanding writeback in
509 * lists in this function since flusher thread may be doing for example 509 * WB_SYNC_ALL mode. We don't want to mess with writeback lists in this
510 * sync in parallel and if we move the inode, it could get skipped. So 510 * function since flusher thread may be doing for example sync in
511 * here we make sure inode is on some writeback list and leave it there 511 * parallel and if we move the inode, it could get skipped. So here we
512 * unless we have completely cleaned the inode. 512 * make sure inode is on some writeback list and leave it there unless
513 * we have completely cleaned the inode.
513 */ 514 */
514 if (!(inode->i_state & I_DIRTY)) 515 if (!(inode->i_state & I_DIRTY) &&
516 (wbc->sync_mode != WB_SYNC_ALL ||
517 !mapping_tagged(inode->i_mapping, PAGECACHE_TAG_WRITEBACK)))
515 goto out; 518 goto out;
516 inode->i_state |= I_SYNC; 519 inode->i_state |= I_SYNC;
517 spin_unlock(&inode->i_lock); 520 spin_unlock(&inode->i_lock);