From e08ac1a030138ffe15a3f68e96364570ff180171 Mon Sep 17 00:00:00 2001 From: Oguz Bektas Date: Thu, 28 Mar 2019 14:01:44 +0100 Subject: [PATCH] fix #1607: implement pct fstrim runs fstrim on the rootfs and all mountpoints of a given container. this works for both running and stopped containers. lock the CT during this operation using a config lock as it is potentially long running. While fstrim itself wouldn't really need the lock, as multiple parallel fstrim calls can be made without problems, we want to forbid migrations during it and want to avoid that we unmount a with the CT mounted with 'mount' lock (race) - while we could handle and allow this its just not needed and easier this way Signed-off-by: Oguz Bektas Signed-off-by: Thomas Lamprecht --- src/PVE/CLI/pct.pm | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/PVE/CLI/pct.pm b/src/PVE/CLI/pct.pm index 794bc45..ab7af33 100755 --- a/src/PVE/CLI/pct.pm +++ b/src/PVE/CLI/pct.pm @@ -755,6 +755,44 @@ __PACKAGE__->register_method ({ return undef; }}); +__PACKAGE__->register_method ({ + name => 'fstrim', + path => 'fstrim', + method => 'POST', + description => "Run fstrim on a chosen CT and its mountpoints.", + parameters => { + additionalProperties => 0, + properties => { + vmid => get_standard_option('pve-vmid', { completion => \&PVE::LXC::complete_ctid }), + }, + }, + returns => { type => 'null' }, + code => sub { + + my ($param) = @_; + my $vmid = $param->{'vmid'}; + + my $rootdir = "/var/lib/lxc/$vmid/rootfs"; + + my $storecfg = PVE::Storage::config(); + my $conf = PVE::LXC::Config->set_lock($vmid, 'fstrim'); + PVE::LXC::mount_all($vmid, $storecfg, $conf); + eval { + my $path = ""; + PVE::LXC::Config->foreach_mountpoint($conf, sub { + my ($name, $mp) = @_; + $path = $mp->{mp}; + my $cmd = ["fstrim", "-v", "$rootdir$path"]; + PVE::Tools::run_command($cmd); + }); + }; + + PVE::LXC::umount_all($vmid, $storecfg, $conf, 0); + PVE::LXC::Config->remove_lock($vmid, 'fstrim'); + + return undef; + }}); + our $cmddef = { list=> [ 'PVE::API2::LXC', 'vmlist', [], { node => $nodename }, sub { my $res = shift; @@ -841,6 +879,8 @@ our $cmddef = { cpusets => [ __PACKAGE__, 'cpusets', []], + fstrim => [ __PACKAGE__, 'fstrim', ['vmid']], + }; -- 2.39.2