mirror of
https://github.com/kdave/btrfs-progs
synced 2025-02-26 06:50:46 +00:00
Btrfs-progs: add parent uuid for snapshots
Signed-off-by: Anand Jain <anand.jain@oracle.com>
This commit is contained in:
parent
93b3fd3879
commit
89c899ed47
34
btrfs-list.c
34
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.
|
||||
@ -127,6 +128,11 @@ struct {
|
||||
.column_name = "OTime",
|
||||
.need_print = 0,
|
||||
},
|
||||
{
|
||||
.name = "parent_uuid",
|
||||
.column_name = "Parent UUID",
|
||||
.need_print = 0,
|
||||
},
|
||||
{
|
||||
.name = "uuid",
|
||||
.column_name = "UUID",
|
||||
@ -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;
|
||||
|
||||
@ -537,9 +546,12 @@ static int add_root(struct root_lookup *root_lookup,
|
||||
if (ot)
|
||||
ri->otime = ot;
|
||||
|
||||
if (uuid)
|
||||
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);
|
||||
@ -1012,6 +1024,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));
|
||||
@ -1064,7 +1077,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);
|
||||
@ -1074,15 +1087,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;
|
||||
@ -1359,6 +1374,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);
|
||||
|
@ -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,
|
||||
|
@ -283,6 +283,7 @@ static const char * const cmd_subvol_list_usage[] = {
|
||||
" to the given <path>",
|
||||
"-o print only subvolumes bellow specified path",
|
||||
"-u print the uuid of subvolumes (and snapshots)",
|
||||
"-q print the parent uuid of the snapshots",
|
||||
"-t print the result as a table",
|
||||
"-s list snapshots only in the filesystem",
|
||||
"-r list readonly subvolumes (including snapshots)",
|
||||
@ -323,7 +324,7 @@ static int cmd_subvol_list(int argc, char **argv)
|
||||
optind = 1;
|
||||
while(1) {
|
||||
c = getopt_long(argc, argv,
|
||||
"aopsurg:c:t", long_options, NULL);
|
||||
"aopqsurg:c:t", long_options, NULL);
|
||||
if (c < 0)
|
||||
break;
|
||||
|
||||
@ -350,6 +351,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;
|
||||
|
Loading…
Reference in New Issue
Block a user