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 <sandeen@redhat.com>
+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 <sandeen@redhat.com>
+[converted help to asciidoc]
+Signed-off-by: David Sterba <dsterba@suse.cz>
+---
+
+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 <sectorsize>]$$
+ $$[-r|--rootdir <rootdir>]$$
+ $$[-K|--nodiscard]$$
+ $$[-O|--features <feature1>[,<feature2>...]]$$
++$$[-U|--uuid <UUID>]$$
+ $$[-h]$$
+ $$[-V|--version]$$
+ $$<device> [<device>...]$$
+@@ -109,6 +110,10 @@ supported by old kernels.
+ To see all features run::::
+ mkfs.btrfs -O list-all
+ 
++-U|--uuid <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 <sandeen@redhat.com> 3.14.2-3
+- Support specification of UUID at mkfs time (#1094857)
+
 * Sat Jun 07 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.14.2-2
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild