libbtrfsutil: factor out btrfs_util_subvolume_info_fd
Factor out main logic of btrfs_util_subvolume_info_fd(). This is a preparation work to relax the root privilege of this function. No functional changes. Signed-off-by: Misono Tomohiro <misono.tomohiro@jp.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
001e1b2178
commit
3e1d9cf022
|
@ -295,8 +295,8 @@ PUBLIC enum btrfs_util_error btrfs_util_subvolume_info(const char *path,
|
|||
return err;
|
||||
}
|
||||
|
||||
PUBLIC enum btrfs_util_error btrfs_util_subvolume_info_fd(int fd, uint64_t id,
|
||||
struct btrfs_util_subvolume_info *subvol)
|
||||
static enum btrfs_util_error get_subvolume_info_root(int fd, uint64_t id,
|
||||
struct btrfs_util_subvolume_info *subvol)
|
||||
{
|
||||
struct btrfs_ioctl_search_args search = {
|
||||
.key = {
|
||||
|
@ -310,27 +310,10 @@ PUBLIC enum btrfs_util_error btrfs_util_subvolume_info_fd(int fd, uint64_t id,
|
|||
.nr_items = 0,
|
||||
},
|
||||
};
|
||||
enum btrfs_util_error err;
|
||||
size_t items_pos = 0, buf_off = 0;
|
||||
bool need_root_item = true, need_root_backref = true;
|
||||
int ret;
|
||||
|
||||
if (id == 0) {
|
||||
err = btrfs_util_is_subvolume_fd(fd);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = btrfs_util_subvolume_id_fd(fd, &id);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if ((id < BTRFS_FIRST_FREE_OBJECTID && id != BTRFS_FS_TREE_OBJECTID) ||
|
||||
id > BTRFS_LAST_FREE_OBJECTID) {
|
||||
errno = ENOENT;
|
||||
return BTRFS_UTIL_ERROR_SUBVOLUME_NOT_FOUND;
|
||||
}
|
||||
|
||||
search.key.min_objectid = search.key.max_objectid = id;
|
||||
|
||||
if (subvol) {
|
||||
|
@ -400,6 +383,30 @@ PUBLIC enum btrfs_util_error btrfs_util_subvolume_info_fd(int fd, uint64_t id,
|
|||
return BTRFS_UTIL_OK;
|
||||
}
|
||||
|
||||
PUBLIC enum btrfs_util_error btrfs_util_subvolume_info_fd(int fd, uint64_t id,
|
||||
struct btrfs_util_subvolume_info *subvol)
|
||||
{
|
||||
enum btrfs_util_error err;
|
||||
|
||||
if (id == 0) {
|
||||
err = btrfs_util_is_subvolume_fd(fd);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = btrfs_util_subvolume_id_fd(fd, &id);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if ((id < BTRFS_FIRST_FREE_OBJECTID && id != BTRFS_FS_TREE_OBJECTID) ||
|
||||
id > BTRFS_LAST_FREE_OBJECTID) {
|
||||
errno = ENOENT;
|
||||
return BTRFS_UTIL_ERROR_SUBVOLUME_NOT_FOUND;
|
||||
}
|
||||
|
||||
return get_subvolume_info_root(fd, id, subvol);
|
||||
}
|
||||
|
||||
PUBLIC enum btrfs_util_error btrfs_util_get_subvolume_read_only_fd(int fd,
|
||||
bool *read_only_ret)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue