mirror of
https://github.com/kdave/btrfs-progs
synced 2025-04-16 20:15:20 +00:00
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,7 +295,7 @@ PUBLIC enum btrfs_util_error btrfs_util_subvolume_info(const char *path,
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUBLIC enum btrfs_util_error btrfs_util_subvolume_info_fd(int fd, uint64_t id,
|
static enum btrfs_util_error get_subvolume_info_root(int fd, uint64_t id,
|
||||||
struct btrfs_util_subvolume_info *subvol)
|
struct btrfs_util_subvolume_info *subvol)
|
||||||
{
|
{
|
||||||
struct btrfs_ioctl_search_args search = {
|
struct btrfs_ioctl_search_args search = {
|
||||||
@ -310,27 +310,10 @@ PUBLIC enum btrfs_util_error btrfs_util_subvolume_info_fd(int fd, uint64_t id,
|
|||||||
.nr_items = 0,
|
.nr_items = 0,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
enum btrfs_util_error err;
|
|
||||||
size_t items_pos = 0, buf_off = 0;
|
size_t items_pos = 0, buf_off = 0;
|
||||||
bool need_root_item = true, need_root_backref = true;
|
bool need_root_item = true, need_root_backref = true;
|
||||||
int ret;
|
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;
|
search.key.min_objectid = search.key.max_objectid = id;
|
||||||
|
|
||||||
if (subvol) {
|
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;
|
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,
|
PUBLIC enum btrfs_util_error btrfs_util_get_subvolume_read_only_fd(int fd,
|
||||||
bool *read_only_ret)
|
bool *read_only_ret)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user