diff mbox series

[isar-cip-core] RFC v2 9/9] swupdate: Backport patches from SWUpdate Master

Message ID 20211116112752.1521211-10-Quirin.Gylstorff@siemens.com (mailing list archive)
State Handled Elsewhere
Headers show
Series [isar-cip-core] RFC v2 9/9] swupdate: Backport patches from SWUpdate Master | expand

Commit Message

Quirin Gylstorff Nov. 16, 2021, 11:27 a.m. UTC
From: Quirin Gylstorff <quirin.gylstorff@siemens.com>

Backport the following patches to detect the correct partition to
update.
388f1777 util: Add get_root source /proc/self/mountinfo
3914d2b7 util: Extend get_root to find LUKS devices

Signed-off-by: Quirin Gylstorff <quirin.gylstorff@siemens.com>
---
 .../0001-add-patches-for-dm-verity.patch      | 188 ++++++++++++++++++
 .../swupdate/swupdate_2021.04-1+debian-gbp.bb |   5 +
 2 files changed, 193 insertions(+)
 create mode 100644 recipes-core/swupdate/files/0001-add-patches-for-dm-verity.patch

Comments

Storm, Christian Nov. 17, 2021, 10:40 a.m. UTC | #1
> From: Quirin Gylstorff <quirin.gylstorff@siemens.com>
> 
> Backport the following patches to detect the correct partition to
> update.
> 388f1777 util: Add get_root source /proc/self/mountinfo
> 3914d2b7 util: Extend get_root to find LUKS devices

Why not upgrade to a newer version of SWUpdate instead of backporting
stuff? There's no real advantage to stay on a "release" as SWUpdate
follows rolling releases -- granted, you have to do the qualification
but that applies to "releases" as well...


> Signed-off-by: Quirin Gylstorff <quirin.gylstorff@siemens.com>
> ---
>  .../0001-add-patches-for-dm-verity.patch      | 188 ++++++++++++++++++
>  .../swupdate/swupdate_2021.04-1+debian-gbp.bb |   5 +
>  2 files changed, 193 insertions(+)
>  create mode 100644 recipes-core/swupdate/files/0001-add-patches-for-dm-verity.patch
> 
> diff --git a/recipes-core/swupdate/files/0001-add-patches-for-dm-verity.patch b/recipes-core/swupdate/files/0001-add-patches-for-dm-verity.patch
> new file mode 100644
> index 0000000..f143207
> --- /dev/null
> +++ b/recipes-core/swupdate/files/0001-add-patches-for-dm-verity.patch
> @@ -0,0 +1,188 @@
> +From 4650883c2ffc4ed9e479e1eefdce044067c7de0b Mon Sep 17 00:00:00 2001
> +From: Quirin Gylstorff <quirin.gylstorff@siemens.com>
> +Date: Mon, 25 Oct 2021 14:43:07 +0200
> +Subject: [PATCH] add patches for dm-verity
> +
> +Signed-off-by: Quirin Gylstorff <quirin.gylstorff@siemens.com>
> +---
> + ...d-get_root-source-proc-self-mountinfo.diff | 68 +++++++++++++++
> + ...-Extend-get_root-to-find-LUKS-devices.diff | 83 +++++++++++++++++++
> + debian/patches/series                         |  2 +
> + 3 files changed, 153 insertions(+)
> + create mode 100644 debian/patches/0001-util-Add-get_root-source-proc-self-mountinfo.diff
> + create mode 100644 debian/patches/0002-util-Extend-get_root-to-find-LUKS-devices.diff
> +
> +diff --git a/debian/patches/0001-util-Add-get_root-source-proc-self-mountinfo.diff b/debian/patches/0001-util-Add-get_root-source-proc-self-mountinfo.diff
> +new file mode 100644
> +index 0000000..5db0e61
> +--- /dev/null
> ++++ b/debian/patches/0001-util-Add-get_root-source-proc-self-mountinfo.diff
> +@@ -0,0 +1,68 @@
> ++From 388f1777e3e9e7dfbe41768aa7ce86bc0ee25c37 Mon Sep 17 00:00:00 2001
> ++From: Christian Storm <christian.storm@siemens.com>
> ++Date: Thu, 10 Jun 2021 00:30:24 +0200
> ++Subject: [PATCH 1/2] util: Add get_root source /proc/self/mountinfo
> ++
> ++Filesystems such as BTRFS report synthetic device major:minor
> ++numbers in stat(2)'s st_dev value. Hence, such a root filesystem
> ++won't be found by get_root_from_partitions().
> ++
> ++As /proc/self/mountinfo's information is subject to mount-
> ++namespacing, it complements get_root_from_partitions() rather
> ++than replacing it.
> ++
> ++Signed-off-by: Christian Storm <christian.storm@siemens.com>
> ++Signed-off-by: Quirin Gylstorff <quirin.gylstorff@siemens.com>

