linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3] btrfs-progs: dump-tree: add degraded option
@ 2018-04-18  9:33 Anand Jain
  0 siblings, 0 replies; only message in thread
From: Anand Jain @ 2018-04-18  9:33 UTC (permalink / raw)
  To: linux-btrfs

From: Anand Jain <Anand.Jain@oracle.com>

btrfs inspect dump-tree picks the disk with the largest generation
to read the root tree by scanning for the required devices by default.

But in 2 or more disks RAID1/5/6 you may need to know what's in the
disks individually, so this option --noscan indicates to use only the
given disk to dump.

For example:

 mkfs.btrfs -fq -draid1 -mraid1 /dev/sd[b-d]
 btrfs in dump-tree --noscan /dev/sdb /dev/sdc

 However as usual without noscan option it works as it scans for the
 devices by its own. And if minimum required number of devices are
 not provided then when --noscan option is used, it errors out as
 shown below.

 btrfs in dump-tree --noscan /dev/sdb
 check arg type : /dev/sdbbtrfs-progs v4.14.1
 warning, device 3 is missing
 warning, device 2 is missing
 bytenr mismatch, want=22036480, have=0
 ERROR: cannot read chunk root
 ERROR: unable to open /dev/sdb

Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
v2->v3: make it scalable for more than two disks in noscan mode
v1->v2: rename --degraded to --noscan

 cmds-inspect-dump-tree.c | 60 ++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 53 insertions(+), 7 deletions(-)

diff --git a/cmds-inspect-dump-tree.c b/cmds-inspect-dump-tree.c
index 0802b31e9596..8625cd608ad0 100644
--- a/cmds-inspect-dump-tree.c
+++ b/cmds-inspect-dump-tree.c
@@ -21,6 +21,7 @@
 #include <unistd.h>
 #include <uuid/uuid.h>
 #include <getopt.h>
+#include <fcntl.h>
 
 #include "kerncompat.h"
 #include "radix-tree.h"
@@ -183,6 +184,46 @@ static u64 treeid_from_string(const char *str, const char **end)
 	return id;
 }
 
+static int scan_args(char **argv, int argc, int tmpind, int noscan)
+{
+	int fd;
+	int ret;
+	u64 num_devices;
+	struct btrfs_fs_devices *tmp_devices;
+
+	while (tmpind < argc) {
+		ret = check_arg_type(argv[tmpind]);
+		if (ret != BTRFS_ARG_BLKDEV && ret != BTRFS_ARG_REG) {
+			error("not a block device or regular file: %s",
+			      argv[tmpind]);
+			return -EINVAL;
+		}
+
+		if (!noscan) {
+			tmpind++;
+			continue;
+		}
+
+		fd = open(argv[tmpind], O_RDONLY);
+		if (fd < 0) {
+			error("cannot open %s: %m", argv[tmpind]);
+			return -EINVAL;
+		}
+		ret = btrfs_scan_one_device(fd, argv[tmpind],
+					    &tmp_devices, &num_devices,
+					    BTRFS_SUPER_INFO_OFFSET,
+					    SBREAD_DEFAULT);
+		close(fd);
+		if (ret) {
+			error("cannot scan %s: %s",
+			      argv[tmpind], strerror(-ret));
+			return ret;
+		}
+		tmpind++;
+	}
+	return 0;
+}
+
 const char * const cmd_inspect_dump_tree_usage[] = {
 	"btrfs inspect-internal dump-tree [options] device",
 	"Dump tree structures from a given device",
@@ -199,6 +240,7 @@ const char * const cmd_inspect_dump_tree_usage[] = {
 	"-b|--block <block_num> print info from the specified block only",
 	"-t|--tree <tree_id>    print only tree with the given id (string or number)",
 	"--follow               use with -b, to show all children tree blocks of <block_num>",
+	"--noscan               only uses the devices provided as the argument",
 	NULL
 };
 
@@ -213,7 +255,7 @@ int cmd_inspect_dump_tree(int argc, char **argv)
 	struct btrfs_disk_key disk_key;
 	struct btrfs_key found_key;
 	char uuidbuf[BTRFS_UUID_UNPARSED_SIZE];
-	int ret;
+	int ret = 0;
 	int slot;
 	int extent_only = 0;
 	int device_only = 0;
@@ -225,10 +267,12 @@ int cmd_inspect_dump_tree(int argc, char **argv)
 	struct btrfs_root *tree_root_scan;
 	u64 tree_id = 0;
 	bool follow = false;
+	bool noscan = false;
 
 	while (1) {
 		int c;
-		enum { GETOPT_VAL_FOLLOW = 256 };
+		enum { GETOPT_VAL_FOLLOW = 256,
+		       GETOPT_VAL_NOSCAN = 257};
 		static const struct option long_options[] = {
 			{ "extents", no_argument, NULL, 'e'},
 			{ "device", no_argument, NULL, 'd'},
@@ -238,6 +282,7 @@ int cmd_inspect_dump_tree(int argc, char **argv)
 			{ "block", required_argument, NULL, 'b'},
 			{ "tree", required_argument, NULL, 't'},
 			{ "follow", no_argument, NULL, GETOPT_VAL_FOLLOW },
+			{ "noscan", no_argument, NULL, GETOPT_VAL_NOSCAN },
 			{ NULL, 0, NULL, 0 }
 		};
 
@@ -293,19 +338,20 @@ int cmd_inspect_dump_tree(int argc, char **argv)
 		case GETOPT_VAL_FOLLOW:
 			follow = true;
 			break;
+		case GETOPT_VAL_NOSCAN:
+			open_ctree_flags |= OPEN_CTREE_NO_DEVICES;
+			noscan = true;
+			break;
 		default:
 			usage(cmd_inspect_dump_tree_usage);
 		}
 	}
 
-	if (check_argc_exact(argc - optind, 1))
+	if (check_argc_min(argc - optind, 1))
 		usage(cmd_inspect_dump_tree_usage);
 
-	ret = check_arg_type(argv[optind]);
-	if (ret != BTRFS_ARG_BLKDEV && ret != BTRFS_ARG_REG) {
-		error("not a block device or regular file: %s", argv[optind]);
+	if (scan_args(argv, argc, optind, noscan))
 		goto out;
-	}
 
 	printf("%s\n", PACKAGE_STRING);
 
-- 
2.15.0


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2018-04-18  9:31 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-04-18  9:33 [PATCH v3] btrfs-progs: dump-tree: add degraded option Anand Jain

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).