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:
Lukas Czerner 2012-12-11 15:24:58 +01:00 committed by David Sterba
parent efbb344a59
commit e599d6c5da
4 changed files with 36 additions and 13 deletions

View file

@ -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)

View file

@ -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,
};

View file

@ -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);

View file

@ -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.