Skip to content

Commit

Permalink
ext4: use redirty_page_for_writepage() in ext4_bio_write_page()
Browse files Browse the repository at this point in the history
When we cannot write a page we should use redirty_page_for_writepage()
instead of plain set_page_dirty(). That tells writeback code we have
problems, redirties only the page (redirtying buffers is not needed),
and updates mm accounting of failed page writes.

Also move clearing of buffer dirty flag after io_submit_add_bh(). At that
moment we are sure buffer will be going to disk.

Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
  • Loading branch information
Jan Kara authored and Theodore Ts'o committed Jan 28, 2013
1 parent 36ade45 commit 1ae48a6
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions fs/ext4/page-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <linux/workqueue.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/mm.h>

#include "ext4_jbd2.h"
#include "xattr.h"
Expand Down Expand Up @@ -434,7 +435,7 @@ int ext4_bio_write_page(struct ext4_io_submit *io,

io_page = kmem_cache_alloc(io_page_cachep, GFP_NOFS);
if (!io_page) {
set_page_dirty(page);
redirty_page_for_writepage(wbc, page);
unlock_page(page);
return -ENOMEM;
}
Expand Down Expand Up @@ -466,17 +467,17 @@ int ext4_bio_write_page(struct ext4_io_submit *io,
set_buffer_uptodate(bh);
continue;
}
clear_buffer_dirty(bh);
ret = io_submit_add_bh(io, io_page, inode, wbc, bh);
if (ret) {
/*
* We only get here on ENOMEM. Not much else
* we can do but mark the page as dirty, and
* better luck next time.
*/
set_page_dirty(page);
redirty_page_for_writepage(wbc, page);
break;
}
clear_buffer_dirty(bh);
}
unlock_page(page);
/*
Expand Down

0 comments on commit 1ae48a6

Please sign in to comment.