On Thu, 20 Feb 2014, Darrick J. Wong wrote: > Date: Thu, 20 Feb 2014 11:39:24 -0800 > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > To: Lukas Czerner <lczerner@xxxxxxxxxx> > Cc: linux-ext4@xxxxxxxxxxxxxxx, tytso@xxxxxxx > Subject: Re: [PATCH] e2fsprogs: introduce ext2fs_close_free() helper > > On Thu, Feb 20, 2014 at 04:02:29PM +0100, Lukas Czerner wrote: > > 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(). > > I think I like this. :) > > Reviewed-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> Hi Ted, are you planning to take this in ? Thanks! -Lukas > > --D > > > > Signed-off-by: Lukas Czerner <lczerner@xxxxxxxxxx> > > --- > > debugfs/debugfs.c | 6 ++---- > > e2fsck/scantest.c | 2 +- > > e2fsck/unix.c | 20 ++++++++------------ > > e2fsck/util.c | 2 +- > > lib/ext2fs/closefs.c | 12 ++++++++++++ > > lib/ext2fs/ext2fs.h | 1 + > > lib/ext2fs/mkjournal.c | 2 +- > > lib/ext2fs/tst_bitmaps.c | 12 ++++-------- > > misc/dumpe2fs.c | 6 +++--- > > misc/e2freefrag.c | 2 +- > > misc/e2image.c | 4 ++-- > > misc/e4defrag.c | 2 +- > > misc/mke2fs.c | 8 ++++---- > > misc/tune2fs.c | 6 +++--- > > resize/main.c | 2 +- > > resize/resize2fs.c | 2 +- > > 16 files changed, 46 insertions(+), 43 deletions(-) > > > > diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c > > index d8d6d76..7db6bda 100644 > > --- a/debugfs/debugfs.c > > +++ b/debugfs/debugfs.c > > @@ -131,10 +131,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) > > @@ -238,10 +237,9 @@ static void close_filesystem(NOARGS) > > if (retval) > > com_err("ext2fs_write_block_bitmap", retval, 0); > > } > > - retval = ext2fs_close(current_fs); > > + retval = ext2fs_close_free(¤t_fs); > > if (retval) > > com_err("ext2fs_close", retval, 0); > > - current_fs = NULL; > > return; > > } > > > > diff --git a/e2fsck/scantest.c b/e2fsck/scantest.c > > index 16380b3..6131141 100644 > > --- a/e2fsck/scantest.c > > +++ b/e2fsck/scantest.c > > @@ -133,7 +133,7 @@ int main (int argc, char *argv[]) > > } > > > > > > - ext2fs_close(fs); > > + ext2fs_close_free(&fs); > > > > print_resource_track(&global_rtrack); > > > > diff --git a/e2fsck/unix.c b/e2fsck/unix.c > > index 429f1cd..593106b 100644 > > --- a/e2fsck/unix.c > > +++ b/e2fsck/unix.c > > @@ -451,8 +451,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); > > } > > @@ -1304,12 +1303,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, > > @@ -1403,7 +1402,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, > > @@ -1460,8 +1459,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; > > } > > @@ -1511,8 +1509,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; > > } > > @@ -1691,7 +1688,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) { > > @@ -1773,8 +1770,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); > > diff --git a/e2fsck/util.c b/e2fsck/util.c > > index e7e8704..784577f 100644 > > --- a/e2fsck/util.c > > +++ b/e2fsck/util.c > > @@ -321,7 +321,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); > > } > > diff --git a/lib/ext2fs/closefs.c b/lib/ext2fs/closefs.c > > index c2eaec1..e7ec0ae 100644 > > --- a/lib/ext2fs/closefs.c > > +++ b/lib/ext2fs/closefs.c > > @@ -450,6 +450,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); > > diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h > > index 7f7fd1f..253244d 100644 > > --- a/lib/ext2fs/ext2fs.h > > +++ b/lib/ext2fs/ext2fs.h > > @@ -945,6 +945,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); > > diff --git a/lib/ext2fs/mkjournal.c b/lib/ext2fs/mkjournal.c > > index 884d9c0..2331e9e 100644 > > --- a/lib/ext2fs/mkjournal.c > > +++ b/lib/ext2fs/mkjournal.c > > @@ -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); > > > > } > > diff --git a/lib/ext2fs/tst_bitmaps.c b/lib/ext2fs/tst_bitmaps.c > > index 4e02ade..574fb7a 100644 > > --- a/lib/ext2fs/tst_bitmaps.c > > +++ b/lib/ext2fs/tst_bitmaps.c > > @@ -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); > > } > > > > > > diff --git a/misc/dumpe2fs.c b/misc/dumpe2fs.c > > index ae54f8a..f2f62bf 100644 > > --- a/misc/dumpe2fs.c > > +++ b/misc/dumpe2fs.c > > @@ -651,7 +651,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 & > > @@ -660,7 +660,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); > > @@ -671,7 +671,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); > > } > > diff --git a/misc/e2freefrag.c b/misc/e2freefrag.c > > index 612ca44..bb72c70 100644 > > --- a/misc/e2freefrag.c > > +++ b/misc/e2freefrag.c > > @@ -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"); > > diff --git a/misc/e2image.c b/misc/e2image.c > > index b768826..f8457ab 100644 > > --- a/misc/e2image.c > > +++ b/misc/e2image.c > > @@ -1415,7 +1415,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) > > @@ -1648,7 +1648,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); > > diff --git a/misc/e4defrag.c b/misc/e4defrag.c > > index c2695e8..89bdfb9 100644 > > --- a/misc/e4defrag.c > > +++ b/misc/e4defrag.c > > @@ -1852,7 +1852,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) { > > diff --git a/misc/mke2fs.c b/misc/mke2fs.c > > index facbe4c..90c214e 100644 > > --- a/misc/mke2fs.c > > +++ b/misc/mke2fs.c > > @@ -1774,7 +1774,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) { > > @@ -2789,7 +2789,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) > > @@ -2909,7 +2909,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 & > > @@ -2973,7 +2973,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.")); > > diff --git a/misc/tune2fs.c b/misc/tune2fs.c > > index 8ff47d2..c651d55 100644 > > --- a/misc/tune2fs.c > > +++ b/misc/tune2fs.c > > @@ -1205,7 +1205,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"), > > @@ -2512,7 +2512,7 @@ retry_open: > > goto closefs; > > } > > if (io_ptr != io_ptr_orig) { > > - ext2fs_close(fs); > > + ext2fs_close_free(&fs); > > goto retry_open; > > } > > } > > @@ -2805,5 +2805,5 @@ closefs: > > exit(1); > > } > > > > - return (ext2fs_close(fs) ? 1 : 0); > > + return (ext2fs_close_free(&fs) ? 1 : 0); > > } > > diff --git a/resize/main.c b/resize/main.c > > index 2b7abff..c575220 100644 > > --- a/resize/main.c > > +++ b/resize/main.c > > @@ -468,7 +468,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"), > > diff --git a/resize/resize2fs.c b/resize/resize2fs.c > > index 8353338..9a51733 100644 > > --- a/resize/resize2fs.c > > +++ b/resize/resize2fs.c > > @@ -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; > > > > -- > > 1.8.3.1 > > > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > > the body of a message to majordomo@xxxxxxxxxxxxxxx > > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html