#include "import-common.h"
#include "import-util.h"
#include "json-util.h"
-#include "machine-pool.h"
#include "main-func.h"
#include "notify-recv.h"
#include "os-util.h"
"Local image name %s is invalid", local);
if (class == IMAGE_MACHINE) {
- r = setup_machine_directory(error, m->use_btrfs_subvol, m->use_btrfs_quota);
+ r = image_setup_pool(m->runtime_scope, class, m->use_btrfs_subvol, m->use_btrfs_quota);
if (r < 0)
- return r;
+ return sd_bus_error_set_errnof(error, r, "Failed to set up machine pool: %m");
}
type = startswith(sd_bus_message_get_member(msg), "ImportTar") ?
"Local image name %s is invalid", local);
if (class == IMAGE_MACHINE) {
- r = setup_machine_directory(error, m->use_btrfs_subvol, m->use_btrfs_quota);
+ r = image_setup_pool(m->runtime_scope, class, m->use_btrfs_subvol, m->use_btrfs_quota);
if (r < 0)
- return r;
+ return sd_bus_error_set_errnof(error, r, "Failed to set up machine pool: %m");
}
r = transfer_new(m, &t);
"Unknown verification mode %s", verify);
if (class == IMAGE_MACHINE) {
- r = setup_machine_directory(error, m->use_btrfs_subvol, m->use_btrfs_quota);
+ r = image_setup_pool(m->runtime_scope, class, m->use_btrfs_subvol, m->use_btrfs_quota);
if (r < 0)
- return r;
+ return sd_bus_error_set_errnof(error, r, "Failed to set up machine pool: %m");
}
type = startswith(sd_bus_message_get_member(msg), "PullTar") ?
#include "image-varlink.h"
#include "io-util.h"
#include "json-util.h"
-#include "machine-pool.h"
#include "machined.h"
#include "operation.h"
#include "process-util.h"
}
/* Set up the machine directory if necessary */
- r = setup_machine_directory(/* error = */ NULL, /* use_btrfs_subvol= */ true, /* use_btrfs_quota= */ true);
+ r = image_setup_pool(
+ manager->runtime_scope,
+ IMAGE_MACHINE,
+ /* use_btrfs_subvol= */ true,
+ /* use_btrfs_quota= */ true);
if (r < 0)
return r;
#include "sd-id128.h"
#include "alloc-util.h"
-#include "btrfs-util.h"
#include "bus-common-errors.h"
-#include "bus-get-properties.h"
#include "bus-locator.h"
#include "bus-message-util.h"
#include "bus-object.h"
#include "io-util.h"
#include "machine.h"
#include "machine-dbus.h"
-#include "machine-pool.h"
#include "machined.h"
#include "namespace-util.h"
#include "operation.h"
#include "unit-def.h"
#include "user-util.h"
-static BUS_DEFINE_PROPERTY_GET_GLOBAL(property_get_pool_path, "s", "/var/lib/machines");
+static int property_get_pool_path(
+ sd_bus *bus,
+ const char *path,
+ const char *interface,
+ const char *property,
+ sd_bus_message *reply,
+ void *userdata,
+ sd_bus_error *error) {
+
+ _cleanup_free_ char *poolpath = NULL;
+ Manager *m = ASSERT_PTR(userdata);
+
+ assert(bus);
+ assert(reply);
+
+ (void) image_get_pool_path(m->runtime_scope, IMAGE_MACHINE, &poolpath);
+
+ return sd_bus_message_append(reply, "s", strempty(poolpath));
+}
static int property_get_pool_usage(
sd_bus *bus,
void *userdata,
sd_bus_error *error) {
- _cleanup_close_ int fd = -EBADF;
+ Manager *m = ASSERT_PTR(userdata);
uint64_t usage = UINT64_MAX;
assert(bus);
assert(reply);
- fd = open("/var/lib/machines", O_RDONLY|O_CLOEXEC|O_DIRECTORY);
- if (fd >= 0) {
- BtrfsQuotaInfo q;
-
- if (btrfs_subvol_get_subtree_quota_fd(fd, 0, &q) >= 0)
- usage = q.referenced;
- }
+ (void) image_get_pool_usage(m->runtime_scope, IMAGE_MACHINE, &usage);
return sd_bus_message_append(reply, "t", usage);
}
void *userdata,
sd_bus_error *error) {
- _cleanup_close_ int fd = -EBADF;
+ Manager *m = ASSERT_PTR(userdata);
uint64_t size = UINT64_MAX;
assert(bus);
assert(reply);
- fd = open("/var/lib/machines", O_RDONLY|O_CLOEXEC|O_DIRECTORY);
- if (fd >= 0) {
- BtrfsQuotaInfo q;
-
- if (btrfs_subvol_get_subtree_quota_fd(fd, 0, &q) >= 0)
- size = q.referenced_max;
- }
+ (void) image_get_pool_limit(m->runtime_scope, IMAGE_MACHINE, &size);
return sd_bus_message_append(reply, "t", size);
}
}
/* Set up the machine directory if necessary */
- r = setup_machine_directory(error, /* use_btrfs_subvol= */ true, /* use_btrfs_quota= */ true);
+ r = image_setup_pool(
+ m->runtime_scope,
+ IMAGE_MACHINE,
+ /* use_btrfs_subvol= */ true,
+ /* use_btrfs_quota= */ true);
if (r < 0)
- return r;
+ return sd_bus_error_set_errnof(error, r, "Failed to set up machine pool: %m");
r = image_set_pool_limit(m->runtime_scope, IMAGE_MACHINE, limit);
if (ERRNO_IS_NEG_NOT_SUPPORTED(r))
#include "hashmap.h"
#include "hostname-setup.h"
#include "id128-util.h"
+#include "label-util.h"
#include "lock-util.h"
#include "log.h"
#include "loop-util.h"
return 0;
}
+int image_get_pool_path(RuntimeScope scope, ImageClass class, char **ret) {
+ assert(scope >= 0 && scope < _RUNTIME_SCOPE_MAX);
+ assert(class >= 0 && class < _IMAGE_CLASS_MAX);
+ assert(ret);
+
+ return get_pool_directory(scope, class, /* fname= */ NULL, /* suffix= */ NULL, ret);
+}
+
+int image_get_pool_usage(RuntimeScope scope, ImageClass class, uint64_t *ret) {
+ int r;
+
+ assert(scope >= 0 && scope < _RUNTIME_SCOPE_MAX);
+ assert(class >= 0 && class < _IMAGE_CLASS_MAX);
+ assert(ret);
+
+ _cleanup_free_ char *pool = NULL;
+ r = get_pool_directory(scope, class, /* fname= */ NULL, /* suffix= */ NULL, &pool);
+ if (r < 0)
+ return r;
+
+ _cleanup_close_ int fd = open(pool, O_RDONLY|O_CLOEXEC|O_DIRECTORY);
+ if (fd < 0)
+ return -errno;
+
+ BtrfsQuotaInfo q;
+ r = btrfs_subvol_get_subtree_quota_fd(fd, /* subvol_id= */ 0, &q);
+ if (r < 0)
+ return r;
+
+ *ret = q.referenced;
+ return 0;
+}
+
+int image_get_pool_limit(RuntimeScope scope, ImageClass class, uint64_t *ret) {
+ int r;
+
+ assert(scope >= 0 && scope < _RUNTIME_SCOPE_MAX);
+ assert(class >= 0 && class < _IMAGE_CLASS_MAX);
+ assert(ret);
+
+ _cleanup_free_ char *pool = NULL;
+ r = get_pool_directory(scope, class, /* fname= */ NULL, /* suffix= */ NULL, &pool);
+ if (r < 0)
+ return r;
+
+ _cleanup_close_ int fd = open(pool, O_RDONLY|O_CLOEXEC|O_DIRECTORY);
+ if (fd < 0)
+ return -errno;
+
+ BtrfsQuotaInfo q;
+ r = btrfs_subvol_get_subtree_quota_fd(fd, /* subvol_id= */ 0, &q);
+ if (r < 0)
+ return r;
+
+ *ret = q.referenced_max;
+ return 0;
+}
+
+static int check_btrfs(const char *path) {
+ struct statfs sfs;
+ int r;
+
+ if (statfs(path, &sfs) < 0) {
+ if (errno != ENOENT)
+ return -errno;
+
+ _cleanup_free_ char *parent = NULL;
+ r = path_extract_directory(path, &parent);
+ if (r < 0)
+ return r;
+
+ if (statfs(parent, &sfs) < 0)
+ return -errno;
+ }
+
+ return F_TYPE_EQUAL(sfs.f_type, BTRFS_SUPER_MAGIC);
+}
+
+int image_setup_pool(RuntimeScope scope, ImageClass class, bool use_btrfs_subvol, bool use_btrfs_quota) {
+ int r;
+
+ assert(class >= 0 && class < _IMAGE_CLASS_MAX);
+
+ _cleanup_free_ char *pool = NULL;
+ r = image_get_pool_path(scope, class, &pool);
+ if (r < 0)
+ return r;
+
+ r = check_btrfs(pool);
+ if (r < 0)
+ return r;
+ if (r == 0)
+ return 0;
+
+ if (!use_btrfs_subvol)
+ return 0;
+
+ (void) btrfs_subvol_make_label(pool);
+
+ if (!use_btrfs_quota)
+ return 0;
+
+ r = btrfs_quota_enable(pool, /* b= */ true);
+ if (r < 0)
+ log_warning_errno(r, "Failed to enable quota for %s, ignoring: %m", pool);
+
+ r = btrfs_subvol_auto_qgroup(pool, /* subvol_id= */ 0, /* create_intermediary_qgroup= */ true);
+ if (r < 0)
+ log_warning_errno(r, "Failed to set up default quota hierarchy for %s, ignoring: %m", pool);
+
+ return 0;
+}
+
int image_read_metadata(Image *i, const ImagePolicy *image_policy, RuntimeScope scope) {
_cleanup_(release_lock_file) LockFile global_lock = LOCK_FILE_INIT, local_lock = LOCK_FILE_INIT;
int r;
int image_set_limit(Image *i, uint64_t referenced_max);
int image_set_pool_limit(RuntimeScope scope, ImageClass class, uint64_t referenced_max);
+int image_get_pool_path(RuntimeScope scope, ImageClass class, char **ret);
+int image_get_pool_usage(RuntimeScope scope, ImageClass class, uint64_t *ret);
+int image_get_pool_limit(RuntimeScope scope, ImageClass class, uint64_t *ret);
+int image_setup_pool(RuntimeScope scope, ImageClass class, bool use_btrfs_subvol, bool use_btrfs_quota);
int image_read_metadata(Image *i, const ImagePolicy *image_policy, RuntimeScope scope);
+++ /dev/null
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-
-#include <linux/magic.h>
-
-#include "sd-bus.h"
-
-#include "btrfs-util.h"
-#include "label-util.h"
-#include "log.h"
-#include "machine-pool.h"
-#include "stat-util.h"
-
-static int check_btrfs(void) {
- struct statfs sfs;
-
- if (statfs("/var/lib/machines", &sfs) < 0) {
- if (errno != ENOENT)
- return -errno;
-
- if (statfs("/var/lib", &sfs) < 0)
- return -errno;
- }
-
- return F_TYPE_EQUAL(sfs.f_type, BTRFS_SUPER_MAGIC);
-}
-
-int setup_machine_directory(sd_bus_error *error, bool use_btrfs_subvol, bool use_btrfs_quota) {
- int r;
-
- r = check_btrfs();
- if (r < 0)
- return sd_bus_error_set_errnof(error, r, "Failed to determine whether /var/lib/machines is located on btrfs: %m");
- if (r == 0)
- return 0;
-
- if (!use_btrfs_subvol)
- return 0;
-
- (void) btrfs_subvol_make_label("/var/lib/machines");
-
- if (!use_btrfs_quota)
- return 0;
-
- r = btrfs_quota_enable("/var/lib/machines", true);
- if (r < 0)
- log_warning_errno(r, "Failed to enable quota for /var/lib/machines, ignoring: %m");
-
- r = btrfs_subvol_auto_qgroup("/var/lib/machines", 0, true);
- if (r < 0)
- log_warning_errno(r, "Failed to set up default quota hierarchy for /var/lib/machines, ignoring: %m");
-
- return 0;
-}
+++ /dev/null
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-#pragma once
-
-#include "shared-forward.h"
-
-int setup_machine_directory(sd_bus_error *error, bool use_btrfs_subvol, bool use_btrfs_quota);
'machine-bind-user.c',
'machine-credential.c',
'machine-id-setup.c',
- 'machine-pool.c',
'macvlan-util.c',
'main-func.c',
'mkdir-label.c',