diff options
-rw-r--r-- | fs/jbd2/journal.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index fe20e40ee7c3..2932c8f55199 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c | |||
@@ -632,6 +632,8 @@ struct journal_head *jbd2_journal_get_descriptor_buffer(journal_t *journal) | |||
632 | return NULL; | 632 | return NULL; |
633 | 633 | ||
634 | bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); | 634 | bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); |
635 | if (!bh) | ||
636 | return NULL; | ||
635 | lock_buffer(bh); | 637 | lock_buffer(bh); |
636 | memset(bh->b_data, 0, journal->j_blocksize); | 638 | memset(bh->b_data, 0, journal->j_blocksize); |
637 | set_buffer_uptodate(bh); | 639 | set_buffer_uptodate(bh); |
@@ -1021,15 +1023,14 @@ journal_t * jbd2_journal_init_dev(struct block_device *bdev, | |||
1021 | 1023 | ||
1022 | /* journal descriptor can store up to n blocks -bzzz */ | 1024 | /* journal descriptor can store up to n blocks -bzzz */ |
1023 | journal->j_blocksize = blocksize; | 1025 | journal->j_blocksize = blocksize; |
1026 | jbd2_stats_proc_init(journal); | ||
1024 | n = journal->j_blocksize / sizeof(journal_block_tag_t); | 1027 | n = journal->j_blocksize / sizeof(journal_block_tag_t); |
1025 | journal->j_wbufsize = n; | 1028 | journal->j_wbufsize = n; |
1026 | journal->j_wbuf = kmalloc(n * sizeof(struct buffer_head*), GFP_KERNEL); | 1029 | journal->j_wbuf = kmalloc(n * sizeof(struct buffer_head*), GFP_KERNEL); |
1027 | if (!journal->j_wbuf) { | 1030 | if (!journal->j_wbuf) { |
1028 | printk(KERN_ERR "%s: Cant allocate bhs for commit thread\n", | 1031 | printk(KERN_ERR "%s: Cant allocate bhs for commit thread\n", |
1029 | __func__); | 1032 | __func__); |
1030 | kfree(journal); | 1033 | goto out_err; |
1031 | journal = NULL; | ||
1032 | goto out; | ||
1033 | } | 1034 | } |
1034 | journal->j_dev = bdev; | 1035 | journal->j_dev = bdev; |
1035 | journal->j_fs_dev = fs_dev; | 1036 | journal->j_fs_dev = fs_dev; |
@@ -1039,14 +1040,22 @@ journal_t * jbd2_journal_init_dev(struct block_device *bdev, | |||
1039 | p = journal->j_devname; | 1040 | p = journal->j_devname; |
1040 | while ((p = strchr(p, '/'))) | 1041 | while ((p = strchr(p, '/'))) |
1041 | *p = '!'; | 1042 | *p = '!'; |
1042 | jbd2_stats_proc_init(journal); | ||
1043 | 1043 | ||
1044 | bh = __getblk(journal->j_dev, start, journal->j_blocksize); | 1044 | bh = __getblk(journal->j_dev, start, journal->j_blocksize); |
1045 | J_ASSERT(bh != NULL); | 1045 | if (!bh) { |
1046 | printk(KERN_ERR | ||
1047 | "%s: Cannot get buffer for journal superblock\n", | ||
1048 | __func__); | ||
1049 | goto out_err; | ||
1050 | } | ||
1046 | journal->j_sb_buffer = bh; | 1051 | journal->j_sb_buffer = bh; |
1047 | journal->j_superblock = (journal_superblock_t *)bh->b_data; | 1052 | journal->j_superblock = (journal_superblock_t *)bh->b_data; |
1048 | out: | 1053 | |
1049 | return journal; | 1054 | return journal; |
1055 | out_err: | ||
1056 | jbd2_stats_proc_exit(journal); | ||
1057 | kfree(journal); | ||
1058 | return NULL; | ||
1050 | } | 1059 | } |
1051 | 1060 | ||
1052 | /** | 1061 | /** |
@@ -1094,9 +1103,7 @@ journal_t * jbd2_journal_init_inode (struct inode *inode) | |||
1094 | if (!journal->j_wbuf) { | 1103 | if (!journal->j_wbuf) { |
1095 | printk(KERN_ERR "%s: Cant allocate bhs for commit thread\n", | 1104 | printk(KERN_ERR "%s: Cant allocate bhs for commit thread\n", |
1096 | __func__); | 1105 | __func__); |
1097 | jbd2_stats_proc_exit(journal); | 1106 | goto out_err; |
1098 | kfree(journal); | ||
1099 | return NULL; | ||
1100 | } | 1107 | } |
1101 | 1108 | ||
1102 | err = jbd2_journal_bmap(journal, 0, &blocknr); | 1109 | err = jbd2_journal_bmap(journal, 0, &blocknr); |
@@ -1104,17 +1111,24 @@ journal_t * jbd2_journal_init_inode (struct inode *inode) | |||
1104 | if (err) { | 1111 | if (err) { |
1105 | printk(KERN_ERR "%s: Cannnot locate journal superblock\n", | 1112 | printk(KERN_ERR "%s: Cannnot locate journal superblock\n", |
1106 | __func__); | 1113 | __func__); |
1107 | jbd2_stats_proc_exit(journal); | 1114 | goto out_err; |
1108 | kfree(journal); | ||
1109 | return NULL; | ||
1110 | } | 1115 | } |
1111 | 1116 | ||
1112 | bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); | 1117 | bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); |
1113 | J_ASSERT(bh != NULL); | 1118 | if (!bh) { |
1119 | printk(KERN_ERR | ||
1120 | "%s: Cannot get buffer for journal superblock\n", | ||
1121 | __func__); | ||
1122 | goto out_err; | ||
1123 | } | ||
1114 | journal->j_sb_buffer = bh; | 1124 | journal->j_sb_buffer = bh; |
1115 | journal->j_superblock = (journal_superblock_t *)bh->b_data; | 1125 | journal->j_superblock = (journal_superblock_t *)bh->b_data; |
1116 | 1126 | ||
1117 | return journal; | 1127 | return journal; |
1128 | out_err: | ||
1129 | jbd2_stats_proc_exit(journal); | ||
1130 | kfree(journal); | ||
1131 | return NULL; | ||
1118 | } | 1132 | } |
1119 | 1133 | ||
1120 | /* | 1134 | /* |