btrfs-progs: convert: set label or copy from origin

Signed-off-by: David Sterba <dsterba@suse.cz>
This commit is contained in:
David Sterba 2012-01-31 14:40:22 +01:00
parent 0b90a24e11
commit 56a7ff5775
2 changed files with 42 additions and 9 deletions

View File

@ -25,6 +25,10 @@ Ignore xattrs and ACLs.
Disable packing of small files. Disable packing of small files.
-r:: -r::
Roll back to ext2fs. Roll back to ext2fs.
-l <LABEL>::
set filesystem label during conversion.
-L::
use label from the converted filesystem.
EXIT STATUS EXIT STATUS
----------- -----------

View File

@ -2196,8 +2196,8 @@ err:
return ret; return ret;
} }
static int do_convert(const char *devname, int datacsum, int packing, static int do_convert(const char *devname, int datacsum, int packing, int noxattr,
int noxattr) int copylabel, const char *fslabel)
{ {
int i, ret; int i, ret;
int fd = -1; 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); fprintf(stderr, "error during create_ext2_image %d\n", ret);
goto fail; 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"); printf("cleaning up system chunk.\n");
ret = cleanup_sys_chunk(root, ext2_root); ret = cleanup_sys_chunk(root, ext2_root);
if (ret) { if (ret) {
@ -2685,11 +2696,13 @@ fail:
static void print_usage(void) static void print_usage(void)
{ {
printf("usage: btrfs-convert [-d] [-i] [-n] [-r] device\n"); printf("usage: btrfs-convert [-d] [-i] [-n] [-r] [-l label] [-L] device\n");
printf("\t-d disable data checksum\n"); printf("\t-d disable data checksum\n");
printf("\t-i ignore xattrs and ACLs\n"); printf("\t-i ignore xattrs and ACLs\n");
printf("\t-n disable packing of small files\n"); printf("\t-n disable packing of small files\n");
printf("\t-r roll back to ext2fs\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[]) int main(int argc, char *argv[])
@ -2699,10 +2712,13 @@ int main(int argc, char *argv[])
int noxattr = 0; int noxattr = 0;
int datacsum = 1; int datacsum = 1;
int rollback = 0; int rollback = 0;
int copylabel = 0;
int usage_error = 0; int usage_error = 0;
char *file; char *file;
char *fslabel = NULL;
while(1) { while(1) {
int c = getopt(argc, argv, "dinr"); int c = getopt(argc, argv, "dinrl:L");
if (c < 0) if (c < 0)
break; break;
switch(c) { switch(c) {
@ -2718,6 +2734,19 @@ int main(int argc, char *argv[])
case 'r': case 'r':
rollback = 1; rollback = 1;
break; 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: default:
print_usage(); print_usage();
return 1; return 1;
@ -2755,7 +2784,7 @@ int main(int argc, char *argv[])
if (rollback) { if (rollback) {
ret = do_rollback(file); ret = do_rollback(file);
} else { } else {
ret = do_convert(file, datacsum, packing, noxattr); ret = do_convert(file, datacsum, packing, noxattr, copylabel, fslabel);
} }
if (ret) if (ret)
return 1; return 1;