Hm, why is your sign-off needed here as you've grabbed that directly
from SWUpdate's repo?

> ++---
> ++ core/util.c | 28 ++++++++++++++++++++++++++++
> ++ 1 file changed, 28 insertions(+)
> ++
> ++diff --git a/core/util.c b/core/util.c
> ++index 7d7673a..51a16b6 100644
> ++--- a/core/util.c
> +++++ b/core/util.c
> ++@@ -883,6 +883,32 @@ static char *get_root_from_partitions(void)
> ++ 	return NULL;
> ++ }
> ++ 
> +++/*
> +++ * Return the rootfs's device name from /proc/self/mountinfo.
> +++ * Needed for filesystems having synthetic stat(2) st_dev
> +++ * values such as BTRFS.
> +++ */
> +++static char *get_root_from_mountinfo(void)
> +++{
> +++	char *mnt_point, *device = NULL;
> +++	FILE *fp = fopen("/proc/self/mountinfo", "r");
> +++	while (fp && !feof(fp)){
> +++		/* format: https://www.kernel.org/doc/Documentation/filesystems/proc.txt */
> +++		if (fscanf(fp, "%*s %*s %*u:%*u %*s %ms %*s %*[-] %*s %ms %*s",
> +++			   &mnt_point, &device) == 2) {
> +++			if ( (!strcmp(mnt_point, "/")) && (strcmp(device, "none")) ) {
> +++				free(mnt_point);
> +++				break;
> +++			}
> +++			free(mnt_point);
> +++			free(device);
> +++		}
> +++		device = NULL;
> +++	}
> +++	(void)fclose(fp);
> +++	return device;
> +++}
> +++
> ++ #define MAX_CMDLINE_LENGTH 4096
> ++ static char *get_root_from_cmdline(void)
> ++ {
> ++@@ -936,6 +962,8 @@ char *get_root_device(void)
> ++ 	root = get_root_from_partitions();
> ++ 	if (!root)
> ++ 		root = get_root_from_cmdline();
> +++	if (!root)
> +++		root = get_root_from_mountinfo();
> ++ 
> ++ 	return root;
> ++ }
> ++-- 
> ++2.30.2
> ++
> +diff --git a/debian/patches/0002-util-Extend-get_root-to-find-LUKS-devices.diff b/debian/patches/0002-util-Extend-get_root-to-find-LUKS-devices.diff
> +new file mode 100644
> +index 0000000..a62d59c
> +--- /dev/null
> ++++ b/debian/patches/0002-util-Extend-get_root-to-find-LUKS-devices.diff
> +@@ -0,0 +1,83 @@
> ++From 3914d2b73bf80b24aba015d9225082c2965c7a02 Mon Sep 17 00:00:00 2001
> ++From: Stefano Babic <sbabic@denx.de>
> ++Date: Thu, 10 Jun 2021 16:14:44 +0200
> ++Subject: [PATCH 2/2] util: Extend get_root to find LUKS devices
> ++
> ++This helps in case of encrypted filesystem or device mapper.
> ++The returned device read from partitions is usually a dm-X device and
> ++this does not show which is the block device that contains it. Look in
> ++sysfs and check if the device has "slaves" entries, indicating the
> ++presence of an underlying device. If found, return this instead of the
> ++device returned parsing /proc/partitions.
> ++
> ++Signed-off-by: Stefano Babic <sbabic@denx.de>
> ++Signed-off-by: Quirin Gylstorff <quirin.gylstorff@siemens.com>

Same question as above applies here.

