From: Sam Leonard Date: Thu, 11 Apr 2024 11:48:00 +0000 (+0100) Subject: vmspawn: add --discard-disk= to control handling of disk discard requests X-Git-Tag: v256-rc1~210 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=edd85c8414c4a5a6fc506d210c8ec645c42c0a4b;p=thirdparty%2Fsystemd.git vmspawn: add --discard-disk= to control handling of disk discard requests Fixes issue #32024, using --discard-disk=yes will enable handling of disk discarding requests, saving space for long running VMs as desired. --- diff --git a/man/systemd-vmspawn.xml b/man/systemd-vmspawn.xml index 90ddc9b6740..da3ac84a402 100644 --- a/man/systemd-vmspawn.xml +++ b/man/systemd-vmspawn.xml @@ -243,6 +243,16 @@ + + + + Controls whether qemu processes discard requests from the VM. + This prevents long running VMs from using more disk space than required. + This is enabled by default. + + + + BOOL diff --git a/src/vmspawn/vmspawn.c b/src/vmspawn/vmspawn.c index dbd15e5f29d..cb74b5c97ed 100644 --- a/src/vmspawn/vmspawn.c +++ b/src/vmspawn/vmspawn.c @@ -97,6 +97,7 @@ static char **arg_extra_drives = NULL; static char *arg_background = NULL; static bool arg_pass_ssh_key = true; static char *arg_ssh_key_type = NULL; +static bool arg_discard_disk = true; STATIC_DESTRUCTOR_REGISTER(arg_directory, freep); STATIC_DESTRUCTOR_REGISTER(arg_image, freep); @@ -146,6 +147,7 @@ static int help(void) { " --network-user-mode Use user mode networking\n" " --secure-boot=BOOL Enable searching for firmware supporting SecureBoot\n" " --firmware=PATH|list Select firmware definition file (or list available)\n" + " --discard-disk=BOOL Control processing of discard requests\n" "\n%3$sSystem Identity:%4$s\n" " -M --machine=NAME Set the machine name for the VM\n" " --uuid=UUID Set a specific machine UUID for the VM\n" @@ -213,6 +215,7 @@ static int parse_argv(int argc, char *argv[]) { ARG_SET_CREDENTIAL, ARG_LOAD_CREDENTIAL, ARG_FIRMWARE, + ARG_DISCARD_DISK, ARG_CONSOLE, ARG_BACKGROUND, }; @@ -254,6 +257,7 @@ static int parse_argv(int argc, char *argv[]) { { "set-credential", required_argument, NULL, ARG_SET_CREDENTIAL }, { "load-credential", required_argument, NULL, ARG_LOAD_CREDENTIAL }, { "firmware", required_argument, NULL, ARG_FIRMWARE }, + { "discard-disk", required_argument, NULL, ARG_DISCARD_DISK }, { "background", required_argument, NULL, ARG_BACKGROUND }, {} }; @@ -507,6 +511,12 @@ static int parse_argv(int argc, char *argv[]) { break; + case ARG_DISCARD_DISK: + r = parse_boolean_argument("--discard-disk=", optarg, &arg_discard_disk); + if (r < 0) + return r; + break; + case ARG_BACKGROUND: r = free_and_strdup_warn(&arg_background, optarg); if (r < 0) @@ -1533,7 +1543,7 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) { if (!escaped_image) log_oom(); - r = strv_extendf(&cmdline, "if=none,id=mkosi,file=%s,format=raw", escaped_image); + r = strv_extendf(&cmdline, "if=none,id=mkosi,file=%s,format=raw,discard=%s", escaped_image, on_off(arg_discard_disk)); if (r < 0) return log_oom();