linux-ext4.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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


      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).