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 = NULL; 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 break; 2454 } 2455 spin_unlock(&recall_lock); 2456 return dp; 2457 } 2458 2459 int share_access_to_flags(u32 share_access) 2460 { 2461 share_access &= ~NFS4_SHARE_WANT_MASK; 2462 2463 return share_access == NFS4_SHARE_ACCESS_READ ? RD_STATE : WR_STATE; 2464 } 2465 2466 static __be32 2467 nfs4_check_deleg(struct nfs4_file *fp, struct nfsd4_open *open, 2468 struct nfs4_delegation **dp) 2469 { 2470 int flags; 2471 __be32 status = nfserr_bad_stateid; 2472 2473 *dp = find_delegation_file(fp, &open->op_delegate_stateid); 2474 if (*dp == NULL) 2475 goto out; 2476 flags = share_access_to_flags(open->op_share_access); 2477 status = nfs4_check_delegmode(*dp, flags); 2478 if (status) 2479 *dp = NULL; 2480 out: 2481 if (open->op_claim_type != NFS4_OPEN_CLAIM_DELEGATE_CUR) 2482 return nfs_ok; 2483 if (status) 2484 return status; 2485 open->op_stateowner->so_confirmed = 1; 2486 return nfs_ok; 2487 } 2488 2489 static __be32 2490 nfs4_check_open(struct nfs4_file *fp, struct nfsd4_open *open, struct nfs4_stateid **stpp) 2491 { 2492 struct nfs4_stateid *local; 2493 __be32 status = nfserr_share_denied; 2494 struct nfs4_stateowner *sop = open->op_stateowner; 2495 2496 list_for_each_entry(local, &fp->fi_stateids, st_perfile) { 2497 /* ignore lock owners */ 2498 if (local->st_stateowner->so_is_open_owner == 0) 2499 continue; 2500 /* remember if we have seen this open owner */ 2501 if (local->st_stateowner == sop) 2502 *stpp = local; 2503 /* check for conflicting share reservations */ 2504 if (!test_share(local, open)) 2505 goto out; 2506 } 2507 status = 0; 2508 out: 2509 return status; 2510 } 2511 2512 static inline struct nfs4_stateid * 2513 nfs4_alloc_stateid(void) 2514 { 2515 return kmem_cache_alloc(stateid_slab, GFP_KERNEL); 2516 } 2517 2518 static inline int nfs4_access_to_access(u32 nfs4_access) 2519 { 2520 int flags = 0; 2521 2522 if (nfs4_access & NFS4_SHARE_ACCESS_READ) 2523 flags |= NFSD_MAY_READ; 2524 if (nfs4_access & NFS4_SHARE_ACCESS_WRITE) 2525 flags |= NFSD_MAY_WRITE; 2526 return flags; 2527 } 2528 2529 static __be32 nfs4_get_vfs_file(struct svc_rqst *rqstp, struct nfs4_file 2530 *fp, struct svc_fh *cur_fh, u32 nfs4_access) 2531 { 2532 __be32 status; 2533 int oflag = nfs4_access_to_omode(nfs4_access); 2534 int access = nfs4_access_to_access(nfs4_access); 2535 2536 if (!fp->fi_fds[oflag]) { 2537 status = nfsd_open(rqstp, cur_fh, S_IFREG, access, 2538 &fp->fi_fds[oflag]); 2539 if (status) 2540 return status; 2541 } 2542 nfs4_file_get_access(fp, oflag); 2543 2544 return nfs_ok; 2545 } 2546 2547 static __be32 2548 nfs4_new_open(struct svc_rqst *rqstp, struct nfs4_stateid **stpp, 2549 struct nfs4_file *fp, struct svc_fh *cur_fh, 2550 struct nfsd4_open *open) 2551 { 2552 struct nfs4_stateid *stp; 2553 __be32 status; 2554 2555 stp = nfs4_alloc_stateid(); 2556 if (stp == NULL) 2557 return nfserr_resource; 2558 2559 status = nfs4_get_vfs_file(rqstp, fp, cur_fh, open->op_share_access); 2560 if (status) { 2561 kmem_cache_free(stateid_slab, stp); 2562 return status; 2563 } 2564 *stpp = stp; 2565 return 0; 2566 } 2567 2568 static inline __be32 2569 nfsd4_truncate(struct svc_rqst *rqstp, struct svc_fh *fh, 2570 struct nfsd4_open *open) 2571 { 2572 struct iattr iattr = { 2573 .ia_valid = ATTR_SIZE, 2574 .ia_size = 0, 2575 }; 2576 if (!open->op_truncate) 2577 return 0; 2578 if (!(open->op_share_access & NFS4_SHARE_ACCESS_WRITE)) 2579 return nfserr_inval; 2580 return nfsd_setattr(rqstp, fh, &iattr, 0, (time_t)0); 2581 } 2582 2583 static __be32 2584 nfs4_upgrade_open(struct svc_rqst *rqstp, struct nfs4_file *fp, struct svc_fh *cur_fh, struct nfs4_stateid *stp, struct nfsd4_open *open) 2585 { 2586 u32 op_share_access = open->op_share_access & ~NFS4_SHARE_WANT_MASK; 2587 bool new_access; 2588 __be32 status; 2589 2590 new_access = !test_bit(op_share_access, &stp->st_access_bmap); 2591 if (new_access) { 2592 status = nfs4_get_vfs_file(rqstp, fp, cur_fh, op_share_access); 2593 if (status) 2594 return status; 2595 } 2596 status = nfsd4_truncate(rqstp, cur_fh, open); 2597 if (status) { 2598 if (new_access) { 2599 int oflag = nfs4_access_to_omode(new_access); 2600 nfs4_file_put_access(fp, oflag); 2601 } 2602 return status; 2603 } 2604 /* remember the open */ 2605 __set_bit(op_share_access, &stp->st_access_bmap); 2606 __set_bit(open->op_share_deny, &stp->st_deny_bmap); 2607 2608 return nfs_ok; 2609 } 2610 2611 2612 static void 2613 nfs4_set_claim_prev(struct nfsd4_open *open) 2614 { 2615 open->op_stateowner->so_confirmed = 1; 2616 open->op_stateowner->so_client->cl_firststate = 1; 2617 } 2618 2619 /* Should we give out recallable state?: */ 2620 static bool nfsd4_cb_channel_good(struct nfs4_client *clp) 2621 { 2622 if (clp->cl_cb_state == NFSD4_CB_UP) 2623 return true; 2624 /* 2625 * In the sessions case, since we don't have to establish a 2626 * separate connection for callbacks, we assume it's OK 2627 * until we hear otherwise: 2628 */ 2629 return clp->cl_minorversion && clp->cl_cb_state == NFSD4_CB_UNKNOWN; 2630 } 2631 2632 static struct file_lock *nfs4_alloc_init_lease(struct nfs4_delegation *dp, int flag) 2633 { 2634 struct file_lock *fl; 2635 2636 fl = locks_alloc_lock(); 2637 if (!fl) 2638 return NULL; 2639 locks_init_lock(fl); 2640 fl->fl_lmops = &nfsd_lease_mng_ops; 2641 fl->fl_flags = FL_LEASE; 2642 fl->fl_type = flag == NFS4_OPEN_DELEGATE_READ? F_RDLCK: F_WRLCK; 2643 fl->fl_end = OFFSET_MAX; 2644 fl->fl_owner = (fl_owner_t)(dp->dl_file); 2645 fl->fl_pid = current->tgid; 2646 return fl; 2647 } 2648 2649 static int nfs4_setlease(struct nfs4_delegation *dp, int flag) 2650 { 2651 struct nfs4_file *fp = dp->dl_file; 2652 struct file_lock *fl; 2653 int status; 2654 2655 fl = nfs4_alloc_init_lease(dp, flag); 2656 if (!fl) 2657 return -ENOMEM; 2658 fl->fl_file = find_readable_file(fp); 2659 list_add(&dp->dl_perclnt, &dp->dl_client->cl_delegations); 2660 status = vfs_setlease(fl->fl_file, fl->fl_type, &fl); 2661 if (status) { 2662 list_del_init(&dp->dl_perclnt); 2663 locks_free_lock(fl); 2664 return -ENOMEM; 2665 } 2666 fp->fi_lease = fl; 2667 fp->fi_deleg_file = fl->fl_file; 2668 get_file(fp->fi_deleg_file); 2669 atomic_set(&fp->fi_delegees, 1); 2670 list_add(&dp->dl_perfile, &fp->fi_delegations); 2671 return 0; 2672 } 2673 2674 static int nfs4_set_delegation(struct nfs4_delegation *dp, int flag) 2675 { 2676 struct nfs4_file *fp = dp->dl_file; 2677 2678 if (!fp->fi_lease) 2679 return nfs4_setlease(dp, flag); 2680 spin_lock(&recall_lock); 2681 if (fp->fi_had_conflict) { 2682 spin_unlock(&recall_lock); 2683 return -EAGAIN; 2684 } 2685 atomic_inc(&fp->fi_delegees); 2686 list_add(&dp->dl_perfile, &fp->fi_delegations); 2687 spin_unlock(&recall_lock); 2688 list_add(&dp->dl_perclnt, &dp->dl_client->cl_delegations); 2689 return 0; 2690 } 2691 2692 /* 2693 * Attempt to hand out a delegation. 2694 */ 2695 static void 2696 nfs4_open_delegation(struct svc_fh *fh, struct nfsd4_open *open, struct nfs4_stateid *stp) 2697 { 2698 struct nfs4_delegation *dp; 2699 struct nfs4_stateowner *sop = stp->st_stateowner; 2700 int cb_up; 2701 int status, flag = 0; 2702 2703 cb_up = nfsd4_cb_channel_good(sop->so_client); 2704 flag = NFS4_OPEN_DELEGATE_NONE; 2705 open->op_recall = 0; 2706 switch (open->op_claim_type) { 2707 case NFS4_OPEN_CLAIM_PREVIOUS: 2708 if (!cb_up) 2709 open->op_recall = 1; 2710 flag = open->op_delegate_type; 2711 if (flag == NFS4_OPEN_DELEGATE_NONE) 2712 goto out; 2713 break; 2714 case NFS4_OPEN_CLAIM_NULL: 2715 /* Let's not give out any delegations till everyone's 2716 * had the chance to reclaim theirs.... */ 2717 if (locks_in_grace()) 2718 goto out; 2719 if (!cb_up || !sop->so_confirmed) 2720 goto out; 2721 if (open->op_share_access & NFS4_SHARE_ACCESS_WRITE) 2722 flag = NFS4_OPEN_DELEGATE_WRITE; 2723 else 2724 flag = NFS4_OPEN_DELEGATE_READ; 2725 break; 2726 default: 2727 goto out; 2728 } 2729 2730 dp = alloc_init_deleg(sop->so_client, stp, fh, flag); 2731 if (dp == NULL) 2732 goto out_no_deleg; 2733 status = nfs4_set_delegation(dp, flag); 2734 if (status) 2735 goto out_free; 2736 2737 memcpy(&open->op_delegate_stateid, &dp->dl_stateid, sizeof(dp->dl_stateid)); 2738 2739 dprintk("NFSD: delegation stateid=" STATEID_FMT "\n", 2740 STATEID_VAL(&dp->dl_stateid)); 2741 out: 2742 if (open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS 2743 && flag == NFS4_OPEN_DELEGATE_NONE 2744 && open->op_delegate_type != NFS4_OPEN_DELEGATE_NONE) 2745 dprintk("NFSD: WARNING: refusing delegation reclaim\n"); 2746 open->op_delegate_type = flag; 2747 return; 2748 out_free: 2749 nfs4_put_delegation(dp); 2750 out_no_deleg: 2751 flag = NFS4_OPEN_DELEGATE_NONE; 2752 goto out; 2753 } 2754 2755 /* 2756 * called with nfs4_lock_state() held. 2757 */ 2758 __be32 2759 nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open *open) 2760 { 2761 struct nfsd4_compoundres *resp = rqstp->rq_resp; 2762 struct nfs4_file *fp = NULL; 2763 struct inode *ino = current_fh->fh_dentry->d_inode; 2764 struct nfs4_stateid *stp = NULL; 2765 struct nfs4_delegation *dp = NULL; 2766 __be32 status; 2767 2768 status = nfserr_inval; 2769 if (!access_valid(open->op_share_access, resp->cstate.minorversion) 2770 || !deny_valid(open->op_share_deny)) 2771 goto out; 2772 /* 2773 * Lookup file; if found, lookup stateid and check open request, 2774 * and check for delegations in the process of being recalled. 2775 * If not found, create the nfs4_file struct 2776 */ 2777 fp = find_file(ino); 2778 if (fp) { 2779 if ((status = nfs4_check_open(fp, open, &stp))) 2780 goto out; 2781 status = nfs4_check_deleg(fp, open, &dp); 2782 if (status) 2783 goto out; 2784 } else { 2785 status = nfserr_bad_stateid; 2786 if (open->op_claim_type == NFS4_OPEN_CLAIM_DELEGATE_CUR) 2787 goto out; 2788 status = nfserr_resource; 2789 fp = alloc_init_file(ino); 2790 if (fp == NULL) 2791 goto out; 2792 } 2793 2794 /* 2795 * OPEN the file, or upgrade an existing OPEN. 2796 * If truncate fails, the OPEN fails. 2797 */ 2798 if (stp) { 2799 /* Stateid was found, this is an OPEN upgrade */ 2800 status = nfs4_upgrade_open(rqstp, fp, current_fh, stp, open); 2801 if (status) 2802 goto out; 2803 update_stateid(&stp->st_stateid); 2804 } else { 2805 status = nfs4_new_open(rqstp, &stp, fp, current_fh, open); 2806 if (status) 2807 goto out; 2808 init_stateid(stp, fp, open); 2809 status = nfsd4_truncate(rqstp, current_fh, open); 2810 if (status) { 2811 release_open_stateid(stp); 2812 goto out; 2813 } 2814 if (nfsd4_has_session(&resp->cstate)) 2815 update_stateid(&stp->st_stateid); 2816 } 2817 memcpy(&open->op_stateid, &stp->st_stateid, sizeof(stateid_t)); 2818 2819 if (nfsd4_has_session(&resp->cstate)) 2820 open->op_stateowner->so_confirmed = 1; 2821 2822 /* 2823 * Attempt to hand out a delegation. No error return, because the 2824 * OPEN succeeds even if we fail. 2825 */ 2826 nfs4_open_delegation(current_fh, open, stp); 2827 2828 status = nfs_ok; 2829 2830 dprintk("%s: stateid=" STATEID_FMT "\n", __func__, 2831 STATEID_VAL(&stp->st_stateid)); 2832 out: 2833 if (fp) 2834 put_nfs4_file(fp); 2835 if (status == 0 && open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS) 2836 nfs4_set_claim_prev(open); 2837 /* 2838 * To finish the open response, we just need to set the rflags. 2839 */ 2840 open->op_rflags = NFS4_OPEN_RESULT_LOCKTYPE_POSIX; 2841 if (!open->op_stateowner->so_confirmed && 2842 !nfsd4_has_session(&resp->cstate)) 2843 open->op_rflags |= NFS4_OPEN_RESULT_CONFIRM; 2844 2845 return status; 2846 } 2847 2848 __be32 2849 nfsd4_renew(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, 2850 clientid_t *clid) 2851 { 2852 struct nfs4_client *clp; 2853 __be32 status; 2854 2855 nfs4_lock_state(); 2856 dprintk("process_renew(%08x/%08x): starting\n", 2857 clid->cl_boot, clid->cl_id); 2858 status = nfserr_stale_clientid; 2859 if (STALE_CLIENTID(clid)) 2860 goto out; 2861 clp = find_confirmed_client(clid); 2862 status = nfserr_expired; 2863 if (clp == NULL) { 2864 /* We assume the client took too long to RENEW. */ 2865 dprintk("nfsd4_renew: clientid not found!\n"); 2866 goto out; 2867 } 2868 renew_client(clp); 2869 status = nfserr_cb_path_down; 2870 if (!list_empty(&clp->cl_delegations) 2871 && clp->cl_cb_state != NFSD4_CB_UP) 2872 goto out; 2873 status = nfs_ok; 2874 out: 2875 nfs4_unlock_state(); 2876 return status; 2877 } 2878 2879 struct lock_manager nfsd4_manager = { 2880 }; 2881 2882 static void 2883 nfsd4_end_grace(void) 2884 { 2885 dprintk("NFSD: end of grace period\n"); 2886 nfsd4_recdir_purge_old(); 2887 locks_end_grace(&nfsd4_manager); 2888 /* 2889 * Now that every NFSv4 client has had the chance to recover and 2890 * to see the (possibly new, possibly shorter) lease time, we 2891 * can safely set the next grace time to the current lease time: 2892 */ 2893 nfsd4_grace = nfsd4_lease; 2894 } 2895 2896 static time_t 2897 nfs4_laundromat(void) 2898 { 2899 struct nfs4_client *clp; 2900 struct nfs4_stateowner *sop; 2901 struct nfs4_delegation *dp; 2902 struct list_head *pos, *next, reaplist; 2903 time_t cutoff = get_seconds() - nfsd4_lease; 2904 time_t t, clientid_val = nfsd4_lease; 2905 time_t u, test_val = nfsd4_lease; 2906 2907 nfs4_lock_state(); 2908 2909 dprintk("NFSD: laundromat service - starting\n"); 2910 if (locks_in_grace()) 2911 nfsd4_end_grace(); 2912 INIT_LIST_HEAD(&reaplist); 2913 spin_lock(&client_lock); 2914 list_for_each_safe(pos, next, &client_lru) { 2915 clp = list_entry(pos, struct nfs4_client, cl_lru); 2916 if (time_after((unsigned long)clp->cl_time, (unsigned long)cutoff)) { 2917 t = clp->cl_time - cutoff; 2918 if (clientid_val > t) 2919 clientid_val = t; 2920 break; 2921 } 2922 if (atomic_read(&clp->cl_refcount)) { 2923 dprintk("NFSD: client in use (clientid %08x)\n", 2924 clp->cl_clientid.cl_id); 2925 continue; 2926 } 2927 unhash_client_locked(clp); 2928 list_add(&clp->cl_lru, &reaplist); 2929 } 2930 spin_unlock(&client_lock); 2931 list_for_each_safe(pos, next, &reaplist) { 2932 clp = list_entry(pos, struct nfs4_client, cl_lru); 2933 dprintk("NFSD: purging unused client (clientid %08x)\n", 2934 clp->cl_clientid.cl_id); 2935 nfsd4_remove_clid_dir(clp); 2936 expire_client(clp); 2937 } 2938 spin_lock(&recall_lock); 2939 list_for_each_safe(pos, next, &del_recall_lru) { 2940 dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru); 2941 if (time_after((unsigned long)dp->dl_time, (unsigned long)cutoff)) { 2942 u = dp->dl_time - cutoff; 2943 if (test_val > u) 2944 test_val = u; 2945 break; 2946 } 2947 list_move(&dp->dl_recall_lru, &reaplist); 2948 } 2949 spin_unlock(&recall_lock); 2950 list_for_each_safe(pos, next, &reaplist) { 2951 dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru); 2952 list_del_init(&dp->dl_recall_lru); 2953 unhash_delegation(dp); 2954 } 2955 test_val = nfsd4_lease; 2956 list_for_each_safe(pos, next, &close_lru) { 2957 sop = list_entry(pos, struct nfs4_stateowner, so_close_lru); 2958 if (time_after((unsigned long)sop->so_time, (unsigned long)cutoff)) { 2959 u = sop->so_time - cutoff; 2960 if (test_val > u) 2961 test_val = u; 2962 break; 2963 } 2964 dprintk("NFSD: purging unused open stateowner (so_id %d)\n", 2965 sop->so_id); 2966 release_openowner(sop); 2967 } 2968 if (clientid_val < NFSD_LAUNDROMAT_MINTIMEOUT) 2969 clientid_val = NFSD_LAUNDROMAT_MINTIMEOUT; 2970 nfs4_unlock_state(); 2971 return clientid_val; 2972 } 2973 2974 static struct workqueue_struct *laundry_wq; 2975 static void laundromat_main(struct work_struct *); 2976 static DECLARE_DELAYED_WORK(laundromat_work, laundromat_main); 2977 2978 static void 2979 laundromat_main(struct work_struct *not_used) 2980 { 2981 time_t t; 2982 2983 t = nfs4_laundromat(); 2984 dprintk("NFSD: laundromat_main - sleeping for %ld seconds\n", t); 2985 queue_delayed_work(laundry_wq, &laundromat_work, t*HZ); 2986 } 2987 2988 static struct nfs4_stateowner * 2989 search_close_lru(u32 st_id, int flags) 2990 { 2991 struct nfs4_stateowner *local = NULL; 2992 2993 if (flags & CLOSE_STATE) { 2994 list_for_each_entry(local, &close_lru, so_close_lru) { 2995 if (local->so_id == st_id) 2996 return local; 2997 } 2998 } 2999 return NULL; 3000 } 3001 3002 static inline int 3003 nfs4_check_fh(struct svc_fh *fhp, struct nfs4_stateid *stp) 3004 { 3005 return fhp->fh_dentry->d_inode != stp->st_file->fi_inode; 3006 } 3007 3008 static int 3009 STALE_STATEID(stateid_t *stateid) 3010 { 3011 if (stateid->si_boot == boot_time) 3012 return 0; 3013 dprintk("NFSD: stale stateid " STATEID_FMT "!\n", 3014 STATEID_VAL(stateid)); 3015 return 1; 3016 } 3017 3018 static inline int 3019 access_permit_read(unsigned long access_bmap) 3020 { 3021 return test_bit(NFS4_SHARE_ACCESS_READ, &access_bmap) || 3022 test_bit(NFS4_SHARE_ACCESS_BOTH, &access_bmap) || 3023 test_bit(NFS4_SHARE_ACCESS_WRITE, &access_bmap); 3024 } 3025 3026 static inline int 3027 access_permit_write(unsigned long access_bmap) 3028 { 3029 return test_bit(NFS4_SHARE_ACCESS_WRITE, &access_bmap) || 3030 test_bit(NFS4_SHARE_ACCESS_BOTH, &access_bmap); 3031 } 3032 3033 static 3034 __be32 nfs4_check_openmode(struct nfs4_stateid *stp, int flags) 3035 { 3036 __be32 status = nfserr_openmode; 3037 3038 /* For lock stateid's, we test the parent open, not the lock: */ 3039 if (stp->st_openstp) 3040 stp = stp->st_openstp; 3041 if ((flags & WR_STATE) && (!access_permit_write(stp->st_access_bmap))) 3042 goto out; 3043 if ((flags & RD_STATE) && (!access_permit_read(stp->st_access_bmap))) 3044 goto out; 3045 status = nfs_ok; 3046 out: 3047 return status; 3048 } 3049 3050 static inline __be32 3051 check_special_stateids(svc_fh *current_fh, stateid_t *stateid, int flags) 3052 { 3053 if (ONE_STATEID(stateid) && (flags & RD_STATE)) 3054 return nfs_ok; 3055 else if (locks_in_grace()) { 3056 /* Answer in remaining cases depends on existance of 3057 * conflicting state; so we must wait out the grace period. */ 3058 return nfserr_grace; 3059 } else if (flags & WR_STATE) 3060 return nfs4_share_conflict(current_fh, 3061 NFS4_SHARE_DENY_WRITE); 3062 else /* (flags & RD_STATE) && ZERO_STATEID(stateid) */ 3063 return nfs4_share_conflict(current_fh, 3064 NFS4_SHARE_DENY_READ); 3065 } 3066 3067 /* 3068 * Allow READ/WRITE during grace period on recovered state only for files 3069 * that are not able to provide mandatory locking. 3070 */ 3071 static inline int 3072 grace_disallows_io(struct inode *inode) 3073 { 3074 return locks_in_grace() && mandatory_lock(inode); 3075 } 3076 3077 static int check_stateid_generation(stateid_t *in, stateid_t *ref, int flags) 3078 { 3079 /* 3080 * When sessions are used the stateid generation number is ignored 3081 * when it is zero. 3082 */ 3083 if ((flags & HAS_SESSION) && in->si_generation == 0) 3084 goto out; 3085 3086 /* If the client sends us a stateid from the future, it's buggy: */ 3087 if (in->si_generation > ref->si_generation) 3088 return nfserr_bad_stateid; 3089 /* 3090 * The following, however, can happen. For example, if the 3091 * client sends an open and some IO at the same time, the open 3092 * may bump si_generation while the IO is still in flight. 3093 * Thanks to hard links and renames, the client never knows what 3094 * file an open will affect. So it could avoid that situation 3095 * only by serializing all opens and IO from the same open 3096 * owner. To recover from the old_stateid error, the client 3097 * will just have to retry the IO: 3098 */ 3099 if (in->si_generation < ref->si_generation) 3100 return nfserr_old_stateid; 3101 out: 3102 return nfs_ok; 3103 } 3104 3105 static int is_delegation_stateid(stateid_t *stateid) 3106 { 3107 return stateid->si_fileid == 0; 3108 } 3109 3110 /* 3111 * Checks for stateid operations 3112 */ 3113 __be32 3114 nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate, 3115 stateid_t *stateid, int flags, struct file **filpp) 3116 { 3117 struct nfs4_stateid *stp = NULL; 3118 struct nfs4_delegation *dp = NULL; 3119 struct svc_fh *current_fh = &cstate->current_fh; 3120 struct inode *ino = current_fh->fh_dentry->d_inode; 3121 __be32 status; 3122 3123 if (filpp) 3124 *filpp = NULL; 3125 3126 if (grace_disallows_io(ino)) 3127 return nfserr_grace; 3128 3129 if (nfsd4_has_session(cstate)) 3130 flags |= HAS_SESSION; 3131 3132 if (ZERO_STATEID(stateid) || ONE_STATEID(stateid)) 3133 return check_special_stateids(current_fh, stateid, flags); 3134 3135 status = nfserr_stale_stateid; 3136 if (STALE_STATEID(stateid)) 3137 goto out; 3138 3139 /* 3140 * We assume that any stateid that has the current boot time, 3141 * but that we can't find, is expired: 3142 */ 3143 status = nfserr_expired; 3144 if (is_delegation_stateid(stateid)) { 3145 dp = find_delegation_stateid(ino, stateid); 3146 if (!dp) 3147 goto out; 3148 status = check_stateid_generation(stateid, &dp->dl_stateid, 3149 flags); 3150 if (status) 3151 goto out; 3152 status = nfs4_check_delegmode(dp, flags); 3153 if (status) 3154 goto out; 3155 renew_client(dp->dl_client); 3156 if (filpp) { 3157 *filpp = dp->dl_file->fi_deleg_file; 3158 BUG_ON(!*filpp); 3159 } 3160 } else { /* open or lock stateid */ 3161 stp = find_stateid(stateid, flags); 3162 if (!stp) 3163 goto out; 3164 status = nfserr_bad_stateid; 3165 if (nfs4_check_fh(current_fh, stp)) 3166 goto out; 3167 if (!stp->st_stateowner->so_confirmed) 3168 goto out; 3169 status = check_stateid_generation(stateid, &stp->st_stateid, 3170 flags); 3171 if (status) 3172 goto out; 3173 status = nfs4_check_openmode(stp, flags); 3174 if (status) 3175 goto out; 3176 renew_client(stp->st_stateowner->so_client); 3177 if (filpp) { 3178 if (flags & RD_STATE) 3179 *filpp = find_readable_file(stp->st_file); 3180 else 3181 *filpp = find_writeable_file(stp->st_file); 3182 } 3183 } 3184 status = nfs_ok; 3185 out: 3186 return status; 3187 } 3188 3189 static inline int 3190 setlkflg (int type) 3191 { 3192 return (type == NFS4_READW_LT || type == NFS4_READ_LT) ? 3193 RD_STATE : WR_STATE; 3194 } 3195 3196 /* 3197 * Checks for sequence id mutating operations. 3198 */ 3199 static __be32 3200 nfs4_preprocess_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid, 3201 stateid_t *stateid, int flags, 3202 struct nfs4_stateowner **sopp, 3203 struct nfs4_stateid **stpp, struct nfsd4_lock *lock) 3204 { 3205 struct nfs4_stateid *stp; 3206 struct nfs4_stateowner *sop; 3207 struct svc_fh *current_fh = &cstate->current_fh; 3208 __be32 status; 3209 3210 dprintk("NFSD: %s: seqid=%d stateid = " STATEID_FMT "\n", __func__, 3211 seqid, STATEID_VAL(stateid)); 3212 3213 *stpp = NULL; 3214 *sopp = NULL; 3215 3216 if (ZERO_STATEID(stateid) || ONE_STATEID(stateid)) { 3217 dprintk("NFSD: preprocess_seqid_op: magic stateid!\n"); 3218 return nfserr_bad_stateid; 3219 } 3220 3221 if (STALE_STATEID(stateid)) 3222 return nfserr_stale_stateid; 3223 3224 if (nfsd4_has_session(cstate)) 3225 flags |= HAS_SESSION; 3226 3227 /* 3228 * We return BAD_STATEID if filehandle doesn't match stateid, 3229 * the confirmed flag is incorrecly set, or the generation 3230 * number is incorrect. 3231 */ 3232 stp = find_stateid(stateid, flags); 3233 if (stp == NULL) { 3234 /* 3235 * Also, we should make sure this isn't just the result of 3236 * a replayed close: 3237 */ 3238 sop = search_close_lru(stateid->si_stateownerid, flags); 3239 /* It's not stale; let's assume it's expired: */ 3240 if (sop == NULL) 3241 return nfserr_expired; 3242 *sopp = sop; 3243 goto check_replay; 3244 } 3245 3246 *stpp = stp; 3247 *sopp = sop = stp->st_stateowner; 3248 3249 if (lock) { 3250 clientid_t *lockclid = &lock->v.new.clientid; 3251 struct nfs4_client *clp = sop->so_client; 3252 int lkflg = 0; 3253 __be32 status; 3254 3255 lkflg = setlkflg(lock->lk_type); 3256 3257 if (lock->lk_is_new) { 3258 if (!sop->so_is_open_owner) 3259 return nfserr_bad_stateid; 3260 if (!(flags & HAS_SESSION) && 3261 !same_clid(&clp->cl_clientid, lockclid)) 3262 return nfserr_bad_stateid; 3263 /* stp is the open stateid */ 3264 status = nfs4_check_openmode(stp, lkflg); 3265 if (status) 3266 return status; 3267 } else { 3268 /* stp is the lock stateid */ 3269 status = nfs4_check_openmode(stp->st_openstp, lkflg); 3270 if (status) 3271 return status; 3272 } 3273 } 3274 3275 if (nfs4_check_fh(current_fh, stp)) { 3276 dprintk("NFSD: preprocess_seqid_op: fh-stateid mismatch!\n"); 3277 return nfserr_bad_stateid; 3278 } 3279 3280 /* 3281 * We now validate the seqid and stateid generation numbers. 3282 * For the moment, we ignore the possibility of 3283 * generation number wraparound. 3284 */ 3285 if (!(flags & HAS_SESSION) && seqid != sop->so_seqid) 3286 goto check_replay; 3287 3288 if (sop->so_confirmed && flags & CONFIRM) { 3289 dprintk("NFSD: preprocess_seqid_op: expected" 3290 " unconfirmed stateowner!\n"); 3291 return nfserr_bad_stateid; 3292 } 3293 if (!sop->so_confirmed && !(flags & CONFIRM)) { 3294 dprintk("NFSD: preprocess_seqid_op: stateowner not" 3295 " confirmed yet!\n"); 3296 return nfserr_bad_stateid; 3297 } 3298 status = check_stateid_generation(stateid, &stp->st_stateid, flags); 3299 if (status) 3300 return status; 3301 renew_client(sop->so_client); 3302 return nfs_ok; 3303 3304 check_replay: 3305 if (seqid == sop->so_seqid - 1) { 3306 dprintk("NFSD: preprocess_seqid_op: retransmission?\n"); 3307 /* indicate replay to calling function */ 3308 return nfserr_replay_me; 3309 } 3310 dprintk("NFSD: preprocess_seqid_op: bad seqid (expected %d, got %d)\n", 3311 sop->so_seqid, seqid); 3312 *sopp = NULL; 3313 return nfserr_bad_seqid; 3314 } 3315 3316 __be32 3317 nfsd4_open_confirm(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, 3318 struct nfsd4_open_confirm *oc) 3319 { 3320 __be32 status; 3321 struct nfs4_stateowner *sop; 3322 struct nfs4_stateid *stp; 3323 3324 dprintk("NFSD: nfsd4_open_confirm on file %.*s\n", 3325 (int)cstate->current_fh.fh_dentry->d_name.len, 3326 cstate->current_fh.fh_dentry->d_name.name); 3327 3328 status = fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0); 3329 if (status) 3330 return status; 3331 3332 nfs4_lock_state(); 3333 3334 if ((status = nfs4_preprocess_seqid_op(cstate, 3335 oc->oc_seqid, &oc->oc_req_stateid, 3336 CONFIRM | OPEN_STATE, 3337 &oc->oc_stateowner, &stp, NULL))) 3338 goto out; 3339 3340 sop = oc->oc_stateowner; 3341 sop->so_confirmed = 1; 3342 update_stateid(&stp->st_stateid); 3343 memcpy(&oc->oc_resp_stateid, &stp->st_stateid, sizeof(stateid_t)); 3344 dprintk("NFSD: %s: success, seqid=%d stateid=" STATEID_FMT "\n", 3345 __func__, oc->oc_seqid, STATEID_VAL(&stp->st_stateid)); 3346 3347 nfsd4_create_clid_dir(sop->so_client); 3348 out: 3349 if (oc->oc_stateowner) { 3350 nfs4_get_stateowner(oc->oc_stateowner); 3351 cstate->replay_owner = oc->oc_stateowner; 3352 } 3353 nfs4_unlock_state(); 3354 return status; 3355 } 3356 3357 3358 /* 3359 * unset all bits in union bitmap (bmap) that 3360 * do not exist in share (from successful OPEN_DOWNGRADE) 3361 */ 3362 static void 3363 reset_union_bmap_access(unsigned long access, unsigned long *bmap) 3364 { 3365 int i; 3366 for (i = 1; i < 4; i++) { 3367 if ((i & access) != i) 3368 __clear_bit(i, bmap); 3369 } 3370 } 3371 3372 static void 3373 reset_union_bmap_deny(unsigned long deny, unsigned long *bmap) 3374 { 3375 int i; 3376 for (i = 0; i < 4; i++) { 3377 if ((i & deny) != i) 3378 __clear_bit(i, bmap); 3379 } 3380 } 3381 3382 __be32 3383 nfsd4_open_downgrade(struct svc_rqst *rqstp, 3384 struct nfsd4_compound_state *cstate, 3385 struct nfsd4_open_downgrade *od) 3386 { 3387 __be32 status; 3388 struct nfs4_stateid *stp; 3389 unsigned int share_access; 3390 3391 dprintk("NFSD: nfsd4_open_downgrade on file %.*s\n", 3392 (int)cstate->current_fh.fh_dentry->d_name.len, 3393 cstate->current_fh.fh_dentry->d_name.name); 3394 3395 if (!access_valid(od->od_share_access, cstate->minorversion) 3396 || !deny_valid(od->od_share_deny)) 3397 return nfserr_inval; 3398 3399 nfs4_lock_state(); 3400 if ((status = nfs4_preprocess_seqid_op(cstate, 3401 od->od_seqid, 3402 &od->od_stateid, 3403 OPEN_STATE, 3404 &od->od_stateowner, &stp, NULL))) 3405 goto out; 3406 3407 status = nfserr_inval; 3408 if (!test_bit(od->od_share_access, &stp->st_access_bmap)) { 3409 dprintk("NFSD:access not a subset current bitmap: 0x%lx, input access=%08x\n", 3410 stp->st_access_bmap, od->od_share_access); 3411 goto out; 3412 } 3413 if (!test_bit(od->od_share_deny, &stp->st_deny_bmap)) { 3414 dprintk("NFSD:deny not a subset current bitmap: 0x%lx, input deny=%08x\n", 3415 stp->st_deny_bmap, od->od_share_deny); 3416 goto out; 3417 } 3418 set_access(&share_access, stp->st_access_bmap); 3419 nfs4_file_downgrade(stp->st_file, share_access & ~od->od_share_access); 3420 3421 reset_union_bmap_access(od->od_share_access, &stp->st_access_bmap); 3422 reset_union_bmap_deny(od->od_share_deny, &stp->st_deny_bmap); 3423 3424 update_stateid(&stp->st_stateid); 3425 memcpy(&od->od_stateid, &stp->st_stateid, sizeof(stateid_t)); 3426 status = nfs_ok; 3427 out: 3428 if (od->od_stateowner) { 3429 nfs4_get_stateowner(od->od_stateowner); 3430 cstate->replay_owner = od->od_stateowner; 3431 } 3432 nfs4_unlock_state(); 3433 return status; 3434 } 3435 3436 /* 3437 * nfs4_unlock_state() called after encode 3438 */ 3439 __be32 3440 nfsd4_close(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, 3441 struct nfsd4_close *close) 3442 { 3443 __be32 status; 3444 struct nfs4_stateid *stp; 3445 3446 dprintk("NFSD: nfsd4_close on file %.*s\n", 3447 (int)cstate->current_fh.fh_dentry->d_name.len, 3448 cstate->current_fh.fh_dentry->d_name.name); 3449 3450 nfs4_lock_state(); 3451 /* check close_lru for replay */ 3452 if ((status = nfs4_preprocess_seqid_op(cstate, 3453 close->cl_seqid, 3454 &close->cl_stateid, 3455 OPEN_STATE | CLOSE_STATE, 3456 &close->cl_stateowner, &stp, NULL))) 3457 goto out; 3458 status = nfs_ok; 3459 update_stateid(&stp->st_stateid); 3460 memcpy(&close->cl_stateid, &stp->st_stateid, sizeof(stateid_t)); 3461 3462 /* release_stateid() calls nfsd_close() if needed */ 3463 release_open_stateid(stp); 3464 3465 /* place unused nfs4_stateowners on so_close_lru list to be 3466 * released by the laundromat service after the lease period 3467 * to enable us to handle CLOSE replay 3468 */ 3469 if (list_empty(&close->cl_stateowner->so_stateids)) 3470 move_to_close_lru(close->cl_stateowner); 3471 out: 3472 if (close->cl_stateowner) { 3473 nfs4_get_stateowner(close->cl_stateowner); 3474 cstate->replay_owner = close->cl_stateowner; 3475 } 3476 nfs4_unlock_state(); 3477 return status; 3478 } 3479 3480 __be32 3481 nfsd4_delegreturn(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, 3482 struct nfsd4_delegreturn *dr) 3483 { 3484 struct nfs4_delegation *dp; 3485 stateid_t *stateid = &dr->dr_stateid; 3486 struct inode *inode; 3487 __be32 status; 3488 int flags = 0; 3489 3490 if ((status = fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0))) 3491 return status; 3492 inode = cstate->current_fh.fh_dentry->d_inode; 3493 3494 if (nfsd4_has_session(cstate)) 3495 flags |= HAS_SESSION; 3496 nfs4_lock_state(); 3497 status = nfserr_bad_stateid; 3498 if (ZERO_STATEID(stateid) || ONE_STATEID(stateid)) 3499 goto out; 3500 status = nfserr_stale_stateid; 3501 if (STALE_STATEID(stateid)) 3502 goto out; 3503 status = nfserr_bad_stateid; 3504 if (!is_delegation_stateid(stateid)) 3505 goto out; 3506 status = nfserr_expired; 3507 dp = find_delegation_stateid(inode, stateid); 3508 if (!dp) 3509 goto out; 3510 status = check_stateid_generation(stateid, &dp->dl_stateid, flags); 3511 if (status) 3512 goto out; 3513 renew_client(dp->dl_client); 3514 3515 unhash_delegation(dp); 3516 out: 3517 nfs4_unlock_state(); 3518 3519 return status; 3520 } 3521 3522 3523 /* 3524 * Lock owner state (byte-range locks) 3525 */ 3526 #define LOFF_OVERFLOW(start, len) ((u64)(len) > ~(u64)(start)) 3527 #define LOCK_HASH_BITS 8 3528 #define LOCK_HASH_SIZE (1 << LOCK_HASH_BITS) 3529 #define LOCK_HASH_MASK (LOCK_HASH_SIZE - 1) 3530 3531 static inline u64 3532 end_offset(u64 start, u64 len) 3533 { 3534 u64 end; 3535 3536 end = start + len; 3537 return end >= start ? end: NFS4_MAX_UINT64; 3538 } 3539 3540 /* last octet in a range */ 3541 static inline u64 3542 last_byte_offset(u64 start, u64 len) 3543 { 3544 u64 end; 3545 3546 BUG_ON(!len); 3547 end = start + len; 3548 return end > start ? end - 1: NFS4_MAX_UINT64; 3549 } 3550 3551 #define lockownerid_hashval(id) \ 3552 ((id) & LOCK_HASH_MASK) 3553 3554 static inline unsigned int 3555 lock_ownerstr_hashval(struct inode *inode, u32 cl_id, 3556 struct xdr_netobj *ownername) 3557 { 3558 return (file_hashval(inode) + cl_id 3559 + opaque_hashval(ownername->data, ownername->len)) 3560 & LOCK_HASH_MASK; 3561 } 3562 3563 static struct list_head lock_ownerid_hashtbl[LOCK_HASH_SIZE]; 3564 static struct list_head lock_ownerstr_hashtbl[LOCK_HASH_SIZE]; 3565 static struct list_head lockstateid_hashtbl[STATEID_HASH_SIZE]; 3566 3567 static struct nfs4_stateid * 3568 find_stateid(stateid_t *stid, int flags) 3569 { 3570 struct nfs4_stateid *local; 3571 u32 st_id = stid->si_stateownerid; 3572 u32 f_id = stid->si_fileid; 3573 unsigned int hashval; 3574 3575 dprintk("NFSD: find_stateid flags 0x%x\n",flags); 3576 if (flags & (LOCK_STATE | RD_STATE | WR_STATE)) { 3577 hashval = stateid_hashval(st_id, f_id); 3578 list_for_each_entry(local, &lockstateid_hashtbl[hashval], st_hash) { 3579 if ((local->st_stateid.si_stateownerid == st_id) && 3580 (local->st_stateid.si_fileid == f_id)) 3581 return local; 3582 } 3583 } 3584 3585 if (flags & (OPEN_STATE | RD_STATE | WR_STATE)) { 3586 hashval = stateid_hashval(st_id, f_id); 3587 list_for_each_entry(local, &stateid_hashtbl[hashval], st_hash) { 3588 if ((local->st_stateid.si_stateownerid == st_id) && 3589 (local->st_stateid.si_fileid == f_id)) 3590 return local; 3591 } 3592 } 3593 return NULL; 3594 } 3595 3596 static struct nfs4_delegation * 3597 find_delegation_stateid(struct inode *ino, stateid_t *stid) 3598 { 3599 struct nfs4_file *fp; 3600 struct nfs4_delegation *dl; 3601 3602 dprintk("NFSD: %s: stateid=" STATEID_FMT "\n", __func__, 3603 STATEID_VAL(stid)); 3604 3605 fp = find_file(ino); 3606 if (!fp) 3607 return NULL; 3608 dl = find_delegation_file(fp, stid); 3609 put_nfs4_file(fp); 3610 return dl; 3611 } 3612 3613 /* 3614 * TODO: Linux file offsets are _signed_ 64-bit quantities, which means that 3615 * we can't properly handle lock requests that go beyond the (2^63 - 1)-th 3616 * byte, because of sign extension problems. Since NFSv4 calls for 64-bit 3617 * locking, this prevents us from being completely protocol-compliant. The 3618 * real solution to this problem is to start using unsigned file offsets in 3619 * the VFS, but this is a very deep change! 3620 */ 3621 static inline void 3622 nfs4_transform_lock_offset(struct file_lock *lock) 3623 { 3624 if (lock->fl_start < 0) 3625 lock->fl_start = OFFSET_MAX; 3626 if (lock->fl_end < 0) 3627 lock->fl_end = OFFSET_MAX; 3628 } 3629 3630 /* Hack!: For now, we're defining this just so we can use a pointer to it 3631 * as a unique cookie to identify our (NFSv4's) posix locks. */ 3632 static const struct lock_manager_operations nfsd_posix_mng_ops = { 3633 }; 3634 3635 static inline void 3636 nfs4_set_lock_denied(struct file_lock *fl, struct nfsd4_lock_denied *deny) 3637 { 3638 struct nfs4_stateowner *sop; 3639 3640 if (fl->fl_lmops == &nfsd_posix_mng_ops) { 3641 sop = (struct nfs4_stateowner *) fl->fl_owner; 3642 kref_get(&sop->so_ref); 3643 deny->ld_sop = sop; 3644 deny->ld_clientid = sop->so_client->cl_clientid; 3645 } else { 3646 deny->ld_sop = NULL; 3647 deny->ld_clientid.cl_boot = 0; 3648 deny->ld_clientid.cl_id = 0; 3649 } 3650 deny->ld_start = fl->fl_start; 3651 deny->ld_length = NFS4_MAX_UINT64; 3652 if (fl->fl_end != NFS4_MAX_UINT64) 3653 deny->ld_length = fl->fl_end - fl->fl_start + 1; 3654 deny->ld_type = NFS4_READ_LT; 3655 if (fl->fl_type != F_RDLCK) 3656 deny->ld_type = NFS4_WRITE_LT; 3657 } 3658 3659 static struct nfs4_stateowner * 3660 find_lockstateowner_str(struct inode *inode, clientid_t *clid, 3661 struct xdr_netobj *owner) 3662 { 3663 unsigned int hashval = lock_ownerstr_hashval(inode, clid->cl_id, owner); 3664 struct nfs4_stateowner *op; 3665 3666 list_for_each_entry(op, &lock_ownerstr_hashtbl[hashval], so_strhash) { 3667 if (same_owner_str(op, owner, clid)) 3668 return op; 3669 } 3670 return NULL; 3671 } 3672 3673 /* 3674 * Alloc a lock owner structure. 3675 * Called in nfsd4_lock - therefore, OPEN and OPEN_CONFIRM (if needed) has 3676 * occured. 3677 * 3678 * strhashval = lock_ownerstr_hashval 3679 */ 3680 3681 static struct nfs4_stateowner * 3682 alloc_init_lock_stateowner(unsigned int strhashval, struct nfs4_client *clp, struct nfs4_stateid *open_stp, struct nfsd4_lock *lock) { 3683 struct nfs4_stateowner *sop; 3684 struct nfs4_replay *rp; 3685 unsigned int idhashval; 3686 3687 if (!(sop = alloc_stateowner(&lock->lk_new_owner))) 3688 return NULL; 3689 idhashval = lockownerid_hashval(current_ownerid); 3690 INIT_LIST_HEAD(&sop->so_idhash); 3691 INIT_LIST_HEAD(&sop->so_strhash); 3692 INIT_LIST_HEAD(&sop->so_perclient); 3693 INIT_LIST_HEAD(&sop->so_stateids); 3694 INIT_LIST_HEAD(&sop->so_perstateid); 3695 INIT_LIST_HEAD(&sop->so_close_lru); /* not used */ 3696 sop->so_time = 0; 3697 list_add(&sop->so_idhash, &lock_ownerid_hashtbl[idhashval]); 3698 list_add(&sop->so_strhash, &lock_ownerstr_hashtbl[strhashval]); 3699 list_add(&sop->so_perstateid, &open_stp->st_lockowners); 3700 sop->so_is_open_owner = 0; 3701 sop->so_id = current_ownerid++; 3702 sop->so_client = clp; 3703 /* It is the openowner seqid that will be incremented in encode in the 3704 * case of new lockowners; so increment the lock seqid manually: */ 3705 sop->so_seqid = lock->lk_new_lock_seqid + 1; 3706 sop->so_confirmed = 1; 3707 rp = &sop->so_replay; 3708 rp->rp_status = nfserr_serverfault; 3709 rp->rp_buflen = 0; 3710 rp->rp_buf = rp->rp_ibuf; 3711 return sop; 3712 } 3713 3714 static struct nfs4_stateid * 3715 alloc_init_lock_stateid(struct nfs4_stateowner *sop, struct nfs4_file *fp, struct nfs4_stateid *open_stp) 3716 { 3717 struct nfs4_stateid *stp; 3718 unsigned int hashval = stateid_hashval(sop->so_id, fp->fi_id); 3719 3720 stp = nfs4_alloc_stateid(); 3721 if (stp == NULL) 3722 goto out; 3723 INIT_LIST_HEAD(&stp->st_hash); 3724 INIT_LIST_HEAD(&stp->st_perfile); 3725 INIT_LIST_HEAD(&stp->st_perstateowner); 3726 INIT_LIST_HEAD(&stp->st_lockowners); /* not used */ 3727 list_add(&stp->st_hash, &lockstateid_hashtbl[hashval]); 3728 list_add(&stp->st_perfile, &fp->fi_stateids); 3729 list_add(&stp->st_perstateowner, &sop->so_stateids); 3730 stp->st_stateowner = sop; 3731 get_nfs4_file(fp); 3732 stp->st_file = fp; 3733 stp->st_stateid.si_boot = boot_time; 3734 stp->st_stateid.si_stateownerid = sop->so_id; 3735 stp->st_stateid.si_fileid = fp->fi_id; 3736 stp->st_stateid.si_generation = 0; 3737 stp->st_deny_bmap = open_stp->st_deny_bmap; 3738 stp->st_openstp = open_stp; 3739 3740 out: 3741 return stp; 3742 } 3743 3744 static int 3745 check_lock_length(u64 offset, u64 length) 3746 { 3747 return ((length == 0) || ((length != NFS4_MAX_UINT64) && 3748 LOFF_OVERFLOW(offset, length))); 3749 } 3750 3751 /* 3752 * LOCK operation 3753 */ 3754 __be32 3755 nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, 3756 struct nfsd4_lock *lock) 3757 { 3758 struct nfs4_stateowner *open_sop = NULL; 3759 struct nfs4_stateowner *lock_sop = NULL; 3760 struct nfs4_stateid *lock_stp; 3761 struct nfs4_file *fp; 3762 struct file *filp = NULL; 3763 struct file_lock file_lock; 3764 struct file_lock conflock; 3765 __be32 status = 0; 3766 unsigned int strhashval; 3767 unsigned int cmd; 3768 int err; 3769 3770 dprintk("NFSD: nfsd4_lock: start=%Ld length=%Ld\n", 3771 (long long) lock->lk_offset, 3772 (long long) lock->lk_length); 3773 3774 if (check_lock_length(lock->lk_offset, lock->lk_length)) 3775 return nfserr_inval; 3776 3777 if ((status = fh_verify(rqstp, &cstate->current_fh, 3778 S_IFREG, NFSD_MAY_LOCK))) { 3779 dprintk("NFSD: nfsd4_lock: permission denied!\n"); 3780 return status; 3781 } 3782 3783 nfs4_lock_state(); 3784 3785 if (lock->lk_is_new) { 3786 /* 3787 * Client indicates that this is a new lockowner. 3788 * Use open owner and open stateid to create lock owner and 3789 * lock stateid. 3790 */ 3791 struct nfs4_stateid *open_stp = NULL; 3792 3793 status = nfserr_stale_clientid; 3794 if (!nfsd4_has_session(cstate) && 3795 STALE_CLIENTID(&lock->lk_new_clientid)) 3796 goto out; 3797 3798 /* validate and update open stateid and open seqid */ 3799 status = nfs4_preprocess_seqid_op(cstate, 3800 lock->lk_new_open_seqid, 3801 &lock->lk_new_open_stateid, 3802 OPEN_STATE, 3803 &lock->lk_replay_owner, &open_stp, 3804 lock); 3805 if (status) 3806 goto out; 3807 open_sop = lock->lk_replay_owner; 3808 /* create lockowner and lock stateid */ 3809 fp = open_stp->st_file; 3810 strhashval = lock_ownerstr_hashval(fp->fi_inode, 3811 open_sop->so_client->cl_clientid.cl_id, 3812 &lock->v.new.owner); 3813 /* XXX: Do we need to check for duplicate stateowners on 3814 * the same file, or should they just be allowed (and 3815 * create new stateids)? */ 3816 status = nfserr_resource; 3817 lock_sop = alloc_init_lock_stateowner(strhashval, 3818 open_sop->so_client, open_stp, lock); 3819 if (lock_sop == NULL) 3820 goto out; 3821 lock_stp = alloc_init_lock_stateid(lock_sop, fp, open_stp); 3822 if (lock_stp == NULL) 3823 goto out; 3824 } else { 3825 /* lock (lock owner + lock stateid) already exists */ 3826 status = nfs4_preprocess_seqid_op(cstate, 3827 lock->lk_old_lock_seqid, 3828 &lock->lk_old_lock_stateid, 3829 LOCK_STATE, 3830 &lock->lk_replay_owner, &lock_stp, lock); 3831 if (status) 3832 goto out; 3833 lock_sop = lock->lk_replay_owner; 3834 fp = lock_stp->st_file; 3835 } 3836 /* lock->lk_replay_owner and lock_stp have been created or found */ 3837 3838 status = nfserr_grace; 3839 if (locks_in_grace() && !lock->lk_reclaim) 3840 goto out; 3841 status = nfserr_no_grace; 3842 if (!locks_in_grace() && lock->lk_reclaim) 3843 goto out; 3844 3845 locks_init_lock(&file_lock); 3846 switch (lock->lk_type) { 3847 case NFS4_READ_LT: 3848 case NFS4_READW_LT: 3849 if (find_readable_file(lock_stp->st_file)) { 3850 nfs4_get_vfs_file(rqstp, fp, &cstate->current_fh, NFS4_SHARE_ACCESS_READ); 3851 filp = find_readable_file(lock_stp->st_file); 3852 } 3853 file_lock.fl_type = F_RDLCK; 3854 cmd = F_SETLK; 3855 break; 3856 case NFS4_WRITE_LT: 3857 case NFS4_WRITEW_LT: 3858 if (find_writeable_file(lock_stp->st_file)) { 3859 nfs4_get_vfs_file(rqstp, fp, &cstate->current_fh, NFS4_SHARE_ACCESS_WRITE); 3860 filp = find_writeable_file(lock_stp->st_file); 3861 } 3862 file_lock.fl_type = F_WRLCK; 3863 cmd = F_SETLK; 3864 break; 3865 default: 3866 status = nfserr_inval; 3867 goto out; 3868 } 3869 if (!filp) { 3870 status = nfserr_openmode; 3871 goto out; 3872 } 3873 file_lock.fl_owner = (fl_owner_t)lock_sop; 3874 file_lock.fl_pid = current->tgid; 3875 file_lock.fl_file = filp; 3876 file_lock.fl_flags = FL_POSIX; 3877 file_lock.fl_lmops = &nfsd_posix_mng_ops; 3878 3879 file_lock.fl_start = lock->lk_offset; 3880 file_lock.fl_end = last_byte_offset(lock->lk_offset, lock->lk_length); 3881 nfs4_transform_lock_offset(&file_lock); 3882 3883 /* 3884 * Try to lock the file in the VFS. 3885 * Note: locks.c uses the BKL to protect the inode's lock list. 3886 */ 3887 3888 err = vfs_lock_file(filp, cmd, &file_lock, &conflock); 3889 switch (-err) { 3890 case 0: /* success! */ 3891 update_stateid(&lock_stp->st_stateid); 3892 memcpy(&lock->lk_resp_stateid, &lock_stp->st_stateid, 3893 sizeof(stateid_t)); 3894 status = 0; 3895 break; 3896 case (EAGAIN): /* conflock holds conflicting lock */ 3897 status = nfserr_denied; 3898 dprintk("NFSD: nfsd4_lock: conflicting lock found!\n"); 3899 nfs4_set_lock_denied(&conflock, &lock->lk_denied); 3900 break; 3901 case (EDEADLK): 3902 status = nfserr_deadlock; 3903 break; 3904 default: 3905 dprintk("NFSD: nfsd4_lock: vfs_lock_file() failed! status %d\n",err); 3906 status = nfserr_resource; 3907 break; 3908 } 3909 out: 3910 if (status && lock->lk_is_new && lock_sop) 3911 release_lockowner(lock_sop); 3912 if (lock->lk_replay_owner) { 3913 nfs4_get_stateowner(lock->lk_replay_owner); 3914 cstate->replay_owner = lock->lk_replay_owner; 3915 } 3916 nfs4_unlock_state(); 3917 return status; 3918 } 3919 3920 /* 3921 * The NFSv4 spec allows a client to do a LOCKT without holding an OPEN, 3922 * so we do a temporary open here just to get an open file to pass to 3923 * vfs_test_lock. (Arguably perhaps test_lock should be done with an 3924 * inode operation.) 3925 */ 3926 static int nfsd_test_lock(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file_lock *lock) 3927 { 3928 struct file *file; 3929 int err; 3930 3931 err = nfsd_open(rqstp, fhp, S_IFREG, NFSD_MAY_READ, &file); 3932 if (err) 3933 return err; 3934 err = vfs_test_lock(file, lock); 3935 nfsd_close(file); 3936 return err; 3937 } 3938 3939 /* 3940 * LOCKT operation 3941 */ 3942 __be32 3943 nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, 3944 struct nfsd4_lockt *lockt) 3945 { 3946 struct inode *inode; 3947 struct file_lock file_lock; 3948 int error; 3949 __be32 status; 3950 3951 if (locks_in_grace()) 3952 return nfserr_grace; 3953 3954 if (check_lock_length(lockt->lt_offset, lockt->lt_length)) 3955 return nfserr_inval; 3956 3957 lockt->lt_stateowner = NULL; 3958 nfs4_lock_state(); 3959 3960 status = nfserr_stale_clientid; 3961 if (!nfsd4_has_session(cstate) && STALE_CLIENTID(&lockt->lt_clientid)) 3962 goto out; 3963 3964 if ((status = fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0))) { 3965 dprintk("NFSD: nfsd4_lockt: fh_verify() failed!\n"); 3966 if (status == nfserr_symlink) 3967 status = nfserr_inval; 3968 goto out; 3969 } 3970 3971 inode = cstate->current_fh.fh_dentry->d_inode; 3972 locks_init_lock(&file_lock); 3973 switch (lockt->lt_type) { 3974 case NFS4_READ_LT: 3975 case NFS4_READW_LT: 3976 file_lock.fl_type = F_RDLCK; 3977 break; 3978 case NFS4_WRITE_LT: 3979 case NFS4_WRITEW_LT: 3980 file_lock.fl_type = F_WRLCK; 3981 break; 3982 default: 3983 dprintk("NFSD: nfs4_lockt: bad lock type!\n"); 3984 status = nfserr_inval; 3985 goto out; 3986 } 3987 3988 lockt->lt_stateowner = find_lockstateowner_str(inode, 3989 &lockt->lt_clientid, &lockt->lt_owner); 3990 if (lockt->lt_stateowner) 3991 file_lock.fl_owner = (fl_owner_t)lockt->lt_stateowner; 3992 file_lock.fl_pid = current->tgid; 3993 file_lock.fl_flags = FL_POSIX; 3994 3995 file_lock.fl_start = lockt->lt_offset; 3996 file_lock.fl_end = last_byte_offset(lockt->lt_offset, lockt->lt_length); 3997 3998 nfs4_transform_lock_offset(&file_lock); 3999 4000 status = nfs_ok; 4001 error = nfsd_test_lock(rqstp, &cstate->current_fh, &file_lock); 4002 if (error) { 4003 status = nfserrno(error); 4004 goto out; 4005 } 4006 if (file_lock.fl_type != F_UNLCK) { 4007 status = nfserr_denied; 4008 nfs4_set_lock_denied(&file_lock, &lockt->lt_denied); 4009 } 4010 out: 4011 nfs4_unlock_state(); 4012 return status; 4013 } 4014 4015 __be32 4016 nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, 4017 struct nfsd4_locku *locku) 4018 { 4019 struct nfs4_stateid *stp; 4020 struct file *filp = NULL; 4021 struct file_lock file_lock; 4022 __be32 status; 4023 int err; 4024 4025 dprintk("NFSD: nfsd4_locku: start=%Ld length=%Ld\n", 4026 (long long) locku->lu_offset, 4027 (long long) locku->lu_length); 4028 4029 if (check_lock_length(locku->lu_offset, locku->lu_length)) 4030 return nfserr_inval; 4031 4032 nfs4_lock_state(); 4033 4034 if ((status = nfs4_preprocess_seqid_op(cstate, 4035 locku->lu_seqid, 4036 &locku->lu_stateid, 4037 LOCK_STATE, 4038 &locku->lu_stateowner, &stp, NULL))) 4039 goto out; 4040 4041 filp = find_any_file(stp->st_file); 4042 if (!filp) { 4043 status = nfserr_lock_range; 4044 goto out; 4045 } 4046 BUG_ON(!filp); 4047 locks_init_lock(&file_lock); 4048 file_lock.fl_type = F_UNLCK; 4049 file_lock.fl_owner = (fl_owner_t) locku->lu_stateowner; 4050 file_lock.fl_pid = current->tgid; 4051 file_lock.fl_file = filp; 4052 file_lock.fl_flags = FL_POSIX; 4053 file_lock.fl_lmops = &nfsd_posix_mng_ops; 4054 file_lock.fl_start = locku->lu_offset; 4055 4056 file_lock.fl_end = last_byte_offset(locku->lu_offset, locku->lu_length); 4057 nfs4_transform_lock_offset(&file_lock); 4058 4059 /* 4060 * Try to unlock the file in the VFS. 4061 */ 4062 err = vfs_lock_file(filp, F_SETLK, &file_lock, NULL); 4063 if (err) { 4064 dprintk("NFSD: nfs4_locku: vfs_lock_file failed!\n"); 4065 goto out_nfserr; 4066 } 4067 /* 4068 * OK, unlock succeeded; the only thing left to do is update the stateid. 4069 */ 4070 update_stateid(&stp->st_stateid); 4071 memcpy(&locku->lu_stateid, &stp->st_stateid, sizeof(stateid_t)); 4072 4073 out: 4074 if (locku->lu_stateowner) { 4075 nfs4_get_stateowner(locku->lu_stateowner); 4076 cstate->replay_owner = locku->lu_stateowner; 4077 } 4078 nfs4_unlock_state(); 4079 return status; 4080 4081 out_nfserr: 4082 status = nfserrno(err); 4083 goto out; 4084 } 4085 4086 /* 4087 * returns 4088 * 1: locks held by lockowner 4089 * 0: no locks held by lockowner 4090 */ 4091 static int 4092 check_for_locks(struct nfs4_file *filp, struct nfs4_stateowner *lowner) 4093 { 4094 struct file_lock **flpp; 4095 struct inode *inode = filp->fi_inode; 4096 int status = 0; 4097 4098 lock_flocks(); 4099 for (flpp = &inode->i_flock; *flpp != NULL; flpp = &(*flpp)->fl_next) { 4100 if ((*flpp)->fl_owner == (fl_owner_t)lowner) { 4101 status = 1; 4102 goto out; 4103 } 4104 } 4105 out: 4106 unlock_flocks(); 4107 return status; 4108 } 4109 4110 __be32 4111 nfsd4_release_lockowner(struct svc_rqst *rqstp, 4112 struct nfsd4_compound_state *cstate, 4113 struct nfsd4_release_lockowner *rlockowner) 4114 { 4115 clientid_t *clid = &rlockowner->rl_clientid; 4116 struct nfs4_stateowner *sop; 4117 struct nfs4_stateid *stp; 4118 struct xdr_netobj *owner = &rlockowner->rl_owner; 4119 struct list_head matches; 4120 int i; 4121 __be32 status; 4122 4123 dprintk("nfsd4_release_lockowner clientid: (%08x/%08x):\n", 4124 clid->cl_boot, clid->cl_id); 4125 4126 /* XXX check for lease expiration */ 4127 4128 status = nfserr_stale_clientid; 4129 if (STALE_CLIENTID(clid)) 4130 return status; 4131 4132 nfs4_lock_state(); 4133 4134 status = nfserr_locks_held; 4135 /* XXX: we're doing a linear search through all the lockowners. 4136 * Yipes! For now we'll just hope clients aren't really using 4137 * release_lockowner much, but eventually we have to fix these 4138 * data structures. */ 4139 INIT_LIST_HEAD(&matches); 4140 for (i = 0; i < LOCK_HASH_SIZE; i++) { 4141 list_for_each_entry(sop, &lock_ownerid_hashtbl[i], so_idhash) { 4142 if (!same_owner_str(sop, owner, clid)) 4143 continue; 4144 list_for_each_entry(stp, &sop->so_stateids, 4145 st_perstateowner) { 4146 if (check_for_locks(stp->st_file, sop)) 4147 goto out; 4148 /* Note: so_perclient unused for lockowners, 4149 * so it's OK to fool with here. */ 4150 list_add(&sop->so_perclient, &matches); 4151 } 4152 } 4153 } 4154 /* Clients probably won't expect us to return with some (but not all) 4155 * of the lockowner state released; so don't release any until all 4156 * have been checked. */ 4157 status = nfs_ok; 4158 while (!list_empty(&matches)) { 4159 sop = list_entry(matches.next, struct nfs4_stateowner, 4160 so_perclient); 4161 /* unhash_stateowner deletes so_perclient only 4162 * for openowners. */ 4163 list_del(&sop->so_perclient); 4164 release_lockowner(sop); 4165 } 4166 out: 4167 nfs4_unlock_state(); 4168 return status; 4169 } 4170 4171 static inline struct nfs4_client_reclaim * 4172 alloc_reclaim(void) 4173 { 4174 return kmalloc(sizeof(struct nfs4_client_reclaim), GFP_KERNEL); 4175 } 4176 4177 int 4178 nfs4_has_reclaimed_state(const char *name, bool use_exchange_id) 4179 { 4180 unsigned int strhashval = clientstr_hashval(name); 4181 struct nfs4_client *clp; 4182 4183 clp = find_confirmed_client_by_str(name, strhashval); 4184 return clp ? 1 : 0; 4185 } 4186 4187 /* 4188 * failure => all reset bets are off, nfserr_no_grace... 4189 */ 4190 int 4191 nfs4_client_to_reclaim(const char *name) 4192 { 4193 unsigned int strhashval; 4194 struct nfs4_client_reclaim *crp = NULL; 4195 4196 dprintk("NFSD nfs4_client_to_reclaim NAME: %.*s\n", HEXDIR_LEN, name); 4197 crp = alloc_reclaim(); 4198 if (!crp) 4199 return 0; 4200 strhashval = clientstr_hashval(name); 4201 INIT_LIST_HEAD(&crp->cr_strhash); 4202 list_add(&crp->cr_strhash, &reclaim_str_hashtbl[strhashval]); 4203 memcpy(crp->cr_recdir, name, HEXDIR_LEN); 4204 reclaim_str_hashtbl_size++; 4205 return 1; 4206 } 4207 4208 static void 4209 nfs4_release_reclaim(void) 4210 { 4211 struct nfs4_client_reclaim *crp = NULL; 4212 int i; 4213 4214 for (i = 0; i < CLIENT_HASH_SIZE; i++) { 4215 while (!list_empty(&reclaim_str_hashtbl[i])) { 4216 crp = list_entry(reclaim_str_hashtbl[i].next, 4217 struct nfs4_client_reclaim, cr_strhash); 4218 list_del(&crp->cr_strhash); 4219 kfree(crp); 4220 reclaim_str_hashtbl_size--; 4221 } 4222 } 4223 BUG_ON(reclaim_str_hashtbl_size); 4224 } 4225 4226 /* 4227 * called from OPEN, CLAIM_PREVIOUS with a new clientid. */ 4228 static struct nfs4_client_reclaim * 4229 nfs4_find_reclaim_client(clientid_t *clid) 4230 { 4231 unsigned int strhashval; 4232 struct nfs4_client *clp; 4233 struct nfs4_client_reclaim *crp = NULL; 4234 4235 4236 /* find clientid in conf_id_hashtbl */ 4237 clp = find_confirmed_client(clid); 4238 if (clp == NULL) 4239 return NULL; 4240 4241 dprintk("NFSD: nfs4_find_reclaim_client for %.*s with recdir %s\n", 4242 clp->cl_name.len, clp->cl_name.data, 4243 clp->cl_recdir); 4244 4245 /* find clp->cl_name in reclaim_str_hashtbl */ 4246 strhashval = clientstr_hashval(clp->cl_recdir); 4247 list_for_each_entry(crp, &reclaim_str_hashtbl[strhashval], cr_strhash) { 4248 if (same_name(crp->cr_recdir, clp->cl_recdir)) { 4249 return crp; 4250 } 4251 } 4252 return NULL; 4253 } 4254 4255 /* 4256 * Called from OPEN. Look for clientid in reclaim list. 4257 */ 4258 __be32 4259 nfs4_check_open_reclaim(clientid_t *clid) 4260 { 4261 return nfs4_find_reclaim_client(clid) ? nfs_ok : nfserr_reclaim_bad; 4262 } 4263 4264 /* initialization to perform at module load time: */ 4265 4266 int 4267 nfs4_state_init(void) 4268 { 4269 int i, status; 4270 4271 status = nfsd4_init_slabs(); 4272 if (status) 4273 return status; 4274 for (i = 0; i < CLIENT_HASH_SIZE; i++) { 4275 INIT_LIST_HEAD(&conf_id_hashtbl[i]); 4276 INIT_LIST_HEAD(&conf_str_hashtbl[i]); 4277 INIT_LIST_HEAD(&unconf_str_hashtbl[i]); 4278 INIT_LIST_HEAD(&unconf_id_hashtbl[i]); 4279 INIT_LIST_HEAD(&reclaim_str_hashtbl[i]); 4280 } 4281 for (i = 0; i < SESSION_HASH_SIZE; i++) 4282 INIT_LIST_HEAD(&sessionid_hashtbl[i]); 4283 for (i = 0; i < FILE_HASH_SIZE; i++) { 4284 INIT_LIST_HEAD(&file_hashtbl[i]); 4285 } 4286 for (i = 0; i < OWNER_HASH_SIZE; i++) { 4287 INIT_LIST_HEAD(&ownerstr_hashtbl[i]); 4288 INIT_LIST_HEAD(&ownerid_hashtbl[i]); 4289 } 4290 for (i = 0; i < STATEID_HASH_SIZE; i++) { 4291 INIT_LIST_HEAD(&stateid_hashtbl[i]); 4292 INIT_LIST_HEAD(&lockstateid_hashtbl[i]); 4293 } 4294 for (i = 0; i < LOCK_HASH_SIZE; i++) { 4295 INIT_LIST_HEAD(&lock_ownerid_hashtbl[i]); 4296 INIT_LIST_HEAD(&lock_ownerstr_hashtbl[i]); 4297 } 4298 memset(&onestateid, ~0, sizeof(stateid_t)); 4299 INIT_LIST_HEAD(&close_lru); 4300 INIT_LIST_HEAD(&client_lru); 4301 INIT_LIST_HEAD(&del_recall_lru); 4302 reclaim_str_hashtbl_size = 0; 4303 return 0; 4304 } 4305 4306 static void 4307 nfsd4_load_reboot_recovery_data(void) 4308 { 4309 int status; 4310 4311 nfs4_lock_state(); 4312 nfsd4_init_recdir(user_recovery_dirname); 4313 status = nfsd4_recdir_load(); 4314 nfs4_unlock_state(); 4315 if (status) 4316 printk("NFSD: Failure reading reboot recovery data\n"); 4317 } 4318 4319 /* 4320 * Since the lifetime of a delegation isn't limited to that of an open, a 4321 * client may quite reasonably hang on to a delegation as long as it has 4322 * the inode cached. This becomes an obvious problem the first time a 4323 * client's inode cache approaches the size of the server's total memory. 4324 * 4325 * For now we avoid this problem by imposing a hard limit on the number 4326 * of delegations, which varies according to the server's memory size. 4327 */ 4328 static void 4329 set_max_delegations(void) 4330 { 4331 /* 4332 * Allow at most 4 delegations per megabyte of RAM. Quick 4333 * estimates suggest that in the worst case (where every delegation 4334 * is for a different inode), a delegation could take about 1.5K, 4335 * giving a worst case usage of about 6% of memory. 4336 */ 4337 max_delegations = nr_free_buffer_pages() >> (20 - 2 - PAGE_SHIFT); 4338 } 4339 4340 /* initialization to perform when the nfsd service is started: */ 4341 4342 static int 4343 __nfs4_state_start(void) 4344 { 4345 int ret; 4346 4347 boot_time = get_seconds(); 4348 locks_start_grace(&nfsd4_manager); 4349 printk(KERN_INFO "NFSD: starting %ld-second grace period\n", 4350 nfsd4_grace); 4351 ret = set_callback_cred(); 4352 if (ret) 4353 return -ENOMEM; 4354 laundry_wq = create_singlethread_workqueue("nfsd4"); 4355 if (laundry_wq == NULL) 4356 return -ENOMEM; 4357 ret = nfsd4_create_callback_queue(); 4358 if (ret) 4359 goto out_free_laundry; 4360 queue_delayed_work(laundry_wq, &laundromat_work, nfsd4_grace * HZ); 4361 set_max_delegations(); 4362 return 0; 4363 out_free_laundry: 4364 destroy_workqueue(laundry_wq); 4365 return ret; 4366 } 4367 4368 int 4369 nfs4_state_start(void) 4370 { 4371 nfsd4_load_reboot_recovery_data(); 4372 return __nfs4_state_start(); 4373 } 4374 4375 static void 4376 __nfs4_state_shutdown(void) 4377 { 4378 int i; 4379 struct nfs4_client *clp = NULL; 4380 struct nfs4_delegation *dp = NULL; 4381 struct list_head *pos, *next, reaplist; 4382 4383 for (i = 0; i < CLIENT_HASH_SIZE; i++) { 4384 while (!list_empty(&conf_id_hashtbl[i])) { 4385 clp = list_entry(conf_id_hashtbl[i].next, struct nfs4_client, cl_idhash); 4386 expire_client(clp); 4387 } 4388 while (!list_empty(&unconf_str_hashtbl[i])) { 4389 clp = list_entry(unconf_str_hashtbl[i].next, struct nfs4_client, cl_strhash); 4390 expire_client(clp); 4391 } 4392 } 4393 INIT_LIST_HEAD(&reaplist); 4394 spin_lock(&recall_lock); 4395 list_for_each_safe(pos, next, &del_recall_lru) { 4396 dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru); 4397 list_move(&dp->dl_recall_lru, &reaplist); 4398 } 4399 spin_unlock(&recall_lock); 4400 list_for_each_safe(pos, next, &reaplist) { 4401 dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru); 4402 list_del_init(&dp->dl_recall_lru); 4403 unhash_delegation(dp); 4404 } 4405 4406 nfsd4_shutdown_recdir(); 4407 } 4408 4409 void 4410 nfs4_state_shutdown(void) 4411 { 4412 cancel_delayed_work_sync(&laundromat_work); 4413 destroy_workqueue(laundry_wq); 4414 locks_end_grace(&nfsd4_manager); 4415 nfs4_lock_state(); 4416 nfs4_release_reclaim(); 4417 __nfs4_state_shutdown(); 4418 nfs4_unlock_state(); 4419 nfsd4_destroy_callback_queue(); 4420 } 4421 4422 /* 4423 * user_recovery_dirname is protected by the nfsd_mutex since it's only 4424 * accessed when nfsd is starting. 4425 */ 4426 static void 4427 nfs4_set_recdir(char *recdir) 4428 { 4429 strcpy(user_recovery_dirname, recdir); 4430 } 4431 4432 /* 4433 * Change the NFSv4 recovery directory to recdir. 4434 */ 4435 int 4436 nfs4_reset_recoverydir(char *recdir) 4437 { 4438 int status; 4439 struct path path; 4440 4441 status = kern_path(recdir, LOOKUP_FOLLOW, &path); 4442 if (status) 4443 return status; 4444 status = -ENOTDIR; 4445 if (S_ISDIR(path.dentry->d_inode->i_mode)) { 4446 nfs4_set_recdir(recdir); 4447 status = 0; 4448 } 4449 path_put(&path); 4450 return status; 4451 } 4452 4453 char * 4454 nfs4_recoverydir(void) 4455 { 4456 return user_recovery_dirname; 4457 } 4458