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