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