xref: /linux/fs/nfsd/nfs4state.c (revision 068df0f34e81bc06c5eb5012ec2eda25624e87aa)
1 /*
2 *  Copyright (c) 2001 The Regents of the University of Michigan.
3 *  All rights reserved.
4 *
5 *  Kendrick Smith <kmsmith@umich.edu>
6 *  Andy Adamson <kandros@umich.edu>
7 *
8 *  Redistribution and use in source and binary forms, with or without
9 *  modification, are permitted provided that the following conditions
10 *  are met:
11 *
12 *  1. Redistributions of source code must retain the above copyright
13 *     notice, this list of conditions and the following disclaimer.
14 *  2. Redistributions in binary form must reproduce the above copyright
15 *     notice, this list of conditions and the following disclaimer in the
16 *     documentation and/or other materials provided with the distribution.
17 *  3. Neither the name of the University nor the names of its
18 *     contributors may be used to endorse or promote products derived
19 *     from this software without specific prior written permission.
20 *
21 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
22 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23 *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28 *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30 *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 *
33 */
34 
35 #include <linux/file.h>
36 #include <linux/fs.h>
37 #include <linux/slab.h>
38 #include <linux/namei.h>
39 #include <linux/swap.h>
40 #include <linux/pagemap.h>
41 #include <linux/sunrpc/svcauth_gss.h>
42 #include <linux/sunrpc/clnt.h>
43 #include "xdr4.h"
44 #include "vfs.h"
45 
46 #define NFSDDBG_FACILITY                NFSDDBG_PROC
47 
48 /* Globals */
49 time_t nfsd4_lease = 90;     /* default lease time */
50 time_t nfsd4_grace = 90;
51 static time_t boot_time;
52 static stateid_t zerostateid;             /* bits all 0 */
53 static stateid_t onestateid;              /* bits all 1 */
54 static u64 current_sessionid = 1;
55 
56 #define ZERO_STATEID(stateid) (!memcmp((stateid), &zerostateid, sizeof(stateid_t)))
57 #define ONE_STATEID(stateid)  (!memcmp((stateid), &onestateid, sizeof(stateid_t)))
58 
59 /* forward declarations */
60 static int check_for_locks(struct nfs4_file *filp, struct nfs4_lockowner *lowner);
61 
62 /* Locking: */
63 
64 /* Currently used for almost all code touching nfsv4 state: */
65 static DEFINE_MUTEX(client_mutex);
66 
67 /*
68  * Currently used for the del_recall_lru and file hash table.  In an
69  * effort to decrease the scope of the client_mutex, this spinlock may
70  * eventually cover more:
71  */
72 static DEFINE_SPINLOCK(recall_lock);
73 
74 static struct kmem_cache *openowner_slab = NULL;
75 static struct kmem_cache *lockowner_slab = NULL;
76 static struct kmem_cache *file_slab = NULL;
77 static struct kmem_cache *stateid_slab = NULL;
78 static struct kmem_cache *deleg_slab = NULL;
79 
80 void
81 nfs4_lock_state(void)
82 {
83 	mutex_lock(&client_mutex);
84 }
85 
86 void
87 nfs4_unlock_state(void)
88 {
89 	mutex_unlock(&client_mutex);
90 }
91 
92 static inline u32
93 opaque_hashval(const void *ptr, int nbytes)
94 {
95 	unsigned char *cptr = (unsigned char *) ptr;
96 
97 	u32 x = 0;
98 	while (nbytes--) {
99 		x *= 37;
100 		x += *cptr++;
101 	}
102 	return x;
103 }
104 
105 static struct list_head del_recall_lru;
106 
107 static void nfsd4_free_file(struct nfs4_file *f)
108 {
109 	kmem_cache_free(file_slab, f);
110 }
111 
112 static inline void
113 put_nfs4_file(struct nfs4_file *fi)
114 {
115 	if (atomic_dec_and_lock(&fi->fi_ref, &recall_lock)) {
116 		list_del(&fi->fi_hash);
117 		spin_unlock(&recall_lock);
118 		iput(fi->fi_inode);
119 		nfsd4_free_file(fi);
120 	}
121 }
122 
123 static inline void
124 get_nfs4_file(struct nfs4_file *fi)
125 {
126 	atomic_inc(&fi->fi_ref);
127 }
128 
129 static int num_delegations;
130 unsigned int max_delegations;
131 
132 /*
133  * Open owner state (share locks)
134  */
135 
136 /* hash tables for open owners */
137 #define OPEN_OWNER_HASH_BITS              8
138 #define OPEN_OWNER_HASH_SIZE             (1 << OPEN_OWNER_HASH_BITS)
139 #define OPEN_OWNER_HASH_MASK             (OPEN_OWNER_HASH_SIZE - 1)
140 
141 static unsigned int open_ownerstr_hashval(u32 clientid, struct xdr_netobj *ownername)
142 {
143 	unsigned int ret;
144 
145 	ret = opaque_hashval(ownername->data, ownername->len);
146 	ret += clientid;
147 	return ret & OPEN_OWNER_HASH_MASK;
148 }
149 
150 static struct list_head	open_ownerstr_hashtbl[OPEN_OWNER_HASH_SIZE];
151 
152 /* hash table for nfs4_file */
153 #define FILE_HASH_BITS                   8
154 #define FILE_HASH_SIZE                  (1 << FILE_HASH_BITS)
155 
156 static unsigned int file_hashval(struct inode *ino)
157 {
158 	/* XXX: why are we hashing on inode pointer, anyway? */
159 	return hash_ptr(ino, FILE_HASH_BITS);
160 }
161 
162 static struct list_head file_hashtbl[FILE_HASH_SIZE];
163 
164 static void __nfs4_file_get_access(struct nfs4_file *fp, int oflag)
165 {
166 	BUG_ON(!(fp->fi_fds[oflag] || fp->fi_fds[O_RDWR]));
167 	atomic_inc(&fp->fi_access[oflag]);
168 }
169 
170 static void nfs4_file_get_access(struct nfs4_file *fp, int oflag)
171 {
172 	if (oflag == O_RDWR) {
173 		__nfs4_file_get_access(fp, O_RDONLY);
174 		__nfs4_file_get_access(fp, O_WRONLY);
175 	} else
176 		__nfs4_file_get_access(fp, oflag);
177 }
178 
179 static void nfs4_file_put_fd(struct nfs4_file *fp, int oflag)
180 {
181 	if (fp->fi_fds[oflag]) {
182 		fput(fp->fi_fds[oflag]);
183 		fp->fi_fds[oflag] = NULL;
184 	}
185 }
186 
187 static void __nfs4_file_put_access(struct nfs4_file *fp, int oflag)
188 {
189 	if (atomic_dec_and_test(&fp->fi_access[oflag])) {
190 		nfs4_file_put_fd(fp, oflag);
191 		/*
192 		 * It's also safe to get rid of the RDWR open *if*
193 		 * we no longer have need of the other kind of access
194 		 * or if we already have the other kind of open:
195 		 */
196 		if (fp->fi_fds[1-oflag]
197 			|| atomic_read(&fp->fi_access[1 - oflag]) == 0)
198 			nfs4_file_put_fd(fp, O_RDWR);
199 	}
200 }
201 
202 static void nfs4_file_put_access(struct nfs4_file *fp, int oflag)
203 {
204 	if (oflag == O_RDWR) {
205 		__nfs4_file_put_access(fp, O_RDONLY);
206 		__nfs4_file_put_access(fp, O_WRONLY);
207 	} else
208 		__nfs4_file_put_access(fp, oflag);
209 }
210 
211 static inline int get_new_stid(struct nfs4_stid *stid)
212 {
213 	static int min_stateid = 0;
214 	struct idr *stateids = &stid->sc_client->cl_stateids;
215 	int new_stid;
216 	int error;
217 
218 	error = idr_get_new_above(stateids, stid, min_stateid, &new_stid);
219 	/*
220 	 * Note: the necessary preallocation was done in
221 	 * nfs4_alloc_stateid().  The idr code caps the number of
222 	 * preallocations that can exist at a time, but the state lock
223 	 * prevents anyone from using ours before we get here:
224 	 */
225 	BUG_ON(error);
226 	/*
227 	 * It shouldn't be a problem to reuse an opaque stateid value.
228 	 * I don't think it is for 4.1.  But with 4.0 I worry that, for
229 	 * example, a stray write retransmission could be accepted by
230 	 * the server when it should have been rejected.  Therefore,
231 	 * adopt a trick from the sctp code to attempt to maximize the
232 	 * amount of time until an id is reused, by ensuring they always
233 	 * "increase" (mod INT_MAX):
234 	 */
235 
236 	min_stateid = new_stid+1;
237 	if (min_stateid == INT_MAX)
238 		min_stateid = 0;
239 	return new_stid;
240 }
241 
242 static void init_stid(struct nfs4_stid *stid, struct nfs4_client *cl, unsigned char type)
243 {
244 	stateid_t *s = &stid->sc_stateid;
245 	int new_id;
246 
247 	stid->sc_type = type;
248 	stid->sc_client = cl;
249 	s->si_opaque.so_clid = cl->cl_clientid;
250 	new_id = get_new_stid(stid);
251 	s->si_opaque.so_id = (u32)new_id;
252 	/* Will be incremented before return to client: */
253 	s->si_generation = 0;
254 }
255 
256 static struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl, struct kmem_cache *slab)
257 {
258 	struct idr *stateids = &cl->cl_stateids;
259 
260 	if (!idr_pre_get(stateids, GFP_KERNEL))
261 		return NULL;
262 	/*
263 	 * Note: if we fail here (or any time between now and the time
264 	 * we actually get the new idr), we won't need to undo the idr
265 	 * preallocation, since the idr code caps the number of
266 	 * preallocated entries.
267 	 */
268 	return kmem_cache_alloc(slab, GFP_KERNEL);
269 }
270 
271 static struct nfs4_ol_stateid * nfs4_alloc_stateid(struct nfs4_client *clp)
272 {
273 	return openlockstateid(nfs4_alloc_stid(clp, stateid_slab));
274 }
275 
276 static struct nfs4_delegation *
277 alloc_init_deleg(struct nfs4_client *clp, struct nfs4_ol_stateid *stp, struct svc_fh *current_fh, u32 type)
278 {
279 	struct nfs4_delegation *dp;
280 	struct nfs4_file *fp = stp->st_file;
281 
282 	dprintk("NFSD alloc_init_deleg\n");
283 	/*
284 	 * Major work on the lease subsystem (for example, to support
285 	 * calbacks on stat) will be required before we can support
286 	 * write delegations properly.
287 	 */
288 	if (type != NFS4_OPEN_DELEGATE_READ)
289 		return NULL;
290 	if (fp->fi_had_conflict)
291 		return NULL;
292 	if (num_delegations > max_delegations)
293 		return NULL;
294 	dp = delegstateid(nfs4_alloc_stid(clp, deleg_slab));
295 	if (dp == NULL)
296 		return dp;
297 	init_stid(&dp->dl_stid, clp, NFS4_DELEG_STID);
298 	/*
299 	 * delegation seqid's are never incremented.  The 4.1 special
300 	 * meaning of seqid 0 isn't meaningful, really, but let's avoid
301 	 * 0 anyway just for consistency and use 1:
302 	 */
303 	dp->dl_stid.sc_stateid.si_generation = 1;
304 	num_delegations++;
305 	INIT_LIST_HEAD(&dp->dl_perfile);
306 	INIT_LIST_HEAD(&dp->dl_perclnt);
307 	INIT_LIST_HEAD(&dp->dl_recall_lru);
308 	get_nfs4_file(fp);
309 	dp->dl_file = fp;
310 	dp->dl_type = type;
311 	fh_copy_shallow(&dp->dl_fh, &current_fh->fh_handle);
312 	dp->dl_time = 0;
313 	atomic_set(&dp->dl_count, 1);
314 	INIT_WORK(&dp->dl_recall.cb_work, nfsd4_do_callback_rpc);
315 	return dp;
316 }
317 
318 void
319 nfs4_put_delegation(struct nfs4_delegation *dp)
320 {
321 	if (atomic_dec_and_test(&dp->dl_count)) {
322 		dprintk("NFSD: freeing dp %p\n",dp);
323 		put_nfs4_file(dp->dl_file);
324 		kmem_cache_free(deleg_slab, dp);
325 		num_delegations--;
326 	}
327 }
328 
329 static void nfs4_put_deleg_lease(struct nfs4_file *fp)
330 {
331 	if (atomic_dec_and_test(&fp->fi_delegees)) {
332 		vfs_setlease(fp->fi_deleg_file, F_UNLCK, &fp->fi_lease);
333 		fp->fi_lease = NULL;
334 		fput(fp->fi_deleg_file);
335 		fp->fi_deleg_file = NULL;
336 	}
337 }
338 
339 static void unhash_stid(struct nfs4_stid *s)
340 {
341 	struct idr *stateids = &s->sc_client->cl_stateids;
342 
343 	idr_remove(stateids, s->sc_stateid.si_opaque.so_id);
344 }
345 
346 /* Called under the state lock. */
347 static void
348 unhash_delegation(struct nfs4_delegation *dp)
349 {
350 	unhash_stid(&dp->dl_stid);
351 	list_del_init(&dp->dl_perclnt);
352 	spin_lock(&recall_lock);
353 	list_del_init(&dp->dl_perfile);
354 	list_del_init(&dp->dl_recall_lru);
355 	spin_unlock(&recall_lock);
356 	nfs4_put_deleg_lease(dp->dl_file);
357 	nfs4_put_delegation(dp);
358 }
359 
360 /*
361  * SETCLIENTID state
362  */
363 
364 /* client_lock protects the client lru list and session hash table */
365 static DEFINE_SPINLOCK(client_lock);
366 
367 /* Hash tables for nfs4_clientid state */
368 #define CLIENT_HASH_BITS                 4
369 #define CLIENT_HASH_SIZE                (1 << CLIENT_HASH_BITS)
370 #define CLIENT_HASH_MASK                (CLIENT_HASH_SIZE - 1)
371 
372 static unsigned int clientid_hashval(u32 id)
373 {
374 	return id & CLIENT_HASH_MASK;
375 }
376 
377 static unsigned int clientstr_hashval(const char *name)
378 {
379 	return opaque_hashval(name, 8) & CLIENT_HASH_MASK;
380 }
381 
382 /*
383  * reclaim_str_hashtbl[] holds known client info from previous reset/reboot
384  * used in reboot/reset lease grace period processing
385  *
386  * conf_id_hashtbl[], and conf_str_hashtbl[] hold confirmed
387  * setclientid_confirmed info.
388  *
389  * unconf_str_hastbl[] and unconf_id_hashtbl[] hold unconfirmed
390  * setclientid info.
391  *
392  * client_lru holds client queue ordered by nfs4_client.cl_time
393  * for lease renewal.
394  *
395  * close_lru holds (open) stateowner queue ordered by nfs4_stateowner.so_time
396  * for last close replay.
397  */
398 static struct list_head	reclaim_str_hashtbl[CLIENT_HASH_SIZE];
399 static int reclaim_str_hashtbl_size = 0;
400 static struct list_head	conf_id_hashtbl[CLIENT_HASH_SIZE];
401 static struct list_head	conf_str_hashtbl[CLIENT_HASH_SIZE];
402 static struct list_head	unconf_str_hashtbl[CLIENT_HASH_SIZE];
403 static struct list_head	unconf_id_hashtbl[CLIENT_HASH_SIZE];
404 static struct list_head client_lru;
405 static struct list_head close_lru;
406 
407 /*
408  * We store the NONE, READ, WRITE, and BOTH bits separately in the
409  * st_{access,deny}_bmap field of the stateid, in order to track not
410  * only what share bits are currently in force, but also what
411  * combinations of share bits previous opens have used.  This allows us
412  * to enforce the recommendation of rfc 3530 14.2.19 that the server
413  * return an error if the client attempt to downgrade to a combination
414  * of share bits not explicable by closing some of its previous opens.
415  *
416  * XXX: This enforcement is actually incomplete, since we don't keep
417  * track of access/deny bit combinations; so, e.g., we allow:
418  *
419  *	OPEN allow read, deny write
420  *	OPEN allow both, deny none
421  *	DOWNGRADE allow read, deny none
422  *
423  * which we should reject.
424  */
425 static void
426 set_access(unsigned int *access, unsigned long bmap) {
427 	int i;
428 
429 	*access = 0;
430 	for (i = 1; i < 4; i++) {
431 		if (test_bit(i, &bmap))
432 			*access |= i;
433 	}
434 }
435 
436 static void
437 set_deny(unsigned int *deny, unsigned long bmap) {
438 	int i;
439 
440 	*deny = 0;
441 	for (i = 0; i < 4; i++) {
442 		if (test_bit(i, &bmap))
443 			*deny |= i ;
444 	}
445 }
446 
447 static int
448 test_share(struct nfs4_ol_stateid *stp, struct nfsd4_open *open) {
449 	unsigned int access, deny;
450 
451 	set_access(&access, stp->st_access_bmap);
452 	set_deny(&deny, stp->st_deny_bmap);
453 	if ((access & open->op_share_deny) || (deny & open->op_share_access))
454 		return 0;
455 	return 1;
456 }
457 
458 static int nfs4_access_to_omode(u32 access)
459 {
460 	switch (access & NFS4_SHARE_ACCESS_BOTH) {
461 	case NFS4_SHARE_ACCESS_READ:
462 		return O_RDONLY;
463 	case NFS4_SHARE_ACCESS_WRITE:
464 		return O_WRONLY;
465 	case NFS4_SHARE_ACCESS_BOTH:
466 		return O_RDWR;
467 	}
468 	BUG();
469 }
470 
471 static void unhash_generic_stateid(struct nfs4_ol_stateid *stp)
472 {
473 	list_del(&stp->st_perfile);
474 	list_del(&stp->st_perstateowner);
475 }
476 
477 static void close_generic_stateid(struct nfs4_ol_stateid *stp)
478 {
479 	int i;
480 
481 	if (stp->st_access_bmap) {
482 		for (i = 1; i < 4; i++) {
483 			if (test_bit(i, &stp->st_access_bmap))
484 				nfs4_file_put_access(stp->st_file,
485 						nfs4_access_to_omode(i));
486 			__clear_bit(i, &stp->st_access_bmap);
487 		}
488 	}
489 	put_nfs4_file(stp->st_file);
490 	stp->st_file = NULL;
491 }
492 
493 static void free_generic_stateid(struct nfs4_ol_stateid *stp)
494 {
495 	kmem_cache_free(stateid_slab, stp);
496 }
497 
498 static void release_lock_stateid(struct nfs4_ol_stateid *stp)
499 {
500 	struct file *file;
501 
502 	unhash_generic_stateid(stp);
503 	unhash_stid(&stp->st_stid);
504 	file = find_any_file(stp->st_file);
505 	if (file)
506 		locks_remove_posix(file, (fl_owner_t)lockowner(stp->st_stateowner));
507 	close_generic_stateid(stp);
508 	free_generic_stateid(stp);
509 }
510 
511 static void unhash_lockowner(struct nfs4_lockowner *lo)
512 {
513 	struct nfs4_ol_stateid *stp;
514 
515 	list_del(&lo->lo_owner.so_strhash);
516 	list_del(&lo->lo_perstateid);
517 	while (!list_empty(&lo->lo_owner.so_stateids)) {
518 		stp = list_first_entry(&lo->lo_owner.so_stateids,
519 				struct nfs4_ol_stateid, st_perstateowner);
520 		release_lock_stateid(stp);
521 	}
522 }
523 
524 static void release_lockowner(struct nfs4_lockowner *lo)
525 {
526 	unhash_lockowner(lo);
527 	nfs4_free_lockowner(lo);
528 }
529 
530 static void
531 release_stateid_lockowners(struct nfs4_ol_stateid *open_stp)
532 {
533 	struct nfs4_lockowner *lo;
534 
535 	while (!list_empty(&open_stp->st_lockowners)) {
536 		lo = list_entry(open_stp->st_lockowners.next,
537 				struct nfs4_lockowner, lo_perstateid);
538 		release_lockowner(lo);
539 	}
540 }
541 
542 static void unhash_open_stateid(struct nfs4_ol_stateid *stp)
543 {
544 	unhash_generic_stateid(stp);
545 	release_stateid_lockowners(stp);
546 	close_generic_stateid(stp);
547 }
548 
549 static void release_open_stateid(struct nfs4_ol_stateid *stp)
550 {
551 	unhash_open_stateid(stp);
552 	unhash_stid(&stp->st_stid);
553 	free_generic_stateid(stp);
554 }
555 
556 static void unhash_openowner(struct nfs4_openowner *oo)
557 {
558 	struct nfs4_ol_stateid *stp;
559 
560 	list_del(&oo->oo_owner.so_strhash);
561 	list_del(&oo->oo_perclient);
562 	while (!list_empty(&oo->oo_owner.so_stateids)) {
563 		stp = list_first_entry(&oo->oo_owner.so_stateids,
564 				struct nfs4_ol_stateid, st_perstateowner);
565 		release_open_stateid(stp);
566 	}
567 }
568 
569 static void release_last_closed_stateid(struct nfs4_openowner *oo)
570 {
571 	struct nfs4_ol_stateid *s = oo->oo_last_closed_stid;
572 
573 	if (s) {
574 		unhash_stid(&s->st_stid);
575 		free_generic_stateid(s);
576 		oo->oo_last_closed_stid = NULL;
577 	}
578 }
579 
580 static void release_openowner(struct nfs4_openowner *oo)
581 {
582 	unhash_openowner(oo);
583 	list_del(&oo->oo_close_lru);
584 	release_last_closed_stateid(oo);
585 	nfs4_free_openowner(oo);
586 }
587 
588 #define SESSION_HASH_SIZE	512
589 static struct list_head sessionid_hashtbl[SESSION_HASH_SIZE];
590 
591 static inline int
592 hash_sessionid(struct nfs4_sessionid *sessionid)
593 {
594 	struct nfsd4_sessionid *sid = (struct nfsd4_sessionid *)sessionid;
595 
596 	return sid->sequence % SESSION_HASH_SIZE;
597 }
598 
599 static inline void
600 dump_sessionid(const char *fn, struct nfs4_sessionid *sessionid)
601 {
602 	u32 *ptr = (u32 *)(&sessionid->data[0]);
603 	dprintk("%s: %u:%u:%u:%u\n", fn, ptr[0], ptr[1], ptr[2], ptr[3]);
604 }
605 
606 static void
607 gen_sessionid(struct nfsd4_session *ses)
608 {
609 	struct nfs4_client *clp = ses->se_client;
610 	struct nfsd4_sessionid *sid;
611 
612 	sid = (struct nfsd4_sessionid *)ses->se_sessionid.data;
613 	sid->clientid = clp->cl_clientid;
614 	sid->sequence = current_sessionid++;
615 	sid->reserved = 0;
616 }
617 
618 /*
619  * The protocol defines ca_maxresponssize_cached to include the size of
620  * the rpc header, but all we need to cache is the data starting after
621  * the end of the initial SEQUENCE operation--the rest we regenerate
622  * each time.  Therefore we can advertise a ca_maxresponssize_cached
623  * value that is the number of bytes in our cache plus a few additional
624  * bytes.  In order to stay on the safe side, and not promise more than
625  * we can cache, those additional bytes must be the minimum possible: 24
626  * bytes of rpc header (xid through accept state, with AUTH_NULL
627  * verifier), 12 for the compound header (with zero-length tag), and 44
628  * for the SEQUENCE op response:
629  */
630 #define NFSD_MIN_HDR_SEQ_SZ  (24 + 12 + 44)
631 
632 static void
633 free_session_slots(struct nfsd4_session *ses)
634 {
635 	int i;
636 
637 	for (i = 0; i < ses->se_fchannel.maxreqs; i++)
638 		kfree(ses->se_slots[i]);
639 }
640 
641 /*
642  * We don't actually need to cache the rpc and session headers, so we
643  * can allocate a little less for each slot:
644  */
645 static inline int slot_bytes(struct nfsd4_channel_attrs *ca)
646 {
647 	return ca->maxresp_cached - NFSD_MIN_HDR_SEQ_SZ;
648 }
649 
650 static int nfsd4_sanitize_slot_size(u32 size)
651 {
652 	size -= NFSD_MIN_HDR_SEQ_SZ; /* We don't cache the rpc header */
653 	size = min_t(u32, size, NFSD_SLOT_CACHE_SIZE);
654 
655 	return size;
656 }
657 
658 /*
659  * XXX: If we run out of reserved DRC memory we could (up to a point)
660  * re-negotiate active sessions and reduce their slot usage to make
661  * rooom for new connections. For now we just fail the create session.
662  */
663 static int nfsd4_get_drc_mem(int slotsize, u32 num)
664 {
665 	int avail;
666 
667 	num = min_t(u32, num, NFSD_MAX_SLOTS_PER_SESSION);
668 
669 	spin_lock(&nfsd_drc_lock);
670 	avail = min_t(int, NFSD_MAX_MEM_PER_SESSION,
671 			nfsd_drc_max_mem - nfsd_drc_mem_used);
672 	num = min_t(int, num, avail / slotsize);
673 	nfsd_drc_mem_used += num * slotsize;
674 	spin_unlock(&nfsd_drc_lock);
675 
676 	return num;
677 }
678 
679 static void nfsd4_put_drc_mem(int slotsize, int num)
680 {
681 	spin_lock(&nfsd_drc_lock);
682 	nfsd_drc_mem_used -= slotsize * num;
683 	spin_unlock(&nfsd_drc_lock);
684 }
685 
686 static struct nfsd4_session *alloc_session(int slotsize, int numslots)
687 {
688 	struct nfsd4_session *new;
689 	int mem, i;
690 
691 	BUILD_BUG_ON(NFSD_MAX_SLOTS_PER_SESSION * sizeof(struct nfsd4_slot *)
692 			+ sizeof(struct nfsd4_session) > PAGE_SIZE);
693 	mem = numslots * sizeof(struct nfsd4_slot *);
694 
695 	new = kzalloc(sizeof(*new) + mem, GFP_KERNEL);
696 	if (!new)
697 		return NULL;
698 	/* allocate each struct nfsd4_slot and data cache in one piece */
699 	for (i = 0; i < numslots; i++) {
700 		mem = sizeof(struct nfsd4_slot) + slotsize;
701 		new->se_slots[i] = kzalloc(mem, GFP_KERNEL);
702 		if (!new->se_slots[i])
703 			goto out_free;
704 	}
705 	return new;
706 out_free:
707 	while (i--)
708 		kfree(new->se_slots[i]);
709 	kfree(new);
710 	return NULL;
711 }
712 
713 static void init_forechannel_attrs(struct nfsd4_channel_attrs *new, struct nfsd4_channel_attrs *req, int numslots, int slotsize)
714 {
715 	u32 maxrpc = nfsd_serv->sv_max_mesg;
716 
717 	new->maxreqs = numslots;
718 	new->maxresp_cached = min_t(u32, req->maxresp_cached,
719 					slotsize + NFSD_MIN_HDR_SEQ_SZ);
720 	new->maxreq_sz = min_t(u32, req->maxreq_sz, maxrpc);
721 	new->maxresp_sz = min_t(u32, req->maxresp_sz, maxrpc);
722 	new->maxops = min_t(u32, req->maxops, NFSD_MAX_OPS_PER_COMPOUND);
723 }
724 
725 static void free_conn(struct nfsd4_conn *c)
726 {
727 	svc_xprt_put(c->cn_xprt);
728 	kfree(c);
729 }
730 
731 static void nfsd4_conn_lost(struct svc_xpt_user *u)
732 {
733 	struct nfsd4_conn *c = container_of(u, struct nfsd4_conn, cn_xpt_user);
734 	struct nfs4_client *clp = c->cn_session->se_client;
735 
736 	spin_lock(&clp->cl_lock);
737 	if (!list_empty(&c->cn_persession)) {
738 		list_del(&c->cn_persession);
739 		free_conn(c);
740 	}
741 	spin_unlock(&clp->cl_lock);
742 	nfsd4_probe_callback(clp);
743 }
744 
745 static struct nfsd4_conn *alloc_conn(struct svc_rqst *rqstp, u32 flags)
746 {
747 	struct nfsd4_conn *conn;
748 
749 	conn = kmalloc(sizeof(struct nfsd4_conn), GFP_KERNEL);
750 	if (!conn)
751 		return NULL;
752 	svc_xprt_get(rqstp->rq_xprt);
753 	conn->cn_xprt = rqstp->rq_xprt;
754 	conn->cn_flags = flags;
755 	INIT_LIST_HEAD(&conn->cn_xpt_user.list);
756 	return conn;
757 }
758 
759 static void __nfsd4_hash_conn(struct nfsd4_conn *conn, struct nfsd4_session *ses)
760 {
761 	conn->cn_session = ses;
762 	list_add(&conn->cn_persession, &ses->se_conns);
763 }
764 
765 static void nfsd4_hash_conn(struct nfsd4_conn *conn, struct nfsd4_session *ses)
766 {
767 	struct nfs4_client *clp = ses->se_client;
768 
769 	spin_lock(&clp->cl_lock);
770 	__nfsd4_hash_conn(conn, ses);
771 	spin_unlock(&clp->cl_lock);
772 }
773 
774 static int nfsd4_register_conn(struct nfsd4_conn *conn)
775 {
776 	conn->cn_xpt_user.callback = nfsd4_conn_lost;
777 	return register_xpt_user(conn->cn_xprt, &conn->cn_xpt_user);
778 }
779 
780 static __be32 nfsd4_new_conn(struct svc_rqst *rqstp, struct nfsd4_session *ses, u32 dir)
781 {
782 	struct nfsd4_conn *conn;
783 	int ret;
784 
785 	conn = alloc_conn(rqstp, dir);
786 	if (!conn)
787 		return nfserr_jukebox;
788 	nfsd4_hash_conn(conn, ses);
789 	ret = nfsd4_register_conn(conn);
790 	if (ret)
791 		/* oops; xprt is already down: */
792 		nfsd4_conn_lost(&conn->cn_xpt_user);
793 	return nfs_ok;
794 }
795 
796 static __be32 nfsd4_new_conn_from_crses(struct svc_rqst *rqstp, struct nfsd4_session *ses)
797 {
798 	u32 dir = NFS4_CDFC4_FORE;
799 
800 	if (ses->se_flags & SESSION4_BACK_CHAN)
801 		dir |= NFS4_CDFC4_BACK;
802 
803 	return nfsd4_new_conn(rqstp, ses, dir);
804 }
805 
806 /* must be called under client_lock */
807 static void nfsd4_del_conns(struct nfsd4_session *s)
808 {
809 	struct nfs4_client *clp = s->se_client;
810 	struct nfsd4_conn *c;
811 
812 	spin_lock(&clp->cl_lock);
813 	while (!list_empty(&s->se_conns)) {
814 		c = list_first_entry(&s->se_conns, struct nfsd4_conn, cn_persession);
815 		list_del_init(&c->cn_persession);
816 		spin_unlock(&clp->cl_lock);
817 
818 		unregister_xpt_user(c->cn_xprt, &c->cn_xpt_user);
819 		free_conn(c);
820 
821 		spin_lock(&clp->cl_lock);
822 	}
823 	spin_unlock(&clp->cl_lock);
824 }
825 
826 void free_session(struct kref *kref)
827 {
828 	struct nfsd4_session *ses;
829 	int mem;
830 
831 	ses = container_of(kref, struct nfsd4_session, se_ref);
832 	nfsd4_del_conns(ses);
833 	spin_lock(&nfsd_drc_lock);
834 	mem = ses->se_fchannel.maxreqs * slot_bytes(&ses->se_fchannel);
835 	nfsd_drc_mem_used -= mem;
836 	spin_unlock(&nfsd_drc_lock);
837 	free_session_slots(ses);
838 	kfree(ses);
839 }
840 
841 static struct nfsd4_session *alloc_init_session(struct svc_rqst *rqstp, struct nfs4_client *clp, struct nfsd4_create_session *cses)
842 {
843 	struct nfsd4_session *new;
844 	struct nfsd4_channel_attrs *fchan = &cses->fore_channel;
845 	int numslots, slotsize;
846 	int status;
847 	int idx;
848 
849 	/*
850 	 * Note decreasing slot size below client's request may
851 	 * make it difficult for client to function correctly, whereas
852 	 * decreasing the number of slots will (just?) affect
853 	 * performance.  When short on memory we therefore prefer to
854 	 * decrease number of slots instead of their size.
855 	 */
856 	slotsize = nfsd4_sanitize_slot_size(fchan->maxresp_cached);
857 	numslots = nfsd4_get_drc_mem(slotsize, fchan->maxreqs);
858 	if (numslots < 1)
859 		return NULL;
860 
861 	new = alloc_session(slotsize, numslots);
862 	if (!new) {
863 		nfsd4_put_drc_mem(slotsize, fchan->maxreqs);
864 		return NULL;
865 	}
866 	init_forechannel_attrs(&new->se_fchannel, fchan, numslots, slotsize);
867 
868 	new->se_client = clp;
869 	gen_sessionid(new);
870 
871 	INIT_LIST_HEAD(&new->se_conns);
872 
873 	new->se_cb_seq_nr = 1;
874 	new->se_flags = cses->flags;
875 	new->se_cb_prog = cses->callback_prog;
876 	kref_init(&new->se_ref);
877 	idx = hash_sessionid(&new->se_sessionid);
878 	spin_lock(&client_lock);
879 	list_add(&new->se_hash, &sessionid_hashtbl[idx]);
880 	spin_lock(&clp->cl_lock);
881 	list_add(&new->se_perclnt, &clp->cl_sessions);
882 	spin_unlock(&clp->cl_lock);
883 	spin_unlock(&client_lock);
884 
885 	status = nfsd4_new_conn_from_crses(rqstp, new);
886 	/* whoops: benny points out, status is ignored! (err, or bogus) */
887 	if (status) {
888 		free_session(&new->se_ref);
889 		return NULL;
890 	}
891 	if (cses->flags & SESSION4_BACK_CHAN) {
892 		struct sockaddr *sa = svc_addr(rqstp);
893 		/*
894 		 * This is a little silly; with sessions there's no real
895 		 * use for the callback address.  Use the peer address
896 		 * as a reasonable default for now, but consider fixing
897 		 * the rpc client not to require an address in the
898 		 * future:
899 		 */
900 		rpc_copy_addr((struct sockaddr *)&clp->cl_cb_conn.cb_addr, sa);
901 		clp->cl_cb_conn.cb_addrlen = svc_addr_len(sa);
902 	}
903 	nfsd4_probe_callback(clp);
904 	return new;
905 }
906 
907 /* caller must hold client_lock */
908 static struct nfsd4_session *
909 find_in_sessionid_hashtbl(struct nfs4_sessionid *sessionid)
910 {
911 	struct nfsd4_session *elem;
912 	int idx;
913 
914 	dump_sessionid(__func__, sessionid);
915 	idx = hash_sessionid(sessionid);
916 	/* Search in the appropriate list */
917 	list_for_each_entry(elem, &sessionid_hashtbl[idx], se_hash) {
918 		if (!memcmp(elem->se_sessionid.data, sessionid->data,
919 			    NFS4_MAX_SESSIONID_LEN)) {
920 			return elem;
921 		}
922 	}
923 
924 	dprintk("%s: session not found\n", __func__);
925 	return NULL;
926 }
927 
928 /* caller must hold client_lock */
929 static void
930 unhash_session(struct nfsd4_session *ses)
931 {
932 	list_del(&ses->se_hash);
933 	spin_lock(&ses->se_client->cl_lock);
934 	list_del(&ses->se_perclnt);
935 	spin_unlock(&ses->se_client->cl_lock);
936 }
937 
938 /* must be called under the client_lock */
939 static inline void
940 renew_client_locked(struct nfs4_client *clp)
941 {
942 	if (is_client_expired(clp)) {
943 		dprintk("%s: client (clientid %08x/%08x) already expired\n",
944 			__func__,
945 			clp->cl_clientid.cl_boot,
946 			clp->cl_clientid.cl_id);
947 		return;
948 	}
949 
950 	dprintk("renewing client (clientid %08x/%08x)\n",
951 			clp->cl_clientid.cl_boot,
952 			clp->cl_clientid.cl_id);
953 	list_move_tail(&clp->cl_lru, &client_lru);
954 	clp->cl_time = get_seconds();
955 }
956 
957 static inline void
958 renew_client(struct nfs4_client *clp)
959 {
960 	spin_lock(&client_lock);
961 	renew_client_locked(clp);
962 	spin_unlock(&client_lock);
963 }
964 
965 /* SETCLIENTID and SETCLIENTID_CONFIRM Helper functions */
966 static int
967 STALE_CLIENTID(clientid_t *clid)
968 {
969 	if (clid->cl_boot == boot_time)
970 		return 0;
971 	dprintk("NFSD stale clientid (%08x/%08x) boot_time %08lx\n",
972 		clid->cl_boot, clid->cl_id, boot_time);
973 	return 1;
974 }
975 
976 /*
977  * XXX Should we use a slab cache ?
978  * This type of memory management is somewhat inefficient, but we use it
979  * anyway since SETCLIENTID is not a common operation.
980  */
981 static struct nfs4_client *alloc_client(struct xdr_netobj name)
982 {
983 	struct nfs4_client *clp;
984 
985 	clp = kzalloc(sizeof(struct nfs4_client), GFP_KERNEL);
986 	if (clp == NULL)
987 		return NULL;
988 	clp->cl_name.data = kmalloc(name.len, GFP_KERNEL);
989 	if (clp->cl_name.data == NULL) {
990 		kfree(clp);
991 		return NULL;
992 	}
993 	memcpy(clp->cl_name.data, name.data, name.len);
994 	clp->cl_name.len = name.len;
995 	return clp;
996 }
997 
998 static inline void
999 free_client(struct nfs4_client *clp)
1000 {
1001 	while (!list_empty(&clp->cl_sessions)) {
1002 		struct nfsd4_session *ses;
1003 		ses = list_entry(clp->cl_sessions.next, struct nfsd4_session,
1004 				se_perclnt);
1005 		list_del(&ses->se_perclnt);
1006 		nfsd4_put_session(ses);
1007 	}
1008 	if (clp->cl_cred.cr_group_info)
1009 		put_group_info(clp->cl_cred.cr_group_info);
1010 	kfree(clp->cl_principal);
1011 	kfree(clp->cl_name.data);
1012 	kfree(clp);
1013 }
1014 
1015 void
1016 release_session_client(struct nfsd4_session *session)
1017 {
1018 	struct nfs4_client *clp = session->se_client;
1019 
1020 	if (!atomic_dec_and_lock(&clp->cl_refcount, &client_lock))
1021 		return;
1022 	if (is_client_expired(clp)) {
1023 		free_client(clp);
1024 		session->se_client = NULL;
1025 	} else
1026 		renew_client_locked(clp);
1027 	spin_unlock(&client_lock);
1028 }
1029 
1030 /* must be called under the client_lock */
1031 static inline void
1032 unhash_client_locked(struct nfs4_client *clp)
1033 {
1034 	struct nfsd4_session *ses;
1035 
1036 	mark_client_expired(clp);
1037 	list_del(&clp->cl_lru);
1038 	spin_lock(&clp->cl_lock);
1039 	list_for_each_entry(ses, &clp->cl_sessions, se_perclnt)
1040 		list_del_init(&ses->se_hash);
1041 	spin_unlock(&clp->cl_lock);
1042 }
1043 
1044 static void
1045 expire_client(struct nfs4_client *clp)
1046 {
1047 	struct nfs4_openowner *oo;
1048 	struct nfs4_delegation *dp;
1049 	struct list_head reaplist;
1050 
1051 	INIT_LIST_HEAD(&reaplist);
1052 	spin_lock(&recall_lock);
1053 	while (!list_empty(&clp->cl_delegations)) {
1054 		dp = list_entry(clp->cl_delegations.next, struct nfs4_delegation, dl_perclnt);
1055 		list_del_init(&dp->dl_perclnt);
1056 		list_move(&dp->dl_recall_lru, &reaplist);
1057 	}
1058 	spin_unlock(&recall_lock);
1059 	while (!list_empty(&reaplist)) {
1060 		dp = list_entry(reaplist.next, struct nfs4_delegation, dl_recall_lru);
1061 		list_del_init(&dp->dl_recall_lru);
1062 		unhash_delegation(dp);
1063 	}
1064 	while (!list_empty(&clp->cl_openowners)) {
1065 		oo = list_entry(clp->cl_openowners.next, struct nfs4_openowner, oo_perclient);
1066 		release_openowner(oo);
1067 	}
1068 	nfsd4_shutdown_callback(clp);
1069 	if (clp->cl_cb_conn.cb_xprt)
1070 		svc_xprt_put(clp->cl_cb_conn.cb_xprt);
1071 	list_del(&clp->cl_idhash);
1072 	list_del(&clp->cl_strhash);
1073 	spin_lock(&client_lock);
1074 	unhash_client_locked(clp);
1075 	if (atomic_read(&clp->cl_refcount) == 0)
1076 		free_client(clp);
1077 	spin_unlock(&client_lock);
1078 }
1079 
1080 static void copy_verf(struct nfs4_client *target, nfs4_verifier *source)
1081 {
1082 	memcpy(target->cl_verifier.data, source->data,
1083 			sizeof(target->cl_verifier.data));
1084 }
1085 
1086 static void copy_clid(struct nfs4_client *target, struct nfs4_client *source)
1087 {
1088 	target->cl_clientid.cl_boot = source->cl_clientid.cl_boot;
1089 	target->cl_clientid.cl_id = source->cl_clientid.cl_id;
1090 }
1091 
1092 static void copy_cred(struct svc_cred *target, struct svc_cred *source)
1093 {
1094 	target->cr_uid = source->cr_uid;
1095 	target->cr_gid = source->cr_gid;
1096 	target->cr_group_info = source->cr_group_info;
1097 	get_group_info(target->cr_group_info);
1098 }
1099 
1100 static int same_name(const char *n1, const char *n2)
1101 {
1102 	return 0 == memcmp(n1, n2, HEXDIR_LEN);
1103 }
1104 
1105 static int
1106 same_verf(nfs4_verifier *v1, nfs4_verifier *v2)
1107 {
1108 	return 0 == memcmp(v1->data, v2->data, sizeof(v1->data));
1109 }
1110 
1111 static int
1112 same_clid(clientid_t *cl1, clientid_t *cl2)
1113 {
1114 	return (cl1->cl_boot == cl2->cl_boot) && (cl1->cl_id == cl2->cl_id);
1115 }
1116 
1117 /* XXX what about NGROUP */
1118 static int
1119 same_creds(struct svc_cred *cr1, struct svc_cred *cr2)
1120 {
1121 	return cr1->cr_uid == cr2->cr_uid;
1122 }
1123 
1124 static void gen_clid(struct nfs4_client *clp)
1125 {
1126 	static u32 current_clientid = 1;
1127 
1128 	clp->cl_clientid.cl_boot = boot_time;
1129 	clp->cl_clientid.cl_id = current_clientid++;
1130 }
1131 
1132 static void gen_confirm(struct nfs4_client *clp)
1133 {
1134 	static u32 i;
1135 	u32 *p;
1136 
1137 	p = (u32 *)clp->cl_confirm.data;
1138 	*p++ = get_seconds();
1139 	*p++ = i++;
1140 }
1141 
1142 static struct nfs4_stid *find_stateid(struct nfs4_client *cl, stateid_t *t)
1143 {
1144 	return idr_find(&cl->cl_stateids, t->si_opaque.so_id);
1145 }
1146 
1147 static struct nfs4_stid *find_stateid_by_type(struct nfs4_client *cl, stateid_t *t, char typemask)
1148 {
1149 	struct nfs4_stid *s;
1150 
1151 	s = find_stateid(cl, t);
1152 	if (!s)
1153 		return NULL;
1154 	if (typemask & s->sc_type)
1155 		return s;
1156 	return NULL;
1157 }
1158 
1159 static struct nfs4_client *create_client(struct xdr_netobj name, char *recdir,
1160 		struct svc_rqst *rqstp, nfs4_verifier *verf)
1161 {
1162 	struct nfs4_client *clp;
1163 	struct sockaddr *sa = svc_addr(rqstp);
1164 	char *princ;
1165 
1166 	clp = alloc_client(name);
1167 	if (clp == NULL)
1168 		return NULL;
1169 
1170 	INIT_LIST_HEAD(&clp->cl_sessions);
1171 
1172 	princ = svc_gss_principal(rqstp);
1173 	if (princ) {
1174 		clp->cl_principal = kstrdup(princ, GFP_KERNEL);
1175 		if (clp->cl_principal == NULL) {
1176 			free_client(clp);
1177 			return NULL;
1178 		}
1179 	}
1180 
1181 	idr_init(&clp->cl_stateids);
1182 	memcpy(clp->cl_recdir, recdir, HEXDIR_LEN);
1183 	atomic_set(&clp->cl_refcount, 0);
1184 	clp->cl_cb_state = NFSD4_CB_UNKNOWN;
1185 	INIT_LIST_HEAD(&clp->cl_idhash);
1186 	INIT_LIST_HEAD(&clp->cl_strhash);
1187 	INIT_LIST_HEAD(&clp->cl_openowners);
1188 	INIT_LIST_HEAD(&clp->cl_delegations);
1189 	INIT_LIST_HEAD(&clp->cl_lru);
1190 	INIT_LIST_HEAD(&clp->cl_callbacks);
1191 	spin_lock_init(&clp->cl_lock);
1192 	INIT_WORK(&clp->cl_cb_null.cb_work, nfsd4_do_callback_rpc);
1193 	clp->cl_time = get_seconds();
1194 	clear_bit(0, &clp->cl_cb_slot_busy);
1195 	rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table");
1196 	copy_verf(clp, verf);
1197 	rpc_copy_addr((struct sockaddr *) &clp->cl_addr, sa);
1198 	clp->cl_flavor = rqstp->rq_flavor;
1199 	copy_cred(&clp->cl_cred, &rqstp->rq_cred);
1200 	gen_confirm(clp);
1201 	clp->cl_cb_session = NULL;
1202 	return clp;
1203 }
1204 
1205 static void
1206 add_to_unconfirmed(struct nfs4_client *clp, unsigned int strhashval)
1207 {
1208 	unsigned int idhashval;
1209 
1210 	list_add(&clp->cl_strhash, &unconf_str_hashtbl[strhashval]);
1211 	idhashval = clientid_hashval(clp->cl_clientid.cl_id);
1212 	list_add(&clp->cl_idhash, &unconf_id_hashtbl[idhashval]);
1213 	renew_client(clp);
1214 }
1215 
1216 static void
1217 move_to_confirmed(struct nfs4_client *clp)
1218 {
1219 	unsigned int idhashval = clientid_hashval(clp->cl_clientid.cl_id);
1220 	unsigned int strhashval;
1221 
1222 	dprintk("NFSD: move_to_confirm nfs4_client %p\n", clp);
1223 	list_move(&clp->cl_idhash, &conf_id_hashtbl[idhashval]);
1224 	strhashval = clientstr_hashval(clp->cl_recdir);
1225 	list_move(&clp->cl_strhash, &conf_str_hashtbl[strhashval]);
1226 	renew_client(clp);
1227 }
1228 
1229 static struct nfs4_client *
1230 find_confirmed_client(clientid_t *clid)
1231 {
1232 	struct nfs4_client *clp;
1233 	unsigned int idhashval = clientid_hashval(clid->cl_id);
1234 
1235 	list_for_each_entry(clp, &conf_id_hashtbl[idhashval], cl_idhash) {
1236 		if (same_clid(&clp->cl_clientid, clid)) {
1237 			renew_client(clp);
1238 			return clp;
1239 		}
1240 	}
1241 	return NULL;
1242 }
1243 
1244 static struct nfs4_client *
1245 find_unconfirmed_client(clientid_t *clid)
1246 {
1247 	struct nfs4_client *clp;
1248 	unsigned int idhashval = clientid_hashval(clid->cl_id);
1249 
1250 	list_for_each_entry(clp, &unconf_id_hashtbl[idhashval], cl_idhash) {
1251 		if (same_clid(&clp->cl_clientid, clid))
1252 			return clp;
1253 	}
1254 	return NULL;
1255 }
1256 
1257 static bool clp_used_exchangeid(struct nfs4_client *clp)
1258 {
1259 	return clp->cl_exchange_flags != 0;
1260 }
1261 
1262 static struct nfs4_client *
1263 find_confirmed_client_by_str(const char *dname, unsigned int hashval)
1264 {
1265 	struct nfs4_client *clp;
1266 
1267 	list_for_each_entry(clp, &conf_str_hashtbl[hashval], cl_strhash) {
1268 		if (same_name(clp->cl_recdir, dname))
1269 			return clp;
1270 	}
1271 	return NULL;
1272 }
1273 
1274 static struct nfs4_client *
1275 find_unconfirmed_client_by_str(const char *dname, unsigned int hashval)
1276 {
1277 	struct nfs4_client *clp;
1278 
1279 	list_for_each_entry(clp, &unconf_str_hashtbl[hashval], cl_strhash) {
1280 		if (same_name(clp->cl_recdir, dname))
1281 			return clp;
1282 	}
1283 	return NULL;
1284 }
1285 
1286 static void
1287 gen_callback(struct nfs4_client *clp, struct nfsd4_setclientid *se, struct svc_rqst *rqstp)
1288 {
1289 	struct nfs4_cb_conn *conn = &clp->cl_cb_conn;
1290 	struct sockaddr	*sa = svc_addr(rqstp);
1291 	u32 scopeid = rpc_get_scope_id(sa);
1292 	unsigned short expected_family;
1293 
1294 	/* Currently, we only support tcp and tcp6 for the callback channel */
1295 	if (se->se_callback_netid_len == 3 &&
1296 	    !memcmp(se->se_callback_netid_val, "tcp", 3))
1297 		expected_family = AF_INET;
1298 	else if (se->se_callback_netid_len == 4 &&
1299 		 !memcmp(se->se_callback_netid_val, "tcp6", 4))
1300 		expected_family = AF_INET6;
1301 	else
1302 		goto out_err;
1303 
1304 	conn->cb_addrlen = rpc_uaddr2sockaddr(se->se_callback_addr_val,
1305 					    se->se_callback_addr_len,
1306 					    (struct sockaddr *)&conn->cb_addr,
1307 					    sizeof(conn->cb_addr));
1308 
1309 	if (!conn->cb_addrlen || conn->cb_addr.ss_family != expected_family)
1310 		goto out_err;
1311 
1312 	if (conn->cb_addr.ss_family == AF_INET6)
1313 		((struct sockaddr_in6 *)&conn->cb_addr)->sin6_scope_id = scopeid;
1314 
1315 	conn->cb_prog = se->se_callback_prog;
1316 	conn->cb_ident = se->se_callback_ident;
1317 	memcpy(&conn->cb_saddr, &rqstp->rq_daddr, rqstp->rq_daddrlen);
1318 	return;
1319 out_err:
1320 	conn->cb_addr.ss_family = AF_UNSPEC;
1321 	conn->cb_addrlen = 0;
1322 	dprintk(KERN_INFO "NFSD: this client (clientid %08x/%08x) "
1323 		"will not receive delegations\n",
1324 		clp->cl_clientid.cl_boot, clp->cl_clientid.cl_id);
1325 
1326 	return;
1327 }
1328 
1329 /*
1330  * Cache a reply. nfsd4_check_drc_limit() has bounded the cache size.
1331  */
1332 void
1333 nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
1334 {
1335 	struct nfsd4_slot *slot = resp->cstate.slot;
1336 	unsigned int base;
1337 
1338 	dprintk("--> %s slot %p\n", __func__, slot);
1339 
1340 	slot->sl_opcnt = resp->opcnt;
1341 	slot->sl_status = resp->cstate.status;
1342 
1343 	if (nfsd4_not_cached(resp)) {
1344 		slot->sl_datalen = 0;
1345 		return;
1346 	}
1347 	slot->sl_datalen = (char *)resp->p - (char *)resp->cstate.datap;
1348 	base = (char *)resp->cstate.datap -
1349 					(char *)resp->xbuf->head[0].iov_base;
1350 	if (read_bytes_from_xdr_buf(resp->xbuf, base, slot->sl_data,
1351 				    slot->sl_datalen))
1352 		WARN("%s: sessions DRC could not cache compound\n", __func__);
1353 	return;
1354 }
1355 
1356 /*
1357  * Encode the replay sequence operation from the slot values.
1358  * If cachethis is FALSE encode the uncached rep error on the next
1359  * operation which sets resp->p and increments resp->opcnt for
1360  * nfs4svc_encode_compoundres.
1361  *
1362  */
1363 static __be32
1364 nfsd4_enc_sequence_replay(struct nfsd4_compoundargs *args,
1365 			  struct nfsd4_compoundres *resp)
1366 {
1367 	struct nfsd4_op *op;
1368 	struct nfsd4_slot *slot = resp->cstate.slot;
1369 
1370 	dprintk("--> %s resp->opcnt %d cachethis %u \n", __func__,
1371 		resp->opcnt, resp->cstate.slot->sl_cachethis);
1372 
1373 	/* Encode the replayed sequence operation */
1374 	op = &args->ops[resp->opcnt - 1];
1375 	nfsd4_encode_operation(resp, op);
1376 
1377 	/* Return nfserr_retry_uncached_rep in next operation. */
1378 	if (args->opcnt > 1 && slot->sl_cachethis == 0) {
1379 		op = &args->ops[resp->opcnt++];
1380 		op->status = nfserr_retry_uncached_rep;
1381 		nfsd4_encode_operation(resp, op);
1382 	}
1383 	return op->status;
1384 }
1385 
1386 /*
1387  * The sequence operation is not cached because we can use the slot and
1388  * session values.
1389  */
1390 __be32
1391 nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
1392 			 struct nfsd4_sequence *seq)
1393 {
1394 	struct nfsd4_slot *slot = resp->cstate.slot;
1395 	__be32 status;
1396 
1397 	dprintk("--> %s slot %p\n", __func__, slot);
1398 
1399 	/* Either returns 0 or nfserr_retry_uncached */
1400 	status = nfsd4_enc_sequence_replay(resp->rqstp->rq_argp, resp);
1401 	if (status == nfserr_retry_uncached_rep)
1402 		return status;
1403 
1404 	/* The sequence operation has been encoded, cstate->datap set. */
1405 	memcpy(resp->cstate.datap, slot->sl_data, slot->sl_datalen);
1406 
1407 	resp->opcnt = slot->sl_opcnt;
1408 	resp->p = resp->cstate.datap + XDR_QUADLEN(slot->sl_datalen);
1409 	status = slot->sl_status;
1410 
1411 	return status;
1412 }
1413 
1414 /*
1415  * Set the exchange_id flags returned by the server.
1416  */
1417 static void
1418 nfsd4_set_ex_flags(struct nfs4_client *new, struct nfsd4_exchange_id *clid)
1419 {
1420 	/* pNFS is not supported */
1421 	new->cl_exchange_flags |= EXCHGID4_FLAG_USE_NON_PNFS;
1422 
1423 	/* Referrals are supported, Migration is not. */
1424 	new->cl_exchange_flags |= EXCHGID4_FLAG_SUPP_MOVED_REFER;
1425 
1426 	/* set the wire flags to return to client. */
1427 	clid->flags = new->cl_exchange_flags;
1428 }
1429 
1430 __be32
1431 nfsd4_exchange_id(struct svc_rqst *rqstp,
1432 		  struct nfsd4_compound_state *cstate,
1433 		  struct nfsd4_exchange_id *exid)
1434 {
1435 	struct nfs4_client *unconf, *conf, *new;
1436 	int status;
1437 	unsigned int		strhashval;
1438 	char			dname[HEXDIR_LEN];
1439 	char			addr_str[INET6_ADDRSTRLEN];
1440 	nfs4_verifier		verf = exid->verifier;
1441 	struct sockaddr		*sa = svc_addr(rqstp);
1442 
1443 	rpc_ntop(sa, addr_str, sizeof(addr_str));
1444 	dprintk("%s rqstp=%p exid=%p clname.len=%u clname.data=%p "
1445 		"ip_addr=%s flags %x, spa_how %d\n",
1446 		__func__, rqstp, exid, exid->clname.len, exid->clname.data,
1447 		addr_str, exid->flags, exid->spa_how);
1448 
1449 	if (exid->flags & ~EXCHGID4_FLAG_MASK_A)
1450 		return nfserr_inval;
1451 
1452 	/* Currently only support SP4_NONE */
1453 	switch (exid->spa_how) {
1454 	case SP4_NONE:
1455 		break;
1456 	case SP4_SSV:
1457 		return nfserr_serverfault;
1458 	default:
1459 		BUG();				/* checked by xdr code */
1460 	case SP4_MACH_CRED:
1461 		return nfserr_serverfault;	/* no excuse :-/ */
1462 	}
1463 
1464 	status = nfs4_make_rec_clidname(dname, &exid->clname);
1465 
1466 	if (status)
1467 		goto error;
1468 
1469 	strhashval = clientstr_hashval(dname);
1470 
1471 	nfs4_lock_state();
1472 	status = nfs_ok;
1473 
1474 	conf = find_confirmed_client_by_str(dname, strhashval);
1475 	if (conf) {
1476 		if (!clp_used_exchangeid(conf)) {
1477 			status = nfserr_clid_inuse; /* XXX: ? */
1478 			goto out;
1479 		}
1480 		if (!same_verf(&verf, &conf->cl_verifier)) {
1481 			/* 18.35.4 case 8 */
1482 			if (exid->flags & EXCHGID4_FLAG_UPD_CONFIRMED_REC_A) {
1483 				status = nfserr_not_same;
1484 				goto out;
1485 			}
1486 			/* Client reboot: destroy old state */
1487 			expire_client(conf);
1488 			goto out_new;
1489 		}
1490 		if (!same_creds(&conf->cl_cred, &rqstp->rq_cred)) {
1491 			/* 18.35.4 case 9 */
1492 			if (exid->flags & EXCHGID4_FLAG_UPD_CONFIRMED_REC_A) {
1493 				status = nfserr_perm;
1494 				goto out;
1495 			}
1496 			expire_client(conf);
1497 			goto out_new;
1498 		}
1499 		/*
1500 		 * Set bit when the owner id and verifier map to an already
1501 		 * confirmed client id (18.35.3).
1502 		 */
1503 		exid->flags |= EXCHGID4_FLAG_CONFIRMED_R;
1504 
1505 		/*
1506 		 * Falling into 18.35.4 case 2, possible router replay.
1507 		 * Leave confirmed record intact and return same result.
1508 		 */
1509 		copy_verf(conf, &verf);
1510 		new = conf;
1511 		goto out_copy;
1512 	}
1513 
1514 	/* 18.35.4 case 7 */
1515 	if (exid->flags & EXCHGID4_FLAG_UPD_CONFIRMED_REC_A) {
1516 		status = nfserr_noent;
1517 		goto out;
1518 	}
1519 
1520 	unconf  = find_unconfirmed_client_by_str(dname, strhashval);
1521 	if (unconf) {
1522 		/*
1523 		 * Possible retry or client restart.  Per 18.35.4 case 4,
1524 		 * a new unconfirmed record should be generated regardless
1525 		 * of whether any properties have changed.
1526 		 */
1527 		expire_client(unconf);
1528 	}
1529 
1530 out_new:
1531 	/* Normal case */
1532 	new = create_client(exid->clname, dname, rqstp, &verf);
1533 	if (new == NULL) {
1534 		status = nfserr_jukebox;
1535 		goto out;
1536 	}
1537 
1538 	gen_clid(new);
1539 	add_to_unconfirmed(new, strhashval);
1540 out_copy:
1541 	exid->clientid.cl_boot = new->cl_clientid.cl_boot;
1542 	exid->clientid.cl_id = new->cl_clientid.cl_id;
1543 
1544 	exid->seqid = 1;
1545 	nfsd4_set_ex_flags(new, exid);
1546 
1547 	dprintk("nfsd4_exchange_id seqid %d flags %x\n",
1548 		new->cl_cs_slot.sl_seqid, new->cl_exchange_flags);
1549 	status = nfs_ok;
1550 
1551 out:
1552 	nfs4_unlock_state();
1553 error:
1554 	dprintk("nfsd4_exchange_id returns %d\n", ntohl(status));
1555 	return status;
1556 }
1557 
1558 static int
1559 check_slot_seqid(u32 seqid, u32 slot_seqid, int slot_inuse)
1560 {
1561 	dprintk("%s enter. seqid %d slot_seqid %d\n", __func__, seqid,
1562 		slot_seqid);
1563 
1564 	/* The slot is in use, and no response has been sent. */
1565 	if (slot_inuse) {
1566 		if (seqid == slot_seqid)
1567 			return nfserr_jukebox;
1568 		else
1569 			return nfserr_seq_misordered;
1570 	}
1571 	/* Normal */
1572 	if (likely(seqid == slot_seqid + 1))
1573 		return nfs_ok;
1574 	/* Replay */
1575 	if (seqid == slot_seqid)
1576 		return nfserr_replay_cache;
1577 	/* Wraparound */
1578 	if (seqid == 1 && (slot_seqid + 1) == 0)
1579 		return nfs_ok;
1580 	/* Misordered replay or misordered new request */
1581 	return nfserr_seq_misordered;
1582 }
1583 
1584 /*
1585  * Cache the create session result into the create session single DRC
1586  * slot cache by saving the xdr structure. sl_seqid has been set.
1587  * Do this for solo or embedded create session operations.
1588  */
1589 static void
1590 nfsd4_cache_create_session(struct nfsd4_create_session *cr_ses,
1591 			   struct nfsd4_clid_slot *slot, int nfserr)
1592 {
1593 	slot->sl_status = nfserr;
1594 	memcpy(&slot->sl_cr_ses, cr_ses, sizeof(*cr_ses));
1595 }
1596 
1597 static __be32
1598 nfsd4_replay_create_session(struct nfsd4_create_session *cr_ses,
1599 			    struct nfsd4_clid_slot *slot)
1600 {
1601 	memcpy(cr_ses, &slot->sl_cr_ses, sizeof(*cr_ses));
1602 	return slot->sl_status;
1603 }
1604 
1605 #define NFSD_MIN_REQ_HDR_SEQ_SZ	((\
1606 			2 * 2 + /* credential,verifier: AUTH_NULL, length 0 */ \
1607 			1 +	/* MIN tag is length with zero, only length */ \
1608 			3 +	/* version, opcount, opcode */ \
1609 			XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN) + \
1610 				/* seqid, slotID, slotID, cache */ \
1611 			4 ) * sizeof(__be32))
1612 
1613 #define NFSD_MIN_RESP_HDR_SEQ_SZ ((\
1614 			2 +	/* verifier: AUTH_NULL, length 0 */\
1615 			1 +	/* status */ \
1616 			1 +	/* MIN tag is length with zero, only length */ \
1617 			3 +	/* opcount, opcode, opstatus*/ \
1618 			XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN) + \
1619 				/* seqid, slotID, slotID, slotID, status */ \
1620 			5 ) * sizeof(__be32))
1621 
1622 static __be32 check_forechannel_attrs(struct nfsd4_channel_attrs fchannel)
1623 {
1624 	return fchannel.maxreq_sz < NFSD_MIN_REQ_HDR_SEQ_SZ
1625 		|| fchannel.maxresp_sz < NFSD_MIN_RESP_HDR_SEQ_SZ;
1626 }
1627 
1628 __be32
1629 nfsd4_create_session(struct svc_rqst *rqstp,
1630 		     struct nfsd4_compound_state *cstate,
1631 		     struct nfsd4_create_session *cr_ses)
1632 {
1633 	struct sockaddr *sa = svc_addr(rqstp);
1634 	struct nfs4_client *conf, *unconf;
1635 	struct nfsd4_session *new;
1636 	struct nfsd4_clid_slot *cs_slot = NULL;
1637 	bool confirm_me = false;
1638 	int status = 0;
1639 
1640 	if (cr_ses->flags & ~SESSION4_FLAG_MASK_A)
1641 		return nfserr_inval;
1642 
1643 	nfs4_lock_state();
1644 	unconf = find_unconfirmed_client(&cr_ses->clientid);
1645 	conf = find_confirmed_client(&cr_ses->clientid);
1646 
1647 	if (conf) {
1648 		cs_slot = &conf->cl_cs_slot;
1649 		status = check_slot_seqid(cr_ses->seqid, cs_slot->sl_seqid, 0);
1650 		if (status == nfserr_replay_cache) {
1651 			dprintk("Got a create_session replay! seqid= %d\n",
1652 				cs_slot->sl_seqid);
1653 			/* Return the cached reply status */
1654 			status = nfsd4_replay_create_session(cr_ses, cs_slot);
1655 			goto out;
1656 		} else if (cr_ses->seqid != cs_slot->sl_seqid + 1) {
1657 			status = nfserr_seq_misordered;
1658 			dprintk("Sequence misordered!\n");
1659 			dprintk("Expected seqid= %d but got seqid= %d\n",
1660 				cs_slot->sl_seqid, cr_ses->seqid);
1661 			goto out;
1662 		}
1663 	} else if (unconf) {
1664 		if (!same_creds(&unconf->cl_cred, &rqstp->rq_cred) ||
1665 		    !rpc_cmp_addr(sa, (struct sockaddr *) &unconf->cl_addr)) {
1666 			status = nfserr_clid_inuse;
1667 			goto out;
1668 		}
1669 
1670 		cs_slot = &unconf->cl_cs_slot;
1671 		status = check_slot_seqid(cr_ses->seqid, cs_slot->sl_seqid, 0);
1672 		if (status) {
1673 			/* an unconfirmed replay returns misordered */
1674 			status = nfserr_seq_misordered;
1675 			goto out;
1676 		}
1677 
1678 		confirm_me = true;
1679 		conf = unconf;
1680 	} else {
1681 		status = nfserr_stale_clientid;
1682 		goto out;
1683 	}
1684 
1685 	/*
1686 	 * XXX: we should probably set this at creation time, and check
1687 	 * for consistent minorversion use throughout:
1688 	 */
1689 	conf->cl_minorversion = 1;
1690 	/*
1691 	 * We do not support RDMA or persistent sessions
1692 	 */
1693 	cr_ses->flags &= ~SESSION4_PERSIST;
1694 	cr_ses->flags &= ~SESSION4_RDMA;
1695 
1696 	status = nfserr_toosmall;
1697 	if (check_forechannel_attrs(cr_ses->fore_channel))
1698 		goto out;
1699 
1700 	status = nfserr_jukebox;
1701 	new = alloc_init_session(rqstp, conf, cr_ses);
1702 	if (!new)
1703 		goto out;
1704 	status = nfs_ok;
1705 	memcpy(cr_ses->sessionid.data, new->se_sessionid.data,
1706 	       NFS4_MAX_SESSIONID_LEN);
1707 	memcpy(&cr_ses->fore_channel, &new->se_fchannel,
1708 		sizeof(struct nfsd4_channel_attrs));
1709 	cs_slot->sl_seqid++;
1710 	cr_ses->seqid = cs_slot->sl_seqid;
1711 
1712 	/* cache solo and embedded create sessions under the state lock */
1713 	nfsd4_cache_create_session(cr_ses, cs_slot, status);
1714 	if (confirm_me)
1715 		move_to_confirmed(conf);
1716 out:
1717 	nfs4_unlock_state();
1718 	dprintk("%s returns %d\n", __func__, ntohl(status));
1719 	return status;
1720 }
1721 
1722 static bool nfsd4_last_compound_op(struct svc_rqst *rqstp)
1723 {
1724 	struct nfsd4_compoundres *resp = rqstp->rq_resp;
1725 	struct nfsd4_compoundargs *argp = rqstp->rq_argp;
1726 
1727 	return argp->opcnt == resp->opcnt;
1728 }
1729 
1730 static __be32 nfsd4_map_bcts_dir(u32 *dir)
1731 {
1732 	switch (*dir) {
1733 	case NFS4_CDFC4_FORE:
1734 	case NFS4_CDFC4_BACK:
1735 		return nfs_ok;
1736 	case NFS4_CDFC4_FORE_OR_BOTH:
1737 	case NFS4_CDFC4_BACK_OR_BOTH:
1738 		*dir = NFS4_CDFC4_BOTH;
1739 		return nfs_ok;
1740 	};
1741 	return nfserr_inval;
1742 }
1743 
1744 __be32 nfsd4_bind_conn_to_session(struct svc_rqst *rqstp,
1745 		     struct nfsd4_compound_state *cstate,
1746 		     struct nfsd4_bind_conn_to_session *bcts)
1747 {
1748 	__be32 status;
1749 
1750 	if (!nfsd4_last_compound_op(rqstp))
1751 		return nfserr_not_only_op;
1752 	spin_lock(&client_lock);
1753 	cstate->session = find_in_sessionid_hashtbl(&bcts->sessionid);
1754 	/* Sorta weird: we only need the refcnt'ing because new_conn acquires
1755 	 * client_lock iself: */
1756 	if (cstate->session) {
1757 		nfsd4_get_session(cstate->session);
1758 		atomic_inc(&cstate->session->se_client->cl_refcount);
1759 	}
1760 	spin_unlock(&client_lock);
1761 	if (!cstate->session)
1762 		return nfserr_badsession;
1763 
1764 	status = nfsd4_map_bcts_dir(&bcts->dir);
1765 	if (!status)
1766 		nfsd4_new_conn(rqstp, cstate->session, bcts->dir);
1767 	return status;
1768 }
1769 
1770 static bool nfsd4_compound_in_session(struct nfsd4_session *session, struct nfs4_sessionid *sid)
1771 {
1772 	if (!session)
1773 		return 0;
1774 	return !memcmp(sid, &session->se_sessionid, sizeof(*sid));
1775 }
1776 
1777 __be32
1778 nfsd4_destroy_session(struct svc_rqst *r,
1779 		      struct nfsd4_compound_state *cstate,
1780 		      struct nfsd4_destroy_session *sessionid)
1781 {
1782 	struct nfsd4_session *ses;
1783 	u32 status = nfserr_badsession;
1784 
1785 	/* Notes:
1786 	 * - The confirmed nfs4_client->cl_sessionid holds destroyed sessinid
1787 	 * - Should we return nfserr_back_chan_busy if waiting for
1788 	 *   callbacks on to-be-destroyed session?
1789 	 * - Do we need to clear any callback info from previous session?
1790 	 */
1791 
1792 	if (nfsd4_compound_in_session(cstate->session, &sessionid->sessionid)) {
1793 		if (!nfsd4_last_compound_op(r))
1794 			return nfserr_not_only_op;
1795 	}
1796 	dump_sessionid(__func__, &sessionid->sessionid);
1797 	spin_lock(&client_lock);
1798 	ses = find_in_sessionid_hashtbl(&sessionid->sessionid);
1799 	if (!ses) {
1800 		spin_unlock(&client_lock);
1801 		goto out;
1802 	}
1803 
1804 	unhash_session(ses);
1805 	spin_unlock(&client_lock);
1806 
1807 	nfs4_lock_state();
1808 	nfsd4_probe_callback_sync(ses->se_client);
1809 	nfs4_unlock_state();
1810 
1811 	nfsd4_del_conns(ses);
1812 
1813 	nfsd4_put_session(ses);
1814 	status = nfs_ok;
1815 out:
1816 	dprintk("%s returns %d\n", __func__, ntohl(status));
1817 	return status;
1818 }
1819 
1820 static struct nfsd4_conn *__nfsd4_find_conn(struct svc_xprt *xpt, struct nfsd4_session *s)
1821 {
1822 	struct nfsd4_conn *c;
1823 
1824 	list_for_each_entry(c, &s->se_conns, cn_persession) {
1825 		if (c->cn_xprt == xpt) {
1826 			return c;
1827 		}
1828 	}
1829 	return NULL;
1830 }
1831 
1832 static void nfsd4_sequence_check_conn(struct nfsd4_conn *new, struct nfsd4_session *ses)
1833 {
1834 	struct nfs4_client *clp = ses->se_client;
1835 	struct nfsd4_conn *c;
1836 	int ret;
1837 
1838 	spin_lock(&clp->cl_lock);
1839 	c = __nfsd4_find_conn(new->cn_xprt, ses);
1840 	if (c) {
1841 		spin_unlock(&clp->cl_lock);
1842 		free_conn(new);
1843 		return;
1844 	}
1845 	__nfsd4_hash_conn(new, ses);
1846 	spin_unlock(&clp->cl_lock);
1847 	ret = nfsd4_register_conn(new);
1848 	if (ret)
1849 		/* oops; xprt is already down: */
1850 		nfsd4_conn_lost(&new->cn_xpt_user);
1851 	return;
1852 }
1853 
1854 static bool nfsd4_session_too_many_ops(struct svc_rqst *rqstp, struct nfsd4_session *session)
1855 {
1856 	struct nfsd4_compoundargs *args = rqstp->rq_argp;
1857 
1858 	return args->opcnt > session->se_fchannel.maxops;
1859 }
1860 
1861 static bool nfsd4_request_too_big(struct svc_rqst *rqstp,
1862 				  struct nfsd4_session *session)
1863 {
1864 	struct xdr_buf *xb = &rqstp->rq_arg;
1865 
1866 	return xb->len > session->se_fchannel.maxreq_sz;
1867 }
1868 
1869 __be32
1870 nfsd4_sequence(struct svc_rqst *rqstp,
1871 	       struct nfsd4_compound_state *cstate,
1872 	       struct nfsd4_sequence *seq)
1873 {
1874 	struct nfsd4_compoundres *resp = rqstp->rq_resp;
1875 	struct nfsd4_session *session;
1876 	struct nfsd4_slot *slot;
1877 	struct nfsd4_conn *conn;
1878 	int status;
1879 
1880 	if (resp->opcnt != 1)
1881 		return nfserr_sequence_pos;
1882 
1883 	/*
1884 	 * Will be either used or freed by nfsd4_sequence_check_conn
1885 	 * below.
1886 	 */
1887 	conn = alloc_conn(rqstp, NFS4_CDFC4_FORE);
1888 	if (!conn)
1889 		return nfserr_jukebox;
1890 
1891 	spin_lock(&client_lock);
1892 	status = nfserr_badsession;
1893 	session = find_in_sessionid_hashtbl(&seq->sessionid);
1894 	if (!session)
1895 		goto out;
1896 
1897 	status = nfserr_too_many_ops;
1898 	if (nfsd4_session_too_many_ops(rqstp, session))
1899 		goto out;
1900 
1901 	status = nfserr_req_too_big;
1902 	if (nfsd4_request_too_big(rqstp, session))
1903 		goto out;
1904 
1905 	status = nfserr_badslot;
1906 	if (seq->slotid >= session->se_fchannel.maxreqs)
1907 		goto out;
1908 
1909 	slot = session->se_slots[seq->slotid];
1910 	dprintk("%s: slotid %d\n", __func__, seq->slotid);
1911 
1912 	/* We do not negotiate the number of slots yet, so set the
1913 	 * maxslots to the session maxreqs which is used to encode
1914 	 * sr_highest_slotid and the sr_target_slot id to maxslots */
1915 	seq->maxslots = session->se_fchannel.maxreqs;
1916 
1917 	status = check_slot_seqid(seq->seqid, slot->sl_seqid, slot->sl_inuse);
1918 	if (status == nfserr_replay_cache) {
1919 		cstate->slot = slot;
1920 		cstate->session = session;
1921 		/* Return the cached reply status and set cstate->status
1922 		 * for nfsd4_proc_compound processing */
1923 		status = nfsd4_replay_cache_entry(resp, seq);
1924 		cstate->status = nfserr_replay_cache;
1925 		goto out;
1926 	}
1927 	if (status)
1928 		goto out;
1929 
1930 	nfsd4_sequence_check_conn(conn, session);
1931 	conn = NULL;
1932 
1933 	/* Success! bump slot seqid */
1934 	slot->sl_inuse = true;
1935 	slot->sl_seqid = seq->seqid;
1936 	slot->sl_cachethis = seq->cachethis;
1937 
1938 	cstate->slot = slot;
1939 	cstate->session = session;
1940 
1941 out:
1942 	/* Hold a session reference until done processing the compound. */
1943 	if (cstate->session) {
1944 		struct nfs4_client *clp = session->se_client;
1945 
1946 		nfsd4_get_session(cstate->session);
1947 		atomic_inc(&clp->cl_refcount);
1948 		switch (clp->cl_cb_state) {
1949 		case NFSD4_CB_DOWN:
1950 			seq->status_flags = SEQ4_STATUS_CB_PATH_DOWN;
1951 			break;
1952 		case NFSD4_CB_FAULT:
1953 			seq->status_flags = SEQ4_STATUS_BACKCHANNEL_FAULT;
1954 			break;
1955 		default:
1956 			seq->status_flags = 0;
1957 		}
1958 	}
1959 	kfree(conn);
1960 	spin_unlock(&client_lock);
1961 	dprintk("%s: return %d\n", __func__, ntohl(status));
1962 	return status;
1963 }
1964 
1965 static inline bool has_resources(struct nfs4_client *clp)
1966 {
1967 	return !list_empty(&clp->cl_openowners)
1968 		|| !list_empty(&clp->cl_delegations)
1969 		|| !list_empty(&clp->cl_sessions);
1970 }
1971 
1972 __be32
1973 nfsd4_destroy_clientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, struct nfsd4_destroy_clientid *dc)
1974 {
1975 	struct nfs4_client *conf, *unconf, *clp;
1976 	int status = 0;
1977 
1978 	nfs4_lock_state();
1979 	unconf = find_unconfirmed_client(&dc->clientid);
1980 	conf = find_confirmed_client(&dc->clientid);
1981 
1982 	if (conf) {
1983 		clp = conf;
1984 
1985 		if (!is_client_expired(conf) && has_resources(conf)) {
1986 			status = nfserr_clientid_busy;
1987 			goto out;
1988 		}
1989 
1990 		/* rfc5661 18.50.3 */
1991 		if (cstate->session && conf == cstate->session->se_client) {
1992 			status = nfserr_clientid_busy;
1993 			goto out;
1994 		}
1995 	} else if (unconf)
1996 		clp = unconf;
1997 	else {
1998 		status = nfserr_stale_clientid;
1999 		goto out;
2000 	}
2001 
2002 	expire_client(clp);
2003 out:
2004 	nfs4_unlock_state();
2005 	dprintk("%s return %d\n", __func__, ntohl(status));
2006 	return status;
2007 }
2008 
2009 __be32
2010 nfsd4_reclaim_complete(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, struct nfsd4_reclaim_complete *rc)
2011 {
2012 	int status = 0;
2013 
2014 	if (rc->rca_one_fs) {
2015 		if (!cstate->current_fh.fh_dentry)
2016 			return nfserr_nofilehandle;
2017 		/*
2018 		 * We don't take advantage of the rca_one_fs case.
2019 		 * That's OK, it's optional, we can safely ignore it.
2020 		 */
2021 		 return nfs_ok;
2022 	}
2023 
2024 	nfs4_lock_state();
2025 	status = nfserr_complete_already;
2026 	if (cstate->session->se_client->cl_firststate)
2027 		goto out;
2028 
2029 	status = nfserr_stale_clientid;
2030 	if (is_client_expired(cstate->session->se_client))
2031 		/*
2032 		 * The following error isn't really legal.
2033 		 * But we only get here if the client just explicitly
2034 		 * destroyed the client.  Surely it no longer cares what
2035 		 * error it gets back on an operation for the dead
2036 		 * client.
2037 		 */
2038 		goto out;
2039 
2040 	status = nfs_ok;
2041 	nfsd4_create_clid_dir(cstate->session->se_client);
2042 out:
2043 	nfs4_unlock_state();
2044 	return status;
2045 }
2046 
2047 __be32
2048 nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
2049 		  struct nfsd4_setclientid *setclid)
2050 {
2051 	struct xdr_netobj 	clname = setclid->se_name;
2052 	nfs4_verifier		clverifier = setclid->se_verf;
2053 	unsigned int 		strhashval;
2054 	struct nfs4_client	*conf, *unconf, *new;
2055 	__be32 			status;
2056 	char                    dname[HEXDIR_LEN];
2057 
2058 	status = nfs4_make_rec_clidname(dname, &clname);
2059 	if (status)
2060 		return status;
2061 
2062 	/*
2063 	 * XXX The Duplicate Request Cache (DRC) has been checked (??)
2064 	 * We get here on a DRC miss.
2065 	 */
2066 
2067 	strhashval = clientstr_hashval(dname);
2068 
2069 	nfs4_lock_state();
2070 	conf = find_confirmed_client_by_str(dname, strhashval);
2071 	if (conf) {
2072 		/* RFC 3530 14.2.33 CASE 0: */
2073 		status = nfserr_clid_inuse;
2074 		if (clp_used_exchangeid(conf))
2075 			goto out;
2076 		if (!same_creds(&conf->cl_cred, &rqstp->rq_cred)) {
2077 			char addr_str[INET6_ADDRSTRLEN];
2078 			rpc_ntop((struct sockaddr *) &conf->cl_addr, addr_str,
2079 				 sizeof(addr_str));
2080 			dprintk("NFSD: setclientid: string in use by client "
2081 				"at %s\n", addr_str);
2082 			goto out;
2083 		}
2084 	}
2085 	/*
2086 	 * section 14.2.33 of RFC 3530 (under the heading "IMPLEMENTATION")
2087 	 * has a description of SETCLIENTID request processing consisting
2088 	 * of 5 bullet points, labeled as CASE0 - CASE4 below.
2089 	 */
2090 	unconf = find_unconfirmed_client_by_str(dname, strhashval);
2091 	status = nfserr_jukebox;
2092 	if (!conf) {
2093 		/*
2094 		 * RFC 3530 14.2.33 CASE 4:
2095 		 * placed first, because it is the normal case
2096 		 */
2097 		if (unconf)
2098 			expire_client(unconf);
2099 		new = create_client(clname, dname, rqstp, &clverifier);
2100 		if (new == NULL)
2101 			goto out;
2102 		gen_clid(new);
2103 	} else if (same_verf(&conf->cl_verifier, &clverifier)) {
2104 		/*
2105 		 * RFC 3530 14.2.33 CASE 1:
2106 		 * probable callback update
2107 		 */
2108 		if (unconf) {
2109 			/* Note this is removing unconfirmed {*x***},
2110 			 * which is stronger than RFC recommended {vxc**}.
2111 			 * This has the advantage that there is at most
2112 			 * one {*x***} in either list at any time.
2113 			 */
2114 			expire_client(unconf);
2115 		}
2116 		new = create_client(clname, dname, rqstp, &clverifier);
2117 		if (new == NULL)
2118 			goto out;
2119 		copy_clid(new, conf);
2120 	} else if (!unconf) {
2121 		/*
2122 		 * RFC 3530 14.2.33 CASE 2:
2123 		 * probable client reboot; state will be removed if
2124 		 * confirmed.
2125 		 */
2126 		new = create_client(clname, dname, rqstp, &clverifier);
2127 		if (new == NULL)
2128 			goto out;
2129 		gen_clid(new);
2130 	} else {
2131 		/*
2132 		 * RFC 3530 14.2.33 CASE 3:
2133 		 * probable client reboot; state will be removed if
2134 		 * confirmed.
2135 		 */
2136 		expire_client(unconf);
2137 		new = create_client(clname, dname, rqstp, &clverifier);
2138 		if (new == NULL)
2139 			goto out;
2140 		gen_clid(new);
2141 	}
2142 	/*
2143 	 * XXX: we should probably set this at creation time, and check
2144 	 * for consistent minorversion use throughout:
2145 	 */
2146 	new->cl_minorversion = 0;
2147 	gen_callback(new, setclid, rqstp);
2148 	add_to_unconfirmed(new, strhashval);
2149 	setclid->se_clientid.cl_boot = new->cl_clientid.cl_boot;
2150 	setclid->se_clientid.cl_id = new->cl_clientid.cl_id;
2151 	memcpy(setclid->se_confirm.data, new->cl_confirm.data, sizeof(setclid->se_confirm.data));
2152 	status = nfs_ok;
2153 out:
2154 	nfs4_unlock_state();
2155 	return status;
2156 }
2157 
2158 
2159 /*
2160  * Section 14.2.34 of RFC 3530 (under the heading "IMPLEMENTATION") has
2161  * a description of SETCLIENTID_CONFIRM request processing consisting of 4
2162  * bullets, labeled as CASE1 - CASE4 below.
2163  */
2164 __be32
2165 nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
2166 			 struct nfsd4_compound_state *cstate,
2167 			 struct nfsd4_setclientid_confirm *setclientid_confirm)
2168 {
2169 	struct sockaddr *sa = svc_addr(rqstp);
2170 	struct nfs4_client *conf, *unconf;
2171 	nfs4_verifier confirm = setclientid_confirm->sc_confirm;
2172 	clientid_t * clid = &setclientid_confirm->sc_clientid;
2173 	__be32 status;
2174 
2175 	if (STALE_CLIENTID(clid))
2176 		return nfserr_stale_clientid;
2177 	/*
2178 	 * XXX The Duplicate Request Cache (DRC) has been checked (??)
2179 	 * We get here on a DRC miss.
2180 	 */
2181 
2182 	nfs4_lock_state();
2183 
2184 	conf = find_confirmed_client(clid);
2185 	unconf = find_unconfirmed_client(clid);
2186 
2187 	status = nfserr_clid_inuse;
2188 	if (conf && !rpc_cmp_addr((struct sockaddr *) &conf->cl_addr, sa))
2189 		goto out;
2190 	if (unconf && !rpc_cmp_addr((struct sockaddr *) &unconf->cl_addr, sa))
2191 		goto out;
2192 
2193 	/*
2194 	 * section 14.2.34 of RFC 3530 has a description of
2195 	 * SETCLIENTID_CONFIRM request processing consisting
2196 	 * of 4 bullet points, labeled as CASE1 - CASE4 below.
2197 	 */
2198 	if (conf && unconf && same_verf(&confirm, &unconf->cl_confirm)) {
2199 		/*
2200 		 * RFC 3530 14.2.34 CASE 1:
2201 		 * callback update
2202 		 */
2203 		if (!same_creds(&conf->cl_cred, &unconf->cl_cred))
2204 			status = nfserr_clid_inuse;
2205 		else {
2206 			nfsd4_change_callback(conf, &unconf->cl_cb_conn);
2207 			nfsd4_probe_callback(conf);
2208 			expire_client(unconf);
2209 			status = nfs_ok;
2210 
2211 		}
2212 	} else if (conf && !unconf) {
2213 		/*
2214 		 * RFC 3530 14.2.34 CASE 2:
2215 		 * probable retransmitted request; play it safe and
2216 		 * do nothing.
2217 		 */
2218 		if (!same_creds(&conf->cl_cred, &rqstp->rq_cred))
2219 			status = nfserr_clid_inuse;
2220 		else
2221 			status = nfs_ok;
2222 	} else if (!conf && unconf
2223 			&& same_verf(&unconf->cl_confirm, &confirm)) {
2224 		/*
2225 		 * RFC 3530 14.2.34 CASE 3:
2226 		 * Normal case; new or rebooted client:
2227 		 */
2228 		if (!same_creds(&unconf->cl_cred, &rqstp->rq_cred)) {
2229 			status = nfserr_clid_inuse;
2230 		} else {
2231 			unsigned int hash =
2232 				clientstr_hashval(unconf->cl_recdir);
2233 			conf = find_confirmed_client_by_str(unconf->cl_recdir,
2234 							    hash);
2235 			if (conf) {
2236 				nfsd4_remove_clid_dir(conf);
2237 				expire_client(conf);
2238 			}
2239 			move_to_confirmed(unconf);
2240 			conf = unconf;
2241 			nfsd4_probe_callback(conf);
2242 			status = nfs_ok;
2243 		}
2244 	} else if ((!conf || (conf && !same_verf(&conf->cl_confirm, &confirm)))
2245 	    && (!unconf || (unconf && !same_verf(&unconf->cl_confirm,
2246 				    				&confirm)))) {
2247 		/*
2248 		 * RFC 3530 14.2.34 CASE 4:
2249 		 * Client probably hasn't noticed that we rebooted yet.
2250 		 */
2251 		status = nfserr_stale_clientid;
2252 	} else {
2253 		/* check that we have hit one of the cases...*/
2254 		status = nfserr_clid_inuse;
2255 	}
2256 out:
2257 	nfs4_unlock_state();
2258 	return status;
2259 }
2260 
2261 static struct nfs4_file *nfsd4_alloc_file(void)
2262 {
2263 	return kmem_cache_alloc(file_slab, GFP_KERNEL);
2264 }
2265 
2266 /* OPEN Share state helper functions */
2267 static void nfsd4_init_file(struct nfs4_file *fp, struct inode *ino)
2268 {
2269 	unsigned int hashval = file_hashval(ino);
2270 
2271 	atomic_set(&fp->fi_ref, 1);
2272 	INIT_LIST_HEAD(&fp->fi_hash);
2273 	INIT_LIST_HEAD(&fp->fi_stateids);
2274 	INIT_LIST_HEAD(&fp->fi_delegations);
2275 	fp->fi_inode = igrab(ino);
2276 	fp->fi_had_conflict = false;
2277 	fp->fi_lease = NULL;
2278 	memset(fp->fi_fds, 0, sizeof(fp->fi_fds));
2279 	memset(fp->fi_access, 0, sizeof(fp->fi_access));
2280 	spin_lock(&recall_lock);
2281 	list_add(&fp->fi_hash, &file_hashtbl[hashval]);
2282 	spin_unlock(&recall_lock);
2283 }
2284 
2285 static void
2286 nfsd4_free_slab(struct kmem_cache **slab)
2287 {
2288 	if (*slab == NULL)
2289 		return;
2290 	kmem_cache_destroy(*slab);
2291 	*slab = NULL;
2292 }
2293 
2294 void
2295 nfsd4_free_slabs(void)
2296 {
2297 	nfsd4_free_slab(&openowner_slab);
2298 	nfsd4_free_slab(&lockowner_slab);
2299 	nfsd4_free_slab(&file_slab);
2300 	nfsd4_free_slab(&stateid_slab);
2301 	nfsd4_free_slab(&deleg_slab);
2302 }
2303 
2304 static int
2305 nfsd4_init_slabs(void)
2306 {
2307 	openowner_slab = kmem_cache_create("nfsd4_openowners",
2308 			sizeof(struct nfs4_openowner), 0, 0, NULL);
2309 	if (openowner_slab == NULL)
2310 		goto out_nomem;
2311 	lockowner_slab = kmem_cache_create("nfsd4_lockowners",
2312 			sizeof(struct nfs4_openowner), 0, 0, NULL);
2313 	if (lockowner_slab == NULL)
2314 		goto out_nomem;
2315 	file_slab = kmem_cache_create("nfsd4_files",
2316 			sizeof(struct nfs4_file), 0, 0, NULL);
2317 	if (file_slab == NULL)
2318 		goto out_nomem;
2319 	stateid_slab = kmem_cache_create("nfsd4_stateids",
2320 			sizeof(struct nfs4_ol_stateid), 0, 0, NULL);
2321 	if (stateid_slab == NULL)
2322 		goto out_nomem;
2323 	deleg_slab = kmem_cache_create("nfsd4_delegations",
2324 			sizeof(struct nfs4_delegation), 0, 0, NULL);
2325 	if (deleg_slab == NULL)
2326 		goto out_nomem;
2327 	return 0;
2328 out_nomem:
2329 	nfsd4_free_slabs();
2330 	dprintk("nfsd4: out of memory while initializing nfsv4\n");
2331 	return -ENOMEM;
2332 }
2333 
2334 void nfs4_free_openowner(struct nfs4_openowner *oo)
2335 {
2336 	kfree(oo->oo_owner.so_owner.data);
2337 	kmem_cache_free(openowner_slab, oo);
2338 }
2339 
2340 void nfs4_free_lockowner(struct nfs4_lockowner *lo)
2341 {
2342 	kfree(lo->lo_owner.so_owner.data);
2343 	kmem_cache_free(lockowner_slab, lo);
2344 }
2345 
2346 static void init_nfs4_replay(struct nfs4_replay *rp)
2347 {
2348 	rp->rp_status = nfserr_serverfault;
2349 	rp->rp_buflen = 0;
2350 	rp->rp_buf = rp->rp_ibuf;
2351 }
2352 
2353 static inline void *alloc_stateowner(struct kmem_cache *slab, struct xdr_netobj *owner, struct nfs4_client *clp)
2354 {
2355 	struct nfs4_stateowner *sop;
2356 
2357 	sop = kmem_cache_alloc(slab, GFP_KERNEL);
2358 	if (!sop)
2359 		return NULL;
2360 
2361 	sop->so_owner.data = kmemdup(owner->data, owner->len, GFP_KERNEL);
2362 	if (!sop->so_owner.data) {
2363 		kmem_cache_free(slab, sop);
2364 		return NULL;
2365 	}
2366 	sop->so_owner.len = owner->len;
2367 
2368 	INIT_LIST_HEAD(&sop->so_stateids);
2369 	sop->so_client = clp;
2370 	init_nfs4_replay(&sop->so_replay);
2371 	return sop;
2372 }
2373 
2374 static void hash_openowner(struct nfs4_openowner *oo, struct nfs4_client *clp, unsigned int strhashval)
2375 {
2376 	list_add(&oo->oo_owner.so_strhash, &open_ownerstr_hashtbl[strhashval]);
2377 	list_add(&oo->oo_perclient, &clp->cl_openowners);
2378 }
2379 
2380 static struct nfs4_openowner *
2381 alloc_init_open_stateowner(unsigned int strhashval, struct nfs4_client *clp, struct nfsd4_open *open) {
2382 	struct nfs4_openowner *oo;
2383 
2384 	oo = alloc_stateowner(openowner_slab, &open->op_owner, clp);
2385 	if (!oo)
2386 		return NULL;
2387 	oo->oo_owner.so_is_open_owner = 1;
2388 	oo->oo_owner.so_seqid = open->op_seqid;
2389 	oo->oo_flags = NFS4_OO_NEW;
2390 	oo->oo_time = 0;
2391 	oo->oo_last_closed_stid = NULL;
2392 	INIT_LIST_HEAD(&oo->oo_close_lru);
2393 	hash_openowner(oo, clp, strhashval);
2394 	return oo;
2395 }
2396 
2397 static void init_open_stateid(struct nfs4_ol_stateid *stp, struct nfs4_file *fp, struct nfsd4_open *open) {
2398 	struct nfs4_openowner *oo = open->op_openowner;
2399 	struct nfs4_client *clp = oo->oo_owner.so_client;
2400 
2401 	init_stid(&stp->st_stid, clp, NFS4_OPEN_STID);
2402 	INIT_LIST_HEAD(&stp->st_lockowners);
2403 	list_add(&stp->st_perstateowner, &oo->oo_owner.so_stateids);
2404 	list_add(&stp->st_perfile, &fp->fi_stateids);
2405 	stp->st_stateowner = &oo->oo_owner;
2406 	get_nfs4_file(fp);
2407 	stp->st_file = fp;
2408 	stp->st_access_bmap = 0;
2409 	stp->st_deny_bmap = 0;
2410 	__set_bit(open->op_share_access, &stp->st_access_bmap);
2411 	__set_bit(open->op_share_deny, &stp->st_deny_bmap);
2412 	stp->st_openstp = NULL;
2413 }
2414 
2415 static void
2416 move_to_close_lru(struct nfs4_openowner *oo)
2417 {
2418 	dprintk("NFSD: move_to_close_lru nfs4_openowner %p\n", oo);
2419 
2420 	list_move_tail(&oo->oo_close_lru, &close_lru);
2421 	oo->oo_time = get_seconds();
2422 }
2423 
2424 static int
2425 same_owner_str(struct nfs4_stateowner *sop, struct xdr_netobj *owner,
2426 							clientid_t *clid)
2427 {
2428 	return (sop->so_owner.len == owner->len) &&
2429 		0 == memcmp(sop->so_owner.data, owner->data, owner->len) &&
2430 		(sop->so_client->cl_clientid.cl_id == clid->cl_id);
2431 }
2432 
2433 static struct nfs4_openowner *
2434 find_openstateowner_str(unsigned int hashval, struct nfsd4_open *open)
2435 {
2436 	struct nfs4_stateowner *so;
2437 	struct nfs4_openowner *oo;
2438 
2439 	list_for_each_entry(so, &open_ownerstr_hashtbl[hashval], so_strhash) {
2440 		if (same_owner_str(so, &open->op_owner, &open->op_clientid)) {
2441 			oo = openowner(so);
2442 			renew_client(oo->oo_owner.so_client);
2443 			return oo;
2444 		}
2445 	}
2446 	return NULL;
2447 }
2448 
2449 /* search file_hashtbl[] for file */
2450 static struct nfs4_file *
2451 find_file(struct inode *ino)
2452 {
2453 	unsigned int hashval = file_hashval(ino);
2454 	struct nfs4_file *fp;
2455 
2456 	spin_lock(&recall_lock);
2457 	list_for_each_entry(fp, &file_hashtbl[hashval], fi_hash) {
2458 		if (fp->fi_inode == ino) {
2459 			get_nfs4_file(fp);
2460 			spin_unlock(&recall_lock);
2461 			return fp;
2462 		}
2463 	}
2464 	spin_unlock(&recall_lock);
2465 	return NULL;
2466 }
2467 
2468 /*
2469  * Called to check deny when READ with all zero stateid or
2470  * WRITE with all zero or all one stateid
2471  */
2472 static __be32
2473 nfs4_share_conflict(struct svc_fh *current_fh, unsigned int deny_type)
2474 {
2475 	struct inode *ino = current_fh->fh_dentry->d_inode;
2476 	struct nfs4_file *fp;
2477 	struct nfs4_ol_stateid *stp;
2478 	__be32 ret;
2479 
2480 	dprintk("NFSD: nfs4_share_conflict\n");
2481 
2482 	fp = find_file(ino);
2483 	if (!fp)
2484 		return nfs_ok;
2485 	ret = nfserr_locked;
2486 	/* Search for conflicting share reservations */
2487 	list_for_each_entry(stp, &fp->fi_stateids, st_perfile) {
2488 		if (test_bit(deny_type, &stp->st_deny_bmap) ||
2489 		    test_bit(NFS4_SHARE_DENY_BOTH, &stp->st_deny_bmap))
2490 			goto out;
2491 	}
2492 	ret = nfs_ok;
2493 out:
2494 	put_nfs4_file(fp);
2495 	return ret;
2496 }
2497 
2498 static void nfsd_break_one_deleg(struct nfs4_delegation *dp)
2499 {
2500 	/* We're assuming the state code never drops its reference
2501 	 * without first removing the lease.  Since we're in this lease
2502 	 * callback (and since the lease code is serialized by the kernel
2503 	 * lock) we know the server hasn't removed the lease yet, we know
2504 	 * it's safe to take a reference: */
2505 	atomic_inc(&dp->dl_count);
2506 
2507 	list_add_tail(&dp->dl_recall_lru, &del_recall_lru);
2508 
2509 	/* only place dl_time is set. protected by lock_flocks*/
2510 	dp->dl_time = get_seconds();
2511 
2512 	nfsd4_cb_recall(dp);
2513 }
2514 
2515 /* Called from break_lease() with lock_flocks() held. */
2516 static void nfsd_break_deleg_cb(struct file_lock *fl)
2517 {
2518 	struct nfs4_file *fp = (struct nfs4_file *)fl->fl_owner;
2519 	struct nfs4_delegation *dp;
2520 
2521 	BUG_ON(!fp);
2522 	/* We assume break_lease is only called once per lease: */
2523 	BUG_ON(fp->fi_had_conflict);
2524 	/*
2525 	 * We don't want the locks code to timeout the lease for us;
2526 	 * we'll remove it ourself if a delegation isn't returned
2527 	 * in time:
2528 	 */
2529 	fl->fl_break_time = 0;
2530 
2531 	spin_lock(&recall_lock);
2532 	fp->fi_had_conflict = true;
2533 	list_for_each_entry(dp, &fp->fi_delegations, dl_perfile)
2534 		nfsd_break_one_deleg(dp);
2535 	spin_unlock(&recall_lock);
2536 }
2537 
2538 static
2539 int nfsd_change_deleg_cb(struct file_lock **onlist, int arg)
2540 {
2541 	if (arg & F_UNLCK)
2542 		return lease_modify(onlist, arg);
2543 	else
2544 		return -EAGAIN;
2545 }
2546 
2547 static const struct lock_manager_operations nfsd_lease_mng_ops = {
2548 	.lm_break = nfsd_break_deleg_cb,
2549 	.lm_change = nfsd_change_deleg_cb,
2550 };
2551 
2552 static __be32 nfsd4_check_seqid(struct nfsd4_compound_state *cstate, struct nfs4_stateowner *so, u32 seqid)
2553 {
2554 	if (nfsd4_has_session(cstate))
2555 		return nfs_ok;
2556 	if (seqid == so->so_seqid - 1)
2557 		return nfserr_replay_me;
2558 	if (seqid == so->so_seqid)
2559 		return nfs_ok;
2560 	return nfserr_bad_seqid;
2561 }
2562 
2563 __be32
2564 nfsd4_process_open1(struct nfsd4_compound_state *cstate,
2565 		    struct nfsd4_open *open)
2566 {
2567 	clientid_t *clientid = &open->op_clientid;
2568 	struct nfs4_client *clp = NULL;
2569 	unsigned int strhashval;
2570 	struct nfs4_openowner *oo = NULL;
2571 	__be32 status;
2572 
2573 	if (STALE_CLIENTID(&open->op_clientid))
2574 		return nfserr_stale_clientid;
2575 	/*
2576 	 * In case we need it later, after we've already created the
2577 	 * file and don't want to risk a further failure:
2578 	 */
2579 	open->op_file = nfsd4_alloc_file();
2580 	if (open->op_file == NULL)
2581 		return nfserr_jukebox;
2582 
2583 	strhashval = open_ownerstr_hashval(clientid->cl_id, &open->op_owner);
2584 	oo = find_openstateowner_str(strhashval, open);
2585 	open->op_openowner = oo;
2586 	if (!oo) {
2587 		clp = find_confirmed_client(clientid);
2588 		if (clp == NULL)
2589 			return nfserr_expired;
2590 		goto new_owner;
2591 	}
2592 	if (!(oo->oo_flags & NFS4_OO_CONFIRMED)) {
2593 		/* Replace unconfirmed owners without checking for replay. */
2594 		clp = oo->oo_owner.so_client;
2595 		release_openowner(oo);
2596 		open->op_openowner = NULL;
2597 		goto new_owner;
2598 	}
2599 	status = nfsd4_check_seqid(cstate, &oo->oo_owner, open->op_seqid);
2600 	if (status)
2601 		return status;
2602 	clp = oo->oo_owner.so_client;
2603 	goto alloc_stateid;
2604 new_owner:
2605 	oo = alloc_init_open_stateowner(strhashval, clp, open);
2606 	if (oo == NULL)
2607 		return nfserr_jukebox;
2608 	open->op_openowner = oo;
2609 alloc_stateid:
2610 	open->op_stp = nfs4_alloc_stateid(clp);
2611 	if (!open->op_stp)
2612 		return nfserr_jukebox;
2613 	return nfs_ok;
2614 }
2615 
2616 static inline __be32
2617 nfs4_check_delegmode(struct nfs4_delegation *dp, int flags)
2618 {
2619 	if ((flags & WR_STATE) && (dp->dl_type == NFS4_OPEN_DELEGATE_READ))
2620 		return nfserr_openmode;
2621 	else
2622 		return nfs_ok;
2623 }
2624 
2625 static int share_access_to_flags(u32 share_access)
2626 {
2627 	share_access &= ~NFS4_SHARE_WANT_MASK;
2628 
2629 	return share_access == NFS4_SHARE_ACCESS_READ ? RD_STATE : WR_STATE;
2630 }
2631 
2632 static struct nfs4_delegation *find_deleg_stateid(struct nfs4_client *cl, stateid_t *s)
2633 {
2634 	struct nfs4_stid *ret;
2635 
2636 	ret = find_stateid_by_type(cl, s, NFS4_DELEG_STID);
2637 	if (!ret)
2638 		return NULL;
2639 	return delegstateid(ret);
2640 }
2641 
2642 static bool nfsd4_is_deleg_cur(struct nfsd4_open *open)
2643 {
2644 	return open->op_claim_type == NFS4_OPEN_CLAIM_DELEGATE_CUR ||
2645 	       open->op_claim_type == NFS4_OPEN_CLAIM_DELEG_CUR_FH;
2646 }
2647 
2648 static __be32
2649 nfs4_check_deleg(struct nfs4_client *cl, struct nfs4_file *fp, struct nfsd4_open *open,
2650 		struct nfs4_delegation **dp)
2651 {
2652 	int flags;
2653 	__be32 status = nfserr_bad_stateid;
2654 
2655 	*dp = find_deleg_stateid(cl, &open->op_delegate_stateid);
2656 	if (*dp == NULL)
2657 		goto out;
2658 	flags = share_access_to_flags(open->op_share_access);
2659 	status = nfs4_check_delegmode(*dp, flags);
2660 	if (status)
2661 		*dp = NULL;
2662 out:
2663 	if (!nfsd4_is_deleg_cur(open))
2664 		return nfs_ok;
2665 	if (status)
2666 		return status;
2667 	open->op_openowner->oo_flags |= NFS4_OO_CONFIRMED;
2668 	return nfs_ok;
2669 }
2670 
2671 static __be32
2672 nfs4_check_open(struct nfs4_file *fp, struct nfsd4_open *open, struct nfs4_ol_stateid **stpp)
2673 {
2674 	struct nfs4_ol_stateid *local;
2675 	struct nfs4_openowner *oo = open->op_openowner;
2676 
2677 	list_for_each_entry(local, &fp->fi_stateids, st_perfile) {
2678 		/* ignore lock owners */
2679 		if (local->st_stateowner->so_is_open_owner == 0)
2680 			continue;
2681 		/* remember if we have seen this open owner */
2682 		if (local->st_stateowner == &oo->oo_owner)
2683 			*stpp = local;
2684 		/* check for conflicting share reservations */
2685 		if (!test_share(local, open))
2686 			return nfserr_share_denied;
2687 	}
2688 	return nfs_ok;
2689 }
2690 
2691 static void nfs4_free_stateid(struct nfs4_ol_stateid *s)
2692 {
2693 	kmem_cache_free(stateid_slab, s);
2694 }
2695 
2696 static inline int nfs4_access_to_access(u32 nfs4_access)
2697 {
2698 	int flags = 0;
2699 
2700 	if (nfs4_access & NFS4_SHARE_ACCESS_READ)
2701 		flags |= NFSD_MAY_READ;
2702 	if (nfs4_access & NFS4_SHARE_ACCESS_WRITE)
2703 		flags |= NFSD_MAY_WRITE;
2704 	return flags;
2705 }
2706 
2707 static __be32 nfs4_get_vfs_file(struct svc_rqst *rqstp, struct nfs4_file *fp,
2708 		struct svc_fh *cur_fh, struct nfsd4_open *open)
2709 {
2710 	__be32 status;
2711 	int oflag = nfs4_access_to_omode(open->op_share_access);
2712 	int access = nfs4_access_to_access(open->op_share_access);
2713 
2714 	if (!fp->fi_fds[oflag]) {
2715 		status = nfsd_open(rqstp, cur_fh, S_IFREG, access,
2716 			&fp->fi_fds[oflag]);
2717 		if (status)
2718 			return status;
2719 	}
2720 	nfs4_file_get_access(fp, oflag);
2721 
2722 	return nfs_ok;
2723 }
2724 
2725 static inline __be32
2726 nfsd4_truncate(struct svc_rqst *rqstp, struct svc_fh *fh,
2727 		struct nfsd4_open *open)
2728 {
2729 	struct iattr iattr = {
2730 		.ia_valid = ATTR_SIZE,
2731 		.ia_size = 0,
2732 	};
2733 	if (!open->op_truncate)
2734 		return 0;
2735 	if (!(open->op_share_access & NFS4_SHARE_ACCESS_WRITE))
2736 		return nfserr_inval;
2737 	return nfsd_setattr(rqstp, fh, &iattr, 0, (time_t)0);
2738 }
2739 
2740 static __be32
2741 nfs4_upgrade_open(struct svc_rqst *rqstp, struct nfs4_file *fp, struct svc_fh *cur_fh, struct nfs4_ol_stateid *stp, struct nfsd4_open *open)
2742 {
2743 	u32 op_share_access = open->op_share_access;
2744 	bool new_access;
2745 	__be32 status;
2746 
2747 	new_access = !test_bit(op_share_access, &stp->st_access_bmap);
2748 	if (new_access) {
2749 		status = nfs4_get_vfs_file(rqstp, fp, cur_fh, open);
2750 		if (status)
2751 			return status;
2752 	}
2753 	status = nfsd4_truncate(rqstp, cur_fh, open);
2754 	if (status) {
2755 		if (new_access) {
2756 			int oflag = nfs4_access_to_omode(op_share_access);
2757 			nfs4_file_put_access(fp, oflag);
2758 		}
2759 		return status;
2760 	}
2761 	/* remember the open */
2762 	__set_bit(op_share_access, &stp->st_access_bmap);
2763 	__set_bit(open->op_share_deny, &stp->st_deny_bmap);
2764 
2765 	return nfs_ok;
2766 }
2767 
2768 
2769 static void
2770 nfs4_set_claim_prev(struct nfsd4_open *open)
2771 {
2772 	open->op_openowner->oo_flags |= NFS4_OO_CONFIRMED;
2773 	open->op_openowner->oo_owner.so_client->cl_firststate = 1;
2774 }
2775 
2776 /* Should we give out recallable state?: */
2777 static bool nfsd4_cb_channel_good(struct nfs4_client *clp)
2778 {
2779 	if (clp->cl_cb_state == NFSD4_CB_UP)
2780 		return true;
2781 	/*
2782 	 * In the sessions case, since we don't have to establish a
2783 	 * separate connection for callbacks, we assume it's OK
2784 	 * until we hear otherwise:
2785 	 */
2786 	return clp->cl_minorversion && clp->cl_cb_state == NFSD4_CB_UNKNOWN;
2787 }
2788 
2789 static struct file_lock *nfs4_alloc_init_lease(struct nfs4_delegation *dp, int flag)
2790 {
2791 	struct file_lock *fl;
2792 
2793 	fl = locks_alloc_lock();
2794 	if (!fl)
2795 		return NULL;
2796 	locks_init_lock(fl);
2797 	fl->fl_lmops = &nfsd_lease_mng_ops;
2798 	fl->fl_flags = FL_LEASE;
2799 	fl->fl_type = flag == NFS4_OPEN_DELEGATE_READ? F_RDLCK: F_WRLCK;
2800 	fl->fl_end = OFFSET_MAX;
2801 	fl->fl_owner = (fl_owner_t)(dp->dl_file);
2802 	fl->fl_pid = current->tgid;
2803 	return fl;
2804 }
2805 
2806 static int nfs4_setlease(struct nfs4_delegation *dp, int flag)
2807 {
2808 	struct nfs4_file *fp = dp->dl_file;
2809 	struct file_lock *fl;
2810 	int status;
2811 
2812 	fl = nfs4_alloc_init_lease(dp, flag);
2813 	if (!fl)
2814 		return -ENOMEM;
2815 	fl->fl_file = find_readable_file(fp);
2816 	list_add(&dp->dl_perclnt, &dp->dl_stid.sc_client->cl_delegations);
2817 	status = vfs_setlease(fl->fl_file, fl->fl_type, &fl);
2818 	if (status) {
2819 		list_del_init(&dp->dl_perclnt);
2820 		locks_free_lock(fl);
2821 		return -ENOMEM;
2822 	}
2823 	fp->fi_lease = fl;
2824 	fp->fi_deleg_file = fl->fl_file;
2825 	get_file(fp->fi_deleg_file);
2826 	atomic_set(&fp->fi_delegees, 1);
2827 	list_add(&dp->dl_perfile, &fp->fi_delegations);
2828 	return 0;
2829 }
2830 
2831 static int nfs4_set_delegation(struct nfs4_delegation *dp, int flag)
2832 {
2833 	struct nfs4_file *fp = dp->dl_file;
2834 
2835 	if (!fp->fi_lease)
2836 		return nfs4_setlease(dp, flag);
2837 	spin_lock(&recall_lock);
2838 	if (fp->fi_had_conflict) {
2839 		spin_unlock(&recall_lock);
2840 		return -EAGAIN;
2841 	}
2842 	atomic_inc(&fp->fi_delegees);
2843 	list_add(&dp->dl_perfile, &fp->fi_delegations);
2844 	spin_unlock(&recall_lock);
2845 	list_add(&dp->dl_perclnt, &dp->dl_stid.sc_client->cl_delegations);
2846 	return 0;
2847 }
2848 
2849 /*
2850  * Attempt to hand out a delegation.
2851  */
2852 static void
2853 nfs4_open_delegation(struct svc_fh *fh, struct nfsd4_open *open, struct nfs4_ol_stateid *stp)
2854 {
2855 	struct nfs4_delegation *dp;
2856 	struct nfs4_openowner *oo = container_of(stp->st_stateowner, struct nfs4_openowner, oo_owner);
2857 	int cb_up;
2858 	int status, flag = 0;
2859 
2860 	cb_up = nfsd4_cb_channel_good(oo->oo_owner.so_client);
2861 	flag = NFS4_OPEN_DELEGATE_NONE;
2862 	open->op_recall = 0;
2863 	switch (open->op_claim_type) {
2864 		case NFS4_OPEN_CLAIM_PREVIOUS:
2865 			if (!cb_up)
2866 				open->op_recall = 1;
2867 			flag = open->op_delegate_type;
2868 			if (flag == NFS4_OPEN_DELEGATE_NONE)
2869 				goto out;
2870 			break;
2871 		case NFS4_OPEN_CLAIM_NULL:
2872 			/* Let's not give out any delegations till everyone's
2873 			 * had the chance to reclaim theirs.... */
2874 			if (locks_in_grace())
2875 				goto out;
2876 			if (!cb_up || !(oo->oo_flags & NFS4_OO_CONFIRMED))
2877 				goto out;
2878 			if (open->op_share_access & NFS4_SHARE_ACCESS_WRITE)
2879 				flag = NFS4_OPEN_DELEGATE_WRITE;
2880 			else
2881 				flag = NFS4_OPEN_DELEGATE_READ;
2882 			break;
2883 		default:
2884 			goto out;
2885 	}
2886 
2887 	dp = alloc_init_deleg(oo->oo_owner.so_client, stp, fh, flag);
2888 	if (dp == NULL)
2889 		goto out_no_deleg;
2890 	status = nfs4_set_delegation(dp, flag);
2891 	if (status)
2892 		goto out_free;
2893 
2894 	memcpy(&open->op_delegate_stateid, &dp->dl_stid.sc_stateid, sizeof(dp->dl_stid.sc_stateid));
2895 
2896 	dprintk("NFSD: delegation stateid=" STATEID_FMT "\n",
2897 		STATEID_VAL(&dp->dl_stid.sc_stateid));
2898 out:
2899 	if (open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS
2900 			&& flag == NFS4_OPEN_DELEGATE_NONE
2901 			&& open->op_delegate_type != NFS4_OPEN_DELEGATE_NONE)
2902 		dprintk("NFSD: WARNING: refusing delegation reclaim\n");
2903 	open->op_delegate_type = flag;
2904 	return;
2905 out_free:
2906 	nfs4_put_delegation(dp);
2907 out_no_deleg:
2908 	flag = NFS4_OPEN_DELEGATE_NONE;
2909 	goto out;
2910 }
2911 
2912 /*
2913  * called with nfs4_lock_state() held.
2914  */
2915 __be32
2916 nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open *open)
2917 {
2918 	struct nfsd4_compoundres *resp = rqstp->rq_resp;
2919 	struct nfs4_client *cl = open->op_openowner->oo_owner.so_client;
2920 	struct nfs4_file *fp = NULL;
2921 	struct inode *ino = current_fh->fh_dentry->d_inode;
2922 	struct nfs4_ol_stateid *stp = NULL;
2923 	struct nfs4_delegation *dp = NULL;
2924 	__be32 status;
2925 
2926 	/*
2927 	 * Lookup file; if found, lookup stateid and check open request,
2928 	 * and check for delegations in the process of being recalled.
2929 	 * If not found, create the nfs4_file struct
2930 	 */
2931 	fp = find_file(ino);
2932 	if (fp) {
2933 		if ((status = nfs4_check_open(fp, open, &stp)))
2934 			goto out;
2935 		status = nfs4_check_deleg(cl, fp, open, &dp);
2936 		if (status)
2937 			goto out;
2938 	} else {
2939 		status = nfserr_bad_stateid;
2940 		if (nfsd4_is_deleg_cur(open))
2941 			goto out;
2942 		status = nfserr_jukebox;
2943 		fp = open->op_file;
2944 		open->op_file = NULL;
2945 		nfsd4_init_file(fp, ino);
2946 	}
2947 
2948 	/*
2949 	 * OPEN the file, or upgrade an existing OPEN.
2950 	 * If truncate fails, the OPEN fails.
2951 	 */
2952 	if (stp) {
2953 		/* Stateid was found, this is an OPEN upgrade */
2954 		status = nfs4_upgrade_open(rqstp, fp, current_fh, stp, open);
2955 		if (status)
2956 			goto out;
2957 	} else {
2958 		status = nfs4_get_vfs_file(rqstp, fp, current_fh, open);
2959 		if (status)
2960 			goto out;
2961 		stp = open->op_stp;
2962 		open->op_stp = NULL;
2963 		init_open_stateid(stp, fp, open);
2964 		status = nfsd4_truncate(rqstp, current_fh, open);
2965 		if (status) {
2966 			release_open_stateid(stp);
2967 			goto out;
2968 		}
2969 	}
2970 	update_stateid(&stp->st_stid.sc_stateid);
2971 	memcpy(&open->op_stateid, &stp->st_stid.sc_stateid, sizeof(stateid_t));
2972 
2973 	if (nfsd4_has_session(&resp->cstate))
2974 		open->op_openowner->oo_flags |= NFS4_OO_CONFIRMED;
2975 
2976 	/*
2977 	* Attempt to hand out a delegation. No error return, because the
2978 	* OPEN succeeds even if we fail.
2979 	*/
2980 	nfs4_open_delegation(current_fh, open, stp);
2981 
2982 	status = nfs_ok;
2983 
2984 	dprintk("%s: stateid=" STATEID_FMT "\n", __func__,
2985 		STATEID_VAL(&stp->st_stid.sc_stateid));
2986 out:
2987 	if (fp)
2988 		put_nfs4_file(fp);
2989 	if (status == 0 && open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS)
2990 		nfs4_set_claim_prev(open);
2991 	/*
2992 	* To finish the open response, we just need to set the rflags.
2993 	*/
2994 	open->op_rflags = NFS4_OPEN_RESULT_LOCKTYPE_POSIX;
2995 	if (!(open->op_openowner->oo_flags & NFS4_OO_CONFIRMED) &&
2996 	    !nfsd4_has_session(&resp->cstate))
2997 		open->op_rflags |= NFS4_OPEN_RESULT_CONFIRM;
2998 
2999 	return status;
3000 }
3001 
3002 void nfsd4_cleanup_open_state(struct nfsd4_open *open, __be32 status)
3003 {
3004 	if (open->op_openowner) {
3005 		struct nfs4_openowner *oo = open->op_openowner;
3006 
3007 		if (!list_empty(&oo->oo_owner.so_stateids))
3008 			list_del_init(&oo->oo_close_lru);
3009 		if (oo->oo_flags & NFS4_OO_NEW) {
3010 			if (status) {
3011 				release_openowner(oo);
3012 				open->op_openowner = NULL;
3013 			} else
3014 				oo->oo_flags &= ~NFS4_OO_NEW;
3015 		}
3016 	}
3017 	if (open->op_file)
3018 		nfsd4_free_file(open->op_file);
3019 	if (open->op_stp)
3020 		nfs4_free_stateid(open->op_stp);
3021 }
3022 
3023 __be32
3024 nfsd4_renew(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
3025 	    clientid_t *clid)
3026 {
3027 	struct nfs4_client *clp;
3028 	__be32 status;
3029 
3030 	nfs4_lock_state();
3031 	dprintk("process_renew(%08x/%08x): starting\n",
3032 			clid->cl_boot, clid->cl_id);
3033 	status = nfserr_stale_clientid;
3034 	if (STALE_CLIENTID(clid))
3035 		goto out;
3036 	clp = find_confirmed_client(clid);
3037 	status = nfserr_expired;
3038 	if (clp == NULL) {
3039 		/* We assume the client took too long to RENEW. */
3040 		dprintk("nfsd4_renew: clientid not found!\n");
3041 		goto out;
3042 	}
3043 	status = nfserr_cb_path_down;
3044 	if (!list_empty(&clp->cl_delegations)
3045 			&& clp->cl_cb_state != NFSD4_CB_UP)
3046 		goto out;
3047 	status = nfs_ok;
3048 out:
3049 	nfs4_unlock_state();
3050 	return status;
3051 }
3052 
3053 static struct lock_manager nfsd4_manager = {
3054 };
3055 
3056 static void
3057 nfsd4_end_grace(void)
3058 {
3059 	dprintk("NFSD: end of grace period\n");
3060 	nfsd4_recdir_purge_old();
3061 	locks_end_grace(&nfsd4_manager);
3062 	/*
3063 	 * Now that every NFSv4 client has had the chance to recover and
3064 	 * to see the (possibly new, possibly shorter) lease time, we
3065 	 * can safely set the next grace time to the current lease time:
3066 	 */
3067 	nfsd4_grace = nfsd4_lease;
3068 }
3069 
3070 static time_t
3071 nfs4_laundromat(void)
3072 {
3073 	struct nfs4_client *clp;
3074 	struct nfs4_openowner *oo;
3075 	struct nfs4_delegation *dp;
3076 	struct list_head *pos, *next, reaplist;
3077 	time_t cutoff = get_seconds() - nfsd4_lease;
3078 	time_t t, clientid_val = nfsd4_lease;
3079 	time_t u, test_val = nfsd4_lease;
3080 
3081 	nfs4_lock_state();
3082 
3083 	dprintk("NFSD: laundromat service - starting\n");
3084 	if (locks_in_grace())
3085 		nfsd4_end_grace();
3086 	INIT_LIST_HEAD(&reaplist);
3087 	spin_lock(&client_lock);
3088 	list_for_each_safe(pos, next, &client_lru) {
3089 		clp = list_entry(pos, struct nfs4_client, cl_lru);
3090 		if (time_after((unsigned long)clp->cl_time, (unsigned long)cutoff)) {
3091 			t = clp->cl_time - cutoff;
3092 			if (clientid_val > t)
3093 				clientid_val = t;
3094 			break;
3095 		}
3096 		if (atomic_read(&clp->cl_refcount)) {
3097 			dprintk("NFSD: client in use (clientid %08x)\n",
3098 				clp->cl_clientid.cl_id);
3099 			continue;
3100 		}
3101 		unhash_client_locked(clp);
3102 		list_add(&clp->cl_lru, &reaplist);
3103 	}
3104 	spin_unlock(&client_lock);
3105 	list_for_each_safe(pos, next, &reaplist) {
3106 		clp = list_entry(pos, struct nfs4_client, cl_lru);
3107 		dprintk("NFSD: purging unused client (clientid %08x)\n",
3108 			clp->cl_clientid.cl_id);
3109 		nfsd4_remove_clid_dir(clp);
3110 		expire_client(clp);
3111 	}
3112 	spin_lock(&recall_lock);
3113 	list_for_each_safe(pos, next, &del_recall_lru) {
3114 		dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru);
3115 		if (time_after((unsigned long)dp->dl_time, (unsigned long)cutoff)) {
3116 			u = dp->dl_time - cutoff;
3117 			if (test_val > u)
3118 				test_val = u;
3119 			break;
3120 		}
3121 		list_move(&dp->dl_recall_lru, &reaplist);
3122 	}
3123 	spin_unlock(&recall_lock);
3124 	list_for_each_safe(pos, next, &reaplist) {
3125 		dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru);
3126 		list_del_init(&dp->dl_recall_lru);
3127 		unhash_delegation(dp);
3128 	}
3129 	test_val = nfsd4_lease;
3130 	list_for_each_safe(pos, next, &close_lru) {
3131 		oo = container_of(pos, struct nfs4_openowner, oo_close_lru);
3132 		if (time_after((unsigned long)oo->oo_time, (unsigned long)cutoff)) {
3133 			u = oo->oo_time - cutoff;
3134 			if (test_val > u)
3135 				test_val = u;
3136 			break;
3137 		}
3138 		release_openowner(oo);
3139 	}
3140 	if (clientid_val < NFSD_LAUNDROMAT_MINTIMEOUT)
3141 		clientid_val = NFSD_LAUNDROMAT_MINTIMEOUT;
3142 	nfs4_unlock_state();
3143 	return clientid_val;
3144 }
3145 
3146 static struct workqueue_struct *laundry_wq;
3147 static void laundromat_main(struct work_struct *);
3148 static DECLARE_DELAYED_WORK(laundromat_work, laundromat_main);
3149 
3150 static void
3151 laundromat_main(struct work_struct *not_used)
3152 {
3153 	time_t t;
3154 
3155 	t = nfs4_laundromat();
3156 	dprintk("NFSD: laundromat_main - sleeping for %ld seconds\n", t);
3157 	queue_delayed_work(laundry_wq, &laundromat_work, t*HZ);
3158 }
3159 
3160 static inline __be32 nfs4_check_fh(struct svc_fh *fhp, struct nfs4_ol_stateid *stp)
3161 {
3162 	if (fhp->fh_dentry->d_inode != stp->st_file->fi_inode)
3163 		return nfserr_bad_stateid;
3164 	return nfs_ok;
3165 }
3166 
3167 static int
3168 STALE_STATEID(stateid_t *stateid)
3169 {
3170 	if (stateid->si_opaque.so_clid.cl_boot == boot_time)
3171 		return 0;
3172 	dprintk("NFSD: stale stateid " STATEID_FMT "!\n",
3173 		STATEID_VAL(stateid));
3174 	return 1;
3175 }
3176 
3177 static inline int
3178 access_permit_read(unsigned long access_bmap)
3179 {
3180 	return test_bit(NFS4_SHARE_ACCESS_READ, &access_bmap) ||
3181 		test_bit(NFS4_SHARE_ACCESS_BOTH, &access_bmap) ||
3182 		test_bit(NFS4_SHARE_ACCESS_WRITE, &access_bmap);
3183 }
3184 
3185 static inline int
3186 access_permit_write(unsigned long access_bmap)
3187 {
3188 	return test_bit(NFS4_SHARE_ACCESS_WRITE, &access_bmap) ||
3189 		test_bit(NFS4_SHARE_ACCESS_BOTH, &access_bmap);
3190 }
3191 
3192 static
3193 __be32 nfs4_check_openmode(struct nfs4_ol_stateid *stp, int flags)
3194 {
3195         __be32 status = nfserr_openmode;
3196 
3197 	/* For lock stateid's, we test the parent open, not the lock: */
3198 	if (stp->st_openstp)
3199 		stp = stp->st_openstp;
3200 	if ((flags & WR_STATE) && (!access_permit_write(stp->st_access_bmap)))
3201                 goto out;
3202 	if ((flags & RD_STATE) && (!access_permit_read(stp->st_access_bmap)))
3203                 goto out;
3204 	status = nfs_ok;
3205 out:
3206 	return status;
3207 }
3208 
3209 static inline __be32
3210 check_special_stateids(svc_fh *current_fh, stateid_t *stateid, int flags)
3211 {
3212 	if (ONE_STATEID(stateid) && (flags & RD_STATE))
3213 		return nfs_ok;
3214 	else if (locks_in_grace()) {
3215 		/* Answer in remaining cases depends on existence of
3216 		 * conflicting state; so we must wait out the grace period. */
3217 		return nfserr_grace;
3218 	} else if (flags & WR_STATE)
3219 		return nfs4_share_conflict(current_fh,
3220 				NFS4_SHARE_DENY_WRITE);
3221 	else /* (flags & RD_STATE) && ZERO_STATEID(stateid) */
3222 		return nfs4_share_conflict(current_fh,
3223 				NFS4_SHARE_DENY_READ);
3224 }
3225 
3226 /*
3227  * Allow READ/WRITE during grace period on recovered state only for files
3228  * that are not able to provide mandatory locking.
3229  */
3230 static inline int
3231 grace_disallows_io(struct inode *inode)
3232 {
3233 	return locks_in_grace() && mandatory_lock(inode);
3234 }
3235 
3236 /* Returns true iff a is later than b: */
3237 static bool stateid_generation_after(stateid_t *a, stateid_t *b)
3238 {
3239 	return (s32)a->si_generation - (s32)b->si_generation > 0;
3240 }
3241 
3242 static int check_stateid_generation(stateid_t *in, stateid_t *ref, bool has_session)
3243 {
3244 	/*
3245 	 * When sessions are used the stateid generation number is ignored
3246 	 * when it is zero.
3247 	 */
3248 	if (has_session && in->si_generation == 0)
3249 		return nfs_ok;
3250 
3251 	if (in->si_generation == ref->si_generation)
3252 		return nfs_ok;
3253 
3254 	/* If the client sends us a stateid from the future, it's buggy: */
3255 	if (stateid_generation_after(in, ref))
3256 		return nfserr_bad_stateid;
3257 	/*
3258 	 * However, we could see a stateid from the past, even from a
3259 	 * non-buggy client.  For example, if the client sends a lock
3260 	 * while some IO is outstanding, the lock may bump si_generation
3261 	 * while the IO is still in flight.  The client could avoid that
3262 	 * situation by waiting for responses on all the IO requests,
3263 	 * but better performance may result in retrying IO that
3264 	 * receives an old_stateid error if requests are rarely
3265 	 * reordered in flight:
3266 	 */
3267 	return nfserr_old_stateid;
3268 }
3269 
3270 __be32 nfs4_validate_stateid(struct nfs4_client *cl, stateid_t *stateid)
3271 {
3272 	struct nfs4_stid *s;
3273 	struct nfs4_ol_stateid *ols;
3274 	__be32 status;
3275 
3276 	if (STALE_STATEID(stateid))
3277 		return nfserr_stale_stateid;
3278 
3279 	s = find_stateid(cl, stateid);
3280 	if (!s)
3281 		 return nfserr_stale_stateid;
3282 	status = check_stateid_generation(stateid, &s->sc_stateid, 1);
3283 	if (status)
3284 		return status;
3285 	if (!(s->sc_type & (NFS4_OPEN_STID | NFS4_LOCK_STID)))
3286 		return nfs_ok;
3287 	ols = openlockstateid(s);
3288 	if (ols->st_stateowner->so_is_open_owner
3289 	    && !(openowner(ols->st_stateowner)->oo_flags & NFS4_OO_CONFIRMED))
3290 		return nfserr_bad_stateid;
3291 	return nfs_ok;
3292 }
3293 
3294 static __be32 nfsd4_lookup_stateid(stateid_t *stateid, unsigned char typemask, struct nfs4_stid **s)
3295 {
3296 	struct nfs4_client *cl;
3297 
3298 	if (ZERO_STATEID(stateid) || ONE_STATEID(stateid))
3299 		return nfserr_bad_stateid;
3300 	if (STALE_STATEID(stateid))
3301 		return nfserr_stale_stateid;
3302 	cl = find_confirmed_client(&stateid->si_opaque.so_clid);
3303 	if (!cl)
3304 		return nfserr_expired;
3305 	*s = find_stateid_by_type(cl, stateid, typemask);
3306 	if (!*s)
3307 		return nfserr_bad_stateid;
3308 	return nfs_ok;
3309 
3310 }
3311 
3312 /*
3313 * Checks for stateid operations
3314 */
3315 __be32
3316 nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate,
3317 			   stateid_t *stateid, int flags, struct file **filpp)
3318 {
3319 	struct nfs4_stid *s;
3320 	struct nfs4_ol_stateid *stp = NULL;
3321 	struct nfs4_delegation *dp = NULL;
3322 	struct svc_fh *current_fh = &cstate->current_fh;
3323 	struct inode *ino = current_fh->fh_dentry->d_inode;
3324 	__be32 status;
3325 
3326 	if (filpp)
3327 		*filpp = NULL;
3328 
3329 	if (grace_disallows_io(ino))
3330 		return nfserr_grace;
3331 
3332 	if (ZERO_STATEID(stateid) || ONE_STATEID(stateid))
3333 		return check_special_stateids(current_fh, stateid, flags);
3334 
3335 	status = nfsd4_lookup_stateid(stateid, NFS4_DELEG_STID|NFS4_OPEN_STID|NFS4_LOCK_STID, &s);
3336 	if (status)
3337 		return status;
3338 	status = check_stateid_generation(stateid, &s->sc_stateid, nfsd4_has_session(cstate));
3339 	if (status)
3340 		goto out;
3341 	switch (s->sc_type) {
3342 	case NFS4_DELEG_STID:
3343 		dp = delegstateid(s);
3344 		status = nfs4_check_delegmode(dp, flags);
3345 		if (status)
3346 			goto out;
3347 		if (filpp) {
3348 			*filpp = dp->dl_file->fi_deleg_file;
3349 			BUG_ON(!*filpp);
3350 		}
3351 		break;
3352 	case NFS4_OPEN_STID:
3353 	case NFS4_LOCK_STID:
3354 		stp = openlockstateid(s);
3355 		status = nfs4_check_fh(current_fh, stp);
3356 		if (status)
3357 			goto out;
3358 		if (stp->st_stateowner->so_is_open_owner
3359 		    && !(openowner(stp->st_stateowner)->oo_flags & NFS4_OO_CONFIRMED))
3360 			goto out;
3361 		status = nfs4_check_openmode(stp, flags);
3362 		if (status)
3363 			goto out;
3364 		if (filpp) {
3365 			if (flags & RD_STATE)
3366 				*filpp = find_readable_file(stp->st_file);
3367 			else
3368 				*filpp = find_writeable_file(stp->st_file);
3369 		}
3370 		break;
3371 	default:
3372 		return nfserr_bad_stateid;
3373 	}
3374 	status = nfs_ok;
3375 out:
3376 	return status;
3377 }
3378 
3379 static __be32
3380 nfsd4_free_lock_stateid(struct nfs4_ol_stateid *stp)
3381 {
3382 	if (check_for_locks(stp->st_file, lockowner(stp->st_stateowner)))
3383 		return nfserr_locks_held;
3384 	release_lock_stateid(stp);
3385 	return nfs_ok;
3386 }
3387 
3388 /*
3389  * Test if the stateid is valid
3390  */
3391 __be32
3392 nfsd4_test_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
3393 		   struct nfsd4_test_stateid *test_stateid)
3394 {
3395 	/* real work is done during encoding */
3396 	return nfs_ok;
3397 }
3398 
3399 __be32
3400 nfsd4_free_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
3401 		   struct nfsd4_free_stateid *free_stateid)
3402 {
3403 	stateid_t *stateid = &free_stateid->fr_stateid;
3404 	struct nfs4_stid *s;
3405 	struct nfs4_client *cl = cstate->session->se_client;
3406 	__be32 ret = nfserr_bad_stateid;
3407 
3408 	nfs4_lock_state();
3409 	s = find_stateid(cl, stateid);
3410 	if (!s)
3411 		goto out;
3412 	switch (s->sc_type) {
3413 	case NFS4_DELEG_STID:
3414 		ret = nfserr_locks_held;
3415 		goto out;
3416 	case NFS4_OPEN_STID:
3417 	case NFS4_LOCK_STID:
3418 		ret = check_stateid_generation(stateid, &s->sc_stateid, 1);
3419 		if (ret)
3420 			goto out;
3421 		if (s->sc_type == NFS4_LOCK_STID)
3422 			ret = nfsd4_free_lock_stateid(openlockstateid(s));
3423 		else
3424 			ret = nfserr_locks_held;
3425 		break;
3426 	default:
3427 		ret = nfserr_bad_stateid;
3428 	}
3429 out:
3430 	nfs4_unlock_state();
3431 	return ret;
3432 }
3433 
3434 static inline int
3435 setlkflg (int type)
3436 {
3437 	return (type == NFS4_READW_LT || type == NFS4_READ_LT) ?
3438 		RD_STATE : WR_STATE;
3439 }
3440 
3441 static __be32 nfs4_seqid_op_checks(struct nfsd4_compound_state *cstate, stateid_t *stateid, u32 seqid, struct nfs4_ol_stateid *stp)
3442 {
3443 	struct svc_fh *current_fh = &cstate->current_fh;
3444 	struct nfs4_stateowner *sop = stp->st_stateowner;
3445 	__be32 status;
3446 
3447 	status = nfsd4_check_seqid(cstate, sop, seqid);
3448 	if (status)
3449 		return status;
3450 	if (stp->st_stid.sc_type == NFS4_CLOSED_STID)
3451 		/*
3452 		 * "Closed" stateid's exist *only* to return
3453 		 * nfserr_replay_me from the previous step.
3454 		 */
3455 		return nfserr_bad_stateid;
3456 	status = check_stateid_generation(stateid, &stp->st_stid.sc_stateid, nfsd4_has_session(cstate));
3457 	if (status)
3458 		return status;
3459 	return nfs4_check_fh(current_fh, stp);
3460 }
3461 
3462 /*
3463  * Checks for sequence id mutating operations.
3464  */
3465 static __be32
3466 nfs4_preprocess_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid,
3467 			 stateid_t *stateid, char typemask,
3468 			 struct nfs4_ol_stateid **stpp)
3469 {
3470 	__be32 status;
3471 	struct nfs4_stid *s;
3472 
3473 	dprintk("NFSD: %s: seqid=%d stateid = " STATEID_FMT "\n", __func__,
3474 		seqid, STATEID_VAL(stateid));
3475 
3476 	*stpp = NULL;
3477 	status = nfsd4_lookup_stateid(stateid, typemask, &s);
3478 	if (status)
3479 		return status;
3480 	*stpp = openlockstateid(s);
3481 	cstate->replay_owner = (*stpp)->st_stateowner;
3482 
3483 	return nfs4_seqid_op_checks(cstate, stateid, seqid, *stpp);
3484 }
3485 
3486 static __be32 nfs4_preprocess_confirmed_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid, stateid_t *stateid, struct nfs4_ol_stateid **stpp)
3487 {
3488 	__be32 status;
3489 	struct nfs4_openowner *oo;
3490 
3491 	status = nfs4_preprocess_seqid_op(cstate, seqid, stateid,
3492 						NFS4_OPEN_STID, stpp);
3493 	if (status)
3494 		return status;
3495 	oo = openowner((*stpp)->st_stateowner);
3496 	if (!(oo->oo_flags & NFS4_OO_CONFIRMED))
3497 		return nfserr_bad_stateid;
3498 	return nfs_ok;
3499 }
3500 
3501 __be32
3502 nfsd4_open_confirm(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
3503 		   struct nfsd4_open_confirm *oc)
3504 {
3505 	__be32 status;
3506 	struct nfs4_openowner *oo;
3507 	struct nfs4_ol_stateid *stp;
3508 
3509 	dprintk("NFSD: nfsd4_open_confirm on file %.*s\n",
3510 			(int)cstate->current_fh.fh_dentry->d_name.len,
3511 			cstate->current_fh.fh_dentry->d_name.name);
3512 
3513 	status = fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0);
3514 	if (status)
3515 		return status;
3516 
3517 	nfs4_lock_state();
3518 
3519 	status = nfs4_preprocess_seqid_op(cstate,
3520 					oc->oc_seqid, &oc->oc_req_stateid,
3521 					NFS4_OPEN_STID, &stp);
3522 	if (status)
3523 		goto out;
3524 	oo = openowner(stp->st_stateowner);
3525 	status = nfserr_bad_stateid;
3526 	if (oo->oo_flags & NFS4_OO_CONFIRMED)
3527 		goto out;
3528 	oo->oo_flags |= NFS4_OO_CONFIRMED;
3529 	update_stateid(&stp->st_stid.sc_stateid);
3530 	memcpy(&oc->oc_resp_stateid, &stp->st_stid.sc_stateid, sizeof(stateid_t));
3531 	dprintk("NFSD: %s: success, seqid=%d stateid=" STATEID_FMT "\n",
3532 		__func__, oc->oc_seqid, STATEID_VAL(&stp->st_stid.sc_stateid));
3533 
3534 	nfsd4_create_clid_dir(oo->oo_owner.so_client);
3535 	status = nfs_ok;
3536 out:
3537 	if (!cstate->replay_owner)
3538 		nfs4_unlock_state();
3539 	return status;
3540 }
3541 
3542 static inline void nfs4_stateid_downgrade_bit(struct nfs4_ol_stateid *stp, u32 access)
3543 {
3544 	if (!test_bit(access, &stp->st_access_bmap))
3545 		return;
3546 	nfs4_file_put_access(stp->st_file, nfs4_access_to_omode(access));
3547 	__clear_bit(access, &stp->st_access_bmap);
3548 }
3549 
3550 static inline void nfs4_stateid_downgrade(struct nfs4_ol_stateid *stp, u32 to_access)
3551 {
3552 	switch (to_access) {
3553 	case NFS4_SHARE_ACCESS_READ:
3554 		nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_WRITE);
3555 		nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_BOTH);
3556 		break;
3557 	case NFS4_SHARE_ACCESS_WRITE:
3558 		nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_READ);
3559 		nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_BOTH);
3560 		break;
3561 	case NFS4_SHARE_ACCESS_BOTH:
3562 		break;
3563 	default:
3564 		BUG();
3565 	}
3566 }
3567 
3568 static void
3569 reset_union_bmap_deny(unsigned long deny, unsigned long *bmap)
3570 {
3571 	int i;
3572 	for (i = 0; i < 4; i++) {
3573 		if ((i & deny) != i)
3574 			__clear_bit(i, bmap);
3575 	}
3576 }
3577 
3578 __be32
3579 nfsd4_open_downgrade(struct svc_rqst *rqstp,
3580 		     struct nfsd4_compound_state *cstate,
3581 		     struct nfsd4_open_downgrade *od)
3582 {
3583 	__be32 status;
3584 	struct nfs4_ol_stateid *stp;
3585 
3586 	dprintk("NFSD: nfsd4_open_downgrade on file %.*s\n",
3587 			(int)cstate->current_fh.fh_dentry->d_name.len,
3588 			cstate->current_fh.fh_dentry->d_name.name);
3589 
3590 	/* We don't yet support WANT bits: */
3591 	od->od_share_access &= NFS4_SHARE_ACCESS_MASK;
3592 
3593 	nfs4_lock_state();
3594 	status = nfs4_preprocess_confirmed_seqid_op(cstate, od->od_seqid,
3595 					&od->od_stateid, &stp);
3596 	if (status)
3597 		goto out;
3598 	status = nfserr_inval;
3599 	if (!test_bit(od->od_share_access, &stp->st_access_bmap)) {
3600 		dprintk("NFSD:access not a subset current bitmap: 0x%lx, input access=%08x\n",
3601 			stp->st_access_bmap, od->od_share_access);
3602 		goto out;
3603 	}
3604 	if (!test_bit(od->od_share_deny, &stp->st_deny_bmap)) {
3605 		dprintk("NFSD:deny not a subset current bitmap: 0x%lx, input deny=%08x\n",
3606 			stp->st_deny_bmap, od->od_share_deny);
3607 		goto out;
3608 	}
3609 	nfs4_stateid_downgrade(stp, od->od_share_access);
3610 
3611 	reset_union_bmap_deny(od->od_share_deny, &stp->st_deny_bmap);
3612 
3613 	update_stateid(&stp->st_stid.sc_stateid);
3614 	memcpy(&od->od_stateid, &stp->st_stid.sc_stateid, sizeof(stateid_t));
3615 	status = nfs_ok;
3616 out:
3617 	if (!cstate->replay_owner)
3618 		nfs4_unlock_state();
3619 	return status;
3620 }
3621 
3622 void nfsd4_purge_closed_stateid(struct nfs4_stateowner *so)
3623 {
3624 	struct nfs4_openowner *oo;
3625 	struct nfs4_ol_stateid *s;
3626 
3627 	if (!so->so_is_open_owner)
3628 		return;
3629 	oo = openowner(so);
3630 	s = oo->oo_last_closed_stid;
3631 	if (!s)
3632 		return;
3633 	if (!(oo->oo_flags & NFS4_OO_PURGE_CLOSE)) {
3634 		/* Release the last_closed_stid on the next seqid bump: */
3635 		oo->oo_flags |= NFS4_OO_PURGE_CLOSE;
3636 		return;
3637 	}
3638 	oo->oo_flags &= ~NFS4_OO_PURGE_CLOSE;
3639 	release_last_closed_stateid(oo);
3640 }
3641 
3642 static void nfsd4_close_open_stateid(struct nfs4_ol_stateid *s)
3643 {
3644 	unhash_open_stateid(s);
3645 	s->st_stid.sc_type = NFS4_CLOSED_STID;
3646 }
3647 
3648 /*
3649  * nfs4_unlock_state() called after encode
3650  */
3651 __be32
3652 nfsd4_close(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
3653 	    struct nfsd4_close *close)
3654 {
3655 	__be32 status;
3656 	struct nfs4_openowner *oo;
3657 	struct nfs4_ol_stateid *stp;
3658 
3659 	dprintk("NFSD: nfsd4_close on file %.*s\n",
3660 			(int)cstate->current_fh.fh_dentry->d_name.len,
3661 			cstate->current_fh.fh_dentry->d_name.name);
3662 
3663 	nfs4_lock_state();
3664 	status = nfs4_preprocess_seqid_op(cstate, close->cl_seqid,
3665 					&close->cl_stateid,
3666 					NFS4_OPEN_STID|NFS4_CLOSED_STID,
3667 					&stp);
3668 	if (status)
3669 		goto out;
3670 	oo = openowner(stp->st_stateowner);
3671 	status = nfs_ok;
3672 	update_stateid(&stp->st_stid.sc_stateid);
3673 	memcpy(&close->cl_stateid, &stp->st_stid.sc_stateid, sizeof(stateid_t));
3674 
3675 	nfsd4_close_open_stateid(stp);
3676 	oo->oo_last_closed_stid = stp;
3677 
3678 	/* place unused nfs4_stateowners on so_close_lru list to be
3679 	 * released by the laundromat service after the lease period
3680 	 * to enable us to handle CLOSE replay
3681 	 */
3682 	if (list_empty(&oo->oo_owner.so_stateids))
3683 		move_to_close_lru(oo);
3684 out:
3685 	if (!cstate->replay_owner)
3686 		nfs4_unlock_state();
3687 	return status;
3688 }
3689 
3690 __be32
3691 nfsd4_delegreturn(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
3692 		  struct nfsd4_delegreturn *dr)
3693 {
3694 	struct nfs4_delegation *dp;
3695 	stateid_t *stateid = &dr->dr_stateid;
3696 	struct nfs4_stid *s;
3697 	struct inode *inode;
3698 	__be32 status;
3699 
3700 	if ((status = fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0)))
3701 		return status;
3702 	inode = cstate->current_fh.fh_dentry->d_inode;
3703 
3704 	nfs4_lock_state();
3705 	status = nfsd4_lookup_stateid(stateid, NFS4_DELEG_STID, &s);
3706 	if (status)
3707 		goto out;
3708 	dp = delegstateid(s);
3709 	status = check_stateid_generation(stateid, &dp->dl_stid.sc_stateid, nfsd4_has_session(cstate));
3710 	if (status)
3711 		goto out;
3712 
3713 	unhash_delegation(dp);
3714 out:
3715 	nfs4_unlock_state();
3716 
3717 	return status;
3718 }
3719 
3720 
3721 /*
3722  * Lock owner state (byte-range locks)
3723  */
3724 #define LOFF_OVERFLOW(start, len)      ((u64)(len) > ~(u64)(start))
3725 #define LOCK_HASH_BITS              8
3726 #define LOCK_HASH_SIZE             (1 << LOCK_HASH_BITS)
3727 #define LOCK_HASH_MASK             (LOCK_HASH_SIZE - 1)
3728 
3729 static inline u64
3730 end_offset(u64 start, u64 len)
3731 {
3732 	u64 end;
3733 
3734 	end = start + len;
3735 	return end >= start ? end: NFS4_MAX_UINT64;
3736 }
3737 
3738 /* last octet in a range */
3739 static inline u64
3740 last_byte_offset(u64 start, u64 len)
3741 {
3742 	u64 end;
3743 
3744 	BUG_ON(!len);
3745 	end = start + len;
3746 	return end > start ? end - 1: NFS4_MAX_UINT64;
3747 }
3748 
3749 static inline unsigned int
3750 lock_ownerstr_hashval(struct inode *inode, u32 cl_id,
3751 		struct xdr_netobj *ownername)
3752 {
3753 	return (file_hashval(inode) + cl_id
3754 			+ opaque_hashval(ownername->data, ownername->len))
3755 		& LOCK_HASH_MASK;
3756 }
3757 
3758 static struct list_head	lock_ownerstr_hashtbl[LOCK_HASH_SIZE];
3759 
3760 /*
3761  * TODO: Linux file offsets are _signed_ 64-bit quantities, which means that
3762  * we can't properly handle lock requests that go beyond the (2^63 - 1)-th
3763  * byte, because of sign extension problems.  Since NFSv4 calls for 64-bit
3764  * locking, this prevents us from being completely protocol-compliant.  The
3765  * real solution to this problem is to start using unsigned file offsets in
3766  * the VFS, but this is a very deep change!
3767  */
3768 static inline void
3769 nfs4_transform_lock_offset(struct file_lock *lock)
3770 {
3771 	if (lock->fl_start < 0)
3772 		lock->fl_start = OFFSET_MAX;
3773 	if (lock->fl_end < 0)
3774 		lock->fl_end = OFFSET_MAX;
3775 }
3776 
3777 /* Hack!: For now, we're defining this just so we can use a pointer to it
3778  * as a unique cookie to identify our (NFSv4's) posix locks. */
3779 static const struct lock_manager_operations nfsd_posix_mng_ops  = {
3780 };
3781 
3782 static inline void
3783 nfs4_set_lock_denied(struct file_lock *fl, struct nfsd4_lock_denied *deny)
3784 {
3785 	struct nfs4_lockowner *lo;
3786 
3787 	if (fl->fl_lmops == &nfsd_posix_mng_ops) {
3788 		lo = (struct nfs4_lockowner *) fl->fl_owner;
3789 		deny->ld_owner.data = kmemdup(lo->lo_owner.so_owner.data,
3790 					lo->lo_owner.so_owner.len, GFP_KERNEL);
3791 		if (!deny->ld_owner.data)
3792 			/* We just don't care that much */
3793 			goto nevermind;
3794 		deny->ld_owner.len = lo->lo_owner.so_owner.len;
3795 		deny->ld_clientid = lo->lo_owner.so_client->cl_clientid;
3796 	} else {
3797 nevermind:
3798 		deny->ld_owner.len = 0;
3799 		deny->ld_owner.data = NULL;
3800 		deny->ld_clientid.cl_boot = 0;
3801 		deny->ld_clientid.cl_id = 0;
3802 	}
3803 	deny->ld_start = fl->fl_start;
3804 	deny->ld_length = NFS4_MAX_UINT64;
3805 	if (fl->fl_end != NFS4_MAX_UINT64)
3806 		deny->ld_length = fl->fl_end - fl->fl_start + 1;
3807 	deny->ld_type = NFS4_READ_LT;
3808 	if (fl->fl_type != F_RDLCK)
3809 		deny->ld_type = NFS4_WRITE_LT;
3810 }
3811 
3812 static struct nfs4_lockowner *
3813 find_lockowner_str(struct inode *inode, clientid_t *clid,
3814 		struct xdr_netobj *owner)
3815 {
3816 	unsigned int hashval = lock_ownerstr_hashval(inode, clid->cl_id, owner);
3817 	struct nfs4_stateowner *op;
3818 
3819 	list_for_each_entry(op, &lock_ownerstr_hashtbl[hashval], so_strhash) {
3820 		if (same_owner_str(op, owner, clid))
3821 			return lockowner(op);
3822 	}
3823 	return NULL;
3824 }
3825 
3826 static void hash_lockowner(struct nfs4_lockowner *lo, unsigned int strhashval, struct nfs4_client *clp, struct nfs4_ol_stateid *open_stp)
3827 {
3828 	list_add(&lo->lo_owner.so_strhash, &lock_ownerstr_hashtbl[strhashval]);
3829 	list_add(&lo->lo_perstateid, &open_stp->st_lockowners);
3830 }
3831 
3832 /*
3833  * Alloc a lock owner structure.
3834  * Called in nfsd4_lock - therefore, OPEN and OPEN_CONFIRM (if needed) has
3835  * occurred.
3836  *
3837  * strhashval = lock_ownerstr_hashval
3838  */
3839 
3840 static struct nfs4_lockowner *
3841 alloc_init_lock_stateowner(unsigned int strhashval, struct nfs4_client *clp, struct nfs4_ol_stateid *open_stp, struct nfsd4_lock *lock) {
3842 	struct nfs4_lockowner *lo;
3843 
3844 	lo = alloc_stateowner(lockowner_slab, &lock->lk_new_owner, clp);
3845 	if (!lo)
3846 		return NULL;
3847 	INIT_LIST_HEAD(&lo->lo_owner.so_stateids);
3848 	lo->lo_owner.so_is_open_owner = 0;
3849 	/* It is the openowner seqid that will be incremented in encode in the
3850 	 * case of new lockowners; so increment the lock seqid manually: */
3851 	lo->lo_owner.so_seqid = lock->lk_new_lock_seqid + 1;
3852 	hash_lockowner(lo, strhashval, clp, open_stp);
3853 	return lo;
3854 }
3855 
3856 static struct nfs4_ol_stateid *
3857 alloc_init_lock_stateid(struct nfs4_lockowner *lo, struct nfs4_file *fp, struct nfs4_ol_stateid *open_stp)
3858 {
3859 	struct nfs4_ol_stateid *stp;
3860 	struct nfs4_client *clp = lo->lo_owner.so_client;
3861 
3862 	stp = nfs4_alloc_stateid(clp);
3863 	if (stp == NULL)
3864 		return NULL;
3865 	init_stid(&stp->st_stid, clp, NFS4_LOCK_STID);
3866 	list_add(&stp->st_perfile, &fp->fi_stateids);
3867 	list_add(&stp->st_perstateowner, &lo->lo_owner.so_stateids);
3868 	stp->st_stateowner = &lo->lo_owner;
3869 	get_nfs4_file(fp);
3870 	stp->st_file = fp;
3871 	stp->st_access_bmap = 0;
3872 	stp->st_deny_bmap = open_stp->st_deny_bmap;
3873 	stp->st_openstp = open_stp;
3874 	return stp;
3875 }
3876 
3877 static int
3878 check_lock_length(u64 offset, u64 length)
3879 {
3880 	return ((length == 0)  || ((length != NFS4_MAX_UINT64) &&
3881 	     LOFF_OVERFLOW(offset, length)));
3882 }
3883 
3884 static void get_lock_access(struct nfs4_ol_stateid *lock_stp, u32 access)
3885 {
3886 	struct nfs4_file *fp = lock_stp->st_file;
3887 	int oflag = nfs4_access_to_omode(access);
3888 
3889 	if (test_bit(access, &lock_stp->st_access_bmap))
3890 		return;
3891 	nfs4_file_get_access(fp, oflag);
3892 	__set_bit(access, &lock_stp->st_access_bmap);
3893 }
3894 
3895 /*
3896  *  LOCK operation
3897  */
3898 __be32
3899 nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
3900 	   struct nfsd4_lock *lock)
3901 {
3902 	struct nfs4_openowner *open_sop = NULL;
3903 	struct nfs4_lockowner *lock_sop = NULL;
3904 	struct nfs4_ol_stateid *lock_stp;
3905 	struct nfs4_file *fp;
3906 	struct file *filp = NULL;
3907 	struct file_lock file_lock;
3908 	struct file_lock conflock;
3909 	__be32 status = 0;
3910 	unsigned int strhashval;
3911 	int lkflg;
3912 	int err;
3913 
3914 	dprintk("NFSD: nfsd4_lock: start=%Ld length=%Ld\n",
3915 		(long long) lock->lk_offset,
3916 		(long long) lock->lk_length);
3917 
3918 	if (check_lock_length(lock->lk_offset, lock->lk_length))
3919 		 return nfserr_inval;
3920 
3921 	if ((status = fh_verify(rqstp, &cstate->current_fh,
3922 				S_IFREG, NFSD_MAY_LOCK))) {
3923 		dprintk("NFSD: nfsd4_lock: permission denied!\n");
3924 		return status;
3925 	}
3926 
3927 	nfs4_lock_state();
3928 
3929 	if (lock->lk_is_new) {
3930 		/*
3931 		 * Client indicates that this is a new lockowner.
3932 		 * Use open owner and open stateid to create lock owner and
3933 		 * lock stateid.
3934 		 */
3935 		struct nfs4_ol_stateid *open_stp = NULL;
3936 
3937 		status = nfserr_stale_clientid;
3938 		if (!nfsd4_has_session(cstate) &&
3939 		    STALE_CLIENTID(&lock->lk_new_clientid))
3940 			goto out;
3941 
3942 		/* validate and update open stateid and open seqid */
3943 		status = nfs4_preprocess_confirmed_seqid_op(cstate,
3944 				        lock->lk_new_open_seqid,
3945 		                        &lock->lk_new_open_stateid,
3946 					&open_stp);
3947 		if (status)
3948 			goto out;
3949 		open_sop = openowner(open_stp->st_stateowner);
3950 		status = nfserr_bad_stateid;
3951 		if (!nfsd4_has_session(cstate) &&
3952 			!same_clid(&open_sop->oo_owner.so_client->cl_clientid,
3953 						&lock->v.new.clientid))
3954 			goto out;
3955 		/* create lockowner and lock stateid */
3956 		fp = open_stp->st_file;
3957 		strhashval = lock_ownerstr_hashval(fp->fi_inode,
3958 				open_sop->oo_owner.so_client->cl_clientid.cl_id,
3959 				&lock->v.new.owner);
3960 		/* XXX: Do we need to check for duplicate stateowners on
3961 		 * the same file, or should they just be allowed (and
3962 		 * create new stateids)? */
3963 		status = nfserr_jukebox;
3964 		lock_sop = alloc_init_lock_stateowner(strhashval,
3965 				open_sop->oo_owner.so_client, open_stp, lock);
3966 		if (lock_sop == NULL)
3967 			goto out;
3968 		lock_stp = alloc_init_lock_stateid(lock_sop, fp, open_stp);
3969 		if (lock_stp == NULL)
3970 			goto out;
3971 	} else {
3972 		/* lock (lock owner + lock stateid) already exists */
3973 		status = nfs4_preprocess_seqid_op(cstate,
3974 				       lock->lk_old_lock_seqid,
3975 				       &lock->lk_old_lock_stateid,
3976 				       NFS4_LOCK_STID, &lock_stp);
3977 		if (status)
3978 			goto out;
3979 		lock_sop = lockowner(lock_stp->st_stateowner);
3980 		fp = lock_stp->st_file;
3981 	}
3982 	/* lock_sop and lock_stp have been created or found */
3983 
3984 	lkflg = setlkflg(lock->lk_type);
3985 	status = nfs4_check_openmode(lock_stp, lkflg);
3986 	if (status)
3987 		goto out;
3988 
3989 	status = nfserr_grace;
3990 	if (locks_in_grace() && !lock->lk_reclaim)
3991 		goto out;
3992 	status = nfserr_no_grace;
3993 	if (!locks_in_grace() && lock->lk_reclaim)
3994 		goto out;
3995 
3996 	locks_init_lock(&file_lock);
3997 	switch (lock->lk_type) {
3998 		case NFS4_READ_LT:
3999 		case NFS4_READW_LT:
4000 			filp = find_readable_file(lock_stp->st_file);
4001 			if (filp)
4002 				get_lock_access(lock_stp, NFS4_SHARE_ACCESS_READ);
4003 			file_lock.fl_type = F_RDLCK;
4004 			break;
4005 		case NFS4_WRITE_LT:
4006 		case NFS4_WRITEW_LT:
4007 			filp = find_writeable_file(lock_stp->st_file);
4008 			if (filp)
4009 				get_lock_access(lock_stp, NFS4_SHARE_ACCESS_WRITE);
4010 			file_lock.fl_type = F_WRLCK;
4011 			break;
4012 		default:
4013 			status = nfserr_inval;
4014 		goto out;
4015 	}
4016 	if (!filp) {
4017 		status = nfserr_openmode;
4018 		goto out;
4019 	}
4020 	file_lock.fl_owner = (fl_owner_t)lock_sop;
4021 	file_lock.fl_pid = current->tgid;
4022 	file_lock.fl_file = filp;
4023 	file_lock.fl_flags = FL_POSIX;
4024 	file_lock.fl_lmops = &nfsd_posix_mng_ops;
4025 
4026 	file_lock.fl_start = lock->lk_offset;
4027 	file_lock.fl_end = last_byte_offset(lock->lk_offset, lock->lk_length);
4028 	nfs4_transform_lock_offset(&file_lock);
4029 
4030 	/*
4031 	* Try to lock the file in the VFS.
4032 	* Note: locks.c uses the BKL to protect the inode's lock list.
4033 	*/
4034 
4035 	err = vfs_lock_file(filp, F_SETLK, &file_lock, &conflock);
4036 	switch (-err) {
4037 	case 0: /* success! */
4038 		update_stateid(&lock_stp->st_stid.sc_stateid);
4039 		memcpy(&lock->lk_resp_stateid, &lock_stp->st_stid.sc_stateid,
4040 				sizeof(stateid_t));
4041 		status = 0;
4042 		break;
4043 	case (EAGAIN):		/* conflock holds conflicting lock */
4044 		status = nfserr_denied;
4045 		dprintk("NFSD: nfsd4_lock: conflicting lock found!\n");
4046 		nfs4_set_lock_denied(&conflock, &lock->lk_denied);
4047 		break;
4048 	case (EDEADLK):
4049 		status = nfserr_deadlock;
4050 		break;
4051 	default:
4052 		dprintk("NFSD: nfsd4_lock: vfs_lock_file() failed! status %d\n",err);
4053 		status = nfserrno(err);
4054 		break;
4055 	}
4056 out:
4057 	if (status && lock->lk_is_new && lock_sop)
4058 		release_lockowner(lock_sop);
4059 	if (!cstate->replay_owner)
4060 		nfs4_unlock_state();
4061 	return status;
4062 }
4063 
4064 /*
4065  * The NFSv4 spec allows a client to do a LOCKT without holding an OPEN,
4066  * so we do a temporary open here just to get an open file to pass to
4067  * vfs_test_lock.  (Arguably perhaps test_lock should be done with an
4068  * inode operation.)
4069  */
4070 static int nfsd_test_lock(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file_lock *lock)
4071 {
4072 	struct file *file;
4073 	int err;
4074 
4075 	err = nfsd_open(rqstp, fhp, S_IFREG, NFSD_MAY_READ, &file);
4076 	if (err)
4077 		return err;
4078 	err = vfs_test_lock(file, lock);
4079 	nfsd_close(file);
4080 	return err;
4081 }
4082 
4083 /*
4084  * LOCKT operation
4085  */
4086 __be32
4087 nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
4088 	    struct nfsd4_lockt *lockt)
4089 {
4090 	struct inode *inode;
4091 	struct file_lock file_lock;
4092 	struct nfs4_lockowner *lo;
4093 	int error;
4094 	__be32 status;
4095 
4096 	if (locks_in_grace())
4097 		return nfserr_grace;
4098 
4099 	if (check_lock_length(lockt->lt_offset, lockt->lt_length))
4100 		 return nfserr_inval;
4101 
4102 	nfs4_lock_state();
4103 
4104 	status = nfserr_stale_clientid;
4105 	if (!nfsd4_has_session(cstate) && STALE_CLIENTID(&lockt->lt_clientid))
4106 		goto out;
4107 
4108 	if ((status = fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0)))
4109 		goto out;
4110 
4111 	inode = cstate->current_fh.fh_dentry->d_inode;
4112 	locks_init_lock(&file_lock);
4113 	switch (lockt->lt_type) {
4114 		case NFS4_READ_LT:
4115 		case NFS4_READW_LT:
4116 			file_lock.fl_type = F_RDLCK;
4117 		break;
4118 		case NFS4_WRITE_LT:
4119 		case NFS4_WRITEW_LT:
4120 			file_lock.fl_type = F_WRLCK;
4121 		break;
4122 		default:
4123 			dprintk("NFSD: nfs4_lockt: bad lock type!\n");
4124 			status = nfserr_inval;
4125 		goto out;
4126 	}
4127 
4128 	lo = find_lockowner_str(inode, &lockt->lt_clientid, &lockt->lt_owner);
4129 	if (lo)
4130 		file_lock.fl_owner = (fl_owner_t)lo;
4131 	file_lock.fl_pid = current->tgid;
4132 	file_lock.fl_flags = FL_POSIX;
4133 
4134 	file_lock.fl_start = lockt->lt_offset;
4135 	file_lock.fl_end = last_byte_offset(lockt->lt_offset, lockt->lt_length);
4136 
4137 	nfs4_transform_lock_offset(&file_lock);
4138 
4139 	status = nfs_ok;
4140 	error = nfsd_test_lock(rqstp, &cstate->current_fh, &file_lock);
4141 	if (error) {
4142 		status = nfserrno(error);
4143 		goto out;
4144 	}
4145 	if (file_lock.fl_type != F_UNLCK) {
4146 		status = nfserr_denied;
4147 		nfs4_set_lock_denied(&file_lock, &lockt->lt_denied);
4148 	}
4149 out:
4150 	nfs4_unlock_state();
4151 	return status;
4152 }
4153 
4154 __be32
4155 nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
4156 	    struct nfsd4_locku *locku)
4157 {
4158 	struct nfs4_ol_stateid *stp;
4159 	struct file *filp = NULL;
4160 	struct file_lock file_lock;
4161 	__be32 status;
4162 	int err;
4163 
4164 	dprintk("NFSD: nfsd4_locku: start=%Ld length=%Ld\n",
4165 		(long long) locku->lu_offset,
4166 		(long long) locku->lu_length);
4167 
4168 	if (check_lock_length(locku->lu_offset, locku->lu_length))
4169 		 return nfserr_inval;
4170 
4171 	nfs4_lock_state();
4172 
4173 	status = nfs4_preprocess_seqid_op(cstate, locku->lu_seqid,
4174 					&locku->lu_stateid, NFS4_LOCK_STID, &stp);
4175 	if (status)
4176 		goto out;
4177 	filp = find_any_file(stp->st_file);
4178 	if (!filp) {
4179 		status = nfserr_lock_range;
4180 		goto out;
4181 	}
4182 	BUG_ON(!filp);
4183 	locks_init_lock(&file_lock);
4184 	file_lock.fl_type = F_UNLCK;
4185 	file_lock.fl_owner = (fl_owner_t)lockowner(stp->st_stateowner);
4186 	file_lock.fl_pid = current->tgid;
4187 	file_lock.fl_file = filp;
4188 	file_lock.fl_flags = FL_POSIX;
4189 	file_lock.fl_lmops = &nfsd_posix_mng_ops;
4190 	file_lock.fl_start = locku->lu_offset;
4191 
4192 	file_lock.fl_end = last_byte_offset(locku->lu_offset, locku->lu_length);
4193 	nfs4_transform_lock_offset(&file_lock);
4194 
4195 	/*
4196 	*  Try to unlock the file in the VFS.
4197 	*/
4198 	err = vfs_lock_file(filp, F_SETLK, &file_lock, NULL);
4199 	if (err) {
4200 		dprintk("NFSD: nfs4_locku: vfs_lock_file failed!\n");
4201 		goto out_nfserr;
4202 	}
4203 	/*
4204 	* OK, unlock succeeded; the only thing left to do is update the stateid.
4205 	*/
4206 	update_stateid(&stp->st_stid.sc_stateid);
4207 	memcpy(&locku->lu_stateid, &stp->st_stid.sc_stateid, sizeof(stateid_t));
4208 
4209 out:
4210 	if (!cstate->replay_owner)
4211 		nfs4_unlock_state();
4212 	return status;
4213 
4214 out_nfserr:
4215 	status = nfserrno(err);
4216 	goto out;
4217 }
4218 
4219 /*
4220  * returns
4221  * 	1: locks held by lockowner
4222  * 	0: no locks held by lockowner
4223  */
4224 static int
4225 check_for_locks(struct nfs4_file *filp, struct nfs4_lockowner *lowner)
4226 {
4227 	struct file_lock **flpp;
4228 	struct inode *inode = filp->fi_inode;
4229 	int status = 0;
4230 
4231 	lock_flocks();
4232 	for (flpp = &inode->i_flock; *flpp != NULL; flpp = &(*flpp)->fl_next) {
4233 		if ((*flpp)->fl_owner == (fl_owner_t)lowner) {
4234 			status = 1;
4235 			goto out;
4236 		}
4237 	}
4238 out:
4239 	unlock_flocks();
4240 	return status;
4241 }
4242 
4243 __be32
4244 nfsd4_release_lockowner(struct svc_rqst *rqstp,
4245 			struct nfsd4_compound_state *cstate,
4246 			struct nfsd4_release_lockowner *rlockowner)
4247 {
4248 	clientid_t *clid = &rlockowner->rl_clientid;
4249 	struct nfs4_stateowner *sop;
4250 	struct nfs4_lockowner *lo;
4251 	struct nfs4_ol_stateid *stp;
4252 	struct xdr_netobj *owner = &rlockowner->rl_owner;
4253 	struct list_head matches;
4254 	int i;
4255 	__be32 status;
4256 
4257 	dprintk("nfsd4_release_lockowner clientid: (%08x/%08x):\n",
4258 		clid->cl_boot, clid->cl_id);
4259 
4260 	/* XXX check for lease expiration */
4261 
4262 	status = nfserr_stale_clientid;
4263 	if (STALE_CLIENTID(clid))
4264 		return status;
4265 
4266 	nfs4_lock_state();
4267 
4268 	status = nfserr_locks_held;
4269 	/* XXX: we're doing a linear search through all the lockowners.
4270 	 * Yipes!  For now we'll just hope clients aren't really using
4271 	 * release_lockowner much, but eventually we have to fix these
4272 	 * data structures. */
4273 	INIT_LIST_HEAD(&matches);
4274 	for (i = 0; i < LOCK_HASH_SIZE; i++) {
4275 		list_for_each_entry(sop, &lock_ownerstr_hashtbl[i], so_strhash) {
4276 			if (!same_owner_str(sop, owner, clid))
4277 				continue;
4278 			list_for_each_entry(stp, &sop->so_stateids,
4279 					st_perstateowner) {
4280 				lo = lockowner(sop);
4281 				if (check_for_locks(stp->st_file, lo))
4282 					goto out;
4283 				list_add(&lo->lo_list, &matches);
4284 			}
4285 		}
4286 	}
4287 	/* Clients probably won't expect us to return with some (but not all)
4288 	 * of the lockowner state released; so don't release any until all
4289 	 * have been checked. */
4290 	status = nfs_ok;
4291 	while (!list_empty(&matches)) {
4292 		lo = list_entry(matches.next, struct nfs4_lockowner,
4293 								lo_list);
4294 		/* unhash_stateowner deletes so_perclient only
4295 		 * for openowners. */
4296 		list_del(&lo->lo_list);
4297 		release_lockowner(lo);
4298 	}
4299 out:
4300 	nfs4_unlock_state();
4301 	return status;
4302 }
4303 
4304 static inline struct nfs4_client_reclaim *
4305 alloc_reclaim(void)
4306 {
4307 	return kmalloc(sizeof(struct nfs4_client_reclaim), GFP_KERNEL);
4308 }
4309 
4310 int
4311 nfs4_has_reclaimed_state(const char *name, bool use_exchange_id)
4312 {
4313 	unsigned int strhashval = clientstr_hashval(name);
4314 	struct nfs4_client *clp;
4315 
4316 	clp = find_confirmed_client_by_str(name, strhashval);
4317 	return clp ? 1 : 0;
4318 }
4319 
4320 /*
4321  * failure => all reset bets are off, nfserr_no_grace...
4322  */
4323 int
4324 nfs4_client_to_reclaim(const char *name)
4325 {
4326 	unsigned int strhashval;
4327 	struct nfs4_client_reclaim *crp = NULL;
4328 
4329 	dprintk("NFSD nfs4_client_to_reclaim NAME: %.*s\n", HEXDIR_LEN, name);
4330 	crp = alloc_reclaim();
4331 	if (!crp)
4332 		return 0;
4333 	strhashval = clientstr_hashval(name);
4334 	INIT_LIST_HEAD(&crp->cr_strhash);
4335 	list_add(&crp->cr_strhash, &reclaim_str_hashtbl[strhashval]);
4336 	memcpy(crp->cr_recdir, name, HEXDIR_LEN);
4337 	reclaim_str_hashtbl_size++;
4338 	return 1;
4339 }
4340 
4341 static void
4342 nfs4_release_reclaim(void)
4343 {
4344 	struct nfs4_client_reclaim *crp = NULL;
4345 	int i;
4346 
4347 	for (i = 0; i < CLIENT_HASH_SIZE; i++) {
4348 		while (!list_empty(&reclaim_str_hashtbl[i])) {
4349 			crp = list_entry(reclaim_str_hashtbl[i].next,
4350 			                struct nfs4_client_reclaim, cr_strhash);
4351 			list_del(&crp->cr_strhash);
4352 			kfree(crp);
4353 			reclaim_str_hashtbl_size--;
4354 		}
4355 	}
4356 	BUG_ON(reclaim_str_hashtbl_size);
4357 }
4358 
4359 /*
4360  * called from OPEN, CLAIM_PREVIOUS with a new clientid. */
4361 static struct nfs4_client_reclaim *
4362 nfs4_find_reclaim_client(clientid_t *clid)
4363 {
4364 	unsigned int strhashval;
4365 	struct nfs4_client *clp;
4366 	struct nfs4_client_reclaim *crp = NULL;
4367 
4368 
4369 	/* find clientid in conf_id_hashtbl */
4370 	clp = find_confirmed_client(clid);
4371 	if (clp == NULL)
4372 		return NULL;
4373 
4374 	dprintk("NFSD: nfs4_find_reclaim_client for %.*s with recdir %s\n",
4375 		            clp->cl_name.len, clp->cl_name.data,
4376 			    clp->cl_recdir);
4377 
4378 	/* find clp->cl_name in reclaim_str_hashtbl */
4379 	strhashval = clientstr_hashval(clp->cl_recdir);
4380 	list_for_each_entry(crp, &reclaim_str_hashtbl[strhashval], cr_strhash) {
4381 		if (same_name(crp->cr_recdir, clp->cl_recdir)) {
4382 			return crp;
4383 		}
4384 	}
4385 	return NULL;
4386 }
4387 
4388 /*
4389 * Called from OPEN. Look for clientid in reclaim list.
4390 */
4391 __be32
4392 nfs4_check_open_reclaim(clientid_t *clid)
4393 {
4394 	return nfs4_find_reclaim_client(clid) ? nfs_ok : nfserr_reclaim_bad;
4395 }
4396 
4397 /* initialization to perform at module load time: */
4398 
4399 int
4400 nfs4_state_init(void)
4401 {
4402 	int i, status;
4403 
4404 	status = nfsd4_init_slabs();
4405 	if (status)
4406 		return status;
4407 	for (i = 0; i < CLIENT_HASH_SIZE; i++) {
4408 		INIT_LIST_HEAD(&conf_id_hashtbl[i]);
4409 		INIT_LIST_HEAD(&conf_str_hashtbl[i]);
4410 		INIT_LIST_HEAD(&unconf_str_hashtbl[i]);
4411 		INIT_LIST_HEAD(&unconf_id_hashtbl[i]);
4412 		INIT_LIST_HEAD(&reclaim_str_hashtbl[i]);
4413 	}
4414 	for (i = 0; i < SESSION_HASH_SIZE; i++)
4415 		INIT_LIST_HEAD(&sessionid_hashtbl[i]);
4416 	for (i = 0; i < FILE_HASH_SIZE; i++) {
4417 		INIT_LIST_HEAD(&file_hashtbl[i]);
4418 	}
4419 	for (i = 0; i < OPEN_OWNER_HASH_SIZE; i++) {
4420 		INIT_LIST_HEAD(&open_ownerstr_hashtbl[i]);
4421 	}
4422 	for (i = 0; i < LOCK_HASH_SIZE; i++) {
4423 		INIT_LIST_HEAD(&lock_ownerstr_hashtbl[i]);
4424 	}
4425 	memset(&onestateid, ~0, sizeof(stateid_t));
4426 	INIT_LIST_HEAD(&close_lru);
4427 	INIT_LIST_HEAD(&client_lru);
4428 	INIT_LIST_HEAD(&del_recall_lru);
4429 	reclaim_str_hashtbl_size = 0;
4430 	return 0;
4431 }
4432 
4433 static void
4434 nfsd4_load_reboot_recovery_data(void)
4435 {
4436 	int status;
4437 
4438 	nfs4_lock_state();
4439 	nfsd4_init_recdir();
4440 	status = nfsd4_recdir_load();
4441 	nfs4_unlock_state();
4442 	if (status)
4443 		printk("NFSD: Failure reading reboot recovery data\n");
4444 }
4445 
4446 /*
4447  * Since the lifetime of a delegation isn't limited to that of an open, a
4448  * client may quite reasonably hang on to a delegation as long as it has
4449  * the inode cached.  This becomes an obvious problem the first time a
4450  * client's inode cache approaches the size of the server's total memory.
4451  *
4452  * For now we avoid this problem by imposing a hard limit on the number
4453  * of delegations, which varies according to the server's memory size.
4454  */
4455 static void
4456 set_max_delegations(void)
4457 {
4458 	/*
4459 	 * Allow at most 4 delegations per megabyte of RAM.  Quick
4460 	 * estimates suggest that in the worst case (where every delegation
4461 	 * is for a different inode), a delegation could take about 1.5K,
4462 	 * giving a worst case usage of about 6% of memory.
4463 	 */
4464 	max_delegations = nr_free_buffer_pages() >> (20 - 2 - PAGE_SHIFT);
4465 }
4466 
4467 /* initialization to perform when the nfsd service is started: */
4468 
4469 static int
4470 __nfs4_state_start(void)
4471 {
4472 	int ret;
4473 
4474 	boot_time = get_seconds();
4475 	locks_start_grace(&nfsd4_manager);
4476 	printk(KERN_INFO "NFSD: starting %ld-second grace period\n",
4477 	       nfsd4_grace);
4478 	ret = set_callback_cred();
4479 	if (ret)
4480 		return -ENOMEM;
4481 	laundry_wq = create_singlethread_workqueue("nfsd4");
4482 	if (laundry_wq == NULL)
4483 		return -ENOMEM;
4484 	ret = nfsd4_create_callback_queue();
4485 	if (ret)
4486 		goto out_free_laundry;
4487 	queue_delayed_work(laundry_wq, &laundromat_work, nfsd4_grace * HZ);
4488 	set_max_delegations();
4489 	return 0;
4490 out_free_laundry:
4491 	destroy_workqueue(laundry_wq);
4492 	return ret;
4493 }
4494 
4495 int
4496 nfs4_state_start(void)
4497 {
4498 	nfsd4_load_reboot_recovery_data();
4499 	return __nfs4_state_start();
4500 }
4501 
4502 static void
4503 __nfs4_state_shutdown(void)
4504 {
4505 	int i;
4506 	struct nfs4_client *clp = NULL;
4507 	struct nfs4_delegation *dp = NULL;
4508 	struct list_head *pos, *next, reaplist;
4509 
4510 	for (i = 0; i < CLIENT_HASH_SIZE; i++) {
4511 		while (!list_empty(&conf_id_hashtbl[i])) {
4512 			clp = list_entry(conf_id_hashtbl[i].next, struct nfs4_client, cl_idhash);
4513 			expire_client(clp);
4514 		}
4515 		while (!list_empty(&unconf_str_hashtbl[i])) {
4516 			clp = list_entry(unconf_str_hashtbl[i].next, struct nfs4_client, cl_strhash);
4517 			expire_client(clp);
4518 		}
4519 	}
4520 	INIT_LIST_HEAD(&reaplist);
4521 	spin_lock(&recall_lock);
4522 	list_for_each_safe(pos, next, &del_recall_lru) {
4523 		dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru);
4524 		list_move(&dp->dl_recall_lru, &reaplist);
4525 	}
4526 	spin_unlock(&recall_lock);
4527 	list_for_each_safe(pos, next, &reaplist) {
4528 		dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru);
4529 		list_del_init(&dp->dl_recall_lru);
4530 		unhash_delegation(dp);
4531 	}
4532 
4533 	nfsd4_shutdown_recdir();
4534 }
4535 
4536 void
4537 nfs4_state_shutdown(void)
4538 {
4539 	cancel_delayed_work_sync(&laundromat_work);
4540 	destroy_workqueue(laundry_wq);
4541 	locks_end_grace(&nfsd4_manager);
4542 	nfs4_lock_state();
4543 	nfs4_release_reclaim();
4544 	__nfs4_state_shutdown();
4545 	nfs4_unlock_state();
4546 	nfsd4_destroy_callback_queue();
4547 }
4548