diff options
Diffstat (limited to 'src/import/import-tar.c')
-rw-r--r-- | src/import/import-tar.c | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/src/import/import-tar.c b/src/import/import-tar.c index 89c95af279..4d0d9254d0 100644 --- a/src/import/import-tar.c +++ b/src/import/import-tar.c @@ -24,6 +24,7 @@ #include "ratelimit.h" #include "rm-rf.h" #include "string-util.h" +#include "tmpfile-util.h" #include "util.h" struct TarImport { @@ -37,7 +38,6 @@ struct TarImport { char *local; bool force_local; bool read_only; - bool grow_machine_directory; char *temp_path; char *final_path; @@ -47,8 +47,6 @@ struct TarImport { ImportCompress compress; - uint64_t written_since_last_grow; - sd_event_source *input_event_source; uint8_t buffer[16*1024]; @@ -101,26 +99,29 @@ int tar_import_new( void *userdata) { _cleanup_(tar_import_unrefp) TarImport *i = NULL; + _cleanup_free_ char *root = NULL; int r; assert(ret); - i = new0(TarImport, 1); + root = strdup(image_root ?: "/var/lib/machines"); + if (!root) + return -ENOMEM; + + i = new(TarImport, 1); if (!i) return -ENOMEM; - i->input_fd = i->tar_fd = -1; - i->on_finished = on_finished; - i->userdata = userdata; + *i = (TarImport) { + .input_fd = -1, + .tar_fd = -1, + .on_finished = on_finished, + .userdata = userdata, + .last_percent = (unsigned) -1, + .image_root = TAKE_PTR(root), + }; RATELIMIT_INIT(i->progress_rate_limit, 100 * USEC_PER_MSEC, 1); - i->last_percent = (unsigned) -1; - - i->image_root = strdup(image_root ?: "/var/lib/machines"); - if (!i->image_root) - return -ENOMEM; - - i->grow_machine_directory = path_startswith(i->image_root, "/var/lib/machines"); if (event) i->event = sd_event_ref(event); @@ -175,8 +176,14 @@ static int tar_import_finish(TarImport *i) { i->tar_pid = 0; if (r < 0) return r; + if (r != EXIT_SUCCESS) + return -EPROTO; } + r = import_mangle_os_tree(i->temp_path); + if (r < 0) + return r; + if (i->read_only) { r = import_make_read_only(i->temp_path); if (r < 0) @@ -234,17 +241,11 @@ static int tar_import_write(const void *p, size_t sz, void *userdata) { TarImport *i = userdata; int r; - if (i->grow_machine_directory && i->written_since_last_grow >= GROW_INTERVAL_BYTES) { - i->written_since_last_grow = 0; - grow_machine_directory(); - } - r = loop_write(i->tar_fd, p, sz, false); if (r < 0) return r; i->written_uncompressed += sz; - i->written_since_last_grow += sz; return 0; } |