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