2 * linux/include/linux/lockd/lockd.h
4 * General-purpose lockd include file.
6 * Copyright (C) 1996 Olaf Kirch <okir@monad.swb.de>
9 #ifndef LINUX_LOCKD_LOCKD_H
10 #define LINUX_LOCKD_LOCKD_H
16 #include <linux/utsname.h>
17 #include <linux/nfsd/nfsfh.h>
18 #include <linux/lockd/bind.h>
19 #include <linux/lockd/xdr.h>
20 #ifdef CONFIG_LOCKD_V4
21 #include <linux/lockd/xdr4.h>
23 #include <linux/lockd/debug.h>
28 #define LOCKD_VERSION "0.4"
31 * Default timeout for RPC calls (seconds)
33 #define LOCKD_DFLT_TIMEO 10
36 * Lockd host handle (used both by the client and server personality).
39 struct nlm_host
* h_next
; /* linked list (hash table) */
40 struct sockaddr_in h_addr
; /* peer address */
41 struct svc_client
* h_exportent
; /* NFS client */
42 struct rpc_clnt
* h_rpcclnt
; /* RPC client to talk to peer */
43 char h_name
[20]; /* remote hostname */
44 u32 h_version
; /* interface version */
45 unsigned short h_proto
; /* transport proto */
46 unsigned short h_authflavor
; /* RPC authentication type */
47 unsigned short h_reclaiming
: 1,
50 wait_queue_head_t h_gracewait
; /* wait while reclaiming */
51 u32 h_state
; /* pseudo-state counter */
52 u32 h_nsmstate
; /* true remote NSM state */
53 unsigned int h_count
; /* reference count */
54 struct semaphore h_sema
; /* mutex for pmap binding */
55 unsigned long h_nextrebind
; /* next portmap call */
56 unsigned long h_expires
; /* eligible for GC */
60 * Memory chunk for NLM client RPC request.
62 #define NLMCLNT_OHSIZE (sizeof(system_utsname.nodename)+10)
64 unsigned int a_flags
; /* initial RPC task flags */
65 struct nlm_host
* a_host
; /* host handle */
66 struct nlm_args a_args
; /* arguments */
67 struct nlm_res a_res
; /* result */
68 char a_owner
[NLMCLNT_OHSIZE
];
72 * This struct describes a file held open by lockd on behalf of
76 struct nlm_file
* f_next
; /* linked list */
77 struct knfs_fh f_handle
; /* NFS file handle */
78 struct file f_file
; /* VFS file pointer */
79 struct nlm_share
* f_shares
; /* DOS shares */
80 struct nlm_block
* f_blocks
; /* blocked locks */
81 unsigned int f_locks
; /* guesstimate # of locks */
82 unsigned int f_count
; /* reference count */
83 struct semaphore f_sema
; /* avoid concurrent access */
87 * This is a server block (i.e. a lock requested by some client which
88 * couldn't be granted because of a conflicting lock).
90 #define NLM_NEVER (~(unsigned long) 0)
92 struct nlm_block
* b_next
; /* linked list (all blocks) */
93 struct nlm_block
* b_fnext
; /* linked list (per file) */
94 struct nlm_rqst b_call
; /* RPC args & callback info */
95 struct svc_serv
* b_daemon
; /* NLM service */
96 struct nlm_host
* b_host
; /* host handle for RPC clnt */
97 unsigned long b_when
; /* next re-xmit */
98 unsigned int b_id
; /* block id */
99 unsigned char b_queued
; /* re-queued */
100 unsigned char b_granted
; /* VFS granted lock */
101 unsigned char b_incall
; /* doing callback */
102 unsigned char b_done
; /* callback complete */
103 struct nlm_file
* b_file
; /* file in question */
107 * Valid actions for nlmsvc_traverse_files
109 #define NLM_ACT_CHECK 0 /* check for locks */
110 #define NLM_ACT_MARK 1 /* mark & sweep */
111 #define NLM_ACT_UNLOCK 2 /* release all locks */
116 extern struct rpc_program nlm_program
;
117 extern struct svc_procedure nlmsvc_procedures
[];
118 #ifdef CONFIG_LOCKD_V4
119 extern struct svc_procedure nlmsvc_procedures4
[];
121 extern unsigned long nlmsvc_grace_period
;
122 extern unsigned long nlmsvc_timeout
;
125 * Lockd client functions
127 struct nlm_rqst
* nlmclnt_alloc_call(void);
128 int nlmclnt_call(struct nlm_rqst
*, u32
);
129 int nlmclnt_async_call(struct nlm_rqst
*, u32
, rpc_action
);
130 int nlmclnt_block(struct nlm_host
*, struct file_lock
*, u32
*);
131 int nlmclnt_cancel(struct nlm_host
*, struct file_lock
*);
132 u32
nlmclnt_grant(struct nlm_lock
*);
133 void nlmclnt_recovery(struct nlm_host
*, u32
);
134 int nlmclnt_reclaim(struct nlm_host
*, struct file_lock
*);
135 int nlmclnt_setgrantargs(struct nlm_rqst
*, struct nlm_lock
*);
136 void nlmclnt_freegrantargs(struct nlm_rqst
*);
141 struct nlm_host
* nlmclnt_lookup_host(struct sockaddr_in
*, int, int);
142 struct nlm_host
* nlmsvc_lookup_host(struct svc_rqst
*);
143 struct nlm_host
* nlm_lookup_host(struct svc_client
*,
144 struct sockaddr_in
*, int, int);
145 struct rpc_clnt
* nlm_bind_host(struct nlm_host
*);
146 void nlm_rebind_host(struct nlm_host
*);
147 void nlm_release_host(struct nlm_host
*);
148 void nlm_shutdown_hosts(void);
151 * Server-side lock handling
153 u32
nlmsvc_lock(struct svc_rqst
*, struct nlm_file
*,
154 struct nlm_lock
*, int, struct nlm_cookie
*);
155 u32
nlmsvc_unlock(struct nlm_file
*, struct nlm_lock
*);
156 u32
nlmsvc_testlock(struct nlm_file
*, struct nlm_lock
*,
158 u32
nlmsvc_cancel_blocked(struct nlm_file
*, struct nlm_lock
*);
159 unsigned long nlmsvc_retry_blocked(void);
160 int nlmsvc_traverse_blocks(struct nlm_host
*, struct nlm_file
*,
164 * File handling for the server personality
166 u32
nlm_lookup_file(struct svc_rqst
*, struct nlm_file
**,
168 void nlm_release_file(struct nlm_file
*);
169 void nlmsvc_mark_resources(void);
170 void nlmsvc_free_host_resources(struct nlm_host
*);
172 extern __inline__
struct inode
*
173 nlmsvc_file_inode(struct nlm_file
*file
)
175 return file
->f_file
.f_dentry
->d_inode
;
179 * Compare two host addresses (needs modifying for ipv6)
181 extern __inline__
int
182 nlm_cmp_addr(struct sockaddr_in
*sin1
, struct sockaddr_in
*sin2
)
184 return sin1
->sin_addr
.s_addr
== sin2
->sin_addr
.s_addr
;
188 * Compare two NLM locks.
189 * When the second lock is of type F_UNLCK, this acts like a wildcard.
191 extern __inline__
int
192 nlm_compare_locks(struct file_lock
*fl1
, struct file_lock
*fl2
)
194 return fl1
->fl_pid
== fl2
->fl_pid
195 && fl1
->fl_start
== fl2
->fl_start
196 && fl1
->fl_end
== fl2
->fl_end
197 &&(fl1
->fl_type
== fl2
->fl_type
|| fl2
->fl_type
== F_UNLCK
);
200 #endif /* __KERNEL__ */
202 #endif /* LINUX_LOCKD_LOCKD_H */