summaryrefslogtreecommitdiffstats
path: root/sys-utils/flock.c
diff options
context:
space:
mode:
authorPetr Uzel2011-09-15 10:19:17 +0200
committerKarel Zak2011-09-27 15:02:44 +0200
commit87d83b6ad2e52a3c867fe2f758e4eccaea145a10 (patch)
tree8070b155cb22cffecba1338048e18f383e7bbd73 /sys-utils/flock.c
parentbuild-sys: add path.h to Makefile.am (diff)
downloadkernel-qcow2-util-linux-87d83b6ad2e52a3c867fe2f758e4eccaea145a10.tar.gz
kernel-qcow2-util-linux-87d83b6ad2e52a3c867fe2f758e4eccaea145a10.tar.xz
kernel-qcow2-util-linux-87d83b6ad2e52a3c867fe2f758e4eccaea145a10.zip
flock: make flock(1) work on NFSv4
To pleace an exclusive lock on a file, NFSv4 requires the file to be opened RW because of the emulation of flock() by fcntl(): http://www.spinics.net/lists/linux-nfs/msg18502.html So instead of O_RDONLY, open the file in O_RDWR if access() indicates it is possible (unless shared lock is requested). From: Michal Kubecek <mkubecek@suse.cz> Signed-off-by: Petr Uzel <petr.uzel@suse.cz>
Diffstat (limited to 'sys-utils/flock.c')
-rw-r--r--sys-utils/flock.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/sys-utils/flock.c b/sys-utils/flock.c
index 7d321de0d..a5003193e 100644
--- a/sys-utils/flock.c
+++ b/sys-utils/flock.c
@@ -129,6 +129,7 @@ int main(int argc, char *argv[])
int have_timeout = 0;
int type = LOCK_EX;
int block = 0;
+ int open_accmode;
int fd = -1;
int opt, ix;
int do_close = 0;
@@ -211,9 +212,11 @@ int main(int argc, char *argv[])
}
filename = argv[optind];
- fd = open(filename, O_RDONLY|O_NOCTTY|O_CREAT, 0666);
+ open_accmode = ((type == LOCK_SH || access(filename, R_OK|W_OK) < 0) ?
+ O_RDONLY : O_RDWR);
+ fd = open(filename, open_accmode|O_NOCTTY|O_CREAT, 0666);
/* Linux doesn't like O_CREAT on a directory, even though it should be a
- no-op */
+ no-op; POSIX doesn't allow O_RDWR or O_WRONLY */
if (fd < 0 && errno == EISDIR)
fd = open(filename, O_RDONLY|O_NOCTTY);