svn commit: r364831 - head/usr.bin/lockf

Colin Percival cperciva at FreeBSD.org
Wed Aug 26 19:26:49 UTC 2020


Author: cperciva
Date: Wed Aug 26 19:26:48 2020
New Revision: 364831
URL: https://svnweb.freebsd.org/changeset/base/364831

Log:
  Add -w option to lockf(1).
  
  By default, lockf(1) opens its lock file O_RDONLY|O_EXLOCK.  On NFS, if the
  file already exists, this is split into opening the file read-only and then
  requesting an exclusive lock -- and the second step fails because NFS does
  not permit exclusive locking on files which are opened read-only.
  
  The new -w option changes the open flags to O_WRONLY|O_EXLOCK, allowing it
  to work on NFS -- at the cost of not working if the file cannot be opened
  for writing.
  
  (Whether the traditional BSD behaviour of allowing exclusive locks to be
  obtained on a file which cannot be opened for writing is a good idea is
  perhaps questionable since it may allow less-privileged users to perform
  a local denial of service; however this behaviour has been present for a
  long time and changing it now seems like it would cause problems.)
  
  Reviewed by:	rmacklem
  Differential Revision:	https://reviews.freebsd.org/D26005

Modified:
  head/usr.bin/lockf/lockf.1
  head/usr.bin/lockf/lockf.c

Modified: head/usr.bin/lockf/lockf.1
==============================================================================
--- head/usr.bin/lockf/lockf.1	Wed Aug 26 19:03:15 2020	(r364830)
+++ head/usr.bin/lockf/lockf.1	Wed Aug 26 19:26:48 2020	(r364831)
@@ -1,4 +1,4 @@
-.\"
+ .\"
 .\" Copyright (C) 1998 John D. Polstra.  All rights reserved.
 .\"
 .\" Redistribution and use in source and binary forms, with or without
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd June 18, 2020
+.Dd August 26, 2020
 .Dt LOCKF 1
 .Os
 .Sh NAME
@@ -32,7 +32,7 @@
 .Nd execute a command while holding a file lock
 .Sh SYNOPSIS
 .Nm
-.Op Fl kns
+.Op Fl knsw
 .Op Fl t Ar seconds
 .Ar file
 .Ar command
@@ -121,6 +121,14 @@ When a lock times out,
 is
 .Em not
 executed.
+.It Fl w
+Causes
+.Nm
+to open
+.Ar file
+for writing rather than reading.
+This is necessary on filesystems (including NFSv4) where a file which
+has been opened read-only cannot be exclusively locked.
 .El
 .Pp
 In no event will

Modified: head/usr.bin/lockf/lockf.c
==============================================================================
--- head/usr.bin/lockf/lockf.c	Wed Aug 26 19:03:15 2020	(r364830)
+++ head/usr.bin/lockf/lockf.c	Wed Aug 26 19:26:48 2020	(r364831)
@@ -62,9 +62,9 @@ main(int argc, char **argv)
 	pid_t child;
 
 	silent = keep = 0;
-	flags = O_CREAT;
+	flags = O_CREAT | O_RDONLY;
 	waitsec = -1;	/* Infinite. */
-	while ((ch = getopt(argc, argv, "sknt:")) != -1) {
+	while ((ch = getopt(argc, argv, "sknt:w")) != -1) {
 		switch (ch) {
 		case 'k':
 			keep = 1;
@@ -84,6 +84,9 @@ main(int argc, char **argv)
 				    "invalid timeout \"%s\"", optarg);
 		}
 			break;
+		case 'w':
+			flags = (flags & ~O_RDONLY) | O_WRONLY;
+			break;
 		default:
 			usage();
 		}
@@ -171,7 +174,7 @@ acquire_lock(const char *name, int flags)
 {
 	int fd;
 
-	if ((fd = open(name, O_RDONLY|O_EXLOCK|flags, 0666)) == -1) {
+	if ((fd = open(name, O_EXLOCK|flags, 0666)) == -1) {
 		if (errno == EAGAIN || errno == EINTR)
 			return (-1);
 		else if (errno == ENOENT && (flags & O_CREAT) == 0)


More information about the svn-src-head mailing list