diff options
author | Namhyung Kim <namhyung@gmail.com> | 2010-11-24 11:53:12 -0500 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2011-01-10 13:04:06 -0500 |
commit | 41dc6385bd6cd3366c1b4bede33688521eb21db9 (patch) | |
tree | e9e97b4997969d21971fd43fdd584a678b6fb347 /fs/ext3 | |
parent | 055adcbd7da75868697e767adc4f3272f6cae76c (diff) |
ext3: Add journal error check in resize.c
Check return value of ext3_journal_get_write_access() and
ext3_journal_dirty_metadata().
Signed-off-by: Namhyung Kim <namhyung@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/ext3')
-rw-r--r-- | fs/ext3/resize.c | 65 |
1 files changed, 51 insertions, 14 deletions
diff --git a/fs/ext3/resize.c b/fs/ext3/resize.c index e746d30b1232..108b142e11ed 100644 --- a/fs/ext3/resize.c +++ b/fs/ext3/resize.c | |||
@@ -249,7 +249,11 @@ static int setup_new_group_blocks(struct super_block *sb, | |||
249 | memcpy(gdb->b_data, sbi->s_group_desc[i]->b_data, gdb->b_size); | 249 | memcpy(gdb->b_data, sbi->s_group_desc[i]->b_data, gdb->b_size); |
250 | set_buffer_uptodate(gdb); | 250 | set_buffer_uptodate(gdb); |
251 | unlock_buffer(gdb); | 251 | unlock_buffer(gdb); |
252 | ext3_journal_dirty_metadata(handle, gdb); | 252 | err = ext3_journal_dirty_metadata(handle, gdb); |
253 | if (err) { | ||
254 | brelse(gdb); | ||
255 | goto exit_bh; | ||
256 | } | ||
253 | ext3_set_bit(bit, bh->b_data); | 257 | ext3_set_bit(bit, bh->b_data); |
254 | brelse(gdb); | 258 | brelse(gdb); |
255 | } | 259 | } |
@@ -269,7 +273,11 @@ static int setup_new_group_blocks(struct super_block *sb, | |||
269 | err = PTR_ERR(gdb); | 273 | err = PTR_ERR(gdb); |
270 | goto exit_bh; | 274 | goto exit_bh; |
271 | } | 275 | } |
272 | ext3_journal_dirty_metadata(handle, gdb); | 276 | err = ext3_journal_dirty_metadata(handle, gdb); |
277 | if (err) { | ||
278 | brelse(gdb); | ||
279 | goto exit_bh; | ||
280 | } | ||
273 | ext3_set_bit(bit, bh->b_data); | 281 | ext3_set_bit(bit, bh->b_data); |
274 | brelse(gdb); | 282 | brelse(gdb); |
275 | } | 283 | } |
@@ -295,7 +303,11 @@ static int setup_new_group_blocks(struct super_block *sb, | |||
295 | err = PTR_ERR(it); | 303 | err = PTR_ERR(it); |
296 | goto exit_bh; | 304 | goto exit_bh; |
297 | } | 305 | } |
298 | ext3_journal_dirty_metadata(handle, it); | 306 | err = ext3_journal_dirty_metadata(handle, it); |
307 | if (err) { | ||
308 | brelse(it); | ||
309 | goto exit_bh; | ||
310 | } | ||
299 | brelse(it); | 311 | brelse(it); |
300 | ext3_set_bit(bit, bh->b_data); | 312 | ext3_set_bit(bit, bh->b_data); |
301 | } | 313 | } |
@@ -306,7 +318,9 @@ static int setup_new_group_blocks(struct super_block *sb, | |||
306 | 318 | ||
307 | mark_bitmap_end(input->blocks_count, EXT3_BLOCKS_PER_GROUP(sb), | 319 | mark_bitmap_end(input->blocks_count, EXT3_BLOCKS_PER_GROUP(sb), |
308 | bh->b_data); | 320 | bh->b_data); |
309 | ext3_journal_dirty_metadata(handle, bh); | 321 | err = ext3_journal_dirty_metadata(handle, bh); |
322 | if (err) | ||
323 | goto exit_bh; | ||
310 | brelse(bh); | 324 | brelse(bh); |
311 | 325 | ||
312 | /* Mark unused entries in inode bitmap used */ | 326 | /* Mark unused entries in inode bitmap used */ |
@@ -319,7 +333,7 @@ static int setup_new_group_blocks(struct super_block *sb, | |||
319 | 333 | ||
320 | mark_bitmap_end(EXT3_INODES_PER_GROUP(sb), EXT3_BLOCKS_PER_GROUP(sb), | 334 | mark_bitmap_end(EXT3_INODES_PER_GROUP(sb), EXT3_BLOCKS_PER_GROUP(sb), |
321 | bh->b_data); | 335 | bh->b_data); |
322 | ext3_journal_dirty_metadata(handle, bh); | 336 | err = ext3_journal_dirty_metadata(handle, bh); |
323 | exit_bh: | 337 | exit_bh: |
324 | brelse(bh); | 338 | brelse(bh); |
325 | 339 | ||
@@ -503,12 +517,19 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, | |||
503 | * reserved inode, and will become GDT blocks (primary and backup). | 517 | * reserved inode, and will become GDT blocks (primary and backup). |
504 | */ | 518 | */ |
505 | data[gdb_num % EXT3_ADDR_PER_BLOCK(sb)] = 0; | 519 | data[gdb_num % EXT3_ADDR_PER_BLOCK(sb)] = 0; |
506 | ext3_journal_dirty_metadata(handle, dind); | 520 | err = ext3_journal_dirty_metadata(handle, dind); |
521 | if (err) | ||
522 | goto exit_group_desc; | ||
507 | brelse(dind); | 523 | brelse(dind); |
524 | dind = NULL; | ||
508 | inode->i_blocks -= (gdbackups + 1) * sb->s_blocksize >> 9; | 525 | inode->i_blocks -= (gdbackups + 1) * sb->s_blocksize >> 9; |
509 | ext3_mark_iloc_dirty(handle, inode, &iloc); | 526 | err = ext3_mark_iloc_dirty(handle, inode, &iloc); |
527 | if (err) | ||
528 | goto exit_group_desc; | ||
510 | memset((*primary)->b_data, 0, sb->s_blocksize); | 529 | memset((*primary)->b_data, 0, sb->s_blocksize); |
511 | ext3_journal_dirty_metadata(handle, *primary); | 530 | err = ext3_journal_dirty_metadata(handle, *primary); |
531 | if (err) | ||
532 | goto exit_group_desc; | ||
512 | 533 | ||
513 | o_group_desc = EXT3_SB(sb)->s_group_desc; | 534 | o_group_desc = EXT3_SB(sb)->s_group_desc; |
514 | memcpy(n_group_desc, o_group_desc, | 535 | memcpy(n_group_desc, o_group_desc, |
@@ -519,10 +540,14 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, | |||
519 | kfree(o_group_desc); | 540 | kfree(o_group_desc); |
520 | 541 | ||
521 | le16_add_cpu(&es->s_reserved_gdt_blocks, -1); | 542 | le16_add_cpu(&es->s_reserved_gdt_blocks, -1); |
522 | ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); | 543 | err = ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); |
544 | if (err) | ||
545 | goto exit_inode; | ||
523 | 546 | ||
524 | return 0; | 547 | return 0; |
525 | 548 | ||
549 | exit_group_desc: | ||
550 | kfree(n_group_desc); | ||
526 | exit_inode: | 551 | exit_inode: |
527 | //ext3_journal_release_buffer(handle, iloc.bh); | 552 | //ext3_journal_release_buffer(handle, iloc.bh); |
528 | brelse(iloc.bh); | 553 | brelse(iloc.bh); |
@@ -706,16 +731,20 @@ static void update_backups(struct super_block *sb, | |||
706 | } | 731 | } |
707 | ext3_debug("update metadata backup %#04lx\n", | 732 | ext3_debug("update metadata backup %#04lx\n", |
708 | (unsigned long)bh->b_blocknr); | 733 | (unsigned long)bh->b_blocknr); |
709 | if ((err = ext3_journal_get_write_access(handle, bh))) | 734 | if ((err = ext3_journal_get_write_access(handle, bh))) { |
735 | brelse(bh); | ||
710 | break; | 736 | break; |
737 | } | ||
711 | lock_buffer(bh); | 738 | lock_buffer(bh); |
712 | memcpy(bh->b_data, data, size); | 739 | memcpy(bh->b_data, data, size); |
713 | if (rest) | 740 | if (rest) |
714 | memset(bh->b_data + size, 0, rest); | 741 | memset(bh->b_data + size, 0, rest); |
715 | set_buffer_uptodate(bh); | 742 | set_buffer_uptodate(bh); |
716 | unlock_buffer(bh); | 743 | unlock_buffer(bh); |
717 | ext3_journal_dirty_metadata(handle, bh); | 744 | err = ext3_journal_dirty_metadata(handle, bh); |
718 | brelse(bh); | 745 | brelse(bh); |
746 | if (err) | ||
747 | break; | ||
719 | } | 748 | } |
720 | if ((err2 = ext3_journal_stop(handle)) && !err) | 749 | if ((err2 = ext3_journal_stop(handle)) && !err) |
721 | err = err2; | 750 | err = err2; |
@@ -922,7 +951,9 @@ int ext3_group_add(struct super_block *sb, struct ext3_new_group_data *input) | |||
922 | /* Update the global fs size fields */ | 951 | /* Update the global fs size fields */ |
923 | sbi->s_groups_count++; | 952 | sbi->s_groups_count++; |
924 | 953 | ||
925 | ext3_journal_dirty_metadata(handle, primary); | 954 | err = ext3_journal_dirty_metadata(handle, primary); |
955 | if (err) | ||
956 | goto exit_journal; | ||
926 | 957 | ||
927 | /* Update the reserved block counts only once the new group is | 958 | /* Update the reserved block counts only once the new group is |
928 | * active. */ | 959 | * active. */ |
@@ -934,7 +965,7 @@ int ext3_group_add(struct super_block *sb, struct ext3_new_group_data *input) | |||
934 | percpu_counter_add(&sbi->s_freeinodes_counter, | 965 | percpu_counter_add(&sbi->s_freeinodes_counter, |
935 | EXT3_INODES_PER_GROUP(sb)); | 966 | EXT3_INODES_PER_GROUP(sb)); |
936 | 967 | ||
937 | ext3_journal_dirty_metadata(handle, sbi->s_sbh); | 968 | err = ext3_journal_dirty_metadata(handle, sbi->s_sbh); |
938 | 969 | ||
939 | exit_journal: | 970 | exit_journal: |
940 | mutex_unlock(&sbi->s_resize_lock); | 971 | mutex_unlock(&sbi->s_resize_lock); |
@@ -1064,8 +1095,14 @@ int ext3_group_extend(struct super_block *sb, struct ext3_super_block *es, | |||
1064 | goto exit_put; | 1095 | goto exit_put; |
1065 | } | 1096 | } |
1066 | es->s_blocks_count = cpu_to_le32(o_blocks_count + add); | 1097 | es->s_blocks_count = cpu_to_le32(o_blocks_count + add); |
1067 | ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); | 1098 | err = ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); |
1068 | mutex_unlock(&EXT3_SB(sb)->s_resize_lock); | 1099 | mutex_unlock(&EXT3_SB(sb)->s_resize_lock); |
1100 | if (err) { | ||
1101 | ext3_warning(sb, __func__, | ||
1102 | "error %d on journal dirty metadata", err); | ||
1103 | ext3_journal_stop(handle); | ||
1104 | goto exit_put; | ||
1105 | } | ||
1069 | ext3_debug("freeing blocks "E3FSBLK" through "E3FSBLK"\n", | 1106 | ext3_debug("freeing blocks "E3FSBLK" through "E3FSBLK"\n", |
1070 | o_blocks_count, o_blocks_count + add); | 1107 | o_blocks_count, o_blocks_count + add); |
1071 | ext3_free_blocks_sb(handle, sb, o_blocks_count, add, &freed_blocks); | 1108 | ext3_free_blocks_sb(handle, sb, o_blocks_count, add, &freed_blocks); |