* libamu/mount_fs.c (compute_nfs_attrcache_flags): make sure code
authorErez Zadok <ezk@cs.sunysb.edu>
Fri, 14 Jan 2005 02:47:52 +0000 (02:47 +0000)
committerErez Zadok <ezk@cs.sunysb.edu>
Fri, 14 Jan 2005 02:47:52 +0000 (02:47 +0000)
compiles even for systems that don't have the nfs_args
ac{reg,dir}{min,max} fields.

* amd/amfs_toplvl.c (set_auto_attrcache_timeout): just to be safe,
add "noac" if amd.conf option auto_attrcache was set to 0.  This
should hopefully make the compute_nfs_attrcache_flags patch even
safer.

* libamu/mount_fs.c (compute_nfs_attrcache_flags): separate
function to compute attribute-cache values.  This function now
computes attribute-cache flags for BOTH Amd's automount points
(NFS) as well as any normal NFS mount that Amd performs.
(compute_nfs_args, compute_automounter_nfs_args): call
compute_nfs_attrcache_flags to figure out attribute-cache related
flags.  Patch from Christos Zoulas <christos@zoulas.com>.

auto_attrcache.  Add warning to auto_attrcache use in case of
ESTALE.
options domain_strip and auto_attrcache.  Add warning to
auto_attrcache use in case of ESTALE.

AUTHORS
ChangeLog
NEWS
amd/amfs_toplvl.c
doc/am-utils.texi
libamu/mount_fs.c
scripts/amd.conf.5

diff --git a/AUTHORS b/AUTHORS
index c98afaccb49a59d457d4924c8563f819f68511d9..0882f5b30e6fac0dde60486356e039d3ded9916a 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -175,7 +175,7 @@ April 12, 2003: support new "unmount" option, useful to timeout removable
 local media mounts.
 
 October 12, 2004: patch to support two new amd.conf options, domain_strip
-and auto_attrcache.
+and auto_attrcache.  Patch to cleanup NFS attribute-cache flag computation.
 
 * Bill Paul <wpaul@ctr.columbia.edu>
 
index ac290539199433aa7b2a0b81bef1fe3f9cd1b22d..e171d77f1b048f3be436e4963ba8ce6ac99e1d8d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,13 +1,32 @@
 2005-01-13  Erez Zadok  <ezk@cs.sunysb.edu>
 
+       * libamu/mount_fs.c (compute_nfs_attrcache_flags): make sure code
+       compiles even for systems that don't have the nfs_args
+       ac{reg,dir}{min,max} fields.
+
+       * amd/amfs_toplvl.c (set_auto_attrcache_timeout): just to be safe,
+       add "noac" if amd.conf option auto_attrcache was set to 0.  This
+       should hopefully make the compute_nfs_attrcache_flags patch even
+       safer.
+
+       * libamu/mount_fs.c (compute_nfs_attrcache_flags): separate
+       function to compute attribute-cache values.  This function now
+       computes attribute-cache flags for BOTH Amd's automount points
+       (NFS) as well as any normal NFS mount that Amd performs.
+       (compute_nfs_args, compute_automounter_nfs_args): call
+       compute_nfs_attrcache_flags to figure out attribute-cache related
+       flags.  Patch from Christos Zoulas <christos@zoulas.com>.
+
        * scripts/amd.conf-sample: show examples of new global options
        domain_strip and auto_attrcache.
 
        * scripts/amd.conf.5: document new global options domain_strip and
-       auto_attrcache.
+       auto_attrcache.  Add warning to auto_attrcache use in case of
+       ESTALE.
 
        * doc/am-utils.texi: minor cleanups and document new global
-       options domain_strip and auto_attrcache.
+       options domain_strip and auto_attrcache.  Add warning to
+       auto_attrcache use in case of ESTALE.
 
        * amd/conf.c (gopt_auto_attrcache): parse new global amd.conf
        option auto_attrcache.
diff --git a/NEWS b/NEWS
index 631a89f2f57a88d1ca5becbf46a8382a739e2892..5b9a60426607b64f17b39bdae1785d851690abfb 100644 (file)
--- a/NEWS
+++ b/NEWS
   (often 127.0.0.1) address Amd uses to connect to for the local NFS server
   and RPC server.
 
