Btrfs-progs: move path modification to filters
Commit 8e8e019e91
introduces -a option
which will list all subvolumes with distinguishing between relative and
absolute by prepending absolute patch with "<FS_TREE>".
This commit moves the path modification to a filter code rather than
doing so in path construction in resolve_root(). This gives us more
flexibility in formatting path output.
Signed-off-by: Lukas Czerner <lczerner@redhat.com>
This commit is contained in:
parent
efbb344a59
commit
e599d6c5da
34
btrfs-list.c
34
btrfs-list.c
|
@ -628,16 +628,6 @@ static int resolve_root(struct root_lookup *rl, struct root_info *ri,
|
|||
}
|
||||
|
||||
if (next == BTRFS_FS_TREE_OBJECTID) {
|
||||
char p[] = "<FS_TREE>";
|
||||
add_len = strlen(p);
|
||||
len = strlen(full_path);
|
||||
tmp = malloc(len + add_len + 2);
|
||||
memcpy(tmp + add_len + 1, full_path, len);
|
||||
tmp[len + add_len + 1] = '\0';
|
||||
tmp[add_len] = '/';
|
||||
memcpy(tmp, p, add_len);
|
||||
free(full_path);
|
||||
full_path = tmp;
|
||||
ri->top_id = next;
|
||||
break;
|
||||
}
|
||||
|
@ -1175,6 +1165,29 @@ static int filter_topid_equal(struct root_info *ri, u64 data)
|
|||
return ri->top_id == data;
|
||||
}
|
||||
|
||||
static int filter_full_path(struct root_info *ri, u64 data)
|
||||
{
|
||||
if (ri->full_path && ri->top_id != data) {
|
||||
char *tmp;
|
||||
char p[] = "<FS_TREE>";
|
||||
int add_len = strlen(p);
|
||||
int len = strlen(ri->full_path);
|
||||
|
||||
tmp = malloc(len + add_len + 2);
|
||||
if (!tmp) {
|
||||
fprintf(stderr, "memory allocation failed\n");
|
||||
exit(1);
|
||||
}
|
||||
memcpy(tmp + add_len + 1, ri->full_path, len);
|
||||
tmp[len + add_len + 1] = '\0';
|
||||
tmp[add_len] = '/';
|
||||
memcpy(tmp, p, add_len);
|
||||
free(ri->full_path);
|
||||
ri->full_path = tmp;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static btrfs_list_filter_func all_filter_funcs[] = {
|
||||
[BTRFS_LIST_FILTER_ROOTID] = filter_by_rootid,
|
||||
[BTRFS_LIST_FILTER_SNAPSHOT_ONLY] = filter_snapshot,
|
||||
|
@ -1186,6 +1199,7 @@ static btrfs_list_filter_func all_filter_funcs[] = {
|
|||
[BTRFS_LIST_FILTER_CGEN_LESS] = filter_cgen_less,
|
||||
[BTRFS_LIST_FILTER_CGEN_EQUAL] = filter_cgen_equal,
|
||||
[BTRFS_LIST_FILTER_TOPID_EQUAL] = filter_topid_equal,
|
||||
[BTRFS_LIST_FILTER_FULL_PATH] = filter_full_path,
|
||||
};
|
||||
|
||||
struct btrfs_list_filter_set *btrfs_list_alloc_filter_set(void)
|
||||
|
|
|
@ -71,6 +71,7 @@ enum btrfs_list_filter_enum {
|
|||
BTRFS_LIST_FILTER_CGEN_LESS,
|
||||
BTRFS_LIST_FILTER_CGEN_MORE,
|
||||
BTRFS_LIST_FILTER_TOPID_EQUAL,
|
||||
BTRFS_LIST_FILTER_FULL_PATH,
|
||||
BTRFS_LIST_FILTER_MAX,
|
||||
};
|
||||
|
||||
|
|
|
@ -278,7 +278,9 @@ static const char * const cmd_subvol_list_usage[] = {
|
|||
"List subvolumes (and snapshots)",
|
||||
"",
|
||||
"-p print parent ID",
|
||||
"-a print all the subvolumes in the filesystem.",
|
||||
"-a print all the subvolumes in the filesystem and",
|
||||
" distinguish absolute and relative path with respect",
|
||||
" to the given <path>",
|
||||
"-u print the uuid of subvolumes (and snapshots)",
|
||||
"-t print the result as a table",
|
||||
"-s list snapshots only in the filesystem",
|
||||
|
@ -401,7 +403,12 @@ static int cmd_subvol_list(int argc, char **argv)
|
|||
}
|
||||
|
||||
top_id = btrfs_list_get_path_rootid(fd);
|
||||
if (!is_list_all)
|
||||
|
||||
if (is_list_all)
|
||||
btrfs_list_setup_filter(&filter_set,
|
||||
BTRFS_LIST_FILTER_FULL_PATH,
|
||||
top_id);
|
||||
else
|
||||
btrfs_list_setup_filter(&filter_set,
|
||||
BTRFS_LIST_FILTER_TOPID_EQUAL,
|
||||
top_id);
|
||||
|
|
|
@ -130,7 +130,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-a\fP print all the subvolumes in the filesystem.
|
||||
\fB-a\fP print all the subvolumes in the filesystem and distinguish between
|
||||
absolute and relative path with respect to the given <path>.
|
||||
|
||||
\fB-r\fP only readonly subvolumes in the filesystem wille be listed.
|
||||
|
||||
|
|
Loading…
Reference in New Issue