aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2012-05-03 08:47:57 -0400
committerFengguang Wu <fengguang.wu@intel.com>2012-05-06 01:43:39 -0400
commit6290be1c1dc6589eeda213aa40946b27fa4faac8 (patch)
tree5c7aa9510c3210775b948b578fa844cbfe399aa0
parentcc1676d917f32504dbadc858fa790bc524c9f0da (diff)
writeback: Move I_DIRTY_PAGES handling
Instead of clearing I_DIRTY_PAGES and resetting it when we didn't succeed in writing them all, just clear the bit only when we succeeded writing all the pages. We also move the clearing of the bit close to other i_state handling to separate it from writeback list handling. This is desirable because list handling will differ for flusher thread and other writeback_single_inode() callers in future. No filesystem plays any tricks with I_DIRTY_PAGES (like checking it in ->writepages or ->write_inode implementation) so this movement is safe. Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
-rw-r--r--fs/fs-writeback.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
index 65cd1476922..3804a10f2be 100644
--- a/fs/fs-writeback.c
+++ b/fs/fs-writeback.c
@@ -385,7 +385,6 @@ writeback_single_inode(struct inode *inode, struct bdi_writeback *wb,
385 385
386 /* Set I_SYNC, reset I_DIRTY_PAGES */ 386 /* Set I_SYNC, reset I_DIRTY_PAGES */
387 inode->i_state |= I_SYNC; 387 inode->i_state |= I_SYNC;
388 inode->i_state &= ~I_DIRTY_PAGES;
389 spin_unlock(&inode->i_lock); 388 spin_unlock(&inode->i_lock);
390 spin_unlock(&wb->list_lock); 389 spin_unlock(&wb->list_lock);
391 390
@@ -408,6 +407,9 @@ writeback_single_inode(struct inode *inode, struct bdi_writeback *wb,
408 * write_inode() 407 * write_inode()
409 */ 408 */
410 spin_lock(&inode->i_lock); 409 spin_lock(&inode->i_lock);
410 /* Clear I_DIRTY_PAGES if we've written out all dirty pages */
411 if (!mapping_tagged(mapping, PAGECACHE_TAG_DIRTY))
412 inode->i_state &= ~I_DIRTY_PAGES;
411 dirty = inode->i_state & I_DIRTY; 413 dirty = inode->i_state & I_DIRTY;
412 inode->i_state &= ~(I_DIRTY_SYNC | I_DIRTY_DATASYNC); 414 inode->i_state &= ~(I_DIRTY_SYNC | I_DIRTY_DATASYNC);
413 spin_unlock(&inode->i_lock); 415 spin_unlock(&inode->i_lock);
@@ -435,7 +437,6 @@ writeback_single_inode(struct inode *inode, struct bdi_writeback *wb,
435 * We didn't write back all the pages. nfs_writepages() 437 * We didn't write back all the pages. nfs_writepages()
436 * sometimes bales out without doing anything. 438 * sometimes bales out without doing anything.
437 */ 439 */
438 inode->i_state |= I_DIRTY_PAGES;
439 if (wbc->nr_to_write <= 0) { 440 if (wbc->nr_to_write <= 0) {
440 /* 441 /*
441 * slice used up: queue for next turn 442 * slice used up: queue for next turn