[Buildroot] [PATCH 1/1] package/lvm2: enable package with musl

Simon Rowe simon.rowe at nutanix.com
Thu Mar 16 11:36:15 UTC 2023


LVM uses some glibc-specific functions to try and control locking
memory in RAM. As a result the package is currently disabled when
using musl.

Apply patches taken from gentoo:

    https://github.com/gentoo/gentoo/pull/25883
    https://github.com/gentoo/gentoo/pull/26024

and drop the prohibition on musl in Config.in.

Signed-off-by: Simon Rowe <simon.rowe at nutanix.com>
---
 .../lvm2/0001-lvm2-2.03.14-r1-add-fcntl.patch | 25 +++++++++++
 ...002-lvm2-2.03.14-r1-fopen-to-freopen.patch | 44 +++++++++++++++++++
 .../lvm2/0003-lvm2-2.03.14-r1-mallinfo.patch  | 20 +++++++++
 .../lvm2/0004-lvm2-2.03.14-freopen_n2.patch   | 36 +++++++++++++++
 package/lvm2/Config.in                        |  5 ---
 5 files changed, 125 insertions(+), 5 deletions(-)
 create mode 100644 package/lvm2/0001-lvm2-2.03.14-r1-add-fcntl.patch
 create mode 100644 package/lvm2/0002-lvm2-2.03.14-r1-fopen-to-freopen.patch
 create mode 100644 package/lvm2/0003-lvm2-2.03.14-r1-mallinfo.patch
 create mode 100644 package/lvm2/0004-lvm2-2.03.14-freopen_n2.patch

