1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * linux/fs/nfs/callback_proc.c 4 * 5 * Copyright (C) 2004 Trond Myklebust 6 * 7 * NFSv4 callback procedures 8 */ 9 #include <linux/nfs4.h> 10 #include <linux/nfs_fs.h> 11 #include <linux/slab.h> 12 #include <linux/rcupdate.h> 13 #include "nfs4_fs.h" 14 #include "callback.h" 15 #include "delegation.h" 16 #include "internal.h" 17 #include "pnfs.h" 18 #include "nfs4session.h" 19 #include "nfs4trace.h" 20 21 #define NFSDBG_FACILITY NFSDBG_CALLBACK 22 23 __be32 nfs4_callback_getattr(void *argp, void *resp, 24 struct cb_process_state *cps) 25 { 26 struct cb_getattrargs *args = argp; 27 struct cb_getattrres *res = resp; 28 struct nfs_delegation *delegation; 29 struct nfs_inode *nfsi; 30 struct inode *inode; 31 32 res->status = htonl(NFS4ERR_OP_NOT_IN_SESSION); 33 if (!cps->clp) /* Always set for v4.0. Set in cb_sequence for v4.1 */ 34 goto out; 35 36 res->bitmap[0] = res->bitmap[1] = 0; 37 res->status = htonl(NFS4ERR_BADHANDLE); 38 39 dprintk_rcu("NFS: GETATTR callback request from %s\n", 40 rpc_peeraddr2str(cps->clp->cl_rpcclient, RPC_DISPLAY_ADDR)); 41 42 inode = nfs_delegation_find_inode(cps->clp, &args->fh); 43 if (inode == NULL) { 44 trace_nfs4_cb_getattr(cps->clp, &args->fh, NULL, 45 -ntohl(res->status)); 46 goto out; 47 } 48 nfsi = NFS_I(inode); 49 rcu_read_lock(); 50 delegation = rcu_dereference(nfsi->delegation); 51 if (delegation == NULL || (delegation->type & FMODE_WRITE) == 0) 52 goto out_iput; 53 res->size = i_size_read(inode); 54 res->change_attr = delegation->change_attr; 55 if (nfs_have_writebacks(inode)) 56 res->change_attr++; 57 res->ctime = inode->i_ctime; 58 res->mtime = inode->i_mtime; 59 res->bitmap[0] = (FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE) & 60 args->bitmap[0]; 61 res->bitmap[1] = (FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY) & 62 args->bitmap[1]; 63 res->status = 0; 64 out_iput: 65 rcu_read_unlock(); 66 trace_nfs4_cb_getattr(cps->clp, &args->fh, inode, -ntohl(res->status)); 67 iput(inode); 68 out: 69 dprintk("%s: exit with status = %d\n", __func__, ntohl(res->status)); 70 return res->status; 71 } 72 73 __be32 nfs4_callback_recall(void *argp, void *resp, 74 struct cb_process_state *cps) 75 { 76 struct cb_recallargs *args = argp; 77 struct inode *inode; 78 __be32 res; 79 80 res = htonl(NFS4ERR_OP_NOT_IN_SESSION); 81 if (!cps->clp) /* Always set for v4.0. Set in cb_sequence for v4.1 */ 82 goto out; 83 84 dprintk_rcu("NFS: RECALL callback request from %s\n", 85 rpc_peeraddr2str(cps->clp->cl_rpcclient, RPC_DISPLAY_ADDR)); 86 87 res = htonl(NFS4ERR_BADHANDLE); 88 inode = nfs_delegation_find_inode(cps->clp, &args->fh); 89 if (inode == NULL) { 90 trace_nfs4_cb_recall(cps->clp, &args->fh, NULL, 91 &args->stateid, -ntohl(res)); 92 goto out; 93 } 94 /* Set up a helper thread to actually return the delegation */ 95 switch (nfs_async_inode_return_delegation(inode, &args->stateid)) { 96 case 0: 97 res = 0; 98 break; 99 case -ENOENT: 100 res = htonl(NFS4ERR_BAD_STATEID); 101 break; 102 default: 103 res = htonl(NFS4ERR_RESOURCE); 104 } 105 trace_nfs4_cb_recall(cps->clp, &args->fh, inode, 106 &args->stateid, -ntohl(res)); 107 iput(inode); 108 out: 109 dprintk("%s: exit with status = %d\n", __func__, ntohl(res)); 110 return res; 111 } 112 113 #if defined(CONFIG_NFS_V4_1) 114 115 /* 116 * Lookup a layout inode by stateid 117 * 118 * Note: returns a refcount on the inode and superblock 119 */ 120 static struct inode *nfs_layout_find_inode_by_stateid(struct nfs_client *clp, 121 const nfs4_stateid *stateid) 122 { 123 struct nfs_server *server; 124 struct inode *inode; 125 struct pnfs_layout_hdr *lo; 126 127 restart: 128 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { 129 list_for_each_entry(lo, &server->layouts, plh_layouts) { 130 if (stateid != NULL && 131 !nfs4_stateid_match_other(stateid, &lo->plh_stateid)) 132 continue; 133 inode = igrab(lo->plh_inode); 134 if (!inode) 135 continue; 136 if (!nfs_sb_active(inode->i_sb)) { 137 rcu_read_unlock(); 138 spin_unlock(&clp->cl_lock); 139 iput(inode); 140 spin_lock(&clp->cl_lock); 141 rcu_read_lock(); 142 goto restart; 143 } 144 return inode; 145 } 146 } 147 148 return NULL; 149 } 150 151 /* 152 * Lookup a layout inode by filehandle. 153 * 154 * Note: returns a refcount on the inode and superblock 155 * 156 */ 157 static struct inode *nfs_layout_find_inode_by_fh(struct nfs_client *clp, 158 const struct nfs_fh *fh) 159 { 160 struct nfs_server *server; 161 struct nfs_inode *nfsi; 162 struct inode *inode; 163 struct pnfs_layout_hdr *lo; 164 165 restart: 166 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { 167 list_for_each_entry(lo, &server->layouts, plh_layouts) { 168 nfsi = NFS_I(lo->plh_inode); 169 if (nfs_compare_fh(fh, &nfsi->fh)) 170 continue; 171 if (nfsi->layout != lo) 172 continue; 173 inode = igrab(lo->plh_inode); 174 if (!inode) 175 continue; 176 if (!nfs_sb_active(inode->i_sb)) { 177 rcu_read_unlock(); 178 spin_unlock(&clp->cl_lock); 179 iput(inode); 180 spin_lock(&clp->cl_lock); 181 rcu_read_lock(); 182 goto restart; 183 } 184 return inode; 185 } 186 } 187 188 return NULL; 189 } 190 191 static struct inode *nfs_layout_find_inode(struct nfs_client *clp, 192 const struct nfs_fh *fh, 193 const nfs4_stateid *stateid) 194 { 195 struct inode *inode; 196 197 spin_lock(&clp->cl_lock); 198 rcu_read_lock(); 199 inode = nfs_layout_find_inode_by_stateid(clp, stateid); 200 if (!inode) 201 inode = nfs_layout_find_inode_by_fh(clp, fh); 202 rcu_read_unlock(); 203 spin_unlock(&clp->cl_lock); 204 205 return inode; 206 } 207 208 /* 209 * Enforce RFC5661 section 12.5.5.2.1. (Layout Recall and Return Sequencing) 210 */ 211 static u32 pnfs_check_callback_stateid(struct pnfs_layout_hdr *lo, 212 const nfs4_stateid *new) 213 { 214 u32 oldseq, newseq; 215 216 /* Is the stateid still not initialised? */ 217 if (!pnfs_layout_is_valid(lo)) 218 return NFS4ERR_DELAY; 219 220 /* Mismatched stateid? */ 221 if (!nfs4_stateid_match_other(&lo->plh_stateid, new)) 222 return NFS4ERR_BAD_STATEID; 223 224 newseq = be32_to_cpu(new->seqid); 225 /* Are we already in a layout recall situation? */ 226 if (test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags) && 227 lo->plh_return_seq != 0) { 228 if (newseq < lo->plh_return_seq) 229 return NFS4ERR_OLD_STATEID; 230 if (newseq > lo->plh_return_seq) 231 return NFS4ERR_DELAY; 232 goto out; 233 } 234 235 /* Check that the stateid matches what we think it should be. */ 236 oldseq = be32_to_cpu(lo->plh_stateid.seqid); 237 if (newseq > oldseq + 1) 238 return NFS4ERR_DELAY; 239 /* Crazy server! */ 240 if (newseq <= oldseq) 241 return NFS4ERR_OLD_STATEID; 242 out: 243 return NFS_OK; 244 } 245 246 static u32 initiate_file_draining(struct nfs_client *clp, 247 struct cb_layoutrecallargs *args) 248 { 249 struct inode *ino; 250 struct pnfs_layout_hdr *lo; 251 u32 rv = NFS4ERR_NOMATCHING_LAYOUT; 252 LIST_HEAD(free_me_list); 253 254 ino = nfs_layout_find_inode(clp, &args->cbl_fh, &args->cbl_stateid); 255 if (!ino) 256 goto out; 257 258 pnfs_layoutcommit_inode(ino, false); 259 260 261 spin_lock(&ino->i_lock); 262 lo = NFS_I(ino)->layout; 263 if (!lo) { 264 spin_unlock(&ino->i_lock); 265 goto out; 266 } 267 pnfs_get_layout_hdr(lo); 268 rv = pnfs_check_callback_stateid(lo, &args->cbl_stateid); 269 if (rv != NFS_OK) 270 goto unlock; 271 pnfs_set_layout_stateid(lo, &args->cbl_stateid, true); 272 273 /* 274 * Enforce RFC5661 Section 12.5.5.2.1.5 (Bulk Recall and Return) 275 */ 276 if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) { 277 rv = NFS4ERR_DELAY; 278 goto unlock; 279 } 280 281 if (pnfs_mark_matching_lsegs_return(lo, &free_me_list, 282 &args->cbl_range, 283 be32_to_cpu(args->cbl_stateid.seqid))) { 284 rv = NFS4_OK; 285 goto unlock; 286 } 287 288 /* Embrace your forgetfulness! */ 289 rv = NFS4ERR_NOMATCHING_LAYOUT; 290 291 if (NFS_SERVER(ino)->pnfs_curr_ld->return_range) { 292 NFS_SERVER(ino)->pnfs_curr_ld->return_range(lo, 293 &args->cbl_range); 294 } 295 unlock: 296 spin_unlock(&ino->i_lock); 297 pnfs_free_lseg_list(&free_me_list); 298 /* Free all lsegs that are attached to commit buckets */ 299 nfs_commit_inode(ino, 0); 300 pnfs_put_layout_hdr(lo); 301 out: 302 trace_nfs4_cb_layoutrecall_file(clp, &args->cbl_fh, ino, 303 &args->cbl_stateid, -rv); 304 nfs_iput_and_deactive(ino); 305 return rv; 306 } 307 308 static u32 initiate_bulk_draining(struct nfs_client *clp, 309 struct cb_layoutrecallargs *args) 310 { 311 int stat; 312 313 if (args->cbl_recall_type == RETURN_FSID) 314 stat = pnfs_destroy_layouts_byfsid(clp, &args->cbl_fsid, true); 315 else 316 stat = pnfs_destroy_layouts_byclid(clp, true); 317 if (stat != 0) 318 return NFS4ERR_DELAY; 319 return NFS4ERR_NOMATCHING_LAYOUT; 320 } 321 322 static u32 do_callback_layoutrecall(struct nfs_client *clp, 323 struct cb_layoutrecallargs *args) 324 { 325 if (args->cbl_recall_type == RETURN_FILE) 326 return initiate_file_draining(clp, args); 327 return initiate_bulk_draining(clp, args); 328 } 329 330 __be32 nfs4_callback_layoutrecall(void *argp, void *resp, 331 struct cb_process_state *cps) 332 { 333 struct cb_layoutrecallargs *args = argp; 334 u32 res = NFS4ERR_OP_NOT_IN_SESSION; 335 336 if (cps->clp) 337 res = do_callback_layoutrecall(cps->clp, args); 338 return cpu_to_be32(res); 339 } 340 341 static void pnfs_recall_all_layouts(struct nfs_client *clp) 342 { 343 struct cb_layoutrecallargs args; 344 345 /* Pretend we got a CB_LAYOUTRECALL(ALL) */ 346 memset(&args, 0, sizeof(args)); 347 args.cbl_recall_type = RETURN_ALL; 348 /* FIXME we ignore errors, what should we do? */ 349 do_callback_layoutrecall(clp, &args); 350 } 351 352 __be32 nfs4_callback_devicenotify(void *argp, void *resp, 353 struct cb_process_state *cps) 354 { 355 struct cb_devicenotifyargs *args = argp; 356 int i; 357 __be32 res = 0; 358 struct nfs_client *clp = cps->clp; 359 struct nfs_server *server = NULL; 360 361 if (!clp) { 362 res = cpu_to_be32(NFS4ERR_OP_NOT_IN_SESSION); 363 goto out; 364 } 365 366 for (i = 0; i < args->ndevs; i++) { 367 struct cb_devicenotifyitem *dev = &args->devs[i]; 368 369 if (!server || 370 server->pnfs_curr_ld->id != dev->cbd_layout_type) { 371 rcu_read_lock(); 372 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) 373 if (server->pnfs_curr_ld && 374 server->pnfs_curr_ld->id == dev->cbd_layout_type) { 375 rcu_read_unlock(); 376 goto found; 377 } 378 rcu_read_unlock(); 379 continue; 380 } 381 382 found: 383 nfs4_delete_deviceid(server->pnfs_curr_ld, clp, &dev->cbd_dev_id); 384 } 385 386 out: 387 kfree(args->devs); 388 return res; 389 } 390 391 /* 392 * Validate the sequenceID sent by the server. 393 * Return success if the sequenceID is one more than what we last saw on 394 * this slot, accounting for wraparound. Increments the slot's sequence. 395 * 396 * We don't yet implement a duplicate request cache, instead we set the 397 * back channel ca_maxresponsesize_cached to zero. This is OK for now 398 * since we only currently implement idempotent callbacks anyway. 399 * 400 * We have a single slot backchannel at this time, so we don't bother 401 * checking the used_slots bit array on the table. The lower layer guarantees 402 * a single outstanding callback request at a time. 403 */ 404 static __be32 405 validate_seqid(const struct nfs4_slot_table *tbl, const struct nfs4_slot *slot, 406 const struct cb_sequenceargs * args) 407 { 408 if (args->csa_slotid > tbl->server_highest_slotid) 409 return htonl(NFS4ERR_BADSLOT); 410 411 /* Replay */ 412 if (args->csa_sequenceid == slot->seq_nr) { 413 if (nfs4_test_locked_slot(tbl, slot->slot_nr)) 414 return htonl(NFS4ERR_DELAY); 415 /* Signal process_op to set this error on next op */ 416 if (args->csa_cachethis == 0) 417 return htonl(NFS4ERR_RETRY_UNCACHED_REP); 418 419 /* Liar! We never allowed you to set csa_cachethis != 0 */ 420 return htonl(NFS4ERR_SEQ_FALSE_RETRY); 421 } 422 423 /* Wraparound */ 424 if (unlikely(slot->seq_nr == 0xFFFFFFFFU)) { 425 if (args->csa_sequenceid == 1) 426 return htonl(NFS4_OK); 427 } else if (likely(args->csa_sequenceid == slot->seq_nr + 1)) 428 return htonl(NFS4_OK); 429 430 /* Misordered request */ 431 return htonl(NFS4ERR_SEQ_MISORDERED); 432 } 433 434 /* 435 * For each referring call triple, check the session's slot table for 436 * a match. If the slot is in use and the sequence numbers match, the 437 * client is still waiting for a response to the original request. 438 */ 439 static bool referring_call_exists(struct nfs_client *clp, 440 uint32_t nrclists, 441 struct referring_call_list *rclists) 442 { 443 bool status = false; 444 int i, j; 445 struct nfs4_session *session; 446 struct nfs4_slot_table *tbl; 447 struct referring_call_list *rclist; 448 struct referring_call *ref; 449 450 /* 451 * XXX When client trunking is implemented, this becomes 452 * a session lookup from within the loop 453 */ 454 session = clp->cl_session; 455 tbl = &session->fc_slot_table; 456 457 for (i = 0; i < nrclists; i++) { 458 rclist = &rclists[i]; 459 if (memcmp(session->sess_id.data, 460 rclist->rcl_sessionid.data, 461 NFS4_MAX_SESSIONID_LEN) != 0) 462 continue; 463 464 for (j = 0; j < rclist->rcl_nrefcalls; j++) { 465 ref = &rclist->rcl_refcalls[j]; 466 status = nfs4_slot_wait_on_seqid(tbl, ref->rc_slotid, 467 ref->rc_sequenceid, HZ >> 1) < 0; 468 if (status) 469 goto out; 470 } 471 } 472 473 out: 474 return status; 475 } 476 477 __be32 nfs4_callback_sequence(void *argp, void *resp, 478 struct cb_process_state *cps) 479 { 480 struct cb_sequenceargs *args = argp; 481 struct cb_sequenceres *res = resp; 482 struct nfs4_slot_table *tbl; 483 struct nfs4_slot *slot; 484 struct nfs_client *clp; 485 int i; 486 __be32 status = htonl(NFS4ERR_BADSESSION); 487 488 clp = nfs4_find_client_sessionid(cps->net, args->csa_addr, 489 &args->csa_sessionid, cps->minorversion); 490 if (clp == NULL) 491 goto out; 492 493 if (!(clp->cl_session->flags & SESSION4_BACK_CHAN)) 494 goto out; 495 496 tbl = &clp->cl_session->bc_slot_table; 497 498 /* Set up res before grabbing the spinlock */ 499 memcpy(&res->csr_sessionid, &args->csa_sessionid, 500 sizeof(res->csr_sessionid)); 501 res->csr_sequenceid = args->csa_sequenceid; 502 res->csr_slotid = args->csa_slotid; 503 504 spin_lock(&tbl->slot_tbl_lock); 505 /* state manager is resetting the session */ 506 if (test_bit(NFS4_SLOT_TBL_DRAINING, &tbl->slot_tbl_state)) { 507 status = htonl(NFS4ERR_DELAY); 508 /* Return NFS4ERR_BADSESSION if we're draining the session 509 * in order to reset it. 510 */ 511 if (test_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state)) 512 status = htonl(NFS4ERR_BADSESSION); 513 goto out_unlock; 514 } 515 516 status = htonl(NFS4ERR_BADSLOT); 517 slot = nfs4_lookup_slot(tbl, args->csa_slotid); 518 if (IS_ERR(slot)) 519 goto out_unlock; 520 521 res->csr_highestslotid = tbl->server_highest_slotid; 522 res->csr_target_highestslotid = tbl->target_highest_slotid; 523 524 status = validate_seqid(tbl, slot, args); 525 if (status) 526 goto out_unlock; 527 if (!nfs4_try_to_lock_slot(tbl, slot)) { 528 status = htonl(NFS4ERR_DELAY); 529 goto out_unlock; 530 } 531 cps->slot = slot; 532 533 /* The ca_maxresponsesize_cached is 0 with no DRC */ 534 if (args->csa_cachethis != 0) { 535 status = htonl(NFS4ERR_REP_TOO_BIG_TO_CACHE); 536 goto out_unlock; 537 } 538 539 /* 540 * Check for pending referring calls. If a match is found, a 541 * related callback was received before the response to the original 542 * call. 543 */ 544 if (referring_call_exists(clp, args->csa_nrclists, args->csa_rclists)) { 545 status = htonl(NFS4ERR_DELAY); 546 goto out_unlock; 547 } 548 549 /* 550 * RFC5661 20.9.3 551 * If CB_SEQUENCE returns an error, then the state of the slot 552 * (sequence ID, cached reply) MUST NOT change. 553 */ 554 slot->seq_nr = args->csa_sequenceid; 555 out_unlock: 556 spin_unlock(&tbl->slot_tbl_lock); 557 558 out: 559 cps->clp = clp; /* put in nfs4_callback_compound */ 560 for (i = 0; i < args->csa_nrclists; i++) 561 kfree(args->csa_rclists[i].rcl_refcalls); 562 kfree(args->csa_rclists); 563 564 if (status == htonl(NFS4ERR_RETRY_UNCACHED_REP)) { 565 cps->drc_status = status; 566 status = 0; 567 } else 568 res->csr_status = status; 569 570 trace_nfs4_cb_sequence(args, res, status); 571 return status; 572 } 573 574 static bool 575 validate_bitmap_values(unsigned long mask) 576 { 577 return (mask & ~RCA4_TYPE_MASK_ALL) == 0; 578 } 579 580 __be32 nfs4_callback_recallany(void *argp, void *resp, 581 struct cb_process_state *cps) 582 { 583 struct cb_recallanyargs *args = argp; 584 __be32 status; 585 fmode_t flags = 0; 586 587 status = cpu_to_be32(NFS4ERR_OP_NOT_IN_SESSION); 588 if (!cps->clp) /* set in cb_sequence */ 589 goto out; 590 591 dprintk_rcu("NFS: RECALL_ANY callback request from %s\n", 592 rpc_peeraddr2str(cps->clp->cl_rpcclient, RPC_DISPLAY_ADDR)); 593 594 status = cpu_to_be32(NFS4ERR_INVAL); 595 if (!validate_bitmap_values(args->craa_type_mask)) 596 goto out; 597 598 status = cpu_to_be32(NFS4_OK); 599 if (test_bit(RCA4_TYPE_MASK_RDATA_DLG, (const unsigned long *) 600 &args->craa_type_mask)) 601 flags = FMODE_READ; 602 if (test_bit(RCA4_TYPE_MASK_WDATA_DLG, (const unsigned long *) 603 &args->craa_type_mask)) 604 flags |= FMODE_WRITE; 605 if (test_bit(RCA4_TYPE_MASK_FILE_LAYOUT, (const unsigned long *) 606 &args->craa_type_mask)) 607 pnfs_recall_all_layouts(cps->clp); 608 if (flags) 609 nfs_expire_unused_delegation_types(cps->clp, flags); 610 out: 611 dprintk("%s: exit with status = %d\n", __func__, ntohl(status)); 612 return status; 613 } 614 615 /* Reduce the fore channel's max_slots to the target value */ 616 __be32 nfs4_callback_recallslot(void *argp, void *resp, 617 struct cb_process_state *cps) 618 { 619 struct cb_recallslotargs *args = argp; 620 struct nfs4_slot_table *fc_tbl; 621 __be32 status; 622 623 status = htonl(NFS4ERR_OP_NOT_IN_SESSION); 624 if (!cps->clp) /* set in cb_sequence */ 625 goto out; 626 627 dprintk_rcu("NFS: CB_RECALL_SLOT request from %s target highest slotid %u\n", 628 rpc_peeraddr2str(cps->clp->cl_rpcclient, RPC_DISPLAY_ADDR), 629 args->crsa_target_highest_slotid); 630 631 fc_tbl = &cps->clp->cl_session->fc_slot_table; 632 633 status = htonl(NFS4_OK); 634 635 nfs41_set_target_slotid(fc_tbl, args->crsa_target_highest_slotid); 636 nfs41_notify_server(cps->clp); 637 out: 638 dprintk("%s: exit with status = %d\n", __func__, ntohl(status)); 639 return status; 640 } 641 642 __be32 nfs4_callback_notify_lock(void *argp, void *resp, 643 struct cb_process_state *cps) 644 { 645 struct cb_notify_lock_args *args = argp; 646 647 if (!cps->clp) /* set in cb_sequence */ 648 return htonl(NFS4ERR_OP_NOT_IN_SESSION); 649 650 dprintk_rcu("NFS: CB_NOTIFY_LOCK request from %s\n", 651 rpc_peeraddr2str(cps->clp->cl_rpcclient, RPC_DISPLAY_ADDR)); 652 653 /* Don't wake anybody if the string looked bogus */ 654 if (args->cbnl_valid) 655 __wake_up(&cps->clp->cl_lock_waitq, TASK_NORMAL, 0, args); 656 657 return htonl(NFS4_OK); 658 } 659 #endif /* CONFIG_NFS_V4_1 */ 660