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