summary refs log tree commit diff
path: root/qcow
diff options
context:
space:
mode:
authorDaniel Verkamp <dverkamp@chromium.org>2018-10-03 10:44:34 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-10-05 07:54:49 -0700
commitb1570f2672ada3f5c4b9592887186413d80e66de (patch)
tree913d43a3bd3d3b2351b0511938fbc50bc6939921 /qcow
parentc8986f14a8dd9f256d6faed55996d955b50ff923 (diff)
downloadcrosvm-b1570f2672ada3f5c4b9592887186413d80e66de.tar
crosvm-b1570f2672ada3f5c4b9592887186413d80e66de.tar.gz
crosvm-b1570f2672ada3f5c4b9592887186413d80e66de.tar.bz2
crosvm-b1570f2672ada3f5c4b9592887186413d80e66de.tar.lz
crosvm-b1570f2672ada3f5c4b9592887186413d80e66de.tar.xz
crosvm-b1570f2672ada3f5c4b9592887186413d80e66de.tar.zst
crosvm-b1570f2672ada3f5c4b9592887186413d80e66de.zip
qcow: track deallocated clusters as unreferenced
In deallocate_cluster(), we call set_cluster_refcount() to unref the
cluster that is being deallocated, but we never actually added the
deallocated cluster to the unref_clusters list.  Add clusters whose
refcounts reach 0 to the unref_clusters list as well.

Also add mremap() to the seccomp whitelist for the block device, since
this is being triggered by libc realloc() and other devices already
include it in the whitelist.

BUG=chromium:850998
TEST=cargo test -p qcow; test crosvm on nami and verify that qcow file
     size stays bounded when creating a 1 GB file and deleting it
     repeatedly

Change-Id: I1bdd96b2176dc13069417e0ac77f0768f9f26012
Signed-off-by: Daniel Verkamp <dverkamp@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1259404
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'qcow')
-rw-r--r--qcow/src/qcow.rs1
1 files changed, 1 insertions, 0 deletions
diff --git a/qcow/src/qcow.rs b/qcow/src/qcow.rs
index c44cc4a..fd25053 100644
--- a/qcow/src/qcow.rs
+++ b/qcow/src/qcow.rs
@@ -732,6 +732,7 @@ impl QcowFile {
             let _ = fallocate(self.raw_file.file_mut(),
                               FallocateMode::PunchHole, true,
                               cluster_addr, cluster_size);
+            self.unref_clusters.push(cluster_addr);
         }
         Ok(())
     }