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