diff options
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/btrfs-util.c | 26 | ||||
-rw-r--r-- | src/shared/btrfs-util.h | 3 | ||||
-rw-r--r-- | src/shared/machine-image.c | 13 | ||||
-rw-r--r-- | src/shared/machine-image.h | 2 |
4 files changed, 44 insertions, 0 deletions
diff --git a/src/shared/btrfs-util.c b/src/shared/btrfs-util.c index 980963b748..6761501da2 100644 --- a/src/shared/btrfs-util.c +++ b/src/shared/btrfs-util.c @@ -669,3 +669,29 @@ int btrfs_quota_enable(const char *path, bool b) { return btrfs_quota_enable_fd(fd, b); } + +int btrfs_quota_limit_fd(int fd, uint64_t referred_max) { + struct btrfs_ioctl_qgroup_limit_args args = { + .lim.max_rfer = + referred_max == (uint64_t) -1 ? 0 : + referred_max == 0 ? 1 : referred_max, + .lim.flags = BTRFS_QGROUP_LIMIT_MAX_RFER, + }; + + assert(fd >= 0); + + if (ioctl(fd, BTRFS_IOC_QGROUP_LIMIT, &args) < 0) + return -errno; + + return 0; +} + +int btrfs_quota_limit(const char *path, uint64_t referred_max) { + _cleanup_close_ int fd = -1; + + fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW); + if (fd < 0) + return -errno; + + return btrfs_quota_limit_fd(fd, referred_max); +} diff --git a/src/shared/btrfs-util.h b/src/shared/btrfs-util.h index 93c3f13ed5..9a1eb3f383 100644 --- a/src/shared/btrfs-util.h +++ b/src/shared/btrfs-util.h @@ -67,3 +67,6 @@ int btrfs_defrag(const char *p); int btrfs_quota_enable_fd(int fd, bool b); int btrfs_quota_enable(const char *path, bool b); + +int btrfs_quota_limit_fd(int fd, uint64_t referred_max); +int btrfs_quota_limit(const char *path, uint64_t referred_max); diff --git a/src/shared/machine-image.c b/src/shared/machine-image.c index c734f148ae..c6d2850ad2 100644 --- a/src/shared/machine-image.c +++ b/src/shared/machine-image.c @@ -613,6 +613,19 @@ int image_path_lock(const char *path, int operation, LockFile *global, LockFile return 0; } +int image_set_limit(Image *i, uint64_t referred_max) { + assert(i); + + if (path_equal(i->path, "/") || + path_startswith(i->path, "/usr")) + return -EROFS; + + if (i->type != IMAGE_SUBVOLUME) + return -ENOTSUP; + + return btrfs_quota_limit(i->path, referred_max); +} + int image_name_lock(const char *name, int operation, LockFile *ret) { const char *p; diff --git a/src/shared/machine-image.h b/src/shared/machine-image.h index 314fd6da58..df2394991f 100644 --- a/src/shared/machine-image.h +++ b/src/shared/machine-image.h @@ -70,3 +70,5 @@ bool image_name_is_valid(const char *s) _pure_; int image_path_lock(const char *path, int operation, LockFile *global, LockFile *local); int image_name_lock(const char *name, int operation, LockFile *ret); + +int image_set_limit(Image *i, uint64_t referred_max); |