diff options
author | Rick Macklem <rmacklem@FreeBSD.org> | 2010-04-24 22:52:14 +0000 |
---|---|---|
committer | Rick Macklem <rmacklem@FreeBSD.org> | 2010-04-24 22:52:14 +0000 |
commit | 23f929dfe8361d0dbedf909df6fc8e24c1f5caec (patch) | |
tree | e6cf5a4477f72259db2908562183345a47d6636b /sys/fs/nfs | |
parent | bf59faa38570e2cc8034e0c1d9e155c943df2649 (diff) | |
download | src-23f929dfe8361d0dbedf909df6fc8e24c1f5caec.tar.gz src-23f929dfe8361d0dbedf909df6fc8e24c1f5caec.zip |
An NFSv4 server will reply NFSERR_GRACE for non-recovery RPCs
during the grace period after startup. This grace period must
be at least the lease duration, which is typically 1-2 minutes.
It seems prudent for the experimental NFS client to wait a few
seconds before retrying such an RPC, so that the server isn't
flooded with non-recovery RPCs during recovery. This patch adds
an argument to nfs_catnap() to implement a 5 second delay
for this case.
MFC after: 1 week
Notes
Notes:
svn path=/head/; revision=207170
Diffstat (limited to 'sys/fs/nfs')
-rw-r--r-- | sys/fs/nfs/nfs_commonkrpc.c | 2 | ||||
-rw-r--r-- | sys/fs/nfs/nfs_commonport.c | 10 | ||||
-rw-r--r-- | sys/fs/nfs/nfs_var.h | 2 | ||||
-rw-r--r-- | sys/fs/nfs/nfsport.h | 8 |
4 files changed, 13 insertions, 9 deletions
diff --git a/sys/fs/nfs/nfs_commonkrpc.c b/sys/fs/nfs/nfs_commonkrpc.c index 8b6ada3865f3..384bdb417de1 100644 --- a/sys/fs/nfs/nfs_commonkrpc.c +++ b/sys/fs/nfs/nfs_commonkrpc.c @@ -650,7 +650,7 @@ tryagain: trylater_delay = NFS_TRYLATERDEL; waituntil = NFSD_MONOSEC + trylater_delay; while (NFSD_MONOSEC < waituntil) - (void) nfs_catnap(PZERO, "nfstry"); + (void) nfs_catnap(PZERO, 0, "nfstry"); trylater_delay *= 2; goto tryagain; } diff --git a/sys/fs/nfs/nfs_commonport.c b/sys/fs/nfs/nfs_commonport.c index 2849163837df..26765668d249 100644 --- a/sys/fs/nfs/nfs_commonport.c +++ b/sys/fs/nfs/nfs_commonport.c @@ -345,17 +345,21 @@ newnfs_timer(void *arg) /* - * sleep for a short period of time. + * Sleep for a short period of time unless errval == NFSERR_GRACE, where + * the sleep should be for 5 seconds. * Since lbolt doesn't exist in FreeBSD-CURRENT, just use a timeout on * an event that never gets a wakeup. Only return EINTR or 0. */ int -nfs_catnap(int prio, const char *wmesg) +nfs_catnap(int prio, int errval, const char *wmesg) { static int non_event; int ret; - ret = tsleep(&non_event, prio, wmesg, 1); + if (errval == NFSERR_GRACE) + ret = tsleep(&non_event, prio, wmesg, 5 * hz); + else + ret = tsleep(&non_event, prio, wmesg, 1); if (ret != EINTR) ret = 0; return (ret); diff --git a/sys/fs/nfs/nfs_var.h b/sys/fs/nfs/nfs_var.h index 5388e13f5490..d6ecda217312 100644 --- a/sys/fs/nfs/nfs_var.h +++ b/sys/fs/nfs/nfs_var.h @@ -322,7 +322,7 @@ int nfsvno_v4rootexport(struct nfsrv_descript *); void newnfs_portinit(void); struct ucred *newnfs_getcred(void); void newnfs_setroot(struct ucred *); -int nfs_catnap(int, const char *); +int nfs_catnap(int, int, const char *); struct nfsreferral *nfsv4root_getreferral(vnode_t, vnode_t, u_int32_t); int nfsrv_atroot(vnode_t, long *); void newnfs_timer(void *); diff --git a/sys/fs/nfs/nfsport.h b/sys/fs/nfs/nfsport.h index 3d370040b443..0fa2e14602d3 100644 --- a/sys/fs/nfs/nfsport.h +++ b/sys/fs/nfs/nfsport.h @@ -143,21 +143,21 @@ #define NFSMGET(m) do { \ MGET((m), M_TRYWAIT, MT_DATA); \ while ((m) == NULL ) { \ - (void) nfs_catnap(PZERO, "nfsmget"); \ + (void) nfs_catnap(PZERO, 0, "nfsmget"); \ MGET((m), M_TRYWAIT, MT_DATA); \ } \ } while (0) #define NFSMGETHDR(m) do { \ MGETHDR((m), M_TRYWAIT, MT_DATA); \ while ((m) == NULL ) { \ - (void) nfs_catnap(PZERO, "nfsmget"); \ + (void) nfs_catnap(PZERO, 0, "nfsmget"); \ MGETHDR((m), M_TRYWAIT, MT_DATA); \ } \ } while (0) #define NFSMCLGET(m, w) do { \ MGET((m), M_TRYWAIT, MT_DATA); \ while ((m) == NULL ) { \ - (void) nfs_catnap(PZERO, "nfsmget"); \ + (void) nfs_catnap(PZERO, 0, "nfsmget"); \ MGET((m), M_TRYWAIT, MT_DATA); \ } \ MCLGET((m), (w)); \ @@ -165,7 +165,7 @@ #define NFSMCLGETHDR(m, w) do { \ MGETHDR((m), M_TRYWAIT, MT_DATA); \ while ((m) == NULL ) { \ - (void) nfs_catnap(PZERO, "nfsmget"); \ + (void) nfs_catnap(PZERO, 0, "nfsmget"); \ MGETHDR((m), M_TRYWAIT, MT_DATA); \ } \ } while (0) |