|
@@ -1416,6 +1416,7 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent)
|
|
|
int i;
|
|
|
int needs_recovery;
|
|
|
__le32 features;
|
|
|
+ int err;
|
|
|
|
|
|
sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
|
|
|
if (!sbi)
|
|
@@ -1675,12 +1676,20 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent)
|
|
|
get_random_bytes(&sbi->s_next_generation, sizeof(u32));
|
|
|
spin_lock_init(&sbi->s_next_gen_lock);
|
|
|
|
|
|
- percpu_counter_init(&sbi->s_freeblocks_counter,
|
|
|
- ext3_count_free_blocks(sb));
|
|
|
- percpu_counter_init(&sbi->s_freeinodes_counter,
|
|
|
- ext3_count_free_inodes(sb));
|
|
|
- percpu_counter_init(&sbi->s_dirs_counter,
|
|
|
- ext3_count_dirs(sb));
|
|
|
+ err = percpu_counter_init(&sbi->s_freeblocks_counter,
|
|
|
+ ext3_count_free_blocks(sb));
|
|
|
+ if (!err) {
|
|
|
+ err = percpu_counter_init(&sbi->s_freeinodes_counter,
|
|
|
+ ext3_count_free_inodes(sb));
|
|
|
+ }
|
|
|
+ if (!err) {
|
|
|
+ err = percpu_counter_init(&sbi->s_dirs_counter,
|
|
|
+ ext3_count_dirs(sb));
|
|
|
+ }
|
|
|
+ if (err) {
|
|
|
+ printk(KERN_ERR "EXT3-fs: insufficient memory\n");
|
|
|
+ goto failed_mount3;
|
|
|
+ }
|
|
|
|
|
|
/* per fileystem reservation list head & lock */
|
|
|
spin_lock_init(&sbi->s_rsv_window_lock);
|