btrfs-progs: return the fsid from make_btrfs()
authorGoffredo Baroncelli <kreijack@gmail.com>
Wed, 17 Dec 2014 20:14:09 +0000 (21:14 +0100)
committerDavid Sterba <dsterba@suse.cz>
Mon, 8 Jun 2015 15:50:46 +0000 (17:50 +0200)
The function make_btrfs() has as argument the fsid of the filesystem.
If this fsid is empty or null make_btrfs() generates a new fsid. However
If the buffer is valid (but the string is empty) the generated fsid is
copied back to the caller.

Signed-off-by: Goffredo Baroncelli <kreijack@inwind.it>
Reviewed-by: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
mkfs.c
utils.c

diff --git a/mkfs.c b/mkfs.c
index c069d36..962a7cd 100644 (file)
--- a/mkfs.c
+++ b/mkfs.c
@@ -1142,7 +1142,7 @@ int main(int ac, char **av)
        int dev_cnt = 0;
        int saved_optind;
        char estr[100];
-       char *fs_uuid = NULL;
+       char fs_uuid[BTRFS_UUID_UNPARSED_SIZE] = { 0 };
        u64 features = BTRFS_MKFS_DEFAULT_FEATURES;
 
        while(1) {
@@ -1235,7 +1235,8 @@ int main(int ac, char **av)
                                source_dir_set = 1;
                                break;
                        case 'U':
-                               fs_uuid = optarg;
+                               strncpy(fs_uuid, optarg,
+                                       BTRFS_UUID_UNPARSED_SIZE - 1);
                                break;
                        case 'K':
                                discard = 0;
@@ -1261,7 +1262,7 @@ int main(int ac, char **av)
                exit(1);
        }
 
-       if (fs_uuid) {
+       if (*fs_uuid) {
                uuid_t dummy_uuid;
 
                if (uuid_parse(fs_uuid, dummy_uuid) != 0) {
diff --git a/utils.c b/utils.c
index ef27c51..f34c27b 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -169,6 +169,9 @@ int test_uuid_unique(char *fs_uuid)
        return unique;
 }
 
+/*
+ * @fs_uuid - if NULL, generates a UUID, returns back the new filesystem UUID
+ */
 int make_btrfs(int fd, const char *device, const char *label, char *fs_uuid,
               u64 blocks[7], u64 num_bytes, u32 nodesize,
               u32 sectorsize, u32 stripesize, u64 features)
@@ -201,7 +204,7 @@ int make_btrfs(int fd, const char *device, const char *label, char *fs_uuid,
        memset(&super, 0, sizeof(super));
 
        num_bytes = (num_bytes / sectorsize) * sectorsize;
-       if (fs_uuid) {
+       if (fs_uuid && *fs_uuid) {
                if (uuid_parse(fs_uuid, super.fsid) != 0) {
                        fprintf(stderr, "could not parse UUID: %s\n", fs_uuid);
                        ret = -EINVAL;
@@ -214,6 +217,8 @@ int make_btrfs(int fd, const char *device, const char *label, char *fs_uuid,
                }
        } else {
                uuid_generate(super.fsid);
+               if (fs_uuid)
+                       uuid_unparse(super.fsid, fs_uuid);
        }
        uuid_generate(super.dev_item.uuid);
        uuid_generate(chunk_tree_uuid);