@@ -119,6 +119,7 @@ static const char * const tune_usage[] = {
"General:",
OPTLINE("-f", "allow dangerous operations, make sure that you are aware of the dangers"),
OPTLINE("--device", "devices or regular-files of the filesystem to be scanned"),
+ OPTLINE("--noscan", "do not scan the devices from the system, use only the listed ones"),
OPTLINE("--help", "print this help"),
#if EXPERIMENTAL
"",
@@ -145,6 +146,7 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
bool to_extent_tree = false;
bool to_bg_tree = false;
bool to_fst = false;
+ bool noscan = false;
int csum_type = -1;
int argc_devices = 0;
char **argv_devices = NULL;
@@ -160,7 +162,7 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE,
GETOPT_VAL_DISABLE_BLOCK_GROUP_TREE,
GETOPT_VAL_ENABLE_FREE_SPACE_TREE,
- GETOPT_VAL_DEVICE };
+ GETOPT_VAL_DEVICE, GETOPT_VAL_NOSCAN };
static const struct option long_options[] = {
{ "help", no_argument, NULL, GETOPT_VAL_HELP},
{ "convert-to-block-group-tree", no_argument, NULL,
@@ -173,6 +175,7 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
{ "csum", required_argument, NULL, GETOPT_VAL_CSUM },
#endif
{ "device", required_argument, NULL, GETOPT_VAL_DEVICE },
+ { "noscan", no_argument, NULL, GETOPT_VAL_NOSCAN },
{ NULL, 0, NULL, 0 }
};
int c = getopt_long(argc, argv, "S:rxfuU:nmM:", long_options, NULL);
@@ -245,6 +248,10 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
csum_type = parse_csum_type(optarg);
break;
#endif
+ case GETOPT_VAL_NOSCAN:
+ ctree_flags |= OPEN_CTREE_NO_DEVICES;
+ noscan = true;
+ break;
case GETOPT_VAL_HELP:
default:
usage(&tune_cmd, c != GETOPT_VAL_HELP);
@@ -292,7 +299,7 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
}
ret = check_mounted_where(fd, device, NULL, 0, NULL,
- SBREAD_IGNORE_FSID_MISMATCH, false);
+ SBREAD_IGNORE_FSID_MISMATCH, noscan);
if (ret < 0) {
errno = -ret;
error("could not check mount status of %s: %m", device);
@@ -317,7 +324,6 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
}
root = open_ctree_fd(fd, device, 0, ctree_flags);
-
if (!root) {
error("open ctree failed");
ret = 1;
The function check_where_mounted() scans the system for other btrfs devices, but in certain cases, we may need a way to instruct btrfstune not to perform the system scan and instead only work on the devices provided through the command line. And so, add an option --noscan. For example: $ mkfs.btrfs -fq -draid0 -mraid0 ./td1 ./td2 $ btrfstune -m ./td1 warning, device 2 is missing ERROR: could not setup extent tree ERROR: open ctree failed $ losetup --find --show ./td2 /dev/loop4 $ btrfstune -m ./td1 Or just $ btrfstune -m --device ./td1 ./td2 The 'noscan' option is optional because there may be scenarios where we have a copy that we don't want to modify the fsid. In the following scenario, we keep 'td2' out of the metadata_uuid changes, even though its loop device is created. $ cp td2 td3 $ btrsftune --noscan --device ./td3 -m ./td1 Thanks Signed-off-by: Anand Jain <anand.jain@oracle.com> --- tune/main.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)