[PATCH] fcntl cleanup

Mark Salter msalter at redhat.com
Tue May 8 20:48:12 UTC 2012


On Tue, 2012-05-08 at 21:18 +0200, Peter Mazinger wrote:
> Hi,

Hi. Thanks for looking at this.

> 
> > The code in the future branch is much better organized but it
> > still relies on the fcntl syscall which may not exist. It also
> > tests for the fctnl64 locking commands unnecessarily for some
> > configurations.
> 
> I can't see, what should happen, when fcntl[64] are not available. Are
> you thinking of some fallback function to implement it?

No. I don't think there is a fallback. If fcntl64 is not available on
a 32-bit system, I don't think you can do locking with 64-bit offsets.

> 
> Which configurations do not have the above named lockings? I have
> looked at them and the only thing I know might be, that the naming is
> different, but the "numbering" can be used for 32/64 bit cases.

The special 64-bit lockings are only on 32-bit kernels or 64-bit kernels
with compat_fcntl64 syscall.

> 
> Since I (re)wrote that part, I am interested in implementing it better

I would suggest the following. It eliminates an unnecessary check for
the ENOSYS error when we have LFS and __NR_fcntl64. It also works for
newer 32-bit kernel ports which don't have __NR_fcntl.


diff --git a/libc/sysdeps/linux/common/__syscall_fcntl.c
b/libc/sysdeps/linux/common/__syscall_fcntl.c
index 77a2c37..80bc8ce 100644
--- a/libc/sysdeps/linux/common/__syscall_fcntl.c
+++ b/libc/sysdeps/linux/common/__syscall_fcntl.c
@@ -16,17 +16,17 @@
 
 int __NC(fcntl)(int fd, int cmd, long arg)
 {
-#if __WORDSIZE == 32
+#if __WORDSIZE == 32 && !(defined __UCLIBC_HAS_LFS__ && defined __NR_fcntl64)
 	if (cmd == F_GETLK64 || cmd == F_SETLK64 || cmd == F_SETLKW64) {
-# if defined __UCLIBC_HAS_LFS__ && defined __NR_fcntl64
-		return __NC(fcntl64)(fd, cmd, arg);
-# else
 		__set_errno(ENOSYS);
 		return -1;
-# endif
 	}
 #endif
+#if __WORDSIZE == 32 && defined __NR_fcntl64
+	return INLINE_SYSCALL(fcntl64, 3, fd, cmd, arg);
+#else
 	return INLINE_SYSCALL(fcntl, 3, fd, cmd, arg);
+#endif
 }
 
 int fcntl(int fd, int cmd, ...)




More information about the uClibc mailing list