Message ID | 3c660a0d48f5e8d50fb932dee473fc1d86c0838e.1686202417.git.anand.jain@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs-progs: cleanup and preparatory around device scan | expand |
On 2023/6/8 14:01, Anand Jain wrote: > To prepare for handling command line given devices factor out > btrfs_scan_stdin_devices(). > > Signed-off-by: Anand Jain <anand.jain@oracle.com> > --- > cmds/inspect-dump-tree.c | 37 +++---------------------------------- > common/device-scan.c | 39 +++++++++++++++++++++++++++++++++++++++ > common/device-scan.h | 1 + > 3 files changed, 43 insertions(+), 34 deletions(-) > > diff --git a/cmds/inspect-dump-tree.c b/cmds/inspect-dump-tree.c > index 35920d14b7e9..311dfbfddab6 100644 > --- a/cmds/inspect-dump-tree.c > +++ b/cmds/inspect-dump-tree.c > @@ -327,7 +327,6 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, > bool roots_only = false; > bool root_backups = false; > int traverse = BTRFS_PRINT_TREE_DEFAULT; > - int dev_optind; > unsigned open_ctree_flags; > u64 block_bytenr; > struct btrfs_root *tree_root_scan; > @@ -456,39 +455,9 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, > if (check_argc_min(argc - optind, 1)) > return 1; > > - dev_optind = optind; > - while (dev_optind < argc) { > - int fd; > - struct btrfs_fs_devices *fs_devices; > - u64 num_devices; > - > - ret = check_arg_type(argv[optind]); > - if (ret != BTRFS_ARG_BLKDEV && ret != BTRFS_ARG_REG) { > - if (ret < 0) { > - errno = -ret; > - error("invalid argument %s: %m", argv[dev_optind]); > - } else { > - error("not a block device or regular file: %s", > - argv[dev_optind]); > - } > - } > - fd = open(argv[dev_optind], O_RDONLY); > - if (fd < 0) { > - error("cannot open %s: %m", argv[dev_optind]); > - return -EINVAL; > - } > - ret = btrfs_scan_one_device(fd, argv[dev_optind], &fs_devices, > - &num_devices, > - BTRFS_SUPER_INFO_OFFSET, > - SBREAD_DEFAULT); > - close(fd); > - if (ret < 0) { > - errno = -ret; > - error("device scan %s: %m", argv[dev_optind]); > - return ret; > - } > - dev_optind++; > - } > + ret = btrfs_scan_stdin_devices(optind, argc, argv); > + if (ret) > + return ret; > > pr_verbose(LOG_DEFAULT, "%s\n", PACKAGE_STRING); > > diff --git a/common/device-scan.c b/common/device-scan.c > index 515481a6efa9..38f986df810f 100644 > --- a/common/device-scan.c > +++ b/common/device-scan.c > @@ -500,3 +500,42 @@ int btrfs_scan_devices(int verbose) > return 0; > } > > +int btrfs_scan_stdin_devices(int dev_optind, int argc, char **argv) > +{ > + int ret; > + > + while (dev_optind < argc) { In this case, I believe "--device dev1 --device dev2" would be much easier to parse, and would not lead to any confusion between the device scan and target fs. Thanks, Qu > + int fd; > + u64 num_devices; > + struct btrfs_fs_devices *fs_devices; > + > + ret = check_arg_type(argv[optind]); > + if (ret != BTRFS_ARG_BLKDEV && ret != BTRFS_ARG_REG) { > + if (ret < 0) { > + errno = -ret; > + error("invalid argument %s: %m", argv[dev_optind]); > + } else { > + error("not a block device or regular file: %s", > + argv[dev_optind]); > + } > + } > + fd = open(argv[dev_optind], O_RDONLY); > + if (fd < 0) { > + error("cannot open %s: %m", argv[dev_optind]); > + return -EINVAL; > + } > + ret = btrfs_scan_one_device(fd, argv[dev_optind], &fs_devices, > + &num_devices, > + BTRFS_SUPER_INFO_OFFSET, > + SBREAD_DEFAULT); > + close(fd); > + if (ret < 0) { > + errno = -ret; > + error("device scan %s: %m", argv[dev_optind]); > + return ret; > + } > + dev_optind++; > + } > + > + return 0; > +} > diff --git a/common/device-scan.h b/common/device-scan.h > index f805b489f595..e2480d3eb168 100644 > --- a/common/device-scan.h > +++ b/common/device-scan.h > @@ -58,5 +58,6 @@ int add_seen_fsid(u8 *fsid, struct seen_fsid *seen_fsid_hash[], > int fd, DIR *dirstream); > void free_seen_fsid(struct seen_fsid *seen_fsid_hash[]); > int test_uuid_unique(const char *uuid_str); > +int btrfs_scan_stdin_devices(int dev_optind, int argc, char **argv); > > #endif
On Thu, Jun 08, 2023 at 02:01:03PM +0800, Anand Jain wrote: > To prepare for handling command line given devices factor out > btrfs_scan_stdin_devices(). I find using 'stdin' in this context confusion, the tool is not taking the devices from stdin, but command line arguments. You can use 'argv' for that.
diff --git a/cmds/inspect-dump-tree.c b/cmds/inspect-dump-tree.c index 35920d14b7e9..311dfbfddab6 100644 --- a/cmds/inspect-dump-tree.c +++ b/cmds/inspect-dump-tree.c @@ -327,7 +327,6 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, bool roots_only = false; bool root_backups = false; int traverse = BTRFS_PRINT_TREE_DEFAULT; - int dev_optind; unsigned open_ctree_flags; u64 block_bytenr; struct btrfs_root *tree_root_scan; @@ -456,39 +455,9 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, if (check_argc_min(argc - optind, 1)) return 1; - dev_optind = optind; - while (dev_optind < argc) { - int fd; - struct btrfs_fs_devices *fs_devices; - u64 num_devices; - - ret = check_arg_type(argv[optind]); - if (ret != BTRFS_ARG_BLKDEV && ret != BTRFS_ARG_REG) { - if (ret < 0) { - errno = -ret; - error("invalid argument %s: %m", argv[dev_optind]); - } else { - error("not a block device or regular file: %s", - argv[dev_optind]); - } - } - fd = open(argv[dev_optind], O_RDONLY); - if (fd < 0) { - error("cannot open %s: %m", argv[dev_optind]); - return -EINVAL; - } - ret = btrfs_scan_one_device(fd, argv[dev_optind], &fs_devices, - &num_devices, - BTRFS_SUPER_INFO_OFFSET, - SBREAD_DEFAULT); - close(fd); - if (ret < 0) { - errno = -ret; - error("device scan %s: %m", argv[dev_optind]); - return ret; - } - dev_optind++; - } + ret = btrfs_scan_stdin_devices(optind, argc, argv); + if (ret) + return ret; pr_verbose(LOG_DEFAULT, "%s\n", PACKAGE_STRING); diff --git a/common/device-scan.c b/common/device-scan.c index 515481a6efa9..38f986df810f 100644 --- a/common/device-scan.c +++ b/common/device-scan.c @@ -500,3 +500,42 @@ int btrfs_scan_devices(int verbose) return 0; } +int btrfs_scan_stdin_devices(int dev_optind, int argc, char **argv) +{ + int ret; + + while (dev_optind < argc) { + int fd; + u64 num_devices; + struct btrfs_fs_devices *fs_devices; + + ret = check_arg_type(argv[optind]); + if (ret != BTRFS_ARG_BLKDEV && ret != BTRFS_ARG_REG) { + if (ret < 0) { + errno = -ret; + error("invalid argument %s: %m", argv[dev_optind]); + } else { + error("not a block device or regular file: %s", + argv[dev_optind]); + } + } + fd = open(argv[dev_optind], O_RDONLY); + if (fd < 0) { + error("cannot open %s: %m", argv[dev_optind]); + return -EINVAL; + } + ret = btrfs_scan_one_device(fd, argv[dev_optind], &fs_devices, + &num_devices, + BTRFS_SUPER_INFO_OFFSET, + SBREAD_DEFAULT); + close(fd); + if (ret < 0) { + errno = -ret; + error("device scan %s: %m", argv[dev_optind]); + return ret; + } + dev_optind++; + } + + return 0; +} diff --git a/common/device-scan.h b/common/device-scan.h index f805b489f595..e2480d3eb168 100644 --- a/common/device-scan.h +++ b/common/device-scan.h @@ -58,5 +58,6 @@ int add_seen_fsid(u8 *fsid, struct seen_fsid *seen_fsid_hash[], int fd, DIR *dirstream); void free_seen_fsid(struct seen_fsid *seen_fsid_hash[]); int test_uuid_unique(const char *uuid_str); +int btrfs_scan_stdin_devices(int dev_optind, int argc, char **argv); #endif
To prepare for handling command line given devices factor out btrfs_scan_stdin_devices(). Signed-off-by: Anand Jain <anand.jain@oracle.com> --- cmds/inspect-dump-tree.c | 37 +++---------------------------------- common/device-scan.c | 39 +++++++++++++++++++++++++++++++++++++++ common/device-scan.h | 1 + 3 files changed, 43 insertions(+), 34 deletions(-)