|
@@ -516,13 +516,16 @@ writeback_single_inode(struct inode *inode, struct bdi_writeback *wb,
|
|
}
|
|
}
|
|
WARN_ON(inode->i_state & I_SYNC);
|
|
WARN_ON(inode->i_state & I_SYNC);
|
|
/*
|
|
/*
|
|
- * Skip inode if it is clean. We don't want to mess with writeback
|
|
|
|
- * lists in this function since flusher thread may be doing for example
|
|
|
|
- * sync in parallel and if we move the inode, it could get skipped. So
|
|
|
|
- * here we make sure inode is on some writeback list and leave it there
|
|
|
|
- * unless we have completely cleaned the inode.
|
|
|
|
|
|
+ * Skip inode if it is clean and we have no outstanding writeback in
|
|
|
|
+ * WB_SYNC_ALL mode. We don't want to mess with writeback lists in this
|
|
|
|
+ * function since flusher thread may be doing for example sync in
|
|
|
|
+ * parallel and if we move the inode, it could get skipped. So here we
|
|
|
|
+ * make sure inode is on some writeback list and leave it there unless
|
|
|
|
+ * we have completely cleaned the inode.
|
|
*/
|
|
*/
|
|
- if (!(inode->i_state & I_DIRTY))
|
|
|
|
|
|
+ if (!(inode->i_state & I_DIRTY) &&
|
|
|
|
+ (wbc->sync_mode != WB_SYNC_ALL ||
|
|
|
|
+ !mapping_tagged(inode->i_mapping, PAGECACHE_TAG_WRITEBACK)))
|
|
goto out;
|
|
goto out;
|
|
inode->i_state |= I_SYNC;
|
|
inode->i_state |= I_SYNC;
|
|
spin_unlock(&inode->i_lock);
|
|
spin_unlock(&inode->i_lock);
|