linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/5] add tree format display for btrfs subvol list subcommand
@ 2012-12-15 11:52 Anand jain
  2012-12-15 11:52 ` [PATCH 1/5] Btrfs-progs: add parent uuid for snapshots Anand jain
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Anand jain @ 2012-12-15 11:52 UTC (permalink / raw)
  To: linux-btrfs

From: Anand Jain <anand.jain@oracle.com>

This will add new option -x to the btrfs subvol list
sub-command to display subvol-snapshot relation in tree
format with appropriate indentation.

Anand Jain (5):
  Btrfs-progs: add parent uuid for snapshots
  Btrfs-progs: maintain similar case in heading prefix
  Btrfs-progs: Move printing outside of btrfs_list_subvols
  Btrfs-progs: make provision to print subvol list tree format
  Btrfs-progs: Add -x option to btrfs subvol list to display snapshots
    in tree format

 btrfs-list.c     |  227 +++++++++++++++++++++++++++++++++++++++++++++++------
 btrfs-list.h     |    3 +-
 cmds-subvolume.c |   20 ++++--
 man/btrfs.8.in   |    4 +-
 4 files changed, 220 insertions(+), 34 deletions(-)


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/5] Btrfs-progs: add parent uuid for snapshots
  2012-12-15 11:52 [PATCH 0/5] add tree format display for btrfs subvol list subcommand Anand jain
@ 2012-12-15 11:52 ` Anand jain
  2012-12-15 11:52 ` [PATCH 2/5] Btrfs-progs: maintain similar case in heading prefix Anand jain
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Anand jain @ 2012-12-15 11:52 UTC (permalink / raw)
  To: linux-btrfs

From: Anand Jain <anand.jain@oracle.com>

Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
 btrfs-list.c     |   32 +++++++++++++++++++++++++++-----
 btrfs-list.h     |    1 +
 cmds-subvolume.c |    6 +++++-
 3 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/btrfs-list.c b/btrfs-list.c
index e5f0f96..5314ced 100644
--- a/btrfs-list.c
+++ b/btrfs-list.c
@@ -80,6 +80,7 @@ struct root_info {
 	time_t otime;
 
 	u8 uuid[BTRFS_UUID_SIZE];
+	u8 puuid[BTRFS_UUID_SIZE];
 
 	/* path from the subvol we live in to this root, including the
 	 * root's name.  This is null until we do the extra lookup ioctl.
@@ -128,6 +129,11 @@ struct {
 		.need_print	= 0,
 	},
 	{
+		.name		= "parent UUID",
+		.column_name	= "Parent UUID",
+		.need_print	= 0,
+	},
+	{
 		.name		= "uuid",
 		.column_name	= "UUID",
 		.need_print	= 0,
@@ -435,7 +441,7 @@ static struct root_info *root_tree_search(struct root_lookup *root_tree,
 static int update_root(struct root_lookup *root_lookup,
 		       u64 root_id, u64 ref_tree, u64 root_offset, u64 flags,
 		       u64 dir_id, char *name, int name_len, u64 ogen, u64 gen,
-		       time_t ot, void *uuid)
+		       time_t ot, void *uuid, void *puuid)
 {
 	struct root_info *ri;
 
@@ -472,6 +478,8 @@ static int update_root(struct root_lookup *root_lookup,
 		ri->otime = ot;
 	if (uuid)
 		memcpy(&ri->uuid, uuid, BTRFS_UUID_SIZE);
+	if (puuid)
+		memcpy(&ri->puuid, puuid, BTRFS_UUID_SIZE);
 
 	return 0;
 }
@@ -489,17 +497,18 @@ static int update_root(struct root_lookup *root_lookup,
  * gen: the current generation of the root
  * ot: the original time(create time) of the root
  * uuid: uuid of the root
+ * puuid: uuid of the root parent if any
  */
 static int add_root(struct root_lookup *root_lookup,
 		    u64 root_id, u64 ref_tree, u64 root_offset, u64 flags,
 		    u64 dir_id, char *name, int name_len, u64 ogen, u64 gen,
-		    time_t ot, void *uuid)
+		    time_t ot, void *uuid, void *puuid)
 {
 	struct root_info *ri;
 	int ret;
 
 	ret = update_root(root_lookup, root_id, ref_tree, root_offset, flags,
-			  dir_id, name, name_len, ogen, gen, ot, uuid);
+			  dir_id, name, name_len, ogen, gen, ot, uuid, puuid);
 	if (!ret)
 		return 0;
 
@@ -540,6 +549,9 @@ static int add_root(struct root_lookup *root_lookup,
 	if (uuid) 
 		memcpy(&ri->uuid, uuid, BTRFS_UUID_SIZE);
 
+	if (puuid)
+		memcpy(&ri->puuid, puuid, BTRFS_UUID_SIZE);
+
 	ret = root_tree_insert(root_lookup, ri);
 	if (ret) {
 		printf("failed to insert tree %llu\n", (unsigned long long)root_id);
@@ -1022,6 +1034,7 @@ static int __list_subvol_search(int fd, struct root_lookup *root_lookup)
 	int i;
 	time_t t;
 	u8 uuid[BTRFS_UUID_SIZE];
+	u8 puuid[BTRFS_UUID_SIZE];
 
 	root_lookup_init(root_lookup);
 	memset(&args, 0, sizeof(args));
@@ -1075,7 +1088,7 @@ static int __list_subvol_search(int fd, struct root_lookup *root_lookup)
 
 				add_root(root_lookup, sh->objectid, sh->offset,
 					 0, 0, dir_id, name, name_len, 0, 0, 0,
-					 NULL);
+					 NULL, NULL);
 			} else if (sh->type == BTRFS_ROOT_ITEM_KEY) {
 				ri = (struct btrfs_root_item *)(args.buf + off);
 				gen = btrfs_root_generation(ri);
@@ -1085,15 +1098,17 @@ static int __list_subvol_search(int fd, struct root_lookup *root_lookup)
 					t = ri->otime.sec;
 					ogen = btrfs_root_otransid(ri);
 					memcpy(uuid, ri->uuid, BTRFS_UUID_SIZE);
+					memcpy(puuid, ri->parent_uuid, BTRFS_UUID_SIZE);
 				} else {
 					t = 0;
 					ogen = 0;
 					memset(uuid, 0, BTRFS_UUID_SIZE);
+					memset(puuid, 0, BTRFS_UUID_SIZE);
 				}
 
 				add_root(root_lookup, sh->objectid, 0,
 					 sh->offset, flags, 0, NULL, 0, ogen,
-					 gen, t, uuid);
+					 gen, t, uuid, puuid);
 			}
 
 			off += sh->len;
@@ -1347,6 +1362,13 @@ static void print_subvolume_column(struct root_info *subv,
 			uuid_unparse(subv->uuid, uuidparse);
 		printf("%s", uuidparse);
 		break;
+	case BTRFS_LIST_PUUID:
+		if (uuid_is_null(subv->puuid))
+			strcpy(uuidparse, "-");
+		else
+			uuid_unparse(subv->puuid, uuidparse);
+		printf("%s", uuidparse);
+		break;
 	case BTRFS_LIST_PATH:
 		BUG_ON(!subv->full_path);
 		printf("%s", subv->full_path);
diff --git a/btrfs-list.h b/btrfs-list.h
index cde4b3c..a32545f 100644
--- a/btrfs-list.h
+++ b/btrfs-list.h
@@ -53,6 +53,7 @@ enum btrfs_list_column_enum {
 	BTRFS_LIST_PARENT,
 	BTRFS_LIST_TOP_LEVEL,
 	BTRFS_LIST_OTIME,
+	BTRFS_LIST_PUUID,
 	BTRFS_LIST_UUID,
 	BTRFS_LIST_PATH,
 	BTRFS_LIST_ALL,
diff --git a/cmds-subvolume.c b/cmds-subvolume.c
index ac39f7b..427263a 100644
--- a/cmds-subvolume.c
+++ b/cmds-subvolume.c
@@ -279,6 +279,7 @@ static const char * const cmd_subvol_list_usage[] = {
 	"-p           print parent ID",
 	"-a           print all the subvolumes in the filesystem.",
 	"-u           print the uuid of subvolumes (and snapshots)",
+	"-q           print the parent uuid of snapshots",
 	"-t           print the result as a table",
 	"-s           list snapshots only in the filesystem",
 	"-r           list readonly subvolumes (including snapshots)",
@@ -318,7 +319,7 @@ static int cmd_subvol_list(int argc, char **argv)
 	optind = 1;
 	while(1) {
 		c = getopt_long(argc, argv,
-				    "apsurg:c:t", long_options, NULL);
+				    "apsuqrg:c:t", long_options, NULL);
 		if (c < 0)
 			break;
 
@@ -342,6 +343,9 @@ static int cmd_subvol_list(int argc, char **argv)
 		case 'u':
 			btrfs_list_setup_print_column(BTRFS_LIST_UUID);
 			break;
+		case 'q':
+			btrfs_list_setup_print_column(BTRFS_LIST_PUUID);
+			break;
 		case 'r':
 			flags |= BTRFS_ROOT_SUBVOL_RDONLY;
 			break;
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/5] Btrfs-progs: maintain similar case in heading prefix
  2012-12-15 11:52 [PATCH 0/5] add tree format display for btrfs subvol list subcommand Anand jain
  2012-12-15 11:52 ` [PATCH 1/5] Btrfs-progs: add parent uuid for snapshots Anand jain
