diff options
author | Misono Tomohiro <misono.tomohiro@jp.fujitsu.com> | 2018-06-18 17:40:51 +0900 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2018-10-31 18:24:14 +0100 |
commit | 3e1d9cf02267b100e654f9f2756ca0ab7527d63b (patch) | |
tree | d94cde20078b61a18c1628b7b055433296ac8f13 | |
parent | 001e1b2178957e2ea1930674f12ef9c85f792fc2 (diff) |
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>
-rw-r--r-- | libbtrfsutil/subvolume.c | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/libbtrfsutil/subvolume.c b/libbtrfsutil/subvolume.c index 867b3e10..0d7ef5bf 100644 --- a/libbtrfsutil/subvolume.c +++ b/libbtrfsutil/subvolume.c @@ -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) { |