From: Jan Kara <jack@suse.cz>
To: tytso@mit.edu
Cc: linux-ext4@vger.kernel.org, Jan Kara <jack@suse.cz>
Subject: [PATCH 2/2] ext4: Redirty page which could not be added to current extent in __mpage_da_writepage()
Date: Wed, 16 Mar 2011 21:52:54 +0100 [thread overview]
Message-ID: <1300308774-14140-3-git-send-email-jack@suse.cz> (raw)
In-Reply-To: <1300308774-14140-1-git-send-email-jack@suse.cz>
When a page cannot be added to current extent in __mpage_da_writepage() we
map current extent and send it for IO. Currently, mpage_da_submit_io() also
redirtied and unlocked this page but it's not clear whether this is just a
lucky accident or a well hidden intent. Actually, we get this wrong in the case
when ext4_map_blocks() fails because of EIO and thus mpage_da_submit_io()
doesn't get called and the page is left locked leading to deadlocks.
Fix the issue by explicitely redirtying and unlocking the page in
__mpage_da_writepage() whenever we see the page could not be added to the
current extent.
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/ext4/inode.c | 8 +++++---
1 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 337d9ca..aea9963 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -2465,6 +2465,7 @@ static int __mpage_da_writepage(struct page *page,
*/
if (mpd->next_page != mpd->first_page) {
mpage_da_map_and_submit(mpd);
+redirty_page:
/*
* skip rest of the page in the page_vec
*/
@@ -2477,6 +2478,7 @@ static int __mpage_da_writepage(struct page *page,
* Start next extent of pages ...
*/
mpd->first_page = page->index;
+ mpd->next_page = page->index + 1;
/*
* ... and blocks
@@ -2486,7 +2488,6 @@ static int __mpage_da_writepage(struct page *page,
mpd->b_blocknr = 0;
}
- mpd->next_page = page->index + 1;
logical = (sector_t) page->index <<
(PAGE_CACHE_SHIFT - inode->i_blkbits);
@@ -2494,7 +2495,7 @@ static int __mpage_da_writepage(struct page *page,
mpage_add_bh_to_extent(mpd, logical, PAGE_CACHE_SIZE,
(1 << BH_Dirty) | (1 << BH_Uptodate));
if (mpd->io_done)
- return MPAGE_DA_EXTENT_TAIL;
+ goto redirty_page;
} else {
/*
* Page with regular buffer heads, just add all dirty ones
@@ -2514,7 +2515,7 @@ static int __mpage_da_writepage(struct page *page,
bh->b_size,
bh->b_state);
if (mpd->io_done)
- return MPAGE_DA_EXTENT_TAIL;
+ goto redirty_page;
} else if (buffer_dirty(bh) && (buffer_mapped(bh))) {
/*
* mapped dirty buffer. We need to update
@@ -2530,6 +2531,7 @@ static int __mpage_da_writepage(struct page *page,
logical++;
} while ((bh = bh->b_this_page) != head);
}
+ mpd->next_page = page->index + 1;
return 0;
}
--
1.7.1
prev parent reply other threads:[~2011-03-16 20:53 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-16 20:52 [PATCH 0/2] Fix BUG_ON and hang in ext4_da_writepages() in presence of IO errors Jan Kara
2011-03-16 20:52 ` [PATCH 1/2] ext4: Fix BUG_ON in ext4_da_block_invalidatepages() Jan Kara
2011-03-16 21:02 ` Curt Wohlgemuth
2011-03-16 21:11 ` Jan Kara
2011-03-16 20:52 ` Jan Kara [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1300308774-14140-3-git-send-email-jack@suse.cz \
--to=jack@suse.cz \
--cc=linux-ext4@vger.kernel.org \
--cc=tytso@mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).