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