+- new amd.conf [global] parameter: domain_strip (default "yes").  If set to
+  "no," Amd won't strip domain names from host names, which is useful if
+  your Amd maps are served by multiple domains and you want to tell from the
+  logs which exact host did what.
+
+- new amd.conf [global] parameter: auto_attrcache (default to 0).  Sets
+  Amd's own NFS attribute-cache timeout in seconds.  A value of 0 turns off
+  attribute caching, meaning that Amd will be consulted via a kernel-RPC
+  each time someone stat's the mount point (which could be abused as a
+  denial-of-service attack).  If you're concerned, set this to something
+  greater than zero (a value of 1 second is currently recommended).
+  Warning: if you set this option to any non-zero value, especially a large
+  value, and you get ESTALE errors on your particular OS, then set this
+  value back to 0 seconds.
+
 - fully support WebNFS as per RFC 2054.  It now tries v3/TCP first, falling
   back to v2/UDP if this doesn't work.  The "webnfs" pseudo-mount options
   has been renamed (again) to "public" to match Solaris 2.
index 42d04555de42fba8b7e3f01ed9131bd14814def2..7b3d11912e848a8b9f138c9601d80d57561a0c3b 100644 (file)
@@ -37,7 +37,7 @@
  * SUCH DAMAGE.
  *
  *
- * $Id: amfs_toplvl.c,v 1.35 2005/01/14 01:14:00 ezk Exp $
+ * $Id: amfs_toplvl.c,v 1.36 2005/01/14 02:47:52 ezk Exp $
  *
  */
 
@@ -89,6 +89,26 @@ am_ops amfs_toplvl_ops =
 static void
 set_auto_attrcache_timeout(char *preopts, char *opts)
 {
+
+#ifdef MNTTAB_OPT_NOAC
+  /*
+   * Don't cache attributes - they are changing under the kernel's feet.
+   * For example, IRIX5.2 will dispense with nfs lookup calls and hand stale
+   * filehandles to getattr unless we disable attribute caching on the
+   * automount points.
+   */
+  if (gopt.auto_attrcache == 0) {
+    sprintf(preopts, ",%s", MNTTAB_OPT_NOAC);
+    strcat(opts, preopts);
+  }
+#endif /* MNTTAB_OPT_NOAC */
+
+  /*
+   * XXX: note that setting these to 0 in the past resulted in an error on
+   * some systems, which is why it's better to use "noac" if possible.  For
+   * now, we're setting everything possible, but if this will cause trouble,
+   * then we'll have to condition the remainder of this on OPT_NOAC.
+   */
 #ifdef MNTTAB_OPT_ACTIMEO
   sprintf(preopts, ",%s=%d", MNTTAB_OPT_ACTIMEO, gopt.auto_attrcache);
   strcat(opts, preopts);
index 75d2c6ad97bd5c68a2f53945e018cbc114b8eb15..6492c846be5dc2884fd15a961e4d4416bb60ae17 100644 (file)
@@ -38,7 +38,7 @@
 @c
 @c      %W% (Berkeley) %G%
 @c
-@c $Id: am-utils.texi,v 1.89 2005/01/14 01:14:00 ezk Exp $
+@c $Id: am-utils.texi,v 1.90 2005/01/14 02:47:52 ezk Exp $
 @c
 @setfilename am-utils.info
 
@@ -4248,6 +4248,9 @@ attribute cache timeout for @i{Amd}'s own automount points.  A value
 of 0 turns off attribute caching, meaning that @i{Amd} will be
 consulted via a kernel-RPC each time someone stat's the mount point
 (which could be abused as a denial-of-service attack).
+@emph{WARNING}: if you set this option to any non-zero value,
+especially a large value, and you get ESTALE errors on your particular
+OS, then set this value back to 0 seconds.
 
 @c ----------------------------------------------------------------
 @node auto_dir Parameter, cache_duration Parameter, auto_attrcache Parameter, Global Parameters
@@ -8261,4 +8264,4 @@ All other registered trademarks are owned by their respective owners.
 @c LocalWords:  texinfo texi ib sp cartouche ified xlatecookie dircategory sc
 @c LocalWords:  AddInfo suse Novell softlookup ENOENT USB fullybrowsable LDAPv
 @c LocalWords:  amy ie xfffffe zebedee andrew diskfull hdmail searchable si
-@c LocalWords:  Orth
+@c LocalWords:  Orth ESTALE
index 126248c875c8da62ab27a0ae99954930d99c43df..7c824444a030c22adf6df78114ec78843b908f2a 100644 (file)
@@ -37,7 +37,7 @@
  * SUCH DAMAGE.
  *
  *
- * $Id: mount_fs.c,v 1.44 2005/01/13 21:24:12 ezk Exp $
+ * $Id: mount_fs.c,v 1.45 2005/01/14 02:47:52 ezk Exp $
  *
  */
 
@@ -323,6 +323,94 @@ again:
 }
 
 
