summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/import/import-common.c4
-rw-r--r--src/import/import-common.h7
-rw-r--r--src/import/import-fs.c1
-rw-r--r--src/import/import-raw.c14
-rw-r--r--src/import/import-raw.h3
-rw-r--r--src/import/import-tar.c18
-rw-r--r--src/import/import-tar.h3
-rw-r--r--src/import/import.c33
-rw-r--r--src/import/pull-tar.c4
-rw-r--r--src/shared/import-util.c10
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) {