diff options
author | Ben Myers <bpm@sgi.com> | 2009-04-03 15:13:10 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2009-04-03 15:13:10 -0400 |
commit | f0ed8401e854e1cbd23b2fb5dca5e88dec2df7c4 (patch) | |
tree | e525bec15e10a3c984dbc6b26b075a7433e0d417 /support/nfs/xio.c | |
parent | c56152202a3000c69b87f9cb90f40166f1f21275 (diff) | |
download | nfs-utils-f0ed8401e854e1cbd23b2fb5dca5e88dec2df7c4.tar.gz nfs-utils-f0ed8401e854e1cbd23b2fb5dca5e88dec2df7c4.tar.xz nfs-utils-f0ed8401e854e1cbd23b2fb5dca5e88dec2df7c4.zip |
Mountd should use separate lockfiles
Mountd keeps file descriptors used for locks separate from
those used for io and seems to assume that the lock will
only be released on close of the file descriptor that was used
with fcntl. Actually the lock is released when any file
descriptor for that file is closed. When setexportent() is called
after xflock() he closes and reopens the io file descriptor and defeats the
lock.
This patch fixes that by using a separate file for locking, cleaning
them up when finished.
Signed-off-by: Ben Myers <bpm@sgi.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'support/nfs/xio.c')
-rw-r--r-- | support/nfs/xio.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/support/nfs/xio.c b/support/nfs/xio.c index f21f5f0..5e2e1e9 100644 --- a/support/nfs/xio.c +++ b/support/nfs/xio.c @@ -17,6 +17,7 @@ #include <ctype.h> #include <signal.h> #include <unistd.h> +#include <errno.h> #include "xmalloc.h" #include "xlog.h" #include "xio.h" @@ -54,16 +55,16 @@ xflock(char *fname, char *type) { struct sigaction sa, oldsa; int readonly = !strcmp(type, "r"); - mode_t mode = (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); struct flock fl = { readonly? F_RDLCK : F_WRLCK, SEEK_SET, 0, 0, 0 }; int fd; if (readonly) - fd = open(fname, O_RDONLY); + fd = open(fname, (O_RDONLY|O_CREAT), 0600); else - fd = open(fname, (O_RDWR|O_CREAT), mode); + fd = open(fname, (O_RDWR|O_CREAT), 0600); if (fd < 0) { - xlog(L_WARNING, "could not open %s for locking", fname); + xlog(L_WARNING, "could not open %s for locking: errno %d (%s)", + fname, errno, strerror(errno)); return -1; } @@ -74,7 +75,8 @@ xflock(char *fname, char *type) alarm(10); if (fcntl(fd, F_SETLKW, &fl) < 0) { alarm(0); - xlog(L_WARNING, "failed to lock %s", fname); + xlog(L_WARNING, "failed to lock %s: errno %d (%s)", + fname, errno, strerror(errno)); close(fd); fd = 0; } else { |