diff options
Diffstat (limited to 'fs/ext3/inode.c')
-rw-r--r-- | fs/ext3/inode.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index f804d5e9d60c..84be02e93652 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c | |||
@@ -925,7 +925,7 @@ int ext3_get_blocks_handle(handle_t *handle, struct inode *inode, | |||
925 | set_buffer_new(bh_result); | 925 | set_buffer_new(bh_result); |
926 | got_it: | 926 | got_it: |
927 | map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key)); | 927 | map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key)); |
928 | if (blocks_to_boundary == 0) | 928 | if (count > blocks_to_boundary) |
929 | set_buffer_boundary(bh_result); | 929 | set_buffer_boundary(bh_result); |
930 | err = count; | 930 | err = count; |
931 | /* Clean up and exit */ | 931 | /* Clean up and exit */ |
@@ -1009,11 +1009,14 @@ struct buffer_head *ext3_getblk(handle_t *handle, struct inode *inode, | |||
1009 | buffer_trace_init(&dummy.b_history); | 1009 | buffer_trace_init(&dummy.b_history); |
1010 | err = ext3_get_blocks_handle(handle, inode, block, 1, | 1010 | err = ext3_get_blocks_handle(handle, inode, block, 1, |
1011 | &dummy, create, 1); | 1011 | &dummy, create, 1); |
1012 | if (err == 1) { | 1012 | /* |
1013 | * ext3_get_blocks_handle() returns number of blocks | ||
1014 | * mapped. 0 in case of a HOLE. | ||
1015 | */ | ||
1016 | if (err > 0) { | ||
1017 | if (err > 1) | ||
1018 | WARN_ON(1); | ||
1013 | err = 0; | 1019 | err = 0; |
1014 | } else if (err >= 0) { | ||
1015 | WARN_ON(1); | ||
1016 | err = -EIO; | ||
1017 | } | 1020 | } |
1018 | *errp = err; | 1021 | *errp = err; |
1019 | if (!err && buffer_mapped(&dummy)) { | 1022 | if (!err && buffer_mapped(&dummy)) { |
@@ -1158,7 +1161,7 @@ retry: | |||
1158 | ret = PTR_ERR(handle); | 1161 | ret = PTR_ERR(handle); |
1159 | goto out; | 1162 | goto out; |
1160 | } | 1163 | } |
1161 | if (test_opt(inode->i_sb, NOBH)) | 1164 | if (test_opt(inode->i_sb, NOBH) && ext3_should_writeback_data(inode)) |
1162 | ret = nobh_prepare_write(page, from, to, ext3_get_block); | 1165 | ret = nobh_prepare_write(page, from, to, ext3_get_block); |
1163 | else | 1166 | else |
1164 | ret = block_prepare_write(page, from, to, ext3_get_block); | 1167 | ret = block_prepare_write(page, from, to, ext3_get_block); |
@@ -1244,7 +1247,7 @@ static int ext3_writeback_commit_write(struct file *file, struct page *page, | |||
1244 | if (new_i_size > EXT3_I(inode)->i_disksize) | 1247 | if (new_i_size > EXT3_I(inode)->i_disksize) |
1245 | EXT3_I(inode)->i_disksize = new_i_size; | 1248 | EXT3_I(inode)->i_disksize = new_i_size; |
1246 | 1249 | ||
1247 | if (test_opt(inode->i_sb, NOBH)) | 1250 | if (test_opt(inode->i_sb, NOBH) && ext3_should_writeback_data(inode)) |
1248 | ret = nobh_commit_write(file, page, from, to); | 1251 | ret = nobh_commit_write(file, page, from, to); |
1249 | else | 1252 | else |
1250 | ret = generic_commit_write(file, page, from, to); | 1253 | ret = generic_commit_write(file, page, from, to); |
@@ -1494,7 +1497,7 @@ static int ext3_writeback_writepage(struct page *page, | |||
1494 | goto out_fail; | 1497 | goto out_fail; |
1495 | } | 1498 | } |
1496 | 1499 | ||
1497 | if (test_opt(inode->i_sb, NOBH)) | 1500 | if (test_opt(inode->i_sb, NOBH) && ext3_should_writeback_data(inode)) |
1498 | ret = nobh_writepage(page, ext3_get_block, wbc); | 1501 | ret = nobh_writepage(page, ext3_get_block, wbc); |
1499 | else | 1502 | else |
1500 | ret = block_write_full_page(page, ext3_get_block, wbc); | 1503 | ret = block_write_full_page(page, ext3_get_block, wbc); |
@@ -2402,14 +2405,15 @@ static ext3_fsblk_t ext3_get_inode_block(struct super_block *sb, | |||
2402 | struct buffer_head *bh; | 2405 | struct buffer_head *bh; |
2403 | struct ext3_group_desc * gdp; | 2406 | struct ext3_group_desc * gdp; |
2404 | 2407 | ||
2405 | 2408 | if (!ext3_valid_inum(sb, ino)) { | |
2406 | if ((ino != EXT3_ROOT_INO && ino != EXT3_JOURNAL_INO && | 2409 | /* |
2407 | ino != EXT3_RESIZE_INO && ino < EXT3_FIRST_INO(sb)) || | 2410 | * This error is already checked for in namei.c unless we are |
2408 | ino > le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count)) { | 2411 | * looking at an NFS filehandle, in which case no error |
2409 | ext3_error(sb, "ext3_get_inode_block", | 2412 | * report is needed |
2410 | "bad inode number: %lu", ino); | 2413 | */ |
2411 | return 0; | 2414 | return 0; |
2412 | } | 2415 | } |
2416 | |||
2413 | block_group = (ino - 1) / EXT3_INODES_PER_GROUP(sb); | 2417 | block_group = (ino - 1) / EXT3_INODES_PER_GROUP(sb); |
2414 | if (block_group >= EXT3_SB(sb)->s_groups_count) { | 2418 | if (block_group >= EXT3_SB(sb)->s_groups_count) { |
2415 | ext3_error(sb,"ext3_get_inode_block","group >= groups count"); | 2419 | ext3_error(sb,"ext3_get_inode_block","group >= groups count"); |