On 3/20/18 10:40 PM, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > Use the libfrog path finding code to determine if the argument being > passed in is a mountpoint, remove all mention of taking a block device > (we have never supported that) from the documentation, and fix some > potential memory leaks. > > Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> now with 100% mount point! Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx> > --- > man/man8/xfs_scrub.8 | 2 + > scrub/common.c | 69 -------------------------------------------------- > scrub/common.h | 1 - > scrub/phase1.c | 12 --------- > scrub/xfs_scrub.c | 19 +++++++------- > scrub/xfs_scrub.h | 1 - > 6 files changed, 10 insertions(+), 94 deletions(-) > > > diff --git a/man/man8/xfs_scrub.8 b/man/man8/xfs_scrub.8 > index 77fed92..680ef72 100644 > --- a/man/man8/xfs_scrub.8 > +++ b/man/man8/xfs_scrub.8 > @@ -6,7 +6,7 @@ xfs_scrub \- check the contents of a mounted XFS filesystem > [ > .B \-abCemnTvx > ] > -.RI "[" mount-point " | " block-device "]" > +.I mount-point > .br > .B xfs_scrub \-V > .SH DESCRIPTION > diff --git a/scrub/common.c b/scrub/common.c > index 5a37a98..722bf36 100644 > --- a/scrub/common.c > +++ b/scrub/common.c > @@ -267,75 +267,6 @@ scrub_nproc_workqueue( > } > > /* > - * Check if the argument is either the device name or mountpoint of a mounted > - * filesystem. > - */ > -#define MNTTYPE_XFS "xfs" > -static bool > -find_mountpoint_check( > - struct stat *sb, > - struct mntent *t) > -{ > - struct stat ms; > - > - if (S_ISDIR(sb->st_mode)) { /* mount point */ > - if (stat(t->mnt_dir, &ms) < 0) > - return false; > - if (sb->st_ino != ms.st_ino) > - return false; > - if (sb->st_dev != ms.st_dev) > - return false; > - if (strcmp(t->mnt_type, MNTTYPE_XFS) != 0) > - return NULL; > - } else { /* device */ > - if (stat(t->mnt_fsname, &ms) < 0) > - return false; > - if (sb->st_rdev != ms.st_rdev) > - return false; > - if (strcmp(t->mnt_type, MNTTYPE_XFS) != 0) > - return NULL; > - /* > - * Make sure the mountpoint given by mtab is accessible > - * before using it. > - */ > - if (stat(t->mnt_dir, &ms) < 0) > - return false; > - } > - > - return true; > -} > - > -/* Check that our alleged mountpoint is in mtab */ > -bool > -find_mountpoint( > - char *mtab, > - struct scrub_ctx *ctx) > -{ > - struct mntent_cursor cursor; > - struct mntent *t = NULL; > - bool found = false; > - > - if (platform_mntent_open(&cursor, mtab) != 0) { > - fprintf(stderr, "Error: can't get mntent entries.\n"); > - exit(1); > - } > - > - while ((t = platform_mntent_next(&cursor)) != NULL) { > - /* > - * Keep jotting down matching mount details; newer mounts are > - * towards the end of the file (hopefully). > - */ > - if (find_mountpoint_check(&ctx->mnt_sb, t)) { > - ctx->mntpoint = strdup(t->mnt_dir); > - ctx->blkdev = strdup(t->mnt_fsname); > - found = true; > - } > - } > - platform_mntent_close(&cursor); > - return found; > -} > - > -/* > * Sleep for 100ms * however many -b we got past the initial one. > * This is an (albeit clumsy) way to throttle scrub activity. > */ > diff --git a/scrub/common.h b/scrub/common.h > index 4f1f0cd..bc83971 100644 > --- a/scrub/common.h > +++ b/scrub/common.h > @@ -88,7 +88,6 @@ static inline int syncfs(int fd) > } > #endif > > -bool find_mountpoint(char *mtab, struct scrub_ctx *ctx); > void background_sleep(void); > char *string_escape(const char *in); > > diff --git a/scrub/phase1.c b/scrub/phase1.c > index 9926770..c2b9067 100644 > --- a/scrub/phase1.c > +++ b/scrub/phase1.c > @@ -83,7 +83,6 @@ bool > xfs_setup_fs( > struct scrub_ctx *ctx) > { > - struct fs_path *fsp; > int error; > > /* > @@ -178,17 +177,6 @@ _("Kernel metadata repair facility is not available. Use -n to scrub.")); > return false; > } > > - /* Go find the XFS devices if we have a usable fsmap. */ > - fs_table_initialise(0, NULL, 0, NULL); > - errno = 0; > - fsp = fs_table_lookup(ctx->mntpoint, FS_MOUNT_POINT); > - if (!fsp) { > - str_info(ctx, ctx->mntpoint, > -_("Unable to find XFS information.")); > - return false; > - } > - memcpy(&ctx->fsinfo, fsp, sizeof(struct fs_path)); > - > /* Did we find the log and rt devices, if they're present? */ > if (ctx->geo.logstart == 0 && ctx->fsinfo.fs_log == NULL) { > str_info(ctx, ctx->mntpoint, > diff --git a/scrub/xfs_scrub.c b/scrub/xfs_scrub.c > index 2d55283..a5b5cf2 100644 > --- a/scrub/xfs_scrub.c > +++ b/scrub/xfs_scrub.c > @@ -170,7 +170,7 @@ bool is_service; > static void __attribute__((noreturn)) > usage(void) > { > - fprintf(stderr, _("Usage: %s [OPTIONS] mountpoint | device\n"), progname); > + fprintf(stderr, _("Usage: %s [OPTIONS] mountpoint\n"), progname); > fprintf(stderr, "\n"); > fprintf(stderr, _("Options:\n")); > fprintf(stderr, _(" -a count Stop after this many errors are found.\n")); > @@ -538,8 +538,8 @@ main( > struct phase_rusage all_pi; > char *mtab = NULL; > FILE *progress_fp = NULL; > + struct fs_path *fsp; > bool moveon = true; > - bool ismnt; > int c; > int fd; > int ret = SCRUB_RET_SUCCESS; > @@ -640,7 +640,7 @@ main( > if (optind != argc - 1) > usage(); > > - ctx.mntpoint = strdup(argv[optind]); > + ctx.mntpoint = argv[optind]; > > stdout_isatty = isatty(STDOUT_FILENO); > stderr_isatty = isatty(STDERR_FILENO); > @@ -680,14 +680,15 @@ main( > mtab = _PATH_MOUNTED; > } > > - ismnt = find_mountpoint(mtab, &ctx); > - if (!ismnt) { > - fprintf(stderr, > -_("%s: Not a XFS mount point or block device.\n"), > - ctx.mntpoint); > + fs_table_initialise(0, NULL, 0, NULL); > + fsp = fs_table_lookup_mount(ctx.mntpoint); > + if (!fsp) { > + fprintf(stderr, _("%s: Not a XFS mount point.\n"), > + ctx.mntpoint); > ret |= SCRUB_RET_SYNTAX; > goto out; > } > + memcpy(&ctx.fsinfo, fsp, sizeof(struct fs_path)); > > /* How many CPUs? */ > nproc = sysconf(_SC_NPROCESSORS_ONLN); > @@ -740,8 +741,6 @@ _("%s: Not a XFS mount point or block device.\n"), > phase_end(&all_pi, 0); > if (progress_fp) > fclose(progress_fp); > - free(ctx.blkdev); > - free(ctx.mntpoint); > > /* > * If we're being run as a service, the return code must fit the LSB > diff --git a/scrub/xfs_scrub.h b/scrub/xfs_scrub.h > index aa130a7..c9dbe8e 100644 > --- a/scrub/xfs_scrub.h > +++ b/scrub/xfs_scrub.h > @@ -48,7 +48,6 @@ struct scrub_ctx { > > /* Strings we need for presentation */ > char *mntpoint; > - char *blkdev; > > /* Mountpoint info */ > struct stat mnt_sb; > > -- > To unsubscribe from this list: send the line "unsubscribe linux-xfs" 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-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html