From fd953a55cfc5761d12b07b37a177e0b69cb8528b Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Jun 16 2014 23:26:41 +0000 Subject: Support UUID specification at mkfs time --- diff --git a/btrfs-progs-3.14.2-mkfs-set-uuid.patch b/btrfs-progs-3.14.2-mkfs-set-uuid.patch new file mode 100644 index 0000000..bc9c2b8 --- /dev/null +++ b/btrfs-progs-3.14.2-mkfs-set-uuid.patch @@ -0,0 +1,221 @@ +From: Eric Sandeen +Date: Wed, 14 May 2014 17:39:07 +0000 (-0500) +Subject: btrfs-progs: mkfs: allow UUID specification at mkfs time +X-Git-Url: http://repo.or.cz/w/btrfs-progs-unstable/devel.git/commitdiff_plain/a03901849f868c65f845325fcaeb3d25c6896759 + +btrfs-progs: mkfs: allow UUID specification at mkfs time + +Allow the specification of the filesystem UUID at mkfs time. + +Non-unique unique IDs are rejected. This includes attempting +to re-mkfs with the same UUID; if you really want to do that, +you can mkfs with a new UUID, then re-mkfs with the one you +wanted. + +(Implemented only for mkfs.btrfs, not btrfs-convert). + +Signed-off-by: Eric Sandeen +[converted help to asciidoc] +Signed-off-by: David Sterba +--- + +Index: btrfs-progs-v3.14.2/Documentation/mkfs.btrfs.txt +=================================================================== +--- btrfs-progs-v3.14.2.orig/Documentation/mkfs.btrfs.txt ++++ btrfs-progs-v3.14.2/Documentation/mkfs.btrfs.txt +@@ -21,6 +21,7 @@ $$[-s|--sectorsize ]$$ + $$[-r|--rootdir ]$$ + $$[-K|--nodiscard]$$ + $$[-O|--features [,...]]$$ ++$$[-U|--uuid ]$$ + $$[-h]$$ + $$[-V|--version]$$ + $$ [...]$$ +@@ -109,6 +110,10 @@ supported by old kernels. + To see all features run:::: + mkfs.btrfs -O list-all + ++-U|--uuid :: ++Create the filesystem with the specified UUID, which must not already exist on ++the system. ++ + -V|--version:: + Print the *mkfs.btrfs* version and exit. + +Index: btrfs-progs-v3.14.2/btrfs-convert.c +=================================================================== +--- btrfs-progs-v3.14.2.orig/btrfs-convert.c ++++ btrfs-progs-v3.14.2/btrfs-convert.c +@@ -2240,7 +2240,7 @@ static int do_convert(const char *devnam + goto fail; + } + ret = make_btrfs(fd, devname, ext2_fs->super->s_volume_name, +- blocks, total_bytes, blocksize, blocksize, ++ NULL, blocks, total_bytes, blocksize, blocksize, + blocksize, blocksize, 0); + if (ret) { + fprintf(stderr, "unable to create initial ctree: %s\n", +Index: btrfs-progs-v3.14.2/mkfs.c +=================================================================== +--- btrfs-progs-v3.14.2.orig/mkfs.c ++++ btrfs-progs-v3.14.2/mkfs.c +@@ -288,6 +288,7 @@ static void print_usage(void) + fprintf(stderr, "\t -r --rootdir the source directory\n"); + fprintf(stderr, "\t -K --nodiscard do not perform whole device TRIM\n"); + fprintf(stderr, "\t -O --features comma separated list of filesystem features\n"); ++ fprintf(stderr, "\t -U --uuid specify the filesystem UUID\n"); + fprintf(stderr, "\t -V --version print the mkfs.btrfs version and exit\n"); + fprintf(stderr, "%s\n", BTRFS_BUILD_VERSION); + exit(1); +@@ -351,6 +352,7 @@ static struct option long_options[] = { + { "rootdir", 1, NULL, 'r' }, + { "nodiscard", 0, NULL, 'K' }, + { "features", 1, NULL, 'O' }, ++ { "uuid", 0, NULL, 'U' }, + { NULL, 0, NULL, 0} + }; + +@@ -1273,11 +1275,12 @@ int main(int ac, char **av) + int dev_cnt = 0; + int saved_optind; + char estr[100]; ++ char *fs_uuid = NULL; + u64 features = DEFAULT_MKFS_FEATURES; + + while(1) { + int c; +- c = getopt_long(ac, av, "A:b:fl:n:s:m:d:L:O:r:VMK", ++ c = getopt_long(ac, av, "A:b:fl:n:s:m:d:L:O:r:U:VMK", + long_options, &option_index); + if (c < 0) + break; +@@ -1346,6 +1349,9 @@ int main(int ac, char **av) + source_dir = optarg; + source_dir_set = 1; + break; ++ case 'U': ++ fs_uuid = optarg; ++ break; + case 'K': + discard = 0; + break; +@@ -1368,6 +1374,20 @@ int main(int ac, char **av) + "The -r option is limited to a single device\n"); + exit(1); + } ++ ++ if (fs_uuid) { ++ uuid_t dummy_uuid; ++ ++ if (uuid_parse(fs_uuid, dummy_uuid) != 0) { ++ fprintf(stderr, "could not parse UUID: %s\n", fs_uuid); ++ exit(1); ++ } ++ if (!test_uuid_unique(fs_uuid)) { ++ fprintf(stderr, "non-unique UUID: %s\n", fs_uuid); ++ exit(1); ++ } ++ } ++ + while (dev_cnt-- > 0) { + file = av[optind++]; + if (is_block_device(file)) +@@ -1514,7 +1534,7 @@ int main(int ac, char **av) + + process_fs_features(features); + +- ret = make_btrfs(fd, file, label, blocks, dev_block_count, ++ ret = make_btrfs(fd, file, label, fs_uuid, blocks, dev_block_count, + nodesize, leafsize, + sectorsize, stripesize, features); + if (ret) { +Index: btrfs-progs-v3.14.2/utils.c +=================================================================== +--- btrfs-progs-v3.14.2.orig/utils.c ++++ btrfs-progs-v3.14.2/utils.c +@@ -93,12 +93,41 @@ static u64 reference_root_table[] = { + [6] = BTRFS_CSUM_TREE_OBJECTID, + }; + +-int make_btrfs(int fd, const char *device, const char *label, ++int test_uuid_unique(char *fs_uuid) ++{ ++ int unique = 1; ++ blkid_dev_iterate iter = NULL; ++ blkid_dev dev = NULL; ++ blkid_cache cache = NULL; ++ ++ if (blkid_get_cache(&cache, 0) < 0) { ++ printf("ERROR: lblkid cache get failed\n"); ++ return 1; ++ } ++ blkid_probe_all(cache); ++ iter = blkid_dev_iterate_begin(cache); ++ blkid_dev_set_search(iter, "UUID", fs_uuid); ++ ++ while (blkid_dev_next(iter, &dev) == 0) { ++ dev = blkid_verify(cache, dev); ++ if (dev) { ++ unique = 0; ++ break; ++ } ++ } ++ ++ blkid_dev_iterate_end(iter); ++ blkid_put_cache(cache); ++ ++ return unique; ++} ++ ++int make_btrfs(int fd, const char *device, const char *label, char *fs_uuid, + u64 blocks[7], u64 num_bytes, u32 nodesize, + u32 leafsize, u32 sectorsize, u32 stripesize, u64 features) + { + struct btrfs_super_block super; +- struct extent_buffer *buf; ++ struct extent_buffer *buf = NULL; + struct btrfs_root_item root_item; + struct btrfs_disk_key disk_key; + struct btrfs_extent_item *extent_item; +@@ -125,7 +154,20 @@ int make_btrfs(int fd, const char *devic + memset(&super, 0, sizeof(super)); + + num_bytes = (num_bytes / sectorsize) * sectorsize; +- uuid_generate(super.fsid); ++ if (fs_uuid) { ++ if (uuid_parse(fs_uuid, super.fsid) != 0) { ++ fprintf(stderr, "could not parse UUID: %s\n", fs_uuid); ++ ret = -EINVAL; ++ goto out; ++ } ++ if (!test_uuid_unique(fs_uuid)) { ++ fprintf(stderr, "non-unique UUID: %s\n", fs_uuid); ++ ret = -EBUSY; ++ goto out; ++ } ++ } else { ++ uuid_generate(super.fsid); ++ } + uuid_generate(super.dev_item.uuid); + uuid_generate(chunk_tree_uuid); + +Index: btrfs-progs-v3.14.2/utils.h +=================================================================== +--- btrfs-progs-v3.14.2.orig/utils.h ++++ btrfs-progs-v3.14.2/utils.h +@@ -40,7 +40,7 @@ + #define BTRFS_UUID_UNPARSED_SIZE 37 + + int make_btrfs(int fd, const char *device, const char *label, +- u64 blocks[6], u64 num_bytes, u32 nodesize, ++ char *fs_uuid, u64 blocks[6], u64 num_bytes, u32 nodesize, + u32 leafsize, u32 sectorsize, u32 stripesize, u64 features); + int btrfs_make_root_dir(struct btrfs_trans_handle *trans, + struct btrfs_root *root, u64 objectid); +@@ -101,5 +101,5 @@ int get_btrfs_mount(const char *dev, cha + int find_mount_root(const char *path, char **mount_root); + int get_device_info(int fd, u64 devid, + struct btrfs_ioctl_dev_info_args *di_args); +- ++int test_uuid_unique(char *fs_uuid); + #endif diff --git a/btrfs-progs.spec b/btrfs-progs.spec index 91220af..9fbfff1 100644 --- a/btrfs-progs.spec +++ b/btrfs-progs.spec @@ -1,6 +1,6 @@ Name: btrfs-progs Version: 3.14.2 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Userspace programs for btrfs Group: System Environment/Base @@ -12,6 +12,7 @@ Source0: https://www.kernel.org/pub/linux/kernel/people/mason/%{name}/%{name}-v% # Still must reverse-engineer fixes in there and get upstream Patch0: btrfs-progs-valgrind.patch Patch1: btrfs-init-dev-list.patch +Patch2: btrfs-progs-3.14.2-mkfs-set-uuid.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -40,6 +41,7 @@ btrfs filesystem-specific programs. %prep %setup -q -n %{name}-v%{version} %patch1 -p1 +%patch2 -p1 %build make CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing" %{?_smp_mflags} @@ -76,6 +78,9 @@ rm -rf $RPM_BUILD_ROOT %{_libdir}/libbtrfs.so %changelog +* Mon Jun 16 2014 Eric Sandeen 3.14.2-3 +- Support specification of UUID at mkfs time (#1094857) + * Sat Jun 07 2014 Fedora Release Engineering - 3.14.2-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild