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/export | |
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/export')
-rw-r--r-- | support/export/rmtab.c | 2 | ||||
-rw-r--r-- | support/export/xtab.c | 24 |
2 files changed, 14 insertions, 12 deletions
diff --git a/support/export/rmtab.c b/support/export/rmtab.c index e11a22a..b49e1aa 100644 --- a/support/export/rmtab.c +++ b/support/export/rmtab.c @@ -57,7 +57,7 @@ rmtab_read(void) file. */ int lockid; FILE *fp; - if ((lockid = xflock(_PATH_RMTAB, "w")) < 0) + if ((lockid = xflock(_PATH_RMTABLCK, "w")) < 0) return -1; rewindrmtabent(); if (!(fp = fsetrmtabent(_PATH_RMTABTMP, "w"))) { diff --git a/support/export/xtab.c b/support/export/xtab.c index 510765a..3b1dcce 100644 --- a/support/export/xtab.c +++ b/support/export/xtab.c @@ -23,7 +23,7 @@ static void cond_rename(char *newfile, char *oldfile); static int -xtab_read(char *xtab, int is_export) +xtab_read(char *xtab, char *lockfn, int is_export) { /* is_export == 0 => reading /proc/fs/nfs/exports - we know these things are exported to kernel * is_export == 1 => reading /var/lib/nfs/etab - these things are allowed to be exported @@ -33,7 +33,7 @@ xtab_read(char *xtab, int is_export) nfs_export *exp; int lockid; - if ((lockid = xflock(xtab, "r")) < 0) + if ((lockid = xflock(lockfn, "r")) < 0) return 0; setexportent(xtab, "r"); while ((xp = getexportent(is_export==0, 0)) != NULL) { @@ -66,18 +66,20 @@ xtab_mount_read(void) int fd; if ((fd=open(_PATH_PROC_EXPORTS, O_RDONLY))>=0) { close(fd); - return xtab_read(_PATH_PROC_EXPORTS, 0); + return xtab_read(_PATH_PROC_EXPORTS, + _PATH_PROC_EXPORTS, 0); } else if ((fd=open(_PATH_PROC_EXPORTS_ALT, O_RDONLY) >= 0)) { close(fd); - return xtab_read(_PATH_PROC_EXPORTS_ALT, 0); + return xtab_read(_PATH_PROC_EXPORTS_ALT, + _PATH_PROC_EXPORTS_ALT, 0); } else - return xtab_read(_PATH_XTAB, 2); + return xtab_read(_PATH_XTAB, _PATH_XTABLCK, 2); } int xtab_export_read(void) { - return xtab_read(_PATH_ETAB, 1); + return xtab_read(_PATH_ETAB, _PATH_ETABLCK, 1); } /* @@ -87,13 +89,13 @@ xtab_export_read(void) * fix the auth_reload logic as well... */ static int -xtab_write(char *xtab, char *xtabtmp, int is_export) +xtab_write(char *xtab, char *xtabtmp, char *lockfn, int is_export) { struct exportent xe; nfs_export *exp; int lockid, i; - if ((lockid = xflock(xtab, "w")) < 0) { + if ((lockid = xflock(lockfn, "w")) < 0) { xlog(L_ERROR, "can't lock %s for writing", xtab); return 0; } @@ -124,13 +126,13 @@ xtab_write(char *xtab, char *xtabtmp, int is_export) int xtab_export_write() { - return xtab_write(_PATH_ETAB, _PATH_ETABTMP, 1); + return xtab_write(_PATH_ETAB, _PATH_ETABTMP, _PATH_ETABLCK, 1); } int xtab_mount_write() { - return xtab_write(_PATH_XTAB, _PATH_XTABTMP, 0); + return xtab_write(_PATH_XTAB, _PATH_XTABTMP, _PATH_XTABLCK, 0); } void @@ -139,7 +141,7 @@ xtab_append(nfs_export *exp) struct exportent xe; int lockid; - if ((lockid = xflock(_PATH_XTAB, "w")) < 0) + if ((lockid = xflock(_PATH_XTABLCK, "w")) < 0) return; setexportent(_PATH_XTAB, "a"); xe = exp->m_export; |