mirror of
https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
synced 2024-11-23 18:14:25 +08:00
e2fsprogs: introduce ext2fs_close_free() helper
Currently there are many uses of ext2fs_close() which might be wrong. First of all ext2fs_close() does not set the ext2_filsys pointer to NULL so the caller is responsible for clearing it, however there are some cases there we do not do it. Second of all very small number of users of ext2fs_close() actually check the return value. If there is a problem in ext2fs_close() it will not even free the ext2_filsys structure, but majority of users expect it to do so. To fix both problems this commit introduces a new helper ext2fs_close_free() which will not only check for the return value and free the ext2_filsys structure if the call to ext2fs_close2() failed, but it will also set the ext2_filsys pointer to NULL. Replace every use of ext2fs_close() in e2fsprogs tools with ext2fs_close_free() - there is no real reason to keep using ext2fs_close(). Signed-off-by: Lukas Czerner <lczerner@redhat.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
e7822c1f40
commit
47fee2ef6a
1
debian/e2fslibs.symbols
vendored
1
debian/e2fslibs.symbols
vendored
@ -111,6 +111,7 @@ libext2fs.so.2 e2fslibs #MINVER#
|
||||
ext2fs_clear_inode_bitmap@Base 1.37
|
||||
ext2fs_close2@Base 1.42
|
||||
ext2fs_close@Base 1.37
|
||||
ext2fs_close_free@Base 1.42.11
|
||||
ext2fs_close_inode_scan@Base 1.37
|
||||
ext2fs_compare_block_bitmap@Base 1.37
|
||||
ext2fs_compare_generic_bitmap@Base 1.41.0
|
||||
|
@ -132,10 +132,9 @@ static void open_filesystem(char *device, int open_flags, blk64_t superblock,
|
||||
return;
|
||||
|
||||
errout:
|
||||
retval = ext2fs_close(current_fs);
|
||||
retval = ext2fs_close_free(¤t_fs);
|
||||
if (retval)
|
||||
com_err(device, retval, "while trying to close filesystem");
|
||||
current_fs = NULL;
|
||||
}
|
||||
|
||||
void do_open_filesys(int argc, char **argv)
|
||||
@ -241,10 +240,9 @@ static void close_filesystem(NOARGS)
|
||||
}
|
||||
if (current_qctx)
|
||||
quota_release_context(¤t_qctx);
|
||||
retval = ext2fs_close(current_fs);
|
||||
retval = ext2fs_close_free(¤t_fs);
|
||||
if (retval)
|
||||
com_err("ext2fs_close", retval, 0);
|
||||
current_fs = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -133,7 +133,7 @@ int main (int argc, char *argv[])
|
||||
}
|
||||
|
||||
|
||||
ext2fs_close(fs);
|
||||
ext2fs_close_free(&fs);
|
||||
|
||||
print_resource_track(&global_rtrack);
|
||||
|
||||
|
@ -458,8 +458,7 @@ static void check_if_skip(e2fsck_t ctx)
|
||||
}
|
||||
log_out(ctx, "\n");
|
||||
skip:
|
||||
ext2fs_close(fs);
|
||||
ctx->fs = NULL;
|
||||
ext2fs_close_free(&fs);
|
||||
e2fsck_free_context(ctx);
|
||||
exit(FSCK_OK);
|
||||
}
|
||||
@ -1307,12 +1306,12 @@ restart:
|
||||
orig_superblock = ctx->superblock;
|
||||
get_backup_sb(ctx, fs, ctx->filesystem_name, io_ptr);
|
||||
if (fs)
|
||||
ext2fs_close(fs);
|
||||
ext2fs_close_free(&fs);
|
||||
orig_retval = retval;
|
||||
retval = try_open_fs(ctx, flags, io_ptr, &fs);
|
||||
if ((orig_retval == 0) && retval != 0) {
|
||||
if (fs)
|
||||
ext2fs_close(fs);
|
||||
ext2fs_close_free(&fs);
|
||||
log_out(ctx, _("%s: %s while using the "
|
||||
"backup blocks"),
|
||||
ctx->program_name,
|
||||
@ -1406,7 +1405,7 @@ failure:
|
||||
* reopen the filesystem after we get the device size.
|
||||
*/
|
||||
if (pctx.errcode == EBUSY) {
|
||||
ext2fs_close(fs);
|
||||
ext2fs_close_free(&fs);
|
||||
need_restart++;
|
||||
pctx.errcode =
|
||||
ext2fs_get_device_size2(ctx->filesystem_name,
|
||||
@ -1462,8 +1461,7 @@ failure:
|
||||
/*
|
||||
* Restart in order to reopen fs but this time start mmp.
|
||||
*/
|
||||
ext2fs_close(fs);
|
||||
ctx->fs = NULL;
|
||||
ext2fs_close_free(&fs);
|
||||
flags &= ~EXT2_FLAG_SKIP_MMP;
|
||||
goto restart;
|
||||
}
|
||||
@ -1513,8 +1511,7 @@ failure:
|
||||
ctx->device_name);
|
||||
fatal_error(ctx, 0);
|
||||
}
|
||||
ext2fs_close(ctx->fs);
|
||||
ctx->fs = 0;
|
||||
ext2fs_close_free(&ctx->fs);
|
||||
ctx->flags |= E2F_FLAG_RESTARTED;
|
||||
goto restart;
|
||||
}
|
||||
@ -1693,7 +1690,7 @@ no_journal:
|
||||
_("while resetting context"));
|
||||
fatal_error(ctx, 0);
|
||||
}
|
||||
ext2fs_close(fs);
|
||||
ext2fs_close_free(&fs);
|
||||
goto restart;
|
||||
}
|
||||
if (run_result & E2F_FLAG_CANCEL) {
|
||||
@ -1775,8 +1772,7 @@ no_journal:
|
||||
io_channel_flush(ctx->fs->io);
|
||||
print_resource_track(ctx, NULL, &ctx->global_rtrack, ctx->fs->io);
|
||||
|
||||
ext2fs_close(fs);
|
||||
ctx->fs = NULL;
|
||||
ext2fs_close_free(&fs);
|
||||
free(ctx->journal_name);
|
||||
|
||||
e2fsck_free_context(ctx);
|
||||
|
@ -319,7 +319,7 @@ void preenhalt(e2fsck_t ctx)
|
||||
if (fs != NULL) {
|
||||
fs->super->s_state |= EXT2_ERROR_FS;
|
||||
ext2fs_mark_super_dirty(fs);
|
||||
ext2fs_close(fs);
|
||||
ext2fs_close_free(&fs);
|
||||
}
|
||||
exit(FSCK_UNCORRECTED);
|
||||
}
|
||||
|
@ -437,6 +437,18 @@ errout:
|
||||
return retval;
|
||||
}
|
||||
|
||||
errcode_t ext2fs_close_free(ext2_filsys *fs_ptr)
|
||||
{
|
||||
errcode_t ret;
|
||||
ext2_filsys fs = *fs_ptr;
|
||||
|
||||
ret = ext2fs_close2(fs, 0);
|
||||
if (ret)
|
||||
ext2fs_free(fs);
|
||||
*fs_ptr = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
errcode_t ext2fs_close(ext2_filsys fs)
|
||||
{
|
||||
return ext2fs_close2(fs, 0);
|
||||
|
@ -927,6 +927,7 @@ extern errcode_t ext2fs_check_desc(ext2_filsys fs);
|
||||
/* closefs.c */
|
||||
extern errcode_t ext2fs_close(ext2_filsys fs);
|
||||
extern errcode_t ext2fs_close2(ext2_filsys fs, int flags);
|
||||
extern errcode_t ext2fs_close_free(ext2_filsys *fs);
|
||||
extern errcode_t ext2fs_flush(ext2_filsys fs);
|
||||
extern errcode_t ext2fs_flush2(ext2_filsys fs, int flags);
|
||||
extern int ext2fs_bg_has_super(ext2_filsys fs, dgrp_t group_block);
|
||||
|
@ -642,7 +642,7 @@ main(int argc, char **argv)
|
||||
if (retval) {
|
||||
printf("Warning, had trouble writing out superblocks.\n");
|
||||
}
|
||||
ext2fs_close(fs);
|
||||
ext2fs_close_free(&fs);
|
||||
exit(0);
|
||||
|
||||
}
|
||||
|
@ -187,8 +187,7 @@ static void setup_filesystem(const char *name,
|
||||
return;
|
||||
|
||||
errout:
|
||||
ext2fs_close(test_fs);
|
||||
test_fs = 0;
|
||||
ext2fs_close_free(&test_fs);
|
||||
}
|
||||
|
||||
void setup_cmd(int argc, char **argv)
|
||||
@ -199,10 +198,8 @@ void setup_cmd(int argc, char **argv)
|
||||
unsigned int type = EXT2FS_BMAP64_BITARRAY;
|
||||
int flags = EXT2_FLAG_64BITS;
|
||||
|
||||
if (test_fs) {
|
||||
ext2fs_close(test_fs);
|
||||
test_fs = 0;
|
||||
}
|
||||
if (test_fs)
|
||||
ext2fs_close_free(&test_fs);
|
||||
|
||||
reset_getopt();
|
||||
while ((c = getopt(argc, argv, "b:i:lt:")) != EOF) {
|
||||
@ -242,8 +239,7 @@ void close_cmd(int argc, char **argv)
|
||||
if (check_fs_open(argv[0]))
|
||||
return;
|
||||
|
||||
ext2fs_close(test_fs);
|
||||
test_fs = 0;
|
||||
ext2fs_close_free(&test_fs);
|
||||
}
|
||||
|
||||
|
||||
|
@ -614,7 +614,7 @@ int main (int argc, char ** argv)
|
||||
if (fs->super->s_feature_incompat &
|
||||
EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) {
|
||||
print_journal_information(fs);
|
||||
ext2fs_close(fs);
|
||||
ext2fs_close_free(&fs);
|
||||
exit(0);
|
||||
}
|
||||
if ((fs->super->s_feature_compat &
|
||||
@ -623,7 +623,7 @@ int main (int argc, char ** argv)
|
||||
print_inline_journal_information(fs);
|
||||
list_bad_blocks(fs, 0);
|
||||
if (header_only) {
|
||||
ext2fs_close (fs);
|
||||
ext2fs_close_free(&fs);
|
||||
exit (0);
|
||||
}
|
||||
retval = ext2fs_read_bitmaps (fs);
|
||||
@ -634,7 +634,7 @@ int main (int argc, char ** argv)
|
||||
error_message(retval));
|
||||
}
|
||||
}
|
||||
ext2fs_close (fs);
|
||||
ext2fs_close_free(&fs);
|
||||
remove_error_table(&et_ext2_error_table);
|
||||
exit (0);
|
||||
}
|
||||
|
@ -215,7 +215,7 @@ static errcode_t get_chunk_info(ext2_filsys fs, struct chunk_info *info,
|
||||
|
||||
static void close_device(char *device_name, ext2_filsys fs)
|
||||
{
|
||||
int retval = ext2fs_close(fs);
|
||||
int retval = ext2fs_close_free(&fs);
|
||||
|
||||
if (retval)
|
||||
com_err(device_name, retval, "while closing the filesystem.\n");
|
||||
|
@ -1428,7 +1428,7 @@ static void install_image(char *device, char *image_fn, int type)
|
||||
}
|
||||
|
||||
close(fd);
|
||||
ext2fs_close (fs);
|
||||
ext2fs_close_free(&fs);
|
||||
}
|
||||
|
||||
static struct ext2_qcow2_hdr *check_qcow2_image(int *fd, char *name)
|
||||
@ -1662,7 +1662,7 @@ skip_device:
|
||||
else
|
||||
write_image_file(fs, fd);
|
||||
|
||||
ext2fs_close (fs);
|
||||
ext2fs_close_free(&fs);
|
||||
if (check)
|
||||
printf(_("%d blocks already contained the data to be copied\n"),
|
||||
skipped_blocks);
|
||||
|
@ -1808,7 +1808,7 @@ int main(int argc, char *argv[])
|
||||
feature_incompat = fs->super->s_feature_incompat;
|
||||
log_groups_per_flex = fs->super->s_log_groups_per_flex;
|
||||
|
||||
ext2fs_close(fs);
|
||||
ext2fs_close_free(&fs);
|
||||
}
|
||||
|
||||
switch (arg_type) {
|
||||
|
@ -1751,7 +1751,7 @@ profile_error:
|
||||
printf(_("Using journal device's blocksize: %d\n"), blocksize);
|
||||
fs_param.s_log_block_size =
|
||||
int_log2(blocksize >> EXT2_MIN_BLOCK_LOG_SIZE);
|
||||
ext2fs_close(jfs);
|
||||
ext2fs_close_free(&jfs);
|
||||
}
|
||||
|
||||
if (optind < argc) {
|
||||
@ -2708,7 +2708,7 @@ int main (int argc, char *argv[])
|
||||
if (fs->super->s_feature_incompat &
|
||||
EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) {
|
||||
create_journal_dev(fs);
|
||||
exit(ext2fs_close(fs) ? 1 : 0);
|
||||
exit(ext2fs_close_free(&fs) ? 1 : 0);
|
||||
}
|
||||
|
||||
if (bad_blocks_filename)
|
||||
@ -2830,7 +2830,7 @@ int main (int argc, char *argv[])
|
||||
}
|
||||
if (!quiet)
|
||||
printf("%s", _("done\n"));
|
||||
ext2fs_close(jfs);
|
||||
ext2fs_close_free(&jfs);
|
||||
free(journal_device);
|
||||
} else if ((journal_size) ||
|
||||
(fs_param.s_feature_compat &
|
||||
@ -2894,7 +2894,7 @@ no_journal:
|
||||
"filesystem accounting information: "));
|
||||
checkinterval = fs->super->s_checkinterval;
|
||||
max_mnt_count = fs->super->s_max_mnt_count;
|
||||
retval = ext2fs_close(fs);
|
||||
retval = ext2fs_close_free(&fs);
|
||||
if (retval) {
|
||||
fprintf(stderr, "%s",
|
||||
_("\nWarning, had trouble writing out superblocks."));
|
||||
|
@ -698,7 +698,7 @@ static int add_journal(ext2_filsys fs)
|
||||
fflush(stdout);
|
||||
|
||||
retval = ext2fs_add_journal_device(fs, jfs);
|
||||
ext2fs_close(jfs);
|
||||
ext2fs_close_free(&jfs);
|
||||
if (retval) {
|
||||
com_err(program_name, retval,
|
||||
_("while adding filesystem to journal on %s"),
|
||||
@ -2001,7 +2001,7 @@ retry_open:
|
||||
goto closefs;
|
||||
}
|
||||
if (io_ptr != io_ptr_orig) {
|
||||
ext2fs_close(fs);
|
||||
ext2fs_close_free(&fs);
|
||||
goto retry_open;
|
||||
}
|
||||
}
|
||||
@ -2289,5 +2289,5 @@ closefs:
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return (ext2fs_close(fs) ? 1 : 0);
|
||||
return (ext2fs_close_free(&fs) ? 1 : 0);
|
||||
}
|
||||
|
@ -140,7 +140,7 @@ static void print_ext2_info(const char *device)
|
||||
tm = sb->s_wtime;
|
||||
printf(_("\tlast modified on %s"), ctime(&tm));
|
||||
}
|
||||
ext2fs_close(fs);
|
||||
ext2fs_close_free(&fs);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -464,7 +464,7 @@ int main (int argc, char ** argv)
|
||||
_("Please run 'e2fsck -fy %s' to fix the filesystem\n"
|
||||
"after the aborted resize operation.\n"),
|
||||
device_name);
|
||||
ext2fs_close(fs);
|
||||
ext2fs_close_free(&fs);
|
||||
exit(1);
|
||||
}
|
||||
printf(_("The filesystem on %s is now %llu blocks long.\n\n"),
|
||||
|
@ -202,7 +202,7 @@ errcode_t resize_fs(ext2_filsys fs, blk64_t *new_size, int flags,
|
||||
rfs->new_fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
|
||||
|
||||
print_resource_track(rfs, &overall_track, fs->io);
|
||||
retval = ext2fs_close(rfs->new_fs);
|
||||
retval = ext2fs_close_free(&rfs->new_fs);
|
||||
if (retval)
|
||||
goto errout;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user