18971c
From db1e692c13290fba4d1c9a5e81b7374c677cb421 Mon Sep 17 00:00:00 2001
18971c
From: Fabian Deutsch <fabiand@fedoraproject.org>
18971c
Date: Wed, 18 Feb 2015 14:31:40 +0100
18971c
Subject: [PATCH] dmsquash: Add rd.live.overlay.thin
18971c
18971c
This option changes the underlying mechanism for the overlay in the
18971c
dmsquash module.
18971c
Instead of a plain dm snapshot a dm thin snapshot is used. The advantage
18971c
of the thin snapshot is, that the TRIM command is recognized, which
18971c
means that at runtime, only the occupied blocks will be claimed from
18971c
memory, and freed blocks will really be freed in ram.
18971c
18971c
Signed-off-by: Fabian Deutsch <fabiand@fedoraproject.org>
18971c
(cherry picked from commit d6e34d362a05cda61baaf8e231ad3f0e8665a9cc)
18971c
---
18971c
 dracut.cmdline.7.asc                          |  7 +++++
18971c
 .../90dmsquash-live/dmsquash-live-root.sh     | 27 ++++++++++++++++++-
18971c
 2 files changed, 33 insertions(+), 1 deletion(-)
18971c
18971c
diff --git a/dracut.cmdline.7.asc b/dracut.cmdline.7.asc
18971c
index 0493dcd8..0c3bc295 100644
18971c
--- a/dracut.cmdline.7.asc
18971c
+++ b/dracut.cmdline.7.asc
18971c
@@ -802,6 +802,13 @@ Enables debug output from the live boot process.
18971c
 Specifies the directory within the squashfs where the ext3fs.img or rootfs.img
18971c
 can be found.  By default, this is __LiveOS__.
18971c
 
18971c
+**rd.live.overlay.thin=**1::
18971c
+Enables the usage of thin snapshots instead of classic dm snapshots.
18971c
+The advantage of thin snapshots is, that they support discards, and will free
18971c
+blocks which are not claimed by the filesystem. In this use case this means,
18971c
+that memory is given back to the kernel, when the filesystem does not claim it
18971c
+anymore.
18971c
+
18971c
 **rd.writable.fsimg=**1::
18971c
 Enables writable filesystem support.  The system will boot with a fully 
18971c
 writable filesystem without snapshots __(see notes above about available live boot options)__.
18971c
diff --git a/modules.d/90dmsquash-live/dmsquash-live-root.sh b/modules.d/90dmsquash-live/dmsquash-live-root.sh
18971c
index c6c02c74..0645a0bd 100755
18971c
--- a/modules.d/90dmsquash-live/dmsquash-live-root.sh
18971c
+++ b/modules.d/90dmsquash-live/dmsquash-live-root.sh
18971c
@@ -30,6 +30,8 @@ getargbool 0 rd.live.overlay.readonly -d -y readonly_overlay && readonly_overlay
18971c
 overlay=$(getarg rd.live.overlay -d overlay)
18971c
 getargbool 0 rd.writable.fsimg -d -y writable_fsimg && writable_fsimg="yes"
18971c
 
18971c
+getargbool 0 rd.live.overlay.thin && thin_snapshot="yes"
18971c
+
18971c
 # CD/DVD media check
18971c
 [ -b $livedev ] && fs=$(blkid -s TYPE -o value $livedev)
18971c
 if [ "$fs" = "iso9660" -o "$fs" = "udf" ]; then
18971c
@@ -146,7 +148,30 @@ do_live_overlay() {
18971c
         base=$BASE_LOOPDEV
18971c
         over=$OVERLAY_LOOPDEV
18971c
     fi
18971c
-    echo 0 $sz snapshot $base $over p 8 | dmsetup create live-rw
18971c
+    if [ -n "$thin_snapshot" ]; then
18971c
+        modprobe dm_thin_pool
18971c
+        mkdir /run/initramfs/thin-overlay
18971c
+
18971c
+        # In block units (512b)
18971c
+        thin_data_sz=$(( $overlay_size * 1024 * 1024 / 512 ))
18971c
+        thin_meta_sz=$(( $thin_data_sz / 10 ))
18971c
+
18971c
+        # It is important to have the backing file on a tmpfs
18971c
+        # this is needed to let the loopdevice support TRIM
18971c
+        dd if=/dev/null of=/run/initramfs/thin-overlay/meta bs=1b count=1 seek=$((thin_meta_sz)) 2> /dev/null
18971c
+        dd if=/dev/null of=/run/initramfs/thin-overlay/data bs=1b count=1 seek=$((thin_data_sz)) 2> /dev/null
18971c
+
18971c
+        THIN_META_LOOPDEV=$( losetup --show -f /run/initramfs/thin-overlay/meta )
18971c
+        THIN_DATA_LOOPDEV=$( losetup --show -f /run/initramfs/thin-overlay/data )
18971c
+
18971c
+        echo 0 $thin_data_sz thin-pool $THIN_META_LOOPDEV $THIN_DATA_LOOPDEV 1024 1024 | dmsetup create live-overlay-pool
18971c
+        dmsetup message /dev/mapper/live-overlay-pool 0 "create_thin 0"
18971c
+
18971c
+        # Create a snapshot of the base image
18971c
+        echo 0 $sz thin /dev/mapper/live-overlay-pool 0 $base | dmsetup create live-rw
18971c
+    else
18971c
+        echo 0 $sz snapshot $base $over p 8 | dmsetup create live-rw
18971c
+    fi
18971c
 
18971c
     # Create a device that always points to a ro base image
18971c
     echo 0 $sz linear $base 0 | dmsetup create --readonly live-base