diff options
-rw-r--r-- | src/import/import-common.c | 4 | ||||
-rw-r--r-- | src/import/import-common.h | 7 | ||||
-rw-r--r-- | src/import/import-fs.c | 1 | ||||
-rw-r--r-- | src/import/import-raw.c | 14 | ||||
-rw-r--r-- | src/import/import-raw.h | 3 | ||||
-rw-r--r-- | src/import/import-tar.c | 18 | ||||
-rw-r--r-- | src/import/import-tar.h | 3 | ||||
-rw-r--r-- | src/import/import.c | 33 | ||||
-rw-r--r-- | src/import/pull-tar.c | 4 | ||||
-rw-r--r-- | src/shared/import-util.c | 10 |
10 files changed, 48 insertions, 49 deletions
diff --git a/src/import/import-common.c b/src/import/import-common.c index 250270511d..3872716f60 100644 --- a/src/import/import-common.c +++ b/src/import/import-common.c @@ -110,11 +110,11 @@ int import_fork_tar_x(const char *path, pid_t *ret) { } if (unshare(CLONE_NEWNET) < 0) - log_error_errno(errno, "Failed to lock tar into network namespace, ignoring: %m"); + log_warning_errno(errno, "Failed to lock tar into network namespace, ignoring: %m"); r = capability_bounding_set_drop(retain, true); if (r < 0) - log_error_errno(r, "Failed to drop capabilities, ignoring: %m"); + log_warning_errno(r, "Failed to drop capabilities, ignoring: %m"); /* Try "gtar" before "tar". We only test things upstream with GNU tar. Some distros appear to * install a different implementation as "tar" (in particular some that do not support the diff --git a/src/import/import-common.h b/src/import/import-common.h index b27a980839..d7e8fc485f 100644 --- a/src/import/import-common.h +++ b/src/import/import-common.h @@ -3,6 +3,13 @@ #include <sys/types.h> +typedef enum ImportFlags { + IMPORT_FORCE = 1 << 0, /* replace existing image */ + IMPORT_READ_ONLY = 1 << 1, /* make generated image read-only */ + + IMPORT_FLAGS_MASK = IMPORT_FORCE|IMPORT_READ_ONLY, +} ImportFlags; + int import_make_read_only_fd(int fd); int import_make_read_only(const char *path); diff --git a/src/import/import-fs.c b/src/import/import-fs.c index a36ab24fb8..1fe5a257db 100644 --- a/src/import/import-fs.c +++ b/src/import/import-fs.c @@ -196,6 +196,7 @@ static int import_fs(int argc, char *argv[], void *userdata) { if (r < 0) goto finish; + (void) import_assign_pool_quota_and_warn(arg_image_root); (void) import_assign_pool_quota_and_warn(temp_path); if (arg_read_only) { diff --git a/src/import/import-raw.c b/src/import/import-raw.c index c0869ffcf9..f6ee86d625 100644 --- a/src/import/import-raw.c +++ b/src/import/import-raw.c @@ -34,8 +34,7 @@ struct RawImport { void *userdata; char *local; - bool force_local; - bool read_only; + ImportFlags flags; char *temp_path; char *final_path; @@ -213,13 +212,13 @@ static int raw_import_finish(RawImport *i) { (void) copy_xattr(i->input_fd, i->output_fd); } - if (i->read_only) { + if (i->flags & IMPORT_READ_ONLY) { r = import_make_read_only_fd(i->output_fd); if (r < 0) return r; } - if (i->force_local) + if (i->flags & IMPORT_FORCE) (void) rm_rf(i->final_path, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_SUBVOLUME); r = rename_noreplace(AT_FDCWD, i->temp_path, AT_FDCWD, i->final_path); @@ -386,12 +385,13 @@ static int raw_import_on_defer(sd_event_source *s, void *userdata) { return raw_import_process(i); } -int raw_import_start(RawImport *i, int fd, const char *local, bool force_local, bool read_only) { +int raw_import_start(RawImport *i, int fd, const char *local, ImportFlags flags) { int r; assert(i); assert(fd >= 0); assert(local); + assert(!(flags & ~IMPORT_FLAGS_MASK)); if (!hostname_is_valid(local, 0)) return -EINVAL; @@ -406,8 +406,8 @@ int raw_import_start(RawImport *i, int fd, const char *local, bool force_local, r = free_and_strdup(&i->local, local); if (r < 0) return r; - i->force_local = force_local; - i->read_only = read_only; + + i->flags = flags; if (fstat(fd, &i->st) < 0) return -errno; diff --git a/src/import/import-raw.h b/src/import/import-raw.h index 4612a9ffef..e99703c155 100644 --- a/src/import/import-raw.h +++ b/src/import/import-raw.h @@ -3,6 +3,7 @@ #include "sd-event.h" +#include "import-common.h" #include "import-util.h" #include "macro.h" @@ -15,4 +16,4 @@ RawImport* raw_import_unref(RawImport *import); DEFINE_TRIVIAL_CLEANUP_FUNC(RawImport*, raw_import_unref); -int raw_import_start(RawImport *i, int fd, const char *local, bool force_local, bool read_only); +int raw_import_start(RawImport *i, int fd, const char *local, ImportFlags flags); diff --git a/src/import/import-tar.c b/src/import/import-tar.c index d68ce91613..6baa2f43ab 100644 --- a/src/import/import-tar.c +++ b/src/import/import-tar.c @@ -36,8 +36,7 @@ struct TarImport { void *userdata; char *local; - bool force_local; - bool read_only; + ImportFlags flags; char *temp_path; char *final_path; @@ -183,13 +182,13 @@ static int tar_import_finish(TarImport *i) { if (r < 0) return r; - if (i->read_only) { + if (i->flags & IMPORT_READ_ONLY) { r = import_make_read_only(i->temp_path); if (r < 0) return r; } - if (i->force_local) + if (i->flags & IMPORT_FORCE) (void) rm_rf(i->final_path, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_SUBVOLUME); r = rename_noreplace(AT_FDCWD, i->temp_path, AT_FDCWD, i->final_path); @@ -223,8 +222,10 @@ static int tar_import_fork_tar(TarImport *i) { r = btrfs_subvol_make_fallback(i->temp_path, 0755); if (r < 0) return log_error_errno(r, "Failed to create directory/subvolume %s: %m", i->temp_path); - if (r > 0) /* actually btrfs subvol */ + if (r > 0) { /* actually btrfs subvol */ + (void) import_assign_pool_quota_and_warn(i->image_root); (void) import_assign_pool_quota_and_warn(i->temp_path); + } i->tar_fd = import_fork_tar_x(i->temp_path, &i->tar_pid); if (i->tar_fd < 0) @@ -322,12 +323,13 @@ static int tar_import_on_defer(sd_event_source *s, void *userdata) { return tar_import_process(i); } -int tar_import_start(TarImport *i, int fd, const char *local, bool force_local, bool read_only) { +int tar_import_start(TarImport *i, int fd, const char *local, ImportFlags flags) { int r; assert(i); assert(fd >= 0); assert(local); + assert(!(flags & ~IMPORT_FLAGS_MASK)); if (!hostname_is_valid(local, 0)) return -EINVAL; @@ -342,8 +344,8 @@ int tar_import_start(TarImport *i, int fd, const char *local, bool force_local, r = free_and_strdup(&i->local, local); if (r < 0) return r; - i->force_local = force_local; - i->read_only = read_only; + + i->flags = flags; if (fstat(fd, &i->st) < 0) return -errno; diff --git a/src/import/import-tar.h b/src/import/import-tar.h index afbe98ad05..63b0bd4da6 100644 --- a/src/import/import-tar.h +++ b/src/import/import-tar.h @@ -3,6 +3,7 @@ #include "sd-event.h" +#include "import-common.h" #include "import-util.h" #include "macro.h" @@ -15,4 +16,4 @@ TarImport* tar_import_unref(TarImport *import); DEFINE_TRIVIAL_CLEANUP_FUNC(TarImport*, tar_import_unref); -int tar_import_start(TarImport *import, int fd, const char *local, bool force_local, bool read_only); +int tar_import_start(TarImport *import, int fd, const char *local, ImportFlags flags); diff --git a/src/import/import.c b/src/import/import.c index 3fd99d1160..934074a7b0 100644 --- a/src/import/import.c +++ b/src/import/import.c @@ -19,9 +19,8 @@ #include "string-util.h" #include "verbs.h" -static bool arg_force = false; -static bool arg_read_only = false; static const char *arg_image_root = "/var/lib/machines"; +static ImportFlags arg_import_flags = 0; static int interrupt_signal_handler(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) { log_notice("Transfer aborted."); @@ -48,14 +47,12 @@ static int import_tar(int argc, char *argv[], void *userdata) { int r, fd; if (argc >= 2) - path = argv[1]; - path = empty_or_dash_to_null(path); + path = empty_or_dash_to_null(argv[1]); if (argc >= 3) - local = argv[2]; + local = empty_or_dash_to_null(argv[2]); else if (path) local = basename(path); - local = empty_or_dash_to_null(local); if (local) { r = tar_strip_suffixes(local, &ll); @@ -69,16 +66,15 @@ static int import_tar(int argc, char *argv[], void *userdata) { "Local image name '%s' is not valid.", local); - if (!arg_force) { + if (!FLAGS_SET(arg_import_flags, IMPORT_FORCE)) { r = image_find(IMAGE_MACHINE, local, NULL, NULL); if (r < 0) { if (r != -ENOENT) return log_error_errno(r, "Failed to check whether image '%s' exists: %m", local); - } else { + } else return log_error_errno(SYNTHETIC_ERRNO(EEXIST), "Image '%s' already exists.", local); - } } } else local = "imported"; @@ -112,7 +108,7 @@ static int import_tar(int argc, char *argv[], void *userdata) { if (r < 0) return log_error_errno(r, "Failed to allocate importer: %m"); - r = tar_import_start(import, fd, local, arg_force, arg_read_only); + r = tar_import_start(import, fd, local, arg_import_flags); if (r < 0) return log_error_errno(r, "Failed to import image: %m"); @@ -143,14 +139,12 @@ static int import_raw(int argc, char *argv[], void *userdata) { int r, fd; if (argc >= 2) - path = argv[1]; - path = empty_or_dash_to_null(path); + path = empty_or_dash_to_null(argv[1]); if (argc >= 3) - local = argv[2]; + local = empty_or_dash_to_null(argv[2]); else if (path) local = basename(path); - local = empty_or_dash_to_null(local); if (local) { r = raw_strip_suffixes(local, &ll); @@ -164,16 +158,15 @@ static int import_raw(int argc, char *argv[], void *userdata) { "Local image name '%s' is not valid.", local); - if (!arg_force) { + if (!FLAGS_SET(arg_import_flags, IMPORT_FORCE)) { r = image_find(IMAGE_MACHINE, local, NULL, NULL); if (r < 0) { if (r != -ENOENT) return log_error_errno(r, "Failed to check whether image '%s' exists: %m", local); - } else { + } else return log_error_errno(SYNTHETIC_ERRNO(EEXIST), "Image '%s' already exists.", local); - } } } else local = "imported"; @@ -207,7 +200,7 @@ static int import_raw(int argc, char *argv[], void *userdata) { if (r < 0) return log_error_errno(r, "Failed to allocate importer: %m"); - r = raw_import_start(import, fd, local, arg_force, arg_read_only); + r = raw_import_start(import, fd, local, arg_import_flags); if (r < 0) return log_error_errno(r, "Failed to import image: %m"); @@ -270,7 +263,7 @@ static int parse_argv(int argc, char *argv[]) { return version(); case ARG_FORCE: - arg_force = true; + arg_import_flags |= IMPORT_FORCE; break; case ARG_IMAGE_ROOT: @@ -278,7 +271,7 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_READ_ONLY: - arg_read_only = true; + arg_import_flags |= IMPORT_READ_ONLY; break; case '?': diff --git a/src/import/pull-tar.c b/src/import/pull-tar.c index b52569d20c..90f439f998 100644 --- a/src/import/pull-tar.c +++ b/src/import/pull-tar.c @@ -424,8 +424,10 @@ static int tar_pull_job_on_open_disk_tar(PullJob *j) { r = btrfs_subvol_make_fallback(i->temp_path, 0755); if (r < 0) return log_error_errno(r, "Failed to create directory/subvolume %s: %m", i->temp_path); - if (r > 0) /* actually btrfs subvol */ + if (r > 0) { /* actually btrfs subvol */ + (void) import_assign_pool_quota_and_warn(i->image_root); (void) import_assign_pool_quota_and_warn(i->temp_path); + } j->disk_fd = import_fork_tar_x(i->temp_path, &i->tar_pid); if (j->disk_fd < 0) diff --git a/src/shared/import-util.c b/src/shared/import-util.c index 298c066dff..2a30e40686 100644 --- a/src/shared/import-util.c +++ b/src/shared/import-util.c @@ -143,15 +143,7 @@ int raw_strip_suffixes(const char *p, char **ret) { int import_assign_pool_quota_and_warn(const char *path) { int r; - r = btrfs_subvol_auto_qgroup("/var/lib/machines", 0, true); - if (r == -ENOTTY) { - log_debug_errno(r, "Failed to set up default quota hierarchy for /var/lib/machines, as directory is not on btrfs or not a subvolume. Ignoring."); - return 0; - } - if (r < 0) - return log_error_errno(r, "Failed to set up default quota hierarchy for /var/lib/machines: %m"); - if (r > 0) - log_info("Set up default quota hierarchy for /var/lib/machines."); + assert(path); r = btrfs_subvol_auto_qgroup(path, 0, true); if (r == -ENOTTY) { |