Make F_RDLCK/F_WRLCK atomic
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Fri, 20 Sep 2019 19:39:03 +0000 (20:39 +0100)
committerAurelien Jarno <aurel32@debian.org>
Fri, 20 Sep 2019 19:39:03 +0000 (20:39 +0100)
lockf(LOCK_EX) would for instance drop any existing shared lock before taking
the exclusive lock. F_RDLCK/F_WRLCK need atomic changes, so introduce and use
__LOCK_ATOM

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
* misc/sys/file.h (__LOCK_ATOMIC): New macro.
* sysdeps/mach/hurd/fcntl.c (__libc_fcntl): Use __LOCK_ATOMIC along LOCK_SH and
LOCK_EX.

XXX: Adding to misc/sys/file.h is questionable

Gbp-Pq: Topic hurd-i386
Gbp-Pq: Name tg-WRLCK-upgrade.diff

misc/sys/file.h
sysdeps/mach/hurd/f_setlk.c

index 13f0b4941555797af546fa59ada41d4f63b9c756..1fe20ffa165d1b657521df74a05a9982d090ec66 100644 (file)
@@ -40,6 +40,7 @@ __BEGIN_DECLS
 #define        LOCK_SH 1       /* Shared lock.  */
 #define        LOCK_EX 2       /* Exclusive lock.  */
 #define        LOCK_UN 8       /* Unlock.  */
+#define        __LOCK_ATOMIC   16      /* Atomic update.  */
 
 /* Can be OR'd in to one of the above.  */
 #define        LOCK_NB 4       /* Don't block when locking.  */
index 7b40650e6cc266e5969748af5856cb1f2ab550a0..914badb9ad6befb8b9555263c939d229be680378 100644 (file)
@@ -35,8 +35,8 @@ __f_setlk (int fd, int type, int whence, __off64_t start, __off64_t len, int wai
 
   switch (type)
     {
-    case F_RDLCK: cmd = LOCK_SH; break;
-    case F_WRLCK: cmd = LOCK_EX; break;
+    case F_RDLCK: cmd = LOCK_SH | __LOCK_ATOMIC; break;
+    case F_WRLCK: cmd = LOCK_EX | __LOCK_ATOMIC; break;
     case F_UNLCK: cmd = LOCK_UN; break;
     default:
       errno = EINVAL;