@@ -958,6 +958,36 @@ out:
return 0;
}
+/*
+ * Check the permission for tree search ioctl by searching a key
+ * which alwasys exists
+ */
+int check_perm_for_tree_search(int fd)
+{
+ struct btrfs_ioctl_search_args args;
+ struct btrfs_ioctl_search_key *sk = &args.key;
+ int ret;
+
+ memset(&args, 0, sizeof(args));
+ sk->tree_id = BTRFS_ROOT_TREE_OBJECTID;
+ sk->min_objectid = BTRFS_EXTENT_TREE_OBJECTID;
+ sk->max_objectid = BTRFS_EXTENT_TREE_OBJECTID;
+ sk->min_type = BTRFS_ROOT_ITEM_KEY;
+ sk->max_type = BTRFS_ROOT_ITEM_KEY;
+ sk->min_offset = 0;
+ sk->max_offset = (u64)-1;
+ sk->min_transid = 0;
+ sk->max_transid = (u64)-1;
+ sk->nr_items = 1;
+ ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &args);
+
+ if (ret == -EPERM)
+ return 0;
+ if (ret)
+ return ret;
+ return 1;
+}
+
static int list_subvol_search(int fd, struct root_lookup *root_lookup)
{
int ret;
@@ -176,5 +176,6 @@ char *btrfs_list_path_for_root(int fd, u64 root);
int btrfs_list_get_path_rootid(int fd, u64 *treeid);
int btrfs_get_subvol(int fd, struct root_info *the_ri);
int btrfs_get_toplevel_subvol(int fd, struct root_info *the_ri);
+int check_perm_for_tree_search(int fd);
#endif
This is a preparetion work to allow normal user to call "subvolume list". Signed-off-by: Tomohiro Misono <misono.tomohiro@jp.fujitsu.com> --- btrfs-list.c | 30 ++++++++++++++++++++++++++++++ btrfs-list.h | 1 + 2 files changed, 31 insertions(+)