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