diff --git a/package/lvm2/0001-lvm2-2.03.14-r1-add-fcntl.patch b/package/lvm2/0001-lvm2-2.03.14-r1-add-fcntl.patch
new file mode 100644
index 0000000000..14b3164c3f
--- /dev/null
+++ b/package/lvm2/0001-lvm2-2.03.14-r1-add-fcntl.patch
@@ -0,0 +1,25 @@
+https://bugs.gentoo.org/712336
+https://bugs.gentoo.org/549506
+
+Adds fcntl.h into daemon-server.c to define fcntl and some constants.
+
+Fetch from: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=515ec4557c56cf0e82b95873056c40d8c6269694
+---
+ libdaemon/server/daemon-server.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/libdaemon/server/daemon-server.c b/libdaemon/server/daemon-server.c
+index 88905a7..771b021 100644
+--- a/libdaemon/server/daemon-server.c
++++ b/libdaemon/server/daemon-server.c
+@@ -28,6 +28,7 @@
+ #include <sys/un.h>
+ #include <unistd.h>
+ #include <signal.h>
++#include <fcntl.h>
+ 
+ #include <syslog.h> /* FIXME. For the global closelog(). */
+ 
+-- 
+2.35.1
+
diff --git a/package/lvm2/0002-lvm2-2.03.14-r1-fopen-to-freopen.patch b/package/lvm2/0002-lvm2-2.03.14-r1-fopen-to-freopen.patch
new file mode 100644
index 0000000000..1d47fdb283
--- /dev/null
+++ b/package/lvm2/0002-lvm2-2.03.14-r1-fopen-to-freopen.patch
@@ -0,0 +1,44 @@
+In musl stdout, stdin and stderr are read-only unlike in glibc.
+This patch changes std* = fopen(...) to freopen(..., std*).
+
+See: https://www.gnu.org/software/libc/manual/html_node/Standard-Streams.html and https://wiki.gentoo.org/wiki/User:Sam/Musl_porting_notes
+
+Fetch from: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=515ec4557c56cf0e82b95873056c40d8c6269694
+---
+ tools/lvmcmdline.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
+index 1e12bed..19da1e5 100644
+--- a/tools/lvmcmdline.c
++++ b/tools/lvmcmdline.c
+@@ -3384,7 +3384,7 @@ static int _check_standard_fds(void)
+ 	int err = is_valid_fd(STDERR_FILENO);
+ 
+ 	if (!is_valid_fd(STDIN_FILENO) &&
+-	    !(stdin = fopen(_PATH_DEVNULL, "r"))) {
++		!freopen(_PATH_DEVNULL, "r", stdin)) {
+ 		if (err)
+ 			perror("stdin stream open");
+ 		else
+@@ -3394,7 +3394,7 @@ static int _check_standard_fds(void)
+ 	}
+ 
+ 	if (!is_valid_fd(STDOUT_FILENO) &&
+-	    !(stdout = fopen(_PATH_DEVNULL, "w"))) {
++		!freopen(_PATH_DEVNULL, "w", stdout)) {
+ 		if (err)
+ 			perror("stdout stream open");
+ 		/* else no stdout */
+@@ -3402,7 +3402,7 @@ static int _check_standard_fds(void)
+ 	}
+ 
+ 	if (!is_valid_fd(STDERR_FILENO) &&
+-	    !(stderr = fopen(_PATH_DEVNULL, "w"))) {
++		!freopen(_PATH_DEVNULL, "w", stderr)) {
+ 		printf("stderr stream open: %s\n",
+ 		       strerror(errno));
+ 		return 0;
+-- 
+2.35.1
+
diff --git a/package/lvm2/0003-lvm2-2.03.14-r1-mallinfo.patch b/package/lvm2/0003-lvm2-2.03.14-r1-mallinfo.patch
new file mode 100644
index 0000000000..d593dca171
--- /dev/null
+++ b/package/lvm2/0003-lvm2-2.03.14-r1-mallinfo.patch
@@ -0,0 +1,20 @@
+https://git.alpinelinux.org/aports/tree/main/lvm2/mallinfo.patch
+
+Patch from Alpine, disables _allocate_memory since mallinfo isn't defined in musl.
+19:17 <@sam_> your caution is well-advised, but it should be safe enough given it's only affecting the non-glibc path
+
+Should be looked back to!
+
+Fetch from: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=515ec4557c56cf0e82b95873056c40d8c6269694
+
+--- ./lib/mm/memlock.c.orig	2015-03-09 11:18:41.560028850 -0100
++++ ./lib/mm/memlock.c	2015-03-09 11:19:54.504373309 -0100
+@@ -137,7 +137,7 @@
+ 
+ static void _allocate_memory(void)
+ {
+-#ifndef VALGRIND_POOL
++#if !defined(VALGRIND_POOL) && defined(__GLIBC__)
+ 	void *stack_mem;
+ 	struct rlimit limit;
+ 	int i, area = 0, missing = _size_malloc_tmp, max_areas = 32, hblks;
diff --git a/package/lvm2/0004-lvm2-2.03.14-freopen_n2.patch b/package/lvm2/0004-lvm2-2.03.14-freopen_n2.patch
new file mode 100644
index 0000000000..d19bc99b7c
--- /dev/null
+++ b/package/lvm2/0004-lvm2-2.03.14-freopen_n2.patch
@@ -0,0 +1,36 @@
+In musl, the standard streams are read-only. To modify them we need to
+use freopen. This patch does the same as lvm2-2.03.14-r1-fopen-to-freopen.patch
+
+https://listman.redhat.com/archives/lvm-devel/2022-June/024203.html
+
+See also:
+https://wiki.gentoo.org/wiki/User:Sam/Musl_porting_notes#error:_assignment_of_read-only_variable_.27.5Bstdout.7Cstdin.7Cstderr.5D.27
+https://www.gnu.org/software/libc/manual/html_node/Standard-Streams.html
+
+Fetch from: http://listman.redhat.com/archives/lvm-devel/attachments/20220621/3594a4a7/attachment.bin
+
+---
+ lib/log/log.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/lib/log/log.c b/lib/log/log.c
+index 7b4d537..897c183 100644
+--- a/lib/log/log.c
++++ b/lib/log/log.c
+@@ -207,8 +207,12 @@ int reopen_standard_stream(FILE **stream, const char *mode)
+ 	}
+ 
+ 	_check_and_replace_standard_log_streams(old_stream, new_stream);
+-
++	
++#ifdef __GLIBC__
+ 	*stream = new_stream;
++#else
++	freopen(NULL, mode, *stream);
++#endif
+ 	return 1;
+ }
+ 
+-- 
+2.35.1
+
diff --git a/package/lvm2/Config.in b/package/lvm2/Config.in
index cc740dd40c..577a90656a 100644
--- a/package/lvm2/Config.in
+++ b/package/lvm2/Config.in
@@ -27,15 +27,10 @@ if BR2_PACKAGE_LVM2
 config BR2_PACKAGE_LVM2_STANDARD_INSTALL
 	bool "standard install instead of only dmsetup"
 	default y
-	# http://lists.busybox.net/pipermail/buildroot/2016-August/170592.html
-	depends on !BR2_TOOLCHAIN_USES_MUSL
 	help
 	  Install the standard suite of lvm2 programs. When this option
 	  is not set, only dmsetup is installed.
 
-comment "lvm2 standard install needs a glibc or uClibc toolchain"
-	depends on BR2_TOOLCHAIN_USES_MUSL
-
 endif
 
 comment "lvm2 needs a toolchain w/ threads, dynamic library"
-- 
2.22.3




More information about the buildroot mailing list