File 0068-btrfs-progs-convert-set-label-or-copy-from-origin.patch of Package btrfsprogs.356

From 56a7ff5775c7843afd27771d61fdf37b1de169eb Mon Sep 17 00:00:00 2001
From: David Sterba <dsterba@suse.cz>
Date: Tue, 31 Jan 2012 14:40:22 +0100
Subject: [PATCH 068/303] btrfs-progs: convert: set label or copy from origin

Signed-off-by: David Sterba <dsterba@suse.cz>
---
 Documentation/btrfs-convert.txt |  4 ++++
 btrfs-convert.c                 | 47 +++++++++++++++++++++++++++++++++--------
 2 files changed, 42 insertions(+), 9 deletions(-)

diff --git a/Documentation/btrfs-convert.txt b/Documentation/btrfs-convert.txt
index 11d60444ec90..555fb35520c9 100644
--- a/Documentation/btrfs-convert.txt
+++ b/Documentation/btrfs-convert.txt
@@ -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
 -----------
diff --git a/btrfs-convert.c b/btrfs-convert.c
index 2977533ac0e8..a544fc64892f 100644
--- a/btrfs-convert.c
+++ b/btrfs-convert.c
@@ -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;
-- 
2.1.3

openSUSE Build Service is sponsored by