linux-ext4.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] ext4: Fix fs corruption when make_indexed_dir() fails
@ 2011-04-29 21:23 Jan Kara
  2011-05-03 15:11 ` Ted Ts'o
  0 siblings, 1 reply; 2+ messages in thread
From: Jan Kara @ 2011-04-29 21:23 UTC (permalink / raw)
  To: Ted Tso; +Cc: linux-ext4, Jan Kara

When make_indexed_dir() fails (e.g. because of ENOSPC) after it has allocated
block for index tree root, we did not properly mark all changed buffers dirty.
This lead to only some of these buffers being written out and thus effectively
corrupting the directory.

Fix the issue by marking all changed data dirty even in the error failure case.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/ext4/namei.c |   14 ++++++++++++--
 1 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index 67fd0b0..cadf04b 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -1414,9 +1414,19 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
 	frame->bh = bh;
 	bh = bh2;
 	de = do_split(handle,dir, &bh, frame, &hinfo, &retval);
-	dx_release (frames);
-	if (!(de))
+	if (!de) {
+		/*
+		 * Even if the block split failed, we have to properly write
+		 * out all the changes we did so far. Otherwise we can end up
+		 * with corrupted filesystem.
+		 */
+		ext4_mark_inode_dirty(handle, dir);
+		ext4_handle_dirty_metadata(handle, dir, frame->bh);
+		ext4_handle_dirty_metadata(handle, dir, bh);
+		dx_release(frames);
 		return retval;
+	}
+	dx_release(frames);
 
 	retval = add_dirent_to_buf(handle, dentry, inode, de, bh);
 	brelse(bh);
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH 1/2] ext4: Fix fs corruption when make_indexed_dir() fails
  2011-04-29 21:23 [PATCH 1/2] ext4: Fix fs corruption when make_indexed_dir() fails Jan Kara
@ 2011-05-03 15:11 ` Ted Ts'o
  0 siblings, 0 replies; 2+ messages in thread
From: Ted Ts'o @ 2011-05-03 15:11 UTC (permalink / raw)
  To: Jan Kara; +Cc: linux-ext4

On Fri, Apr 29, 2011 at 11:23:32PM +0200, Jan Kara wrote:
> When make_indexed_dir() fails (e.g. because of ENOSPC) after it has
> allocated block for index tree root, we did not properly mark all
> changed buffers dirty.  This lead to only some of these buffers
> being written out and thus effectively corrupting the directory.
> 
> Fix the issue by marking all changed data dirty even in the error
> failure case.
> 
> Signed-off-by: Jan Kara <jack@suse.cz>

Thanks, added to the ext4 tree.

					- Ted

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2011-05-03 15:11 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-29 21:23 [PATCH 1/2] ext4: Fix fs corruption when make_indexed_dir() fails Jan Kara
2011-05-03 15:11 ` Ted Ts'o

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