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