Rewrite grace period code to unify management of grace period across lockd and nfsd. The current code has lockd and nfsd cooperate to compute a grace period which is satisfactory to them both, and then individually enforce it. This creates a slight race condition, since the enforcement is not coordinated. It's also more complicated than necessary. Here instead we have lockd and nfsd each inform common code when they enter the grace period, and when they're ready to leave the grace period, and allow normal locking only after both of them are ready to leave. We also expect the locks_start_grace()/locks_end_grace() interface here to be simpler to build on for future cluster/high-availability work, which may require (for example) putting individual filesystems into grace, or enforcing grace periods across multiple cluster nodes. Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
59 lines
1.3 KiB
C
59 lines
1.3 KiB
C
/*
|
|
* linux/include/linux/lockd/bind.h
|
|
*
|
|
* This is the part of lockd visible to nfsd and the nfs client.
|
|
*
|
|
* Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
|
|
*/
|
|
|
|
#ifndef LINUX_LOCKD_BIND_H
|
|
#define LINUX_LOCKD_BIND_H
|
|
|
|
#include <linux/lockd/nlm.h>
|
|
/* need xdr-encoded error codes too, so... */
|
|
#include <linux/lockd/xdr.h>
|
|
#ifdef CONFIG_LOCKD_V4
|
|
#include <linux/lockd/xdr4.h>
|
|
#endif
|
|
|
|
/* Dummy declarations */
|
|
struct svc_rqst;
|
|
|
|
/*
|
|
* This is the set of functions for lockd->nfsd communication
|
|
*/
|
|
struct nlmsvc_binding {
|
|
__be32 (*fopen)(struct svc_rqst *,
|
|
struct nfs_fh *,
|
|
struct file **);
|
|
void (*fclose)(struct file *);
|
|
};
|
|
|
|
extern struct nlmsvc_binding * nlmsvc_ops;
|
|
|
|
/*
|
|
* Similar to nfs_client_initdata, but without the NFS-specific
|
|
* rpc_ops field.
|
|
*/
|
|
struct nlmclnt_initdata {
|
|
const char *hostname;
|
|
const struct sockaddr *address;
|
|
size_t addrlen;
|
|
unsigned short protocol;
|
|
u32 nfs_version;
|
|
};
|
|
|
|
/*
|
|
* Functions exported by the lockd module
|
|
*/
|
|
|
|
extern struct nlm_host *nlmclnt_init(const struct nlmclnt_initdata *nlm_init);
|
|
extern void nlmclnt_done(struct nlm_host *host);
|
|
|
|
extern int nlmclnt_proc(struct nlm_host *host, int cmd,
|
|
struct file_lock *fl);
|
|
extern int lockd_up(int proto);
|
|
extern void lockd_down(void);
|
|
|
|
#endif /* LINUX_LOCKD_BIND_H */
|