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