summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorneilbrown <neilbrown>2002-01-17 00:03:48 +0000
committerneilbrown <neilbrown>2002-01-17 00:03:48 +0000
commitde8fd61f8e692d5d8207d7c30e8914da05ca122f (patch)
tree59a4a86e1a067abb4b55d97ea371eb5529b33879
parent32972ee57afecb3974480b2ea0c3eafdc05b5286 (diff)
downloadnfs-utils-de8fd61f8e692d5d8207d7c30e8914da05ca122f.tar.gz
nfs-utils-de8fd61f8e692d5d8207d7c30e8914da05ca122f.tar.xz
nfs-utils-de8fd61f8e692d5d8207d7c30e8914da05ca122f.zip
See Changelog
-rw-r--r--ChangeLog13
-rw-r--r--support/nfs/exports.c33
-rw-r--r--utils/exportfs/exports.man32
3 files changed, 60 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index 59276dd..93d5ab8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2002-01-17 Adrian Drzewiecki <drze@MissionCriticalLinux.com>
+ NeilBrown <neilb@cse.unsw.edu.au>
+
+ * support/nfs/exports.c: remove NFSEXP_ASYNC as a default
+ flag so that "sync" becomes the default.
+ Check that either "sync" or "async" is given as an option
+ and warn if neither are present
+ * utils/exportfs/exports.man: change documentation for "sync"
+ to be documentation for "async".
+ * utils/exportfs/exportfs.man: note that "sync" is the default
+ rather than "async"
+
+
2002-01-02 Chip Salzenberg <chip@pobox.com>
* support/export/nfsctl.c (expsetup): Don't export entries that
diff --git a/support/nfs/exports.c b/support/nfs/exports.c
index 7e0decf..0dce25f 100644
--- a/support/nfs/exports.c
+++ b/support/nfs/exports.c
@@ -29,7 +29,7 @@
#include "xio.h"
#define EXPORT_DEFAULT_FLAGS \
- (NFSEXP_ASYNC|NFSEXP_READONLY|NFSEXP_ROOTSQUASH|NFSEXP_GATHERED_WRITES)
+ (NFSEXP_READONLY|NFSEXP_ROOTSQUASH|NFSEXP_GATHERED_WRITES)
static char *efname = NULL;
static XFILE *efp = NULL;
@@ -117,10 +117,8 @@ getexportent(int fromkernel)
return NULL;
}
*sp = '\0';
- if (parseopts(opt, &ee) < 0)
- return NULL;
} else {
- xlog(L_WARNING, "No options for %s %s: suggest %s() to avoid warning", ee.e_path, exp, exp);
+ xlog(L_WARNING, "No options for %s %s: suggest %s(sync) to avoid warning", ee.e_path, exp, exp);
}
if (strlen(exp) >= sizeof(ee.e_hostname)) {
syntaxerr("client name too long");
@@ -129,6 +127,9 @@ getexportent(int fromkernel)
strncpy(ee.e_hostname, exp, sizeof (ee.e_hostname) - 1);
ee.e_hostname[sizeof (ee.e_hostname) - 1] = '\0';
+ if (parseopts(opt, &ee) < 0)
+ return NULL;
+
/* resolve symlinks */
if (realpath(ee.e_path, rpath) != NULL) {
rpath[sizeof (rpath) - 1] = '\0';
@@ -266,7 +267,7 @@ mkexportent(char *hname, char *path, char *options)
ee.e_path[sizeof (ee.e_path) - 1] = '\0';
strncpy (ee.m_path, ee.e_path, sizeof (ee.m_path) - 1);
ee.m_path [sizeof (ee.m_path) - 1] = '\0';
- if (options && parseopts(options, &ee) < 0)
+ if (parseopts(options, &ee) < 0)
return NULL;
return &ee;
}
@@ -274,7 +275,7 @@ mkexportent(char *hname, char *path, char *options)
int
updateexportent(struct exportent *eep, char *options)
{
- if (options && parseopts(options, eep) < 0)
+ if (parseopts(options, eep) < 0)
return 0;
return 1;
}
@@ -285,12 +286,17 @@ updateexportent(struct exportent *eep, char *options)
static int
parseopts(char *cp, struct exportent *ep)
{
+ int had_sync_opt = 0;
squids = ep->e_squids; nsquids = ep->e_nsquids;
sqgids = ep->e_sqgids; nsqgids = ep->e_nsqgids;
+ if (!cp)
+ goto out;
+
while (isblank(*cp))
cp++;
+
while (*cp) {
char *opt = strdup(cp);
char *optstart = cp;
@@ -310,11 +316,13 @@ parseopts(char *cp, struct exportent *ep)
ep->e_flags &= ~NFSEXP_INSECURE_PORT;
else if (!strcmp(opt, "insecure"))
ep->e_flags |= NFSEXP_INSECURE_PORT;
- else if (!strcmp(opt, "sync"))
+ else if (!strcmp(opt, "sync")) {
+ had_sync_opt = 1;
ep->e_flags &= ~NFSEXP_ASYNC;
- else if (!strcmp(opt, "async"))
+ } else if (!strcmp(opt, "async")) {
+ had_sync_opt = 1;
ep->e_flags |= NFSEXP_ASYNC;
- else if (!strcmp(opt, "nohide"))
+ } else if (!strcmp(opt, "nohide"))
ep->e_flags |= NFSEXP_CROSSMNT;
else if (!strcmp(opt, "hide"))
ep->e_flags &= ~NFSEXP_CROSSMNT;
@@ -383,6 +391,13 @@ parseopts(char *cp, struct exportent *ep)
ep->e_nsquids = nsquids;
ep->e_nsqgids = nsqgids;
+out:
+ if (!had_sync_opt)
+ xlog(L_WARNING, "No 'sync' or 'async' option specified for export \"%s:%s\".\n"
+ " Assuming default behaviour ('sync').\n"
+ " NOTE: this default has changed from previous versions\n",
+ ep->e_hostname, ep->e_path);
+
return 1;
}
diff --git a/utils/exportfs/exports.man b/utils/exportfs/exports.man
index 5dcc809..97264cd 100644
--- a/utils/exportfs/exports.man
+++ b/utils/exportfs/exports.man
@@ -95,17 +95,31 @@ This can also be made explicit by using
the
.IR ro " option.
.TP
-.IR sync
-This option requests that all file writes be committed to disc before
-the write request completes. This is required for complete safety of
-data in the face of a server crash, but incurs a performance hit.
-The default is to allow the server to write the data out whenever it
-is ready. This can be explicitly requested with the
-.IR async " option.
+.IR async
+This option allows the NFS server to violate the NFS protocol and
+reply to requests before any changes made by that request have been
+committed to stable storage (e.g. disc drive).
+
+Using this option usually improves performance, but at the cost that
+an unclean server restart (i.e. a crash) can cause data to be lost or
+corrupted.
+
+In releases of nfs-utils upto and including 1.0.0, this option was the
+default. In this and future releases,
+.I sync
+is the default, and
+.I async
+must be explicit requested if needed.
+To help make system adminstrators aware of this change, 'exportfs'
+will issue a warning if neither
+.I sync
+nor
+.I async
+is specified.
.TP
.IR no_wdelay
-This option only has effect if
-.I sync
+This option has no effect if
+.I async
is also set. The NFS server will normally delay committing a write request
to disc slightly if it suspects that another related write request may be in
progress or may arrive soon. This allows multiple write requests to