> ++---
> ++ core/util.c | 26 ++++++++++++++++++++++++--
> ++ 1 file changed, 24 insertions(+), 2 deletions(-)
> ++
> ++diff --git a/core/util.c b/core/util.c
> ++index 51a16b6..3b81c09 100644
> ++--- a/core/util.c
> +++++ b/core/util.c
> ++@@ -24,6 +24,7 @@
> ++ #include <libgen.h>
> ++ #include <regex.h>
> ++ #include <string.h>
> +++#include <dirent.h>
> ++ 
> ++ #if defined(__linux__)
> ++ #include <sys/statvfs.h>
> ++@@ -851,6 +852,10 @@ size_t snescape(char *dst, size_t n, const char *src)
> ++ /*
> ++  * This returns the device name where rootfs is mounted
> ++  */
> +++
> +++static int filter_slave(const struct dirent *ent) {
> +++	return (strcmp(ent->d_name, ".") && strcmp(ent->d_name, ".."));
> +++}
> ++ static char *get_root_from_partitions(void)
> ++ {
> ++ 	struct stat info;
> ++@@ -858,11 +863,28 @@ static char *get_root_from_partitions(void)
> ++ 	char *devname = NULL;
> ++ 	unsigned long major, minor, nblocks;
> ++ 	char buf[256];
> ++-	int ret;
> +++	int ret, dev_major, dev_minor, n;
> +++	struct dirent **devlist = NULL;
> ++ 
> ++ 	if (stat("/", &info) < 0)
> ++ 		return NULL;
> ++ 
> +++	dev_major = info.st_dev / 256;
> +++	dev_minor = info.st_dev % 256;
> +++
> +++	/*
> +++	 * Check if this is just a container, for example in case of LUKS
> +++	 * Search if the device has slaves pointing to another device
> +++	 */
> +++	snprintf(buf, sizeof(buf) - 1, "/sys/dev/block/%d:%d/slaves", dev_major, dev_minor);
> +++	n = scandir(buf, &devlist, filter_slave, NULL);
> +++	if (n == 1) {
> +++		devname = strdup(devlist[0]->d_name);
> +++		free(devlist);
> +++		return devname;
> +++	}
> +++	free(devlist);
> +++
> ++ 	fp = fopen("/proc/partitions", "r");
> ++ 	if (!fp)
> ++ 		return NULL;
> ++@@ -872,7 +894,7 @@ static char *get_root_from_partitions(void)
> ++ 			     &major, &minor, &nblocks, &devname);
> ++ 		if (ret != 4)
> ++ 			continue;
> ++-		if ((major == info.st_dev / 256) && (minor == info.st_dev % 256)) {
> +++		if ((major == dev_major) && (minor == dev_minor)) {
> ++ 			fclose(fp);
> ++ 			return devname;
> ++ 		}
> ++-- 
> ++2.30.2
> ++
> +diff --git a/debian/patches/series b/debian/patches/series
> +index 8c5564a..f3bd00e 100644
> +--- a/debian/patches/series
> ++++ b/debian/patches/series
> +@@ -1 +1,3 @@
> + use-gcc-compiler.diff
> ++0002-util-Extend-get_root-to-find-LUKS-devices.diff
> ++0001-util-Add-get_root-source-proc-self-mountinfo.diff
> +-- 
> +2.30.2
> +
> diff --git a/recipes-core/swupdate/swupdate_2021.04-1+debian-gbp.bb b/recipes-core/swupdate/swupdate_2021.04-1+debian-gbp.bb
> index 7a0fb9b..90854a4 100644
> --- a/recipes-core/swupdate/swupdate_2021.04-1+debian-gbp.bb
> +++ b/recipes-core/swupdate/swupdate_2021.04-1+debian-gbp.bb
> @@ -25,6 +25,11 @@ SRC_URI += "file://0001-debian-Add-option-to-build-with-efibootguard.patch \
>              file://0007-debian-Make-CONFIG_HW_COMPATIBILTY-optional.patch \
>              file://0008-debian-rules-Add-Embedded-Lua-handler-option.patch"
>  
> +# Patch for dm-verity based images - can be removed with SWUpdate 2021.10
> +SRC_URI += "file://0001-add-patches-for-dm-verity.patch"
> +
> +# end patching for dm-verity based images
> +
>  # deactivate signing and encryption for simple a/b rootfs update
>  SWUPDATE_BUILD_PROFILES += "pkg.swupdate.nosigning pkg.swupdate.noencryption"
>  
> -- 
> 2.30.2
> 


Kind regards,
   Christian
Quirin Gylstorff Nov. 17, 2021, 11:36 a.m. UTC | #2
On 11/17/21 11:40 AM, Christian Storm via lists.cip-project.org wrote:
>> From: Quirin Gylstorff <quirin.gylstorff@siemens.com>
>>
>> Backport the following patches to detect the correct partition to
>> update.
>> 388f1777 util: Add get_root source /proc/self/mountinfo
>> 3914d2b7 util: Extend get_root to find LUKS devices
> 
> Why not upgrade to a newer version of SWUpdate instead of backporting
> stuff? There's no real advantage to stay on a "release" as SWUpdate
> follows rolling releases -- granted, you have to do the qualification
> but that applies to "releases" as well...
>

The build of SWUpdate uses dpkg-gbp to follow the Debian build of 
SWUpdate with sources from [1].

As Debian only follows fixed release , currently 2021.04, I patched the 
version.
This patchset is no longer necessary after Debian uses the next Release
SWUpdate version.

[1]: https://salsa.debian.org/debian/swupdate.
> 
>> Signed-off-by: Quirin Gylstorff <quirin.gylstorff@siemens.com>
>> ---
>>   .../0001-add-patches-for-dm-verity.patch      | 188 ++++++++++++++++++
>>   .../swupdate/swupdate_2021.04-1+debian-gbp.bb |   5 +
>>   2 files changed, 193 insertions(+)
>>   create mode 100644 recipes-core/swupdate/files/0001-add-patches-for-dm-verity.patch
>>
>> diff --git a/recipes-core/swupdate/files/0001-add-patches-for-dm-verity.patch b/recipes-core/swupdate/files/0001-add-patches-for-dm-verity.patch
>> new file mode 100644
>> index 0000000..f143207
>> --- /dev/null
>> +++ b/recipes-core/swupdate/files/0001-add-patches-for-dm-verity.patch
>> @@ -0,0 +1,188 @@
>> +From 4650883c2ffc4ed9e479e1eefdce044067c7de0b Mon Sep 17 00:00:00 2001
>> +From: Quirin Gylstorff <quirin.gylstorff@siemens.com>
>> +Date: Mon, 25 Oct 2021 14:43:07 +0200
>> +Subject: [PATCH] add patches for dm-verity
>> +
>> +Signed-off-by: Quirin Gylstorff <quirin.gylstorff@siemens.com>
>> +---
>> + ...d-get_root-source-proc-self-mountinfo.diff | 68 +++++++++++++++
>> + ...-Extend-get_root-to-find-LUKS-devices.diff | 83 +++++++++++++++++++
>> + debian/patches/series                         |  2 +
>> + 3 files changed, 153 insertions(+)
>> + create mode 100644 debian/patches/0001-util-Add-get_root-source-proc-self-mountinfo.diff
>> + create mode 100644 debian/patches/0002-util-Extend-get_root-to-find-LUKS-devices.diff
>> +
>> +diff --git a/debian/patches/0001-util-Add-get_root-source-proc-self-mountinfo.diff b/debian/patches/0001-util-Add-get_root-source-proc-self-mountinfo.diff
>> +new file mode 100644
>> +index 0000000..5db0e61
>> +--- /dev/null
>> ++++ b/debian/patches/0001-util-Add-get_root-source-proc-self-mountinfo.diff
>> +@@ -0,0 +1,68 @@
>> ++From 388f1777e3e9e7dfbe41768aa7ce86bc0ee25c37 Mon Sep 17 00:00:00 2001
>> ++From: Christian Storm <christian.storm@siemens.com>
>> ++Date: Thu, 10 Jun 2021 00:30:24 +0200
>> ++Subject: [PATCH 1/2] util: Add get_root source /proc/self/mountinfo
>> ++
>> ++Filesystems such as BTRFS report synthetic device major:minor
>> ++numbers in stat(2)'s st_dev value. Hence, such a root filesystem
>> ++won't be found by get_root_from_partitions().
>> ++
>> ++As /proc/self/mountinfo's information is subject to mount-
>> ++namespacing, it complements get_root_from_partitions() rather
>> ++than replacing it.
>> ++
>> ++Signed-off-by: Christian Storm <christian.storm@siemens.com>
>> ++Signed-off-by: Quirin Gylstorff <quirin.gylstorff@siemens.com>
> 
> Hm, why is your sign-off needed here as you've grabbed that directly
> from SWUpdate's repo?

I will fix it in a new version.
> 
>> ++---
>> ++ core/util.c | 28 ++++++++++++++++++++++++++++
>> ++ 1 file changed, 28 insertions(+)
>> ++
>> ++diff --git a/core/util.c b/core/util.c
>> ++index 7d7673a..51a16b6 100644
>> ++--- a/core/util.c
>> +++++ b/core/util.c
>> ++@@ -883,6 +883,32 @@ static char *get_root_from_partitions(void)
>> ++ 	return NULL;
>> ++ }
>> ++
>> +++/*
>> +++ * Return the rootfs's device name from /proc/self/mountinfo.
>> +++ * Needed for filesystems having synthetic stat(2) st_dev
>> +++ * values such as BTRFS.
>> +++ */
>> +++static char *get_root_from_mountinfo(void)
>> +++{
>> +++	char *mnt_point, *device = NULL;
>> +++	FILE *fp = fopen("/proc/self/mountinfo", "r");
>> +++	while (fp && !feof(fp)){
>> +++		/* format: https://www.kernel.org/doc/Documentation/filesystems/proc.txt */
>> +++		if (fscanf(fp, "%*s %*s %*u:%*u %*s %ms %*s %*[-] %*s %ms %*s",
>> +++			   &mnt_point, &device) == 2) {
>> +++			if ( (!strcmp(mnt_point, "/")) && (strcmp(device, "none")) ) {
>> +++				free(mnt_point);
>> +++				break;
>> +++			}
>> +++			free(mnt_point);
>> +++			free(device);
>> +++		}
>> +++		device = NULL;
>> +++	}
>> +++	(void)fclose(fp);
>> +++	return device;
>> +++}
>> +++
>> ++ #define MAX_CMDLINE_LENGTH 4096
>> ++ static char *get_root_from_cmdline(void)
>> ++ {
>> ++@@ -936,6 +962,8 @@ char *get_root_device(void)
>> ++ 	root = get_root_from_partitions();
>> ++ 	if (!root)
>> ++ 		root = get_root_from_cmdline();
>> +++	if (!root)
>> +++		root = get_root_from_mountinfo();
>> ++
>> ++ 	return root;
>> ++ }
>> ++--
>> ++2.30.2
>> ++
>> +diff --git a/debian/patches/0002-util-Extend-get_root-to-find-LUKS-devices.diff b/debian/patches/0002-util-Extend-get_root-to-find-LUKS-devices.diff
>> +new file mode 100644
>> +index 0000000..a62d59c
>> +--- /dev/null
>> ++++ b/debian/patches/0002-util-Extend-get_root-to-find-LUKS-devices.diff
>> +@@ -0,0 +1,83 @@
>> ++From 3914d2b73bf80b24aba015d9225082c2965c7a02 Mon Sep 17 00:00:00 2001
>> ++From: Stefano Babic <sbabic@denx.de>
>> ++Date: Thu, 10 Jun 2021 16:14:44 +0200
>> ++Subject: [PATCH 2/2] util: Extend get_root to find LUKS devices
>> ++
>> ++This helps in case of encrypted filesystem or device mapper.
>> ++The returned device read from partitions is usually a dm-X device and
>> ++this does not show which is the block device that contains it. Look in
>> ++sysfs and check if the device has "slaves" entries, indicating the
>> ++presence of an underlying device. If found, return this instead of the
>> ++device returned parsing /proc/partitions.
>> ++
>> ++Signed-off-by: Stefano Babic <sbabic@denx.de>
>> ++Signed-off-by: Quirin Gylstorff <quirin.gylstorff@siemens.com>
> 
> Same question as above applies here.
> 

