mirror of
https://github.com/kdave/btrfs-progs
synced 2025-02-16 09:46:55 +00:00
btrfs-progs: mkfs: add option to specify device uuid
Add option --device-uuid that will set the device uuid item in super block. This is useful for creating a filesystem with a specific device uuid, namely for testing. Signed-off-by: Anand Jain <anand.jain@oracle.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
b0c4dfaaac
commit
3f27e60866
@ -183,6 +183,12 @@ OPTIONS
|
|||||||
you can duplicate the UUID. However, for a multi-device filesystem, the UUID
|
you can duplicate the UUID. However, for a multi-device filesystem, the UUID
|
||||||
must not already exist on any currently present filesystem.
|
must not already exist on any currently present filesystem.
|
||||||
|
|
||||||
|
--device-uuid <UUID>
|
||||||
|
Create the filesystem with the given device-uuid *UUID* (also known as
|
||||||
|
UUID_SUB in :command:`blkid`). For a single device filesystem, you can
|
||||||
|
duplicate the device-uuid. However, used for a multi-device filesystem
|
||||||
|
this option will not work at the moment.
|
||||||
|
|
||||||
-v|--verbose
|
-v|--verbose
|
||||||
Increase verbosity level, default is 1.
|
Increase verbosity level, default is 1.
|
||||||
|
|
||||||
|
@ -435,7 +435,12 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg)
|
|||||||
} else {
|
} else {
|
||||||
uuid_parse(cfg->fs_uuid, super.fsid);
|
uuid_parse(cfg->fs_uuid, super.fsid);
|
||||||
}
|
}
|
||||||
uuid_generate(super.dev_item.uuid);
|
if (!*cfg->dev_uuid) {
|
||||||
|
uuid_generate(super.dev_item.uuid);
|
||||||
|
uuid_unparse(super.dev_item.uuid, cfg->dev_uuid);
|
||||||
|
} else {
|
||||||
|
uuid_parse(cfg->dev_uuid, super.dev_item.uuid);
|
||||||
|
}
|
||||||
uuid_generate(chunk_tree_uuid);
|
uuid_generate(chunk_tree_uuid);
|
||||||
|
|
||||||
for (i = 0; i < blocks_nr; i++) {
|
for (i = 0; i < blocks_nr; i++) {
|
||||||
|
@ -90,7 +90,12 @@ struct btrfs_mkfs_config {
|
|||||||
|
|
||||||
/* Logical addresses of superblock [0] and other tree roots */
|
/* Logical addresses of superblock [0] and other tree roots */
|
||||||
u64 blocks[MKFS_BLOCK_COUNT + 1];
|
u64 blocks[MKFS_BLOCK_COUNT + 1];
|
||||||
|
|
||||||
|
/* btrfs_super_block filesystem uuid */
|
||||||
char fs_uuid[BTRFS_UUID_UNPARSED_SIZE];
|
char fs_uuid[BTRFS_UUID_UNPARSED_SIZE];
|
||||||
|
|
||||||
|
/* Set the given uuid to super block device_item. */
|
||||||
|
char dev_uuid[BTRFS_UUID_UNPARSED_SIZE];
|
||||||
char chunk_uuid[BTRFS_UUID_UNPARSED_SIZE];
|
char chunk_uuid[BTRFS_UUID_UNPARSED_SIZE];
|
||||||
|
|
||||||
/* Superblock offset after make_btrfs */
|
/* Superblock offset after make_btrfs */
|
||||||
|
13
mkfs/main.c
13
mkfs/main.c
@ -431,6 +431,7 @@ static const char * const mkfs_usage[] = {
|
|||||||
OPTLINE("-O|--features LIST", "comma separated list of filesystem features (use '-O list-all' to list features)"),
|
OPTLINE("-O|--features LIST", "comma separated list of filesystem features (use '-O list-all' to list features)"),
|
||||||
OPTLINE("-L|--label LABEL", "set the filesystem label"),
|
OPTLINE("-L|--label LABEL", "set the filesystem label"),
|
||||||
OPTLINE("-U|--uuid UUID", "specify the filesystem UUID (must be unique for a filesystem with multiple devices)"),
|
OPTLINE("-U|--uuid UUID", "specify the filesystem UUID (must be unique for a filesystem with multiple devices)"),
|
||||||
|
OPTLINE("--device-uuid UUID", "Specify the filesystem device UUID (a.k.a sub-uuid) (for single device filesystem only)"),
|
||||||
"Creation:",
|
"Creation:",
|
||||||
OPTLINE("-b|--byte-count SIZE", "set size of each device to SIZE (filesystem size is sum of all device sizes)"),
|
OPTLINE("-b|--byte-count SIZE", "set size of each device to SIZE (filesystem size is sum of all device sizes)"),
|
||||||
OPTLINE("-r|--rootdir DIR", "copy files from DIR to the image root directory"),
|
OPTLINE("-r|--rootdir DIR", "copy files from DIR to the image root directory"),
|
||||||
@ -1161,6 +1162,7 @@ int BOX_MAIN(mkfs)(int argc, char **argv)
|
|||||||
struct btrfs_mkfs_features features = btrfs_mkfs_default_features;
|
struct btrfs_mkfs_features features = btrfs_mkfs_default_features;
|
||||||
enum btrfs_csum_type csum_type = BTRFS_CSUM_TYPE_CRC32;
|
enum btrfs_csum_type csum_type = BTRFS_CSUM_TYPE_CRC32;
|
||||||
char fs_uuid[BTRFS_UUID_UNPARSED_SIZE] = { 0 };
|
char fs_uuid[BTRFS_UUID_UNPARSED_SIZE] = { 0 };
|
||||||
|
char dev_uuid[BTRFS_UUID_UNPARSED_SIZE] = { 0 };
|
||||||
u32 nodesize = 0;
|
u32 nodesize = 0;
|
||||||
bool nodesize_forced = false;
|
bool nodesize_forced = false;
|
||||||
u32 sectorsize = 0;
|
u32 sectorsize = 0;
|
||||||
@ -1187,6 +1189,7 @@ int BOX_MAIN(mkfs)(int argc, char **argv)
|
|||||||
GETOPT_VAL_SHRINK = GETOPT_VAL_FIRST,
|
GETOPT_VAL_SHRINK = GETOPT_VAL_FIRST,
|
||||||
GETOPT_VAL_CHECKSUM,
|
GETOPT_VAL_CHECKSUM,
|
||||||
GETOPT_VAL_GLOBAL_ROOTS,
|
GETOPT_VAL_GLOBAL_ROOTS,
|
||||||
|
GETOPT_VAL_DEVICE_UUID,
|
||||||
};
|
};
|
||||||
static const struct option long_options[] = {
|
static const struct option long_options[] = {
|
||||||
{ "byte-count", required_argument, NULL, 'b' },
|
{ "byte-count", required_argument, NULL, 'b' },
|
||||||
@ -1208,6 +1211,8 @@ int BOX_MAIN(mkfs)(int argc, char **argv)
|
|||||||
{ "features", required_argument, NULL, 'O' },
|
{ "features", required_argument, NULL, 'O' },
|
||||||
{ "runtime-features", required_argument, NULL, 'R' },
|
{ "runtime-features", required_argument, NULL, 'R' },
|
||||||
{ "uuid", required_argument, NULL, 'U' },
|
{ "uuid", required_argument, NULL, 'U' },
|
||||||
|
{ "device-uuid", required_argument, NULL,
|
||||||
|
GETOPT_VAL_DEVICE_UUID },
|
||||||
{ "quiet", 0, NULL, 'q' },
|
{ "quiet", 0, NULL, 'q' },
|
||||||
{ "verbose", 0, NULL, 'v' },
|
{ "verbose", 0, NULL, 'v' },
|
||||||
{ "shrink", no_argument, NULL, GETOPT_VAL_SHRINK },
|
{ "shrink", no_argument, NULL, GETOPT_VAL_SHRINK },
|
||||||
@ -1332,6 +1337,9 @@ int BOX_MAIN(mkfs)(int argc, char **argv)
|
|||||||
case 'q':
|
case 'q':
|
||||||
bconf_be_quiet();
|
bconf_be_quiet();
|
||||||
break;
|
break;
|
||||||
|
case GETOPT_VAL_DEVICE_UUID:
|
||||||
|
strncpy(dev_uuid, optarg, BTRFS_UUID_UNPARSED_SIZE - 1);
|
||||||
|
break;
|
||||||
case GETOPT_VAL_SHRINK:
|
case GETOPT_VAL_SHRINK:
|
||||||
shrink_rootdir = true;
|
shrink_rootdir = true;
|
||||||
break;
|
break;
|
||||||
@ -1373,6 +1381,10 @@ int BOX_MAIN(mkfs)(int argc, char **argv)
|
|||||||
error("the option -r is limited to a single device");
|
error("the option -r is limited to a single device");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
if (strlen(dev_uuid) != 0 && device_count > 1) {
|
||||||
|
error("the option --device-uuid is limited to a single device");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
if (shrink_rootdir && source_dir == NULL) {
|
if (shrink_rootdir && source_dir == NULL) {
|
||||||
error("the option --shrink must be used with --rootdir");
|
error("the option --shrink must be used with --rootdir");
|
||||||
goto error;
|
goto error;
|
||||||
@ -1733,6 +1745,7 @@ int BOX_MAIN(mkfs)(int argc, char **argv)
|
|||||||
|
|
||||||
mkfs_cfg.label = label;
|
mkfs_cfg.label = label;
|
||||||
memcpy(mkfs_cfg.fs_uuid, fs_uuid, sizeof(mkfs_cfg.fs_uuid));
|
memcpy(mkfs_cfg.fs_uuid, fs_uuid, sizeof(mkfs_cfg.fs_uuid));
|
||||||
|
memcpy(mkfs_cfg.dev_uuid, dev_uuid, sizeof(mkfs_cfg.dev_uuid));
|
||||||
mkfs_cfg.num_bytes = dev_block_count;
|
mkfs_cfg.num_bytes = dev_block_count;
|
||||||
mkfs_cfg.nodesize = nodesize;
|
mkfs_cfg.nodesize = nodesize;
|
||||||
mkfs_cfg.sectorsize = sectorsize;
|
mkfs_cfg.sectorsize = sectorsize;
|
||||||
|
Loading…
Reference in New Issue
Block a user