Skip to content

Commit

Permalink
ext3: Fix fs corruption when make_indexed_dir() fails
Browse files Browse the repository at this point in the history
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.

CC: stable@kernel.org
Signed-off-by: Jan Kara <jack@suse.cz>
  • Loading branch information
Jan Kara committed May 17, 2011
1 parent ae54870 commit 86c4f6d
Showing 1 changed file with 12 additions and 3 deletions.
15 changes: 12 additions & 3 deletions fs/ext3/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -1416,10 +1416,19 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
frame->at = entries;
frame->bh = bh;
bh = bh2;
/*
* Mark buffers dirty here so that if do_split() fails we write a
* consistent set of buffers to disk.
*/
ext3_journal_dirty_metadata(handle, frame->bh);
ext3_journal_dirty_metadata(handle, bh);
de = do_split(handle,dir, &bh, frame, &hinfo, &retval);
dx_release (frames);
if (!(de))
if (!de) {
ext3_mark_inode_dirty(handle, dir);
dx_release(frames);
return retval;
}
dx_release(frames);

return add_dirent_to_buf(handle, dentry, inode, de, bh);
}
Expand Down Expand Up @@ -2282,7 +2291,7 @@ static int ext3_symlink (struct inode * dir,
return err;
err_drop_inode:
unlock_new_inode(inode);
iput (inode);
iput(inode);
return err;
}

Expand Down

0 comments on commit 86c4f6d

Please sign in to comment.