machined,machinectl: add calls for changing container/VM quotas
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user