[PATCH 1/8] lockd: nfsd4: use same grace period for lockd and nfsd4

Trond Myklebust trond.myklebust at fys.uio.no
Tue Jun 19 20:37:29 EDT 2007


On Tue, 2007-06-19 at 15:28 -0400, J. Bruce Fields wrote:
> From: J. Bruce Fields <bfields at fieldses.org>
> 
> Both lockd and (in the nfsv4 case) nfsd enforce a "grace period" after
> reboot, during which clients may reclaim locks from the previous server
> instance, but may not acquire new locks.
> 
> Currently the lockd and nfsd enforce grace periods of different lengths.
> This may cause problems when we reboot a server with both v2/v3 and v4
> clients.  For example, if the lockd grace period is shorter (as is likely
> the case), then a v3 client might acquire a new lock that conflicts with a
> lock already held (but not yet reclaimed) by a v4 client.
> 
> This patch calculates a lease time that lockd and nfsd can both use.
> 
> Signed-off-by: Marc Eshel <eshel at almaden.ibm.com>
> Signed-off-by: J. Bruce Fields <bfields at citi.umich.edu>
> ---
>  fs/lockd/svc.c             |   31 ++++++++++++++++++++++++-------
>  fs/nfsd/lockd.c            |    1 +
>  fs/nfsd/nfs4state.c        |    9 ++++++++-
>  include/linux/lockd/bind.h |    9 +++++++++
>  4 files changed, 42 insertions(+), 8 deletions(-)
> 
> diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
> index 126b1bf..6378572 100644
> --- a/fs/lockd/svc.c
> +++ b/fs/lockd/svc.c
> @@ -75,18 +75,35 @@ static const int		nlm_port_min = 0, nlm_port_max = 65535;
>  
>  static struct ctl_table_header * nlm_sysctl_table;
>  
> -static unsigned long set_grace_period(void)
> +static time_t get_lockd_grace_period(void)
>  {
> -	unsigned long grace_period;
> -
>  	/* Note: nlm_timeout should always be nonzero */
>  	if (nlm_grace_period)
> -		grace_period = ((nlm_grace_period + nlm_timeout - 1)
> -				/ nlm_timeout) * nlm_timeout * HZ;
> +		return ((nlm_grace_period + nlm_timeout - 1)
> +				/ nlm_timeout) * nlm_timeout;
>  	else
> -		grace_period = nlm_timeout * 5 * HZ;
> +		return nlm_timeout * 5;
> +}

Why on earth are you changing the units here? The natural unit inside
the kernel is the jiffy, not the second. You're just forcing all the
callers to convert...

> +
> +time_t get_nfs_grace_period(void)
> +{
> +	time_t lockdgrace = get_lockd_grace_period();
> +	time_t nfsdgrace = 0;
> +
> +	if (nlmsvc_ops)
> +		nfsdgrace = nlmsvc_ops->get_grace_period();
> +
> +	return max(lockdgrace, nfsdgrace);
> +}
> +EXPORT_SYMBOL(get_nfs_grace_period);
> +
> +static unsigned long set_grace_period(void)
> +{
> +	time_t grace_period;
> +
> +	grace_period = get_nfs_grace_period();
>  	nlmsvc_grace_period = 1;
> -	return grace_period + jiffies;
> +	return grace_period * HZ + jiffies;
>  }
>  
>  static inline void clear_grace_period(void)
> diff --git a/fs/nfsd/lockd.c b/fs/nfsd/lockd.c
> index 221acd1..9e4a568 100644
> --- a/fs/nfsd/lockd.c
> +++ b/fs/nfsd/lockd.c
> @@ -65,6 +65,7 @@ nlm_fclose(struct file *filp)
>  static struct nlmsvc_binding	nfsd_nlm_ops = {
>  	.fopen		= nlm_fopen,		/* open file for locking */
>  	.fclose		= nlm_fclose,		/* close file */
> +	.get_grace_period = get_nfs4_grace_period,
>  };
>  
>  void
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index 3cc8ce4..50e0d44 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -51,6 +51,7 @@
>  #include <linux/namei.h>
>  #include <linux/mutex.h>
>  #include <linux/lockd/bind.h>
> +#include <linux/module.h>
>  
>  #define NFSDDBG_FACILITY                NFSDDBG_PROC
>  
> @@ -3191,6 +3192,12 @@ nfsd4_load_reboot_recovery_data(void)
>  		printk("NFSD: Failure reading reboot recovery data\n");
>  }
>  
> +time_t
> +get_nfs4_grace_period(void)
> +{
> +	return max(user_lease_time, lease_time);
> +}
> +
>  /* initialization to perform when the nfsd service is started: */
>  
>  static void
> @@ -3199,7 +3206,7 @@ __nfs4_state_start(void)
>  	time_t grace_time;
>  
>  	boot_time = get_seconds();
> -	grace_time = max(user_lease_time, lease_time);
> +	grace_time = get_nfs_grace_period();
>  	lease_time = user_lease_time;
>  	in_grace = 1;
>  	printk("NFSD: starting %ld-second grace period\n", grace_time);
> diff --git a/include/linux/lockd/bind.h b/include/linux/lockd/bind.h
> index 246de1d..df008eb 100644
> --- a/include/linux/lockd/bind.h
> +++ b/include/linux/lockd/bind.h
> @@ -27,6 +27,7 @@ struct nlmsvc_binding {
>  						struct nfs_fh *,
>  						struct file **);
>  	void			(*fclose)(struct file *);
> +	time_t			(*get_grace_period)(void);
>  };
>  
>  extern struct nlmsvc_binding *	nlmsvc_ops;
> @@ -38,4 +39,12 @@ extern int	nlmclnt_proc(struct inode *, int, struct file_lock *);
>  extern int	lockd_up(int proto);
>  extern void	lockd_down(void);
>  
> +time_t get_nfs_grace_period(void);
> +
> +#ifdef CONFIG_NFSD_V4
> +time_t get_nfs4_grace_period(void);
> +#else
> +static inline void get_nfs4_grace_period(void) {return 0;}
> +#endif
> +
>  #endif /* LINUX_LOCKD_BIND_H */



More information about the NFSv4 mailing list