+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
#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;
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");
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';
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 ⅇ
}
int
updateexportent(struct exportent *eep, char *options)
{
- if (options && parseopts(options, eep) < 0)
+ if (parseopts(options, eep) < 0)
return 0;
return 1;
}
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;
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;
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;
}
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