This problem can occur when multiple cluster services fail over at the same time, causing missing high-available exports. Having a lot of nfs-exports will trigger this issue easier. Signed-off-by: Steve Dickson <steved@xxxxxxxxxx> --- support/include/exportfs.h | 4 ++++ utils/exportfs/exportfs.c | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 0 deletions(-) diff --git a/support/include/exportfs.h b/support/include/exportfs.h index 01e87dd..99916e5 100644 --- a/support/include/exportfs.h +++ b/support/include/exportfs.h @@ -32,6 +32,10 @@ enum { FSLOC_STUB }; +#ifndef EXP_LOCKFILE +#define EXP_LOCKFILE "/var/lib/nfs/export-lock" +#endif + typedef struct mclient { struct mclient * m_next; char * m_hostname; diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c index 7432a65..769d438 100644 --- a/utils/exportfs/exportfs.c +++ b/utils/exportfs/exportfs.c @@ -16,6 +16,7 @@ #include <sys/stat.h> #include <sys/vfs.h> #include <sys/stat.h> +#include <sys/file.h> #include <unistd.h> #include <stdbool.h> #include <stdlib.h> @@ -44,6 +45,23 @@ static void validate_export(nfs_export *exp); static int matchhostname(const char *hostname1, const char *hostname2); static void export_d_read(const char *dname); +static const char *lockfile = EXP_LOCKFILE; +static int _lockfd = -1; + +void +grab_lockfile() +{ + _lockfd = open(lockfile, O_CREAT|O_RDWR, 0666); + if (_lockfd != -1) + lockf(_lockfd, F_LOCK, 0); +} +void +release_lockfile() +{ + if (_lockfd != -1) + lockf(_lockfd, F_ULOCK, 0); +} + int main(int argc, char **argv) { @@ -129,6 +147,12 @@ main(int argc, char **argv) return 0; } } + /* + * Serialize things as best we can + */ + grab_lockfile(); + atexit(release_lockfile); + if (f_export && ! f_ignore) { export_read(_PATH_EXPORTS); export_d_read(_PATH_EXPORTS_D); -- 1.7.7.6 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html