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