+/*
+ * Compute all NFS attribute cache related flags separately.  Note that this
+ * function now computes attribute-cache flags for both Amd's automount
+ * points (NFS) as well as any normal NFS mount that Amd performs.  Edit
+ * with caution.
+ */
+static void
+compute_nfs_attrcache_flags(nfs_args_t *nap, mntent_t *mntp)
+{
+  int acval = 0;
+
+  /************************************************************************/
+  /*** ATTRIBUTE CACHES                                                ***/
+  /************************************************************************/
+  /*
+   * acval is set to 0 at the top of the function.  If actimeo mount option
+   * exists and defined in mntopts, then it acval is set to it.
+   * If the value is non-zero, then we set all attribute cache fields to it.
+   * If acval is zero, it means it was never defined in mntopts or the
+   * actimeo mount option does not exist, in which case we check for
+   * individual mount options per attribute cache.
+   * Regardless of the value of acval, mount flags are set based directly
+   * on the values of the attribute caches.
+   */
+#ifdef MNTTAB_OPT_ACTIMEO
+  acval = hasmntval(mntp, MNTTAB_OPT_ACTIMEO); /* attr cache timeout (sec) */
+#endif /* MNTTAB_OPT_ACTIMEO */
+
+  if (acval) {
+#ifdef HAVE_NFS_ARGS_T_ACREGMIN
+    nap->acregmin = acval;     /* min ac timeout for reg files (sec) */
+    nap->acregmax = acval;     /* max ac timeout for reg files (sec) */
+#endif /* HAVE_NFS_ARGS_T_ACREGMIN */
+#ifdef HAVE_NFS_ARGS_T_ACDIRMIN
+    nap->acdirmin = acval;     /* min ac timeout for dirs (sec) */
+    nap->acdirmax = acval;     /* max ac timeout for dirs (sec) */
+#endif /* HAVE_NFS_ARGS_T_ACDIRMIN */
+  } else {
+#ifdef HAVE_NFS_ARGS_T_ACREGMIN
+# ifdef MNTTAB_OPT_ACREGMIN
+    nap->acregmin = hasmntval(mntp, MNTTAB_OPT_ACREGMIN);
+# else /* not MNTTAB_OPT_ACREGMIN */
+    nap->acregmin = 0;
+# endif /* not MNTTAB_OPT_ACREGMIN */
+# ifdef MNTTAB_OPT_ACREGMAX
+    nap->acregmax = hasmntval(mntp, MNTTAB_OPT_ACREGMAX);
+# else /* not MNTTAB_OPT_ACREGMAX */
+    nap->acregmax = 0;
+# endif /* not MNTTAB_OPT_ACREGMAX */
+#endif /* HAVE_NFS_ARGS_T_ACREGMIN */
+#ifdef HAVE_NFS_ARGS_T_ACDIRMIN
+# ifdef MNTTAB_OPT_ACDIRMIN
+    nap->acdirmin = hasmntval(mntp, MNTTAB_OPT_ACDIRMIN);
+# else /* not MNTTAB_OPT_ACDIRMIN */
+    nap->acdirmin = 0;
+# endif /* not MNTTAB_OPT_ACDIRMIN */
+# ifdef MNTTAB_OPT_ACDIRMAX
+    nap->acdirmax = hasmntval(mntp, MNTTAB_OPT_ACDIRMAX);
+# else /* not MNTTAB_OPT_ACDIRMAX */
+    nap->acdirmax = 0;
+# endif /* not MNTTAB_OPT_ACDIRMAX */
+#endif /* HAVE_NFS_ARGS_T_ACDIRMIN */
+  } /* end of "if (acval)" statement */
+
+#ifdef MNT2_NFS_OPT_ACREGMIN
+  if (nap->acregmin)
+    nap->flags |= MNT2_NFS_OPT_ACREGMIN;
+#endif /* MNT2_NFS_OPT_ACREGMIN */
+#ifdef MNT2_NFS_OPT_ACREGMAX
+  if (nap->acregmax)
+    nap->flags |= MNT2_NFS_OPT_ACREGMAX;
+#endif /* MNT2_NFS_OPT_ACREGMAX */
+#ifdef MNT2_NFS_OPT_ACDIRMIN
+  if (nap->acdirmin)
+    nap->flags |= MNT2_NFS_OPT_ACDIRMIN;
+#endif /* MNT2_NFS_OPT_ACDIRMIN */
+#ifdef MNT2_NFS_OPT_ACDIRMAX
+  if (nap->acdirmax)
+    nap->flags |= MNT2_NFS_OPT_ACDIRMAX;
+#endif /* MNT2_NFS_OPT_ACDIRMAX */
+
+#ifdef MNTTAB_OPT_NOAC         /* don't cache attributes */
+  if (amu_hasmntopt(mntp, MNTTAB_OPT_NOAC) != NULL)
+    nap->flags |= MNT2_NFS_OPT_NOAC;
+#endif /* MNTTAB_OPT_NOAC */
+}
+
+
 /*
  * Fill in the many possible fields and flags of struct nfs_args.
  *
@@ -340,11 +428,12 @@ again:
 void
 compute_nfs_args(nfs_args_t *nap, mntent_t *mntp, int genflags, struct netconfig *nfsncp, struct sockaddr_in *ip_addr, u_long nfs_version, char *nfs_proto, am_nfs_handle_t *fhp, char *host_name, char *fs_name)
 {
-  int acval = 0;
-
   /* initialize just in case */
   memset((voidp) nap, 0, sizeof(nfs_args_t));
 
