[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[patches] Fix MIPS64 posix_fallocate



I've applied this patch to fix failures of io/tst-posix_fallocate for
MIPS64 (both N32 and N64).  Applied to trunk, 2.9 branch and 2.8 branch.

N64 does not use the sysdeps/unix/sysv/linux/wordsize-64 directory,
apparently because glibc's "struct stat" and "struct stat64" differ
for N64 so the various files there that presume they are the same
cannot be used.  This meant glibc was using the version in
sysdeps/unix/sysv/linux, which assumes a 32-bit syscall interface.
This patch adds an N64 version that includes the wordsize-64 version.

For N32, the kernel uses a 64-bit syscall interface, and the view on
the linux-mips list is that the kernel is correct here.  This means
special N32 versions of the functions are needed.  The versions here
are the same as the sysdeps/unix/sysv/linux versions except for
calling the syscall in the 64-bit way.

sysdeps/posix/posix_fallocate64.c has a compatibility version of
posix_fallocate64, enabled only for __WORDSIZE == 32, using 64-bit
offset but 32-bit length.  I believe this patch should leave the
existence of this version unchanged for both N64 (which doesn't have
it) and N32 (which does).

It might be possible to make posix_fallocate and posix_fallocate64
aliases for N32, but this isn't the state at present or generally the
state for such functions for N32, and fragile #define tricks would be
needed to avoid problems with the declared types of these functions
being different.  (For that matter, the compatibility symbol could
also be another alias.)

2008-12-19  Joseph Myers  <joseph@xxxxxxxxxxxxxxxx>

	* sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c,
	sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c,
	sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c,
	sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c: New.

Index: sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c
===================================================================
--- sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c	(revision 0)
+++ sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c	(revision 0)
@@ -0,0 +1,60 @@
+/* Copyright (C) 2007, 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <fcntl.h>
+#include <kernel-features.h>
+#include <sysdep.h>
+
+extern int __posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len);
+#define __posix_fallocate64_l64 static internal_fallocate64
+#include <sysdeps/posix/posix_fallocate64.c>
+#undef __posix_fallocate64_l64
+
+#if !defined __ASSUME_FALLOCATE && defined __NR_fallocate
+/* Defined in posix_fallocate.c.  */
+extern int __have_fallocate attribute_hidden;
+#endif
+
+
+/* Reserve storage for the data of the file associated with FD.  */
+int
+__posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len)
+{
+#ifdef __NR_fallocate
+# ifndef __ASSUME_FALLOCATE
+  if (__builtin_expect (__have_fallocate >= 0, 1))
+# endif
+    {
+      INTERNAL_SYSCALL_DECL (err);
+      int res = INTERNAL_SYSCALL (fallocate, err, 4, fd, 0, offset, len);
+
+      if (! INTERNAL_SYSCALL_ERROR_P (res, err))
+	return 0;
+
+# ifndef __ASSUME_FALLOCATE
+      if (__builtin_expect (INTERNAL_SYSCALL_ERRNO (res, err) == ENOSYS, 0))
+	__have_fallocate = -1;
+      else
+# endif
+	if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP)
+	  return INTERNAL_SYSCALL_ERRNO (res, err);
+    }
+#endif
+
+  return internal_fallocate64 (fd, offset, len);
+}
Index: sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c
===================================================================
--- sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c	(revision 0)
+++ sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c	(revision 0)
@@ -0,0 +1,58 @@
+/* Copyright (C) 2007, 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <fcntl.h>
+#include <kernel-features.h>
+#include <sysdep.h>
+
+#define posix_fallocate static internal_fallocate
+#include <sysdeps/posix/posix_fallocate.c>
+#undef posix_fallocate
+
+#if !defined __ASSUME_FALLOCATE && defined __NR_fallocate
+int __have_fallocate attribute_hidden;
+#endif
+
+
+/* Reserve storage for the data of the file associated with FD.  */
+int
+posix_fallocate (int fd, __off_t offset, __off_t len)
+{
+#ifdef __NR_fallocate
+# ifndef __ASSUME_FALLOCATE
+  if (__builtin_expect (__have_fallocate >= 0, 1))
+# endif
+    {
+      INTERNAL_SYSCALL_DECL (err);
+      int res = INTERNAL_SYSCALL (fallocate, err, 4, fd, 0, offset, len);
+
+      if (! INTERNAL_SYSCALL_ERROR_P (res, err))
+	return 0;
+
+# ifndef __ASSUME_FALLOCATE
+      if (__builtin_expect (INTERNAL_SYSCALL_ERRNO (res, err) == ENOSYS, 0))
+	__have_fallocate = -1;
+      else
+# endif
+	if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP)
+	  return INTERNAL_SYSCALL_ERRNO (res, err);
+    }
+#endif
+
+  return internal_fallocate (fd, offset, len);
+}
Index: sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c
===================================================================
--- sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c	(revision 0)
+++ sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c	(revision 0)
@@ -0,0 +1 @@
+/* posix_fallocate64 is in posix_fallocate.c */
Index: sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c
===================================================================
--- sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c	(revision 0)
+++ sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c	(revision 0)
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c>

-- 
Joseph S. Myers
joseph@xxxxxxxxxxxxxxxx