@ 2012-12-15 11:52 ` Anand jain
  2012-12-15 11:52 ` [PATCH 3/5] Btrfs-progs: Move printing outside of btrfs_list_subvols Anand jain
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Anand jain @ 2012-12-15 11:52 UTC (permalink / raw)
  To: linux-btrfs

From: Anand Jain <anand.jain@oracle.com>

A trivial fix
before this patch
  btrfs su list -qu /btrfs
  ID 256 gen 35 top level 5 parent UUID - uuid 60e54c4a-8136-3c43-a107-ea42052c6240 path sv1
  ID 257 gen 35 top level 5 parent UUID 60e54c4a-8136-3c43-a107-ea42052c6240 uuid fdefa4a9-5b67-4f4c-8a11-c43acec51d43 path ss1

after this path
  btrfs su list -qu /btrfs
  ID 256 gen 35 top level 5 parent_uuid - uuid 60e54c4a-8136-3c43-a107-ea42052c6240 path sv1
  ID 257 gen 35 top level 5 parent_uuid 60e54c4a-8136-3c43-a107-ea42052c6240 uuid fdefa4a9-5b67-4f4c-8a11-c43acec51d43 path ss1

Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
 btrfs-list.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/btrfs-list.c b/btrfs-list.c
index 5314ced..3db5f14 100644
--- a/btrfs-list.c
+++ b/btrfs-list.c
@@ -129,7 +129,7 @@ struct {
 		.need_print	= 0,
 	},
 	{
-		.name		= "parent UUID",
+		.name		= "parent_uuid",
 		.column_name	= "Parent UUID",
 		.need_print	= 0,
 	},
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/5] Btrfs-progs: Move printing outside of btrfs_list_subvols
  2012-12-15 11:52 [PATCH 0/5] add tree format display for btrfs subvol list subcommand Anand jain
  2012-12-15 11:52 ` [PATCH 1/5] Btrfs-progs: add parent uuid for snapshots Anand jain
  2012-12-15 11:52 ` [PATCH 2/5] Btrfs-progs: maintain similar case in heading prefix Anand jain
