]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/nfs/exports.c
Change default from subtree_check to no_subtree_check
[nfs-utils.git] / support / nfs / exports.c
index 9b010dc6901e6e7ef51e4f865c778ae522676233..60cfe48d6f58038f294c4fb2d4c33739c85859dd 100644 (file)
@@ -32,7 +32,7 @@
 #include "xio.h"
 
 #define EXPORT_DEFAULT_FLAGS   \
-  (NFSEXP_READONLY|NFSEXP_ROOTSQUASH|NFSEXP_GATHERED_WRITES)
+  (NFSEXP_READONLY|NFSEXP_ROOTSQUASH|NFSEXP_GATHERED_WRITES|NFSEXP_NOSUBTREECHECK)
 
 int export_errno;
 
@@ -100,6 +100,8 @@ getexportent(int fromkernel, int fromexports)
                def_ee.e_squids = NULL;
                def_ee.e_sqgids = NULL;
                def_ee.e_mountpoint = NULL;
+               def_ee.e_fslocmethod = FSLOC_NONE;
+               def_ee.e_fslocdata = NULL;
                def_ee.e_nsquids = 0;
                def_ee.e_nsqgids = 0;
 
@@ -220,10 +222,27 @@ putexportent(struct exportent *ep)
        if (ep->e_flags & NFSEXP_FSID) {
                fprintf(fp, "fsid=%d,", ep->e_fsid);
        }
+       if (ep->e_uuid)
+               fprintf(fp, "fsid=%s,", ep->e_uuid);
        if (ep->e_mountpoint)
                fprintf(fp, "mountpoint%s%s,",
                        ep->e_mountpoint[0]?"=":"", ep->e_mountpoint);
-
+       switch (ep->e_fslocmethod) {
+       case FSLOC_NONE:
+               break;
+       case FSLOC_REFER:
+               fprintf(fp, "refer=%s,", ep->e_fslocdata);
+               break;
+       case FSLOC_REPLICA:
+               fprintf(fp, "replicas=%s,", ep->e_fslocdata);
+               break;
+       case FSLOC_STUB:
+               fprintf(fp, "fsloc=stub,");
+               break;
+       default:
+               xlog(L_ERROR, "unknown fsloc method for %s:%s",
+                    ep->e_hostname, ep->e_path);
+       }
        fprintf(fp, "mapping=");
        switch (ep->e_maptype) {
        case CLE_MAP_IDENT:
@@ -286,6 +305,8 @@ dupexportent(struct exportent *dst, struct exportent *src)
        }
        if (src->e_mountpoint)
                dst->e_mountpoint = strdup(src->e_mountpoint);
+       if (src->e_fslocdata)
+               dst->e_fslocdata = strdup(src->e_fslocdata);
 }
 
 struct exportent *
@@ -300,8 +321,11 @@ mkexportent(char *hname, char *path, char *options)
        ee.e_squids = NULL;
        ee.e_sqgids = NULL;
        ee.e_mountpoint = NULL;
+       ee.e_fslocmethod = FSLOC_NONE;
+       ee.e_fslocdata = NULL;
        ee.e_nsquids = 0;
        ee.e_nsqgids = 0;
+       ee.e_uuid = NULL;
 
        if (strlen(hname) >= sizeof(ee.e_hostname)) {
                xlog(L_WARNING, "client name %s too long", hname);
@@ -330,6 +354,17 @@ updateexportent(struct exportent *eep, char *options)
        return 1;
 }
 
+
+static int valid_uuid(char *uuid)
+{
+       /* must have 32 hex digits */
+       int cnt;
+       for (cnt = 0 ; *uuid; uuid++)
+               if (isxdigit(*uuid))
+                       cnt++;
+       return cnt == 32;
+}
+
 /*
  * Parse option string pointed to by cp and set mount options accordingly.
  */
@@ -445,13 +480,21 @@ bad_option:
                        }
                } else if (strncmp(opt, "fsid=", 5) == 0) {
                        char *oe;
-                       ep->e_fsid = strtoul(opt+5, &oe, 0);
-                       if (opt[5]=='\0' || *oe != '\0') {
-                               xlog(L_ERROR, "%s: %d: bad fsid \"%s\"\n",
-                                    flname, flline, opt);      
-                               goto bad_option;
+                       if (strcmp(opt+5, "root") == 0) {
+                               ep->e_fsid = 0;
+                               ep->e_flags |= NFSEXP_FSID;
+                       } else {
+                               ep->e_fsid = strtoul(opt+5, &oe, 0);
+                               if (opt[5]!='\0' && *oe == '\0') 
+                                       ep->e_flags |= NFSEXP_FSID;
+                               else if (valid_uuid(opt+5))
+                                       ep->e_uuid = strdup(opt+7);
+                               else {
+                                       xlog(L_ERROR, "%s: %d: bad fsid \"%s\"\n",
+                                            flname, flline, opt);      
+                                       goto bad_option;
+                               }
                        }
-                       ep->e_flags |= NFSEXP_FSID;
                } else if (strcmp(opt, "mountpoint")==0 ||
                           strcmp(opt, "mp") == 0 ||
                           strncmp(opt, "mountpoint=", 11)==0 ||
@@ -461,6 +504,20 @@ bad_option:
                                ep->e_mountpoint = strdup(mp+1);
                        else
                                ep->e_mountpoint = strdup("");
+               } else if (strncmp(opt, "fsloc=", 6) == 0) {
+                       if (strcmp(opt+6, "stub") == 0)
+                               ep->e_fslocmethod = FSLOC_STUB;
+                       else {
+                               xlog(L_ERROR, "%s:%d: bad option %s\n",
+                                    flname, flline, opt);
+                               goto bad_option;
+                       }
+               } else if (strncmp(opt, "refer=", 6) == 0) {
+                       ep->e_fslocmethod = FSLOC_REFER;
+                       ep->e_fslocdata = strdup(opt+6);
+               } else if (strncmp(opt, "replicas=", 9) == 0) {
+                       ep->e_fslocmethod = FSLOC_REPLICA;
+                       ep->e_fslocdata = strdup(opt+9);
                } else {
                        xlog(L_ERROR, "%s:%d: unknown keyword \"%s\"\n",
                                        flname, flline, opt);
@@ -480,8 +537,8 @@ bad_option:
 out:
        if (warn && !had_subtree_opt)
                xlog(L_WARNING, "%s [%d]: Neither 'subtree_check' or 'no_subtree_check' specified for export \"%s:%s\".\n"
-                               "  Assuming default behaviour ('subtree_check').\n"
-                               "  NOTE: this default will change with nfs-utils version 1.1.0\n",
+                               "  Assuming default behaviour ('no_subtree_check').\n"
+                               "  NOTE: this default has changed since nfs-utils version 1.0.x\n",
 
                                flname, flline,
                                ep->e_hostname, ep->e_path);