1/ be less trusting of information in /var/lib/nfs/xtab. Add things to
authorneilbrown <neilbrown>
Wed, 23 Aug 2000 01:17:52 +0000 (01:17 +0000)
committerneilbrown <neilbrown>
Wed, 23 Aug 2000 01:17:52 +0000 (01:17 +0000)
   kernel even if they are in here.
2/ O_CREAT [ex]log when locking for write incase they don't exist
3/ added etc/debian diretory with some files

ChangeLog
etc/debian/nfs-common [new file with mode: 0644]
etc/debian/nfs-kernel-server [new file with mode: 0644]
support/export/xtab.c
support/include/exportfs.h
support/nfs/xio.c
utils/exportfs/exportfs.c
utils/mountd/mountd.c

index 2fcd4a4..3663a64 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2000-08-23  Neil Brown <neilb@cse.unsw.edu.au>
+
+       * support/export/xtab.c(xtab_read): introduce new mode for
+          reading xtab. i.e. a list of exports that might be known to the
+          kernel, or might not.  These are flagged as m_exported == -1
+       * support/export/xtab.c(xtab_mount_read):  call xtab_read with new
+          value "2" for xtab, meaning don't trust this too much.
+       * support/include/exportfs.h(struct mexport): changed m_exported
+          from one bit to an int so that it can hold new value
+       * utils/exportfs/exportfs.c(exportfs_ipdate): add an export to the
+          kernel if it is uncertain whether the kernel knows (m_exported == -1)
+       * utils/mountd/mountd.c(get_rootfh): similarly export to kernel if
+          status is uncertain
+
+       * support/nfs/xio.c(xflock): added O_CREAT when getting
+          a write lock so that missing files aren't fatal.
+
+       * etc/debian/nfs-common: new file from "potato"
+       * etc/debian/nfs-kernel-server: new file from "potato" plus fixes.
+        
 2000-08-09  H.J. Lu <hjl@lucon.org>
 
        * etc/redhat/nfs.init: Run /usr/sbin/exportfs first during
diff --git a/etc/debian/nfs-common b/etc/debian/nfs-common
new file mode 100644 (file)
index 0000000..a9dcb5d
--- /dev/null
@@ -0,0 +1,73 @@
+#!/bin/sh
+#
+# nfs-common    This shell script takes care of starting and stopping
+#               common daemons required for NFS clients and servers.
+#
+# chkconfig: 345 20 80
+# description: NFS is a popular protocol for file sharing across \
+#             TCP/IP networks. This service provides NFS file \
+#             locking functionality.
+#
+
+PREFIX=
+
+NEED_LOCKD=yes
+if test -f /proc/ksyms
+then
+    # We need to be conservative and run lockd,
+    # unless we can prove that it isn't required.
+    grep -q lockdctl /proc/ksyms || NEED_LOCKD=no
+fi
+
+[ -x $PREFIX/sbin/rpc.statd ] || exit 0
+[ -x $PREFIX/sbin/rpc.lockd ] || [ "$NEED_LOCKD" = no ] || exit 0
+
+# What is this?
+DESC="NFS common utilities"
+
+# Make sure that daemon cwds are in root fs.
+cd /
+
+# See how we were called.
+case "$1" in
+  start)
+       printf "Starting $DESC:"
+       printf " statd"
+       start-stop-daemon --start --quiet \
+           --exec $PREFIX/sbin/rpc.statd
+       if [ "$NEED_LOCKD" = yes ]
+       then
+           printf " lockd"
+           start-stop-daemon --start --quiet \
+               --exec $PREFIX/sbin/rpc.lockd
+       fi
+       echo "."
+       ;;
+
+  stop)
+       printf "Stopping $DESC:"
+       if [ "$NEED_LOCKD" = yes ]
+       then
+           printf " lockd"
+           start-stop-daemon --stop --oknodo --quiet \
+               --name lockd --user root --signal 9
+       fi
+       printf " statd"
+       start-stop-daemon --stop --oknodo --quiet \
+           --exec $PREFIX/sbin/rpc.statd
+       echo "."
+       ;;
+
+  restart | force-reload)
+       $0 stop
+       sleep 1
+       $0 start
+       ;;
+
+  *)
+       echo "Usage: nfs-common {start|stop|restart}"
+       exit 1
+       ;;
+esac
+
+exit 0
diff --git a/etc/debian/nfs-kernel-server b/etc/debian/nfs-kernel-server
new file mode 100644 (file)
index 0000000..826e126
--- /dev/null
@@ -0,0 +1,84 @@
+#!/bin/sh
+#
+# nfs-kernel-server
+#              This shell script takes care of starting and stopping
+#               the kernel-mode NFS server.
+#
+# chkconfig: 345 60 20
+# description: NFS is a popular protocol for file sharing across TCP/IP \
+#              networks. This service provides NFS server functionality, \
+#              which is configured via the /etc/exports file.
+#
+
+PREFIX=/usr
+[ -x $PREFIX/sbin/rpc.nfsd ] || exit 0
+[ -x $PREFIX/sbin/rpc.mountd ] || exit 0
+[ -x $PREFIX/sbin/exportfs ] || exit 0
+
+# What is this?
+DESC="NFS kernel daemon"
+
+RPCNFSDCOUNT=8 # Number of servers to be started up by default
+RPCMOUNTDOPTS=
+
+# Make sure that daemon cwds are in root fs.
+cd /
+
+# See how we were called.
+case "$1" in
+  start)
+       if grep -q '^/' /etc/exports; then
+               printf "Exporting directories for $DESC..."
+               $PREFIX/sbin/exportfs -r
+               echo "done."
+
+               printf "Starting $DESC:"
+               printf " nfsd"
+               start-stop-daemon --start --quiet \
+                   --exec $PREFIX/sbin/rpc.nfsd -- $RPCNFSDCOUNT
+               printf " mountd"
+               $PREFIX/bin/rpcinfo -u localhost nfs 3 > /dev/null 2>&1 ||
+                   RPCMOUNTDOPTS="$RPCMOUNDOPTS --no-nfs-version 3"
+               start-stop-daemon --start --quiet \
+                   --exec $PREFIX/sbin/rpc.mountd -- $RPCMOUNTDOPTS
+               echo "."
+
+       else
+               echo "Not starting $DESC: No exports."
+       fi
+       ;;
+
+  stop)
+       printf "Stopping $DESC: mountd"
+       start-stop-daemon --stop --oknodo --quiet \
+           --exec $PREFIX/sbin/rpc.mountd
+       printf " nfsd"
+       start-stop-daemon --stop --oknodo --quiet \
+           --name nfsd --user root --signal 2
+       echo "."
+
+       printf "Unexporting directories for $DESC..."
+       $PREFIX/sbin/exportfs -au
+       echo "done."
+       ;;
+
+  reload | force-reload)
+       printf "Re-exporting directories for $DESC..."
+       $PREFIX/sbin/exportfs -r
+       echo "done."
+       ;;
+
+  restart)
+       $0 stop
+       sleep 1
+       $0 start
+       ;;
+
+  *)
+       echo "Usage: nfs-kernel-server {start|stop|reload|force-reload|restart}"
+       exit 1
+       ;;
+esac
+
+exit 0
+
index c8adc06..b0c3095 100644 (file)
 static int
 xtab_read(char *xtab, int is_export)
 {
+    /* is_export == 0  => reading /proc/fs/nfs/exports - we know these things are exported to kernel
+     * is_export == 1  => reading /var/lib/nfs/etab - these things are allowed to be exported
+     * is_export == 2  => reading /var/lib/nfs/xtab - these things might be known to kernel
+     */
        struct exportent        *xp;
        nfs_export              *exp;
        int                     lockid;
@@ -33,11 +37,18 @@ xtab_read(char *xtab, int is_export)
                    !(exp = export_create(xp))) {
                        continue;
                }
