diff options
author | Filipe Manana <fdmanana@suse.com> | 2014-09-22 18:41:04 +0200 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2014-10-04 01:14:58 +0200 |
commit | 55e3bd2e0c2e1cfb43429b962e61415e0526bc01 (patch) | |
tree | abb89e714c5ad0532229a19816fbe8aa317b33af /fs/btrfs/extent_io.c | |
parent | btrfs: Fix the wrong condition judgment about subset extent map (diff) | |
download | linux-55e3bd2e0c2e1cfb43429b962e61415e0526bc01.tar.xz linux-55e3bd2e0c2e1cfb43429b962e61415e0526bc01.zip |
Btrfs: add missing end_page_writeback on submit_extent_page failure
If submit_extent_page() fails in write_one_eb(), we end up with the current
page not marked dirty anymore, unlocked and marked for writeback. But we never
end up calling end_page_writeback() against the page, which will make calls to
filemap_fdatawait_range (e.g. at transaction commit time) hang forever waiting
for the writeback bit to be cleared from the page.
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r-- | fs/btrfs/extent_io.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 78229007f99e..828aded0f8aa 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -3663,6 +3663,7 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb, if (ret) { set_bit(EXTENT_BUFFER_IOERR, &eb->bflags); SetPageError(p); + end_page_writeback(p); if (atomic_sub_and_test(num_pages - i, &eb->io_pages)) end_extent_buffer_writeback(eb); ret = -EIO; |