Message ID | 1349345524-2822-1-git-send-email-Anand.Jain@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
2012/10/4 Anand jain <Anand.Jain@oracle.com>: > 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 b1c9714..9d5a11f 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 = "puuid", > + .column_name = "PUUID", > + .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->uuid, uuid, BTRFS_UUID_SIZE); I think here is "&ri->puuid" > > 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; > @@ -1361,6 +1376,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 58e8983..3690ca5 100644 > --- a/cmds-subvolume.c > +++ b/cmds-subvolume.c > @@ -267,6 +267,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)", > + "-P 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)", > @@ -306,7 +307,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); > + "apsuPrg:c:t", long_options, NULL); > if (c < 0) > break; > > @@ -330,6 +331,9 @@ static int cmd_subvol_list(int argc, char **argv) > case 'u': > btrfs_list_setup_print_column(BTRFS_LIST_UUID); > break; > + case 'P': > + btrfs_list_setup_print_column(BTRFS_LIST_PUUID); > + break; > case 'r': > flags |= BTRFS_ROOT_SUBVOL_RDONLY; > break; > -- > 1.7.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
Dong, >> + if (puuid) >> + memcpy(&ri->uuid, uuid, BTRFS_UUID_SIZE); > > I think here is "&ri->puuid" Sorry my mistake. Thanks for the review. -Anand -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/btrfs-list.c b/btrfs-list.c index b1c9714..9d5a11f 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 = "puuid", + .column_name = "PUUID", + .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->uuid, uuid, 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; @@ -1361,6 +1376,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 58e8983..3690ca5 100644 --- a/cmds-subvolume.c +++ b/cmds-subvolume.c @@ -267,6 +267,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)", + "-P 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)", @@ -306,7 +307,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); + "apsuPrg:c:t", long_options, NULL); if (c < 0) break; @@ -330,6 +331,9 @@ static int cmd_subvol_list(int argc, char **argv) case 'u': btrfs_list_setup_print_column(BTRFS_LIST_UUID); break; + case 'P': + btrfs_list_setup_print_column(BTRFS_LIST_PUUID); + break; case 'r': flags |= BTRFS_ROOT_SUBVOL_RDONLY; break;