Whamcloud - gitweb
Merge branch 'maint'
[tools/e2fsprogs.git] / lib / ext2fs / openfs.c
index 2cc0336..a6a8217 100644 (file)
@@ -39,7 +39,7 @@ blk_t ext2fs_descriptor_block_loc(ext2_filsys fs, blk_t group_block, dgrp_t i)
            (i < fs->super->s_first_meta_bg))
                return (group_block + i + 1);
 
-       bg = (fs->blocksize / sizeof (struct ext2_group_desc)) * i;
+       bg = EXT2_DESC_PER_BLOCK(fs->super) * i;
        if (ext2fs_bg_has_super(fs, bg))
                has_super = 1;
        ret_blk = ext2fs_group_first_block(fs, bg) + has_super;
@@ -280,14 +280,14 @@ errcode_t ext2fs_open2(const char *name, const char *io_options,
                                               blocks_per_group);
        fs->desc_blocks = ext2fs_div_ceil(fs->group_desc_count,
                                          EXT2_DESC_PER_BLOCK(fs->super));
-       retval = ext2fs_get_mem(fs->desc_blocks * fs->blocksize,
+       retval = ext2fs_get_array(fs->desc_blocks, fs->blocksize,
                                &fs->group_desc);
        if (retval)
                goto cleanup;
        if (!group_block)
                group_block = fs->super->s_first_data_block;
        dest = (char *) fs->group_desc;
-       groups_per_block = fs->blocksize / sizeof(struct ext2_group_desc);
+       groups_per_block = EXT2_DESC_PER_BLOCK(fs->super);
        for (i=0 ; i < fs->desc_blocks; i++) {
                blk = ext2fs_descriptor_block_loc(fs, group_block, i);
                retval = io_channel_read_blk(fs->io, blk, 1, dest);
@@ -303,10 +303,14 @@ errcode_t ext2fs_open2(const char *name, const char *io_options,
 
        fs->stride = fs->super->s_raid_stride;
 
+       fs->flags &= ~EXT2_FLAG_NOFREE_ON_ERROR;
        *ret_fs = fs;
        return 0;
 cleanup:
-       ext2fs_free(fs);
+       if (flags & EXT2_FLAG_NOFREE_ON_ERROR)
+               *ret_fs = fs;
+       else
+               ext2fs_free(fs);
        return retval;
 }