From owner-svn-src-head@freebsd.org Wed Aug 26 19:26:49 2020 Return-Path: Delivered-To: svn-src-head@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 21DDE3B9936; Wed, 26 Aug 2020 19:26:49 +0000 (UTC) (envelope-from cperciva@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4BcG7s02PQz4X4g; Wed, 26 Aug 2020 19:26:49 +0000 (UTC) (envelope-from cperciva@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id D432818286; Wed, 26 Aug 2020 19:26:48 +0000 (UTC) (envelope-from cperciva@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 07QJQmns099755; Wed, 26 Aug 2020 19:26:48 GMT (envelope-from cperciva@FreeBSD.org) Received: (from cperciva@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 07QJQm9V099752; Wed, 26 Aug 2020 19:26:48 GMT (envelope-from cperciva@FreeBSD.org) Message-Id: <202008261926.07QJQm9V099752@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cperciva set sender to cperciva@FreeBSD.org using -f From: Colin Percival Date: Wed, 26 Aug 2020 19:26:48 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r364831 - head/usr.bin/lockf X-SVN-Group: head X-SVN-Commit-Author: cperciva X-SVN-Commit-Paths: head/usr.bin/lockf X-SVN-Commit-Revision: 364831 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 26 Aug 2020 19:26:49 -0000 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)