From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: sandeen@redhat.com
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 3/4] xfs_fsr: refactor mountpoint finding to use libfrog paths functions
Date: Tue, 20 Mar 2018 16:14:40 -0700 [thread overview]
Message-ID: <20180320231440.GL1757@magnolia> (raw)
In-Reply-To: <152151531831.18312.9201377632555740636.stgit@magnolia>
On Mon, Mar 19, 2018 at 08:08:38PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
>
> Refactor the mount-point finding code in fsr to use the libfrog helpers
> instead of open-coding yet another routine.
>
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
> fsr/Makefile | 4 ++-
> fsr/xfs_fsr.c | 71 +++++--------------------------------------------------
> include/path.h | 1 +
> libfrog/paths.c | 47 ++++++++++++++++++++++++++++--------
> 4 files changed, 47 insertions(+), 76 deletions(-)
>
>
> diff --git a/fsr/Makefile b/fsr/Makefile
> index d3521b2..fc1c33b 100644
> --- a/fsr/Makefile
> +++ b/fsr/Makefile
> @@ -7,7 +7,9 @@ include $(TOPDIR)/include/builddefs
>
> LTCOMMAND = xfs_fsr
> CFILES = xfs_fsr.c
> -LLDLIBS = $(LIBHANDLE)
> +LLDLIBS = $(LIBHANDLE) $(LIBFROG)
> +LTDEPENDENCIES = $(LIBFROG)
> +LLDFLAGS = -static-libtool-libs
>
> ifeq ($(HAVE_GETMNTENT),yes)
> LCFLAGS += -DHAVE_GETMNTENT
> diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c
> index 2a18ce0..ef6a68f 100644
> --- a/fsr/xfs_fsr.c
> +++ b/fsr/xfs_fsr.c
> @@ -22,6 +22,7 @@
> #include "jdm.h"
> #include "xfs_bmap_btree.h"
> #include "xfs_attr_sf.h"
> +#include "path.h"
>
> #include <fcntl.h>
> #include <errno.h>
> @@ -167,73 +168,13 @@ aborter(int unused)
> exit(1);
> }
>
> -/*
> - * Check if the argument is either the device name or mountpoint of an XFS
> - * filesystem. Note that we do not care about bind mounted regular files
> - * here - the code that handles defragmentation of invidual files takes care
> - * of that.
> - */
> -static char *
> -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 NULL;
> - if (sb->st_ino != ms.st_ino)
> - return NULL;
> - if (sb->st_dev != ms.st_dev)
> - return NULL;
> - if (strcmp(t->mnt_type, MNTTYPE_XFS) != 0)
> - return NULL;
> - } else { /* device */
> - if (stat(t->mnt_fsname, &ms) < 0)
> - return NULL;
> - if (sb->st_rdev != ms.st_rdev)
> - return NULL;
> - 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 NULL;
> - }
> -
> - return t->mnt_dir;
> -}
> -
> -static char *
> -find_mountpoint(char *mtab, char *argname, struct stat *sb)
> -{
> - struct mntent_cursor cursor;
> - struct mntent *t = NULL;
> - char *mntp = NULL;
> -
> - 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) {
> - mntp = find_mountpoint_check(sb, t);
> - if (mntp == NULL)
> - continue;
> - break;
> - }
> - platform_mntent_close(&cursor);
> - return mntp;
> -}
> -
> int
> main(int argc, char **argv)
> {
> struct stat sb;
> char *argname;
> int c;
> - char *mntp;
> + struct fs_path *fsp;
> char *mtab = NULL;
>
> setlinebuf(stdout);
> @@ -343,9 +284,11 @@ main(int argc, char **argv)
> sb = sb2;
> }
>
> - mntp = find_mountpoint(mtab, argname, &sb);
> - if (mntp != NULL) {
> - fsrfs(mntp, 0, 100);
> + fsp = fs_table_lookup_mount(argname);
Lovely, we call fs_table_lookup_mount without first calling
fs_table_initialise to initialize the mountpoint table. Now this
program refuses directory and bdev arguments...
> + if (!fsp)
> + fsp = fs_table_lookup_blkdev(argname);
> + if (fsp != NULL) {
> + fsrfs(fsp->fs_dir, 0, 100);
> } else if (S_ISCHR(sb.st_mode)) {
> fprintf(stderr, _(
> "%s: char special not supported: %s\n"),
> diff --git a/include/path.h b/include/path.h
> index 1d3a902..88dc44b 100644
> --- a/include/path.h
> +++ b/include/path.h
> @@ -57,6 +57,7 @@ extern void fs_table_insert_project_path(char *__dir, uint __projid);
>
> extern fs_path_t *fs_table_lookup(const char *__dir, uint __flags);
> extern fs_path_t *fs_table_lookup_mount(const char *__dir);
> +extern fs_path_t *fs_table_lookup_blkdev(const char *bdev);
>
> typedef struct fs_cursor {
> uint count; /* total count of mount entries */
> diff --git a/libfrog/paths.c b/libfrog/paths.c
> index 19ee1ea..a80a30b 100644
> --- a/libfrog/paths.c
> +++ b/libfrog/paths.c
> @@ -89,15 +89,10 @@ fs_table_lookup(
> return NULL;
> }
>
> -/*
> - * Find the FS table entry describing an actual mount for the given path.
> - * Unlike fs_table_lookup(), fs_table_lookup_mount() compares the "dir"
> - * argument to actual mount point entries in the table. Accordingly, it
> - * will find matches only if the "dir" argument is indeed mounted.
> - */
> -struct fs_path *
> -fs_table_lookup_mount(
> - const char *dir)
> +static struct fs_path *
> +__fs_table_lookup_mount(
> + const char *dir,
> + const char *blkdev)
> {
> uint i;
> dev_t dev = 0;
> @@ -106,13 +101,17 @@ fs_table_lookup_mount(
>
> if (fs_device_number(dir, &dev))
> return NULL;
...which is just as well, since dir can now be NULL which means that
fs_table_lookup_blkdev will always bail out here.
nak, patch is fubar.
--D
> - if (!realpath(dir, dpath))
> + if (dir && !realpath(dir, dpath))
> + return NULL;
> + if (blkdev && !realpath(blkdev, dpath))
> return NULL;
>
> for (i = 0; i < fs_count; i++) {
> if (fs_table[i].fs_flags != FS_MOUNT_POINT)
> continue;
> - if (!realpath(fs_table[i].fs_dir, rpath))
> + if (dir && !realpath(fs_table[i].fs_dir, rpath))
> + continue;
> + if (blkdev && !realpath(fs_table[i].fs_name, rpath))
> continue;
> if (strcmp(rpath, dpath) == 0)
> return &fs_table[i];
> @@ -120,6 +119,32 @@ fs_table_lookup_mount(
> return NULL;
> }
>
> +/*
> + * Find the FS table entry describing an actual mount for the given path.
> + * Unlike fs_table_lookup(), fs_table_lookup_mount() compares the "dir"
> + * argument to actual mount point entries in the table. Accordingly, it
> + * will find matches only if the "dir" argument is indeed mounted.
> + */
> +struct fs_path *
> +fs_table_lookup_mount(
> + const char *dir)
> +{
> + return __fs_table_lookup_mount(dir, NULL);
> +}
> +
> +/*
> + * Find the FS table entry describing an actual mount for the block device.
> + * Unlike fs_table_lookup(), fs_table_lookup_blkdev() compares the "bdev"
> + * argument to actual mount point names in the table. Accordingly, it
> + * will find matches only if the "bdev" argument is indeed mounted.
> + */
> +struct fs_path *
> +fs_table_lookup_blkdev(
> + const char *bdev)
> +{
> + return __fs_table_lookup_mount(NULL, bdev);
> +}
> +
> static int
> fs_table_insert(
> char *dir,
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2018-03-20 23:14 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-20 3:08 [PATCH 0/4] xfsprogs: more misc fixes Darrick J. Wong
2018-03-20 3:08 ` [PATCH 1/4] xfs_repair: implement custom ifork verifiers Darrick J. Wong
2018-03-20 19:54 ` Eric Sandeen
2018-03-20 21:19 ` Darrick J. Wong
2018-03-20 21:47 ` [PATCH v2 " Darrick J. Wong
2018-03-21 18:37 ` Eric Sandeen
2018-03-22 19:35 ` [PATCH 1.5/4] xfs_repair: use custom ifork verifier in mv_orphanage Eric Sandeen
2018-03-22 19:49 ` Darrick J. Wong
2018-03-20 3:08 ` [PATCH 2/4] libfrog: fs_table_lookup_mount should realpath the argument Darrick J. Wong
2018-03-20 19:55 ` Eric Sandeen
2018-03-20 3:08 ` [PATCH 3/4] xfs_fsr: refactor mountpoint finding to use libfrog paths functions Darrick J. Wong
2018-03-20 23:14 ` Darrick J. Wong [this message]
2018-03-21 3:19 ` [PATCH v2 " Darrick J. Wong
2018-03-21 18:49 ` Eric Sandeen
2018-03-20 3:08 ` [PATCH 4/4] mkfs: enable sparse inodes by default Darrick J. Wong
2018-03-20 21:16 ` Eric Sandeen
2018-03-21 3:19 ` [PATCH 5/4] misc: remove darwin, irix, and freebsd support Darrick J. Wong
2018-03-21 18:59 ` Eric Sandeen
2018-03-21 19:01 ` Eric Sandeen
2018-03-21 21:26 ` Dave Chinner
2018-03-21 21:31 ` Darrick J. Wong
2018-03-21 23:10 ` Dave Chinner
2018-03-21 19:42 ` [PATCH 5.5/4] " Eric Sandeen
2018-03-21 20:13 ` Darrick J. Wong
2018-03-21 3:20 ` [PATCH 6/4] libfrog: absorb platform specific code Darrick J. Wong
2018-03-21 19:52 ` Eric Sandeen
2018-03-26 19:56 ` [PATCH 7/4] xfs_spaceman: remove incorrect linux/fs.h include Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180320231440.GL1757@magnolia \
--to=darrick.wong@oracle.com \
--cc=linux-xfs@vger.kernel.org \
--cc=sandeen@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).