@ 2012-12-15 11:52 ` Anand jain
  2012-12-15 11:52 ` [PATCH 4/5] Btrfs-progs: make provision to print subvol list tree format Anand jain
  2012-12-15 11:52 ` [PATCH 5/5] Btrfs-progs: Add -x option to btrfs subvol list to display snapshots in " Anand jain
  4 siblings, 0 replies; 6+ messages in thread
From: Anand jain @ 2012-12-15 11:52 UTC (permalink / raw)
  To: linux-btrfs

From: Anand Jain <anand.jain@oracle.com>

its better to have btrfs_list_subvols just return witout printing
so that btrfs_list_subvols can be reused.

Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
 btrfs-list.c     |   28 ++++++++++++++++++----------
 btrfs-list.h     |    2 +-
 cmds-subvolume.c |    4 ++--
 3 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/btrfs-list.c b/btrfs-list.c
index 3db5f14..45d8d05 100644
--- a/btrfs-list.c
+++ b/btrfs-list.c
@@ -1463,15 +1463,11 @@ static void print_all_volume_info(struct root_lookup *sorted_tree,
 	}
 }
 
-int btrfs_list_subvols(int fd, struct btrfs_list_filter_set *filter_set,
-		       struct btrfs_list_comparer_set *comp_set,
-		       int is_tab_result)
+int btrfs_list_subvols(int fd, struct root_lookup *root_lookup)
 {
-	struct root_lookup root_lookup;
-	struct root_lookup root_sort;
 	int ret;
 
-	ret = __list_subvol_search(fd, &root_lookup);
+	ret = __list_subvol_search(fd, root_lookup);
 	if (ret) {
 		fprintf(stderr, "ERROR: can't perform the search - %s\n",
 				strerror(errno));
@@ -1482,16 +1478,28 @@ int btrfs_list_subvols(int fd, struct btrfs_list_filter_set *filter_set,
 	 * now we have an rbtree full of root_info objects, but we need to fill
 	 * in their path names within the subvol that is referencing each one.
 	 */
-	ret = __list_subvol_fill_paths(fd, &root_lookup);
-	if (ret < 0)
-		return ret;
+	ret = __list_subvol_fill_paths(fd, root_lookup);
+	return ret;
+}
 
+int btrfs_list_subvols_print(int fd, struct btrfs_list_filter_set *filter_set,
+		       struct btrfs_list_comparer_set *comp_set,
+		       int is_tab_result)
+{
+	struct root_lookup root_lookup;
+	struct root_lookup root_sort;
+	int ret;
+
+	ret = btrfs_list_subvols(fd, &root_lookup);
+	if (ret)
+		return ret;
 	__filter_and_sort_subvol(&root_lookup, &root_sort, filter_set,
 				 comp_set, fd);
 
 	print_all_volume_info(&root_sort, is_tab_result);
 	__free_all_subvolumn(&root_lookup);
-	return ret;
+
+	return 0;
 }
 
 static int print_one_extent(int fd, struct btrfs_ioctl_search_header *sh,
diff --git a/btrfs-list.h b/btrfs-list.h
index a32545f..855e73d 100644
--- a/btrfs-list.h
+++ b/btrfs-list.h
@@ -99,7 +99,7 @@ int btrfs_list_setup_comparer(struct btrfs_list_comparer_set **comp_set,
 			      enum btrfs_list_comp_enum comparer,
 			      int is_descending);
 
-int btrfs_list_subvols(int fd, struct btrfs_list_filter_set *filter_set,
+int btrfs_list_subvols_print(int fd, struct btrfs_list_filter_set *filter_set,
 		       struct btrfs_list_comparer_set *comp_set,
 			int is_tab_result);
 int btrfs_list_find_updated_files(int fd, u64 root_id, u64 oldest_gen);
diff --git a/cmds-subvolume.c b/cmds-subvolume.c
index 427263a..b481a3b 100644
--- a/cmds-subvolume.c
+++ b/cmds-subvolume.c
@@ -409,7 +409,7 @@ static int cmd_subvol_list(int argc, char **argv)
 					BTRFS_LIST_FILTER_TOPID_EQUAL,
 					top_id);
 
-	ret = btrfs_list_subvols(fd, filter_set, comparer_set,
+	ret = btrfs_list_subvols_print(fd, filter_set, comparer_set,
 				is_tab_result);
 	if (ret)
 		return 19;
@@ -616,7 +616,7 @@ static int cmd_subvol_get_default(int argc, char **argv)
 	btrfs_list_setup_filter(&filter_set, BTRFS_LIST_FILTER_ROOTID,
 				default_id);
 
-	ret = btrfs_list_subvols(fd, filter_set, NULL, 0);
+	ret = btrfs_list_subvols_print(fd, filter_set, NULL, 0);
 	if (ret)
 		return 19;
 	return 0;
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 4/5] Btrfs-progs: make provision to print subvol list tree format
  2012-12-15 11:52 [PATCH 0/5] add tree format display for btrfs subvol list subcommand Anand jain
                   ` (2 preceding siblings ...)
  2012-12-15 11:52 ` [PATCH 3/5] Btrfs-progs: Move printing outside of btrfs_list_subvols Anand jain
@ 2012-12-15 11:52 ` Anand jain
  2012-12-15 11:52 ` [PATCH 5/5] Btrfs-progs: Add -x option to btrfs subvol list to display snapshots in " Anand jain
  4 siblings, 0 replies; 6+ messages in thread
From: Anand jain @ 2012-12-15 11:52 UTC (permalink / raw)
  To: linux-btrfs

From: Anand Jain <anand.jain@oracle.com>

Currently we have default (name <value>) and table format to
list the subvol. This patch will help to accommodate the
enhancement to provide the tree display for the subvol-snapshot
list.

Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
 btrfs-list.c     |   34 ++++++++++++++++++++++------------
 cmds-subvolume.c |    6 +++---
 2 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/btrfs-list.c b/btrfs-list.c
index 45d8d05..571efd0 100644
--- a/btrfs-list.c
+++ b/btrfs-list.c
@@ -1444,22 +1444,32 @@ static void print_all_volume_info_tab_head()
 }
 
 static void print_all_volume_info(struct root_lookup *sorted_tree,
-				  int is_tab_result)
+				int layout)
 {
 	struct rb_node *n;
 	struct root_info *entry;
 
-	if (is_tab_result)
+	switch (layout) {
+	case 0: // default: name <value>
+		n = rb_first(&sorted_tree->root);
+		while (n) {
+			entry = rb_entry(n, struct root_info, sort_node);
+			print_single_volume_info_default(entry);
+			n = rb_next(n);
+		}
+		break;
+	case 1: // table
 		print_all_volume_info_tab_head();
-
-	n = rb_first(&sorted_tree->root);
-	while (n) {
-		entry = rb_entry(n, struct root_info, sort_node);
-		if (is_tab_result)
+		n = rb_first(&sorted_tree->root);
+		while (n) {
+			entry = rb_entry(n, struct root_info, sort_node);
 			print_single_volume_info_table(entry);
-		else
-			print_single_volume_info_default(entry);
-		n = rb_next(n);
+			n = rb_next(n);
+		}
+		break;
+	default:
+		printf("ERROR: default switch print_all_volume_info\n");
+		return;
 	}
 }
 
@@ -1484,7 +1494,7 @@ int btrfs_list_subvols(int fd, struct root_lookup *root_lookup)
 
 int btrfs_list_subvols_print(int fd, struct btrfs_list_filter_set *filter_set,
 		       struct btrfs_list_comparer_set *comp_set,
-		       int is_tab_result)
+		       int layout)
 {
 	struct root_lookup root_lookup;
 	struct root_lookup root_sort;
@@ -1496,7 +1506,7 @@ int btrfs_list_subvols_print(int fd, struct btrfs_list_filter_set *filter_set,
 	__filter_and_sort_subvol(&root_lookup, &root_sort, filter_set,
 				 comp_set, fd);
 
-	print_all_volume_info(&root_sort, is_tab_result);
+	print_all_volume_info(&root_sort, layout);
 	__free_all_subvolumn(&root_lookup);
 
 	return 0;
diff --git a/cmds-subvolume.c b/cmds-subvolume.c
index b481a3b..411a5de 100644
--- a/cmds-subvolume.c
+++ b/cmds-subvolume.c
@@ -306,7 +306,7 @@ static int cmd_subvol_list(int argc, char **argv)
 	int ret;
 	int c;
 	char *subvol;
-	int is_tab_result = 0;
+	int layout = 0;
 	int is_list_all = 0;
 	struct option long_options[] = {
 		{"sort", 1, NULL, 'S'},
@@ -331,7 +331,7 @@ static int cmd_subvol_list(int argc, char **argv)
 			is_list_all = 1;
 			break;
 		case 't':
-			is_tab_result = 1;
+			layout = 1;
 			break;
 		case 's':
 			btrfs_list_setup_filter(&filter_set,
@@ -410,7 +410,7 @@ static int cmd_subvol_list(int argc, char **argv)
 					top_id);
 
 	ret = btrfs_list_subvols_print(fd, filter_set, comparer_set,
-				is_tab_result);
+				layout);
 	if (ret)
 		return 19;
 	return 0;
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 5/5] Btrfs-progs: Add -x option to btrfs subvol list to display snapshots in tree format
  2012-12-15 11:52 [PATCH 0/5] add tree format display for btrfs subvol list subcommand Anand jain
                   ` (3 preceding siblings ...)
  2012-12-15 11:52 ` [PATCH 4/5] Btrfs-progs: make provision to print subvol list tree format Anand jain
@ 2012-12-15 11:52 ` Anand jain
  4 siblings, 0 replies; 6+ messages in thread
