reopen 508397 retitle 508397 dietlibc: umount2 still undefined on ia64, and umount is wrong block 509874 by 508397 thanks
Bug#508397 in dietlibc is still not fixed on ia64, causing the FTBFS
that is #509874. I am not an expert on alpha or ia64 (and don't own an
example of either) but my interpretation of the problem is:
* Case 1: Typical architectures like i386 have syscalls sys_umount(path, flags)
and sys_oldumount(path), corresponding to the C library functions
umount2(path, flags) and umount(path). __NR_umount2 corresponds to
sys_umount and __NR_umount corresponds to sys_oldumount. dietlibc
always supported this case.
* Case 2: Old versions of Linux only have a syscall equivalent to the
modern sys_oldumount(path) and umount(path). __NR_umount corresponds to
what we would now call sys_oldumount and __NR_umount2 is absent.
dietlibc always supported this case, and would simply not provide the
umount2 API (but would still declare it in sys/mount.h, which is
arguably a bug).
* Case 3: alpha instead has __NR_umount corresponding to sys_umount, and
__NR_oldumount => sys_oldumount. Micah's patch in dietlibc 0.31-1.1 fixed
this case.
(Side note: I have no idea what the justification was for making
alpha inconsistent in the kernel headers)
* Case 4: ia64 never had oldumount. __NR_umount corresponds to
sys_umount(path, flags) and there is no syscall that only takes a path.
If you just look at the syscall numbers, this case is
indistinguishable from case 2 :-(
(Side note: Linux kernel people could have solved this by calling this
syscall __NR_umount2. *shrug* I'm not a kernel hacker, their ways are a
mystery to me.)
A quick way to fix this for Debian would be to check for defined(__ia64__)
in umount.S and umount2.S, although I doubt upstream would like this.
In the IA-64 case, an extern symbol for umount also still needs generating
somehow, maybe by adding a trivial ia64/umount.c which implements it as
a call to umount2 (upstream would probably prefer it in assembler, but I
don't speak fluent assembler).
I attach a proof-of-concept patch. I haven't tested it with util-vserver,
but it compiles on merulo, and the resulting dietlibc.a contains exactly one
definition each for umount and umount2.
Regards,
Simon
diffstat for dietlibc_0.31-1.1 dietlibc_0.31-1.2 debian/diff/0012-umount-ia64.diff | 14 ++++++++++ dietlibc-0.31/debian/changelog | 10 +++++++ dietlibc-0.31/debian/diff/0011-undefined-symbol-umount2-alpha-ia64.diff | 4 +- 3 files changed, 26 insertions(+), 2 deletions(-) diff -u dietlibc-0.31/debian/changelog dietlibc-0.31/debian/changelog --- dietlibc-0.31/debian/changelog +++ dietlibc-0.31/debian/changelog @@ -1,3 +1,13 @@ +dietlibc (0.31-1.2) UNRELEASED; urgency=low + + * Untested proof-of-concept + * debian/diff/0011-undefined-symbol-umount2-alpha-ia64.diff: + treat __NR_umount as the 2-argument version on ia64 (closes: #508397) + * debian/diff/0012-umount-ia64.diff: provide an implementation of the + 1-argument version of umount on ia64 + + -- Simon McVittie <[email protected]> Sun, 28 Dec 2008 15:16:27 +0000 + dietlibc (0.31-1.1) unstable; urgency=high * Non-maintainer upload. diff -u dietlibc-0.31/debian/diff/0011-undefined-symbol-umount2-alpha-ia64.diff dietlibc-0.31/debian/diff/0011-undefined-symbol-umount2-alpha-ia64.diff --- dietlibc-0.31/debian/diff/0011-undefined-symbol-umount2-alpha-ia64.diff +++ dietlibc-0.31/debian/diff/0011-undefined-symbol-umount2-alpha-ia64.diff @@ -5,7 +5,7 @@ +#if defined(__NR_oldumount) && defined(__NR_umount) +syscall(oldumount,umount) -+#else ++#elif !defined(__ia64__) syscall(umount,umount) +#endif --- a/syscalls.s/umount2.S 4 Jan 2003 22:21:48 -0000 1.2 @@ -17,5 +17,5 @@ +#if defined(__NR_umount2) syscall(umount2,umount2) -+#elif defined(__NR_oldumount) && defined(__NR_umount) ++#elif defined(__NR_umount) && (defined(__NR_oldumount) || defined(__ia64__)) +syscall(umount,umount2) #endif only in patch2: unchanged: --- dietlibc-0.31.orig/debian/diff/0012-umount-ia64.diff +++ dietlibc-0.31/debian/diff/0012-umount-ia64.diff @@ -0,0 +1,14 @@ +--- a/ia64/Makefile.add 2008-12-28 15:13:51.000000000 +0000 ++++ b/ia64/Makefile.add 2008-12-28 15:14:10.000000000 +0000 +@@ -1,2 +1,2 @@ + VPATH:=ia64:syscalls.s:$(VPATH) +-LIBOBJ+=$(OBJDIR)/__time.o $(OBJDIR)/__waitpid.o $(OBJDIR)/__nice.o $(OBJDIR)/__alarm.o ++LIBOBJ+=$(OBJDIR)/__time.o $(OBJDIR)/__waitpid.o $(OBJDIR)/__nice.o $(OBJDIR)/__alarm.o $(OBJDIR)/umount-wrapper.o +--- /dev/null 2008-12-18 18:10:23.510503709 +0000 ++++ b/ia64/umount-wrapper.c 2008-12-28 15:13:38.000000000 +0000 +@@ -0,0 +1,5 @@ ++#include <sys/mount.h> ++ ++int umount(const char *target) { ++ return umount2(target, 0); ++}
signature.asc
Description: Digital signature

