xref: /linux-6.15/include/linux/lockd/bind.h (revision d97c0589)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * linux/include/linux/lockd/bind.h
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * This is the part of lockd visible to nfsd and the nfs client.
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  * Copyright (C) 1996, Olaf Kirch <[email protected]>
81da177e4SLinus Torvalds  */
91da177e4SLinus Torvalds 
101da177e4SLinus Torvalds #ifndef LINUX_LOCKD_BIND_H
111da177e4SLinus Torvalds #define LINUX_LOCKD_BIND_H
121da177e4SLinus Torvalds 
131da177e4SLinus Torvalds #include <linux/lockd/nlm.h>
14d343fce1SNeilBrown /* need xdr-encoded error codes too, so... */
15d343fce1SNeilBrown #include <linux/lockd/xdr.h>
16d343fce1SNeilBrown #ifdef CONFIG_LOCKD_V4
17d343fce1SNeilBrown #include <linux/lockd/xdr4.h>
18d343fce1SNeilBrown #endif
191da177e4SLinus Torvalds 
201da177e4SLinus Torvalds /* Dummy declarations */
211da177e4SLinus Torvalds struct svc_rqst;
22b1ece737SBenjamin Coddington struct rpc_task;
23*d97c0589SBenjamin Coddington struct rpc_clnt;
241da177e4SLinus Torvalds 
251da177e4SLinus Torvalds /*
261da177e4SLinus Torvalds  * This is the set of functions for lockd->nfsd communication
271da177e4SLinus Torvalds  */
281da177e4SLinus Torvalds struct nlmsvc_binding {
29e8c5c045SAl Viro 	__be32			(*fopen)(struct svc_rqst *,
301da177e4SLinus Torvalds 						struct nfs_fh *,
317f024fcdSJ. Bruce Fields 						struct file **,
327f024fcdSJ. Bruce Fields 						int mode);
331da177e4SLinus Torvalds 	void			(*fclose)(struct file *);
341da177e4SLinus Torvalds };
351da177e4SLinus Torvalds 
362a297450SJulia Lawall extern const struct nlmsvc_binding *nlmsvc_ops;
371da177e4SLinus Torvalds 
381da177e4SLinus Torvalds /*
39883bb163SChuck Lever  * Similar to nfs_client_initdata, but without the NFS-specific
40883bb163SChuck Lever  * rpc_ops field.
41883bb163SChuck Lever  */
42883bb163SChuck Lever struct nlmclnt_initdata {
43883bb163SChuck Lever 	const char		*hostname;
44883bb163SChuck Lever 	const struct sockaddr	*address;
45883bb163SChuck Lever 	size_t			addrlen;
46883bb163SChuck Lever 	unsigned short		protocol;
47883bb163SChuck Lever 	u32			nfs_version;
480cb2659bSChuck Lever 	int			noresvport;
4966697bfdSStanislav Kinsbursky 	struct net		*net;
50b1ece737SBenjamin Coddington 	const struct nlmclnt_operations	*nlmclnt_ops;
5140373b12STrond Myklebust 	const struct cred	*cred;
52883bb163SChuck Lever };
53883bb163SChuck Lever 
54883bb163SChuck Lever /*
551da177e4SLinus Torvalds  * Functions exported by the lockd module
561da177e4SLinus Torvalds  */
57883bb163SChuck Lever 
58883bb163SChuck Lever extern struct nlm_host *nlmclnt_init(const struct nlmclnt_initdata *nlm_init);
5952c4044dSChuck Lever extern void	nlmclnt_done(struct nlm_host *host);
60*d97c0589SBenjamin Coddington extern struct rpc_clnt *nlmclnt_rpc_clnt(struct nlm_host *host);
6152c4044dSChuck Lever 
62b1ece737SBenjamin Coddington /*
63b1ece737SBenjamin Coddington  * NLM client operations provide a means to modify RPC processing of NLM
64b1ece737SBenjamin Coddington  * requests.  Callbacks receive a pointer to data passed into the call to
65b1ece737SBenjamin Coddington  * nlmclnt_proc().
66b1ece737SBenjamin Coddington  */
67b1ece737SBenjamin Coddington struct nlmclnt_operations {
68b1ece737SBenjamin Coddington 	/* Called on successful allocation of nlm_rqst, use for allocation or
69b1ece737SBenjamin Coddington 	 * reference counting. */
70b1ece737SBenjamin Coddington 	void (*nlmclnt_alloc_call)(void *);
71b1ece737SBenjamin Coddington 
72b1ece737SBenjamin Coddington 	/* Called in rpc_task_prepare for unlock.  A return value of true
73b1ece737SBenjamin Coddington 	 * indicates the callback has put the task to sleep on a waitqueue
74b1ece737SBenjamin Coddington 	 * and NLM should not call rpc_call_start(). */
75b1ece737SBenjamin Coddington 	bool (*nlmclnt_unlock_prepare)(struct rpc_task*, void *);
76b1ece737SBenjamin Coddington 
77b1ece737SBenjamin Coddington 	/* Called when the nlm_rqst is freed, callbacks should clean up here */
78b1ece737SBenjamin Coddington 	void (*nlmclnt_release_call)(void *);
79b1ece737SBenjamin Coddington };
80b1ece737SBenjamin Coddington 
81b1ece737SBenjamin Coddington extern int	nlmclnt_proc(struct nlm_host *host, int cmd, struct file_lock *fl, void *data);
8240373b12STrond Myklebust extern int	lockd_up(struct net *net, const struct cred *cred);
83e3f70eadSStanislav Kinsbursky extern void	lockd_down(struct net *net);
841da177e4SLinus Torvalds 
851da177e4SLinus Torvalds #endif /* LINUX_LOCKD_BIND_H */
86