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 <s...@debian.org>  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);
++}

Attachment: signature.asc
Description: Digital signature

Reply via email to