diff mbox series

[6/7] btrfs-progs: factor out btrfs_scan_stdin_devices

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

Commit Message

Anand Jain June 8, 2023, 6:01 a.m. UTC
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(-)

Comments

Qu Wenruo June 8, 2023, 6:24 a.m. UTC | #1
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
David Sterba June 8, 2023, 12:43 p.m. UTC | #2
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 mbox series

Patch

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