From 82d42dffa84fb884684f75769ca13668c5188a5e Mon Sep 17 00:00:00 2001 From: neilbrown Date: Wed, 23 Aug 2000 01:17:52 +0000 Subject: [PATCH] 1/ be less trusting of information in /var/lib/nfs/xtab. Add things to 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 | 20 +++++++++ etc/debian/nfs-common | 73 +++++++++++++++++++++++++++++++ etc/debian/nfs-kernel-server | 84 ++++++++++++++++++++++++++++++++++++ support/export/xtab.c | 19 ++++++-- support/include/exportfs.h | 4 +- support/nfs/xio.c | 2 +- utils/exportfs/exportfs.c | 2 +- utils/mountd/mountd.c | 2 +- 8 files changed, 197 insertions(+), 9 deletions(-) create mode 100644 etc/debian/nfs-common create mode 100644 etc/debian/nfs-kernel-server diff --git a/ChangeLog b/ChangeLog index 2fcd4a4..3663a64 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,23 @@ +2000-08-23 Neil Brown + + * 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 * 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 index 0000000..a9dcb5d --- /dev/null +++ b/etc/debian/nfs-common @@ -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 index 0000000..826e126 --- /dev/null +++ b/etc/debian/nfs-kernel-server @@ -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 + diff --git a/support/export/xtab.c b/support/export/xtab.c index c8adc06..b0c3095 100644 --- a/support/export/xtab.c +++ b/support/export/xtab.c @@ -21,6 +21,10 @@ 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 diff --git a/support/include/exportfs.h b/support/include/exportfs.h index d440dc1..3ca248e 100644 --- a/support/include/exportfs.h +++ b/support/include/exportfs.h @@ -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; diff --git a/support/nfs/xio.c b/support/nfs/xio.c index 49ee6bc..0a250fc 100644 --- a/support/nfs/xio.c +++ b/support/nfs/xio.c @@ -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; } diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c index c3bb5ba..0504709 100644 --- a/utils/exportfs/exportfs.c +++ b/utils/exportfs/exportfs.c @@ -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":"", diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c index 1cfdc74..1eeefdc 100644 --- a/utils/mountd/mountd.c +++ b/utils/mountd/mountd.c @@ -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); -- 2.39.2