New version is in work

>> ++---
>> ++ core/util.c | 26 ++++++++++++++++++++++++--
>> ++ 1 file changed, 24 insertions(+), 2 deletions(-)
>> ++
>> ++diff --git a/core/util.c b/core/util.c
>> ++index 51a16b6..3b81c09 100644
>> ++--- a/core/util.c
>> +++++ b/core/util.c
>> ++@@ -24,6 +24,7 @@
>> ++ #include <libgen.h>
>> ++ #include <regex.h>
>> ++ #include <string.h>
>> +++#include <dirent.h>
>> ++
>> ++ #if defined(__linux__)
>> ++ #include <sys/statvfs.h>
>> ++@@ -851,6 +852,10 @@ size_t snescape(char *dst, size_t n, const char *src)
>> ++ /*
>> ++  * This returns the device name where rootfs is mounted
>> ++  */
>> +++
>> +++static int filter_slave(const struct dirent *ent) {
>> +++	return (strcmp(ent->d_name, ".") && strcmp(ent->d_name, ".."));
>> +++}
>> ++ static char *get_root_from_partitions(void)
>> ++ {
>> ++ 	struct stat info;
>> ++@@ -858,11 +863,28 @@ static char *get_root_from_partitions(void)
>> ++ 	char *devname = NULL;
>> ++ 	unsigned long major, minor, nblocks;
>> ++ 	char buf[256];
>> ++-	int ret;
>> +++	int ret, dev_major, dev_minor, n;
>> +++	struct dirent **devlist = NULL;
>> ++
>> ++ 	if (stat("/", &info) < 0)
>> ++ 		return NULL;
>> ++
>> +++	dev_major = info.st_dev / 256;
>> +++	dev_minor = info.st_dev % 256;
>> +++
>> +++	/*
>> +++	 * Check if this is just a container, for example in case of LUKS
>> +++	 * Search if the device has slaves pointing to another device
>> +++	 */
>> +++	snprintf(buf, sizeof(buf) - 1, "/sys/dev/block/%d:%d/slaves", dev_major, dev_minor);
>> +++	n = scandir(buf, &devlist, filter_slave, NULL);
>> +++	if (n == 1) {
>> +++		devname = strdup(devlist[0]->d_name);
>> +++		free(devlist);
>> +++		return devname;
>> +++	}
>> +++	free(devlist);
>> +++
>> ++ 	fp = fopen("/proc/partitions", "r");
>> ++ 	if (!fp)
>> ++ 		return NULL;
>> ++@@ -872,7 +894,7 @@ static char *get_root_from_partitions(void)
>> ++ 			     &major, &minor, &nblocks, &devname);
>> ++ 		if (ret != 4)
>> ++ 			continue;
>> ++-		if ((major == info.st_dev / 256) && (minor == info.st_dev % 256)) {
>> +++		if ((major == dev_major) && (minor == dev_minor)) {
>> ++ 			fclose(fp);
>> ++ 			return devname;
>> ++ 		}
>> ++--
>> ++2.30.2
>> ++
>> +diff --git a/debian/patches/series b/debian/patches/series
>> +index 8c5564a..f3bd00e 100644
>> +--- a/debian/patches/series
>> ++++ b/debian/patches/series
>> +@@ -1 +1,3 @@
>> + use-gcc-compiler.diff
>> ++0002-util-Extend-get_root-to-find-LUKS-devices.diff
>> ++0001-util-Add-get_root-source-proc-self-mountinfo.diff
>> +--
>> +2.30.2
>> +
>> diff --git a/recipes-core/swupdate/swupdate_2021.04-1+debian-gbp.bb b/recipes-core/swupdate/swupdate_2021.04-1+debian-gbp.bb
>> index 7a0fb9b..90854a4 100644
>> --- a/recipes-core/swupdate/swupdate_2021.04-1+debian-gbp.bb
>> +++ b/recipes-core/swupdate/swupdate_2021.04-1+debian-gbp.bb
>> @@ -25,6 +25,11 @@ SRC_URI += "file://0001-debian-Add-option-to-build-with-efibootguard.patch \
>>               file://0007-debian-Make-CONFIG_HW_COMPATIBILTY-optional.patch \
>>               file://0008-debian-rules-Add-Embedded-Lua-handler-option.patch"
>>   
>> +# Patch for dm-verity based images - can be removed with SWUpdate 2021.10
>> +SRC_URI += "file://0001-add-patches-for-dm-verity.patch"
>> +
>> +# end patching for dm-verity based images
>> +
>>   # deactivate signing and encryption for simple a/b rootfs update
>>   SWUPDATE_BUILD_PROFILES += "pkg.swupdate.nosigning pkg.swupdate.noencryption"
>>   
>> -- 
>> 2.30.2
>>
> 
> 
> Kind regards,
>     Christian
> 
Quirin
Jan Kiszka Nov. 19, 2021, 6:42 a.m. UTC | #3
On 17.11.21 12:36, Gylstorff Quirin wrote:
> 
> 
> On 11/17/21 11:40 AM, Christian Storm via lists.cip-project.org wrote:
>>> From: Quirin Gylstorff <quirin.gylstorff@siemens.com>
>>>
>>> Backport the following patches to detect the correct partition to
>>> update.
>>> 388f1777 util: Add get_root source /proc/self/mountinfo
>>> 3914d2b7 util: Extend get_root to find LUKS devices
>>
>> Why not upgrade to a newer version of SWUpdate instead of backporting
>> stuff? There's no real advantage to stay on a "release" as SWUpdate
>> follows rolling releases -- granted, you have to do the qualification
>> but that applies to "releases" as well...
>>
> 
> The build of SWUpdate uses dpkg-gbp to follow the Debian build of
> SWUpdate with sources from [1].
> 
> As Debian only follows fixed release , currently 2021.04, I patched the
> version.
> This patchset is no longer necessary after Debian uses the next Release
> SWUpdate version.
> 

I agree that a single backport is better in this case. But as 2021.11 is
to appear soon, it may resolve this automatically for v3 already.

Jan
Storm, Christian Nov. 19, 2021, 1:34 p.m. UTC | #4
> >>> Backport the following patches to detect the correct partition to
> >>> update.
> >>> 388f1777 util: Add get_root source /proc/self/mountinfo
> >>> 3914d2b7 util: Extend get_root to find LUKS devices
> >>
> >> Why not upgrade to a newer version of SWUpdate instead of backporting
> >> stuff? There's no real advantage to stay on a "release" as SWUpdate
> >> follows rolling releases -- granted, you have to do the qualification
> >> but that applies to "releases" as well...
> >>
> > 
> > The build of SWUpdate uses dpkg-gbp to follow the Debian build of
> > SWUpdate with sources from [1].
> > 
> > As Debian only follows fixed release , currently 2021.04, I patched the
> > version.
> > This patchset is no longer necessary after Debian uses the next Release
> > SWUpdate version.
> > 
> 
> I agree that a single backport is better in this case. But as 2021.11 is
> to appear soon, it may resolve this automatically for v3 already.

The old version doesn't give you any advantage as there's nothing that
qualifies a "release" that other shas don't give you, except that it's
tagged at some point in time as "release". But sticking to Debian's
recipes is of course beneficial from a maintenance perspective as long
as the patch queue to be put on top is not too large....


Kind regards,
   Christian
diff mbox series

Patch

diff --git a/recipes-core/swupdate/files/0001-add-patches-for-dm-verity.patch b/recipes-core/swupdate/files/0001-add-patches-for-dm-verity.patch
new file mode 100644
index 0000000..f143207
--- /dev/null
+++ b/recipes-core/swupdate/files/0001-add-patches-for-dm-verity.patch
@@ -0,0 +1,188 @@ 
+From 4650883c2ffc4ed9e479e1eefdce044067c7de0b Mon Sep 17 00:00:00 2001
+From: Quirin Gylstorff <quirin.gylstorff@siemens.com>
+Date: Mon, 25 Oct 2021 14:43:07 +0200
+Subject: [PATCH] add patches for dm-verity
+
+Signed-off-by: Quirin Gylstorff <quirin.gylstorff@siemens.com>
+---
+ ...d-get_root-source-proc-self-mountinfo.diff | 68 +++++++++++++++
+ ...-Extend-get_root-to-find-LUKS-devices.diff | 83 +++++++++++++++++++
+ debian/patches/series                         |  2 +
+ 3 files changed, 153 insertions(+)
+ create mode 100644 debian/patches/0001-util-Add-get_root-source-proc-self-mountinfo.diff
+ create mode 100644 debian/patches/0002-util-Extend-get_root-to-find-LUKS-devices.diff
+
+diff --git a/debian/patches/0001-util-Add-get_root-source-proc-self-mountinfo.diff b/debian/patches/0001-util-Add-get_root-source-proc-self-mountinfo.diff
+new file mode 100644
+index 0000000..5db0e61
+--- /dev/null
++++ b/debian/patches/0001-util-Add-get_root-source-proc-self-mountinfo.diff
+@@ -0,0 +1,68 @@
++From 388f1777e3e9e7dfbe41768aa7ce86bc0ee25c37 Mon Sep 17 00:00:00 2001
++From: Christian Storm <christian.storm@siemens.com>
++Date: Thu, 10 Jun 2021 00:30:24 +0200
++Subject: [PATCH 1/2] util: Add get_root source /proc/self/mountinfo
++
++Filesystems such as BTRFS report synthetic device major:minor
++numbers in stat(2)'s st_dev value. Hence, such a root filesystem
++won't be found by get_root_from_partitions().
++
++As /proc/self/mountinfo's information is subject to mount-
++namespacing, it complements get_root_from_partitions() rather
++than replacing it.
++
++Signed-off-by: Christian Storm <christian.storm@siemens.com>
++Signed-off-by: Quirin Gylstorff <quirin.gylstorff@siemens.com>
++---
++ core/util.c | 28 ++++++++++++++++++++++++++++
++ 1 file changed, 28 insertions(+)
++
++diff --git a/core/util.c b/core/util.c
++index 7d7673a..51a16b6 100644
++--- a/core/util.c
+++++ b/core/util.c
++@@ -883,6 +883,32 @@ static char *get_root_from_partitions(void)
++ 	return NULL;
++ }
++ 
+++/*
+++ * Return the rootfs's device name from /proc/self/mountinfo.
+++ * Needed for filesystems having synthetic stat(2) st_dev
+++ * values such as BTRFS.
+++ */
+++static char *get_root_from_mountinfo(void)
+++{
+++	char *mnt_point, *device = NULL;
+++	FILE *fp = fopen("/proc/self/mountinfo", "r");
+++	while (fp && !feof(fp)){
+++		/* format: https://www.kernel.org/doc/Documentation/filesystems/proc.txt */
+++		if (fscanf(fp, "%*s %*s %*u:%*u %*s %ms %*s %*[-] %*s %ms %*s",
+++			   &mnt_point, &device) == 2) {
+++			if ( (!strcmp(mnt_point, "/")) && (strcmp(device, "none")) ) {
+++				free(mnt_point);
+++				break;
+++			}
+++			free(mnt_point);
+++			free(device);
+++		}
+++		device = NULL;
+++	}
+++	(void)fclose(fp);
+++	return device;
+++}
+++
++ #define MAX_CMDLINE_LENGTH 4096
++ static char *get_root_from_cmdline(void)
++ {
++@@ -936,6 +962,8 @@ char *get_root_device(void)
++ 	root = get_root_from_partitions();
++ 	if (!root)
++ 		root = get_root_from_cmdline();
+++	if (!root)
+++		root = get_root_from_mountinfo();
++ 
++ 	return root;
++ }
++-- 
++2.30.2
++
+diff --git a/debian/patches/0002-util-Extend-get_root-to-find-LUKS-devices.diff b/debian/patches/0002-util-Extend-get_root-to-find-LUKS-devices.diff
+new file mode 100644
+index 0000000..a62d59c
+--- /dev/null
++++ b/debian/patches/0002-util-Extend-get_root-to-find-LUKS-devices.diff
+@@ -0,0 +1,83 @@
++From 3914d2b73bf80b24aba015d9225082c2965c7a02 Mon Sep 17 00:00:00 2001
++From: Stefano Babic <sbabic@denx.de>
++Date: Thu, 10 Jun 2021 16:14:44 +0200
++Subject: [PATCH 2/2] util: Extend get_root to find LUKS devices
++
++This helps in case of encrypted filesystem or device mapper.
++The returned device read from partitions is usually a dm-X device and
++this does not show which is the block device that contains it. Look in
++sysfs and check if the device has "slaves" entries, indicating the
++presence of an underlying device. If found, return this instead of the
++device returned parsing /proc/partitions.
++
++Signed-off-by: Stefano Babic <sbabic@denx.de>
++Signed-off-by: Quirin Gylstorff <quirin.gylstorff@siemens.com>
++---
++ core/util.c | 26 ++++++++++++++++++++++++--
++ 1 file changed, 24 insertions(+), 2 deletions(-)
++
++diff --git a/core/util.c b/core/util.c
++index 51a16b6..3b81c09 100644
++--- a/core/util.c
+++++ b/core/util.c
++@@ -24,6 +24,7 @@
++ #include <libgen.h>
++ #include <regex.h>
++ #include <string.h>
+++#include <dirent.h>
++ 
++ #if defined(__linux__)
++ #include <sys/statvfs.h>
++@@ -851,6 +852,10 @@ size_t snescape(char *dst, size_t n, const char *src)
++ /*
++  * This returns the device name where rootfs is mounted
++  */
+++
+++static int filter_slave(const struct dirent *ent) {
+++	return (strcmp(ent->d_name, ".") && strcmp(ent->d_name, ".."));
+++}
++ static char *get_root_from_partitions(void)
++ {
++ 	struct stat info;
++@@ -858,11 +863,28 @@ static char *get_root_from_partitions(void)
++ 	char *devname = NULL;
++ 	unsigned long major, minor, nblocks;
++ 	char buf[256];
++-	int ret;
+++	int ret, dev_major, dev_minor, n;
+++	struct dirent **devlist = NULL;
++ 
++ 	if (stat("/", &info) < 0)
++ 		return NULL;
++ 
+++	dev_major = info.st_dev / 256;
+++	dev_minor = info.st_dev % 256;
+++
+++	/*
+++	 * Check if this is just a container, for example in case of LUKS
+++	 * Search if the device has slaves pointing to another device
+++	 */
+++	snprintf(buf, sizeof(buf) - 1, "/sys/dev/block/%d:%d/slaves", dev_major, dev_minor);
+++	n = scandir(buf, &devlist, filter_slave, NULL);
+++	if (n == 1) {
+++		devname = strdup(devlist[0]->d_name);
+++		free(devlist);
+++		return devname;
+++	}
+++	free(devlist);
+++
++ 	fp = fopen("/proc/partitions", "r");
++ 	if (!fp)
++ 		return NULL;
++@@ -872,7 +894,7 @@ static char *get_root_from_partitions(void)
++ 			     &major, &minor, &nblocks, &devname);
++ 		if (ret != 4)
++ 			continue;
++-		if ((major == info.st_dev / 256) && (minor == info.st_dev % 256)) {
+++		if ((major == dev_major) && (minor == dev_minor)) {
++ 			fclose(fp);
++ 			return devname;
++ 		}
++-- 
++2.30.2
++
+diff --git a/debian/patches/series b/debian/patches/series
+index 8c5564a..f3bd00e 100644
+--- a/debian/patches/series
++++ b/debian/patches/series
+@@ -1 +1,3 @@
+ use-gcc-compiler.diff
++0002-util-Extend-get_root-to-find-LUKS-devices.diff
++0001-util-Add-get_root-source-proc-self-mountinfo.diff
+-- 
+2.30.2
+
diff --git a/recipes-core/swupdate/swupdate_2021.04-1+debian-gbp.bb b/recipes-core/swupdate/swupdate_2021.04-1+debian-gbp.bb
index 7a0fb9b..90854a4 100644
--- a/recipes-core/swupdate/swupdate_2021.04-1+debian-gbp.bb
+++ b/recipes-core/swupdate/swupdate_2021.04-1+debian-gbp.bb
@@ -25,6 +25,11 @@  SRC_URI += "file://0001-debian-Add-option-to-build-with-efibootguard.patch \
             file://0007-debian-Make-CONFIG_HW_COMPATIBILTY-optional.patch \
             file://0008-debian-rules-Add-Embedded-Lua-handler-option.patch"
 
+# Patch for dm-verity based images - can be removed with SWUpdate 2021.10
+SRC_URI += "file://0001-add-patches-for-dm-verity.patch"
+
+# end patching for dm-verity based images
+
 # deactivate signing and encryption for simple a/b rootfs update
 SWUPDATE_BUILD_PROFILES += "pkg.swupdate.nosigning pkg.swupdate.noencryption"