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