diff --git a/src/shared/discover-image.c b/src/shared/discover-image.c index 53e9821412..e2f05dca93 100644 --- a/src/shared/discover-image.c +++ b/src/shared/discover-image.c @@ -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; diff --git a/src/shared/discover-image.h b/src/shared/discover-image.h index c1fdf15d15..c64d0baefb 100644 --- a/src/shared/discover-image.h +++ b/src/shared/discover-image.h @@ -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);