btrfs-progs: convert: set label or copy from origin
authorDavid Sterba <dsterba@suse.cz>
Tue, 31 Jan 2012 13:40:22 +0000 (14:40 +0100)
committerDavid Sterba <dsterba@suse.cz>
Fri, 10 Oct 2014 17:06:57 +0000 (19:06 +0200)
Signed-off-by: David Sterba <dsterba@suse.cz>
Documentation/btrfs-convert.txt
btrfs-convert.c

index 11d6044..555fb35 100644 (file)
@@ -25,6 +25,10 @@ Ignore xattrs and ACLs.
 Disable packing of small files.
 -r::
 Roll back to ext2fs.
+-l <LABEL>::
+set filesystem label during conversion.
+-L::
+use label from the converted filesystem.
 
 EXIT STATUS
 -----------
index 2977533..a544fc6 100644 (file)
@@ -2196,8 +2196,8 @@ err:
        return ret;
 }
 
-static int do_convert(const char *devname, int datacsum, int packing,
-               int noxattr)
+static int do_convert(const char *devname, int datacsum, int packing, int noxattr,
+              int copylabel, const char *fslabel)
 {
        int i, ret;
        int fd = -1;
@@ -2291,6 +2291,17 @@ static int do_convert(const char *devname, int datacsum, int packing,
                fprintf(stderr, "error during create_ext2_image %d\n", ret);
                goto fail;
        }
+       memset(root->fs_info->super_copy->label, 0, BTRFS_LABEL_SIZE);
+       if (copylabel == 1) {
+               strncpy(root->fs_info->super_copy->label,
+                               ext2_fs->super->s_volume_name, 16);
+               fprintf(stderr, "copy label '%s'\n",
+                               root->fs_info->super_copy->label);
+       } else if (copylabel == -1) {
+               strncpy(root->fs_info->super_copy->label, fslabel, BTRFS_LABEL_SIZE);
+               fprintf(stderr, "set label to '%s'\n", fslabel);
+       }
+
        printf("cleaning up system chunk.\n");
        ret = cleanup_sys_chunk(root, ext2_root);
        if (ret) {
@@ -2685,11 +2696,13 @@ fail:
 
 static void print_usage(void)
 {
-       printf("usage: btrfs-convert [-d] [-i] [-n] [-r] device\n");
-       printf("\t-d disable data checksum\n");
-       printf("\t-i ignore xattrs and ACLs\n");
-       printf("\t-n disable packing of small files\n");
-       printf("\t-r roll back to ext2fs\n");
+       printf("usage: btrfs-convert [-d] [-i] [-n] [-r] [-l label] [-L] device\n");
+       printf("\t-d           disable data checksum\n");
+       printf("\t-i           ignore xattrs and ACLs\n");
+       printf("\t-n           disable packing of small files\n");
+       printf("\t-r           roll back to ext2fs\n");
+       printf("\t-l LABEL     set filesystem label\n");
+       printf("\t-L           use label from converted fs\n");
 }
 
 int main(int argc, char *argv[])
@@ -2699,10 +2712,13 @@ int main(int argc, char *argv[])
        int noxattr = 0;
        int datacsum = 1;
        int rollback = 0;
+       int copylabel = 0;
        int usage_error = 0;
        char *file;
+       char *fslabel = NULL;
+
        while(1) {
-               int c = getopt(argc, argv, "dinr");
+               int c = getopt(argc, argv, "dinrl:L");
                if (c < 0)
                        break;
                switch(c) {
@@ -2718,6 +2734,19 @@ int main(int argc, char *argv[])
                        case 'r':
                                rollback = 1;
                                break;
+                       case 'l':
+                               copylabel = -1;
+                               fslabel = strdup(optarg);
+                               if (strlen(fslabel) > BTRFS_LABEL_SIZE) {
+                                       fprintf(stderr,
+                                               "warning: label too long, trimmed to %d bytes\n",
+                                               BTRFS_LABEL_SIZE);
+                                       fslabel[BTRFS_LABEL_SIZE] = 0;
+                               }
+                               break;
+                       case 'L':
+                               copylabel = 1;
+                               break;
                        default:
                                print_usage();
                                return 1;
@@ -2755,7 +2784,7 @@ int main(int argc, char *argv[])
        if (rollback) {
                ret = do_rollback(file);
        } else {
-               ret = do_convert(file, datacsum, packing, noxattr);
+               ret = do_convert(file, datacsum, packing, noxattr, copylabel, fslabel);
        }
        if (ret)
                return 1;