From: Anand jain @ 2012-12-15 11:52 UTC (permalink / raw)
  To: linux-btrfs

From: Anand Jain <anand.jain@oracle.com>

This will add new option -x to the btrfs subvol list
sub-command to display the snapshots under its parent subvol
with appropriate indentation.

Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
 btrfs-list.c     |  135 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 cmds-subvolume.c |    6 ++-
 man/btrfs.8.in   |    4 +-
 3 files changed, 143 insertions(+), 2 deletions(-)

diff --git a/btrfs-list.c b/btrfs-list.c
index 571efd0..43c279c 100644
--- a/btrfs-list.c
+++ b/btrfs-list.c
@@ -150,6 +150,11 @@ struct {
 	},
 };
 
+struct str_print {
+	char path[BTRFS_PATH_NAME_MAX];
+	char otime[256];
+};
+
 static btrfs_list_filter_func all_filter_funcs[];
 static btrfs_list_comp_func all_comp_funcs[];
 
@@ -1414,6 +1419,133 @@ static void print_single_volume_info_default(struct root_info *subv)
 	printf("\n");
 }
 
+static void print_single_volume_info_tree(struct root_info *subv,
+	struct str_print *sp)
+{
+	char tstr[256];
+
+	sprintf(sp->path, "%s", subv->full_path);
+	if (subv->otime)
+		strftime(tstr, 256, "%X %d-%m-%Y", localtime(&subv->otime));
+	else
+		strcpy(tstr, "-");
+	sprintf(sp->otime, "%s", tstr);
+}
+
+int snapshot_is_orphan(struct root_lookup *root_tree, void *uuid)
+{
+	struct rb_node *n;
+	struct root_info *entry;
+
+	n = rb_first(&root_tree->root);
+	while (n) {
+		entry = rb_entry(n, struct root_info, sort_node);
+		if ( ! uuid_compare(entry->uuid, uuid)) {
+			return 0;
+		}
+		n = rb_next(n);
+	}
+	return 1;
+}
+
+void * print_snapshots_of(struct root_lookup *root_tree, void *uuid,
+	int indent, struct str_print *sp)
+{
+	struct rb_node *n;
+	struct root_info *entry;
+	int i = indent;
+	char ispace[BTRFS_PATH_NAME_MAX + 256];
+	char *ispacep = ispace;
+
+	n = rb_first(&root_tree->root);
+	while (n) {
+		entry = rb_entry(n, struct root_info, sort_node);
+		if ( ! uuid_compare(entry->puuid, uuid)) {
+			while(i--) {
+				sprintf(ispacep,"%s"," ");
+				ispacep++;
+			}
+			print_single_volume_info_tree(entry, sp);
+			strcat(ispace, sp->path);
+			strcpy(sp->path, ispace);
+			sp++;
+			sp = (struct str_print *) print_snapshots_of(root_tree,
+				entry->uuid, indent+1, sp);
+		}
+		i = indent;
+		n = rb_next(n);
+	}
+	return sp;
+}
+
+void print_subvol_tree(struct root_lookup *root_tree)
+{
+	struct rb_node *n;
+	struct root_info *entry;
+	int listlen = 0;
+	int max_slen = 0;
+	int pad;
+	int stmp;
+	int i;
+	struct str_print *head;
+	struct str_print *cur;
+
+	n = rb_first(&root_tree->root);
+	while (n) {
+		listlen++;
+		n = rb_next(n);
+	}
+	head = (struct str_print *) malloc(sizeof(struct str_print)*listlen);
+	memset(head, 0, sizeof(struct str_print)*listlen);
+
+	cur = head;
+	n = rb_first(&root_tree->root);
+	while (n) {
+		entry = rb_entry(n, struct root_info, sort_node);
+		if ( uuid_is_null(entry->puuid)) {
+			print_single_volume_info_tree(entry, cur);
+			cur++;
+			cur = (struct str_print *) print_snapshots_of(root_tree,
+					entry->uuid, 1, cur);
+		}
+		n = rb_next(n);
+	}
+	n = rb_first(&root_tree->root);
+	while (n) {
+		entry = rb_entry(n, struct root_info, sort_node);
+		if ( !uuid_is_null(entry->puuid)
+			&& snapshot_is_orphan(root_tree, entry->puuid)) {
+			print_single_volume_info_tree(entry, cur);
+			cur++;
+			cur = (struct str_print *) print_snapshots_of(root_tree,
+					entry->uuid, 1, cur);
+		}
+		n = rb_next(n);
+	}
+	//BUG_ON(cur != (head + (sizeof(struct str_print) * listlen)));
+
+	cur = head;
+	for (i=0; i < listlen; i++) {
+		stmp = strlen(cur->path);
+		if (stmp > max_slen)
+			max_slen = stmp;
+		cur++;
+	}
+
+	cur = head;
+	for (i=0; i < listlen; i++) {
+		printf("%s", cur->path);
+		pad = max_slen - strlen(cur->path) + 1;
+		while(pad--)
+			printf("%s"," ");
+		printf("%s"," ");
+		printf("%s", cur->otime);
+		printf("\n");
+		cur++;
+	}
+	free(head);
+}
+
 static void print_all_volume_info_tab_head()
 {
 	int i;
@@ -1467,6 +1599,9 @@ static void print_all_volume_info(struct root_lookup *sorted_tree,
 			n = rb_next(n);
 		}
 		break;
+	case 2: // tree format
+		print_subvol_tree(sorted_tree);
+		break;
 	default:
 		printf("ERROR: default switch print_all_volume_info\n");
 		return;
diff --git a/cmds-subvolume.c b/cmds-subvolume.c
index 411a5de..4f2704f 100644
--- a/cmds-subvolume.c
+++ b/cmds-subvolume.c
@@ -281,6 +281,7 @@ static const char * const cmd_subvol_list_usage[] = {
 	"-u           print the uuid of subvolumes (and snapshots)",
 	"-q           print the parent uuid of snapshots",
 	"-t           print the result as a table",
+	"-x           print the result as a tree",
 	"-s           list snapshots only in the filesystem",
 	"-r           list readonly subvolumes (including snapshots)",
 	"-g [+|-]value",
@@ -319,7 +320,7 @@ static int cmd_subvol_list(int argc, char **argv)
 	optind = 1;
 	while(1) {
 		c = getopt_long(argc, argv,
-				    "apsuqrg:c:t", long_options, NULL);
+				    "apsuqrg:c:tx", long_options, NULL);
 		if (c < 0)
 			break;
 
@@ -333,6 +334,9 @@ static int cmd_subvol_list(int argc, char **argv)
 		case 't':
 			layout = 1;
 			break;
+		case 'x':
+			layout = 2;
+			break;
 		case 's':
 			btrfs_list_setup_filter(&filter_set,
 						BTRFS_LIST_FILTER_SNAPSHOT_ONLY,
diff --git a/man/btrfs.8.in b/man/btrfs.8.in
index 9222580..1bb0415 100644
--- a/man/btrfs.8.in
+++ b/man/btrfs.8.in
@@ -11,7 +11,7 @@ btrfs \- control a btrfs filesystem
 .PP
 \fBbtrfs\fP \fBsubvolume create\fP\fI [<dest>/]<name>\fP
 .PP
-\fBbtrfs\fP \fBsubvolume list\fP\fI [-aprts] [-g [+|-]value] [-c [+|-]value] [--rootid=rootid,gen,ogen,path] <path>\fP
+\fBbtrfs\fP \fBsubvolume list\fP\fI [-aprtxs] [-g [+|-]value] [-c [+|-]value] [--rootid=rootid,gen,ogen,path] <path>\fP
 .PP
 \fBbtrfs\fP \fBsubvolume set-default\fP\fI <id> <path>\fP
 .PP
@@ -124,6 +124,8 @@ and top level. The parent's ID may be used at mount time via the
 
 \fB-t\fP print the result as a table.
 
+\fB-x\fP print the result as a tree.
+
 \fB-a\fP print all the subvolumes in the filesystem.
 
 \fB-r\fP only readonly subvolumes in the filesystem wille be listed.
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-12-15 11:46 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-15 11:52 [PATCH 0/5] add tree format display for btrfs subvol list subcommand Anand jain
2012-12-15 11:52 ` [PATCH 1/5] Btrfs-progs: add parent uuid for snapshots Anand jain
2012-12-15 11:52 ` [PATCH 2/5] Btrfs-progs: maintain similar case in heading prefix Anand jain
2012-12-15 11:52 ` [PATCH 3/5] Btrfs-progs: Move printing outside of btrfs_list_subvols Anand jain
2012-12-15 11:52 ` [PATCH 4/5] Btrfs-progs: make provision to print subvol list tree format Anand jain
2012-12-15 11:52 ` [PATCH 5/5] Btrfs-progs: Add -x option to btrfs subvol list to display snapshots in " Anand jain

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).