Add support for filesystem labels via mkfs.btrfs -L

This commit is contained in:
Chris Mason 2008-04-18 10:31:42 -04:00 committed by David Woodhouse
parent d25165e95c
commit 588bb9dfff
5 changed files with 70 additions and 32 deletions

View File

@ -235,6 +235,7 @@ struct btrfs_header {
* room to translate 14 chunks with 3 stripes each. * room to translate 14 chunks with 3 stripes each.
*/ */
#define BTRFS_SYSTEM_CHUNK_ARRAY_SIZE 2048 #define BTRFS_SYSTEM_CHUNK_ARRAY_SIZE 2048
#define BTRFS_LABEL_SIZE 256
/* /*
* the super block basically lists the main trees of the FS * the super block basically lists the main trees of the FS
@ -264,6 +265,7 @@ struct btrfs_super_block {
u8 root_level; u8 root_level;
u8 chunk_root_level; u8 chunk_root_level;
struct btrfs_dev_item dev_item; struct btrfs_dev_item dev_item;
char label[BTRFS_LABEL_SIZE];
u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE]; u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
} __attribute__ ((__packed__)); } __attribute__ ((__packed__));

62
mkfs.c
View File

@ -260,12 +260,32 @@ static u64 parse_profile(char *s)
return 0; return 0;
} }
static char *parse_label(char *input)
{
int i;
int len = strlen(input);
if (len > BTRFS_LABEL_SIZE) {
fprintf(stderr, "Label %s is too long (max %d)\n", input,
BTRFS_LABEL_SIZE);
exit(1);
}
for (i = 0; i < len; i++) {
if (input[i] == '/' || input[i] == '\\') {
fprintf(stderr, "invalid label %s\n", input);
exit(1);
}
}
return strdup(input);
}
static struct option long_options[] = { static struct option long_options[] = {
{ "byte-count", 1, NULL, 'b' }, { "byte-count", 1, NULL, 'b' },
{ "leafsize", 1, NULL, 'l' }, { "leafsize", 1, NULL, 'l' },
{ "label", 1, NULL, 'L'},
{ "metadata", 1, NULL, 'm' },
{ "nodesize", 1, NULL, 'n' }, { "nodesize", 1, NULL, 'n' },
{ "sectorsize", 1, NULL, 's' }, { "sectorsize", 1, NULL, 's' },
{ "metadata", 1, NULL, 'm' },
{ "data", 1, NULL, 'd' }, { "data", 1, NULL, 'd' },
{ 0, 0, 0, 0} { 0, 0, 0, 0}
}; };
@ -273,27 +293,28 @@ static struct option long_options[] = {
int main(int ac, char **av) int main(int ac, char **av)
{ {
char *file; char *file;
struct btrfs_root *root;
struct btrfs_trans_handle *trans;
char *label = NULL;
u64 block_count = 0; u64 block_count = 0;
u64 dev_block_count = 0; u64 dev_block_count = 0;
int fd; u64 blocks[6];
int first_fd; u64 metadata_profile = BTRFS_BLOCK_GROUP_RAID1 | BTRFS_BLOCK_GROUP_DUP;
int ret; u64 data_profile = BTRFS_BLOCK_GROUP_RAID0;
int i;
u32 leafsize = getpagesize(); u32 leafsize = getpagesize();
u32 sectorsize = 4096; u32 sectorsize = 4096;
u32 nodesize = leafsize; u32 nodesize = leafsize;
u32 stripesize = 4096; u32 stripesize = 4096;
u64 blocks[6];
int zero_end = 1; int zero_end = 1;
int option_index = 0; int option_index = 0;
struct btrfs_root *root; int fd;
struct btrfs_trans_handle *trans; int first_fd;
u64 metadata_profile = BTRFS_BLOCK_GROUP_RAID1 | BTRFS_BLOCK_GROUP_DUP; int ret;
u64 data_profile = BTRFS_BLOCK_GROUP_RAID0; int i;
while(1) { while(1) {
int c; int c;
c = getopt_long(ac, av, "b:l:n:s:m:d:", long_options, c = getopt_long(ac, av, "b:l:n:s:m:d:L:", long_options,
&option_index); &option_index);
if (c < 0) if (c < 0)
break; break;
@ -301,12 +322,15 @@ int main(int ac, char **av)
case 'd': case 'd':
data_profile = parse_profile(optarg); data_profile = parse_profile(optarg);
break; break;
case 'm':
metadata_profile = parse_profile(optarg);
break; break;
case 'l': case 'l':
leafsize = parse_size(optarg); leafsize = parse_size(optarg);
break; break;
case 'L':
label = parse_label(optarg);
break;
case 'm':
metadata_profile = parse_profile(optarg);
case 'n': case 'n':
nodesize = parse_size(optarg); nodesize = parse_size(optarg);
break; break;
@ -358,7 +382,8 @@ int main(int ac, char **av)
for (i = 0; i < 6; i++) for (i = 0; i < 6; i++)
blocks[i] = BTRFS_SUPER_INFO_OFFSET + leafsize * i; blocks[i] = BTRFS_SUPER_INFO_OFFSET + leafsize * i;
ret = make_btrfs(fd, file, blocks, block_count, nodesize, leafsize, ret = make_btrfs(fd, file, label, blocks, block_count,
nodesize, leafsize,
sectorsize, stripesize); sectorsize, stripesize);
if (ret) { if (ret) {
fprintf(stderr, "error during mkfs %d\n", ret); fprintf(stderr, "error during mkfs %d\n", ret);
@ -369,10 +394,12 @@ int main(int ac, char **av)
fprintf(stderr, "failed to setup the root directory\n"); fprintf(stderr, "failed to setup the root directory\n");
exit(1); exit(1);
} }
printf("fs created on %s nodesize %u leafsize %u sectorsize %u bytes %llu\n", printf("fs created label %s on %s\n\tnodesize %u leafsize %u "
file, nodesize, leafsize, sectorsize, "sectorsize %u bytes %llu\n",
label, file, nodesize, leafsize, sectorsize,
(unsigned long long)block_count); (unsigned long long)block_count);
free(label);
root = open_ctree(file, 0); root = open_ctree(file, 0);
trans = btrfs_start_transaction(root, 1); trans = btrfs_start_transaction(root, 1);
@ -403,13 +430,12 @@ int main(int ac, char **av)
fprintf(stderr, "unable to open %s\n", file); fprintf(stderr, "unable to open %s\n", file);
exit(1); exit(1);
} }
fprintf(stderr, "adding device %s\n", file);
ret = btrfs_prepare_device(fd, file, zero_end, ret = btrfs_prepare_device(fd, file, zero_end,
&dev_block_count); &dev_block_count);
BUG_ON(ret); BUG_ON(ret);
ret = btrfs_add_to_fsid(trans, root, fd, dev_block_count, ret = btrfs_add_to_fsid(trans, root, fd, file, dev_block_count,
sectorsize, sectorsize, sectorsize); sectorsize, sectorsize, sectorsize);
BUG_ON(ret); BUG_ON(ret);
btrfs_register_one_device(file); btrfs_register_one_device(file);

20
utils.c
View File

@ -54,7 +54,7 @@ static u64 reference_root_table[6] = {
[5] = BTRFS_FS_TREE_OBJECTID, [5] = BTRFS_FS_TREE_OBJECTID,
}; };
int make_btrfs(int fd, char *device_name, int make_btrfs(int fd, char *device_name, char *label,
u64 blocks[6], u64 num_bytes, u32 nodesize, u64 blocks[6], u64 num_bytes, u32 nodesize,
u32 leafsize, u32 sectorsize, u32 stripesize) u32 leafsize, u32 sectorsize, u32 stripesize)
{ {
@ -84,10 +84,11 @@ int make_btrfs(int fd, char *device_name,
first_free = BTRFS_SUPER_INFO_OFFSET + sectorsize * 2 - 1; first_free = BTRFS_SUPER_INFO_OFFSET + sectorsize * 2 - 1;
first_free &= ~((u64)sectorsize - 1); first_free &= ~((u64)sectorsize - 1);
memset(&super, 0, sizeof(super));
num_bytes = (num_bytes / sectorsize) * sectorsize; num_bytes = (num_bytes / sectorsize) * sectorsize;
uuid_generate(super.fsid); uuid_generate(super.fsid);
uuid_generate(super.dev_item.uuid); uuid_generate(super.dev_item.uuid);
uuid_generate(chunk_tree_uuid); uuid_generate(chunk_tree_uuid);
btrfs_set_super_bytenr(&super, blocks[0]); btrfs_set_super_bytenr(&super, blocks[0]);
@ -98,14 +99,12 @@ int make_btrfs(int fd, char *device_name,
btrfs_set_super_chunk_root(&super, blocks[3]); btrfs_set_super_chunk_root(&super, blocks[3]);
btrfs_set_super_total_bytes(&super, num_bytes); btrfs_set_super_total_bytes(&super, num_bytes);
btrfs_set_super_bytes_used(&super, first_free + 5 * leafsize); btrfs_set_super_bytes_used(&super, first_free + 5 * leafsize);
btrfs_set_super_root_dir(&super, 0);
btrfs_set_super_sectorsize(&super, sectorsize); btrfs_set_super_sectorsize(&super, sectorsize);
btrfs_set_super_leafsize(&super, leafsize); btrfs_set_super_leafsize(&super, leafsize);
btrfs_set_super_nodesize(&super, nodesize); btrfs_set_super_nodesize(&super, nodesize);
btrfs_set_super_stripesize(&super, stripesize); btrfs_set_super_stripesize(&super, stripesize);
btrfs_set_super_root_level(&super, 0); if (label)
btrfs_set_super_chunk_root_level(&super, 0); strcpy(super.label, label);
btrfs_set_super_sys_array_size(&super, 0);
buf = malloc(sizeof(*buf) + max(sectorsize, leafsize)); buf = malloc(sizeof(*buf) + max(sectorsize, leafsize));
@ -429,8 +428,9 @@ static int zero_dev_end(int fd, u64 dev_size)
} }
int btrfs_add_to_fsid(struct btrfs_trans_handle *trans, int btrfs_add_to_fsid(struct btrfs_trans_handle *trans,
struct btrfs_root *root, int fd, u64 block_count, struct btrfs_root *root, int fd, char *path,
u32 io_width, u32 io_align, u32 sectorsize) u64 block_count, u32 io_width, u32 io_align,
u32 sectorsize)
{ {
struct btrfs_super_block *disk_super; struct btrfs_super_block *disk_super;
struct btrfs_super_block *super = &root->fs_info->super_copy; struct btrfs_super_block *super = &root->fs_info->super_copy;
@ -478,7 +478,9 @@ int btrfs_add_to_fsid(struct btrfs_trans_handle *trans,
memcpy(disk_super, super, sizeof(*disk_super)); memcpy(disk_super, super, sizeof(*disk_super));
printf("adding device id %llu\n", (unsigned long long)device->devid); printf("adding device %s id %llu\n", path,
(unsigned long long)device->devid);
btrfs_set_stack_device_id(dev_item, device->devid); btrfs_set_stack_device_id(dev_item, device->devid);
btrfs_set_stack_device_type(dev_item, device->type); btrfs_set_stack_device_type(dev_item, device->type);
btrfs_set_stack_device_io_align(dev_item, device->io_align); btrfs_set_stack_device_io_align(dev_item, device->io_align);

View File

@ -21,7 +21,7 @@
#define BTRFS_MKFS_SYSTEM_GROUP_SIZE (4 * 1024 * 1024) #define BTRFS_MKFS_SYSTEM_GROUP_SIZE (4 * 1024 * 1024)
int make_btrfs(int fd, char *device_name, int make_btrfs(int fd, char *device_name, char *label,
u64 blocks[6], u64 num_bytes, u32 nodesize, u64 blocks[6], u64 num_bytes, u32 nodesize,
u32 leafsize, u32 sectorsize, u32 stripesize); u32 leafsize, u32 sectorsize, u32 stripesize);
int btrfs_make_root_dir(struct btrfs_trans_handle *trans, int btrfs_make_root_dir(struct btrfs_trans_handle *trans,
@ -29,8 +29,9 @@ int btrfs_make_root_dir(struct btrfs_trans_handle *trans,
int btrfs_prepare_device(int fd, char *file, int zero_end, int btrfs_prepare_device(int fd, char *file, int zero_end,
u64 *block_count_ret); u64 *block_count_ret);
int btrfs_add_to_fsid(struct btrfs_trans_handle *trans, int btrfs_add_to_fsid(struct btrfs_trans_handle *trans,
struct btrfs_root *root, int fd, u64 block_count, struct btrfs_root *root, int fd, char *path,
u32 io_width, u32 io_align, u32 sectorsize); u64 block_count, u32 io_width, u32 io_align,
u32 sectorsize);
int btrfs_scan_for_fsid(struct btrfs_fs_devices *fs_devices, u64 total_devs, int btrfs_scan_for_fsid(struct btrfs_fs_devices *fs_devices, u64 total_devs,
int run_ioctls); int run_ioctls);
int btrfs_register_one_device(char *fname); int btrfs_register_one_device(char *fname);

View File

@ -128,7 +128,6 @@ static int device_list_add(const char *path,
} }
if (fs_devices->lowest_devid > devid) { if (fs_devices->lowest_devid > devid) {
fs_devices->lowest_devid = devid; fs_devices->lowest_devid = devid;
printk("lowest devid now %llu\n", (unsigned long long)devid);
} }
*fs_devices_ret = fs_devices; *fs_devices_ret = fs_devices;
return 0; return 0;
@ -184,6 +183,7 @@ int btrfs_scan_one_device(int fd, const char *path,
char *buf; char *buf;
int ret; int ret;
u64 devid; u64 devid;
char uuidbuf[37];
buf = malloc(4096); buf = malloc(4096);
if (!buf) { if (!buf) {
@ -203,7 +203,14 @@ int btrfs_scan_one_device(int fd, const char *path,
} }
devid = le64_to_cpu(disk_super->dev_item.devid); devid = le64_to_cpu(disk_super->dev_item.devid);
*total_devs = btrfs_super_num_devices(disk_super); *total_devs = btrfs_super_num_devices(disk_super);
printk("found device %llu on %s\n", (unsigned long long)devid, path); uuid_unparse(disk_super->fsid, uuidbuf);
printf("device ");
if (disk_super->label[0])
printf("label %s ", disk_super->label);
else
printf("fsuuid %s ", uuidbuf);
printf("devid %llu %s\n", (unsigned long long)devid, path);
ret = device_list_add(path, disk_super, devid, fs_devices_ret); ret = device_list_add(path, disk_super, devid, fs_devices_ret);
error_brelse: error_brelse: