Make F_RDLCK/F_WRLCK atomic
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Fri, 26 Jan 2018 22:35:29 +0000 (22:35 +0000)
committerAurelien Jarno <aurel32@debian.org>
Fri, 26 Jan 2018 22:35:29 +0000 (22:35 +0000)
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.

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

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

index 3ee0c445f21703e9bbe3246b0c1a0d6bae2f5ca4..af4f9833d643a306038991505f5a9c9ff5a3d3cd 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 174e408edcea1e916056176232a58360480d946e..20c9bfc766088c95e4239d1ca4095daeb2b227ad 100644 (file)
@@ -150,8 +150,8 @@ __libc_fcntl (int fd, int cmd, ...)
          }
        switch (fl->l_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;