-               if (is_export) {
+               switch (is_export) {
+               case 0:
+                       exp->m_exported = 1;
+                       break;
+               case 1:
                        exp->m_xtabent = 1;
                        exp->m_mayexport = 1;
-               } else
-                       exp->m_exported = 1;
+                       break;
+               case 2:
+                       exp->m_exported = -1;/* may be exported */
+                       break;
+               }
        }
        endexportent();
        xfunlock(lockid);
@@ -53,7 +64,7 @@ xtab_mount_read(void)
                close(fd);
                return xtab_read(_PATH_PROC_EXPORTS, 0);
        } else
-               return xtab_read(_PATH_XTAB, 1);
+               return xtab_read(_PATH_XTAB, 2);
 }
 
 int
index d440dc1..3ca248e 100644 (file)
@@ -36,8 +36,8 @@ typedef struct mexport {
        struct mexport *        m_next;
        struct mclient *        m_client;
        struct exportent        m_export;
-       int                     m_exported : 1, /* known to knfsd */
-                               m_xtabent  : 1, /* xtab entry exists */
+       int                     m_exported;     /* known to knfsd. -1 means not sure */
+       int                     m_xtabent  : 1, /* xtab entry exists */
                                m_mayexport: 1, /* derived from xtabbed */
                                m_changed  : 1; /* options (may) have changed */
 } nfs_export;
index 49ee6bc..0a250fc 100644 (file)
@@ -55,7 +55,7 @@ xflock(char *fname, char *type)
        struct flock    fl = { readonly? F_RDLCK : F_WRLCK, SEEK_SET, 0, 0, 0 };
        int             fd;
 
-       if ((fd = open(fname, readonly? O_RDONLY : O_RDWR)) < 0) {
+       if ((fd = open(fname, readonly? O_RDONLY : (O_RDWR|O_CREAT))) < 0) {
                xlog(L_WARNING, "could not open %s for locking", fname);
                return -1;
        }
index c3bb5ba..0504709 100644 (file)
@@ -132,7 +132,7 @@ exports_update(int verbose)
        nfs_export      *exp;
 
        for (exp = exportlist[MCL_FQDN]; exp; exp=exp->m_next) {
-               if (exp->m_mayexport && (!exp->m_exported || exp->m_changed)) {
+               if (exp->m_mayexport && ((exp->m_exported<1) || exp->m_changed)) {
                        if (verbose)
                                printf("%sexporting %s:%s to kernel\n",
                                       exp->m_exported ?"re":"",
index 1cfdc74..1eeefdc 100644 (file)
@@ -263,7 +263,7 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, int *error, int v3)
        } else {
                struct nfs_fh_len  *fh;
 
-               if (!exp->m_exported)
+               if (exp->m_exported<1)
                        export_export(exp);
                if (!exp->m_xtabent)
                        xtab_append(exp);