summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBadari Pulavarty <pbadari@us.ibm.com>2006-07-30 10:04:14 (GMT)
committerLinus Torvalds <torvalds@g5.osdl.org>2006-07-31 20:28:44 (GMT)
commit0e31f51d8177320d61ec5786ca4aafa7b7a749b4 (patch)
treea076261c90d757d7d2740c1ba4d219782914ea4d
parent51d8c5edd3b166fcc51aba84d78761d578400a7c (diff)
downloadlinux-0e31f51d8177320d61ec5786ca4aafa7b7a749b4.tar.xz
[PATCH] ext3 -nobh option causes oops
For files other than IFREG, nobh option doesn't make sense. Modifications to them are journalled and needs buffer heads to do that. Without this patch, we get kernel oops in page_buffers(). Signed-off-by: Badari Pulavarty <pbadari@us.ibm.com> Cc: <stable@kernel.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--fs/ext3/inode.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c
index ab034d3..c5ee9f0 100644
--- a/fs/ext3/inode.c
+++ b/fs/ext3/inode.c
@@ -1158,7 +1158,7 @@ retry:
ret = PTR_ERR(handle);
goto out;
}
- if (test_opt(inode->i_sb, NOBH))
+ if (test_opt(inode->i_sb, NOBH) && ext3_should_writeback_data(inode))
ret = nobh_prepare_write(page, from, to, ext3_get_block);
else
ret = block_prepare_write(page, from, to, ext3_get_block);
@@ -1244,7 +1244,7 @@ static int ext3_writeback_commit_write(struct file *file, struct page *page,
if (new_i_size > EXT3_I(inode)->i_disksize)
EXT3_I(inode)->i_disksize = new_i_size;
- if (test_opt(inode->i_sb, NOBH))
+ if (test_opt(inode->i_sb, NOBH) && ext3_should_writeback_data(inode))
ret = nobh_commit_write(file, page, from, to);
else
ret = generic_commit_write(file, page, from, to);
@@ -1494,7 +1494,7 @@ static int ext3_writeback_writepage(struct page *page,
goto out_fail;
}
- if (test_opt(inode->i_sb, NOBH))
+ if (test_opt(inode->i_sb, NOBH) && ext3_should_writeback_data(inode))
ret = nobh_writepage(page, ext3_get_block, wbc);
else
ret = block_write_full_page(page, ext3_get_block, wbc);