From: Arvin Schnell Date: Tue, 29 Mar 2016 13:58:51 +0000 (+0200) Subject: - added some btrfs qgroup functions X-Git-Tag: v0.3.3~17^2~2 X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=25efdedff0ea6ce987a9e0afbf27deacf8d11a13;p=thirdparty%2Fsnapper.git - added some btrfs qgroup functions --- diff --git a/snapper/BtrfsUtils.cc b/snapper/BtrfsUtils.cc index 22bc4110..121b72ae 100644 --- a/snapper/BtrfsUtils.cc +++ b/snapper/BtrfsUtils.cc @@ -422,6 +422,66 @@ namespace snapper } + vector + qgroup_query_children(int fd, qgroup_t qgroup) + { + struct btrfs_ioctl_search_args args; + memset(&args, 0, sizeof(args)); + + struct btrfs_ioctl_search_key* sk = &args.key; + sk->tree_id = BTRFS_QUOTA_TREE_OBJECTID; + + sk->min_type = BTRFS_QGROUP_RELATION_KEY; + sk->max_type = BTRFS_QGROUP_RELATION_KEY; + sk->min_objectid = 0; + sk->max_objectid = BTRFS_LAST_FREE_OBJECTID; + sk->min_offset = 0; + sk->max_offset = (u64)(-1); + sk->min_transid = 0; + sk->max_transid = (u64)(-1); + sk->nr_items = 4096; + + vector ret; + + while (true) + { + if (ioctl(fd, BTRFS_IOC_TREE_SEARCH, &args) < 0) + throw runtime_error_with_errno("ioctl(BTRFS_IOC_TREE_SEARCH) failed", errno); + + if (sk->nr_items == 0) + break; + + u64 off = 0; + + for (unsigned int i = 0; i < sk->nr_items; ++i) + { + struct btrfs_ioctl_search_header* sh = (struct btrfs_ioctl_search_header*)(args.buf + off); + off += sizeof(*sh); + + if (sh->type != BTRFS_QGROUP_RELATION_KEY) + throw std::runtime_error("sh->type != BTRFS_QGROUP_RELATION_KEY"); + + if (sh->offset == qgroup) + ret.push_back(sh->objectid); + + off += sh->len; + + sk->min_objectid = sh->objectid; + sk->min_offset = sh->offset; + } + + sk->nr_items = 4096; + + if (sk->min_offset < (u64)(-1)) + sk->min_offset++; + else + break; + } + + return ret; + } + + QGroupUsage qgroup_query_usage(int fd, qgroup_t qgroup) { diff --git a/snapper/BtrfsUtils.h b/snapper/BtrfsUtils.h index 1e4421b5..179577e0 100644 --- a/snapper/BtrfsUtils.h +++ b/snapper/BtrfsUtils.h @@ -26,11 +26,13 @@ #include #include +#include namespace snapper { using std::string; + using std::vector; namespace BtrfsUtils @@ -73,6 +75,8 @@ namespace snapper void qgroup_assign(int fd, qgroup_t src, qgroup_t dst); void qgroup_remove(int fd, qgroup_t src, qgroup_t dst); + vector qgroup_query_children(int fd, qgroup_t qgroup); + struct QGroupUsage { QGroupUsage() : referenced(0), referenced_compressed(0), exclusive(0),