]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
shared: image_set_pool_limit()
authorIvan Kruglov <mail@ikruglov.com>
Fri, 10 Jan 2025 11:20:50 +0000 (12:20 +0100)
committerIvan Kruglov <mail@ikruglov.com>
Wed, 15 Jan 2025 10:47:58 +0000 (02:47 -0800)
src/shared/discover-image.c
src/shared/discover-image.h

index 53e9821412865dc983ed0850603f3f166ee42e91..e2f05dca93dbc994aa8742c7a3e42b21f280ee1c 100644 (file)
@@ -1590,6 +1590,29 @@ int image_set_limit(Image *i, uint64_t referenced_max) {
         return 0;
 }
 
+int image_set_pool_limit(ImageClass class, uint64_t referenced_max) {
+        const char *dir;
+        int r;
+
+        assert(class >= 0 && class < _IMAGE_CLASS_MAX);
+
+        dir = image_root_to_string(class);
+
+        r = btrfs_qgroup_set_limit(dir, /* qgroupid = */ 0, referenced_max);
+        if (ERRNO_IS_NEG_NOT_SUPPORTED(r))
+                return r;
+        if (r < 0)
+                log_debug_errno(r, "Failed to set limit on btrfs quota group for '%s', ignoring: %m", dir);
+
+        r = btrfs_subvol_set_subtree_quota_limit(dir, /* subvol_id = */ 0, referenced_max);
+        if (ERRNO_IS_NEG_NOT_SUPPORTED(r))
+                return r;
+        if (r < 0)
+                return log_debug_errno(r, "Failed to set subtree quota limit for '%s': %m", dir);
+
+        return 0;
+}
+
 int image_read_metadata(Image *i, const ImagePolicy *image_policy) {
         _cleanup_(release_lock_file) LockFile global_lock = LOCK_FILE_INIT, local_lock = LOCK_FILE_INIT;
         int r;
index c1fdf15d155d51c36951893fb7a26da782b47188..c64d0baefb50d8a253b5a82d8ffd4ac14f3ac019 100644 (file)
@@ -78,6 +78,7 @@ int image_path_lock(const char *path, int operation, LockFile *global, LockFile
 int image_name_lock(const char *name, int operation, LockFile *ret);
 
 int image_set_limit(Image *i, uint64_t referenced_max);
+int image_set_pool_limit(ImageClass class, uint64_t referenced_max);
 
 int image_read_metadata(Image *i, const ImagePolicy *image_policy);