@@ -1134,31 +1134,9 @@ static errcode_t try_open_fs(e2fsck_t ctx, int flags, io_manager io_ptr,
ext2_filsys *ret_fs)
{
errcode_t retval;
-
- *ret_fs = NULL;
- if (ctx->superblock && ctx->blocksize) {
- retval = ext2fs_open2(ctx->filesystem_name, ctx->io_options,
- flags, ctx->superblock, ctx->blocksize,
- io_ptr, ret_fs);
- } else if (ctx->superblock) {
- int blocksize;
- for (blocksize = EXT2_MIN_BLOCK_SIZE;
- blocksize <= EXT2_MAX_BLOCK_SIZE; blocksize *= 2) {
- if (*ret_fs) {
- ext2fs_free(*ret_fs);
- *ret_fs = NULL;
- }
- retval = ext2fs_open2(ctx->filesystem_name,
- ctx->io_options, flags,
- ctx->superblock, blocksize,
- io_ptr, ret_fs);
- if (!retval)
- break;
- }
- } else
- retval = ext2fs_open2(ctx->filesystem_name, ctx->io_options,
- flags, 0, 0, io_ptr, ret_fs);
-
+ retval = ext2fs_open2(ctx->filesystem_name, ctx->io_options,
+ flags, ctx->superblock, ctx->blocksize,
+ io_ptr, ret_fs);
if (retval == 0) {
(*ret_fs)->priv_data = ctx;
e2fsck_set_bitmap_type(*ret_fs, EXT2FS_BMAP64_RBTREE,
@@ -1588,6 +1588,10 @@ extern errcode_t ext2fs_open2(const char *name, const char *io_options,
int flags, int superblock,
unsigned int block_size, io_manager manager,
ext2_filsys *ret_fs);
+extern errcode_t ext2fs_try_open_fs(char *filesystem_name, char *io_options,
+ blk64_t superblock, int blocksize, int flags,
+ io_manager io_ptr, ext2_filsys *ret_fs);
+
/*
* The dgrp_t argument to these two functions is not actually a group number
* but a block number offset within a group table! Convert with the formula
@@ -108,7 +108,7 @@ errcode_t ext2fs_open(const char *name, int flags, int superblock,
* EXT2_FLAG_64BITS - Allow 64-bit bitfields (needed for large
* filesystems)
*/
-errcode_t ext2fs_open2(const char *name, const char *io_options,
+static errcode_t __ext2fs_open2(const char *name, const char *io_options,
int flags, int superblock,
unsigned int block_size, io_manager manager,
ext2_filsys *ret_fs)
@@ -497,6 +497,40 @@ cleanup:
return retval;
}
+errcode_t ext2fs_open2(const char *name, const char *io_options,
+ int flags, int superblock,
+ unsigned int block_size, io_manager manager,
+ ext2_filsys *ret_fs)
+{
+ errcode_t retval;
+
+ *ret_fs = NULL;
+ if (superblock && block_size) {
+ retval = __ext2fs_open2(name, io_options,
+ flags, superblock, block_size,
+ manager, ret_fs);
+ } else if (superblock) {
+ int block_size;
+
+ for (block_size = EXT2_MIN_BLOCK_SIZE;
+ block_size <= EXT2_MAX_BLOCK_SIZE; block_size *= 2) {
+ if (*ret_fs) {
+ ext2fs_free(*ret_fs);
+ *ret_fs = NULL;
+ }
+ retval = __ext2fs_open2(name,
+ io_options, flags,
+ superblock, block_size,
+ manager, ret_fs);
+ if (!retval)
+ break;
+ }
+ } else
+ retval = __ext2fs_open2(name, io_options,
+ flags, 0, 0, manager, ret_fs);
+ return retval;
+}
+
/*
* Set/get the filesystem data I/O channel.
*
@@ -568,20 +568,9 @@ int main (int argc, char ** argv)
if (image_dump)
flags |= EXT2_FLAG_IMAGE_FILE;
try_open_again:
- if (use_superblock && !use_blocksize) {
- for (use_blocksize = EXT2_MIN_BLOCK_SIZE;
- use_blocksize <= EXT2_MAX_BLOCK_SIZE;
- use_blocksize *= 2) {
- retval = ext2fs_open (device_name, flags,
- use_superblock,
- use_blocksize, unix_io_manager,
- &fs);
- if (!retval)
- break;
- }
- } else
- retval = ext2fs_open (device_name, flags, use_superblock,
- use_blocksize, unix_io_manager, &fs);
+ retval = ext2fs_open2(device_name, 0,
+ flags, use_superblock, use_blocksize,
+ unix_io_manager, &fs);
if (retval && !(flags & EXT2_FLAG_IGNORE_CSUM_ERRORS)) {
flags |= EXT2_FLAG_IGNORE_CSUM_ERRORS;
goto try_open_again;