+  /* compute all of the NFS attribute-cache flags */
+  compute_nfs_attrcache_flags(nap, mntp);
+
   /************************************************************************/
   /*** FILEHANDLE DATA AND LENGTH                                      ***/
   /************************************************************************/
@@ -398,69 +487,6 @@ compute_nfs_args(nfs_args_t *nap, mntent_t *mntp, int genflags, struct netconfig
   nap->flags |= MNT2_NFS_OPT_HOSTNAME;
 #endif /* MNT2_NFS_OPT_HOSTNAME */
 
-  /************************************************************************/
-  /*** ATTRIBUTE CACHES                                                ***/
-  /************************************************************************/
-  /*
-   * acval is set to 0 at the top of the function.  If actimeo mount option
-   * exists and defined in mntopts, then it acval is set to it.
-   * If the value is non-zero, then we set all attribute cache fields to it.
-   * If acval is zero, it means it was never defined in mntopts or the
-   * actimeo mount option does not exist, in which case we check for
-   * individual mount options per attribute cache.
-   * Regardless of the value of acval, mount flags are set based directly
-   * on the values of the attribute caches.
-   */
-#ifdef MNTTAB_OPT_ACTIMEO
-  acval = hasmntval(mntp, MNTTAB_OPT_ACTIMEO); /* attr cache timeout (sec) */
-#endif /* MNTTAB_OPT_ACTIMEO */
-
-  if (acval) {
-#ifdef HAVE_NFS_ARGS_T_ACREGMIN
-    nap->acregmin = acval;     /* min ac timeout for reg files (sec) */
-    nap->acregmax = acval;     /* max ac timeout for reg files (sec) */
-#endif /* HAVE_NFS_ARGS_T_ACREGMIN */
-#ifdef HAVE_NFS_ARGS_T_ACDIRMIN
-    nap->acdirmin = acval;     /* min ac timeout for dirs (sec) */
-    nap->acdirmax = acval;     /* max ac timeout for dirs (sec) */
-#endif /* HAVE_NFS_ARGS_T_ACDIRMIN */
-  } else {
-#ifdef MNTTAB_OPT_ACREGMIN
-    nap->acregmin = hasmntval(mntp, MNTTAB_OPT_ACREGMIN);
-#endif /* MNTTAB_OPT_ACREGMIN */
-#ifdef MNTTAB_OPT_ACREGMAX
-    nap->acregmax = hasmntval(mntp, MNTTAB_OPT_ACREGMAX);
-#endif /* MNTTAB_OPT_ACREGMAX */
-#ifdef MNTTAB_OPT_ACDIRMIN
-    nap->acdirmin = hasmntval(mntp, MNTTAB_OPT_ACDIRMIN);
-#endif /* MNTTAB_OPT_ACDIRMIN */
-#ifdef MNTTAB_OPT_ACDIRMAX
-    nap->acdirmax = hasmntval(mntp, MNTTAB_OPT_ACDIRMAX);
-#endif /* MNTTAB_OPT_ACDIRMAX */
-  } /* end of "if (acval)" statement */
-
-#ifdef MNT2_NFS_OPT_ACREGMIN
-  if (nap->acregmin)
-    nap->flags |= MNT2_NFS_OPT_ACREGMIN;
-#endif /* MNT2_NFS_OPT_ACREGMIN */
-#ifdef MNT2_NFS_OPT_ACREGMAX
-  if (nap->acregmax)
-    nap->flags |= MNT2_NFS_OPT_ACREGMAX;
-#endif /* MNT2_NFS_OPT_ACREGMAX */
-#ifdef MNT2_NFS_OPT_ACDIRMIN
-  if (nap->acdirmin)
-    nap->flags |= MNT2_NFS_OPT_ACDIRMIN;
-#endif /* MNT2_NFS_OPT_ACDIRMIN */
-#ifdef MNT2_NFS_OPT_ACDIRMAX
-  if (nap->acdirmax)
-    nap->flags |= MNT2_NFS_OPT_ACDIRMAX;
-#endif /* MNT2_NFS_OPT_ACDIRMAX */
-
-#ifdef MNTTAB_OPT_NOAC         /* don't cache attributes */
-  if (amu_hasmntopt(mntp, MNTTAB_OPT_NOAC) != NULL)
-    nap->flags |= MNT2_NFS_OPT_NOAC;
-#endif /* MNTTAB_OPT_NOAC */
-
   /************************************************************************/
   /*** IP ADDRESS OF REMOTE HOST                                       ***/
   /************************************************************************/
@@ -764,28 +790,9 @@ compute_automounter_nfs_args(nfs_args_t *nap, mntent_t *mntp)
   nap->flags |= MNT2_NFS_OPT_DUMBTIMR;
 #endif /* MNT2_NFS_OPT_DUMBTIMR */
 
-#ifdef MNT2_NFS_OPT_NOAC
-  /*
-   * Don't cache attributes - they are changing under the kernel's feet.
-   * For example, IRIX5.2 will dispense with nfs lookup calls and hand stale
-   * filehandles to getattr unless we disable attribute caching on the
-   * automount points.
-   */
-  nap->flags |= MNT2_NFS_OPT_NOAC;
-#else /* not MNT2_NFS_OPT_NOAC */
-  /*
-   * Setting these to 0 results in an error on some systems, which is why
-   * it's better to use "noac" if possible.
-   */
-# if defined(MNT2_NFS_OPT_ACREGMIN) && defined(MNT2_NFS_OPT_ACREGMAX)
-  nap->acregmin = nap->acregmax = 0; /* XXX: was 1, but why? */
-  nap->flags |= MNT2_NFS_OPT_ACREGMIN | MNT2_NFS_OPT_ACREGMAX;
-# endif /* defined(MNT2_NFS_OPT_ACREGMIN) && defined(MNT2_NFS_OPT_ACREGMAX) */
-# if defined(MNT2_NFS_OPT_ACDIRMIN) && defined(MNT2_NFS_OPT_ACDIRMAX)
-  nap->acdirmin = nap->acdirmax = 0; /* XXX: was 1, but why? */
-  nap->flags |= MNT2_NFS_OPT_ACDIRMIN | MNT2_NFS_OPT_ACDIRMAX;
-# endif /* defined(MNT2_NFS_OPT_ACDIRMIN) && defined(MNT2_NFS_OPT_ACDIRMAX) */
-#endif /* not MNT2_NFS_OPT_NOAC */
+  /* compute all of the NFS attribute-cache flags */
+  compute_nfs_attrcache_flags(nap, mntp);
+
   /*
    * Provide a slight bit more security by requiring the kernel to use
    * reserved ports.
index 96e82547f1f64eb9a8dd8f179e94c1bee09c179e..f07bef74d210e7c66a7c1e78ae1c589fde61517a 100644 (file)
@@ -38,7 +38,7 @@
 .\"
 .\"    %W% (Berkeley) %G%
 .\"
-.\" $Id: amd.conf.5,v 1.30 2005/01/14 01:14:00 ezk Exp $
+.\" $Id: amd.conf.5,v 1.31 2005/01/14 02:47:52 ezk Exp $
 .\"
 .TH AMD.CONF 5 "7 August 1997"
 .SH NAME
@@ -191,7 +191,10 @@ amd variable.
 Specify in seconds, the (kernel-side) NFS attribute cache timeout for amd's
 own automount points.  A value of 0 turns off attribute caching, meaning
 that amd will be consulted via a kernel-RPC each time someone stat's the
-mount point (which could be abused as a denial-of-service attack).
+mount point (which could be abused as a denial-of-service attack).  Warning:
+if you set this option to any non-zero value, especially a large value, and
+you get ESTALE errors on your particular OS , then set this value back to 0
+seconds.
 
 .TP
 .BR auto_dir " (string, default=/a)"