On 03/15/2018 09:15 AM, Misono, Tomohiro wrote:
> Allow normal user to call "subvolume list/show" by using 3 new
> unprivileged ioctls (BTRFS_IOC_GET_SUBVOL_INFO,
> BTRFS_IOC_GET_SUBVOL_ROOTREF and BTRFS_IOC_INO_LOOKUP_USER).
> 
> Note that for root, "subvolume list" returns all the subvolume in the
> filesystem by default, but for normal user, it returns subvolumes
> which exist under the specified path (including the path itself).

I found the original "btrfs sub list" behavior quite confusing. I think that 
the problem is that the output is too technical. And the '-a' switch increase 
this confusion. May be that I am no smart enough :(

The "normal user behavior" seems to me more coherent. However I am not sure 
that this differences should be acceptable. In any case it should be tracked in 
the man page.

Time to add another command (something like "btrfs sub ls") with a more "human 
friendly" output ?

> The specified path itself is not needed to be a subvolume.
> If the subvolume cannot be opened but the parent directory can be,
> the information other than name or id would be zeroed out.
> 
> Also, for normal user, snapshot filed of "subvolume show" just lists
> the snapshots under the specified subvolume.
> 
> Signed-off-by: Tomohiro Misono <misono.tomoh...@jp.fujitsu.com>
> ---
>  btrfs-list.c     | 326 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  cmds-subvolume.c |  13 +++
>  2 files changed, 332 insertions(+), 7 deletions(-)
> 

[....]

>  static void print_subvolume_column(struct root_info *subv,
>                                  enum btrfs_list_column_enum column)
>  {
> @@ -1527,17 +1826,28 @@ static int btrfs_list_subvols(int fd, struct 
> root_lookup *root_lookup,
>  {
>       int ret;
>  
> -     ret = list_subvol_search(fd, root_lookup);
> -     if (ret) {
> -             error("can't perform the search: %m");
> -             return ret;
> +     ret = check_perm_for_tree_search(fd);
> +     if (ret < 0) {
> +             error("can't check the permission for tree search: %s",
> +                             strerror(-ret));
> +             return -1;
>       }
>  
>       /*
>        * 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) {
> +             ret = list_subvol_search(fd, root_lookup);
> +             if (ret) {
> +                     error("can't perform the search: %s", strerror(-ret));
> +                     return ret;
> +             }
> +             ret = list_subvol_fill_paths(fd, root_lookup);
> +     } else {
> +             ret = list_subvol_user(fd, root_lookup, path);
> +     }
> +
>       return ret;

I think that the check above should be refined: if I run "btrfs sub list" 
patched in a kernel without patch I don't get any error and/or warning:

ghigo@venice:~/btrfs/btrfs-progs$ # kernel w/o patch; btrfs-progs w/patch
ghigo@venice:~/btrfs/btrfs-progs$ ./btrfs sub list /
ghigo@venice:~/btrfs/btrfs-progs$ # kernel w/o patch; btrfs-progs w/o patch
ghigo@venice:~/btrfs/btrfs-progs$ btrfs sub list /
ERROR: can't perform the search: Operation not permitted

I think that in both case an error should be raised


>  }
>  
> @@ -1631,12 +1941,14 @@ int btrfs_get_subvol(int fd, struct root_info 
> *the_ri, const char *path)
>               return ret;
>       }
>  
> +     ret = -ENOENT;
>       rbn = rb_first(&rl.root);
>       while(rbn) {
>               ri = rb_entry(rbn, struct root_info, rb_node);
>               rr = resolve_root(&rl, ri, root_id);
> -             if (rr == -ENOENT) {
> -                     ret = -ENOENT;
> +             if (rr == -ENOENT ||
> +                 ri->root_id == BTRFS_FS_TREE_OBJECTID ||
> +                 uuid_is_null(ri->uuid)) {
>                       rbn = rb_next(rbn);
>                       continue;
>               }
> diff --git a/cmds-subvolume.c b/cmds-subvolume.c
> index faa10c5a..7a7c6f3b 100644
> --- a/cmds-subvolume.c
> +++ b/cmds-subvolume.c
> @@ -596,6 +596,19 @@ static int cmd_subvol_list(int argc, char **argv)
>               goto out;
>       }
>  
> +     ret = check_perm_for_tree_search(fd);
> +     if (ret < 0) {
> +             ret = -1;
> +             error("can't check the permission for tree search: %s",
> +                             strerror(-ret));
> +             goto out;
> +     }
> +     if (!ret && is_list_all) {
> +             ret = -1;
> +             error("only root can use -a option");
> +             goto out;
> +     }
> +
>       if (flags)
>               btrfs_list_setup_filter(&filter_set, BTRFS_LIST_FILTER_FLAGS,
>                                       flags);
> 


-- 
gpg @keyserver.linux.it: Goffredo Baroncelli <kreijackATinwind.it>
Key fingerprint BBF5 1610 0B64 DAC6 5F7D  17B2 0EDA 9B37 8B82 E0B5

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to