mirror of https://gitee.com/openkylin/linux.git
[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>
This commit is contained in:
parent
51d8c5edd3
commit
0e31f51d81
|
@ -1158,7 +1158,7 @@ static int ext3_prepare_write(struct file *file, struct page *page,
|
|||
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);
|
||||
|
|
Loading…
Reference in New Issue