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