1 /* 2 * fs/nfs/nfs4proc.c 3 * 4 * Client-side procedure declarations for NFSv4. 5 * 6 * Copyright (c) 2002 The Regents of the University of Michigan. 7 * All rights reserved. 8 * 9 * Kendrick Smith <kmsmith@umich.edu> 10 * Andy Adamson <andros@umich.edu> 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 3. Neither the name of the University nor the names of its 22 * contributors may be used to endorse or promote products derived 23 * from this software without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 26 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 27 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 28 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 32 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 33 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 34 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36 */ 37 38 #include <linux/mm.h> 39 #include <linux/delay.h> 40 #include <linux/errno.h> 41 #include <linux/string.h> 42 #include <linux/ratelimit.h> 43 #include <linux/printk.h> 44 #include <linux/slab.h> 45 #include <linux/sunrpc/clnt.h> 46 #include <linux/nfs.h> 47 #include <linux/nfs4.h> 48 #include <linux/nfs_fs.h> 49 #include <linux/nfs_page.h> 50 #include <linux/nfs_mount.h> 51 #include <linux/namei.h> 52 #include <linux/mount.h> 53 #include <linux/module.h> 54 #include <linux/nfs_idmap.h> 55 #include <linux/xattr.h> 56 #include <linux/utsname.h> 57 #include <linux/freezer.h> 58 59 #include "nfs4_fs.h" 60 #include "delegation.h" 61 #include "internal.h" 62 #include "iostat.h" 63 #include "callback.h" 64 #include "pnfs.h" 65 #include "netns.h" 66 #include "nfs4session.h" 67 #include "fscache.h" 68 69 #include "nfs4trace.h" 70 71 #define NFSDBG_FACILITY NFSDBG_PROC 72 73 #define NFS4_POLL_RETRY_MIN (HZ/10) 74 #define NFS4_POLL_RETRY_MAX (15*HZ) 75 76 struct nfs4_opendata; 77 static int _nfs4_proc_open(struct nfs4_opendata *data); 78 static int _nfs4_recover_proc_open(struct nfs4_opendata *data); 79 static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *); 80 static int nfs4_async_handle_error(struct rpc_task *, const struct nfs_server *, struct nfs4_state *); 81 static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr); 82 static int nfs4_proc_getattr(struct nfs_server *, struct nfs_fh *, struct nfs_fattr *, struct nfs4_label *label); 83 static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr, struct nfs4_label *label); 84 static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred, 85 struct nfs_fattr *fattr, struct iattr *sattr, 86 struct nfs4_state *state, struct nfs4_label *ilabel, 87 struct nfs4_label *olabel); 88 #ifdef CONFIG_NFS_V4_1 89 static int nfs41_test_stateid(struct nfs_server *, nfs4_stateid *, 90 struct rpc_cred *); 91 static int nfs41_free_stateid(struct nfs_server *, nfs4_stateid *, 92 struct rpc_cred *); 93 #endif 94 95 #ifdef CONFIG_NFS_V4_SECURITY_LABEL 96 static inline struct nfs4_label * 97 nfs4_label_init_security(struct inode *dir, struct dentry *dentry, 98 struct iattr *sattr, struct nfs4_label *label) 99 { 100 int err; 101 102 if (label == NULL) 103 return NULL; 104 105 if (nfs_server_capable(dir, NFS_CAP_SECURITY_LABEL) == 0) 106 return NULL; 107 108 err = security_dentry_init_security(dentry, sattr->ia_mode, 109 &dentry->d_name, (void **)&label->label, &label->len); 110 if (err == 0) 111 return label; 112 113 return NULL; 114 } 115 static inline void 116 nfs4_label_release_security(struct nfs4_label *label) 117 { 118 if (label) 119 security_release_secctx(label->label, label->len); 120 } 121 static inline u32 *nfs4_bitmask(struct nfs_server *server, struct nfs4_label *label) 122 { 123 if (label) 124 return server->attr_bitmask; 125 126 return server->attr_bitmask_nl; 127 } 128 #else 129 static inline struct nfs4_label * 130 nfs4_label_init_security(struct inode *dir, struct dentry *dentry, 131 struct iattr *sattr, struct nfs4_label *l) 132 { return NULL; } 133 static inline void 134 nfs4_label_release_security(struct nfs4_label *label) 135 { return; } 136 static inline u32 * 137 nfs4_bitmask(struct nfs_server *server, struct nfs4_label *label) 138 { return server->attr_bitmask; } 139 #endif 140 141 /* Prevent leaks of NFSv4 errors into userland */ 142 static int nfs4_map_errors(int err) 143 { 144 if (err >= -1000) 145 return err; 146 switch (err) { 147 case -NFS4ERR_RESOURCE: 148 case -NFS4ERR_LAYOUTTRYLATER: 149 case -NFS4ERR_RECALLCONFLICT: 150 return -EREMOTEIO; 151 case -NFS4ERR_WRONGSEC: 152 case -NFS4ERR_WRONG_CRED: 153 return -EPERM; 154 case -NFS4ERR_BADOWNER: 155 case -NFS4ERR_BADNAME: 156 return -EINVAL; 157 case -NFS4ERR_SHARE_DENIED: 158 return -EACCES; 159 case -NFS4ERR_MINOR_VERS_MISMATCH: 160 return -EPROTONOSUPPORT; 161 case -NFS4ERR_ACCESS: 162 return -EACCES; 163 case -NFS4ERR_FILE_OPEN: 164 return -EBUSY; 165 default: 166 dprintk("%s could not handle NFSv4 error %d\n", 167 __func__, -err); 168 break; 169 } 170 return -EIO; 171 } 172 173 /* 174 * This is our standard bitmap for GETATTR requests. 175 */ 176 const u32 nfs4_fattr_bitmap[3] = { 177 FATTR4_WORD0_TYPE 178 | FATTR4_WORD0_CHANGE 179 | FATTR4_WORD0_SIZE 180 | FATTR4_WORD0_FSID 181 | FATTR4_WORD0_FILEID, 182 FATTR4_WORD1_MODE 183 | FATTR4_WORD1_NUMLINKS 184 | FATTR4_WORD1_OWNER 185 | FATTR4_WORD1_OWNER_GROUP 186 | FATTR4_WORD1_RAWDEV 187 | FATTR4_WORD1_SPACE_USED 188 | FATTR4_WORD1_TIME_ACCESS 189 | FATTR4_WORD1_TIME_METADATA 190 | FATTR4_WORD1_TIME_MODIFY, 191 #ifdef CONFIG_NFS_V4_SECURITY_LABEL 192 FATTR4_WORD2_SECURITY_LABEL 193 #endif 194 }; 195 196 static const u32 nfs4_pnfs_open_bitmap[3] = { 197 FATTR4_WORD0_TYPE 198 | FATTR4_WORD0_CHANGE 199 | FATTR4_WORD0_SIZE 200 | FATTR4_WORD0_FSID 201 | FATTR4_WORD0_FILEID, 202 FATTR4_WORD1_MODE 203 | FATTR4_WORD1_NUMLINKS 204 | FATTR4_WORD1_OWNER 205 | FATTR4_WORD1_OWNER_GROUP 206 | FATTR4_WORD1_RAWDEV 207 | FATTR4_WORD1_SPACE_USED 208 | FATTR4_WORD1_TIME_ACCESS 209 | FATTR4_WORD1_TIME_METADATA 210 | FATTR4_WORD1_TIME_MODIFY, 211 FATTR4_WORD2_MDSTHRESHOLD 212 }; 213 214 static const u32 nfs4_open_noattr_bitmap[3] = { 215 FATTR4_WORD0_TYPE 216 | FATTR4_WORD0_CHANGE 217 | FATTR4_WORD0_FILEID, 218 }; 219 220 const u32 nfs4_statfs_bitmap[3] = { 221 FATTR4_WORD0_FILES_AVAIL 222 | FATTR4_WORD0_FILES_FREE 223 | FATTR4_WORD0_FILES_TOTAL, 224 FATTR4_WORD1_SPACE_AVAIL 225 | FATTR4_WORD1_SPACE_FREE 226 | FATTR4_WORD1_SPACE_TOTAL 227 }; 228 229 const u32 nfs4_pathconf_bitmap[3] = { 230 FATTR4_WORD0_MAXLINK 231 | FATTR4_WORD0_MAXNAME, 232 0 233 }; 234 235 const u32 nfs4_fsinfo_bitmap[3] = { FATTR4_WORD0_MAXFILESIZE 236 | FATTR4_WORD0_MAXREAD 237 | FATTR4_WORD0_MAXWRITE 238 | FATTR4_WORD0_LEASE_TIME, 239 FATTR4_WORD1_TIME_DELTA 240 | FATTR4_WORD1_FS_LAYOUT_TYPES, 241 FATTR4_WORD2_LAYOUT_BLKSIZE 242 }; 243 244 const u32 nfs4_fs_locations_bitmap[3] = { 245 FATTR4_WORD0_TYPE 246 | FATTR4_WORD0_CHANGE 247 | FATTR4_WORD0_SIZE 248 | FATTR4_WORD0_FSID 249 | FATTR4_WORD0_FILEID 250 | FATTR4_WORD0_FS_LOCATIONS, 251 FATTR4_WORD1_MODE 252 | FATTR4_WORD1_NUMLINKS 253 | FATTR4_WORD1_OWNER 254 | FATTR4_WORD1_OWNER_GROUP 255 | FATTR4_WORD1_RAWDEV 256 | FATTR4_WORD1_SPACE_USED 257 | FATTR4_WORD1_TIME_ACCESS 258 | FATTR4_WORD1_TIME_METADATA 259 | FATTR4_WORD1_TIME_MODIFY 260 | FATTR4_WORD1_MOUNTED_ON_FILEID, 261 }; 262 263 static void nfs4_setup_readdir(u64 cookie, __be32 *verifier, struct dentry *dentry, 264 struct nfs4_readdir_arg *readdir) 265 { 266 __be32 *start, *p; 267 268 if (cookie > 2) { 269 readdir->cookie = cookie; 270 memcpy(&readdir->verifier, verifier, sizeof(readdir->verifier)); 271 return; 272 } 273 274 readdir->cookie = 0; 275 memset(&readdir->verifier, 0, sizeof(readdir->verifier)); 276 if (cookie == 2) 277 return; 278 279 /* 280 * NFSv4 servers do not return entries for '.' and '..' 281 * Therefore, we fake these entries here. We let '.' 282 * have cookie 0 and '..' have cookie 1. Note that 283 * when talking to the server, we always send cookie 0 284 * instead of 1 or 2. 285 */ 286 start = p = kmap_atomic(*readdir->pages); 287 288 if (cookie == 0) { 289 *p++ = xdr_one; /* next */ 290 *p++ = xdr_zero; /* cookie, first word */ 291 *p++ = xdr_one; /* cookie, second word */ 292 *p++ = xdr_one; /* entry len */ 293 memcpy(p, ".\0\0\0", 4); /* entry */ 294 p++; 295 *p++ = xdr_one; /* bitmap length */ 296 *p++ = htonl(FATTR4_WORD0_FILEID); /* bitmap */ 297 *p++ = htonl(8); /* attribute buffer length */ 298 p = xdr_encode_hyper(p, NFS_FILEID(dentry->d_inode)); 299 } 300 301 *p++ = xdr_one; /* next */ 302 *p++ = xdr_zero; /* cookie, first word */ 303 *p++ = xdr_two; /* cookie, second word */ 304 *p++ = xdr_two; /* entry len */ 305 memcpy(p, "..\0\0", 4); /* entry */ 306 p++; 307 *p++ = xdr_one; /* bitmap length */ 308 *p++ = htonl(FATTR4_WORD0_FILEID); /* bitmap */ 309 *p++ = htonl(8); /* attribute buffer length */ 310 p = xdr_encode_hyper(p, NFS_FILEID(dentry->d_parent->d_inode)); 311 312 readdir->pgbase = (char *)p - (char *)start; 313 readdir->count -= readdir->pgbase; 314 kunmap_atomic(start); 315 } 316 317 static int nfs4_delay(struct rpc_clnt *clnt, long *timeout) 318 { 319 int res = 0; 320 321 might_sleep(); 322 323 if (*timeout <= 0) 324 *timeout = NFS4_POLL_RETRY_MIN; 325 if (*timeout > NFS4_POLL_RETRY_MAX) 326 *timeout = NFS4_POLL_RETRY_MAX; 327 freezable_schedule_timeout_killable_unsafe(*timeout); 328 if (fatal_signal_pending(current)) 329 res = -ERESTARTSYS; 330 *timeout <<= 1; 331 return res; 332 } 333 334 /* This is the error handling routine for processes that are allowed 335 * to sleep. 336 */ 337 static int nfs4_handle_exception(struct nfs_server *server, int errorcode, struct nfs4_exception *exception) 338 { 339 struct nfs_client *clp = server->nfs_client; 340 struct nfs4_state *state = exception->state; 341 struct inode *inode = exception->inode; 342 int ret = errorcode; 343 344 exception->retry = 0; 345 switch(errorcode) { 346 case 0: 347 return 0; 348 case -NFS4ERR_OPENMODE: 349 if (inode && nfs4_have_delegation(inode, FMODE_READ)) { 350 nfs4_inode_return_delegation(inode); 351 exception->retry = 1; 352 return 0; 353 } 354 if (state == NULL) 355 break; 356 ret = nfs4_schedule_stateid_recovery(server, state); 357 if (ret < 0) 358 break; 359 goto wait_on_recovery; 360 case -NFS4ERR_DELEG_REVOKED: 361 case -NFS4ERR_ADMIN_REVOKED: 362 case -NFS4ERR_BAD_STATEID: 363 if (inode != NULL && nfs4_have_delegation(inode, FMODE_READ)) { 364 nfs_remove_bad_delegation(inode); 365 exception->retry = 1; 366 break; 367 } 368 if (state == NULL) 369 break; 370 ret = nfs4_schedule_stateid_recovery(server, state); 371 if (ret < 0) 372 break; 373 goto wait_on_recovery; 374 case -NFS4ERR_EXPIRED: 375 if (state != NULL) { 376 ret = nfs4_schedule_stateid_recovery(server, state); 377 if (ret < 0) 378 break; 379 } 380 case -NFS4ERR_STALE_STATEID: 381 case -NFS4ERR_STALE_CLIENTID: 382 nfs4_schedule_lease_recovery(clp); 383 goto wait_on_recovery; 384 case -NFS4ERR_MOVED: 385 ret = nfs4_schedule_migration_recovery(server); 386 if (ret < 0) 387 break; 388 goto wait_on_recovery; 389 case -NFS4ERR_LEASE_MOVED: 390 nfs4_schedule_lease_moved_recovery(clp); 391 goto wait_on_recovery; 392 #if defined(CONFIG_NFS_V4_1) 393 case -NFS4ERR_BADSESSION: 394 case -NFS4ERR_BADSLOT: 395 case -NFS4ERR_BAD_HIGH_SLOT: 396 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: 397 case -NFS4ERR_DEADSESSION: 398 case -NFS4ERR_SEQ_FALSE_RETRY: 399 case -NFS4ERR_SEQ_MISORDERED: 400 dprintk("%s ERROR: %d Reset session\n", __func__, 401 errorcode); 402 nfs4_schedule_session_recovery(clp->cl_session, errorcode); 403 goto wait_on_recovery; 404 #endif /* defined(CONFIG_NFS_V4_1) */ 405 case -NFS4ERR_FILE_OPEN: 406 if (exception->timeout > HZ) { 407 /* We have retried a decent amount, time to 408 * fail 409 */ 410 ret = -EBUSY; 411 break; 412 } 413 case -NFS4ERR_GRACE: 414 case -NFS4ERR_DELAY: 415 ret = nfs4_delay(server->client, &exception->timeout); 416 if (ret != 0) 417 break; 418 case -NFS4ERR_RETRY_UNCACHED_REP: 419 case -NFS4ERR_OLD_STATEID: 420 exception->retry = 1; 421 break; 422 case -NFS4ERR_BADOWNER: 423 /* The following works around a Linux server bug! */ 424 case -NFS4ERR_BADNAME: 425 if (server->caps & NFS_CAP_UIDGID_NOMAP) { 426 server->caps &= ~NFS_CAP_UIDGID_NOMAP; 427 exception->retry = 1; 428 printk(KERN_WARNING "NFS: v4 server %s " 429 "does not accept raw " 430 "uid/gids. " 431 "Reenabling the idmapper.\n", 432 server->nfs_client->cl_hostname); 433 } 434 } 435 /* We failed to handle the error */ 436 return nfs4_map_errors(ret); 437 wait_on_recovery: 438 ret = nfs4_wait_clnt_recover(clp); 439 if (test_bit(NFS_MIG_FAILED, &server->mig_status)) 440 return -EIO; 441 if (ret == 0) 442 exception->retry = 1; 443 return ret; 444 } 445 446 /* 447 * Return 'true' if 'clp' is using an rpc_client that is integrity protected 448 * or 'false' otherwise. 449 */ 450 static bool _nfs4_is_integrity_protected(struct nfs_client *clp) 451 { 452 rpc_authflavor_t flavor = clp->cl_rpcclient->cl_auth->au_flavor; 453 454 if (flavor == RPC_AUTH_GSS_KRB5I || 455 flavor == RPC_AUTH_GSS_KRB5P) 456 return true; 457 458 return false; 459 } 460 461 static void do_renew_lease(struct nfs_client *clp, unsigned long timestamp) 462 { 463 spin_lock(&clp->cl_lock); 464 if (time_before(clp->cl_last_renewal,timestamp)) 465 clp->cl_last_renewal = timestamp; 466 spin_unlock(&clp->cl_lock); 467 } 468 469 static void renew_lease(const struct nfs_server *server, unsigned long timestamp) 470 { 471 do_renew_lease(server->nfs_client, timestamp); 472 } 473 474 struct nfs4_call_sync_data { 475 const struct nfs_server *seq_server; 476 struct nfs4_sequence_args *seq_args; 477 struct nfs4_sequence_res *seq_res; 478 }; 479 480 static void nfs4_init_sequence(struct nfs4_sequence_args *args, 481 struct nfs4_sequence_res *res, int cache_reply) 482 { 483 args->sa_slot = NULL; 484 args->sa_cache_this = cache_reply; 485 args->sa_privileged = 0; 486 487 res->sr_slot = NULL; 488 } 489 490 static void nfs4_set_sequence_privileged(struct nfs4_sequence_args *args) 491 { 492 args->sa_privileged = 1; 493 } 494 495 static int nfs40_setup_sequence(const struct nfs_server *server, 496 struct nfs4_sequence_args *args, 497 struct nfs4_sequence_res *res, 498 struct rpc_task *task) 499 { 500 struct nfs4_slot_table *tbl = server->nfs_client->cl_slot_tbl; 501 struct nfs4_slot *slot; 502 503 /* slot already allocated? */ 504 if (res->sr_slot != NULL) 505 goto out_start; 506 507 spin_lock(&tbl->slot_tbl_lock); 508 if (nfs4_slot_tbl_draining(tbl) && !args->sa_privileged) 509 goto out_sleep; 510 511 slot = nfs4_alloc_slot(tbl); 512 if (IS_ERR(slot)) { 513 if (slot == ERR_PTR(-ENOMEM)) 514 task->tk_timeout = HZ >> 2; 515 goto out_sleep; 516 } 517 spin_unlock(&tbl->slot_tbl_lock); 518 519 args->sa_slot = slot; 520 res->sr_slot = slot; 521 522 out_start: 523 rpc_call_start(task); 524 return 0; 525 526 out_sleep: 527 if (args->sa_privileged) 528 rpc_sleep_on_priority(&tbl->slot_tbl_waitq, task, 529 NULL, RPC_PRIORITY_PRIVILEGED); 530 else 531 rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL); 532 spin_unlock(&tbl->slot_tbl_lock); 533 return -EAGAIN; 534 } 535 536 static int nfs40_sequence_done(struct rpc_task *task, 537 struct nfs4_sequence_res *res) 538 { 539 struct nfs4_slot *slot = res->sr_slot; 540 struct nfs4_slot_table *tbl; 541 542 if (slot == NULL) 543 goto out; 544 545 tbl = slot->table; 546 spin_lock(&tbl->slot_tbl_lock); 547 if (!nfs41_wake_and_assign_slot(tbl, slot)) 548 nfs4_free_slot(tbl, slot); 549 spin_unlock(&tbl->slot_tbl_lock); 550 551 res->sr_slot = NULL; 552 out: 553 return 1; 554 } 555 556 #if defined(CONFIG_NFS_V4_1) 557 558 static void nfs41_sequence_free_slot(struct nfs4_sequence_res *res) 559 { 560 struct nfs4_session *session; 561 struct nfs4_slot_table *tbl; 562 struct nfs4_slot *slot = res->sr_slot; 563 bool send_new_highest_used_slotid = false; 564 565 tbl = slot->table; 566 session = tbl->session; 567 568 spin_lock(&tbl->slot_tbl_lock); 569 /* Be nice to the server: try to ensure that the last transmitted 570 * value for highest_user_slotid <= target_highest_slotid 571 */ 572 if (tbl->highest_used_slotid > tbl->target_highest_slotid) 573 send_new_highest_used_slotid = true; 574 575 if (nfs41_wake_and_assign_slot(tbl, slot)) { 576 send_new_highest_used_slotid = false; 577 goto out_unlock; 578 } 579 nfs4_free_slot(tbl, slot); 580 581 if (tbl->highest_used_slotid != NFS4_NO_SLOT) 582 send_new_highest_used_slotid = false; 583 out_unlock: 584 spin_unlock(&tbl->slot_tbl_lock); 585 res->sr_slot = NULL; 586 if (send_new_highest_used_slotid) 587 nfs41_server_notify_highest_slotid_update(session->clp); 588 } 589 590 int nfs41_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *res) 591 { 592 struct nfs4_session *session; 593 struct nfs4_slot *slot = res->sr_slot; 594 struct nfs_client *clp; 595 bool interrupted = false; 596 int ret = 1; 597 598 if (slot == NULL) 599 goto out_noaction; 600 /* don't increment the sequence number if the task wasn't sent */ 601 if (!RPC_WAS_SENT(task)) 602 goto out; 603 604 session = slot->table->session; 605 606 if (slot->interrupted) { 607 slot->interrupted = 0; 608 interrupted = true; 609 } 610 611 trace_nfs4_sequence_done(session, res); 612 /* Check the SEQUENCE operation status */ 613 switch (res->sr_status) { 614 case 0: 615 /* Update the slot's sequence and clientid lease timer */ 616 ++slot->seq_nr; 617 clp = session->clp; 618 do_renew_lease(clp, res->sr_timestamp); 619 /* Check sequence flags */ 620 if (res->sr_status_flags != 0) 621 nfs4_schedule_lease_recovery(clp); 622 nfs41_update_target_slotid(slot->table, slot, res); 623 break; 624 case 1: 625 /* 626 * sr_status remains 1 if an RPC level error occurred. 627 * The server may or may not have processed the sequence 628 * operation.. 629 * Mark the slot as having hosted an interrupted RPC call. 630 */ 631 slot->interrupted = 1; 632 goto out; 633 case -NFS4ERR_DELAY: 634 /* The server detected a resend of the RPC call and 635 * returned NFS4ERR_DELAY as per Section 2.10.6.2 636 * of RFC5661. 637 */ 638 dprintk("%s: slot=%u seq=%u: Operation in progress\n", 639 __func__, 640 slot->slot_nr, 641 slot->seq_nr); 642 goto out_retry; 643 case -NFS4ERR_BADSLOT: 644 /* 645 * The slot id we used was probably retired. Try again 646 * using a different slot id. 647 */ 648 goto retry_nowait; 649 case -NFS4ERR_SEQ_MISORDERED: 650 /* 651 * Was the last operation on this sequence interrupted? 652 * If so, retry after bumping the sequence number. 653 */ 654 if (interrupted) { 655 ++slot->seq_nr; 656 goto retry_nowait; 657 } 658 /* 659 * Could this slot have been previously retired? 660 * If so, then the server may be expecting seq_nr = 1! 661 */ 662 if (slot->seq_nr != 1) { 663 slot->seq_nr = 1; 664 goto retry_nowait; 665 } 666 break; 667 case -NFS4ERR_SEQ_FALSE_RETRY: 668 ++slot->seq_nr; 669 goto retry_nowait; 670 default: 671 /* Just update the slot sequence no. */ 672 ++slot->seq_nr; 673 } 674 out: 675 /* The session may be reset by one of the error handlers. */ 676 dprintk("%s: Error %d free the slot \n", __func__, res->sr_status); 677 nfs41_sequence_free_slot(res); 678 out_noaction: 679 return ret; 680 retry_nowait: 681 if (rpc_restart_call_prepare(task)) { 682 task->tk_status = 0; 683 ret = 0; 684 } 685 goto out; 686 out_retry: 687 if (!rpc_restart_call(task)) 688 goto out; 689 rpc_delay(task, NFS4_POLL_RETRY_MAX); 690 return 0; 691 } 692 EXPORT_SYMBOL_GPL(nfs41_sequence_done); 693 694 static int nfs4_sequence_done(struct rpc_task *task, 695 struct nfs4_sequence_res *res) 696 { 697 if (res->sr_slot == NULL) 698 return 1; 699 if (!res->sr_slot->table->session) 700 return nfs40_sequence_done(task, res); 701 return nfs41_sequence_done(task, res); 702 } 703 704 int nfs41_setup_sequence(struct nfs4_session *session, 705 struct nfs4_sequence_args *args, 706 struct nfs4_sequence_res *res, 707 struct rpc_task *task) 708 { 709 struct nfs4_slot *slot; 710 struct nfs4_slot_table *tbl; 711 712 dprintk("--> %s\n", __func__); 713 /* slot already allocated? */ 714 if (res->sr_slot != NULL) 715 goto out_success; 716 717 tbl = &session->fc_slot_table; 718 719 task->tk_timeout = 0; 720 721 spin_lock(&tbl->slot_tbl_lock); 722 if (test_bit(NFS4_SLOT_TBL_DRAINING, &tbl->slot_tbl_state) && 723 !args->sa_privileged) { 724 /* The state manager will wait until the slot table is empty */ 725 dprintk("%s session is draining\n", __func__); 726 goto out_sleep; 727 } 728 729 slot = nfs4_alloc_slot(tbl); 730 if (IS_ERR(slot)) { 731 /* If out of memory, try again in 1/4 second */ 732 if (slot == ERR_PTR(-ENOMEM)) 733 task->tk_timeout = HZ >> 2; 734 dprintk("<-- %s: no free slots\n", __func__); 735 goto out_sleep; 736 } 737 spin_unlock(&tbl->slot_tbl_lock); 738 739 args->sa_slot = slot; 740 741 dprintk("<-- %s slotid=%u seqid=%u\n", __func__, 742 slot->slot_nr, slot->seq_nr); 743 744 res->sr_slot = slot; 745 res->sr_timestamp = jiffies; 746 res->sr_status_flags = 0; 747 /* 748 * sr_status is only set in decode_sequence, and so will remain 749 * set to 1 if an rpc level failure occurs. 750 */ 751 res->sr_status = 1; 752 trace_nfs4_setup_sequence(session, args); 753 out_success: 754 rpc_call_start(task); 755 return 0; 756 out_sleep: 757 /* Privileged tasks are queued with top priority */ 758 if (args->sa_privileged) 759 rpc_sleep_on_priority(&tbl->slot_tbl_waitq, task, 760 NULL, RPC_PRIORITY_PRIVILEGED); 761 else 762 rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL); 763 spin_unlock(&tbl->slot_tbl_lock); 764 return -EAGAIN; 765 } 766 EXPORT_SYMBOL_GPL(nfs41_setup_sequence); 767 768 static int nfs4_setup_sequence(const struct nfs_server *server, 769 struct nfs4_sequence_args *args, 770 struct nfs4_sequence_res *res, 771 struct rpc_task *task) 772 { 773 struct nfs4_session *session = nfs4_get_session(server); 774 int ret = 0; 775 776 if (!session) 777 return nfs40_setup_sequence(server, args, res, task); 778 779 dprintk("--> %s clp %p session %p sr_slot %u\n", 780 __func__, session->clp, session, res->sr_slot ? 781 res->sr_slot->slot_nr : NFS4_NO_SLOT); 782 783 ret = nfs41_setup_sequence(session, args, res, task); 784 785 dprintk("<-- %s status=%d\n", __func__, ret); 786 return ret; 787 } 788 789 static void nfs41_call_sync_prepare(struct rpc_task *task, void *calldata) 790 { 791 struct nfs4_call_sync_data *data = calldata; 792 struct nfs4_session *session = nfs4_get_session(data->seq_server); 793 794 dprintk("--> %s data->seq_server %p\n", __func__, data->seq_server); 795 796 nfs41_setup_sequence(session, data->seq_args, data->seq_res, task); 797 } 798 799 static void nfs41_call_sync_done(struct rpc_task *task, void *calldata) 800 { 801 struct nfs4_call_sync_data *data = calldata; 802 803 nfs41_sequence_done(task, data->seq_res); 804 } 805 806 static const struct rpc_call_ops nfs41_call_sync_ops = { 807 .rpc_call_prepare = nfs41_call_sync_prepare, 808 .rpc_call_done = nfs41_call_sync_done, 809 }; 810 811 #else /* !CONFIG_NFS_V4_1 */ 812 813 static int nfs4_setup_sequence(const struct nfs_server *server, 814 struct nfs4_sequence_args *args, 815 struct nfs4_sequence_res *res, 816 struct rpc_task *task) 817 { 818 return nfs40_setup_sequence(server, args, res, task); 819 } 820 821 static int nfs4_sequence_done(struct rpc_task *task, 822 struct nfs4_sequence_res *res) 823 { 824 return nfs40_sequence_done(task, res); 825 } 826 827 #endif /* !CONFIG_NFS_V4_1 */ 828 829 static void nfs40_call_sync_prepare(struct rpc_task *task, void *calldata) 830 { 831 struct nfs4_call_sync_data *data = calldata; 832 nfs4_setup_sequence(data->seq_server, 833 data->seq_args, data->seq_res, task); 834 } 835 836 static void nfs40_call_sync_done(struct rpc_task *task, void *calldata) 837 { 838 struct nfs4_call_sync_data *data = calldata; 839 nfs4_sequence_done(task, data->seq_res); 840 } 841 842 static const struct rpc_call_ops nfs40_call_sync_ops = { 843 .rpc_call_prepare = nfs40_call_sync_prepare, 844 .rpc_call_done = nfs40_call_sync_done, 845 }; 846 847 static int nfs4_call_sync_sequence(struct rpc_clnt *clnt, 848 struct nfs_server *server, 849 struct rpc_message *msg, 850 struct nfs4_sequence_args *args, 851 struct nfs4_sequence_res *res) 852 { 853 int ret; 854 struct rpc_task *task; 855 struct nfs_client *clp = server->nfs_client; 856 struct nfs4_call_sync_data data = { 857 .seq_server = server, 858 .seq_args = args, 859 .seq_res = res, 860 }; 861 struct rpc_task_setup task_setup = { 862 .rpc_client = clnt, 863 .rpc_message = msg, 864 .callback_ops = clp->cl_mvops->call_sync_ops, 865 .callback_data = &data 866 }; 867 868 task = rpc_run_task(&task_setup); 869 if (IS_ERR(task)) 870 ret = PTR_ERR(task); 871 else { 872 ret = task->tk_status; 873 rpc_put_task(task); 874 } 875 return ret; 876 } 877 878 static 879 int nfs4_call_sync(struct rpc_clnt *clnt, 880 struct nfs_server *server, 881 struct rpc_message *msg, 882 struct nfs4_sequence_args *args, 883 struct nfs4_sequence_res *res, 884 int cache_reply) 885 { 886 nfs4_init_sequence(args, res, cache_reply); 887 return nfs4_call_sync_sequence(clnt, server, msg, args, res); 888 } 889 890 static void update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo) 891 { 892 struct nfs_inode *nfsi = NFS_I(dir); 893 894 spin_lock(&dir->i_lock); 895 nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA; 896 if (!cinfo->atomic || cinfo->before != dir->i_version) 897 nfs_force_lookup_revalidate(dir); 898 dir->i_version = cinfo->after; 899 nfs_fscache_invalidate(dir); 900 spin_unlock(&dir->i_lock); 901 } 902 903 struct nfs4_opendata { 904 struct kref kref; 905 struct nfs_openargs o_arg; 906 struct nfs_openres o_res; 907 struct nfs_open_confirmargs c_arg; 908 struct nfs_open_confirmres c_res; 909 struct nfs4_string owner_name; 910 struct nfs4_string group_name; 911 struct nfs_fattr f_attr; 912 struct nfs4_label *f_label; 913 struct dentry *dir; 914 struct dentry *dentry; 915 struct nfs4_state_owner *owner; 916 struct nfs4_state *state; 917 struct iattr attrs; 918 unsigned long timestamp; 919 unsigned int rpc_done : 1; 920 unsigned int file_created : 1; 921 unsigned int is_recover : 1; 922 int rpc_status; 923 int cancelled; 924 }; 925 926 static bool nfs4_clear_cap_atomic_open_v1(struct nfs_server *server, 927 int err, struct nfs4_exception *exception) 928 { 929 if (err != -EINVAL) 930 return false; 931 if (!(server->caps & NFS_CAP_ATOMIC_OPEN_V1)) 932 return false; 933 server->caps &= ~NFS_CAP_ATOMIC_OPEN_V1; 934 exception->retry = 1; 935 return true; 936 } 937 938 static enum open_claim_type4 939 nfs4_map_atomic_open_claim(struct nfs_server *server, 940 enum open_claim_type4 claim) 941 { 942 if (server->caps & NFS_CAP_ATOMIC_OPEN_V1) 943 return claim; 944 switch (claim) { 945 default: 946 return claim; 947 case NFS4_OPEN_CLAIM_FH: 948 return NFS4_OPEN_CLAIM_NULL; 949 case NFS4_OPEN_CLAIM_DELEG_CUR_FH: 950 return NFS4_OPEN_CLAIM_DELEGATE_CUR; 951 case NFS4_OPEN_CLAIM_DELEG_PREV_FH: 952 return NFS4_OPEN_CLAIM_DELEGATE_PREV; 953 } 954 } 955 956 static void nfs4_init_opendata_res(struct nfs4_opendata *p) 957 { 958 p->o_res.f_attr = &p->f_attr; 959 p->o_res.f_label = p->f_label; 960 p->o_res.seqid = p->o_arg.seqid; 961 p->c_res.seqid = p->c_arg.seqid; 962 p->o_res.server = p->o_arg.server; 963 p->o_res.access_request = p->o_arg.access; 964 nfs_fattr_init(&p->f_attr); 965 nfs_fattr_init_names(&p->f_attr, &p->owner_name, &p->group_name); 966 } 967 968 static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry, 969 struct nfs4_state_owner *sp, fmode_t fmode, int flags, 970 const struct iattr *attrs, 971 struct nfs4_label *label, 972 enum open_claim_type4 claim, 973 gfp_t gfp_mask) 974 { 975 struct dentry *parent = dget_parent(dentry); 976 struct inode *dir = parent->d_inode; 977 struct nfs_server *server = NFS_SERVER(dir); 978 struct nfs4_opendata *p; 979 980 p = kzalloc(sizeof(*p), gfp_mask); 981 if (p == NULL) 982 goto err; 983 984 p->f_label = nfs4_label_alloc(server, gfp_mask); 985 if (IS_ERR(p->f_label)) 986 goto err_free_p; 987 988 p->o_arg.seqid = nfs_alloc_seqid(&sp->so_seqid, gfp_mask); 989 if (p->o_arg.seqid == NULL) 990 goto err_free_label; 991 nfs_sb_active(dentry->d_sb); 992 p->dentry = dget(dentry); 993 p->dir = parent; 994 p->owner = sp; 995 atomic_inc(&sp->so_count); 996 p->o_arg.open_flags = flags; 997 p->o_arg.fmode = fmode & (FMODE_READ|FMODE_WRITE); 998 /* don't put an ACCESS op in OPEN compound if O_EXCL, because ACCESS 999 * will return permission denied for all bits until close */ 1000 if (!(flags & O_EXCL)) { 1001 /* ask server to check for all possible rights as results 1002 * are cached */ 1003 p->o_arg.access = NFS4_ACCESS_READ | NFS4_ACCESS_MODIFY | 1004 NFS4_ACCESS_EXTEND | NFS4_ACCESS_EXECUTE; 1005 } 1006 p->o_arg.clientid = server->nfs_client->cl_clientid; 1007 p->o_arg.id.create_time = ktime_to_ns(sp->so_seqid.create_time); 1008 p->o_arg.id.uniquifier = sp->so_seqid.owner_id; 1009 p->o_arg.name = &dentry->d_name; 1010 p->o_arg.server = server; 1011 p->o_arg.bitmask = nfs4_bitmask(server, label); 1012 p->o_arg.open_bitmap = &nfs4_fattr_bitmap[0]; 1013 p->o_arg.label = label; 1014 p->o_arg.claim = nfs4_map_atomic_open_claim(server, claim); 1015 switch (p->o_arg.claim) { 1016 case NFS4_OPEN_CLAIM_NULL: 1017 case NFS4_OPEN_CLAIM_DELEGATE_CUR: 1018 case NFS4_OPEN_CLAIM_DELEGATE_PREV: 1019 p->o_arg.fh = NFS_FH(dir); 1020 break; 1021 case NFS4_OPEN_CLAIM_PREVIOUS: 1022 case NFS4_OPEN_CLAIM_FH: 1023 case NFS4_OPEN_CLAIM_DELEG_CUR_FH: 1024 case NFS4_OPEN_CLAIM_DELEG_PREV_FH: 1025 p->o_arg.fh = NFS_FH(dentry->d_inode); 1026 } 1027 if (attrs != NULL && attrs->ia_valid != 0) { 1028 __u32 verf[2]; 1029 1030 p->o_arg.u.attrs = &p->attrs; 1031 memcpy(&p->attrs, attrs, sizeof(p->attrs)); 1032 1033 verf[0] = jiffies; 1034 verf[1] = current->pid; 1035 memcpy(p->o_arg.u.verifier.data, verf, 1036 sizeof(p->o_arg.u.verifier.data)); 1037 } 1038 p->c_arg.fh = &p->o_res.fh; 1039 p->c_arg.stateid = &p->o_res.stateid; 1040 p->c_arg.seqid = p->o_arg.seqid; 1041 nfs4_init_opendata_res(p); 1042 kref_init(&p->kref); 1043 return p; 1044 1045 err_free_label: 1046 nfs4_label_free(p->f_label); 1047 err_free_p: 1048 kfree(p); 1049 err: 1050 dput(parent); 1051 return NULL; 1052 } 1053 1054 static void nfs4_opendata_free(struct kref *kref) 1055 { 1056 struct nfs4_opendata *p = container_of(kref, 1057 struct nfs4_opendata, kref); 1058 struct super_block *sb = p->dentry->d_sb; 1059 1060 nfs_free_seqid(p->o_arg.seqid); 1061 if (p->state != NULL) 1062 nfs4_put_open_state(p->state); 1063 nfs4_put_state_owner(p->owner); 1064 1065 nfs4_label_free(p->f_label); 1066 1067 dput(p->dir); 1068 dput(p->dentry); 1069 nfs_sb_deactive(sb); 1070 nfs_fattr_free_names(&p->f_attr); 1071 kfree(p->f_attr.mdsthreshold); 1072 kfree(p); 1073 } 1074 1075 static void nfs4_opendata_put(struct nfs4_opendata *p) 1076 { 1077 if (p != NULL) 1078 kref_put(&p->kref, nfs4_opendata_free); 1079 } 1080 1081 static int nfs4_wait_for_completion_rpc_task(struct rpc_task *task) 1082 { 1083 int ret; 1084 1085 ret = rpc_wait_for_completion_task(task); 1086 return ret; 1087 } 1088 1089 static int can_open_cached(struct nfs4_state *state, fmode_t mode, int open_mode) 1090 { 1091 int ret = 0; 1092 1093 if (open_mode & (O_EXCL|O_TRUNC)) 1094 goto out; 1095 switch (mode & (FMODE_READ|FMODE_WRITE)) { 1096 case FMODE_READ: 1097 ret |= test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0 1098 && state->n_rdonly != 0; 1099 break; 1100 case FMODE_WRITE: 1101 ret |= test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0 1102 && state->n_wronly != 0; 1103 break; 1104 case FMODE_READ|FMODE_WRITE: 1105 ret |= test_bit(NFS_O_RDWR_STATE, &state->flags) != 0 1106 && state->n_rdwr != 0; 1107 } 1108 out: 1109 return ret; 1110 } 1111 1112 static int can_open_delegated(struct nfs_delegation *delegation, fmode_t fmode) 1113 { 1114 if (delegation == NULL) 1115 return 0; 1116 if ((delegation->type & fmode) != fmode) 1117 return 0; 1118 if (test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags)) 1119 return 0; 1120 if (test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) 1121 return 0; 1122 nfs_mark_delegation_referenced(delegation); 1123 return 1; 1124 } 1125 1126 static void update_open_stateflags(struct nfs4_state *state, fmode_t fmode) 1127 { 1128 switch (fmode) { 1129 case FMODE_WRITE: 1130 state->n_wronly++; 1131 break; 1132 case FMODE_READ: 1133 state->n_rdonly++; 1134 break; 1135 case FMODE_READ|FMODE_WRITE: 1136 state->n_rdwr++; 1137 } 1138 nfs4_state_set_mode_locked(state, state->state | fmode); 1139 } 1140 1141 static void nfs_test_and_clear_all_open_stateid(struct nfs4_state *state) 1142 { 1143 struct nfs_client *clp = state->owner->so_server->nfs_client; 1144 bool need_recover = false; 1145 1146 if (test_and_clear_bit(NFS_O_RDONLY_STATE, &state->flags) && state->n_rdonly) 1147 need_recover = true; 1148 if (test_and_clear_bit(NFS_O_WRONLY_STATE, &state->flags) && state->n_wronly) 1149 need_recover = true; 1150 if (test_and_clear_bit(NFS_O_RDWR_STATE, &state->flags) && state->n_rdwr) 1151 need_recover = true; 1152 if (need_recover) 1153 nfs4_state_mark_reclaim_nograce(clp, state); 1154 } 1155 1156 static bool nfs_need_update_open_stateid(struct nfs4_state *state, 1157 nfs4_stateid *stateid) 1158 { 1159 if (test_and_set_bit(NFS_OPEN_STATE, &state->flags) == 0) 1160 return true; 1161 if (!nfs4_stateid_match_other(stateid, &state->open_stateid)) { 1162 nfs_test_and_clear_all_open_stateid(state); 1163 return true; 1164 } 1165 if (nfs4_stateid_is_newer(stateid, &state->open_stateid)) 1166 return true; 1167 return false; 1168 } 1169 1170 static void nfs_clear_open_stateid_locked(struct nfs4_state *state, 1171 nfs4_stateid *stateid, fmode_t fmode) 1172 { 1173 clear_bit(NFS_O_RDWR_STATE, &state->flags); 1174 switch (fmode & (FMODE_READ|FMODE_WRITE)) { 1175 case FMODE_WRITE: 1176 clear_bit(NFS_O_RDONLY_STATE, &state->flags); 1177 break; 1178 case FMODE_READ: 1179 clear_bit(NFS_O_WRONLY_STATE, &state->flags); 1180 break; 1181 case 0: 1182 clear_bit(NFS_O_RDONLY_STATE, &state->flags); 1183 clear_bit(NFS_O_WRONLY_STATE, &state->flags); 1184 clear_bit(NFS_OPEN_STATE, &state->flags); 1185 } 1186 if (stateid == NULL) 1187 return; 1188 if (!nfs_need_update_open_stateid(state, stateid)) 1189 return; 1190 if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0) 1191 nfs4_stateid_copy(&state->stateid, stateid); 1192 nfs4_stateid_copy(&state->open_stateid, stateid); 1193 } 1194 1195 static void nfs_clear_open_stateid(struct nfs4_state *state, nfs4_stateid *stateid, fmode_t fmode) 1196 { 1197 write_seqlock(&state->seqlock); 1198 nfs_clear_open_stateid_locked(state, stateid, fmode); 1199 write_sequnlock(&state->seqlock); 1200 if (test_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags)) 1201 nfs4_schedule_state_manager(state->owner->so_server->nfs_client); 1202 } 1203 1204 static void nfs_set_open_stateid_locked(struct nfs4_state *state, nfs4_stateid *stateid, fmode_t fmode) 1205 { 1206 switch (fmode) { 1207 case FMODE_READ: 1208 set_bit(NFS_O_RDONLY_STATE, &state->flags); 1209 break; 1210 case FMODE_WRITE: 1211 set_bit(NFS_O_WRONLY_STATE, &state->flags); 1212 break; 1213 case FMODE_READ|FMODE_WRITE: 1214 set_bit(NFS_O_RDWR_STATE, &state->flags); 1215 } 1216 if (!nfs_need_update_open_stateid(state, stateid)) 1217 return; 1218 if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0) 1219 nfs4_stateid_copy(&state->stateid, stateid); 1220 nfs4_stateid_copy(&state->open_stateid, stateid); 1221 } 1222 1223 static void __update_open_stateid(struct nfs4_state *state, nfs4_stateid *open_stateid, const nfs4_stateid *deleg_stateid, fmode_t fmode) 1224 { 1225 /* 1226 * Protect the call to nfs4_state_set_mode_locked and 1227 * serialise the stateid update 1228 */ 1229 write_seqlock(&state->seqlock); 1230 if (deleg_stateid != NULL) { 1231 nfs4_stateid_copy(&state->stateid, deleg_stateid); 1232 set_bit(NFS_DELEGATED_STATE, &state->flags); 1233 } 1234 if (open_stateid != NULL) 1235 nfs_set_open_stateid_locked(state, open_stateid, fmode); 1236 write_sequnlock(&state->seqlock); 1237 spin_lock(&state->owner->so_lock); 1238 update_open_stateflags(state, fmode); 1239 spin_unlock(&state->owner->so_lock); 1240 } 1241 1242 static int update_open_stateid(struct nfs4_state *state, nfs4_stateid *open_stateid, nfs4_stateid *delegation, fmode_t fmode) 1243 { 1244 struct nfs_inode *nfsi = NFS_I(state->inode); 1245 struct nfs_delegation *deleg_cur; 1246 int ret = 0; 1247 1248 fmode &= (FMODE_READ|FMODE_WRITE); 1249 1250 rcu_read_lock(); 1251 deleg_cur = rcu_dereference(nfsi->delegation); 1252 if (deleg_cur == NULL) 1253 goto no_delegation; 1254 1255 spin_lock(&deleg_cur->lock); 1256 if (rcu_dereference(nfsi->delegation) != deleg_cur || 1257 test_bit(NFS_DELEGATION_RETURNING, &deleg_cur->flags) || 1258 (deleg_cur->type & fmode) != fmode) 1259 goto no_delegation_unlock; 1260 1261 if (delegation == NULL) 1262 delegation = &deleg_cur->stateid; 1263 else if (!nfs4_stateid_match(&deleg_cur->stateid, delegation)) 1264 goto no_delegation_unlock; 1265 1266 nfs_mark_delegation_referenced(deleg_cur); 1267 __update_open_stateid(state, open_stateid, &deleg_cur->stateid, fmode); 1268 ret = 1; 1269 no_delegation_unlock: 1270 spin_unlock(&deleg_cur->lock); 1271 no_delegation: 1272 rcu_read_unlock(); 1273 1274 if (!ret && open_stateid != NULL) { 1275 __update_open_stateid(state, open_stateid, NULL, fmode); 1276 ret = 1; 1277 } 1278 if (test_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags)) 1279 nfs4_schedule_state_manager(state->owner->so_server->nfs_client); 1280 1281 return ret; 1282 } 1283 1284 1285 static void nfs4_return_incompatible_delegation(struct inode *inode, fmode_t fmode) 1286 { 1287 struct nfs_delegation *delegation; 1288 1289 rcu_read_lock(); 1290 delegation = rcu_dereference(NFS_I(inode)->delegation); 1291 if (delegation == NULL || (delegation->type & fmode) == fmode) { 1292 rcu_read_unlock(); 1293 return; 1294 } 1295 rcu_read_unlock(); 1296 nfs4_inode_return_delegation(inode); 1297 } 1298 1299 static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata) 1300 { 1301 struct nfs4_state *state = opendata->state; 1302 struct nfs_inode *nfsi = NFS_I(state->inode); 1303 struct nfs_delegation *delegation; 1304 int open_mode = opendata->o_arg.open_flags; 1305 fmode_t fmode = opendata->o_arg.fmode; 1306 nfs4_stateid stateid; 1307 int ret = -EAGAIN; 1308 1309 for (;;) { 1310 if (can_open_cached(state, fmode, open_mode)) { 1311 spin_lock(&state->owner->so_lock); 1312 if (can_open_cached(state, fmode, open_mode)) { 1313 update_open_stateflags(state, fmode); 1314 spin_unlock(&state->owner->so_lock); 1315 goto out_return_state; 1316 } 1317 spin_unlock(&state->owner->so_lock); 1318 } 1319 rcu_read_lock(); 1320 delegation = rcu_dereference(nfsi->delegation); 1321 if (!can_open_delegated(delegation, fmode)) { 1322 rcu_read_unlock(); 1323 break; 1324 } 1325 /* Save the delegation */ 1326 nfs4_stateid_copy(&stateid, &delegation->stateid); 1327 rcu_read_unlock(); 1328 nfs_release_seqid(opendata->o_arg.seqid); 1329 if (!opendata->is_recover) { 1330 ret = nfs_may_open(state->inode, state->owner->so_cred, open_mode); 1331 if (ret != 0) 1332 goto out; 1333 } 1334 ret = -EAGAIN; 1335 1336 /* Try to update the stateid using the delegation */ 1337 if (update_open_stateid(state, NULL, &stateid, fmode)) 1338 goto out_return_state; 1339 } 1340 out: 1341 return ERR_PTR(ret); 1342 out_return_state: 1343 atomic_inc(&state->count); 1344 return state; 1345 } 1346 1347 static void 1348 nfs4_opendata_check_deleg(struct nfs4_opendata *data, struct nfs4_state *state) 1349 { 1350 struct nfs_client *clp = NFS_SERVER(state->inode)->nfs_client; 1351 struct nfs_delegation *delegation; 1352 int delegation_flags = 0; 1353 1354 rcu_read_lock(); 1355 delegation = rcu_dereference(NFS_I(state->inode)->delegation); 1356 if (delegation) 1357 delegation_flags = delegation->flags; 1358 rcu_read_unlock(); 1359 if (data->o_arg.claim == NFS4_OPEN_CLAIM_DELEGATE_CUR) { 1360 pr_err_ratelimited("NFS: Broken NFSv4 server %s is " 1361 "returning a delegation for " 1362 "OPEN(CLAIM_DELEGATE_CUR)\n", 1363 clp->cl_hostname); 1364 } else if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0) 1365 nfs_inode_set_delegation(state->inode, 1366 data->owner->so_cred, 1367 &data->o_res); 1368 else 1369 nfs_inode_reclaim_delegation(state->inode, 1370 data->owner->so_cred, 1371 &data->o_res); 1372 } 1373 1374 /* 1375 * Check the inode attributes against the CLAIM_PREVIOUS returned attributes 1376 * and update the nfs4_state. 1377 */ 1378 static struct nfs4_state * 1379 _nfs4_opendata_reclaim_to_nfs4_state(struct nfs4_opendata *data) 1380 { 1381 struct inode *inode = data->state->inode; 1382 struct nfs4_state *state = data->state; 1383 int ret; 1384 1385 if (!data->rpc_done) { 1386 if (data->rpc_status) { 1387 ret = data->rpc_status; 1388 goto err; 1389 } 1390 /* cached opens have already been processed */ 1391 goto update; 1392 } 1393 1394 ret = nfs_refresh_inode(inode, &data->f_attr); 1395 if (ret) 1396 goto err; 1397 1398 if (data->o_res.delegation_type != 0) 1399 nfs4_opendata_check_deleg(data, state); 1400 update: 1401 update_open_stateid(state, &data->o_res.stateid, NULL, 1402 data->o_arg.fmode); 1403 atomic_inc(&state->count); 1404 1405 return state; 1406 err: 1407 return ERR_PTR(ret); 1408 1409 } 1410 1411 static struct nfs4_state * 1412 _nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data) 1413 { 1414 struct inode *inode; 1415 struct nfs4_state *state = NULL; 1416 int ret; 1417 1418 if (!data->rpc_done) { 1419 state = nfs4_try_open_cached(data); 1420 goto out; 1421 } 1422 1423 ret = -EAGAIN; 1424 if (!(data->f_attr.valid & NFS_ATTR_FATTR)) 1425 goto err; 1426 inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh, &data->f_attr, data->f_label); 1427 ret = PTR_ERR(inode); 1428 if (IS_ERR(inode)) 1429 goto err; 1430 ret = -ENOMEM; 1431 state = nfs4_get_open_state(inode, data->owner); 1432 if (state == NULL) 1433 goto err_put_inode; 1434 if (data->o_res.delegation_type != 0) 1435 nfs4_opendata_check_deleg(data, state); 1436 update_open_stateid(state, &data->o_res.stateid, NULL, 1437 data->o_arg.fmode); 1438 iput(inode); 1439 out: 1440 nfs_release_seqid(data->o_arg.seqid); 1441 return state; 1442 err_put_inode: 1443 iput(inode); 1444 err: 1445 return ERR_PTR(ret); 1446 } 1447 1448 static struct nfs4_state * 1449 nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data) 1450 { 1451 if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) 1452 return _nfs4_opendata_reclaim_to_nfs4_state(data); 1453 return _nfs4_opendata_to_nfs4_state(data); 1454 } 1455 1456 static struct nfs_open_context *nfs4_state_find_open_context(struct nfs4_state *state) 1457 { 1458 struct nfs_inode *nfsi = NFS_I(state->inode); 1459 struct nfs_open_context *ctx; 1460 1461 spin_lock(&state->inode->i_lock); 1462 list_for_each_entry(ctx, &nfsi->open_files, list) { 1463 if (ctx->state != state) 1464 continue; 1465 get_nfs_open_context(ctx); 1466 spin_unlock(&state->inode->i_lock); 1467 return ctx; 1468 } 1469 spin_unlock(&state->inode->i_lock); 1470 return ERR_PTR(-ENOENT); 1471 } 1472 1473 static struct nfs4_opendata *nfs4_open_recoverdata_alloc(struct nfs_open_context *ctx, 1474 struct nfs4_state *state, enum open_claim_type4 claim) 1475 { 1476 struct nfs4_opendata *opendata; 1477 1478 opendata = nfs4_opendata_alloc(ctx->dentry, state->owner, 0, 0, 1479 NULL, NULL, claim, GFP_NOFS); 1480 if (opendata == NULL) 1481 return ERR_PTR(-ENOMEM); 1482 opendata->state = state; 1483 atomic_inc(&state->count); 1484 return opendata; 1485 } 1486 1487 static int nfs4_open_recover_helper(struct nfs4_opendata *opendata, fmode_t fmode, struct nfs4_state **res) 1488 { 1489 struct nfs4_state *newstate; 1490 int ret; 1491 1492 opendata->o_arg.open_flags = 0; 1493 opendata->o_arg.fmode = fmode; 1494 memset(&opendata->o_res, 0, sizeof(opendata->o_res)); 1495 memset(&opendata->c_res, 0, sizeof(opendata->c_res)); 1496 nfs4_init_opendata_res(opendata); 1497 ret = _nfs4_recover_proc_open(opendata); 1498 if (ret != 0) 1499 return ret; 1500 newstate = nfs4_opendata_to_nfs4_state(opendata); 1501 if (IS_ERR(newstate)) 1502 return PTR_ERR(newstate); 1503 nfs4_close_state(newstate, fmode); 1504 *res = newstate; 1505 return 0; 1506 } 1507 1508 static int nfs4_open_recover(struct nfs4_opendata *opendata, struct nfs4_state *state) 1509 { 1510 struct nfs4_state *newstate; 1511 int ret; 1512 1513 /* Don't trigger recovery in nfs_test_and_clear_all_open_stateid */ 1514 clear_bit(NFS_O_RDWR_STATE, &state->flags); 1515 clear_bit(NFS_O_WRONLY_STATE, &state->flags); 1516 clear_bit(NFS_O_RDONLY_STATE, &state->flags); 1517 /* memory barrier prior to reading state->n_* */ 1518 clear_bit(NFS_DELEGATED_STATE, &state->flags); 1519 clear_bit(NFS_OPEN_STATE, &state->flags); 1520 smp_rmb(); 1521 if (state->n_rdwr != 0) { 1522 ret = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE, &newstate); 1523 if (ret != 0) 1524 return ret; 1525 if (newstate != state) 1526 return -ESTALE; 1527 } 1528 if (state->n_wronly != 0) { 1529 ret = nfs4_open_recover_helper(opendata, FMODE_WRITE, &newstate); 1530 if (ret != 0) 1531 return ret; 1532 if (newstate != state) 1533 return -ESTALE; 1534 } 1535 if (state->n_rdonly != 0) { 1536 ret = nfs4_open_recover_helper(opendata, FMODE_READ, &newstate); 1537 if (ret != 0) 1538 return ret; 1539 if (newstate != state) 1540 return -ESTALE; 1541 } 1542 /* 1543 * We may have performed cached opens for all three recoveries. 1544 * Check if we need to update the current stateid. 1545 */ 1546 if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0 && 1547 !nfs4_stateid_match(&state->stateid, &state->open_stateid)) { 1548 write_seqlock(&state->seqlock); 1549 if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0) 1550 nfs4_stateid_copy(&state->stateid, &state->open_stateid); 1551 write_sequnlock(&state->seqlock); 1552 } 1553 return 0; 1554 } 1555 1556 /* 1557 * OPEN_RECLAIM: 1558 * reclaim state on the server after a reboot. 1559 */ 1560 static int _nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state *state) 1561 { 1562 struct nfs_delegation *delegation; 1563 struct nfs4_opendata *opendata; 1564 fmode_t delegation_type = 0; 1565 int status; 1566 1567 opendata = nfs4_open_recoverdata_alloc(ctx, state, 1568 NFS4_OPEN_CLAIM_PREVIOUS); 1569 if (IS_ERR(opendata)) 1570 return PTR_ERR(opendata); 1571 rcu_read_lock(); 1572 delegation = rcu_dereference(NFS_I(state->inode)->delegation); 1573 if (delegation != NULL && test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags) != 0) 1574 delegation_type = delegation->type; 1575 rcu_read_unlock(); 1576 opendata->o_arg.u.delegation_type = delegation_type; 1577 status = nfs4_open_recover(opendata, state); 1578 nfs4_opendata_put(opendata); 1579 return status; 1580 } 1581 1582 static int nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state *state) 1583 { 1584 struct nfs_server *server = NFS_SERVER(state->inode); 1585 struct nfs4_exception exception = { }; 1586 int err; 1587 do { 1588 err = _nfs4_do_open_reclaim(ctx, state); 1589 trace_nfs4_open_reclaim(ctx, 0, err); 1590 if (nfs4_clear_cap_atomic_open_v1(server, err, &exception)) 1591 continue; 1592 if (err != -NFS4ERR_DELAY) 1593 break; 1594 nfs4_handle_exception(server, err, &exception); 1595 } while (exception.retry); 1596 return err; 1597 } 1598 1599 static int nfs4_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state) 1600 { 1601 struct nfs_open_context *ctx; 1602 int ret; 1603 1604 ctx = nfs4_state_find_open_context(state); 1605 if (IS_ERR(ctx)) 1606 return -EAGAIN; 1607 ret = nfs4_do_open_reclaim(ctx, state); 1608 put_nfs_open_context(ctx); 1609 return ret; 1610 } 1611 1612 static int nfs4_handle_delegation_recall_error(struct nfs_server *server, struct nfs4_state *state, const nfs4_stateid *stateid, int err) 1613 { 1614 switch (err) { 1615 default: 1616 printk(KERN_ERR "NFS: %s: unhandled error " 1617 "%d.\n", __func__, err); 1618 case 0: 1619 case -ENOENT: 1620 case -ESTALE: 1621 break; 1622 case -NFS4ERR_BADSESSION: 1623 case -NFS4ERR_BADSLOT: 1624 case -NFS4ERR_BAD_HIGH_SLOT: 1625 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: 1626 case -NFS4ERR_DEADSESSION: 1627 set_bit(NFS_DELEGATED_STATE, &state->flags); 1628 nfs4_schedule_session_recovery(server->nfs_client->cl_session, err); 1629 return -EAGAIN; 1630 case -NFS4ERR_STALE_CLIENTID: 1631 case -NFS4ERR_STALE_STATEID: 1632 set_bit(NFS_DELEGATED_STATE, &state->flags); 1633 case -NFS4ERR_EXPIRED: 1634 /* Don't recall a delegation if it was lost */ 1635 nfs4_schedule_lease_recovery(server->nfs_client); 1636 return -EAGAIN; 1637 case -NFS4ERR_MOVED: 1638 nfs4_schedule_migration_recovery(server); 1639 return -EAGAIN; 1640 case -NFS4ERR_LEASE_MOVED: 1641 nfs4_schedule_lease_moved_recovery(server->nfs_client); 1642 return -EAGAIN; 1643 case -NFS4ERR_DELEG_REVOKED: 1644 case -NFS4ERR_ADMIN_REVOKED: 1645 case -NFS4ERR_BAD_STATEID: 1646 case -NFS4ERR_OPENMODE: 1647 nfs_inode_find_state_and_recover(state->inode, 1648 stateid); 1649 nfs4_schedule_stateid_recovery(server, state); 1650 return 0; 1651 case -NFS4ERR_DELAY: 1652 case -NFS4ERR_GRACE: 1653 set_bit(NFS_DELEGATED_STATE, &state->flags); 1654 ssleep(1); 1655 return -EAGAIN; 1656 case -ENOMEM: 1657 case -NFS4ERR_DENIED: 1658 /* kill_proc(fl->fl_pid, SIGLOST, 1); */ 1659 return 0; 1660 } 1661 return err; 1662 } 1663 1664 int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid) 1665 { 1666 struct nfs_server *server = NFS_SERVER(state->inode); 1667 struct nfs4_opendata *opendata; 1668 int err; 1669 1670 opendata = nfs4_open_recoverdata_alloc(ctx, state, 1671 NFS4_OPEN_CLAIM_DELEG_CUR_FH); 1672 if (IS_ERR(opendata)) 1673 return PTR_ERR(opendata); 1674 nfs4_stateid_copy(&opendata->o_arg.u.delegation, stateid); 1675 err = nfs4_open_recover(opendata, state); 1676 nfs4_opendata_put(opendata); 1677 return nfs4_handle_delegation_recall_error(server, state, stateid, err); 1678 } 1679 1680 static void nfs4_open_confirm_prepare(struct rpc_task *task, void *calldata) 1681 { 1682 struct nfs4_opendata *data = calldata; 1683 1684 nfs40_setup_sequence(data->o_arg.server, &data->c_arg.seq_args, 1685 &data->c_res.seq_res, task); 1686 } 1687 1688 static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata) 1689 { 1690 struct nfs4_opendata *data = calldata; 1691 1692 nfs40_sequence_done(task, &data->c_res.seq_res); 1693 1694 data->rpc_status = task->tk_status; 1695 if (data->rpc_status == 0) { 1696 nfs4_stateid_copy(&data->o_res.stateid, &data->c_res.stateid); 1697 nfs_confirm_seqid(&data->owner->so_seqid, 0); 1698 renew_lease(data->o_res.server, data->timestamp); 1699 data->rpc_done = 1; 1700 } 1701 } 1702 1703 static void nfs4_open_confirm_release(void *calldata) 1704 { 1705 struct nfs4_opendata *data = calldata; 1706 struct nfs4_state *state = NULL; 1707 1708 /* If this request hasn't been cancelled, do nothing */ 1709 if (data->cancelled == 0) 1710 goto out_free; 1711 /* In case of error, no cleanup! */ 1712 if (!data->rpc_done) 1713 goto out_free; 1714 state = nfs4_opendata_to_nfs4_state(data); 1715 if (!IS_ERR(state)) 1716 nfs4_close_state(state, data->o_arg.fmode); 1717 out_free: 1718 nfs4_opendata_put(data); 1719 } 1720 1721 static const struct rpc_call_ops nfs4_open_confirm_ops = { 1722 .rpc_call_prepare = nfs4_open_confirm_prepare, 1723 .rpc_call_done = nfs4_open_confirm_done, 1724 .rpc_release = nfs4_open_confirm_release, 1725 }; 1726 1727 /* 1728 * Note: On error, nfs4_proc_open_confirm will free the struct nfs4_opendata 1729 */ 1730 static int _nfs4_proc_open_confirm(struct nfs4_opendata *data) 1731 { 1732 struct nfs_server *server = NFS_SERVER(data->dir->d_inode); 1733 struct rpc_task *task; 1734 struct rpc_message msg = { 1735 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM], 1736 .rpc_argp = &data->c_arg, 1737 .rpc_resp = &data->c_res, 1738 .rpc_cred = data->owner->so_cred, 1739 }; 1740 struct rpc_task_setup task_setup_data = { 1741 .rpc_client = server->client, 1742 .rpc_message = &msg, 1743 .callback_ops = &nfs4_open_confirm_ops, 1744 .callback_data = data, 1745 .workqueue = nfsiod_workqueue, 1746 .flags = RPC_TASK_ASYNC, 1747 }; 1748 int status; 1749 1750 nfs4_init_sequence(&data->c_arg.seq_args, &data->c_res.seq_res, 1); 1751 kref_get(&data->kref); 1752 data->rpc_done = 0; 1753 data->rpc_status = 0; 1754 data->timestamp = jiffies; 1755 task = rpc_run_task(&task_setup_data); 1756 if (IS_ERR(task)) 1757 return PTR_ERR(task); 1758 status = nfs4_wait_for_completion_rpc_task(task); 1759 if (status != 0) { 1760 data->cancelled = 1; 1761 smp_wmb(); 1762 } else 1763 status = data->rpc_status; 1764 rpc_put_task(task); 1765 return status; 1766 } 1767 1768 static void nfs4_open_prepare(struct rpc_task *task, void *calldata) 1769 { 1770 struct nfs4_opendata *data = calldata; 1771 struct nfs4_state_owner *sp = data->owner; 1772 struct nfs_client *clp = sp->so_server->nfs_client; 1773 1774 if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0) 1775 goto out_wait; 1776 /* 1777 * Check if we still need to send an OPEN call, or if we can use 1778 * a delegation instead. 1779 */ 1780 if (data->state != NULL) { 1781 struct nfs_delegation *delegation; 1782 1783 if (can_open_cached(data->state, data->o_arg.fmode, data->o_arg.open_flags)) 1784 goto out_no_action; 1785 rcu_read_lock(); 1786 delegation = rcu_dereference(NFS_I(data->state->inode)->delegation); 1787 if (data->o_arg.claim != NFS4_OPEN_CLAIM_DELEGATE_CUR && 1788 data->o_arg.claim != NFS4_OPEN_CLAIM_DELEG_CUR_FH && 1789 can_open_delegated(delegation, data->o_arg.fmode)) 1790 goto unlock_no_action; 1791 rcu_read_unlock(); 1792 } 1793 /* Update client id. */ 1794 data->o_arg.clientid = clp->cl_clientid; 1795 switch (data->o_arg.claim) { 1796 case NFS4_OPEN_CLAIM_PREVIOUS: 1797 case NFS4_OPEN_CLAIM_DELEG_CUR_FH: 1798 case NFS4_OPEN_CLAIM_DELEG_PREV_FH: 1799 data->o_arg.open_bitmap = &nfs4_open_noattr_bitmap[0]; 1800 case NFS4_OPEN_CLAIM_FH: 1801 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR]; 1802 nfs_copy_fh(&data->o_res.fh, data->o_arg.fh); 1803 } 1804 data->timestamp = jiffies; 1805 if (nfs4_setup_sequence(data->o_arg.server, 1806 &data->o_arg.seq_args, 1807 &data->o_res.seq_res, 1808 task) != 0) 1809 nfs_release_seqid(data->o_arg.seqid); 1810 1811 /* Set the create mode (note dependency on the session type) */ 1812 data->o_arg.createmode = NFS4_CREATE_UNCHECKED; 1813 if (data->o_arg.open_flags & O_EXCL) { 1814 data->o_arg.createmode = NFS4_CREATE_EXCLUSIVE; 1815 if (nfs4_has_persistent_session(clp)) 1816 data->o_arg.createmode = NFS4_CREATE_GUARDED; 1817 else if (clp->cl_mvops->minor_version > 0) 1818 data->o_arg.createmode = NFS4_CREATE_EXCLUSIVE4_1; 1819 } 1820 return; 1821 unlock_no_action: 1822 rcu_read_unlock(); 1823 out_no_action: 1824 task->tk_action = NULL; 1825 out_wait: 1826 nfs4_sequence_done(task, &data->o_res.seq_res); 1827 } 1828 1829 static void nfs4_open_done(struct rpc_task *task, void *calldata) 1830 { 1831 struct nfs4_opendata *data = calldata; 1832 1833 data->rpc_status = task->tk_status; 1834 1835 if (!nfs4_sequence_done(task, &data->o_res.seq_res)) 1836 return; 1837 1838 if (task->tk_status == 0) { 1839 if (data->o_res.f_attr->valid & NFS_ATTR_FATTR_TYPE) { 1840 switch (data->o_res.f_attr->mode & S_IFMT) { 1841 case S_IFREG: 1842 break; 1843 case S_IFLNK: 1844 data->rpc_status = -ELOOP; 1845 break; 1846 case S_IFDIR: 1847 data->rpc_status = -EISDIR; 1848 break; 1849 default: 1850 data->rpc_status = -ENOTDIR; 1851 } 1852 } 1853 renew_lease(data->o_res.server, data->timestamp); 1854 if (!(data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM)) 1855 nfs_confirm_seqid(&data->owner->so_seqid, 0); 1856 } 1857 data->rpc_done = 1; 1858 } 1859 1860 static void nfs4_open_release(void *calldata) 1861 { 1862 struct nfs4_opendata *data = calldata; 1863 struct nfs4_state *state = NULL; 1864 1865 /* If this request hasn't been cancelled, do nothing */ 1866 if (data->cancelled == 0) 1867 goto out_free; 1868 /* In case of error, no cleanup! */ 1869 if (data->rpc_status != 0 || !data->rpc_done) 1870 goto out_free; 1871 /* In case we need an open_confirm, no cleanup! */ 1872 if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM) 1873 goto out_free; 1874 state = nfs4_opendata_to_nfs4_state(data); 1875 if (!IS_ERR(state)) 1876 nfs4_close_state(state, data->o_arg.fmode); 1877 out_free: 1878 nfs4_opendata_put(data); 1879 } 1880 1881 static const struct rpc_call_ops nfs4_open_ops = { 1882 .rpc_call_prepare = nfs4_open_prepare, 1883 .rpc_call_done = nfs4_open_done, 1884 .rpc_release = nfs4_open_release, 1885 }; 1886 1887 static int nfs4_run_open_task(struct nfs4_opendata *data, int isrecover) 1888 { 1889 struct inode *dir = data->dir->d_inode; 1890 struct nfs_server *server = NFS_SERVER(dir); 1891 struct nfs_openargs *o_arg = &data->o_arg; 1892 struct nfs_openres *o_res = &data->o_res; 1893 struct rpc_task *task; 1894 struct rpc_message msg = { 1895 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN], 1896 .rpc_argp = o_arg, 1897 .rpc_resp = o_res, 1898 .rpc_cred = data->owner->so_cred, 1899 }; 1900 struct rpc_task_setup task_setup_data = { 1901 .rpc_client = server->client, 1902 .rpc_message = &msg, 1903 .callback_ops = &nfs4_open_ops, 1904 .callback_data = data, 1905 .workqueue = nfsiod_workqueue, 1906 .flags = RPC_TASK_ASYNC, 1907 }; 1908 int status; 1909 1910 nfs4_init_sequence(&o_arg->seq_args, &o_res->seq_res, 1); 1911 kref_get(&data->kref); 1912 data->rpc_done = 0; 1913 data->rpc_status = 0; 1914 data->cancelled = 0; 1915 data->is_recover = 0; 1916 if (isrecover) { 1917 nfs4_set_sequence_privileged(&o_arg->seq_args); 1918 data->is_recover = 1; 1919 } 1920 task = rpc_run_task(&task_setup_data); 1921 if (IS_ERR(task)) 1922 return PTR_ERR(task); 1923 status = nfs4_wait_for_completion_rpc_task(task); 1924 if (status != 0) { 1925 data->cancelled = 1; 1926 smp_wmb(); 1927 } else 1928 status = data->rpc_status; 1929 rpc_put_task(task); 1930 1931 return status; 1932 } 1933 1934 static int _nfs4_recover_proc_open(struct nfs4_opendata *data) 1935 { 1936 struct inode *dir = data->dir->d_inode; 1937 struct nfs_openres *o_res = &data->o_res; 1938 int status; 1939 1940 status = nfs4_run_open_task(data, 1); 1941 if (status != 0 || !data->rpc_done) 1942 return status; 1943 1944 nfs_fattr_map_and_free_names(NFS_SERVER(dir), &data->f_attr); 1945 1946 if (o_res->rflags & NFS4_OPEN_RESULT_CONFIRM) { 1947 status = _nfs4_proc_open_confirm(data); 1948 if (status != 0) 1949 return status; 1950 } 1951 1952 return status; 1953 } 1954 1955 /* 1956 * Additional permission checks in order to distinguish between an 1957 * open for read, and an open for execute. This works around the 1958 * fact that NFSv4 OPEN treats read and execute permissions as being 1959 * the same. 1960 * Note that in the non-execute case, we want to turn off permission 1961 * checking if we just created a new file (POSIX open() semantics). 1962 */ 1963 static int nfs4_opendata_access(struct rpc_cred *cred, 1964 struct nfs4_opendata *opendata, 1965 struct nfs4_state *state, fmode_t fmode, 1966 int openflags) 1967 { 1968 struct nfs_access_entry cache; 1969 u32 mask; 1970 1971 /* access call failed or for some reason the server doesn't 1972 * support any access modes -- defer access call until later */ 1973 if (opendata->o_res.access_supported == 0) 1974 return 0; 1975 1976 mask = 0; 1977 /* 1978 * Use openflags to check for exec, because fmode won't 1979 * always have FMODE_EXEC set when file open for exec. 1980 */ 1981 if (openflags & __FMODE_EXEC) { 1982 /* ONLY check for exec rights */ 1983 mask = MAY_EXEC; 1984 } else if ((fmode & FMODE_READ) && !opendata->file_created) 1985 mask = MAY_READ; 1986 1987 cache.cred = cred; 1988 cache.jiffies = jiffies; 1989 nfs_access_set_mask(&cache, opendata->o_res.access_result); 1990 nfs_access_add_cache(state->inode, &cache); 1991 1992 if ((mask & ~cache.mask & (MAY_READ | MAY_EXEC)) == 0) 1993 return 0; 1994 1995 /* even though OPEN succeeded, access is denied. Close the file */ 1996 nfs4_close_state(state, fmode); 1997 return -EACCES; 1998 } 1999 2000 /* 2001 * Note: On error, nfs4_proc_open will free the struct nfs4_opendata 2002 */ 2003 static int _nfs4_proc_open(struct nfs4_opendata *data) 2004 { 2005 struct inode *dir = data->dir->d_inode; 2006 struct nfs_server *server = NFS_SERVER(dir); 2007 struct nfs_openargs *o_arg = &data->o_arg; 2008 struct nfs_openres *o_res = &data->o_res; 2009 int status; 2010 2011 status = nfs4_run_open_task(data, 0); 2012 if (!data->rpc_done) 2013 return status; 2014 if (status != 0) { 2015 if (status == -NFS4ERR_BADNAME && 2016 !(o_arg->open_flags & O_CREAT)) 2017 return -ENOENT; 2018 return status; 2019 } 2020 2021 nfs_fattr_map_and_free_names(server, &data->f_attr); 2022 2023 if (o_arg->open_flags & O_CREAT) { 2024 update_changeattr(dir, &o_res->cinfo); 2025 if (o_arg->open_flags & O_EXCL) 2026 data->file_created = 1; 2027 else if (o_res->cinfo.before != o_res->cinfo.after) 2028 data->file_created = 1; 2029 } 2030 if ((o_res->rflags & NFS4_OPEN_RESULT_LOCKTYPE_POSIX) == 0) 2031 server->caps &= ~NFS_CAP_POSIX_LOCK; 2032 if(o_res->rflags & NFS4_OPEN_RESULT_CONFIRM) { 2033 status = _nfs4_proc_open_confirm(data); 2034 if (status != 0) 2035 return status; 2036 } 2037 if (!(o_res->f_attr->valid & NFS_ATTR_FATTR)) 2038 nfs4_proc_getattr(server, &o_res->fh, o_res->f_attr, o_res->f_label); 2039 return 0; 2040 } 2041 2042 static int nfs4_recover_expired_lease(struct nfs_server *server) 2043 { 2044 return nfs4_client_recover_expired_lease(server->nfs_client); 2045 } 2046 2047 /* 2048 * OPEN_EXPIRED: 2049 * reclaim state on the server after a network partition. 2050 * Assumes caller holds the appropriate lock 2051 */ 2052 static int _nfs4_open_expired(struct nfs_open_context *ctx, struct nfs4_state *state) 2053 { 2054 struct nfs4_opendata *opendata; 2055 int ret; 2056 2057 opendata = nfs4_open_recoverdata_alloc(ctx, state, 2058 NFS4_OPEN_CLAIM_FH); 2059 if (IS_ERR(opendata)) 2060 return PTR_ERR(opendata); 2061 ret = nfs4_open_recover(opendata, state); 2062 if (ret == -ESTALE) 2063 d_drop(ctx->dentry); 2064 nfs4_opendata_put(opendata); 2065 return ret; 2066 } 2067 2068 static int nfs4_do_open_expired(struct nfs_open_context *ctx, struct nfs4_state *state) 2069 { 2070 struct nfs_server *server = NFS_SERVER(state->inode); 2071 struct nfs4_exception exception = { }; 2072 int err; 2073 2074 do { 2075 err = _nfs4_open_expired(ctx, state); 2076 trace_nfs4_open_expired(ctx, 0, err); 2077 if (nfs4_clear_cap_atomic_open_v1(server, err, &exception)) 2078 continue; 2079 switch (err) { 2080 default: 2081 goto out; 2082 case -NFS4ERR_GRACE: 2083 case -NFS4ERR_DELAY: 2084 nfs4_handle_exception(server, err, &exception); 2085 err = 0; 2086 } 2087 } while (exception.retry); 2088 out: 2089 return err; 2090 } 2091 2092 static int nfs4_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state) 2093 { 2094 struct nfs_open_context *ctx; 2095 int ret; 2096 2097 ctx = nfs4_state_find_open_context(state); 2098 if (IS_ERR(ctx)) 2099 return -EAGAIN; 2100 ret = nfs4_do_open_expired(ctx, state); 2101 put_nfs_open_context(ctx); 2102 return ret; 2103 } 2104 2105 #if defined(CONFIG_NFS_V4_1) 2106 static void nfs41_clear_delegation_stateid(struct nfs4_state *state) 2107 { 2108 struct nfs_server *server = NFS_SERVER(state->inode); 2109 nfs4_stateid *stateid = &state->stateid; 2110 struct nfs_delegation *delegation; 2111 struct rpc_cred *cred = NULL; 2112 int status = -NFS4ERR_BAD_STATEID; 2113 2114 /* If a state reset has been done, test_stateid is unneeded */ 2115 if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0) 2116 return; 2117 2118 /* Get the delegation credential for use by test/free_stateid */ 2119 rcu_read_lock(); 2120 delegation = rcu_dereference(NFS_I(state->inode)->delegation); 2121 if (delegation != NULL && 2122 nfs4_stateid_match(&delegation->stateid, stateid)) { 2123 cred = get_rpccred(delegation->cred); 2124 rcu_read_unlock(); 2125 status = nfs41_test_stateid(server, stateid, cred); 2126 trace_nfs4_test_delegation_stateid(state, NULL, status); 2127 } else 2128 rcu_read_unlock(); 2129 2130 if (status != NFS_OK) { 2131 /* Free the stateid unless the server explicitly 2132 * informs us the stateid is unrecognized. */ 2133 if (status != -NFS4ERR_BAD_STATEID) 2134 nfs41_free_stateid(server, stateid, cred); 2135 nfs_remove_bad_delegation(state->inode); 2136 2137 write_seqlock(&state->seqlock); 2138 nfs4_stateid_copy(&state->stateid, &state->open_stateid); 2139 write_sequnlock(&state->seqlock); 2140 clear_bit(NFS_DELEGATED_STATE, &state->flags); 2141 } 2142 2143 if (cred != NULL) 2144 put_rpccred(cred); 2145 } 2146 2147 /** 2148 * nfs41_check_open_stateid - possibly free an open stateid 2149 * 2150 * @state: NFSv4 state for an inode 2151 * 2152 * Returns NFS_OK if recovery for this stateid is now finished. 2153 * Otherwise a negative NFS4ERR value is returned. 2154 */ 2155 static int nfs41_check_open_stateid(struct nfs4_state *state) 2156 { 2157 struct nfs_server *server = NFS_SERVER(state->inode); 2158 nfs4_stateid *stateid = &state->open_stateid; 2159 struct rpc_cred *cred = state->owner->so_cred; 2160 int status; 2161 2162 /* If a state reset has been done, test_stateid is unneeded */ 2163 if ((test_bit(NFS_O_RDONLY_STATE, &state->flags) == 0) && 2164 (test_bit(NFS_O_WRONLY_STATE, &state->flags) == 0) && 2165 (test_bit(NFS_O_RDWR_STATE, &state->flags) == 0)) 2166 return -NFS4ERR_BAD_STATEID; 2167 2168 status = nfs41_test_stateid(server, stateid, cred); 2169 trace_nfs4_test_open_stateid(state, NULL, status); 2170 if (status != NFS_OK) { 2171 /* Free the stateid unless the server explicitly 2172 * informs us the stateid is unrecognized. */ 2173 if (status != -NFS4ERR_BAD_STATEID) 2174 nfs41_free_stateid(server, stateid, cred); 2175 2176 clear_bit(NFS_O_RDONLY_STATE, &state->flags); 2177 clear_bit(NFS_O_WRONLY_STATE, &state->flags); 2178 clear_bit(NFS_O_RDWR_STATE, &state->flags); 2179 clear_bit(NFS_OPEN_STATE, &state->flags); 2180 } 2181 return status; 2182 } 2183 2184 static int nfs41_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state) 2185 { 2186 int status; 2187 2188 nfs41_clear_delegation_stateid(state); 2189 status = nfs41_check_open_stateid(state); 2190 if (status != NFS_OK) 2191 status = nfs4_open_expired(sp, state); 2192 return status; 2193 } 2194 #endif 2195 2196 /* 2197 * on an EXCLUSIVE create, the server should send back a bitmask with FATTR4-* 2198 * fields corresponding to attributes that were used to store the verifier. 2199 * Make sure we clobber those fields in the later setattr call 2200 */ 2201 static inline void nfs4_exclusive_attrset(struct nfs4_opendata *opendata, struct iattr *sattr) 2202 { 2203 if ((opendata->o_res.attrset[1] & FATTR4_WORD1_TIME_ACCESS) && 2204 !(sattr->ia_valid & ATTR_ATIME_SET)) 2205 sattr->ia_valid |= ATTR_ATIME; 2206 2207 if ((opendata->o_res.attrset[1] & FATTR4_WORD1_TIME_MODIFY) && 2208 !(sattr->ia_valid & ATTR_MTIME_SET)) 2209 sattr->ia_valid |= ATTR_MTIME; 2210 } 2211 2212 static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata, 2213 fmode_t fmode, 2214 int flags, 2215 struct nfs_open_context *ctx) 2216 { 2217 struct nfs4_state_owner *sp = opendata->owner; 2218 struct nfs_server *server = sp->so_server; 2219 struct dentry *dentry; 2220 struct nfs4_state *state; 2221 unsigned int seq; 2222 int ret; 2223 2224 seq = raw_seqcount_begin(&sp->so_reclaim_seqcount); 2225 2226 ret = _nfs4_proc_open(opendata); 2227 if (ret != 0) { 2228 if (ret == -ENOENT) { 2229 d_drop(opendata->dentry); 2230 d_add(opendata->dentry, NULL); 2231 nfs_set_verifier(opendata->dentry, 2232 nfs_save_change_attribute(opendata->dir->d_inode)); 2233 } 2234 goto out; 2235 } 2236 2237 state = nfs4_opendata_to_nfs4_state(opendata); 2238 ret = PTR_ERR(state); 2239 if (IS_ERR(state)) 2240 goto out; 2241 if (server->caps & NFS_CAP_POSIX_LOCK) 2242 set_bit(NFS_STATE_POSIX_LOCKS, &state->flags); 2243 2244 dentry = opendata->dentry; 2245 if (dentry->d_inode == NULL) { 2246 /* FIXME: Is this d_drop() ever needed? */ 2247 d_drop(dentry); 2248 dentry = d_add_unique(dentry, igrab(state->inode)); 2249 if (dentry == NULL) { 2250 dentry = opendata->dentry; 2251 } else if (dentry != ctx->dentry) { 2252 dput(ctx->dentry); 2253 ctx->dentry = dget(dentry); 2254 } 2255 nfs_set_verifier(dentry, 2256 nfs_save_change_attribute(opendata->dir->d_inode)); 2257 } 2258 2259 ret = nfs4_opendata_access(sp->so_cred, opendata, state, fmode, flags); 2260 if (ret != 0) 2261 goto out; 2262 2263 ctx->state = state; 2264 if (dentry->d_inode == state->inode) { 2265 nfs_inode_attach_open_context(ctx); 2266 if (read_seqcount_retry(&sp->so_reclaim_seqcount, seq)) 2267 nfs4_schedule_stateid_recovery(server, state); 2268 } 2269 out: 2270 return ret; 2271 } 2272 2273 /* 2274 * Returns a referenced nfs4_state 2275 */ 2276 static int _nfs4_do_open(struct inode *dir, 2277 struct nfs_open_context *ctx, 2278 int flags, 2279 struct iattr *sattr, 2280 struct nfs4_label *label, 2281 int *opened) 2282 { 2283 struct nfs4_state_owner *sp; 2284 struct nfs4_state *state = NULL; 2285 struct nfs_server *server = NFS_SERVER(dir); 2286 struct nfs4_opendata *opendata; 2287 struct dentry *dentry = ctx->dentry; 2288 struct rpc_cred *cred = ctx->cred; 2289 struct nfs4_threshold **ctx_th = &ctx->mdsthreshold; 2290 fmode_t fmode = ctx->mode & (FMODE_READ|FMODE_WRITE|FMODE_EXEC); 2291 enum open_claim_type4 claim = NFS4_OPEN_CLAIM_NULL; 2292 struct nfs4_label *olabel = NULL; 2293 int status; 2294 2295 /* Protect against reboot recovery conflicts */ 2296 status = -ENOMEM; 2297 sp = nfs4_get_state_owner(server, cred, GFP_KERNEL); 2298 if (sp == NULL) { 2299 dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n"); 2300 goto out_err; 2301 } 2302 status = nfs4_recover_expired_lease(server); 2303 if (status != 0) 2304 goto err_put_state_owner; 2305 if (dentry->d_inode != NULL) 2306 nfs4_return_incompatible_delegation(dentry->d_inode, fmode); 2307 status = -ENOMEM; 2308 if (dentry->d_inode) 2309 claim = NFS4_OPEN_CLAIM_FH; 2310 opendata = nfs4_opendata_alloc(dentry, sp, fmode, flags, sattr, 2311 label, claim, GFP_KERNEL); 2312 if (opendata == NULL) 2313 goto err_put_state_owner; 2314 2315 if (label) { 2316 olabel = nfs4_label_alloc(server, GFP_KERNEL); 2317 if (IS_ERR(olabel)) { 2318 status = PTR_ERR(olabel); 2319 goto err_opendata_put; 2320 } 2321 } 2322 2323 if (server->attr_bitmask[2] & FATTR4_WORD2_MDSTHRESHOLD) { 2324 if (!opendata->f_attr.mdsthreshold) { 2325 opendata->f_attr.mdsthreshold = pnfs_mdsthreshold_alloc(); 2326 if (!opendata->f_attr.mdsthreshold) 2327 goto err_free_label; 2328 } 2329 opendata->o_arg.open_bitmap = &nfs4_pnfs_open_bitmap[0]; 2330 } 2331 if (dentry->d_inode != NULL) 2332 opendata->state = nfs4_get_open_state(dentry->d_inode, sp); 2333 2334 status = _nfs4_open_and_get_state(opendata, fmode, flags, ctx); 2335 if (status != 0) 2336 goto err_free_label; 2337 state = ctx->state; 2338 2339 if ((opendata->o_arg.open_flags & O_EXCL) && 2340 (opendata->o_arg.createmode != NFS4_CREATE_GUARDED)) { 2341 nfs4_exclusive_attrset(opendata, sattr); 2342 2343 nfs_fattr_init(opendata->o_res.f_attr); 2344 status = nfs4_do_setattr(state->inode, cred, 2345 opendata->o_res.f_attr, sattr, 2346 state, label, olabel); 2347 if (status == 0) { 2348 nfs_setattr_update_inode(state->inode, sattr); 2349 nfs_post_op_update_inode(state->inode, opendata->o_res.f_attr); 2350 nfs_setsecurity(state->inode, opendata->o_res.f_attr, olabel); 2351 } 2352 } 2353 if (opendata->file_created) 2354 *opened |= FILE_CREATED; 2355 2356 if (pnfs_use_threshold(ctx_th, opendata->f_attr.mdsthreshold, server)) { 2357 *ctx_th = opendata->f_attr.mdsthreshold; 2358 opendata->f_attr.mdsthreshold = NULL; 2359 } 2360 2361 nfs4_label_free(olabel); 2362 2363 nfs4_opendata_put(opendata); 2364 nfs4_put_state_owner(sp); 2365 return 0; 2366 err_free_label: 2367 nfs4_label_free(olabel); 2368 err_opendata_put: 2369 nfs4_opendata_put(opendata); 2370 err_put_state_owner: 2371 nfs4_put_state_owner(sp); 2372 out_err: 2373 return status; 2374 } 2375 2376 2377 static struct nfs4_state *nfs4_do_open(struct inode *dir, 2378 struct nfs_open_context *ctx, 2379 int flags, 2380 struct iattr *sattr, 2381 struct nfs4_label *label, 2382 int *opened) 2383 { 2384 struct nfs_server *server = NFS_SERVER(dir); 2385 struct nfs4_exception exception = { }; 2386 struct nfs4_state *res; 2387 int status; 2388 2389 do { 2390 status = _nfs4_do_open(dir, ctx, flags, sattr, label, opened); 2391 res = ctx->state; 2392 trace_nfs4_open_file(ctx, flags, status); 2393 if (status == 0) 2394 break; 2395 /* NOTE: BAD_SEQID means the server and client disagree about the 2396 * book-keeping w.r.t. state-changing operations 2397 * (OPEN/CLOSE/LOCK/LOCKU...) 2398 * It is actually a sign of a bug on the client or on the server. 2399 * 2400 * If we receive a BAD_SEQID error in the particular case of 2401 * doing an OPEN, we assume that nfs_increment_open_seqid() will 2402 * have unhashed the old state_owner for us, and that we can 2403 * therefore safely retry using a new one. We should still warn 2404 * the user though... 2405 */ 2406 if (status == -NFS4ERR_BAD_SEQID) { 2407 pr_warn_ratelimited("NFS: v4 server %s " 2408 " returned a bad sequence-id error!\n", 2409 NFS_SERVER(dir)->nfs_client->cl_hostname); 2410 exception.retry = 1; 2411 continue; 2412 } 2413 /* 2414 * BAD_STATEID on OPEN means that the server cancelled our 2415 * state before it received the OPEN_CONFIRM. 2416 * Recover by retrying the request as per the discussion 2417 * on Page 181 of RFC3530. 2418 */ 2419 if (status == -NFS4ERR_BAD_STATEID) { 2420 exception.retry = 1; 2421 continue; 2422 } 2423 if (status == -EAGAIN) { 2424 /* We must have found a delegation */ 2425 exception.retry = 1; 2426 continue; 2427 } 2428 if (nfs4_clear_cap_atomic_open_v1(server, status, &exception)) 2429 continue; 2430 res = ERR_PTR(nfs4_handle_exception(server, 2431 status, &exception)); 2432 } while (exception.retry); 2433 return res; 2434 } 2435 2436 static int _nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred, 2437 struct nfs_fattr *fattr, struct iattr *sattr, 2438 struct nfs4_state *state, struct nfs4_label *ilabel, 2439 struct nfs4_label *olabel) 2440 { 2441 struct nfs_server *server = NFS_SERVER(inode); 2442 struct nfs_setattrargs arg = { 2443 .fh = NFS_FH(inode), 2444 .iap = sattr, 2445 .server = server, 2446 .bitmask = server->attr_bitmask, 2447 .label = ilabel, 2448 }; 2449 struct nfs_setattrres res = { 2450 .fattr = fattr, 2451 .label = olabel, 2452 .server = server, 2453 }; 2454 struct rpc_message msg = { 2455 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETATTR], 2456 .rpc_argp = &arg, 2457 .rpc_resp = &res, 2458 .rpc_cred = cred, 2459 }; 2460 unsigned long timestamp = jiffies; 2461 fmode_t fmode; 2462 bool truncate; 2463 int status; 2464 2465 arg.bitmask = nfs4_bitmask(server, ilabel); 2466 if (ilabel) 2467 arg.bitmask = nfs4_bitmask(server, olabel); 2468 2469 nfs_fattr_init(fattr); 2470 2471 /* Servers should only apply open mode checks for file size changes */ 2472 truncate = (sattr->ia_valid & ATTR_SIZE) ? true : false; 2473 fmode = truncate ? FMODE_WRITE : FMODE_READ; 2474 2475 if (nfs4_copy_delegation_stateid(&arg.stateid, inode, fmode)) { 2476 /* Use that stateid */ 2477 } else if (truncate && state != NULL) { 2478 struct nfs_lockowner lockowner = { 2479 .l_owner = current->files, 2480 .l_pid = current->tgid, 2481 }; 2482 if (!nfs4_valid_open_stateid(state)) 2483 return -EBADF; 2484 if (nfs4_select_rw_stateid(&arg.stateid, state, FMODE_WRITE, 2485 &lockowner) == -EIO) 2486 return -EBADF; 2487 } else 2488 nfs4_stateid_copy(&arg.stateid, &zero_stateid); 2489 2490 status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1); 2491 if (status == 0 && state != NULL) 2492 renew_lease(server, timestamp); 2493 return status; 2494 } 2495 2496 static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred, 2497 struct nfs_fattr *fattr, struct iattr *sattr, 2498 struct nfs4_state *state, struct nfs4_label *ilabel, 2499 struct nfs4_label *olabel) 2500 { 2501 struct nfs_server *server = NFS_SERVER(inode); 2502 struct nfs4_exception exception = { 2503 .state = state, 2504 .inode = inode, 2505 }; 2506 int err; 2507 do { 2508 err = _nfs4_do_setattr(inode, cred, fattr, sattr, state, ilabel, olabel); 2509 trace_nfs4_setattr(inode, err); 2510 switch (err) { 2511 case -NFS4ERR_OPENMODE: 2512 if (!(sattr->ia_valid & ATTR_SIZE)) { 2513 pr_warn_once("NFSv4: server %s is incorrectly " 2514 "applying open mode checks to " 2515 "a SETATTR that is not " 2516 "changing file size.\n", 2517 server->nfs_client->cl_hostname); 2518 } 2519 if (state && !(state->state & FMODE_WRITE)) { 2520 err = -EBADF; 2521 if (sattr->ia_valid & ATTR_OPEN) 2522 err = -EACCES; 2523 goto out; 2524 } 2525 } 2526 err = nfs4_handle_exception(server, err, &exception); 2527 } while (exception.retry); 2528 out: 2529 return err; 2530 } 2531 2532 struct nfs4_closedata { 2533 struct inode *inode; 2534 struct nfs4_state *state; 2535 struct nfs_closeargs arg; 2536 struct nfs_closeres res; 2537 struct nfs_fattr fattr; 2538 unsigned long timestamp; 2539 bool roc; 2540 u32 roc_barrier; 2541 }; 2542 2543 static void nfs4_free_closedata(void *data) 2544 { 2545 struct nfs4_closedata *calldata = data; 2546 struct nfs4_state_owner *sp = calldata->state->owner; 2547 struct super_block *sb = calldata->state->inode->i_sb; 2548 2549 if (calldata->roc) 2550 pnfs_roc_release(calldata->state->inode); 2551 nfs4_put_open_state(calldata->state); 2552 nfs_free_seqid(calldata->arg.seqid); 2553 nfs4_put_state_owner(sp); 2554 nfs_sb_deactive(sb); 2555 kfree(calldata); 2556 } 2557 2558 static void nfs4_close_done(struct rpc_task *task, void *data) 2559 { 2560 struct nfs4_closedata *calldata = data; 2561 struct nfs4_state *state = calldata->state; 2562 struct nfs_server *server = NFS_SERVER(calldata->inode); 2563 nfs4_stateid *res_stateid = NULL; 2564 2565 dprintk("%s: begin!\n", __func__); 2566 if (!nfs4_sequence_done(task, &calldata->res.seq_res)) 2567 return; 2568 trace_nfs4_close(state, &calldata->arg, &calldata->res, task->tk_status); 2569 /* hmm. we are done with the inode, and in the process of freeing 2570 * the state_owner. we keep this around to process errors 2571 */ 2572 switch (task->tk_status) { 2573 case 0: 2574 res_stateid = &calldata->res.stateid; 2575 if (calldata->arg.fmode == 0 && calldata->roc) 2576 pnfs_roc_set_barrier(state->inode, 2577 calldata->roc_barrier); 2578 renew_lease(server, calldata->timestamp); 2579 break; 2580 case -NFS4ERR_ADMIN_REVOKED: 2581 case -NFS4ERR_STALE_STATEID: 2582 case -NFS4ERR_OLD_STATEID: 2583 case -NFS4ERR_BAD_STATEID: 2584 case -NFS4ERR_EXPIRED: 2585 if (calldata->arg.fmode == 0) 2586 break; 2587 default: 2588 if (nfs4_async_handle_error(task, server, state) == -EAGAIN) { 2589 rpc_restart_call_prepare(task); 2590 goto out_release; 2591 } 2592 } 2593 nfs_clear_open_stateid(state, res_stateid, calldata->arg.fmode); 2594 out_release: 2595 nfs_release_seqid(calldata->arg.seqid); 2596 nfs_refresh_inode(calldata->inode, calldata->res.fattr); 2597 dprintk("%s: done, ret = %d!\n", __func__, task->tk_status); 2598 } 2599 2600 static void nfs4_close_prepare(struct rpc_task *task, void *data) 2601 { 2602 struct nfs4_closedata *calldata = data; 2603 struct nfs4_state *state = calldata->state; 2604 struct inode *inode = calldata->inode; 2605 bool is_rdonly, is_wronly, is_rdwr; 2606 int call_close = 0; 2607 2608 dprintk("%s: begin!\n", __func__); 2609 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0) 2610 goto out_wait; 2611 2612 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE]; 2613 spin_lock(&state->owner->so_lock); 2614 is_rdwr = test_bit(NFS_O_RDWR_STATE, &state->flags); 2615 is_rdonly = test_bit(NFS_O_RDONLY_STATE, &state->flags); 2616 is_wronly = test_bit(NFS_O_WRONLY_STATE, &state->flags); 2617 /* Calculate the current open share mode */ 2618 calldata->arg.fmode = 0; 2619 if (is_rdonly || is_rdwr) 2620 calldata->arg.fmode |= FMODE_READ; 2621 if (is_wronly || is_rdwr) 2622 calldata->arg.fmode |= FMODE_WRITE; 2623 /* Calculate the change in open mode */ 2624 if (state->n_rdwr == 0) { 2625 if (state->n_rdonly == 0) { 2626 call_close |= is_rdonly || is_rdwr; 2627 calldata->arg.fmode &= ~FMODE_READ; 2628 } 2629 if (state->n_wronly == 0) { 2630 call_close |= is_wronly || is_rdwr; 2631 calldata->arg.fmode &= ~FMODE_WRITE; 2632 } 2633 } 2634 if (!nfs4_valid_open_stateid(state)) 2635 call_close = 0; 2636 spin_unlock(&state->owner->so_lock); 2637 2638 if (!call_close) { 2639 /* Note: exit _without_ calling nfs4_close_done */ 2640 goto out_no_action; 2641 } 2642 2643 if (calldata->arg.fmode == 0) { 2644 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE]; 2645 if (calldata->roc && 2646 pnfs_roc_drain(inode, &calldata->roc_barrier, task)) { 2647 nfs_release_seqid(calldata->arg.seqid); 2648 goto out_wait; 2649 } 2650 } 2651 2652 nfs_fattr_init(calldata->res.fattr); 2653 calldata->timestamp = jiffies; 2654 if (nfs4_setup_sequence(NFS_SERVER(inode), 2655 &calldata->arg.seq_args, 2656 &calldata->res.seq_res, 2657 task) != 0) 2658 nfs_release_seqid(calldata->arg.seqid); 2659 dprintk("%s: done!\n", __func__); 2660 return; 2661 out_no_action: 2662 task->tk_action = NULL; 2663 out_wait: 2664 nfs4_sequence_done(task, &calldata->res.seq_res); 2665 } 2666 2667 static const struct rpc_call_ops nfs4_close_ops = { 2668 .rpc_call_prepare = nfs4_close_prepare, 2669 .rpc_call_done = nfs4_close_done, 2670 .rpc_release = nfs4_free_closedata, 2671 }; 2672 2673 static bool nfs4_state_has_opener(struct nfs4_state *state) 2674 { 2675 /* first check existing openers */ 2676 if (test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0 && 2677 state->n_rdonly != 0) 2678 return true; 2679 2680 if (test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0 && 2681 state->n_wronly != 0) 2682 return true; 2683 2684 if (test_bit(NFS_O_RDWR_STATE, &state->flags) != 0 && 2685 state->n_rdwr != 0) 2686 return true; 2687 2688 return false; 2689 } 2690 2691 static bool nfs4_roc(struct inode *inode) 2692 { 2693 struct nfs_inode *nfsi = NFS_I(inode); 2694 struct nfs_open_context *ctx; 2695 struct nfs4_state *state; 2696 2697 spin_lock(&inode->i_lock); 2698 list_for_each_entry(ctx, &nfsi->open_files, list) { 2699 state = ctx->state; 2700 if (state == NULL) 2701 continue; 2702 if (nfs4_state_has_opener(state)) { 2703 spin_unlock(&inode->i_lock); 2704 return false; 2705 } 2706 } 2707 spin_unlock(&inode->i_lock); 2708 2709 if (nfs4_check_delegation(inode, FMODE_READ)) 2710 return false; 2711 2712 return pnfs_roc(inode); 2713 } 2714 2715 /* 2716 * It is possible for data to be read/written from a mem-mapped file 2717 * after the sys_close call (which hits the vfs layer as a flush). 2718 * This means that we can't safely call nfsv4 close on a file until 2719 * the inode is cleared. This in turn means that we are not good 2720 * NFSv4 citizens - we do not indicate to the server to update the file's 2721 * share state even when we are done with one of the three share 2722 * stateid's in the inode. 2723 * 2724 * NOTE: Caller must be holding the sp->so_owner semaphore! 2725 */ 2726 int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int wait) 2727 { 2728 struct nfs_server *server = NFS_SERVER(state->inode); 2729 struct nfs4_closedata *calldata; 2730 struct nfs4_state_owner *sp = state->owner; 2731 struct rpc_task *task; 2732 struct rpc_message msg = { 2733 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE], 2734 .rpc_cred = state->owner->so_cred, 2735 }; 2736 struct rpc_task_setup task_setup_data = { 2737 .rpc_client = server->client, 2738 .rpc_message = &msg, 2739 .callback_ops = &nfs4_close_ops, 2740 .workqueue = nfsiod_workqueue, 2741 .flags = RPC_TASK_ASYNC, 2742 }; 2743 int status = -ENOMEM; 2744 2745 nfs4_state_protect(server->nfs_client, NFS_SP4_MACH_CRED_CLEANUP, 2746 &task_setup_data.rpc_client, &msg); 2747 2748 calldata = kzalloc(sizeof(*calldata), gfp_mask); 2749 if (calldata == NULL) 2750 goto out; 2751 nfs4_init_sequence(&calldata->arg.seq_args, &calldata->res.seq_res, 1); 2752 calldata->inode = state->inode; 2753 calldata->state = state; 2754 calldata->arg.fh = NFS_FH(state->inode); 2755 calldata->arg.stateid = &state->open_stateid; 2756 /* Serialization for the sequence id */ 2757 calldata->arg.seqid = nfs_alloc_seqid(&state->owner->so_seqid, gfp_mask); 2758 if (calldata->arg.seqid == NULL) 2759 goto out_free_calldata; 2760 calldata->arg.fmode = 0; 2761 calldata->arg.bitmask = server->cache_consistency_bitmask; 2762 calldata->res.fattr = &calldata->fattr; 2763 calldata->res.seqid = calldata->arg.seqid; 2764 calldata->res.server = server; 2765 calldata->roc = nfs4_roc(state->inode); 2766 nfs_sb_active(calldata->inode->i_sb); 2767 2768 msg.rpc_argp = &calldata->arg; 2769 msg.rpc_resp = &calldata->res; 2770 task_setup_data.callback_data = calldata; 2771 task = rpc_run_task(&task_setup_data); 2772 if (IS_ERR(task)) 2773 return PTR_ERR(task); 2774 status = 0; 2775 if (wait) 2776 status = rpc_wait_for_completion_task(task); 2777 rpc_put_task(task); 2778 return status; 2779 out_free_calldata: 2780 kfree(calldata); 2781 out: 2782 nfs4_put_open_state(state); 2783 nfs4_put_state_owner(sp); 2784 return status; 2785 } 2786 2787 static struct inode * 2788 nfs4_atomic_open(struct inode *dir, struct nfs_open_context *ctx, 2789 int open_flags, struct iattr *attr, int *opened) 2790 { 2791 struct nfs4_state *state; 2792 struct nfs4_label l = {0, 0, 0, NULL}, *label = NULL; 2793 2794 label = nfs4_label_init_security(dir, ctx->dentry, attr, &l); 2795 2796 /* Protect against concurrent sillydeletes */ 2797 state = nfs4_do_open(dir, ctx, open_flags, attr, label, opened); 2798 2799 nfs4_label_release_security(label); 2800 2801 if (IS_ERR(state)) 2802 return ERR_CAST(state); 2803 return state->inode; 2804 } 2805 2806 static void nfs4_close_context(struct nfs_open_context *ctx, int is_sync) 2807 { 2808 if (ctx->state == NULL) 2809 return; 2810 if (is_sync) 2811 nfs4_close_sync(ctx->state, ctx->mode); 2812 else 2813 nfs4_close_state(ctx->state, ctx->mode); 2814 } 2815 2816 #define FATTR4_WORD1_NFS40_MASK (2*FATTR4_WORD1_MOUNTED_ON_FILEID - 1UL) 2817 #define FATTR4_WORD2_NFS41_MASK (2*FATTR4_WORD2_SUPPATTR_EXCLCREAT - 1UL) 2818 #define FATTR4_WORD2_NFS42_MASK (2*FATTR4_WORD2_SECURITY_LABEL - 1UL) 2819 2820 static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle) 2821 { 2822 struct nfs4_server_caps_arg args = { 2823 .fhandle = fhandle, 2824 }; 2825 struct nfs4_server_caps_res res = {}; 2826 struct rpc_message msg = { 2827 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SERVER_CAPS], 2828 .rpc_argp = &args, 2829 .rpc_resp = &res, 2830 }; 2831 int status; 2832 2833 status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0); 2834 if (status == 0) { 2835 /* Sanity check the server answers */ 2836 switch (server->nfs_client->cl_minorversion) { 2837 case 0: 2838 res.attr_bitmask[1] &= FATTR4_WORD1_NFS40_MASK; 2839 res.attr_bitmask[2] = 0; 2840 break; 2841 case 1: 2842 res.attr_bitmask[2] &= FATTR4_WORD2_NFS41_MASK; 2843 break; 2844 case 2: 2845 res.attr_bitmask[2] &= FATTR4_WORD2_NFS42_MASK; 2846 } 2847 memcpy(server->attr_bitmask, res.attr_bitmask, sizeof(server->attr_bitmask)); 2848 server->caps &= ~(NFS_CAP_ACLS|NFS_CAP_HARDLINKS| 2849 NFS_CAP_SYMLINKS|NFS_CAP_FILEID| 2850 NFS_CAP_MODE|NFS_CAP_NLINK|NFS_CAP_OWNER| 2851 NFS_CAP_OWNER_GROUP|NFS_CAP_ATIME| 2852 NFS_CAP_CTIME|NFS_CAP_MTIME| 2853 NFS_CAP_SECURITY_LABEL); 2854 if (res.attr_bitmask[0] & FATTR4_WORD0_ACL && 2855 res.acl_bitmask & ACL4_SUPPORT_ALLOW_ACL) 2856 server->caps |= NFS_CAP_ACLS; 2857 if (res.has_links != 0) 2858 server->caps |= NFS_CAP_HARDLINKS; 2859 if (res.has_symlinks != 0) 2860 server->caps |= NFS_CAP_SYMLINKS; 2861 if (res.attr_bitmask[0] & FATTR4_WORD0_FILEID) 2862 server->caps |= NFS_CAP_FILEID; 2863 if (res.attr_bitmask[1] & FATTR4_WORD1_MODE) 2864 server->caps |= NFS_CAP_MODE; 2865 if (res.attr_bitmask[1] & FATTR4_WORD1_NUMLINKS) 2866 server->caps |= NFS_CAP_NLINK; 2867 if (res.attr_bitmask[1] & FATTR4_WORD1_OWNER) 2868 server->caps |= NFS_CAP_OWNER; 2869 if (res.attr_bitmask[1] & FATTR4_WORD1_OWNER_GROUP) 2870 server->caps |= NFS_CAP_OWNER_GROUP; 2871 if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_ACCESS) 2872 server->caps |= NFS_CAP_ATIME; 2873 if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_METADATA) 2874 server->caps |= NFS_CAP_CTIME; 2875 if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_MODIFY) 2876 server->caps |= NFS_CAP_MTIME; 2877 #ifdef CONFIG_NFS_V4_SECURITY_LABEL 2878 if (res.attr_bitmask[2] & FATTR4_WORD2_SECURITY_LABEL) 2879 server->caps |= NFS_CAP_SECURITY_LABEL; 2880 #endif 2881 memcpy(server->attr_bitmask_nl, res.attr_bitmask, 2882 sizeof(server->attr_bitmask)); 2883 server->attr_bitmask_nl[2] &= ~FATTR4_WORD2_SECURITY_LABEL; 2884 2885 memcpy(server->cache_consistency_bitmask, res.attr_bitmask, sizeof(server->cache_consistency_bitmask)); 2886 server->cache_consistency_bitmask[0] &= FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE; 2887 server->cache_consistency_bitmask[1] &= FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY; 2888 server->cache_consistency_bitmask[2] = 0; 2889 server->acl_bitmask = res.acl_bitmask; 2890 server->fh_expire_type = res.fh_expire_type; 2891 } 2892 2893 return status; 2894 } 2895 2896 int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle) 2897 { 2898 struct nfs4_exception exception = { }; 2899 int err; 2900 do { 2901 err = nfs4_handle_exception(server, 2902 _nfs4_server_capabilities(server, fhandle), 2903 &exception); 2904 } while (exception.retry); 2905 return err; 2906 } 2907 2908 static int _nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle, 2909 struct nfs_fsinfo *info) 2910 { 2911 u32 bitmask[3]; 2912 struct nfs4_lookup_root_arg args = { 2913 .bitmask = bitmask, 2914 }; 2915 struct nfs4_lookup_res res = { 2916 .server = server, 2917 .fattr = info->fattr, 2918 .fh = fhandle, 2919 }; 2920 struct rpc_message msg = { 2921 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP_ROOT], 2922 .rpc_argp = &args, 2923 .rpc_resp = &res, 2924 }; 2925 2926 bitmask[0] = nfs4_fattr_bitmap[0]; 2927 bitmask[1] = nfs4_fattr_bitmap[1]; 2928 /* 2929 * Process the label in the upcoming getfattr 2930 */ 2931 bitmask[2] = nfs4_fattr_bitmap[2] & ~FATTR4_WORD2_SECURITY_LABEL; 2932 2933 nfs_fattr_init(info->fattr); 2934 return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0); 2935 } 2936 2937 static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle, 2938 struct nfs_fsinfo *info) 2939 { 2940 struct nfs4_exception exception = { }; 2941 int err; 2942 do { 2943 err = _nfs4_lookup_root(server, fhandle, info); 2944 trace_nfs4_lookup_root(server, fhandle, info->fattr, err); 2945 switch (err) { 2946 case 0: 2947 case -NFS4ERR_WRONGSEC: 2948 goto out; 2949 default: 2950 err = nfs4_handle_exception(server, err, &exception); 2951 } 2952 } while (exception.retry); 2953 out: 2954 return err; 2955 } 2956 2957 static int nfs4_lookup_root_sec(struct nfs_server *server, struct nfs_fh *fhandle, 2958 struct nfs_fsinfo *info, rpc_authflavor_t flavor) 2959 { 2960 struct rpc_auth_create_args auth_args = { 2961 .pseudoflavor = flavor, 2962 }; 2963 struct rpc_auth *auth; 2964 int ret; 2965 2966 auth = rpcauth_create(&auth_args, server->client); 2967 if (IS_ERR(auth)) { 2968 ret = -EACCES; 2969 goto out; 2970 } 2971 ret = nfs4_lookup_root(server, fhandle, info); 2972 out: 2973 return ret; 2974 } 2975 2976 /* 2977 * Retry pseudoroot lookup with various security flavors. We do this when: 2978 * 2979 * NFSv4.0: the PUTROOTFH operation returns NFS4ERR_WRONGSEC 2980 * NFSv4.1: the server does not support the SECINFO_NO_NAME operation 2981 * 2982 * Returns zero on success, or a negative NFS4ERR value, or a 2983 * negative errno value. 2984 */ 2985 static int nfs4_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle, 2986 struct nfs_fsinfo *info) 2987 { 2988 /* Per 3530bis 15.33.5 */ 2989 static const rpc_authflavor_t flav_array[] = { 2990 RPC_AUTH_GSS_KRB5P, 2991 RPC_AUTH_GSS_KRB5I, 2992 RPC_AUTH_GSS_KRB5, 2993 RPC_AUTH_UNIX, /* courtesy */ 2994 RPC_AUTH_NULL, 2995 }; 2996 int status = -EPERM; 2997 size_t i; 2998 2999 if (server->auth_info.flavor_len > 0) { 3000 /* try each flavor specified by user */ 3001 for (i = 0; i < server->auth_info.flavor_len; i++) { 3002 status = nfs4_lookup_root_sec(server, fhandle, info, 3003 server->auth_info.flavors[i]); 3004 if (status == -NFS4ERR_WRONGSEC || status == -EACCES) 3005 continue; 3006 break; 3007 } 3008 } else { 3009 /* no flavors specified by user, try default list */ 3010 for (i = 0; i < ARRAY_SIZE(flav_array); i++) { 3011 status = nfs4_lookup_root_sec(server, fhandle, info, 3012 flav_array[i]); 3013 if (status == -NFS4ERR_WRONGSEC || status == -EACCES) 3014 continue; 3015 break; 3016 } 3017 } 3018 3019 /* 3020 * -EACCESS could mean that the user doesn't have correct permissions 3021 * to access the mount. It could also mean that we tried to mount 3022 * with a gss auth flavor, but rpc.gssd isn't running. Either way, 3023 * existing mount programs don't handle -EACCES very well so it should 3024 * be mapped to -EPERM instead. 3025 */ 3026 if (status == -EACCES) 3027 status = -EPERM; 3028 return status; 3029 } 3030 3031 static int nfs4_do_find_root_sec(struct nfs_server *server, 3032 struct nfs_fh *fhandle, struct nfs_fsinfo *info) 3033 { 3034 int mv = server->nfs_client->cl_minorversion; 3035 return nfs_v4_minor_ops[mv]->find_root_sec(server, fhandle, info); 3036 } 3037 3038 /** 3039 * nfs4_proc_get_rootfh - get file handle for server's pseudoroot 3040 * @server: initialized nfs_server handle 3041 * @fhandle: we fill in the pseudo-fs root file handle 3042 * @info: we fill in an FSINFO struct 3043 * @auth_probe: probe the auth flavours 3044 * 3045 * Returns zero on success, or a negative errno. 3046 */ 3047 int nfs4_proc_get_rootfh(struct nfs_server *server, struct nfs_fh *fhandle, 3048 struct nfs_fsinfo *info, 3049 bool auth_probe) 3050 { 3051 int status; 3052 3053 switch (auth_probe) { 3054 case false: 3055 status = nfs4_lookup_root(server, fhandle, info); 3056 if (status != -NFS4ERR_WRONGSEC) 3057 break; 3058 default: 3059 status = nfs4_do_find_root_sec(server, fhandle, info); 3060 } 3061 3062 if (status == 0) 3063 status = nfs4_server_capabilities(server, fhandle); 3064 if (status == 0) 3065 status = nfs4_do_fsinfo(server, fhandle, info); 3066 3067 return nfs4_map_errors(status); 3068 } 3069 3070 static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *mntfh, 3071 struct nfs_fsinfo *info) 3072 { 3073 int error; 3074 struct nfs_fattr *fattr = info->fattr; 3075 struct nfs4_label *label = NULL; 3076 3077 error = nfs4_server_capabilities(server, mntfh); 3078 if (error < 0) { 3079 dprintk("nfs4_get_root: getcaps error = %d\n", -error); 3080 return error; 3081 } 3082 3083 label = nfs4_label_alloc(server, GFP_KERNEL); 3084 if (IS_ERR(label)) 3085 return PTR_ERR(label); 3086 3087 error = nfs4_proc_getattr(server, mntfh, fattr, label); 3088 if (error < 0) { 3089 dprintk("nfs4_get_root: getattr error = %d\n", -error); 3090 goto err_free_label; 3091 } 3092 3093 if (fattr->valid & NFS_ATTR_FATTR_FSID && 3094 !nfs_fsid_equal(&server->fsid, &fattr->fsid)) 3095 memcpy(&server->fsid, &fattr->fsid, sizeof(server->fsid)); 3096 3097 err_free_label: 3098 nfs4_label_free(label); 3099 3100 return error; 3101 } 3102 3103 /* 3104 * Get locations and (maybe) other attributes of a referral. 3105 * Note that we'll actually follow the referral later when 3106 * we detect fsid mismatch in inode revalidation 3107 */ 3108 static int nfs4_get_referral(struct rpc_clnt *client, struct inode *dir, 3109 const struct qstr *name, struct nfs_fattr *fattr, 3110 struct nfs_fh *fhandle) 3111 { 3112 int status = -ENOMEM; 3113 struct page *page = NULL; 3114 struct nfs4_fs_locations *locations = NULL; 3115 3116 page = alloc_page(GFP_KERNEL); 3117 if (page == NULL) 3118 goto out; 3119 locations = kmalloc(sizeof(struct nfs4_fs_locations), GFP_KERNEL); 3120 if (locations == NULL) 3121 goto out; 3122 3123 status = nfs4_proc_fs_locations(client, dir, name, locations, page); 3124 if (status != 0) 3125 goto out; 3126 3127 /* 3128 * If the fsid didn't change, this is a migration event, not a 3129 * referral. Cause us to drop into the exception handler, which 3130 * will kick off migration recovery. 3131 */ 3132 if (nfs_fsid_equal(&NFS_SERVER(dir)->fsid, &locations->fattr.fsid)) { 3133 dprintk("%s: server did not return a different fsid for" 3134 " a referral at %s\n", __func__, name->name); 3135 status = -NFS4ERR_MOVED; 3136 goto out; 3137 } 3138 /* Fixup attributes for the nfs_lookup() call to nfs_fhget() */ 3139 nfs_fixup_referral_attributes(&locations->fattr); 3140 3141 /* replace the lookup nfs_fattr with the locations nfs_fattr */ 3142 memcpy(fattr, &locations->fattr, sizeof(struct nfs_fattr)); 3143 memset(fhandle, 0, sizeof(struct nfs_fh)); 3144 out: 3145 if (page) 3146 __free_page(page); 3147 kfree(locations); 3148 return status; 3149 } 3150 3151 static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, 3152 struct nfs_fattr *fattr, struct nfs4_label *label) 3153 { 3154 struct nfs4_getattr_arg args = { 3155 .fh = fhandle, 3156 .bitmask = server->attr_bitmask, 3157 }; 3158 struct nfs4_getattr_res res = { 3159 .fattr = fattr, 3160 .label = label, 3161 .server = server, 3162 }; 3163 struct rpc_message msg = { 3164 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETATTR], 3165 .rpc_argp = &args, 3166 .rpc_resp = &res, 3167 }; 3168 3169 args.bitmask = nfs4_bitmask(server, label); 3170 3171 nfs_fattr_init(fattr); 3172 return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0); 3173 } 3174 3175 static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, 3176 struct nfs_fattr *fattr, struct nfs4_label *label) 3177 { 3178 struct nfs4_exception exception = { }; 3179 int err; 3180 do { 3181 err = _nfs4_proc_getattr(server, fhandle, fattr, label); 3182 trace_nfs4_getattr(server, fhandle, fattr, err); 3183 err = nfs4_handle_exception(server, err, 3184 &exception); 3185 } while (exception.retry); 3186 return err; 3187 } 3188 3189 /* 3190 * The file is not closed if it is opened due to the a request to change 3191 * the size of the file. The open call will not be needed once the 3192 * VFS layer lookup-intents are implemented. 3193 * 3194 * Close is called when the inode is destroyed. 3195 * If we haven't opened the file for O_WRONLY, we 3196 * need to in the size_change case to obtain a stateid. 3197 * 3198 * Got race? 3199 * Because OPEN is always done by name in nfsv4, it is 3200 * possible that we opened a different file by the same 3201 * name. We can recognize this race condition, but we 3202 * can't do anything about it besides returning an error. 3203 * 3204 * This will be fixed with VFS changes (lookup-intent). 3205 */ 3206 static int 3207 nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr, 3208 struct iattr *sattr) 3209 { 3210 struct inode *inode = dentry->d_inode; 3211 struct rpc_cred *cred = NULL; 3212 struct nfs4_state *state = NULL; 3213 struct nfs4_label *label = NULL; 3214 int status; 3215 3216 if (pnfs_ld_layoutret_on_setattr(inode)) 3217 pnfs_commit_and_return_layout(inode); 3218 3219 nfs_fattr_init(fattr); 3220 3221 /* Deal with open(O_TRUNC) */ 3222 if (sattr->ia_valid & ATTR_OPEN) 3223 sattr->ia_valid &= ~(ATTR_MTIME|ATTR_CTIME); 3224 3225 /* Optimization: if the end result is no change, don't RPC */ 3226 if ((sattr->ia_valid & ~(ATTR_FILE|ATTR_OPEN)) == 0) 3227 return 0; 3228 3229 /* Search for an existing open(O_WRITE) file */ 3230 if (sattr->ia_valid & ATTR_FILE) { 3231 struct nfs_open_context *ctx; 3232 3233 ctx = nfs_file_open_context(sattr->ia_file); 3234 if (ctx) { 3235 cred = ctx->cred; 3236 state = ctx->state; 3237 } 3238 } 3239 3240 label = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL); 3241 if (IS_ERR(label)) 3242 return PTR_ERR(label); 3243 3244 status = nfs4_do_setattr(inode, cred, fattr, sattr, state, NULL, label); 3245 if (status == 0) { 3246 nfs_setattr_update_inode(inode, sattr); 3247 nfs_setsecurity(inode, fattr, label); 3248 } 3249 nfs4_label_free(label); 3250 return status; 3251 } 3252 3253 static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir, 3254 const struct qstr *name, struct nfs_fh *fhandle, 3255 struct nfs_fattr *fattr, struct nfs4_label *label) 3256 { 3257 struct nfs_server *server = NFS_SERVER(dir); 3258 int status; 3259 struct nfs4_lookup_arg args = { 3260 .bitmask = server->attr_bitmask, 3261 .dir_fh = NFS_FH(dir), 3262 .name = name, 3263 }; 3264 struct nfs4_lookup_res res = { 3265 .server = server, 3266 .fattr = fattr, 3267 .label = label, 3268 .fh = fhandle, 3269 }; 3270 struct rpc_message msg = { 3271 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP], 3272 .rpc_argp = &args, 3273 .rpc_resp = &res, 3274 }; 3275 3276 args.bitmask = nfs4_bitmask(server, label); 3277 3278 nfs_fattr_init(fattr); 3279 3280 dprintk("NFS call lookup %s\n", name->name); 3281 status = nfs4_call_sync(clnt, server, &msg, &args.seq_args, &res.seq_res, 0); 3282 dprintk("NFS reply lookup: %d\n", status); 3283 return status; 3284 } 3285 3286 static void nfs_fixup_secinfo_attributes(struct nfs_fattr *fattr) 3287 { 3288 fattr->valid |= NFS_ATTR_FATTR_TYPE | NFS_ATTR_FATTR_MODE | 3289 NFS_ATTR_FATTR_NLINK | NFS_ATTR_FATTR_MOUNTPOINT; 3290 fattr->mode = S_IFDIR | S_IRUGO | S_IXUGO; 3291 fattr->nlink = 2; 3292 } 3293 3294 static int nfs4_proc_lookup_common(struct rpc_clnt **clnt, struct inode *dir, 3295 struct qstr *name, struct nfs_fh *fhandle, 3296 struct nfs_fattr *fattr, struct nfs4_label *label) 3297 { 3298 struct nfs4_exception exception = { }; 3299 struct rpc_clnt *client = *clnt; 3300 int err; 3301 do { 3302 err = _nfs4_proc_lookup(client, dir, name, fhandle, fattr, label); 3303 trace_nfs4_lookup(dir, name, err); 3304 switch (err) { 3305 case -NFS4ERR_BADNAME: 3306 err = -ENOENT; 3307 goto out; 3308 case -NFS4ERR_MOVED: 3309 err = nfs4_get_referral(client, dir, name, fattr, fhandle); 3310 goto out; 3311 case -NFS4ERR_WRONGSEC: 3312 err = -EPERM; 3313 if (client != *clnt) 3314 goto out; 3315 client = nfs4_negotiate_security(client, dir, name); 3316 if (IS_ERR(client)) 3317 return PTR_ERR(client); 3318 3319 exception.retry = 1; 3320 break; 3321 default: 3322 err = nfs4_handle_exception(NFS_SERVER(dir), err, &exception); 3323 } 3324 } while (exception.retry); 3325 3326 out: 3327 if (err == 0) 3328 *clnt = client; 3329 else if (client != *clnt) 3330 rpc_shutdown_client(client); 3331 3332 return err; 3333 } 3334 3335 static int nfs4_proc_lookup(struct inode *dir, struct qstr *name, 3336 struct nfs_fh *fhandle, struct nfs_fattr *fattr, 3337 struct nfs4_label *label) 3338 { 3339 int status; 3340 struct rpc_clnt *client = NFS_CLIENT(dir); 3341 3342 status = nfs4_proc_lookup_common(&client, dir, name, fhandle, fattr, label); 3343 if (client != NFS_CLIENT(dir)) { 3344 rpc_shutdown_client(client); 3345 nfs_fixup_secinfo_attributes(fattr); 3346 } 3347 return status; 3348 } 3349 3350 struct rpc_clnt * 3351 nfs4_proc_lookup_mountpoint(struct inode *dir, struct qstr *name, 3352 struct nfs_fh *fhandle, struct nfs_fattr *fattr) 3353 { 3354 struct rpc_clnt *client = NFS_CLIENT(dir); 3355 int status; 3356 3357 status = nfs4_proc_lookup_common(&client, dir, name, fhandle, fattr, NULL); 3358 if (status < 0) 3359 return ERR_PTR(status); 3360 return (client == NFS_CLIENT(dir)) ? rpc_clone_client(client) : client; 3361 } 3362 3363 static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry) 3364 { 3365 struct nfs_server *server = NFS_SERVER(inode); 3366 struct nfs4_accessargs args = { 3367 .fh = NFS_FH(inode), 3368 .bitmask = server->cache_consistency_bitmask, 3369 }; 3370 struct nfs4_accessres res = { 3371 .server = server, 3372 }; 3373 struct rpc_message msg = { 3374 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ACCESS], 3375 .rpc_argp = &args, 3376 .rpc_resp = &res, 3377 .rpc_cred = entry->cred, 3378 }; 3379 int mode = entry->mask; 3380 int status = 0; 3381 3382 /* 3383 * Determine which access bits we want to ask for... 3384 */ 3385 if (mode & MAY_READ) 3386 args.access |= NFS4_ACCESS_READ; 3387 if (S_ISDIR(inode->i_mode)) { 3388 if (mode & MAY_WRITE) 3389 args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE; 3390 if (mode & MAY_EXEC) 3391 args.access |= NFS4_ACCESS_LOOKUP; 3392 } else { 3393 if (mode & MAY_WRITE) 3394 args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND; 3395 if (mode & MAY_EXEC) 3396 args.access |= NFS4_ACCESS_EXECUTE; 3397 } 3398 3399 res.fattr = nfs_alloc_fattr(); 3400 if (res.fattr == NULL) 3401 return -ENOMEM; 3402 3403 status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0); 3404 if (!status) { 3405 nfs_access_set_mask(entry, res.access); 3406 nfs_refresh_inode(inode, res.fattr); 3407 } 3408 nfs_free_fattr(res.fattr); 3409 return status; 3410 } 3411 3412 static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry) 3413 { 3414 struct nfs4_exception exception = { }; 3415 int err; 3416 do { 3417 err = _nfs4_proc_access(inode, entry); 3418 trace_nfs4_access(inode, err); 3419 err = nfs4_handle_exception(NFS_SERVER(inode), err, 3420 &exception); 3421 } while (exception.retry); 3422 return err; 3423 } 3424 3425 /* 3426 * TODO: For the time being, we don't try to get any attributes 3427 * along with any of the zero-copy operations READ, READDIR, 3428 * READLINK, WRITE. 3429 * 3430 * In the case of the first three, we want to put the GETATTR 3431 * after the read-type operation -- this is because it is hard 3432 * to predict the length of a GETATTR response in v4, and thus 3433 * align the READ data correctly. This means that the GETATTR 3434 * may end up partially falling into the page cache, and we should 3435 * shift it into the 'tail' of the xdr_buf before processing. 3436 * To do this efficiently, we need to know the total length 3437 * of data received, which doesn't seem to be available outside 3438 * of the RPC layer. 3439 * 3440 * In the case of WRITE, we also want to put the GETATTR after 3441 * the operation -- in this case because we want to make sure 3442 * we get the post-operation mtime and size. 3443 * 3444 * Both of these changes to the XDR layer would in fact be quite 3445 * minor, but I decided to leave them for a subsequent patch. 3446 */ 3447 static int _nfs4_proc_readlink(struct inode *inode, struct page *page, 3448 unsigned int pgbase, unsigned int pglen) 3449 { 3450 struct nfs4_readlink args = { 3451 .fh = NFS_FH(inode), 3452 .pgbase = pgbase, 3453 .pglen = pglen, 3454 .pages = &page, 3455 }; 3456 struct nfs4_readlink_res res; 3457 struct rpc_message msg = { 3458 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READLINK], 3459 .rpc_argp = &args, 3460 .rpc_resp = &res, 3461 }; 3462 3463 return nfs4_call_sync(NFS_SERVER(inode)->client, NFS_SERVER(inode), &msg, &args.seq_args, &res.seq_res, 0); 3464 } 3465 3466 static int nfs4_proc_readlink(struct inode *inode, struct page *page, 3467 unsigned int pgbase, unsigned int pglen) 3468 { 3469 struct nfs4_exception exception = { }; 3470 int err; 3471 do { 3472 err = _nfs4_proc_readlink(inode, page, pgbase, pglen); 3473 trace_nfs4_readlink(inode, err); 3474 err = nfs4_handle_exception(NFS_SERVER(inode), err, 3475 &exception); 3476 } while (exception.retry); 3477 return err; 3478 } 3479 3480 /* 3481 * This is just for mknod. open(O_CREAT) will always do ->open_context(). 3482 */ 3483 static int 3484 nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, 3485 int flags) 3486 { 3487 struct nfs4_label l, *ilabel = NULL; 3488 struct nfs_open_context *ctx; 3489 struct nfs4_state *state; 3490 int opened = 0; 3491 int status = 0; 3492 3493 ctx = alloc_nfs_open_context(dentry, FMODE_READ); 3494 if (IS_ERR(ctx)) 3495 return PTR_ERR(ctx); 3496 3497 ilabel = nfs4_label_init_security(dir, dentry, sattr, &l); 3498 3499 sattr->ia_mode &= ~current_umask(); 3500 state = nfs4_do_open(dir, ctx, flags, sattr, ilabel, &opened); 3501 if (IS_ERR(state)) { 3502 status = PTR_ERR(state); 3503 goto out; 3504 } 3505 out: 3506 nfs4_label_release_security(ilabel); 3507 put_nfs_open_context(ctx); 3508 return status; 3509 } 3510 3511 static int _nfs4_proc_remove(struct inode *dir, struct qstr *name) 3512 { 3513 struct nfs_server *server = NFS_SERVER(dir); 3514 struct nfs_removeargs args = { 3515 .fh = NFS_FH(dir), 3516 .name = *name, 3517 }; 3518 struct nfs_removeres res = { 3519 .server = server, 3520 }; 3521 struct rpc_message msg = { 3522 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE], 3523 .rpc_argp = &args, 3524 .rpc_resp = &res, 3525 }; 3526 int status; 3527 3528 status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 1); 3529 if (status == 0) 3530 update_changeattr(dir, &res.cinfo); 3531 return status; 3532 } 3533 3534 static int nfs4_proc_remove(struct inode *dir, struct qstr *name) 3535 { 3536 struct nfs4_exception exception = { }; 3537 int err; 3538 do { 3539 err = _nfs4_proc_remove(dir, name); 3540 trace_nfs4_remove(dir, name, err); 3541 err = nfs4_handle_exception(NFS_SERVER(dir), err, 3542 &exception); 3543 } while (exception.retry); 3544 return err; 3545 } 3546 3547 static void nfs4_proc_unlink_setup(struct rpc_message *msg, struct inode *dir) 3548 { 3549 struct nfs_server *server = NFS_SERVER(dir); 3550 struct nfs_removeargs *args = msg->rpc_argp; 3551 struct nfs_removeres *res = msg->rpc_resp; 3552 3553 res->server = server; 3554 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE]; 3555 nfs4_init_sequence(&args->seq_args, &res->seq_res, 1); 3556 3557 nfs_fattr_init(res->dir_attr); 3558 } 3559 3560 static void nfs4_proc_unlink_rpc_prepare(struct rpc_task *task, struct nfs_unlinkdata *data) 3561 { 3562 nfs4_setup_sequence(NFS_SERVER(data->dir), 3563 &data->args.seq_args, 3564 &data->res.seq_res, 3565 task); 3566 } 3567 3568 static int nfs4_proc_unlink_done(struct rpc_task *task, struct inode *dir) 3569 { 3570 struct nfs_unlinkdata *data = task->tk_calldata; 3571 struct nfs_removeres *res = &data->res; 3572 3573 if (!nfs4_sequence_done(task, &res->seq_res)) 3574 return 0; 3575 if (nfs4_async_handle_error(task, res->server, NULL) == -EAGAIN) 3576 return 0; 3577 update_changeattr(dir, &res->cinfo); 3578 return 1; 3579 } 3580 3581 static void nfs4_proc_rename_setup(struct rpc_message *msg, struct inode *dir) 3582 { 3583 struct nfs_server *server = NFS_SERVER(dir); 3584 struct nfs_renameargs *arg = msg->rpc_argp; 3585 struct nfs_renameres *res = msg->rpc_resp; 3586 3587 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENAME]; 3588 res->server = server; 3589 nfs4_init_sequence(&arg->seq_args, &res->seq_res, 1); 3590 } 3591 3592 static void nfs4_proc_rename_rpc_prepare(struct rpc_task *task, struct nfs_renamedata *data) 3593 { 3594 nfs4_setup_sequence(NFS_SERVER(data->old_dir), 3595 &data->args.seq_args, 3596 &data->res.seq_res, 3597 task); 3598 } 3599 3600 static int nfs4_proc_rename_done(struct rpc_task *task, struct inode *old_dir, 3601 struct inode *new_dir) 3602 { 3603 struct nfs_renamedata *data = task->tk_calldata; 3604 struct nfs_renameres *res = &data->res; 3605 3606 if (!nfs4_sequence_done(task, &res->seq_res)) 3607 return 0; 3608 if (nfs4_async_handle_error(task, res->server, NULL) == -EAGAIN) 3609 return 0; 3610 3611 update_changeattr(old_dir, &res->old_cinfo); 3612 update_changeattr(new_dir, &res->new_cinfo); 3613 return 1; 3614 } 3615 3616 static int _nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name) 3617 { 3618 struct nfs_server *server = NFS_SERVER(inode); 3619 struct nfs4_link_arg arg = { 3620 .fh = NFS_FH(inode), 3621 .dir_fh = NFS_FH(dir), 3622 .name = name, 3623 .bitmask = server->attr_bitmask, 3624 }; 3625 struct nfs4_link_res res = { 3626 .server = server, 3627 .label = NULL, 3628 }; 3629 struct rpc_message msg = { 3630 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LINK], 3631 .rpc_argp = &arg, 3632 .rpc_resp = &res, 3633 }; 3634 int status = -ENOMEM; 3635 3636 res.fattr = nfs_alloc_fattr(); 3637 if (res.fattr == NULL) 3638 goto out; 3639 3640 res.label = nfs4_label_alloc(server, GFP_KERNEL); 3641 if (IS_ERR(res.label)) { 3642 status = PTR_ERR(res.label); 3643 goto out; 3644 } 3645 arg.bitmask = nfs4_bitmask(server, res.label); 3646 3647 status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1); 3648 if (!status) { 3649 update_changeattr(dir, &res.cinfo); 3650 status = nfs_post_op_update_inode(inode, res.fattr); 3651 if (!status) 3652 nfs_setsecurity(inode, res.fattr, res.label); 3653 } 3654 3655 3656 nfs4_label_free(res.label); 3657 3658 out: 3659 nfs_free_fattr(res.fattr); 3660 return status; 3661 } 3662 3663 static int nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name) 3664 { 3665 struct nfs4_exception exception = { }; 3666 int err; 3667 do { 3668 err = nfs4_handle_exception(NFS_SERVER(inode), 3669 _nfs4_proc_link(inode, dir, name), 3670 &exception); 3671 } while (exception.retry); 3672 return err; 3673 } 3674 3675 struct nfs4_createdata { 3676 struct rpc_message msg; 3677 struct nfs4_create_arg arg; 3678 struct nfs4_create_res res; 3679 struct nfs_fh fh; 3680 struct nfs_fattr fattr; 3681 struct nfs4_label *label; 3682 }; 3683 3684 static struct nfs4_createdata *nfs4_alloc_createdata(struct inode *dir, 3685 struct qstr *name, struct iattr *sattr, u32 ftype) 3686 { 3687 struct nfs4_createdata *data; 3688 3689 data = kzalloc(sizeof(*data), GFP_KERNEL); 3690 if (data != NULL) { 3691 struct nfs_server *server = NFS_SERVER(dir); 3692 3693 data->label = nfs4_label_alloc(server, GFP_KERNEL); 3694 if (IS_ERR(data->label)) 3695 goto out_free; 3696 3697 data->msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE]; 3698 data->msg.rpc_argp = &data->arg; 3699 data->msg.rpc_resp = &data->res; 3700 data->arg.dir_fh = NFS_FH(dir); 3701 data->arg.server = server; 3702 data->arg.name = name; 3703 data->arg.attrs = sattr; 3704 data->arg.ftype = ftype; 3705 data->arg.bitmask = nfs4_bitmask(server, data->label); 3706 data->res.server = server; 3707 data->res.fh = &data->fh; 3708 data->res.fattr = &data->fattr; 3709 data->res.label = data->label; 3710 nfs_fattr_init(data->res.fattr); 3711 } 3712 return data; 3713 out_free: 3714 kfree(data); 3715 return NULL; 3716 } 3717 3718 static int nfs4_do_create(struct inode *dir, struct dentry *dentry, struct nfs4_createdata *data) 3719 { 3720 int status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &data->msg, 3721 &data->arg.seq_args, &data->res.seq_res, 1); 3722 if (status == 0) { 3723 update_changeattr(dir, &data->res.dir_cinfo); 3724 status = nfs_instantiate(dentry, data->res.fh, data->res.fattr, data->res.label); 3725 } 3726 return status; 3727 } 3728 3729 static void nfs4_free_createdata(struct nfs4_createdata *data) 3730 { 3731 nfs4_label_free(data->label); 3732 kfree(data); 3733 } 3734 3735 static int _nfs4_proc_symlink(struct inode *dir, struct dentry *dentry, 3736 struct page *page, unsigned int len, struct iattr *sattr, 3737 struct nfs4_label *label) 3738 { 3739 struct nfs4_createdata *data; 3740 int status = -ENAMETOOLONG; 3741 3742 if (len > NFS4_MAXPATHLEN) 3743 goto out; 3744 3745 status = -ENOMEM; 3746 data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4LNK); 3747 if (data == NULL) 3748 goto out; 3749 3750 data->msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SYMLINK]; 3751 data->arg.u.symlink.pages = &page; 3752 data->arg.u.symlink.len = len; 3753 data->arg.label = label; 3754 3755 status = nfs4_do_create(dir, dentry, data); 3756 3757 nfs4_free_createdata(data); 3758 out: 3759 return status; 3760 } 3761 3762 static int nfs4_proc_symlink(struct inode *dir, struct dentry *dentry, 3763 struct page *page, unsigned int len, struct iattr *sattr) 3764 { 3765 struct nfs4_exception exception = { }; 3766 struct nfs4_label l, *label = NULL; 3767 int err; 3768 3769 label = nfs4_label_init_security(dir, dentry, sattr, &l); 3770 3771 do { 3772 err = _nfs4_proc_symlink(dir, dentry, page, len, sattr, label); 3773 trace_nfs4_symlink(dir, &dentry->d_name, err); 3774 err = nfs4_handle_exception(NFS_SERVER(dir), err, 3775 &exception); 3776 } while (exception.retry); 3777 3778 nfs4_label_release_security(label); 3779 return err; 3780 } 3781 3782 static int _nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry, 3783 struct iattr *sattr, struct nfs4_label *label) 3784 { 3785 struct nfs4_createdata *data; 3786 int status = -ENOMEM; 3787 3788 data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4DIR); 3789 if (data == NULL) 3790 goto out; 3791 3792 data->arg.label = label; 3793 status = nfs4_do_create(dir, dentry, data); 3794 3795 nfs4_free_createdata(data); 3796 out: 3797 return status; 3798 } 3799 3800 static int nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry, 3801 struct iattr *sattr) 3802 { 3803 struct nfs4_exception exception = { }; 3804 struct nfs4_label l, *label = NULL; 3805 int err; 3806 3807 label = nfs4_label_init_security(dir, dentry, sattr, &l); 3808 3809 sattr->ia_mode &= ~current_umask(); 3810 do { 3811 err = _nfs4_proc_mkdir(dir, dentry, sattr, label); 3812 trace_nfs4_mkdir(dir, &dentry->d_name, err); 3813 err = nfs4_handle_exception(NFS_SERVER(dir), err, 3814 &exception); 3815 } while (exception.retry); 3816 nfs4_label_release_security(label); 3817 3818 return err; 3819 } 3820 3821 static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, 3822 u64 cookie, struct page **pages, unsigned int count, int plus) 3823 { 3824 struct inode *dir = dentry->d_inode; 3825 struct nfs4_readdir_arg args = { 3826 .fh = NFS_FH(dir), 3827 .pages = pages, 3828 .pgbase = 0, 3829 .count = count, 3830 .bitmask = NFS_SERVER(dentry->d_inode)->attr_bitmask, 3831 .plus = plus, 3832 }; 3833 struct nfs4_readdir_res res; 3834 struct rpc_message msg = { 3835 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READDIR], 3836 .rpc_argp = &args, 3837 .rpc_resp = &res, 3838 .rpc_cred = cred, 3839 }; 3840 int status; 3841 3842 dprintk("%s: dentry = %pd2, cookie = %Lu\n", __func__, 3843 dentry, 3844 (unsigned long long)cookie); 3845 nfs4_setup_readdir(cookie, NFS_I(dir)->cookieverf, dentry, &args); 3846 res.pgbase = args.pgbase; 3847 status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0); 3848 if (status >= 0) { 3849 memcpy(NFS_I(dir)->cookieverf, res.verifier.data, NFS4_VERIFIER_SIZE); 3850 status += args.pgbase; 3851 } 3852 3853 nfs_invalidate_atime(dir); 3854 3855 dprintk("%s: returns %d\n", __func__, status); 3856 return status; 3857 } 3858 3859 static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, 3860 u64 cookie, struct page **pages, unsigned int count, int plus) 3861 { 3862 struct nfs4_exception exception = { }; 3863 int err; 3864 do { 3865 err = _nfs4_proc_readdir(dentry, cred, cookie, 3866 pages, count, plus); 3867 trace_nfs4_readdir(dentry->d_inode, err); 3868 err = nfs4_handle_exception(NFS_SERVER(dentry->d_inode), err, 3869 &exception); 3870 } while (exception.retry); 3871 return err; 3872 } 3873 3874 static int _nfs4_proc_mknod(struct inode *dir, struct dentry *dentry, 3875 struct iattr *sattr, struct nfs4_label *label, dev_t rdev) 3876 { 3877 struct nfs4_createdata *data; 3878 int mode = sattr->ia_mode; 3879 int status = -ENOMEM; 3880 3881 data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4SOCK); 3882 if (data == NULL) 3883 goto out; 3884 3885 if (S_ISFIFO(mode)) 3886 data->arg.ftype = NF4FIFO; 3887 else if (S_ISBLK(mode)) { 3888 data->arg.ftype = NF4BLK; 3889 data->arg.u.device.specdata1 = MAJOR(rdev); 3890 data->arg.u.device.specdata2 = MINOR(rdev); 3891 } 3892 else if (S_ISCHR(mode)) { 3893 data->arg.ftype = NF4CHR; 3894 data->arg.u.device.specdata1 = MAJOR(rdev); 3895 data->arg.u.device.specdata2 = MINOR(rdev); 3896 } else if (!S_ISSOCK(mode)) { 3897 status = -EINVAL; 3898 goto out_free; 3899 } 3900 3901 data->arg.label = label; 3902 status = nfs4_do_create(dir, dentry, data); 3903 out_free: 3904 nfs4_free_createdata(data); 3905 out: 3906 return status; 3907 } 3908 3909 static int nfs4_proc_mknod(struct inode *dir, struct dentry *dentry, 3910 struct iattr *sattr, dev_t rdev) 3911 { 3912 struct nfs4_exception exception = { }; 3913 struct nfs4_label l, *label = NULL; 3914 int err; 3915 3916 label = nfs4_label_init_security(dir, dentry, sattr, &l); 3917 3918 sattr->ia_mode &= ~current_umask(); 3919 do { 3920 err = _nfs4_proc_mknod(dir, dentry, sattr, label, rdev); 3921 trace_nfs4_mknod(dir, &dentry->d_name, err); 3922 err = nfs4_handle_exception(NFS_SERVER(dir), err, 3923 &exception); 3924 } while (exception.retry); 3925 3926 nfs4_label_release_security(label); 3927 3928 return err; 3929 } 3930 3931 static int _nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, 3932 struct nfs_fsstat *fsstat) 3933 { 3934 struct nfs4_statfs_arg args = { 3935 .fh = fhandle, 3936 .bitmask = server->attr_bitmask, 3937 }; 3938 struct nfs4_statfs_res res = { 3939 .fsstat = fsstat, 3940 }; 3941 struct rpc_message msg = { 3942 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_STATFS], 3943 .rpc_argp = &args, 3944 .rpc_resp = &res, 3945 }; 3946 3947 nfs_fattr_init(fsstat->fattr); 3948 return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0); 3949 } 3950 3951 static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *fsstat) 3952 { 3953 struct nfs4_exception exception = { }; 3954 int err; 3955 do { 3956 err = nfs4_handle_exception(server, 3957 _nfs4_proc_statfs(server, fhandle, fsstat), 3958 &exception); 3959 } while (exception.retry); 3960 return err; 3961 } 3962 3963 static int _nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, 3964 struct nfs_fsinfo *fsinfo) 3965 { 3966 struct nfs4_fsinfo_arg args = { 3967 .fh = fhandle, 3968 .bitmask = server->attr_bitmask, 3969 }; 3970 struct nfs4_fsinfo_res res = { 3971 .fsinfo = fsinfo, 3972 }; 3973 struct rpc_message msg = { 3974 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FSINFO], 3975 .rpc_argp = &args, 3976 .rpc_resp = &res, 3977 }; 3978 3979 return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0); 3980 } 3981 3982 static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo) 3983 { 3984 struct nfs4_exception exception = { }; 3985 unsigned long now = jiffies; 3986 int err; 3987 3988 do { 3989 err = _nfs4_do_fsinfo(server, fhandle, fsinfo); 3990 trace_nfs4_fsinfo(server, fhandle, fsinfo->fattr, err); 3991 if (err == 0) { 3992 struct nfs_client *clp = server->nfs_client; 3993 3994 spin_lock(&clp->cl_lock); 3995 clp->cl_lease_time = fsinfo->lease_time * HZ; 3996 clp->cl_last_renewal = now; 3997 spin_unlock(&clp->cl_lock); 3998 break; 3999 } 4000 err = nfs4_handle_exception(server, err, &exception); 4001 } while (exception.retry); 4002 return err; 4003 } 4004 4005 static int nfs4_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo) 4006 { 4007 int error; 4008 4009 nfs_fattr_init(fsinfo->fattr); 4010 error = nfs4_do_fsinfo(server, fhandle, fsinfo); 4011 if (error == 0) { 4012 /* block layout checks this! */ 4013 server->pnfs_blksize = fsinfo->blksize; 4014 set_pnfs_layoutdriver(server, fhandle, fsinfo->layouttype); 4015 } 4016 4017 return error; 4018 } 4019 4020 static int _nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle, 4021 struct nfs_pathconf *pathconf) 4022 { 4023 struct nfs4_pathconf_arg args = { 4024 .fh = fhandle, 4025 .bitmask = server->attr_bitmask, 4026 }; 4027 struct nfs4_pathconf_res res = { 4028 .pathconf = pathconf, 4029 }; 4030 struct rpc_message msg = { 4031 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_PATHCONF], 4032 .rpc_argp = &args, 4033 .rpc_resp = &res, 4034 }; 4035 4036 /* None of the pathconf attributes are mandatory to implement */ 4037 if ((args.bitmask[0] & nfs4_pathconf_bitmap[0]) == 0) { 4038 memset(pathconf, 0, sizeof(*pathconf)); 4039 return 0; 4040 } 4041 4042 nfs_fattr_init(pathconf->fattr); 4043 return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0); 4044 } 4045 4046 static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle, 4047 struct nfs_pathconf *pathconf) 4048 { 4049 struct nfs4_exception exception = { }; 4050 int err; 4051 4052 do { 4053 err = nfs4_handle_exception(server, 4054 _nfs4_proc_pathconf(server, fhandle, pathconf), 4055 &exception); 4056 } while (exception.retry); 4057 return err; 4058 } 4059 4060 int nfs4_set_rw_stateid(nfs4_stateid *stateid, 4061 const struct nfs_open_context *ctx, 4062 const struct nfs_lock_context *l_ctx, 4063 fmode_t fmode) 4064 { 4065 const struct nfs_lockowner *lockowner = NULL; 4066 4067 if (l_ctx != NULL) 4068 lockowner = &l_ctx->lockowner; 4069 return nfs4_select_rw_stateid(stateid, ctx->state, fmode, lockowner); 4070 } 4071 EXPORT_SYMBOL_GPL(nfs4_set_rw_stateid); 4072 4073 static bool nfs4_stateid_is_current(nfs4_stateid *stateid, 4074 const struct nfs_open_context *ctx, 4075 const struct nfs_lock_context *l_ctx, 4076 fmode_t fmode) 4077 { 4078 nfs4_stateid current_stateid; 4079 4080 /* If the current stateid represents a lost lock, then exit */ 4081 if (nfs4_set_rw_stateid(¤t_stateid, ctx, l_ctx, fmode) == -EIO) 4082 return true; 4083 return nfs4_stateid_match(stateid, ¤t_stateid); 4084 } 4085 4086 static bool nfs4_error_stateid_expired(int err) 4087 { 4088 switch (err) { 4089 case -NFS4ERR_DELEG_REVOKED: 4090 case -NFS4ERR_ADMIN_REVOKED: 4091 case -NFS4ERR_BAD_STATEID: 4092 case -NFS4ERR_STALE_STATEID: 4093 case -NFS4ERR_OLD_STATEID: 4094 case -NFS4ERR_OPENMODE: 4095 case -NFS4ERR_EXPIRED: 4096 return true; 4097 } 4098 return false; 4099 } 4100 4101 void __nfs4_read_done_cb(struct nfs_pgio_header *hdr) 4102 { 4103 nfs_invalidate_atime(hdr->inode); 4104 } 4105 4106 static int nfs4_read_done_cb(struct rpc_task *task, struct nfs_pgio_header *hdr) 4107 { 4108 struct nfs_server *server = NFS_SERVER(hdr->inode); 4109 4110 trace_nfs4_read(hdr, task->tk_status); 4111 if (nfs4_async_handle_error(task, server, 4112 hdr->args.context->state) == -EAGAIN) { 4113 rpc_restart_call_prepare(task); 4114 return -EAGAIN; 4115 } 4116 4117 __nfs4_read_done_cb(hdr); 4118 if (task->tk_status > 0) 4119 renew_lease(server, hdr->timestamp); 4120 return 0; 4121 } 4122 4123 static bool nfs4_read_stateid_changed(struct rpc_task *task, 4124 struct nfs_pgio_args *args) 4125 { 4126 4127 if (!nfs4_error_stateid_expired(task->tk_status) || 4128 nfs4_stateid_is_current(&args->stateid, 4129 args->context, 4130 args->lock_context, 4131 FMODE_READ)) 4132 return false; 4133 rpc_restart_call_prepare(task); 4134 return true; 4135 } 4136 4137 static int nfs4_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr) 4138 { 4139 4140 dprintk("--> %s\n", __func__); 4141 4142 if (!nfs4_sequence_done(task, &hdr->res.seq_res)) 4143 return -EAGAIN; 4144 if (nfs4_read_stateid_changed(task, &hdr->args)) 4145 return -EAGAIN; 4146 return hdr->pgio_done_cb ? hdr->pgio_done_cb(task, hdr) : 4147 nfs4_read_done_cb(task, hdr); 4148 } 4149 4150 static void nfs4_proc_read_setup(struct nfs_pgio_header *hdr, 4151 struct rpc_message *msg) 4152 { 4153 hdr->timestamp = jiffies; 4154 hdr->pgio_done_cb = nfs4_read_done_cb; 4155 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ]; 4156 nfs4_init_sequence(&hdr->args.seq_args, &hdr->res.seq_res, 0); 4157 } 4158 4159 static int nfs4_proc_pgio_rpc_prepare(struct rpc_task *task, 4160 struct nfs_pgio_header *hdr) 4161 { 4162 if (nfs4_setup_sequence(NFS_SERVER(hdr->inode), 4163 &hdr->args.seq_args, 4164 &hdr->res.seq_res, 4165 task)) 4166 return 0; 4167 if (nfs4_set_rw_stateid(&hdr->args.stateid, hdr->args.context, 4168 hdr->args.lock_context, 4169 hdr->rw_ops->rw_mode) == -EIO) 4170 return -EIO; 4171 if (unlikely(test_bit(NFS_CONTEXT_BAD, &hdr->args.context->flags))) 4172 return -EIO; 4173 return 0; 4174 } 4175 4176 static int nfs4_write_done_cb(struct rpc_task *task, 4177 struct nfs_pgio_header *hdr) 4178 { 4179 struct inode *inode = hdr->inode; 4180 4181 trace_nfs4_write(hdr, task->tk_status); 4182 if (nfs4_async_handle_error(task, NFS_SERVER(inode), 4183 hdr->args.context->state) == -EAGAIN) { 4184 rpc_restart_call_prepare(task); 4185 return -EAGAIN; 4186 } 4187 if (task->tk_status >= 0) { 4188 renew_lease(NFS_SERVER(inode), hdr->timestamp); 4189 nfs_post_op_update_inode_force_wcc(inode, &hdr->fattr); 4190 } 4191 return 0; 4192 } 4193 4194 static bool nfs4_write_stateid_changed(struct rpc_task *task, 4195 struct nfs_pgio_args *args) 4196 { 4197 4198 if (!nfs4_error_stateid_expired(task->tk_status) || 4199 nfs4_stateid_is_current(&args->stateid, 4200 args->context, 4201 args->lock_context, 4202 FMODE_WRITE)) 4203 return false; 4204 rpc_restart_call_prepare(task); 4205 return true; 4206 } 4207 4208 static int nfs4_write_done(struct rpc_task *task, struct nfs_pgio_header *hdr) 4209 { 4210 if (!nfs4_sequence_done(task, &hdr->res.seq_res)) 4211 return -EAGAIN; 4212 if (nfs4_write_stateid_changed(task, &hdr->args)) 4213 return -EAGAIN; 4214 return hdr->pgio_done_cb ? hdr->pgio_done_cb(task, hdr) : 4215 nfs4_write_done_cb(task, hdr); 4216 } 4217 4218 static 4219 bool nfs4_write_need_cache_consistency_data(struct nfs_pgio_header *hdr) 4220 { 4221 /* Don't request attributes for pNFS or O_DIRECT writes */ 4222 if (hdr->ds_clp != NULL || hdr->dreq != NULL) 4223 return false; 4224 /* Otherwise, request attributes if and only if we don't hold 4225 * a delegation 4226 */ 4227 return nfs4_have_delegation(hdr->inode, FMODE_READ) == 0; 4228 } 4229 4230 static void nfs4_proc_write_setup(struct nfs_pgio_header *hdr, 4231 struct rpc_message *msg) 4232 { 4233 struct nfs_server *server = NFS_SERVER(hdr->inode); 4234 4235 if (!nfs4_write_need_cache_consistency_data(hdr)) { 4236 hdr->args.bitmask = NULL; 4237 hdr->res.fattr = NULL; 4238 } else 4239 hdr->args.bitmask = server->cache_consistency_bitmask; 4240 4241 if (!hdr->pgio_done_cb) 4242 hdr->pgio_done_cb = nfs4_write_done_cb; 4243 hdr->res.server = server; 4244 hdr->timestamp = jiffies; 4245 4246 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE]; 4247 nfs4_init_sequence(&hdr->args.seq_args, &hdr->res.seq_res, 1); 4248 } 4249 4250 static void nfs4_proc_commit_rpc_prepare(struct rpc_task *task, struct nfs_commit_data *data) 4251 { 4252 nfs4_setup_sequence(NFS_SERVER(data->inode), 4253 &data->args.seq_args, 4254 &data->res.seq_res, 4255 task); 4256 } 4257 4258 static int nfs4_commit_done_cb(struct rpc_task *task, struct nfs_commit_data *data) 4259 { 4260 struct inode *inode = data->inode; 4261 4262 trace_nfs4_commit(data, task->tk_status); 4263 if (nfs4_async_handle_error(task, NFS_SERVER(inode), NULL) == -EAGAIN) { 4264 rpc_restart_call_prepare(task); 4265 return -EAGAIN; 4266 } 4267 return 0; 4268 } 4269 4270 static int nfs4_commit_done(struct rpc_task *task, struct nfs_commit_data *data) 4271 { 4272 if (!nfs4_sequence_done(task, &data->res.seq_res)) 4273 return -EAGAIN; 4274 return data->commit_done_cb(task, data); 4275 } 4276 4277 static void nfs4_proc_commit_setup(struct nfs_commit_data *data, struct rpc_message *msg) 4278 { 4279 struct nfs_server *server = NFS_SERVER(data->inode); 4280 4281 if (data->commit_done_cb == NULL) 4282 data->commit_done_cb = nfs4_commit_done_cb; 4283 data->res.server = server; 4284 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT]; 4285 nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1); 4286 } 4287 4288 struct nfs4_renewdata { 4289 struct nfs_client *client; 4290 unsigned long timestamp; 4291 }; 4292 4293 /* 4294 * nfs4_proc_async_renew(): This is not one of the nfs_rpc_ops; it is a special 4295 * standalone procedure for queueing an asynchronous RENEW. 4296 */ 4297 static void nfs4_renew_release(void *calldata) 4298 { 4299 struct nfs4_renewdata *data = calldata; 4300 struct nfs_client *clp = data->client; 4301 4302 if (atomic_read(&clp->cl_count) > 1) 4303 nfs4_schedule_state_renewal(clp); 4304 nfs_put_client(clp); 4305 kfree(data); 4306 } 4307 4308 static void nfs4_renew_done(struct rpc_task *task, void *calldata) 4309 { 4310 struct nfs4_renewdata *data = calldata; 4311 struct nfs_client *clp = data->client; 4312 unsigned long timestamp = data->timestamp; 4313 4314 trace_nfs4_renew_async(clp, task->tk_status); 4315 switch (task->tk_status) { 4316 case 0: 4317 break; 4318 case -NFS4ERR_LEASE_MOVED: 4319 nfs4_schedule_lease_moved_recovery(clp); 4320 break; 4321 default: 4322 /* Unless we're shutting down, schedule state recovery! */ 4323 if (test_bit(NFS_CS_RENEWD, &clp->cl_res_state) == 0) 4324 return; 4325 if (task->tk_status != NFS4ERR_CB_PATH_DOWN) { 4326 nfs4_schedule_lease_recovery(clp); 4327 return; 4328 } 4329 nfs4_schedule_path_down_recovery(clp); 4330 } 4331 do_renew_lease(clp, timestamp); 4332 } 4333 4334 static const struct rpc_call_ops nfs4_renew_ops = { 4335 .rpc_call_done = nfs4_renew_done, 4336 .rpc_release = nfs4_renew_release, 4337 }; 4338 4339 static int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred, unsigned renew_flags) 4340 { 4341 struct rpc_message msg = { 4342 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW], 4343 .rpc_argp = clp, 4344 .rpc_cred = cred, 4345 }; 4346 struct nfs4_renewdata *data; 4347 4348 if (renew_flags == 0) 4349 return 0; 4350 if (!atomic_inc_not_zero(&clp->cl_count)) 4351 return -EIO; 4352 data = kmalloc(sizeof(*data), GFP_NOFS); 4353 if (data == NULL) 4354 return -ENOMEM; 4355 data->client = clp; 4356 data->timestamp = jiffies; 4357 return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT, 4358 &nfs4_renew_ops, data); 4359 } 4360 4361 static int nfs4_proc_renew(struct nfs_client *clp, struct rpc_cred *cred) 4362 { 4363 struct rpc_message msg = { 4364 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW], 4365 .rpc_argp = clp, 4366 .rpc_cred = cred, 4367 }; 4368 unsigned long now = jiffies; 4369 int status; 4370 4371 status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); 4372 if (status < 0) 4373 return status; 4374 do_renew_lease(clp, now); 4375 return 0; 4376 } 4377 4378 static inline int nfs4_server_supports_acls(struct nfs_server *server) 4379 { 4380 return server->caps & NFS_CAP_ACLS; 4381 } 4382 4383 /* Assuming that XATTR_SIZE_MAX is a multiple of PAGE_SIZE, and that 4384 * it's OK to put sizeof(void) * (XATTR_SIZE_MAX/PAGE_SIZE) bytes on 4385 * the stack. 4386 */ 4387 #define NFS4ACL_MAXPAGES DIV_ROUND_UP(XATTR_SIZE_MAX, PAGE_SIZE) 4388 4389 static int buf_to_pages_noslab(const void *buf, size_t buflen, 4390 struct page **pages, unsigned int *pgbase) 4391 { 4392 struct page *newpage, **spages; 4393 int rc = 0; 4394 size_t len; 4395 spages = pages; 4396 4397 do { 4398 len = min_t(size_t, PAGE_SIZE, buflen); 4399 newpage = alloc_page(GFP_KERNEL); 4400 4401 if (newpage == NULL) 4402 goto unwind; 4403 memcpy(page_address(newpage), buf, len); 4404 buf += len; 4405 buflen -= len; 4406 *pages++ = newpage; 4407 rc++; 4408 } while (buflen != 0); 4409 4410 return rc; 4411 4412 unwind: 4413 for(; rc > 0; rc--) 4414 __free_page(spages[rc-1]); 4415 return -ENOMEM; 4416 } 4417 4418 struct nfs4_cached_acl { 4419 int cached; 4420 size_t len; 4421 char data[0]; 4422 }; 4423 4424 static void nfs4_set_cached_acl(struct inode *inode, struct nfs4_cached_acl *acl) 4425 { 4426 struct nfs_inode *nfsi = NFS_I(inode); 4427 4428 spin_lock(&inode->i_lock); 4429 kfree(nfsi->nfs4_acl); 4430 nfsi->nfs4_acl = acl; 4431 spin_unlock(&inode->i_lock); 4432 } 4433 4434 static void nfs4_zap_acl_attr(struct inode *inode) 4435 { 4436 nfs4_set_cached_acl(inode, NULL); 4437 } 4438 4439 static inline ssize_t nfs4_read_cached_acl(struct inode *inode, char *buf, size_t buflen) 4440 { 4441 struct nfs_inode *nfsi = NFS_I(inode); 4442 struct nfs4_cached_acl *acl; 4443 int ret = -ENOENT; 4444 4445 spin_lock(&inode->i_lock); 4446 acl = nfsi->nfs4_acl; 4447 if (acl == NULL) 4448 goto out; 4449 if (buf == NULL) /* user is just asking for length */ 4450 goto out_len; 4451 if (acl->cached == 0) 4452 goto out; 4453 ret = -ERANGE; /* see getxattr(2) man page */ 4454 if (acl->len > buflen) 4455 goto out; 4456 memcpy(buf, acl->data, acl->len); 4457 out_len: 4458 ret = acl->len; 4459 out: 4460 spin_unlock(&inode->i_lock); 4461 return ret; 4462 } 4463 4464 static void nfs4_write_cached_acl(struct inode *inode, struct page **pages, size_t pgbase, size_t acl_len) 4465 { 4466 struct nfs4_cached_acl *acl; 4467 size_t buflen = sizeof(*acl) + acl_len; 4468 4469 if (buflen <= PAGE_SIZE) { 4470 acl = kmalloc(buflen, GFP_KERNEL); 4471 if (acl == NULL) 4472 goto out; 4473 acl->cached = 1; 4474 _copy_from_pages(acl->data, pages, pgbase, acl_len); 4475 } else { 4476 acl = kmalloc(sizeof(*acl), GFP_KERNEL); 4477 if (acl == NULL) 4478 goto out; 4479 acl->cached = 0; 4480 } 4481 acl->len = acl_len; 4482 out: 4483 nfs4_set_cached_acl(inode, acl); 4484 } 4485 4486 /* 4487 * The getxattr API returns the required buffer length when called with a 4488 * NULL buf. The NFSv4 acl tool then calls getxattr again after allocating 4489 * the required buf. On a NULL buf, we send a page of data to the server 4490 * guessing that the ACL request can be serviced by a page. If so, we cache 4491 * up to the page of ACL data, and the 2nd call to getxattr is serviced by 4492 * the cache. If not so, we throw away the page, and cache the required 4493 * length. The next getxattr call will then produce another round trip to 4494 * the server, this time with the input buf of the required size. 4495 */ 4496 static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen) 4497 { 4498 struct page *pages[NFS4ACL_MAXPAGES] = {NULL, }; 4499 struct nfs_getaclargs args = { 4500 .fh = NFS_FH(inode), 4501 .acl_pages = pages, 4502 .acl_len = buflen, 4503 }; 4504 struct nfs_getaclres res = { 4505 .acl_len = buflen, 4506 }; 4507 struct rpc_message msg = { 4508 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETACL], 4509 .rpc_argp = &args, 4510 .rpc_resp = &res, 4511 }; 4512 unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE); 4513 int ret = -ENOMEM, i; 4514 4515 /* As long as we're doing a round trip to the server anyway, 4516 * let's be prepared for a page of acl data. */ 4517 if (npages == 0) 4518 npages = 1; 4519 if (npages > ARRAY_SIZE(pages)) 4520 return -ERANGE; 4521 4522 for (i = 0; i < npages; i++) { 4523 pages[i] = alloc_page(GFP_KERNEL); 4524 if (!pages[i]) 4525 goto out_free; 4526 } 4527 4528 /* for decoding across pages */ 4529 res.acl_scratch = alloc_page(GFP_KERNEL); 4530 if (!res.acl_scratch) 4531 goto out_free; 4532 4533 args.acl_len = npages * PAGE_SIZE; 4534 args.acl_pgbase = 0; 4535 4536 dprintk("%s buf %p buflen %zu npages %d args.acl_len %zu\n", 4537 __func__, buf, buflen, npages, args.acl_len); 4538 ret = nfs4_call_sync(NFS_SERVER(inode)->client, NFS_SERVER(inode), 4539 &msg, &args.seq_args, &res.seq_res, 0); 4540 if (ret) 4541 goto out_free; 4542 4543 /* Handle the case where the passed-in buffer is too short */ 4544 if (res.acl_flags & NFS4_ACL_TRUNC) { 4545 /* Did the user only issue a request for the acl length? */ 4546 if (buf == NULL) 4547 goto out_ok; 4548 ret = -ERANGE; 4549 goto out_free; 4550 } 4551 nfs4_write_cached_acl(inode, pages, res.acl_data_offset, res.acl_len); 4552 if (buf) { 4553 if (res.acl_len > buflen) { 4554 ret = -ERANGE; 4555 goto out_free; 4556 } 4557 _copy_from_pages(buf, pages, res.acl_data_offset, res.acl_len); 4558 } 4559 out_ok: 4560 ret = res.acl_len; 4561 out_free: 4562 for (i = 0; i < npages; i++) 4563 if (pages[i]) 4564 __free_page(pages[i]); 4565 if (res.acl_scratch) 4566 __free_page(res.acl_scratch); 4567 return ret; 4568 } 4569 4570 static ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen) 4571 { 4572 struct nfs4_exception exception = { }; 4573 ssize_t ret; 4574 do { 4575 ret = __nfs4_get_acl_uncached(inode, buf, buflen); 4576 trace_nfs4_get_acl(inode, ret); 4577 if (ret >= 0) 4578 break; 4579 ret = nfs4_handle_exception(NFS_SERVER(inode), ret, &exception); 4580 } while (exception.retry); 4581 return ret; 4582 } 4583 4584 static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen) 4585 { 4586 struct nfs_server *server = NFS_SERVER(inode); 4587 int ret; 4588 4589 if (!nfs4_server_supports_acls(server)) 4590 return -EOPNOTSUPP; 4591 ret = nfs_revalidate_inode(server, inode); 4592 if (ret < 0) 4593 return ret; 4594 if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_ACL) 4595 nfs_zap_acl_cache(inode); 4596 ret = nfs4_read_cached_acl(inode, buf, buflen); 4597 if (ret != -ENOENT) 4598 /* -ENOENT is returned if there is no ACL or if there is an ACL 4599 * but no cached acl data, just the acl length */ 4600 return ret; 4601 return nfs4_get_acl_uncached(inode, buf, buflen); 4602 } 4603 4604 static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen) 4605 { 4606 struct nfs_server *server = NFS_SERVER(inode); 4607 struct page *pages[NFS4ACL_MAXPAGES]; 4608 struct nfs_setaclargs arg = { 4609 .fh = NFS_FH(inode), 4610 .acl_pages = pages, 4611 .acl_len = buflen, 4612 }; 4613 struct nfs_setaclres res; 4614 struct rpc_message msg = { 4615 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETACL], 4616 .rpc_argp = &arg, 4617 .rpc_resp = &res, 4618 }; 4619 unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE); 4620 int ret, i; 4621 4622 if (!nfs4_server_supports_acls(server)) 4623 return -EOPNOTSUPP; 4624 if (npages > ARRAY_SIZE(pages)) 4625 return -ERANGE; 4626 i = buf_to_pages_noslab(buf, buflen, arg.acl_pages, &arg.acl_pgbase); 4627 if (i < 0) 4628 return i; 4629 nfs4_inode_return_delegation(inode); 4630 ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1); 4631 4632 /* 4633 * Free each page after tx, so the only ref left is 4634 * held by the network stack 4635 */ 4636 for (; i > 0; i--) 4637 put_page(pages[i-1]); 4638 4639 /* 4640 * Acl update can result in inode attribute update. 4641 * so mark the attribute cache invalid. 4642 */ 4643 spin_lock(&inode->i_lock); 4644 NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATTR; 4645 spin_unlock(&inode->i_lock); 4646 nfs_access_zap_cache(inode); 4647 nfs_zap_acl_cache(inode); 4648 return ret; 4649 } 4650 4651 static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen) 4652 { 4653 struct nfs4_exception exception = { }; 4654 int err; 4655 do { 4656 err = __nfs4_proc_set_acl(inode, buf, buflen); 4657 trace_nfs4_set_acl(inode, err); 4658 err = nfs4_handle_exception(NFS_SERVER(inode), err, 4659 &exception); 4660 } while (exception.retry); 4661 return err; 4662 } 4663 4664 #ifdef CONFIG_NFS_V4_SECURITY_LABEL 4665 static int _nfs4_get_security_label(struct inode *inode, void *buf, 4666 size_t buflen) 4667 { 4668 struct nfs_server *server = NFS_SERVER(inode); 4669 struct nfs_fattr fattr; 4670 struct nfs4_label label = {0, 0, buflen, buf}; 4671 4672 u32 bitmask[3] = { 0, 0, FATTR4_WORD2_SECURITY_LABEL }; 4673 struct nfs4_getattr_arg arg = { 4674 .fh = NFS_FH(inode), 4675 .bitmask = bitmask, 4676 }; 4677 struct nfs4_getattr_res res = { 4678 .fattr = &fattr, 4679 .label = &label, 4680 .server = server, 4681 }; 4682 struct rpc_message msg = { 4683 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETATTR], 4684 .rpc_argp = &arg, 4685 .rpc_resp = &res, 4686 }; 4687 int ret; 4688 4689 nfs_fattr_init(&fattr); 4690 4691 ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 0); 4692 if (ret) 4693 return ret; 4694 if (!(fattr.valid & NFS_ATTR_FATTR_V4_SECURITY_LABEL)) 4695 return -ENOENT; 4696 if (buflen < label.len) 4697 return -ERANGE; 4698 return 0; 4699 } 4700 4701 static int nfs4_get_security_label(struct inode *inode, void *buf, 4702 size_t buflen) 4703 { 4704 struct nfs4_exception exception = { }; 4705 int err; 4706 4707 if (!nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL)) 4708 return -EOPNOTSUPP; 4709 4710 do { 4711 err = _nfs4_get_security_label(inode, buf, buflen); 4712 trace_nfs4_get_security_label(inode, err); 4713 err = nfs4_handle_exception(NFS_SERVER(inode), err, 4714 &exception); 4715 } while (exception.retry); 4716 return err; 4717 } 4718 4719 static int _nfs4_do_set_security_label(struct inode *inode, 4720 struct nfs4_label *ilabel, 4721 struct nfs_fattr *fattr, 4722 struct nfs4_label *olabel) 4723 { 4724 4725 struct iattr sattr = {0}; 4726 struct nfs_server *server = NFS_SERVER(inode); 4727 const u32 bitmask[3] = { 0, 0, FATTR4_WORD2_SECURITY_LABEL }; 4728 struct nfs_setattrargs arg = { 4729 .fh = NFS_FH(inode), 4730 .iap = &sattr, 4731 .server = server, 4732 .bitmask = bitmask, 4733 .label = ilabel, 4734 }; 4735 struct nfs_setattrres res = { 4736 .fattr = fattr, 4737 .label = olabel, 4738 .server = server, 4739 }; 4740 struct rpc_message msg = { 4741 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETATTR], 4742 .rpc_argp = &arg, 4743 .rpc_resp = &res, 4744 }; 4745 int status; 4746 4747 nfs4_stateid_copy(&arg.stateid, &zero_stateid); 4748 4749 status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1); 4750 if (status) 4751 dprintk("%s failed: %d\n", __func__, status); 4752 4753 return status; 4754 } 4755 4756 static int nfs4_do_set_security_label(struct inode *inode, 4757 struct nfs4_label *ilabel, 4758 struct nfs_fattr *fattr, 4759 struct nfs4_label *olabel) 4760 { 4761 struct nfs4_exception exception = { }; 4762 int err; 4763 4764 do { 4765 err = _nfs4_do_set_security_label(inode, ilabel, 4766 fattr, olabel); 4767 trace_nfs4_set_security_label(inode, err); 4768 err = nfs4_handle_exception(NFS_SERVER(inode), err, 4769 &exception); 4770 } while (exception.retry); 4771 return err; 4772 } 4773 4774 static int 4775 nfs4_set_security_label(struct dentry *dentry, const void *buf, size_t buflen) 4776 { 4777 struct nfs4_label ilabel, *olabel = NULL; 4778 struct nfs_fattr fattr; 4779 struct rpc_cred *cred; 4780 struct inode *inode = dentry->d_inode; 4781 int status; 4782 4783 if (!nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL)) 4784 return -EOPNOTSUPP; 4785 4786 nfs_fattr_init(&fattr); 4787 4788 ilabel.pi = 0; 4789 ilabel.lfs = 0; 4790 ilabel.label = (char *)buf; 4791 ilabel.len = buflen; 4792 4793 cred = rpc_lookup_cred(); 4794 if (IS_ERR(cred)) 4795 return PTR_ERR(cred); 4796 4797 olabel = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL); 4798 if (IS_ERR(olabel)) { 4799 status = -PTR_ERR(olabel); 4800 goto out; 4801 } 4802 4803 status = nfs4_do_set_security_label(inode, &ilabel, &fattr, olabel); 4804 if (status == 0) 4805 nfs_setsecurity(inode, &fattr, olabel); 4806 4807 nfs4_label_free(olabel); 4808 out: 4809 put_rpccred(cred); 4810 return status; 4811 } 4812 #endif /* CONFIG_NFS_V4_SECURITY_LABEL */ 4813 4814 4815 static int 4816 nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server, struct nfs4_state *state) 4817 { 4818 struct nfs_client *clp = server->nfs_client; 4819 4820 if (task->tk_status >= 0) 4821 return 0; 4822 switch(task->tk_status) { 4823 case -NFS4ERR_DELEG_REVOKED: 4824 case -NFS4ERR_ADMIN_REVOKED: 4825 case -NFS4ERR_BAD_STATEID: 4826 if (state == NULL) 4827 break; 4828 nfs_remove_bad_delegation(state->inode); 4829 case -NFS4ERR_OPENMODE: 4830 if (state == NULL) 4831 break; 4832 if (nfs4_schedule_stateid_recovery(server, state) < 0) 4833 goto recovery_failed; 4834 goto wait_on_recovery; 4835 case -NFS4ERR_EXPIRED: 4836 if (state != NULL) { 4837 if (nfs4_schedule_stateid_recovery(server, state) < 0) 4838 goto recovery_failed; 4839 } 4840 case -NFS4ERR_STALE_STATEID: 4841 case -NFS4ERR_STALE_CLIENTID: 4842 nfs4_schedule_lease_recovery(clp); 4843 goto wait_on_recovery; 4844 case -NFS4ERR_MOVED: 4845 if (nfs4_schedule_migration_recovery(server) < 0) 4846 goto recovery_failed; 4847 goto wait_on_recovery; 4848 case -NFS4ERR_LEASE_MOVED: 4849 nfs4_schedule_lease_moved_recovery(clp); 4850 goto wait_on_recovery; 4851 #if defined(CONFIG_NFS_V4_1) 4852 case -NFS4ERR_BADSESSION: 4853 case -NFS4ERR_BADSLOT: 4854 case -NFS4ERR_BAD_HIGH_SLOT: 4855 case -NFS4ERR_DEADSESSION: 4856 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: 4857 case -NFS4ERR_SEQ_FALSE_RETRY: 4858 case -NFS4ERR_SEQ_MISORDERED: 4859 dprintk("%s ERROR %d, Reset session\n", __func__, 4860 task->tk_status); 4861 nfs4_schedule_session_recovery(clp->cl_session, task->tk_status); 4862 goto wait_on_recovery; 4863 #endif /* CONFIG_NFS_V4_1 */ 4864 case -NFS4ERR_DELAY: 4865 nfs_inc_server_stats(server, NFSIOS_DELAY); 4866 case -NFS4ERR_GRACE: 4867 rpc_delay(task, NFS4_POLL_RETRY_MAX); 4868 case -NFS4ERR_RETRY_UNCACHED_REP: 4869 case -NFS4ERR_OLD_STATEID: 4870 goto restart_call; 4871 } 4872 task->tk_status = nfs4_map_errors(task->tk_status); 4873 return 0; 4874 recovery_failed: 4875 task->tk_status = -EIO; 4876 return 0; 4877 wait_on_recovery: 4878 rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL); 4879 if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0) 4880 rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task); 4881 if (test_bit(NFS_MIG_FAILED, &server->mig_status)) 4882 goto recovery_failed; 4883 restart_call: 4884 task->tk_status = 0; 4885 return -EAGAIN; 4886 } 4887 4888 static void nfs4_init_boot_verifier(const struct nfs_client *clp, 4889 nfs4_verifier *bootverf) 4890 { 4891 __be32 verf[2]; 4892 4893 if (test_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state)) { 4894 /* An impossible timestamp guarantees this value 4895 * will never match a generated boot time. */ 4896 verf[0] = 0; 4897 verf[1] = cpu_to_be32(NSEC_PER_SEC + 1); 4898 } else { 4899 struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id); 4900 verf[0] = cpu_to_be32(nn->boot_time.tv_sec); 4901 verf[1] = cpu_to_be32(nn->boot_time.tv_nsec); 4902 } 4903 memcpy(bootverf->data, verf, sizeof(bootverf->data)); 4904 } 4905 4906 static unsigned int 4907 nfs4_init_nonuniform_client_string(const struct nfs_client *clp, 4908 char *buf, size_t len) 4909 { 4910 unsigned int result; 4911 4912 rcu_read_lock(); 4913 result = scnprintf(buf, len, "Linux NFSv4.0 %s/%s %s", 4914 clp->cl_ipaddr, 4915 rpc_peeraddr2str(clp->cl_rpcclient, 4916 RPC_DISPLAY_ADDR), 4917 rpc_peeraddr2str(clp->cl_rpcclient, 4918 RPC_DISPLAY_PROTO)); 4919 rcu_read_unlock(); 4920 return result; 4921 } 4922 4923 static unsigned int 4924 nfs4_init_uniform_client_string(const struct nfs_client *clp, 4925 char *buf, size_t len) 4926 { 4927 const char *nodename = clp->cl_rpcclient->cl_nodename; 4928 4929 if (nfs4_client_id_uniquifier[0] != '\0') 4930 return scnprintf(buf, len, "Linux NFSv%u.%u %s/%s", 4931 clp->rpc_ops->version, 4932 clp->cl_minorversion, 4933 nfs4_client_id_uniquifier, 4934 nodename); 4935 return scnprintf(buf, len, "Linux NFSv%u.%u %s", 4936 clp->rpc_ops->version, clp->cl_minorversion, 4937 nodename); 4938 } 4939 4940 /* 4941 * nfs4_callback_up_net() starts only "tcp" and "tcp6" callback 4942 * services. Advertise one based on the address family of the 4943 * clientaddr. 4944 */ 4945 static unsigned int 4946 nfs4_init_callback_netid(const struct nfs_client *clp, char *buf, size_t len) 4947 { 4948 if (strchr(clp->cl_ipaddr, ':') != NULL) 4949 return scnprintf(buf, len, "tcp6"); 4950 else 4951 return scnprintf(buf, len, "tcp"); 4952 } 4953 4954 static void nfs4_setclientid_done(struct rpc_task *task, void *calldata) 4955 { 4956 struct nfs4_setclientid *sc = calldata; 4957 4958 if (task->tk_status == 0) 4959 sc->sc_cred = get_rpccred(task->tk_rqstp->rq_cred); 4960 } 4961 4962 static const struct rpc_call_ops nfs4_setclientid_ops = { 4963 .rpc_call_done = nfs4_setclientid_done, 4964 }; 4965 4966 /** 4967 * nfs4_proc_setclientid - Negotiate client ID 4968 * @clp: state data structure 4969 * @program: RPC program for NFSv4 callback service 4970 * @port: IP port number for NFS4 callback service 4971 * @cred: RPC credential to use for this call 4972 * @res: where to place the result 4973 * 4974 * Returns zero, a negative errno, or a negative NFS4ERR status code. 4975 */ 4976 int nfs4_proc_setclientid(struct nfs_client *clp, u32 program, 4977 unsigned short port, struct rpc_cred *cred, 4978 struct nfs4_setclientid_res *res) 4979 { 4980 nfs4_verifier sc_verifier; 4981 struct nfs4_setclientid setclientid = { 4982 .sc_verifier = &sc_verifier, 4983 .sc_prog = program, 4984 .sc_cb_ident = clp->cl_cb_ident, 4985 }; 4986 struct rpc_message msg = { 4987 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID], 4988 .rpc_argp = &setclientid, 4989 .rpc_resp = res, 4990 .rpc_cred = cred, 4991 }; 4992 struct rpc_task *task; 4993 struct rpc_task_setup task_setup_data = { 4994 .rpc_client = clp->cl_rpcclient, 4995 .rpc_message = &msg, 4996 .callback_ops = &nfs4_setclientid_ops, 4997 .callback_data = &setclientid, 4998 .flags = RPC_TASK_TIMEOUT, 4999 }; 5000 int status; 5001 5002 /* nfs_client_id4 */ 5003 nfs4_init_boot_verifier(clp, &sc_verifier); 5004 if (test_bit(NFS_CS_MIGRATION, &clp->cl_flags)) 5005 setclientid.sc_name_len = 5006 nfs4_init_uniform_client_string(clp, 5007 setclientid.sc_name, 5008 sizeof(setclientid.sc_name)); 5009 else 5010 setclientid.sc_name_len = 5011 nfs4_init_nonuniform_client_string(clp, 5012 setclientid.sc_name, 5013 sizeof(setclientid.sc_name)); 5014 /* cb_client4 */ 5015 setclientid.sc_netid_len = 5016 nfs4_init_callback_netid(clp, 5017 setclientid.sc_netid, 5018 sizeof(setclientid.sc_netid)); 5019 setclientid.sc_uaddr_len = scnprintf(setclientid.sc_uaddr, 5020 sizeof(setclientid.sc_uaddr), "%s.%u.%u", 5021 clp->cl_ipaddr, port >> 8, port & 255); 5022 5023 dprintk("NFS call setclientid auth=%s, '%.*s'\n", 5024 clp->cl_rpcclient->cl_auth->au_ops->au_name, 5025 setclientid.sc_name_len, setclientid.sc_name); 5026 task = rpc_run_task(&task_setup_data); 5027 if (IS_ERR(task)) { 5028 status = PTR_ERR(task); 5029 goto out; 5030 } 5031 status = task->tk_status; 5032 if (setclientid.sc_cred) { 5033 clp->cl_acceptor = rpcauth_stringify_acceptor(setclientid.sc_cred); 5034 put_rpccred(setclientid.sc_cred); 5035 } 5036 rpc_put_task(task); 5037 out: 5038 trace_nfs4_setclientid(clp, status); 5039 dprintk("NFS reply setclientid: %d\n", status); 5040 return status; 5041 } 5042 5043 /** 5044 * nfs4_proc_setclientid_confirm - Confirm client ID 5045 * @clp: state data structure 5046 * @res: result of a previous SETCLIENTID 5047 * @cred: RPC credential to use for this call 5048 * 5049 * Returns zero, a negative errno, or a negative NFS4ERR status code. 5050 */ 5051 int nfs4_proc_setclientid_confirm(struct nfs_client *clp, 5052 struct nfs4_setclientid_res *arg, 5053 struct rpc_cred *cred) 5054 { 5055 struct rpc_message msg = { 5056 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID_CONFIRM], 5057 .rpc_argp = arg, 5058 .rpc_cred = cred, 5059 }; 5060 int status; 5061 5062 dprintk("NFS call setclientid_confirm auth=%s, (client ID %llx)\n", 5063 clp->cl_rpcclient->cl_auth->au_ops->au_name, 5064 clp->cl_clientid); 5065 status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); 5066 trace_nfs4_setclientid_confirm(clp, status); 5067 dprintk("NFS reply setclientid_confirm: %d\n", status); 5068 return status; 5069 } 5070 5071 struct nfs4_delegreturndata { 5072 struct nfs4_delegreturnargs args; 5073 struct nfs4_delegreturnres res; 5074 struct nfs_fh fh; 5075 nfs4_stateid stateid; 5076 unsigned long timestamp; 5077 struct nfs_fattr fattr; 5078 int rpc_status; 5079 struct inode *inode; 5080 bool roc; 5081 u32 roc_barrier; 5082 }; 5083 5084 static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata) 5085 { 5086 struct nfs4_delegreturndata *data = calldata; 5087 5088 if (!nfs4_sequence_done(task, &data->res.seq_res)) 5089 return; 5090 5091 trace_nfs4_delegreturn_exit(&data->args, &data->res, task->tk_status); 5092 switch (task->tk_status) { 5093 case 0: 5094 renew_lease(data->res.server, data->timestamp); 5095 case -NFS4ERR_ADMIN_REVOKED: 5096 case -NFS4ERR_DELEG_REVOKED: 5097 case -NFS4ERR_BAD_STATEID: 5098 case -NFS4ERR_OLD_STATEID: 5099 case -NFS4ERR_STALE_STATEID: 5100 case -NFS4ERR_EXPIRED: 5101 task->tk_status = 0; 5102 if (data->roc) 5103 pnfs_roc_set_barrier(data->inode, data->roc_barrier); 5104 break; 5105 default: 5106 if (nfs4_async_handle_error(task, data->res.server, NULL) == 5107 -EAGAIN) { 5108 rpc_restart_call_prepare(task); 5109 return; 5110 } 5111 } 5112 data->rpc_status = task->tk_status; 5113 } 5114 5115 static void nfs4_delegreturn_release(void *calldata) 5116 { 5117 struct nfs4_delegreturndata *data = calldata; 5118 5119 if (data->roc) 5120 pnfs_roc_release(data->inode); 5121 kfree(calldata); 5122 } 5123 5124 static void nfs4_delegreturn_prepare(struct rpc_task *task, void *data) 5125 { 5126 struct nfs4_delegreturndata *d_data; 5127 5128 d_data = (struct nfs4_delegreturndata *)data; 5129 5130 if (d_data->roc && 5131 pnfs_roc_drain(d_data->inode, &d_data->roc_barrier, task)) 5132 return; 5133 5134 nfs4_setup_sequence(d_data->res.server, 5135 &d_data->args.seq_args, 5136 &d_data->res.seq_res, 5137 task); 5138 } 5139 5140 static const struct rpc_call_ops nfs4_delegreturn_ops = { 5141 .rpc_call_prepare = nfs4_delegreturn_prepare, 5142 .rpc_call_done = nfs4_delegreturn_done, 5143 .rpc_release = nfs4_delegreturn_release, 5144 }; 5145 5146 static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync) 5147 { 5148 struct nfs4_delegreturndata *data; 5149 struct nfs_server *server = NFS_SERVER(inode); 5150 struct rpc_task *task; 5151 struct rpc_message msg = { 5152 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DELEGRETURN], 5153 .rpc_cred = cred, 5154 }; 5155 struct rpc_task_setup task_setup_data = { 5156 .rpc_client = server->client, 5157 .rpc_message = &msg, 5158 .callback_ops = &nfs4_delegreturn_ops, 5159 .flags = RPC_TASK_ASYNC, 5160 }; 5161 int status = 0; 5162 5163 data = kzalloc(sizeof(*data), GFP_NOFS); 5164 if (data == NULL) 5165 return -ENOMEM; 5166 nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1); 5167 data->args.fhandle = &data->fh; 5168 data->args.stateid = &data->stateid; 5169 data->args.bitmask = server->cache_consistency_bitmask; 5170 nfs_copy_fh(&data->fh, NFS_FH(inode)); 5171 nfs4_stateid_copy(&data->stateid, stateid); 5172 data->res.fattr = &data->fattr; 5173 data->res.server = server; 5174 nfs_fattr_init(data->res.fattr); 5175 data->timestamp = jiffies; 5176 data->rpc_status = 0; 5177 data->inode = inode; 5178 data->roc = list_empty(&NFS_I(inode)->open_files) ? 5179 pnfs_roc(inode) : false; 5180 5181 task_setup_data.callback_data = data; 5182 msg.rpc_argp = &data->args; 5183 msg.rpc_resp = &data->res; 5184 task = rpc_run_task(&task_setup_data); 5185 if (IS_ERR(task)) 5186 return PTR_ERR(task); 5187 if (!issync) 5188 goto out; 5189 status = nfs4_wait_for_completion_rpc_task(task); 5190 if (status != 0) 5191 goto out; 5192 status = data->rpc_status; 5193 if (status == 0) 5194 nfs_post_op_update_inode_force_wcc(inode, &data->fattr); 5195 else 5196 nfs_refresh_inode(inode, &data->fattr); 5197 out: 5198 rpc_put_task(task); 5199 return status; 5200 } 5201 5202 int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync) 5203 { 5204 struct nfs_server *server = NFS_SERVER(inode); 5205 struct nfs4_exception exception = { }; 5206 int err; 5207 do { 5208 err = _nfs4_proc_delegreturn(inode, cred, stateid, issync); 5209 trace_nfs4_delegreturn(inode, err); 5210 switch (err) { 5211 case -NFS4ERR_STALE_STATEID: 5212 case -NFS4ERR_EXPIRED: 5213 case 0: 5214 return 0; 5215 } 5216 err = nfs4_handle_exception(server, err, &exception); 5217 } while (exception.retry); 5218 return err; 5219 } 5220 5221 #define NFS4_LOCK_MINTIMEOUT (1 * HZ) 5222 #define NFS4_LOCK_MAXTIMEOUT (30 * HZ) 5223 5224 /* 5225 * sleep, with exponential backoff, and retry the LOCK operation. 5226 */ 5227 static unsigned long 5228 nfs4_set_lock_task_retry(unsigned long timeout) 5229 { 5230 freezable_schedule_timeout_killable_unsafe(timeout); 5231 timeout <<= 1; 5232 if (timeout > NFS4_LOCK_MAXTIMEOUT) 5233 return NFS4_LOCK_MAXTIMEOUT; 5234 return timeout; 5235 } 5236 5237 static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request) 5238 { 5239 struct inode *inode = state->inode; 5240 struct nfs_server *server = NFS_SERVER(inode); 5241 struct nfs_client *clp = server->nfs_client; 5242 struct nfs_lockt_args arg = { 5243 .fh = NFS_FH(inode), 5244 .fl = request, 5245 }; 5246 struct nfs_lockt_res res = { 5247 .denied = request, 5248 }; 5249 struct rpc_message msg = { 5250 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKT], 5251 .rpc_argp = &arg, 5252 .rpc_resp = &res, 5253 .rpc_cred = state->owner->so_cred, 5254 }; 5255 struct nfs4_lock_state *lsp; 5256 int status; 5257 5258 arg.lock_owner.clientid = clp->cl_clientid; 5259 status = nfs4_set_lock_state(state, request); 5260 if (status != 0) 5261 goto out; 5262 lsp = request->fl_u.nfs4_fl.owner; 5263 arg.lock_owner.id = lsp->ls_seqid.owner_id; 5264 arg.lock_owner.s_dev = server->s_dev; 5265 status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1); 5266 switch (status) { 5267 case 0: 5268 request->fl_type = F_UNLCK; 5269 break; 5270 case -NFS4ERR_DENIED: 5271 status = 0; 5272 } 5273 request->fl_ops->fl_release_private(request); 5274 request->fl_ops = NULL; 5275 out: 5276 return status; 5277 } 5278 5279 static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request) 5280 { 5281 struct nfs4_exception exception = { }; 5282 int err; 5283 5284 do { 5285 err = _nfs4_proc_getlk(state, cmd, request); 5286 trace_nfs4_get_lock(request, state, cmd, err); 5287 err = nfs4_handle_exception(NFS_SERVER(state->inode), err, 5288 &exception); 5289 } while (exception.retry); 5290 return err; 5291 } 5292 5293 static int do_vfs_lock(struct file *file, struct file_lock *fl) 5294 { 5295 int res = 0; 5296 switch (fl->fl_flags & (FL_POSIX|FL_FLOCK)) { 5297 case FL_POSIX: 5298 res = posix_lock_file_wait(file, fl); 5299 break; 5300 case FL_FLOCK: 5301 res = flock_lock_file_wait(file, fl); 5302 break; 5303 default: 5304 BUG(); 5305 } 5306 return res; 5307 } 5308 5309 struct nfs4_unlockdata { 5310 struct nfs_locku_args arg; 5311 struct nfs_locku_res res; 5312 struct nfs4_lock_state *lsp; 5313 struct nfs_open_context *ctx; 5314 struct file_lock fl; 5315 const struct nfs_server *server; 5316 unsigned long timestamp; 5317 }; 5318 5319 static struct nfs4_unlockdata *nfs4_alloc_unlockdata(struct file_lock *fl, 5320 struct nfs_open_context *ctx, 5321 struct nfs4_lock_state *lsp, 5322 struct nfs_seqid *seqid) 5323 { 5324 struct nfs4_unlockdata *p; 5325 struct inode *inode = lsp->ls_state->inode; 5326 5327 p = kzalloc(sizeof(*p), GFP_NOFS); 5328 if (p == NULL) 5329 return NULL; 5330 p->arg.fh = NFS_FH(inode); 5331 p->arg.fl = &p->fl; 5332 p->arg.seqid = seqid; 5333 p->res.seqid = seqid; 5334 p->arg.stateid = &lsp->ls_stateid; 5335 p->lsp = lsp; 5336 atomic_inc(&lsp->ls_count); 5337 /* Ensure we don't close file until we're done freeing locks! */ 5338 p->ctx = get_nfs_open_context(ctx); 5339 memcpy(&p->fl, fl, sizeof(p->fl)); 5340 p->server = NFS_SERVER(inode); 5341 return p; 5342 } 5343 5344 static void nfs4_locku_release_calldata(void *data) 5345 { 5346 struct nfs4_unlockdata *calldata = data; 5347 nfs_free_seqid(calldata->arg.seqid); 5348 nfs4_put_lock_state(calldata->lsp); 5349 put_nfs_open_context(calldata->ctx); 5350 kfree(calldata); 5351 } 5352 5353 static void nfs4_locku_done(struct rpc_task *task, void *data) 5354 { 5355 struct nfs4_unlockdata *calldata = data; 5356 5357 if (!nfs4_sequence_done(task, &calldata->res.seq_res)) 5358 return; 5359 switch (task->tk_status) { 5360 case 0: 5361 nfs4_stateid_copy(&calldata->lsp->ls_stateid, 5362 &calldata->res.stateid); 5363 renew_lease(calldata->server, calldata->timestamp); 5364 break; 5365 case -NFS4ERR_BAD_STATEID: 5366 case -NFS4ERR_OLD_STATEID: 5367 case -NFS4ERR_STALE_STATEID: 5368 case -NFS4ERR_EXPIRED: 5369 break; 5370 default: 5371 if (nfs4_async_handle_error(task, calldata->server, NULL) == -EAGAIN) 5372 rpc_restart_call_prepare(task); 5373 } 5374 nfs_release_seqid(calldata->arg.seqid); 5375 } 5376 5377 static void nfs4_locku_prepare(struct rpc_task *task, void *data) 5378 { 5379 struct nfs4_unlockdata *calldata = data; 5380 5381 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0) 5382 goto out_wait; 5383 if (test_bit(NFS_LOCK_INITIALIZED, &calldata->lsp->ls_flags) == 0) { 5384 /* Note: exit _without_ running nfs4_locku_done */ 5385 goto out_no_action; 5386 } 5387 calldata->timestamp = jiffies; 5388 if (nfs4_setup_sequence(calldata->server, 5389 &calldata->arg.seq_args, 5390 &calldata->res.seq_res, 5391 task) != 0) 5392 nfs_release_seqid(calldata->arg.seqid); 5393 return; 5394 out_no_action: 5395 task->tk_action = NULL; 5396 out_wait: 5397 nfs4_sequence_done(task, &calldata->res.seq_res); 5398 } 5399 5400 static const struct rpc_call_ops nfs4_locku_ops = { 5401 .rpc_call_prepare = nfs4_locku_prepare, 5402 .rpc_call_done = nfs4_locku_done, 5403 .rpc_release = nfs4_locku_release_calldata, 5404 }; 5405 5406 static struct rpc_task *nfs4_do_unlck(struct file_lock *fl, 5407 struct nfs_open_context *ctx, 5408 struct nfs4_lock_state *lsp, 5409 struct nfs_seqid *seqid) 5410 { 5411 struct nfs4_unlockdata *data; 5412 struct rpc_message msg = { 5413 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKU], 5414 .rpc_cred = ctx->cred, 5415 }; 5416 struct rpc_task_setup task_setup_data = { 5417 .rpc_client = NFS_CLIENT(lsp->ls_state->inode), 5418 .rpc_message = &msg, 5419 .callback_ops = &nfs4_locku_ops, 5420 .workqueue = nfsiod_workqueue, 5421 .flags = RPC_TASK_ASYNC, 5422 }; 5423 5424 nfs4_state_protect(NFS_SERVER(lsp->ls_state->inode)->nfs_client, 5425 NFS_SP4_MACH_CRED_CLEANUP, &task_setup_data.rpc_client, &msg); 5426 5427 /* Ensure this is an unlock - when canceling a lock, the 5428 * canceled lock is passed in, and it won't be an unlock. 5429 */ 5430 fl->fl_type = F_UNLCK; 5431 5432 data = nfs4_alloc_unlockdata(fl, ctx, lsp, seqid); 5433 if (data == NULL) { 5434 nfs_free_seqid(seqid); 5435 return ERR_PTR(-ENOMEM); 5436 } 5437 5438 nfs4_init_sequence(&data->arg.seq_args, &data->res.seq_res, 1); 5439 msg.rpc_argp = &data->arg; 5440 msg.rpc_resp = &data->res; 5441 task_setup_data.callback_data = data; 5442 return rpc_run_task(&task_setup_data); 5443 } 5444 5445 static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request) 5446 { 5447 struct inode *inode = state->inode; 5448 struct nfs4_state_owner *sp = state->owner; 5449 struct nfs_inode *nfsi = NFS_I(inode); 5450 struct nfs_seqid *seqid; 5451 struct nfs4_lock_state *lsp; 5452 struct rpc_task *task; 5453 int status = 0; 5454 unsigned char fl_flags = request->fl_flags; 5455 5456 status = nfs4_set_lock_state(state, request); 5457 /* Unlock _before_ we do the RPC call */ 5458 request->fl_flags |= FL_EXISTS; 5459 /* Exclude nfs_delegation_claim_locks() */ 5460 mutex_lock(&sp->so_delegreturn_mutex); 5461 /* Exclude nfs4_reclaim_open_stateid() - note nesting! */ 5462 down_read(&nfsi->rwsem); 5463 if (do_vfs_lock(request->fl_file, request) == -ENOENT) { 5464 up_read(&nfsi->rwsem); 5465 mutex_unlock(&sp->so_delegreturn_mutex); 5466 goto out; 5467 } 5468 up_read(&nfsi->rwsem); 5469 mutex_unlock(&sp->so_delegreturn_mutex); 5470 if (status != 0) 5471 goto out; 5472 /* Is this a delegated lock? */ 5473 lsp = request->fl_u.nfs4_fl.owner; 5474 if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) == 0) 5475 goto out; 5476 seqid = nfs_alloc_seqid(&lsp->ls_seqid, GFP_KERNEL); 5477 status = -ENOMEM; 5478 if (seqid == NULL) 5479 goto out; 5480 task = nfs4_do_unlck(request, nfs_file_open_context(request->fl_file), lsp, seqid); 5481 status = PTR_ERR(task); 5482 if (IS_ERR(task)) 5483 goto out; 5484 status = nfs4_wait_for_completion_rpc_task(task); 5485 rpc_put_task(task); 5486 out: 5487 request->fl_flags = fl_flags; 5488 trace_nfs4_unlock(request, state, F_SETLK, status); 5489 return status; 5490 } 5491 5492 struct nfs4_lockdata { 5493 struct nfs_lock_args arg; 5494 struct nfs_lock_res res; 5495 struct nfs4_lock_state *lsp; 5496 struct nfs_open_context *ctx; 5497 struct file_lock fl; 5498 unsigned long timestamp; 5499 int rpc_status; 5500 int cancelled; 5501 struct nfs_server *server; 5502 }; 5503 5504 static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl, 5505 struct nfs_open_context *ctx, struct nfs4_lock_state *lsp, 5506 gfp_t gfp_mask) 5507 { 5508 struct nfs4_lockdata *p; 5509 struct inode *inode = lsp->ls_state->inode; 5510 struct nfs_server *server = NFS_SERVER(inode); 5511 5512 p = kzalloc(sizeof(*p), gfp_mask); 5513 if (p == NULL) 5514 return NULL; 5515 5516 p->arg.fh = NFS_FH(inode); 5517 p->arg.fl = &p->fl; 5518 p->arg.open_seqid = nfs_alloc_seqid(&lsp->ls_state->owner->so_seqid, gfp_mask); 5519 if (p->arg.open_seqid == NULL) 5520 goto out_free; 5521 p->arg.lock_seqid = nfs_alloc_seqid(&lsp->ls_seqid, gfp_mask); 5522 if (p->arg.lock_seqid == NULL) 5523 goto out_free_seqid; 5524 p->arg.lock_stateid = &lsp->ls_stateid; 5525 p->arg.lock_owner.clientid = server->nfs_client->cl_clientid; 5526 p->arg.lock_owner.id = lsp->ls_seqid.owner_id; 5527 p->arg.lock_owner.s_dev = server->s_dev; 5528 p->res.lock_seqid = p->arg.lock_seqid; 5529 p->lsp = lsp; 5530 p->server = server; 5531 atomic_inc(&lsp->ls_count); 5532 p->ctx = get_nfs_open_context(ctx); 5533 memcpy(&p->fl, fl, sizeof(p->fl)); 5534 return p; 5535 out_free_seqid: 5536 nfs_free_seqid(p->arg.open_seqid); 5537 out_free: 5538 kfree(p); 5539 return NULL; 5540 } 5541 5542 static void nfs4_lock_prepare(struct rpc_task *task, void *calldata) 5543 { 5544 struct nfs4_lockdata *data = calldata; 5545 struct nfs4_state *state = data->lsp->ls_state; 5546 5547 dprintk("%s: begin!\n", __func__); 5548 if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0) 5549 goto out_wait; 5550 /* Do we need to do an open_to_lock_owner? */ 5551 if (!(data->arg.lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED)) { 5552 if (nfs_wait_on_sequence(data->arg.open_seqid, task) != 0) { 5553 goto out_release_lock_seqid; 5554 } 5555 data->arg.open_stateid = &state->open_stateid; 5556 data->arg.new_lock_owner = 1; 5557 data->res.open_seqid = data->arg.open_seqid; 5558 } else 5559 data->arg.new_lock_owner = 0; 5560 if (!nfs4_valid_open_stateid(state)) { 5561 data->rpc_status = -EBADF; 5562 task->tk_action = NULL; 5563 goto out_release_open_seqid; 5564 } 5565 data->timestamp = jiffies; 5566 if (nfs4_setup_sequence(data->server, 5567 &data->arg.seq_args, 5568 &data->res.seq_res, 5569 task) == 0) 5570 return; 5571 out_release_open_seqid: 5572 nfs_release_seqid(data->arg.open_seqid); 5573 out_release_lock_seqid: 5574 nfs_release_seqid(data->arg.lock_seqid); 5575 out_wait: 5576 nfs4_sequence_done(task, &data->res.seq_res); 5577 dprintk("%s: done!, ret = %d\n", __func__, data->rpc_status); 5578 } 5579 5580 static void nfs4_lock_done(struct rpc_task *task, void *calldata) 5581 { 5582 struct nfs4_lockdata *data = calldata; 5583 5584 dprintk("%s: begin!\n", __func__); 5585 5586 if (!nfs4_sequence_done(task, &data->res.seq_res)) 5587 return; 5588 5589 data->rpc_status = task->tk_status; 5590 if (data->arg.new_lock_owner != 0) { 5591 if (data->rpc_status == 0) 5592 nfs_confirm_seqid(&data->lsp->ls_seqid, 0); 5593 else 5594 goto out; 5595 } 5596 if (data->rpc_status == 0) { 5597 nfs4_stateid_copy(&data->lsp->ls_stateid, &data->res.stateid); 5598 set_bit(NFS_LOCK_INITIALIZED, &data->lsp->ls_flags); 5599 renew_lease(NFS_SERVER(data->ctx->dentry->d_inode), data->timestamp); 5600 } 5601 out: 5602 dprintk("%s: done, ret = %d!\n", __func__, data->rpc_status); 5603 } 5604 5605 static void nfs4_lock_release(void *calldata) 5606 { 5607 struct nfs4_lockdata *data = calldata; 5608 5609 dprintk("%s: begin!\n", __func__); 5610 nfs_free_seqid(data->arg.open_seqid); 5611 if (data->cancelled != 0) { 5612 struct rpc_task *task; 5613 task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp, 5614 data->arg.lock_seqid); 5615 if (!IS_ERR(task)) 5616 rpc_put_task_async(task); 5617 dprintk("%s: cancelling lock!\n", __func__); 5618 } else 5619 nfs_free_seqid(data->arg.lock_seqid); 5620 nfs4_put_lock_state(data->lsp); 5621 put_nfs_open_context(data->ctx); 5622 kfree(data); 5623 dprintk("%s: done!\n", __func__); 5624 } 5625 5626 static const struct rpc_call_ops nfs4_lock_ops = { 5627 .rpc_call_prepare = nfs4_lock_prepare, 5628 .rpc_call_done = nfs4_lock_done, 5629 .rpc_release = nfs4_lock_release, 5630 }; 5631 5632 static void nfs4_handle_setlk_error(struct nfs_server *server, struct nfs4_lock_state *lsp, int new_lock_owner, int error) 5633 { 5634 switch (error) { 5635 case -NFS4ERR_ADMIN_REVOKED: 5636 case -NFS4ERR_BAD_STATEID: 5637 lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED; 5638 if (new_lock_owner != 0 || 5639 test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) != 0) 5640 nfs4_schedule_stateid_recovery(server, lsp->ls_state); 5641 break; 5642 case -NFS4ERR_STALE_STATEID: 5643 lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED; 5644 case -NFS4ERR_EXPIRED: 5645 nfs4_schedule_lease_recovery(server->nfs_client); 5646 }; 5647 } 5648 5649 static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int recovery_type) 5650 { 5651 struct nfs4_lockdata *data; 5652 struct rpc_task *task; 5653 struct rpc_message msg = { 5654 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCK], 5655 .rpc_cred = state->owner->so_cred, 5656 }; 5657 struct rpc_task_setup task_setup_data = { 5658 .rpc_client = NFS_CLIENT(state->inode), 5659 .rpc_message = &msg, 5660 .callback_ops = &nfs4_lock_ops, 5661 .workqueue = nfsiod_workqueue, 5662 .flags = RPC_TASK_ASYNC, 5663 }; 5664 int ret; 5665 5666 dprintk("%s: begin!\n", __func__); 5667 data = nfs4_alloc_lockdata(fl, nfs_file_open_context(fl->fl_file), 5668 fl->fl_u.nfs4_fl.owner, 5669 recovery_type == NFS_LOCK_NEW ? GFP_KERNEL : GFP_NOFS); 5670 if (data == NULL) 5671 return -ENOMEM; 5672 if (IS_SETLKW(cmd)) 5673 data->arg.block = 1; 5674 nfs4_init_sequence(&data->arg.seq_args, &data->res.seq_res, 1); 5675 msg.rpc_argp = &data->arg; 5676 msg.rpc_resp = &data->res; 5677 task_setup_data.callback_data = data; 5678 if (recovery_type > NFS_LOCK_NEW) { 5679 if (recovery_type == NFS_LOCK_RECLAIM) 5680 data->arg.reclaim = NFS_LOCK_RECLAIM; 5681 nfs4_set_sequence_privileged(&data->arg.seq_args); 5682 } 5683 task = rpc_run_task(&task_setup_data); 5684 if (IS_ERR(task)) 5685 return PTR_ERR(task); 5686 ret = nfs4_wait_for_completion_rpc_task(task); 5687 if (ret == 0) { 5688 ret = data->rpc_status; 5689 if (ret) 5690 nfs4_handle_setlk_error(data->server, data->lsp, 5691 data->arg.new_lock_owner, ret); 5692 } else 5693 data->cancelled = 1; 5694 rpc_put_task(task); 5695 dprintk("%s: done, ret = %d!\n", __func__, ret); 5696 return ret; 5697 } 5698 5699 static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request) 5700 { 5701 struct nfs_server *server = NFS_SERVER(state->inode); 5702 struct nfs4_exception exception = { 5703 .inode = state->inode, 5704 }; 5705 int err; 5706 5707 do { 5708 /* Cache the lock if possible... */ 5709 if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0) 5710 return 0; 5711 err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_RECLAIM); 5712 trace_nfs4_lock_reclaim(request, state, F_SETLK, err); 5713 if (err != -NFS4ERR_DELAY) 5714 break; 5715 nfs4_handle_exception(server, err, &exception); 5716 } while (exception.retry); 5717 return err; 5718 } 5719 5720 static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request) 5721 { 5722 struct nfs_server *server = NFS_SERVER(state->inode); 5723 struct nfs4_exception exception = { 5724 .inode = state->inode, 5725 }; 5726 int err; 5727 5728 err = nfs4_set_lock_state(state, request); 5729 if (err != 0) 5730 return err; 5731 if (!recover_lost_locks) { 5732 set_bit(NFS_LOCK_LOST, &request->fl_u.nfs4_fl.owner->ls_flags); 5733 return 0; 5734 } 5735 do { 5736 if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0) 5737 return 0; 5738 err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_EXPIRED); 5739 trace_nfs4_lock_expired(request, state, F_SETLK, err); 5740 switch (err) { 5741 default: 5742 goto out; 5743 case -NFS4ERR_GRACE: 5744 case -NFS4ERR_DELAY: 5745 nfs4_handle_exception(server, err, &exception); 5746 err = 0; 5747 } 5748 } while (exception.retry); 5749 out: 5750 return err; 5751 } 5752 5753 #if defined(CONFIG_NFS_V4_1) 5754 /** 5755 * nfs41_check_expired_locks - possibly free a lock stateid 5756 * 5757 * @state: NFSv4 state for an inode 5758 * 5759 * Returns NFS_OK if recovery for this stateid is now finished. 5760 * Otherwise a negative NFS4ERR value is returned. 5761 */ 5762 static int nfs41_check_expired_locks(struct nfs4_state *state) 5763 { 5764 int status, ret = -NFS4ERR_BAD_STATEID; 5765 struct nfs4_lock_state *lsp; 5766 struct nfs_server *server = NFS_SERVER(state->inode); 5767 5768 list_for_each_entry(lsp, &state->lock_states, ls_locks) { 5769 if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags)) { 5770 struct rpc_cred *cred = lsp->ls_state->owner->so_cred; 5771 5772 status = nfs41_test_stateid(server, 5773 &lsp->ls_stateid, 5774 cred); 5775 trace_nfs4_test_lock_stateid(state, lsp, status); 5776 if (status != NFS_OK) { 5777 /* Free the stateid unless the server 5778 * informs us the stateid is unrecognized. */ 5779 if (status != -NFS4ERR_BAD_STATEID) 5780 nfs41_free_stateid(server, 5781 &lsp->ls_stateid, 5782 cred); 5783 clear_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags); 5784 ret = status; 5785 } 5786 } 5787 }; 5788 5789 return ret; 5790 } 5791 5792 static int nfs41_lock_expired(struct nfs4_state *state, struct file_lock *request) 5793 { 5794 int status = NFS_OK; 5795 5796 if (test_bit(LK_STATE_IN_USE, &state->flags)) 5797 status = nfs41_check_expired_locks(state); 5798 if (status != NFS_OK) 5799 status = nfs4_lock_expired(state, request); 5800 return status; 5801 } 5802 #endif 5803 5804 static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request) 5805 { 5806 struct nfs4_state_owner *sp = state->owner; 5807 struct nfs_inode *nfsi = NFS_I(state->inode); 5808 unsigned char fl_flags = request->fl_flags; 5809 unsigned int seq; 5810 int status = -ENOLCK; 5811 5812 if ((fl_flags & FL_POSIX) && 5813 !test_bit(NFS_STATE_POSIX_LOCKS, &state->flags)) 5814 goto out; 5815 /* Is this a delegated open? */ 5816 status = nfs4_set_lock_state(state, request); 5817 if (status != 0) 5818 goto out; 5819 request->fl_flags |= FL_ACCESS; 5820 status = do_vfs_lock(request->fl_file, request); 5821 if (status < 0) 5822 goto out; 5823 down_read(&nfsi->rwsem); 5824 if (test_bit(NFS_DELEGATED_STATE, &state->flags)) { 5825 /* Yes: cache locks! */ 5826 /* ...but avoid races with delegation recall... */ 5827 request->fl_flags = fl_flags & ~FL_SLEEP; 5828 status = do_vfs_lock(request->fl_file, request); 5829 goto out_unlock; 5830 } 5831 seq = raw_seqcount_begin(&sp->so_reclaim_seqcount); 5832 up_read(&nfsi->rwsem); 5833 status = _nfs4_do_setlk(state, cmd, request, NFS_LOCK_NEW); 5834 if (status != 0) 5835 goto out; 5836 down_read(&nfsi->rwsem); 5837 if (read_seqcount_retry(&sp->so_reclaim_seqcount, seq)) { 5838 status = -NFS4ERR_DELAY; 5839 goto out_unlock; 5840 } 5841 /* Note: we always want to sleep here! */ 5842 request->fl_flags = fl_flags | FL_SLEEP; 5843 if (do_vfs_lock(request->fl_file, request) < 0) 5844 printk(KERN_WARNING "NFS: %s: VFS is out of sync with lock " 5845 "manager!\n", __func__); 5846 out_unlock: 5847 up_read(&nfsi->rwsem); 5848 out: 5849 request->fl_flags = fl_flags; 5850 return status; 5851 } 5852 5853 static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request) 5854 { 5855 struct nfs4_exception exception = { 5856 .state = state, 5857 .inode = state->inode, 5858 }; 5859 int err; 5860 5861 do { 5862 err = _nfs4_proc_setlk(state, cmd, request); 5863 trace_nfs4_set_lock(request, state, cmd, err); 5864 if (err == -NFS4ERR_DENIED) 5865 err = -EAGAIN; 5866 err = nfs4_handle_exception(NFS_SERVER(state->inode), 5867 err, &exception); 5868 } while (exception.retry); 5869 return err; 5870 } 5871 5872 static int 5873 nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request) 5874 { 5875 struct nfs_open_context *ctx; 5876 struct nfs4_state *state; 5877 unsigned long timeout = NFS4_LOCK_MINTIMEOUT; 5878 int status; 5879 5880 /* verify open state */ 5881 ctx = nfs_file_open_context(filp); 5882 state = ctx->state; 5883 5884 if (request->fl_start < 0 || request->fl_end < 0) 5885 return -EINVAL; 5886 5887 if (IS_GETLK(cmd)) { 5888 if (state != NULL) 5889 return nfs4_proc_getlk(state, F_GETLK, request); 5890 return 0; 5891 } 5892 5893 if (!(IS_SETLK(cmd) || IS_SETLKW(cmd))) 5894 return -EINVAL; 5895 5896 if (request->fl_type == F_UNLCK) { 5897 if (state != NULL) 5898 return nfs4_proc_unlck(state, cmd, request); 5899 return 0; 5900 } 5901 5902 if (state == NULL) 5903 return -ENOLCK; 5904 /* 5905 * Don't rely on the VFS having checked the file open mode, 5906 * since it won't do this for flock() locks. 5907 */ 5908 switch (request->fl_type) { 5909 case F_RDLCK: 5910 if (!(filp->f_mode & FMODE_READ)) 5911 return -EBADF; 5912 break; 5913 case F_WRLCK: 5914 if (!(filp->f_mode & FMODE_WRITE)) 5915 return -EBADF; 5916 } 5917 5918 do { 5919 status = nfs4_proc_setlk(state, cmd, request); 5920 if ((status != -EAGAIN) || IS_SETLK(cmd)) 5921 break; 5922 timeout = nfs4_set_lock_task_retry(timeout); 5923 status = -ERESTARTSYS; 5924 if (signalled()) 5925 break; 5926 } while(status < 0); 5927 return status; 5928 } 5929 5930 int nfs4_lock_delegation_recall(struct file_lock *fl, struct nfs4_state *state, const nfs4_stateid *stateid) 5931 { 5932 struct nfs_server *server = NFS_SERVER(state->inode); 5933 int err; 5934 5935 err = nfs4_set_lock_state(state, fl); 5936 if (err != 0) 5937 return err; 5938 err = _nfs4_do_setlk(state, F_SETLK, fl, NFS_LOCK_NEW); 5939 return nfs4_handle_delegation_recall_error(server, state, stateid, err); 5940 } 5941 5942 struct nfs_release_lockowner_data { 5943 struct nfs4_lock_state *lsp; 5944 struct nfs_server *server; 5945 struct nfs_release_lockowner_args args; 5946 struct nfs_release_lockowner_res res; 5947 unsigned long timestamp; 5948 }; 5949 5950 static void nfs4_release_lockowner_prepare(struct rpc_task *task, void *calldata) 5951 { 5952 struct nfs_release_lockowner_data *data = calldata; 5953 struct nfs_server *server = data->server; 5954 nfs40_setup_sequence(server, &data->args.seq_args, 5955 &data->res.seq_res, task); 5956 data->args.lock_owner.clientid = server->nfs_client->cl_clientid; 5957 data->timestamp = jiffies; 5958 } 5959 5960 static void nfs4_release_lockowner_done(struct rpc_task *task, void *calldata) 5961 { 5962 struct nfs_release_lockowner_data *data = calldata; 5963 struct nfs_server *server = data->server; 5964 5965 nfs40_sequence_done(task, &data->res.seq_res); 5966 5967 switch (task->tk_status) { 5968 case 0: 5969 renew_lease(server, data->timestamp); 5970 break; 5971 case -NFS4ERR_STALE_CLIENTID: 5972 case -NFS4ERR_EXPIRED: 5973 nfs4_schedule_lease_recovery(server->nfs_client); 5974 break; 5975 case -NFS4ERR_LEASE_MOVED: 5976 case -NFS4ERR_DELAY: 5977 if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) 5978 rpc_restart_call_prepare(task); 5979 } 5980 } 5981 5982 static void nfs4_release_lockowner_release(void *calldata) 5983 { 5984 struct nfs_release_lockowner_data *data = calldata; 5985 nfs4_free_lock_state(data->server, data->lsp); 5986 kfree(calldata); 5987 } 5988 5989 static const struct rpc_call_ops nfs4_release_lockowner_ops = { 5990 .rpc_call_prepare = nfs4_release_lockowner_prepare, 5991 .rpc_call_done = nfs4_release_lockowner_done, 5992 .rpc_release = nfs4_release_lockowner_release, 5993 }; 5994 5995 static void 5996 nfs4_release_lockowner(struct nfs_server *server, struct nfs4_lock_state *lsp) 5997 { 5998 struct nfs_release_lockowner_data *data; 5999 struct rpc_message msg = { 6000 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RELEASE_LOCKOWNER], 6001 }; 6002 6003 if (server->nfs_client->cl_mvops->minor_version != 0) 6004 return; 6005 6006 data = kmalloc(sizeof(*data), GFP_NOFS); 6007 if (!data) 6008 return; 6009 data->lsp = lsp; 6010 data->server = server; 6011 data->args.lock_owner.clientid = server->nfs_client->cl_clientid; 6012 data->args.lock_owner.id = lsp->ls_seqid.owner_id; 6013 data->args.lock_owner.s_dev = server->s_dev; 6014 6015 msg.rpc_argp = &data->args; 6016 msg.rpc_resp = &data->res; 6017 nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 0); 6018 rpc_call_async(server->client, &msg, 0, &nfs4_release_lockowner_ops, data); 6019 } 6020 6021 #define XATTR_NAME_NFSV4_ACL "system.nfs4_acl" 6022 6023 static int nfs4_xattr_set_nfs4_acl(struct dentry *dentry, const char *key, 6024 const void *buf, size_t buflen, 6025 int flags, int type) 6026 { 6027 if (strcmp(key, "") != 0) 6028 return -EINVAL; 6029 6030 return nfs4_proc_set_acl(dentry->d_inode, buf, buflen); 6031 } 6032 6033 static int nfs4_xattr_get_nfs4_acl(struct dentry *dentry, const char *key, 6034 void *buf, size_t buflen, int type) 6035 { 6036 if (strcmp(key, "") != 0) 6037 return -EINVAL; 6038 6039 return nfs4_proc_get_acl(dentry->d_inode, buf, buflen); 6040 } 6041 6042 static size_t nfs4_xattr_list_nfs4_acl(struct dentry *dentry, char *list, 6043 size_t list_len, const char *name, 6044 size_t name_len, int type) 6045 { 6046 size_t len = sizeof(XATTR_NAME_NFSV4_ACL); 6047 6048 if (!nfs4_server_supports_acls(NFS_SERVER(dentry->d_inode))) 6049 return 0; 6050 6051 if (list && len <= list_len) 6052 memcpy(list, XATTR_NAME_NFSV4_ACL, len); 6053 return len; 6054 } 6055 6056 #ifdef CONFIG_NFS_V4_SECURITY_LABEL 6057 static inline int nfs4_server_supports_labels(struct nfs_server *server) 6058 { 6059 return server->caps & NFS_CAP_SECURITY_LABEL; 6060 } 6061 6062 static int nfs4_xattr_set_nfs4_label(struct dentry *dentry, const char *key, 6063 const void *buf, size_t buflen, 6064 int flags, int type) 6065 { 6066 if (security_ismaclabel(key)) 6067 return nfs4_set_security_label(dentry, buf, buflen); 6068 6069 return -EOPNOTSUPP; 6070 } 6071 6072 static int nfs4_xattr_get_nfs4_label(struct dentry *dentry, const char *key, 6073 void *buf, size_t buflen, int type) 6074 { 6075 if (security_ismaclabel(key)) 6076 return nfs4_get_security_label(dentry->d_inode, buf, buflen); 6077 return -EOPNOTSUPP; 6078 } 6079 6080 static size_t nfs4_xattr_list_nfs4_label(struct dentry *dentry, char *list, 6081 size_t list_len, const char *name, 6082 size_t name_len, int type) 6083 { 6084 size_t len = 0; 6085 6086 if (nfs_server_capable(dentry->d_inode, NFS_CAP_SECURITY_LABEL)) { 6087 len = security_inode_listsecurity(dentry->d_inode, NULL, 0); 6088 if (list && len <= list_len) 6089 security_inode_listsecurity(dentry->d_inode, list, len); 6090 } 6091 return len; 6092 } 6093 6094 static const struct xattr_handler nfs4_xattr_nfs4_label_handler = { 6095 .prefix = XATTR_SECURITY_PREFIX, 6096 .list = nfs4_xattr_list_nfs4_label, 6097 .get = nfs4_xattr_get_nfs4_label, 6098 .set = nfs4_xattr_set_nfs4_label, 6099 }; 6100 #endif 6101 6102 6103 /* 6104 * nfs_fhget will use either the mounted_on_fileid or the fileid 6105 */ 6106 static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr) 6107 { 6108 if (!(((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) || 6109 (fattr->valid & NFS_ATTR_FATTR_FILEID)) && 6110 (fattr->valid & NFS_ATTR_FATTR_FSID) && 6111 (fattr->valid & NFS_ATTR_FATTR_V4_LOCATIONS))) 6112 return; 6113 6114 fattr->valid |= NFS_ATTR_FATTR_TYPE | NFS_ATTR_FATTR_MODE | 6115 NFS_ATTR_FATTR_NLINK | NFS_ATTR_FATTR_V4_REFERRAL; 6116 fattr->mode = S_IFDIR | S_IRUGO | S_IXUGO; 6117 fattr->nlink = 2; 6118 } 6119 6120 static int _nfs4_proc_fs_locations(struct rpc_clnt *client, struct inode *dir, 6121 const struct qstr *name, 6122 struct nfs4_fs_locations *fs_locations, 6123 struct page *page) 6124 { 6125 struct nfs_server *server = NFS_SERVER(dir); 6126 u32 bitmask[3] = { 6127 [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS, 6128 }; 6129 struct nfs4_fs_locations_arg args = { 6130 .dir_fh = NFS_FH(dir), 6131 .name = name, 6132 .page = page, 6133 .bitmask = bitmask, 6134 }; 6135 struct nfs4_fs_locations_res res = { 6136 .fs_locations = fs_locations, 6137 }; 6138 struct rpc_message msg = { 6139 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FS_LOCATIONS], 6140 .rpc_argp = &args, 6141 .rpc_resp = &res, 6142 }; 6143 int status; 6144 6145 dprintk("%s: start\n", __func__); 6146 6147 /* Ask for the fileid of the absent filesystem if mounted_on_fileid 6148 * is not supported */ 6149 if (NFS_SERVER(dir)->attr_bitmask[1] & FATTR4_WORD1_MOUNTED_ON_FILEID) 6150 bitmask[1] |= FATTR4_WORD1_MOUNTED_ON_FILEID; 6151 else 6152 bitmask[0] |= FATTR4_WORD0_FILEID; 6153 6154 nfs_fattr_init(&fs_locations->fattr); 6155 fs_locations->server = server; 6156 fs_locations->nlocations = 0; 6157 status = nfs4_call_sync(client, server, &msg, &args.seq_args, &res.seq_res, 0); 6158 dprintk("%s: returned status = %d\n", __func__, status); 6159 return status; 6160 } 6161 6162 int nfs4_proc_fs_locations(struct rpc_clnt *client, struct inode *dir, 6163 const struct qstr *name, 6164 struct nfs4_fs_locations *fs_locations, 6165 struct page *page) 6166 { 6167 struct nfs4_exception exception = { }; 6168 int err; 6169 do { 6170 err = _nfs4_proc_fs_locations(client, dir, name, 6171 fs_locations, page); 6172 trace_nfs4_get_fs_locations(dir, name, err); 6173 err = nfs4_handle_exception(NFS_SERVER(dir), err, 6174 &exception); 6175 } while (exception.retry); 6176 return err; 6177 } 6178 6179 /* 6180 * This operation also signals the server that this client is 6181 * performing migration recovery. The server can stop returning 6182 * NFS4ERR_LEASE_MOVED to this client. A RENEW operation is 6183 * appended to this compound to identify the client ID which is 6184 * performing recovery. 6185 */ 6186 static int _nfs40_proc_get_locations(struct inode *inode, 6187 struct nfs4_fs_locations *locations, 6188 struct page *page, struct rpc_cred *cred) 6189 { 6190 struct nfs_server *server = NFS_SERVER(inode); 6191 struct rpc_clnt *clnt = server->client; 6192 u32 bitmask[2] = { 6193 [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS, 6194 }; 6195 struct nfs4_fs_locations_arg args = { 6196 .clientid = server->nfs_client->cl_clientid, 6197 .fh = NFS_FH(inode), 6198 .page = page, 6199 .bitmask = bitmask, 6200 .migration = 1, /* skip LOOKUP */ 6201 .renew = 1, /* append RENEW */ 6202 }; 6203 struct nfs4_fs_locations_res res = { 6204 .fs_locations = locations, 6205 .migration = 1, 6206 .renew = 1, 6207 }; 6208 struct rpc_message msg = { 6209 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FS_LOCATIONS], 6210 .rpc_argp = &args, 6211 .rpc_resp = &res, 6212 .rpc_cred = cred, 6213 }; 6214 unsigned long now = jiffies; 6215 int status; 6216 6217 nfs_fattr_init(&locations->fattr); 6218 locations->server = server; 6219 locations->nlocations = 0; 6220 6221 nfs4_init_sequence(&args.seq_args, &res.seq_res, 0); 6222 nfs4_set_sequence_privileged(&args.seq_args); 6223 status = nfs4_call_sync_sequence(clnt, server, &msg, 6224 &args.seq_args, &res.seq_res); 6225 if (status) 6226 return status; 6227 6228 renew_lease(server, now); 6229 return 0; 6230 } 6231 6232 #ifdef CONFIG_NFS_V4_1 6233 6234 /* 6235 * This operation also signals the server that this client is 6236 * performing migration recovery. The server can stop asserting 6237 * SEQ4_STATUS_LEASE_MOVED for this client. The client ID 6238 * performing this operation is identified in the SEQUENCE 6239 * operation in this compound. 6240 * 6241 * When the client supports GETATTR(fs_locations_info), it can 6242 * be plumbed in here. 6243 */ 6244 static int _nfs41_proc_get_locations(struct inode *inode, 6245 struct nfs4_fs_locations *locations, 6246 struct page *page, struct rpc_cred *cred) 6247 { 6248 struct nfs_server *server = NFS_SERVER(inode); 6249 struct rpc_clnt *clnt = server->client; 6250 u32 bitmask[2] = { 6251 [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS, 6252 }; 6253 struct nfs4_fs_locations_arg args = { 6254 .fh = NFS_FH(inode), 6255 .page = page, 6256 .bitmask = bitmask, 6257 .migration = 1, /* skip LOOKUP */ 6258 }; 6259 struct nfs4_fs_locations_res res = { 6260 .fs_locations = locations, 6261 .migration = 1, 6262 }; 6263 struct rpc_message msg = { 6264 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FS_LOCATIONS], 6265 .rpc_argp = &args, 6266 .rpc_resp = &res, 6267 .rpc_cred = cred, 6268 }; 6269 int status; 6270 6271 nfs_fattr_init(&locations->fattr); 6272 locations->server = server; 6273 locations->nlocations = 0; 6274 6275 nfs4_init_sequence(&args.seq_args, &res.seq_res, 0); 6276 nfs4_set_sequence_privileged(&args.seq_args); 6277 status = nfs4_call_sync_sequence(clnt, server, &msg, 6278 &args.seq_args, &res.seq_res); 6279 if (status == NFS4_OK && 6280 res.seq_res.sr_status_flags & SEQ4_STATUS_LEASE_MOVED) 6281 status = -NFS4ERR_LEASE_MOVED; 6282 return status; 6283 } 6284 6285 #endif /* CONFIG_NFS_V4_1 */ 6286 6287 /** 6288 * nfs4_proc_get_locations - discover locations for a migrated FSID 6289 * @inode: inode on FSID that is migrating 6290 * @locations: result of query 6291 * @page: buffer 6292 * @cred: credential to use for this operation 6293 * 6294 * Returns NFS4_OK on success, a negative NFS4ERR status code if the 6295 * operation failed, or a negative errno if a local error occurred. 6296 * 6297 * On success, "locations" is filled in, but if the server has 6298 * no locations information, NFS_ATTR_FATTR_V4_LOCATIONS is not 6299 * asserted. 6300 * 6301 * -NFS4ERR_LEASE_MOVED is returned if the server still has leases 6302 * from this client that require migration recovery. 6303 */ 6304 int nfs4_proc_get_locations(struct inode *inode, 6305 struct nfs4_fs_locations *locations, 6306 struct page *page, struct rpc_cred *cred) 6307 { 6308 struct nfs_server *server = NFS_SERVER(inode); 6309 struct nfs_client *clp = server->nfs_client; 6310 const struct nfs4_mig_recovery_ops *ops = 6311 clp->cl_mvops->mig_recovery_ops; 6312 struct nfs4_exception exception = { }; 6313 int status; 6314 6315 dprintk("%s: FSID %llx:%llx on \"%s\"\n", __func__, 6316 (unsigned long long)server->fsid.major, 6317 (unsigned long long)server->fsid.minor, 6318 clp->cl_hostname); 6319 nfs_display_fhandle(NFS_FH(inode), __func__); 6320 6321 do { 6322 status = ops->get_locations(inode, locations, page, cred); 6323 if (status != -NFS4ERR_DELAY) 6324 break; 6325 nfs4_handle_exception(server, status, &exception); 6326 } while (exception.retry); 6327 return status; 6328 } 6329 6330 /* 6331 * This operation also signals the server that this client is 6332 * performing "lease moved" recovery. The server can stop 6333 * returning NFS4ERR_LEASE_MOVED to this client. A RENEW operation 6334 * is appended to this compound to identify the client ID which is 6335 * performing recovery. 6336 */ 6337 static int _nfs40_proc_fsid_present(struct inode *inode, struct rpc_cred *cred) 6338 { 6339 struct nfs_server *server = NFS_SERVER(inode); 6340 struct nfs_client *clp = NFS_SERVER(inode)->nfs_client; 6341 struct rpc_clnt *clnt = server->client; 6342 struct nfs4_fsid_present_arg args = { 6343 .fh = NFS_FH(inode), 6344 .clientid = clp->cl_clientid, 6345 .renew = 1, /* append RENEW */ 6346 }; 6347 struct nfs4_fsid_present_res res = { 6348 .renew = 1, 6349 }; 6350 struct rpc_message msg = { 6351 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FSID_PRESENT], 6352 .rpc_argp = &args, 6353 .rpc_resp = &res, 6354 .rpc_cred = cred, 6355 }; 6356 unsigned long now = jiffies; 6357 int status; 6358 6359 res.fh = nfs_alloc_fhandle(); 6360 if (res.fh == NULL) 6361 return -ENOMEM; 6362 6363 nfs4_init_sequence(&args.seq_args, &res.seq_res, 0); 6364 nfs4_set_sequence_privileged(&args.seq_args); 6365 status = nfs4_call_sync_sequence(clnt, server, &msg, 6366 &args.seq_args, &res.seq_res); 6367 nfs_free_fhandle(res.fh); 6368 if (status) 6369 return status; 6370 6371 do_renew_lease(clp, now); 6372 return 0; 6373 } 6374 6375 #ifdef CONFIG_NFS_V4_1 6376 6377 /* 6378 * This operation also signals the server that this client is 6379 * performing "lease moved" recovery. The server can stop asserting 6380 * SEQ4_STATUS_LEASE_MOVED for this client. The client ID performing 6381 * this operation is identified in the SEQUENCE operation in this 6382 * compound. 6383 */ 6384 static int _nfs41_proc_fsid_present(struct inode *inode, struct rpc_cred *cred) 6385 { 6386 struct nfs_server *server = NFS_SERVER(inode); 6387 struct rpc_clnt *clnt = server->client; 6388 struct nfs4_fsid_present_arg args = { 6389 .fh = NFS_FH(inode), 6390 }; 6391 struct nfs4_fsid_present_res res = { 6392 }; 6393 struct rpc_message msg = { 6394 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FSID_PRESENT], 6395 .rpc_argp = &args, 6396 .rpc_resp = &res, 6397 .rpc_cred = cred, 6398 }; 6399 int status; 6400 6401 res.fh = nfs_alloc_fhandle(); 6402 if (res.fh == NULL) 6403 return -ENOMEM; 6404 6405 nfs4_init_sequence(&args.seq_args, &res.seq_res, 0); 6406 nfs4_set_sequence_privileged(&args.seq_args); 6407 status = nfs4_call_sync_sequence(clnt, server, &msg, 6408 &args.seq_args, &res.seq_res); 6409 nfs_free_fhandle(res.fh); 6410 if (status == NFS4_OK && 6411 res.seq_res.sr_status_flags & SEQ4_STATUS_LEASE_MOVED) 6412 status = -NFS4ERR_LEASE_MOVED; 6413 return status; 6414 } 6415 6416 #endif /* CONFIG_NFS_V4_1 */ 6417 6418 /** 6419 * nfs4_proc_fsid_present - Is this FSID present or absent on server? 6420 * @inode: inode on FSID to check 6421 * @cred: credential to use for this operation 6422 * 6423 * Server indicates whether the FSID is present, moved, or not 6424 * recognized. This operation is necessary to clear a LEASE_MOVED 6425 * condition for this client ID. 6426 * 6427 * Returns NFS4_OK if the FSID is present on this server, 6428 * -NFS4ERR_MOVED if the FSID is no longer present, a negative 6429 * NFS4ERR code if some error occurred on the server, or a 6430 * negative errno if a local failure occurred. 6431 */ 6432 int nfs4_proc_fsid_present(struct inode *inode, struct rpc_cred *cred) 6433 { 6434 struct nfs_server *server = NFS_SERVER(inode); 6435 struct nfs_client *clp = server->nfs_client; 6436 const struct nfs4_mig_recovery_ops *ops = 6437 clp->cl_mvops->mig_recovery_ops; 6438 struct nfs4_exception exception = { }; 6439 int status; 6440 6441 dprintk("%s: FSID %llx:%llx on \"%s\"\n", __func__, 6442 (unsigned long long)server->fsid.major, 6443 (unsigned long long)server->fsid.minor, 6444 clp->cl_hostname); 6445 nfs_display_fhandle(NFS_FH(inode), __func__); 6446 6447 do { 6448 status = ops->fsid_present(inode, cred); 6449 if (status != -NFS4ERR_DELAY) 6450 break; 6451 nfs4_handle_exception(server, status, &exception); 6452 } while (exception.retry); 6453 return status; 6454 } 6455 6456 /** 6457 * If 'use_integrity' is true and the state managment nfs_client 6458 * cl_rpcclient is using krb5i/p, use the integrity protected cl_rpcclient 6459 * and the machine credential as per RFC3530bis and RFC5661 Security 6460 * Considerations sections. Otherwise, just use the user cred with the 6461 * filesystem's rpc_client. 6462 */ 6463 static int _nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, struct nfs4_secinfo_flavors *flavors, bool use_integrity) 6464 { 6465 int status; 6466 struct nfs4_secinfo_arg args = { 6467 .dir_fh = NFS_FH(dir), 6468 .name = name, 6469 }; 6470 struct nfs4_secinfo_res res = { 6471 .flavors = flavors, 6472 }; 6473 struct rpc_message msg = { 6474 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SECINFO], 6475 .rpc_argp = &args, 6476 .rpc_resp = &res, 6477 }; 6478 struct rpc_clnt *clnt = NFS_SERVER(dir)->client; 6479 struct rpc_cred *cred = NULL; 6480 6481 if (use_integrity) { 6482 clnt = NFS_SERVER(dir)->nfs_client->cl_rpcclient; 6483 cred = nfs4_get_clid_cred(NFS_SERVER(dir)->nfs_client); 6484 msg.rpc_cred = cred; 6485 } 6486 6487 dprintk("NFS call secinfo %s\n", name->name); 6488 6489 nfs4_state_protect(NFS_SERVER(dir)->nfs_client, 6490 NFS_SP4_MACH_CRED_SECINFO, &clnt, &msg); 6491 6492 status = nfs4_call_sync(clnt, NFS_SERVER(dir), &msg, &args.seq_args, 6493 &res.seq_res, 0); 6494 dprintk("NFS reply secinfo: %d\n", status); 6495 6496 if (cred) 6497 put_rpccred(cred); 6498 6499 return status; 6500 } 6501 6502 int nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, 6503 struct nfs4_secinfo_flavors *flavors) 6504 { 6505 struct nfs4_exception exception = { }; 6506 int err; 6507 do { 6508 err = -NFS4ERR_WRONGSEC; 6509 6510 /* try to use integrity protection with machine cred */ 6511 if (_nfs4_is_integrity_protected(NFS_SERVER(dir)->nfs_client)) 6512 err = _nfs4_proc_secinfo(dir, name, flavors, true); 6513 6514 /* 6515 * if unable to use integrity protection, or SECINFO with 6516 * integrity protection returns NFS4ERR_WRONGSEC (which is 6517 * disallowed by spec, but exists in deployed servers) use 6518 * the current filesystem's rpc_client and the user cred. 6519 */ 6520 if (err == -NFS4ERR_WRONGSEC) 6521 err = _nfs4_proc_secinfo(dir, name, flavors, false); 6522 6523 trace_nfs4_secinfo(dir, name, err); 6524 err = nfs4_handle_exception(NFS_SERVER(dir), err, 6525 &exception); 6526 } while (exception.retry); 6527 return err; 6528 } 6529 6530 #ifdef CONFIG_NFS_V4_1 6531 /* 6532 * Check the exchange flags returned by the server for invalid flags, having 6533 * both PNFS and NON_PNFS flags set, and not having one of NON_PNFS, PNFS, or 6534 * DS flags set. 6535 */ 6536 static int nfs4_check_cl_exchange_flags(u32 flags) 6537 { 6538 if (flags & ~EXCHGID4_FLAG_MASK_R) 6539 goto out_inval; 6540 if ((flags & EXCHGID4_FLAG_USE_PNFS_MDS) && 6541 (flags & EXCHGID4_FLAG_USE_NON_PNFS)) 6542 goto out_inval; 6543 if (!(flags & (EXCHGID4_FLAG_MASK_PNFS))) 6544 goto out_inval; 6545 return NFS_OK; 6546 out_inval: 6547 return -NFS4ERR_INVAL; 6548 } 6549 6550 static bool 6551 nfs41_same_server_scope(struct nfs41_server_scope *a, 6552 struct nfs41_server_scope *b) 6553 { 6554 if (a->server_scope_sz == b->server_scope_sz && 6555 memcmp(a->server_scope, b->server_scope, a->server_scope_sz) == 0) 6556 return true; 6557 6558 return false; 6559 } 6560 6561 /* 6562 * nfs4_proc_bind_conn_to_session() 6563 * 6564 * The 4.1 client currently uses the same TCP connection for the 6565 * fore and backchannel. 6566 */ 6567 int nfs4_proc_bind_conn_to_session(struct nfs_client *clp, struct rpc_cred *cred) 6568 { 6569 int status; 6570 struct nfs41_bind_conn_to_session_res res; 6571 struct rpc_message msg = { 6572 .rpc_proc = 6573 &nfs4_procedures[NFSPROC4_CLNT_BIND_CONN_TO_SESSION], 6574 .rpc_argp = clp, 6575 .rpc_resp = &res, 6576 .rpc_cred = cred, 6577 }; 6578 6579 dprintk("--> %s\n", __func__); 6580 6581 res.session = kzalloc(sizeof(struct nfs4_session), GFP_NOFS); 6582 if (unlikely(res.session == NULL)) { 6583 status = -ENOMEM; 6584 goto out; 6585 } 6586 6587 status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); 6588 trace_nfs4_bind_conn_to_session(clp, status); 6589 if (status == 0) { 6590 if (memcmp(res.session->sess_id.data, 6591 clp->cl_session->sess_id.data, NFS4_MAX_SESSIONID_LEN)) { 6592 dprintk("NFS: %s: Session ID mismatch\n", __func__); 6593 status = -EIO; 6594 goto out_session; 6595 } 6596 if (res.dir != NFS4_CDFS4_BOTH) { 6597 dprintk("NFS: %s: Unexpected direction from server\n", 6598 __func__); 6599 status = -EIO; 6600 goto out_session; 6601 } 6602 if (res.use_conn_in_rdma_mode) { 6603 dprintk("NFS: %s: Server returned RDMA mode = true\n", 6604 __func__); 6605 status = -EIO; 6606 goto out_session; 6607 } 6608 } 6609 out_session: 6610 kfree(res.session); 6611 out: 6612 dprintk("<-- %s status= %d\n", __func__, status); 6613 return status; 6614 } 6615 6616 /* 6617 * Minimum set of SP4_MACH_CRED operations from RFC 5661 in the enforce map 6618 * and operations we'd like to see to enable certain features in the allow map 6619 */ 6620 static const struct nfs41_state_protection nfs4_sp4_mach_cred_request = { 6621 .how = SP4_MACH_CRED, 6622 .enforce.u.words = { 6623 [1] = 1 << (OP_BIND_CONN_TO_SESSION - 32) | 6624 1 << (OP_EXCHANGE_ID - 32) | 6625 1 << (OP_CREATE_SESSION - 32) | 6626 1 << (OP_DESTROY_SESSION - 32) | 6627 1 << (OP_DESTROY_CLIENTID - 32) 6628 }, 6629 .allow.u.words = { 6630 [0] = 1 << (OP_CLOSE) | 6631 1 << (OP_LOCKU) | 6632 1 << (OP_COMMIT), 6633 [1] = 1 << (OP_SECINFO - 32) | 6634 1 << (OP_SECINFO_NO_NAME - 32) | 6635 1 << (OP_TEST_STATEID - 32) | 6636 1 << (OP_FREE_STATEID - 32) | 6637 1 << (OP_WRITE - 32) 6638 } 6639 }; 6640 6641 /* 6642 * Select the state protection mode for client `clp' given the server results 6643 * from exchange_id in `sp'. 6644 * 6645 * Returns 0 on success, negative errno otherwise. 6646 */ 6647 static int nfs4_sp4_select_mode(struct nfs_client *clp, 6648 struct nfs41_state_protection *sp) 6649 { 6650 static const u32 supported_enforce[NFS4_OP_MAP_NUM_WORDS] = { 6651 [1] = 1 << (OP_BIND_CONN_TO_SESSION - 32) | 6652 1 << (OP_EXCHANGE_ID - 32) | 6653 1 << (OP_CREATE_SESSION - 32) | 6654 1 << (OP_DESTROY_SESSION - 32) | 6655 1 << (OP_DESTROY_CLIENTID - 32) 6656 }; 6657 unsigned int i; 6658 6659 if (sp->how == SP4_MACH_CRED) { 6660 /* Print state protect result */ 6661 dfprintk(MOUNT, "Server SP4_MACH_CRED support:\n"); 6662 for (i = 0; i <= LAST_NFS4_OP; i++) { 6663 if (test_bit(i, sp->enforce.u.longs)) 6664 dfprintk(MOUNT, " enforce op %d\n", i); 6665 if (test_bit(i, sp->allow.u.longs)) 6666 dfprintk(MOUNT, " allow op %d\n", i); 6667 } 6668 6669 /* make sure nothing is on enforce list that isn't supported */ 6670 for (i = 0; i < NFS4_OP_MAP_NUM_WORDS; i++) { 6671 if (sp->enforce.u.words[i] & ~supported_enforce[i]) { 6672 dfprintk(MOUNT, "sp4_mach_cred: disabled\n"); 6673 return -EINVAL; 6674 } 6675 } 6676 6677 /* 6678 * Minimal mode - state operations are allowed to use machine 6679 * credential. Note this already happens by default, so the 6680 * client doesn't have to do anything more than the negotiation. 6681 * 6682 * NOTE: we don't care if EXCHANGE_ID is in the list - 6683 * we're already using the machine cred for exchange_id 6684 * and will never use a different cred. 6685 */ 6686 if (test_bit(OP_BIND_CONN_TO_SESSION, sp->enforce.u.longs) && 6687 test_bit(OP_CREATE_SESSION, sp->enforce.u.longs) && 6688 test_bit(OP_DESTROY_SESSION, sp->enforce.u.longs) && 6689 test_bit(OP_DESTROY_CLIENTID, sp->enforce.u.longs)) { 6690 dfprintk(MOUNT, "sp4_mach_cred:\n"); 6691 dfprintk(MOUNT, " minimal mode enabled\n"); 6692 set_bit(NFS_SP4_MACH_CRED_MINIMAL, &clp->cl_sp4_flags); 6693 } else { 6694 dfprintk(MOUNT, "sp4_mach_cred: disabled\n"); 6695 return -EINVAL; 6696 } 6697 6698 if (test_bit(OP_CLOSE, sp->allow.u.longs) && 6699 test_bit(OP_LOCKU, sp->allow.u.longs)) { 6700 dfprintk(MOUNT, " cleanup mode enabled\n"); 6701 set_bit(NFS_SP4_MACH_CRED_CLEANUP, &clp->cl_sp4_flags); 6702 } 6703 6704 if (test_bit(OP_SECINFO, sp->allow.u.longs) && 6705 test_bit(OP_SECINFO_NO_NAME, sp->allow.u.longs)) { 6706 dfprintk(MOUNT, " secinfo mode enabled\n"); 6707 set_bit(NFS_SP4_MACH_CRED_SECINFO, &clp->cl_sp4_flags); 6708 } 6709 6710 if (test_bit(OP_TEST_STATEID, sp->allow.u.longs) && 6711 test_bit(OP_FREE_STATEID, sp->allow.u.longs)) { 6712 dfprintk(MOUNT, " stateid mode enabled\n"); 6713 set_bit(NFS_SP4_MACH_CRED_STATEID, &clp->cl_sp4_flags); 6714 } 6715 6716 if (test_bit(OP_WRITE, sp->allow.u.longs)) { 6717 dfprintk(MOUNT, " write mode enabled\n"); 6718 set_bit(NFS_SP4_MACH_CRED_WRITE, &clp->cl_sp4_flags); 6719 } 6720 6721 if (test_bit(OP_COMMIT, sp->allow.u.longs)) { 6722 dfprintk(MOUNT, " commit mode enabled\n"); 6723 set_bit(NFS_SP4_MACH_CRED_COMMIT, &clp->cl_sp4_flags); 6724 } 6725 } 6726 6727 return 0; 6728 } 6729 6730 /* 6731 * _nfs4_proc_exchange_id() 6732 * 6733 * Wrapper for EXCHANGE_ID operation. 6734 */ 6735 static int _nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred, 6736 u32 sp4_how) 6737 { 6738 nfs4_verifier verifier; 6739 struct nfs41_exchange_id_args args = { 6740 .verifier = &verifier, 6741 .client = clp, 6742 #ifdef CONFIG_NFS_V4_1_MIGRATION 6743 .flags = EXCHGID4_FLAG_SUPP_MOVED_REFER | 6744 EXCHGID4_FLAG_BIND_PRINC_STATEID | 6745 EXCHGID4_FLAG_SUPP_MOVED_MIGR, 6746 #else 6747 .flags = EXCHGID4_FLAG_SUPP_MOVED_REFER | 6748 EXCHGID4_FLAG_BIND_PRINC_STATEID, 6749 #endif 6750 }; 6751 struct nfs41_exchange_id_res res = { 6752 0 6753 }; 6754 int status; 6755 struct rpc_message msg = { 6756 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_EXCHANGE_ID], 6757 .rpc_argp = &args, 6758 .rpc_resp = &res, 6759 .rpc_cred = cred, 6760 }; 6761 6762 nfs4_init_boot_verifier(clp, &verifier); 6763 args.id_len = nfs4_init_uniform_client_string(clp, args.id, 6764 sizeof(args.id)); 6765 dprintk("NFS call exchange_id auth=%s, '%.*s'\n", 6766 clp->cl_rpcclient->cl_auth->au_ops->au_name, 6767 args.id_len, args.id); 6768 6769 res.server_owner = kzalloc(sizeof(struct nfs41_server_owner), 6770 GFP_NOFS); 6771 if (unlikely(res.server_owner == NULL)) { 6772 status = -ENOMEM; 6773 goto out; 6774 } 6775 6776 res.server_scope = kzalloc(sizeof(struct nfs41_server_scope), 6777 GFP_NOFS); 6778 if (unlikely(res.server_scope == NULL)) { 6779 status = -ENOMEM; 6780 goto out_server_owner; 6781 } 6782 6783 res.impl_id = kzalloc(sizeof(struct nfs41_impl_id), GFP_NOFS); 6784 if (unlikely(res.impl_id == NULL)) { 6785 status = -ENOMEM; 6786 goto out_server_scope; 6787 } 6788 6789 switch (sp4_how) { 6790 case SP4_NONE: 6791 args.state_protect.how = SP4_NONE; 6792 break; 6793 6794 case SP4_MACH_CRED: 6795 args.state_protect = nfs4_sp4_mach_cred_request; 6796 break; 6797 6798 default: 6799 /* unsupported! */ 6800 WARN_ON_ONCE(1); 6801 status = -EINVAL; 6802 goto out_server_scope; 6803 } 6804 6805 status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); 6806 trace_nfs4_exchange_id(clp, status); 6807 if (status == 0) 6808 status = nfs4_check_cl_exchange_flags(res.flags); 6809 6810 if (status == 0) 6811 status = nfs4_sp4_select_mode(clp, &res.state_protect); 6812 6813 if (status == 0) { 6814 clp->cl_clientid = res.clientid; 6815 clp->cl_exchange_flags = (res.flags & ~EXCHGID4_FLAG_CONFIRMED_R); 6816 if (!(res.flags & EXCHGID4_FLAG_CONFIRMED_R)) 6817 clp->cl_seqid = res.seqid; 6818 6819 kfree(clp->cl_serverowner); 6820 clp->cl_serverowner = res.server_owner; 6821 res.server_owner = NULL; 6822 6823 /* use the most recent implementation id */ 6824 kfree(clp->cl_implid); 6825 clp->cl_implid = res.impl_id; 6826 6827 if (clp->cl_serverscope != NULL && 6828 !nfs41_same_server_scope(clp->cl_serverscope, 6829 res.server_scope)) { 6830 dprintk("%s: server_scope mismatch detected\n", 6831 __func__); 6832 set_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH, &clp->cl_state); 6833 kfree(clp->cl_serverscope); 6834 clp->cl_serverscope = NULL; 6835 } 6836 6837 if (clp->cl_serverscope == NULL) { 6838 clp->cl_serverscope = res.server_scope; 6839 goto out; 6840 } 6841 } else 6842 kfree(res.impl_id); 6843 6844 out_server_owner: 6845 kfree(res.server_owner); 6846 out_server_scope: 6847 kfree(res.server_scope); 6848 out: 6849 if (clp->cl_implid != NULL) 6850 dprintk("NFS reply exchange_id: Server Implementation ID: " 6851 "domain: %s, name: %s, date: %llu,%u\n", 6852 clp->cl_implid->domain, clp->cl_implid->name, 6853 clp->cl_implid->date.seconds, 6854 clp->cl_implid->date.nseconds); 6855 dprintk("NFS reply exchange_id: %d\n", status); 6856 return status; 6857 } 6858 6859 /* 6860 * nfs4_proc_exchange_id() 6861 * 6862 * Returns zero, a negative errno, or a negative NFS4ERR status code. 6863 * 6864 * Since the clientid has expired, all compounds using sessions 6865 * associated with the stale clientid will be returning 6866 * NFS4ERR_BADSESSION in the sequence operation, and will therefore 6867 * be in some phase of session reset. 6868 * 6869 * Will attempt to negotiate SP4_MACH_CRED if krb5i / krb5p auth is used. 6870 */ 6871 int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred) 6872 { 6873 rpc_authflavor_t authflavor = clp->cl_rpcclient->cl_auth->au_flavor; 6874 int status; 6875 6876 /* try SP4_MACH_CRED if krb5i/p */ 6877 if (authflavor == RPC_AUTH_GSS_KRB5I || 6878 authflavor == RPC_AUTH_GSS_KRB5P) { 6879 status = _nfs4_proc_exchange_id(clp, cred, SP4_MACH_CRED); 6880 if (!status) 6881 return 0; 6882 } 6883 6884 /* try SP4_NONE */ 6885 return _nfs4_proc_exchange_id(clp, cred, SP4_NONE); 6886 } 6887 6888 static int _nfs4_proc_destroy_clientid(struct nfs_client *clp, 6889 struct rpc_cred *cred) 6890 { 6891 struct rpc_message msg = { 6892 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DESTROY_CLIENTID], 6893 .rpc_argp = clp, 6894 .rpc_cred = cred, 6895 }; 6896 int status; 6897 6898 status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); 6899 trace_nfs4_destroy_clientid(clp, status); 6900 if (status) 6901 dprintk("NFS: Got error %d from the server %s on " 6902 "DESTROY_CLIENTID.", status, clp->cl_hostname); 6903 return status; 6904 } 6905 6906 static int nfs4_proc_destroy_clientid(struct nfs_client *clp, 6907 struct rpc_cred *cred) 6908 { 6909 unsigned int loop; 6910 int ret; 6911 6912 for (loop = NFS4_MAX_LOOP_ON_RECOVER; loop != 0; loop--) { 6913 ret = _nfs4_proc_destroy_clientid(clp, cred); 6914 switch (ret) { 6915 case -NFS4ERR_DELAY: 6916 case -NFS4ERR_CLIENTID_BUSY: 6917 ssleep(1); 6918 break; 6919 default: 6920 return ret; 6921 } 6922 } 6923 return 0; 6924 } 6925 6926 int nfs4_destroy_clientid(struct nfs_client *clp) 6927 { 6928 struct rpc_cred *cred; 6929 int ret = 0; 6930 6931 if (clp->cl_mvops->minor_version < 1) 6932 goto out; 6933 if (clp->cl_exchange_flags == 0) 6934 goto out; 6935 if (clp->cl_preserve_clid) 6936 goto out; 6937 cred = nfs4_get_clid_cred(clp); 6938 ret = nfs4_proc_destroy_clientid(clp, cred); 6939 if (cred) 6940 put_rpccred(cred); 6941 switch (ret) { 6942 case 0: 6943 case -NFS4ERR_STALE_CLIENTID: 6944 clp->cl_exchange_flags = 0; 6945 } 6946 out: 6947 return ret; 6948 } 6949 6950 struct nfs4_get_lease_time_data { 6951 struct nfs4_get_lease_time_args *args; 6952 struct nfs4_get_lease_time_res *res; 6953 struct nfs_client *clp; 6954 }; 6955 6956 static void nfs4_get_lease_time_prepare(struct rpc_task *task, 6957 void *calldata) 6958 { 6959 struct nfs4_get_lease_time_data *data = 6960 (struct nfs4_get_lease_time_data *)calldata; 6961 6962 dprintk("--> %s\n", __func__); 6963 /* just setup sequence, do not trigger session recovery 6964 since we're invoked within one */ 6965 nfs41_setup_sequence(data->clp->cl_session, 6966 &data->args->la_seq_args, 6967 &data->res->lr_seq_res, 6968 task); 6969 dprintk("<-- %s\n", __func__); 6970 } 6971 6972 /* 6973 * Called from nfs4_state_manager thread for session setup, so don't recover 6974 * from sequence operation or clientid errors. 6975 */ 6976 static void nfs4_get_lease_time_done(struct rpc_task *task, void *calldata) 6977 { 6978 struct nfs4_get_lease_time_data *data = 6979 (struct nfs4_get_lease_time_data *)calldata; 6980 6981 dprintk("--> %s\n", __func__); 6982 if (!nfs41_sequence_done(task, &data->res->lr_seq_res)) 6983 return; 6984 switch (task->tk_status) { 6985 case -NFS4ERR_DELAY: 6986 case -NFS4ERR_GRACE: 6987 dprintk("%s Retry: tk_status %d\n", __func__, task->tk_status); 6988 rpc_delay(task, NFS4_POLL_RETRY_MIN); 6989 task->tk_status = 0; 6990 /* fall through */ 6991 case -NFS4ERR_RETRY_UNCACHED_REP: 6992 rpc_restart_call_prepare(task); 6993 return; 6994 } 6995 dprintk("<-- %s\n", __func__); 6996 } 6997 6998 static const struct rpc_call_ops nfs4_get_lease_time_ops = { 6999 .rpc_call_prepare = nfs4_get_lease_time_prepare, 7000 .rpc_call_done = nfs4_get_lease_time_done, 7001 }; 7002 7003 int nfs4_proc_get_lease_time(struct nfs_client *clp, struct nfs_fsinfo *fsinfo) 7004 { 7005 struct rpc_task *task; 7006 struct nfs4_get_lease_time_args args; 7007 struct nfs4_get_lease_time_res res = { 7008 .lr_fsinfo = fsinfo, 7009 }; 7010 struct nfs4_get_lease_time_data data = { 7011 .args = &args, 7012 .res = &res, 7013 .clp = clp, 7014 }; 7015 struct rpc_message msg = { 7016 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GET_LEASE_TIME], 7017 .rpc_argp = &args, 7018 .rpc_resp = &res, 7019 }; 7020 struct rpc_task_setup task_setup = { 7021 .rpc_client = clp->cl_rpcclient, 7022 .rpc_message = &msg, 7023 .callback_ops = &nfs4_get_lease_time_ops, 7024 .callback_data = &data, 7025 .flags = RPC_TASK_TIMEOUT, 7026 }; 7027 int status; 7028 7029 nfs4_init_sequence(&args.la_seq_args, &res.lr_seq_res, 0); 7030 nfs4_set_sequence_privileged(&args.la_seq_args); 7031 dprintk("--> %s\n", __func__); 7032 task = rpc_run_task(&task_setup); 7033 7034 if (IS_ERR(task)) 7035 status = PTR_ERR(task); 7036 else { 7037 status = task->tk_status; 7038 rpc_put_task(task); 7039 } 7040 dprintk("<-- %s return %d\n", __func__, status); 7041 7042 return status; 7043 } 7044 7045 /* 7046 * Initialize the values to be used by the client in CREATE_SESSION 7047 * If nfs4_init_session set the fore channel request and response sizes, 7048 * use them. 7049 * 7050 * Set the back channel max_resp_sz_cached to zero to force the client to 7051 * always set csa_cachethis to FALSE because the current implementation 7052 * of the back channel DRC only supports caching the CB_SEQUENCE operation. 7053 */ 7054 static void nfs4_init_channel_attrs(struct nfs41_create_session_args *args) 7055 { 7056 unsigned int max_rqst_sz, max_resp_sz; 7057 7058 max_rqst_sz = NFS_MAX_FILE_IO_SIZE + nfs41_maxwrite_overhead; 7059 max_resp_sz = NFS_MAX_FILE_IO_SIZE + nfs41_maxread_overhead; 7060 7061 /* Fore channel attributes */ 7062 args->fc_attrs.max_rqst_sz = max_rqst_sz; 7063 args->fc_attrs.max_resp_sz = max_resp_sz; 7064 args->fc_attrs.max_ops = NFS4_MAX_OPS; 7065 args->fc_attrs.max_reqs = max_session_slots; 7066 7067 dprintk("%s: Fore Channel : max_rqst_sz=%u max_resp_sz=%u " 7068 "max_ops=%u max_reqs=%u\n", 7069 __func__, 7070 args->fc_attrs.max_rqst_sz, args->fc_attrs.max_resp_sz, 7071 args->fc_attrs.max_ops, args->fc_attrs.max_reqs); 7072 7073 /* Back channel attributes */ 7074 args->bc_attrs.max_rqst_sz = PAGE_SIZE; 7075 args->bc_attrs.max_resp_sz = PAGE_SIZE; 7076 args->bc_attrs.max_resp_sz_cached = 0; 7077 args->bc_attrs.max_ops = NFS4_MAX_BACK_CHANNEL_OPS; 7078 args->bc_attrs.max_reqs = 1; 7079 7080 dprintk("%s: Back Channel : max_rqst_sz=%u max_resp_sz=%u " 7081 "max_resp_sz_cached=%u max_ops=%u max_reqs=%u\n", 7082 __func__, 7083 args->bc_attrs.max_rqst_sz, args->bc_attrs.max_resp_sz, 7084 args->bc_attrs.max_resp_sz_cached, args->bc_attrs.max_ops, 7085 args->bc_attrs.max_reqs); 7086 } 7087 7088 static int nfs4_verify_fore_channel_attrs(struct nfs41_create_session_args *args, struct nfs4_session *session) 7089 { 7090 struct nfs4_channel_attrs *sent = &args->fc_attrs; 7091 struct nfs4_channel_attrs *rcvd = &session->fc_attrs; 7092 7093 if (rcvd->max_resp_sz > sent->max_resp_sz) 7094 return -EINVAL; 7095 /* 7096 * Our requested max_ops is the minimum we need; we're not 7097 * prepared to break up compounds into smaller pieces than that. 7098 * So, no point even trying to continue if the server won't 7099 * cooperate: 7100 */ 7101 if (rcvd->max_ops < sent->max_ops) 7102 return -EINVAL; 7103 if (rcvd->max_reqs == 0) 7104 return -EINVAL; 7105 if (rcvd->max_reqs > NFS4_MAX_SLOT_TABLE) 7106 rcvd->max_reqs = NFS4_MAX_SLOT_TABLE; 7107 return 0; 7108 } 7109 7110 static int nfs4_verify_back_channel_attrs(struct nfs41_create_session_args *args, struct nfs4_session *session) 7111 { 7112 struct nfs4_channel_attrs *sent = &args->bc_attrs; 7113 struct nfs4_channel_attrs *rcvd = &session->bc_attrs; 7114 7115 if (rcvd->max_rqst_sz > sent->max_rqst_sz) 7116 return -EINVAL; 7117 if (rcvd->max_resp_sz < sent->max_resp_sz) 7118 return -EINVAL; 7119 if (rcvd->max_resp_sz_cached > sent->max_resp_sz_cached) 7120 return -EINVAL; 7121 /* These would render the backchannel useless: */ 7122 if (rcvd->max_ops != sent->max_ops) 7123 return -EINVAL; 7124 if (rcvd->max_reqs != sent->max_reqs) 7125 return -EINVAL; 7126 return 0; 7127 } 7128 7129 static int nfs4_verify_channel_attrs(struct nfs41_create_session_args *args, 7130 struct nfs4_session *session) 7131 { 7132 int ret; 7133 7134 ret = nfs4_verify_fore_channel_attrs(args, session); 7135 if (ret) 7136 return ret; 7137 return nfs4_verify_back_channel_attrs(args, session); 7138 } 7139 7140 static int _nfs4_proc_create_session(struct nfs_client *clp, 7141 struct rpc_cred *cred) 7142 { 7143 struct nfs4_session *session = clp->cl_session; 7144 struct nfs41_create_session_args args = { 7145 .client = clp, 7146 .cb_program = NFS4_CALLBACK, 7147 }; 7148 struct nfs41_create_session_res res = { 7149 .client = clp, 7150 }; 7151 struct rpc_message msg = { 7152 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE_SESSION], 7153 .rpc_argp = &args, 7154 .rpc_resp = &res, 7155 .rpc_cred = cred, 7156 }; 7157 int status; 7158 7159 nfs4_init_channel_attrs(&args); 7160 args.flags = (SESSION4_PERSIST | SESSION4_BACK_CHAN); 7161 7162 status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); 7163 trace_nfs4_create_session(clp, status); 7164 7165 if (!status) { 7166 /* Verify the session's negotiated channel_attrs values */ 7167 status = nfs4_verify_channel_attrs(&args, session); 7168 /* Increment the clientid slot sequence id */ 7169 clp->cl_seqid++; 7170 } 7171 7172 return status; 7173 } 7174 7175 /* 7176 * Issues a CREATE_SESSION operation to the server. 7177 * It is the responsibility of the caller to verify the session is 7178 * expired before calling this routine. 7179 */ 7180 int nfs4_proc_create_session(struct nfs_client *clp, struct rpc_cred *cred) 7181 { 7182 int status; 7183 unsigned *ptr; 7184 struct nfs4_session *session = clp->cl_session; 7185 7186 dprintk("--> %s clp=%p session=%p\n", __func__, clp, session); 7187 7188 status = _nfs4_proc_create_session(clp, cred); 7189 if (status) 7190 goto out; 7191 7192 /* Init or reset the session slot tables */ 7193 status = nfs4_setup_session_slot_tables(session); 7194 dprintk("slot table setup returned %d\n", status); 7195 if (status) 7196 goto out; 7197 7198 ptr = (unsigned *)&session->sess_id.data[0]; 7199 dprintk("%s client>seqid %d sessionid %u:%u:%u:%u\n", __func__, 7200 clp->cl_seqid, ptr[0], ptr[1], ptr[2], ptr[3]); 7201 out: 7202 dprintk("<-- %s\n", __func__); 7203 return status; 7204 } 7205 7206 /* 7207 * Issue the over-the-wire RPC DESTROY_SESSION. 7208 * The caller must serialize access to this routine. 7209 */ 7210 int nfs4_proc_destroy_session(struct nfs4_session *session, 7211 struct rpc_cred *cred) 7212 { 7213 struct rpc_message msg = { 7214 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DESTROY_SESSION], 7215 .rpc_argp = session, 7216 .rpc_cred = cred, 7217 }; 7218 int status = 0; 7219 7220 dprintk("--> nfs4_proc_destroy_session\n"); 7221 7222 /* session is still being setup */ 7223 if (session->clp->cl_cons_state != NFS_CS_READY) 7224 return status; 7225 7226 status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); 7227 trace_nfs4_destroy_session(session->clp, status); 7228 7229 if (status) 7230 dprintk("NFS: Got error %d from the server on DESTROY_SESSION. " 7231 "Session has been destroyed regardless...\n", status); 7232 7233 dprintk("<-- nfs4_proc_destroy_session\n"); 7234 return status; 7235 } 7236 7237 /* 7238 * Renew the cl_session lease. 7239 */ 7240 struct nfs4_sequence_data { 7241 struct nfs_client *clp; 7242 struct nfs4_sequence_args args; 7243 struct nfs4_sequence_res res; 7244 }; 7245 7246 static void nfs41_sequence_release(void *data) 7247 { 7248 struct nfs4_sequence_data *calldata = data; 7249 struct nfs_client *clp = calldata->clp; 7250 7251 if (atomic_read(&clp->cl_count) > 1) 7252 nfs4_schedule_state_renewal(clp); 7253 nfs_put_client(clp); 7254 kfree(calldata); 7255 } 7256 7257 static int nfs41_sequence_handle_errors(struct rpc_task *task, struct nfs_client *clp) 7258 { 7259 switch(task->tk_status) { 7260 case -NFS4ERR_DELAY: 7261 rpc_delay(task, NFS4_POLL_RETRY_MAX); 7262 return -EAGAIN; 7263 default: 7264 nfs4_schedule_lease_recovery(clp); 7265 } 7266 return 0; 7267 } 7268 7269 static void nfs41_sequence_call_done(struct rpc_task *task, void *data) 7270 { 7271 struct nfs4_sequence_data *calldata = data; 7272 struct nfs_client *clp = calldata->clp; 7273 7274 if (!nfs41_sequence_done(task, task->tk_msg.rpc_resp)) 7275 return; 7276 7277 trace_nfs4_sequence(clp, task->tk_status); 7278 if (task->tk_status < 0) { 7279 dprintk("%s ERROR %d\n", __func__, task->tk_status); 7280 if (atomic_read(&clp->cl_count) == 1) 7281 goto out; 7282 7283 if (nfs41_sequence_handle_errors(task, clp) == -EAGAIN) { 7284 rpc_restart_call_prepare(task); 7285 return; 7286 } 7287 } 7288 dprintk("%s rpc_cred %p\n", __func__, task->tk_msg.rpc_cred); 7289 out: 7290 dprintk("<-- %s\n", __func__); 7291 } 7292 7293 static void nfs41_sequence_prepare(struct rpc_task *task, void *data) 7294 { 7295 struct nfs4_sequence_data *calldata = data; 7296 struct nfs_client *clp = calldata->clp; 7297 struct nfs4_sequence_args *args; 7298 struct nfs4_sequence_res *res; 7299 7300 args = task->tk_msg.rpc_argp; 7301 res = task->tk_msg.rpc_resp; 7302 7303 nfs41_setup_sequence(clp->cl_session, args, res, task); 7304 } 7305 7306 static const struct rpc_call_ops nfs41_sequence_ops = { 7307 .rpc_call_done = nfs41_sequence_call_done, 7308 .rpc_call_prepare = nfs41_sequence_prepare, 7309 .rpc_release = nfs41_sequence_release, 7310 }; 7311 7312 static struct rpc_task *_nfs41_proc_sequence(struct nfs_client *clp, 7313 struct rpc_cred *cred, 7314 bool is_privileged) 7315 { 7316 struct nfs4_sequence_data *calldata; 7317 struct rpc_message msg = { 7318 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SEQUENCE], 7319 .rpc_cred = cred, 7320 }; 7321 struct rpc_task_setup task_setup_data = { 7322 .rpc_client = clp->cl_rpcclient, 7323 .rpc_message = &msg, 7324 .callback_ops = &nfs41_sequence_ops, 7325 .flags = RPC_TASK_ASYNC | RPC_TASK_TIMEOUT, 7326 }; 7327 7328 if (!atomic_inc_not_zero(&clp->cl_count)) 7329 return ERR_PTR(-EIO); 7330 calldata = kzalloc(sizeof(*calldata), GFP_NOFS); 7331 if (calldata == NULL) { 7332 nfs_put_client(clp); 7333 return ERR_PTR(-ENOMEM); 7334 } 7335 nfs4_init_sequence(&calldata->args, &calldata->res, 0); 7336 if (is_privileged) 7337 nfs4_set_sequence_privileged(&calldata->args); 7338 msg.rpc_argp = &calldata->args; 7339 msg.rpc_resp = &calldata->res; 7340 calldata->clp = clp; 7341 task_setup_data.callback_data = calldata; 7342 7343 return rpc_run_task(&task_setup_data); 7344 } 7345 7346 static int nfs41_proc_async_sequence(struct nfs_client *clp, struct rpc_cred *cred, unsigned renew_flags) 7347 { 7348 struct rpc_task *task; 7349 int ret = 0; 7350 7351 if ((renew_flags & NFS4_RENEW_TIMEOUT) == 0) 7352 return 0; 7353 task = _nfs41_proc_sequence(clp, cred, false); 7354 if (IS_ERR(task)) 7355 ret = PTR_ERR(task); 7356 else 7357 rpc_put_task_async(task); 7358 dprintk("<-- %s status=%d\n", __func__, ret); 7359 return ret; 7360 } 7361 7362 static int nfs4_proc_sequence(struct nfs_client *clp, struct rpc_cred *cred) 7363 { 7364 struct rpc_task *task; 7365 int ret; 7366 7367 task = _nfs41_proc_sequence(clp, cred, true); 7368 if (IS_ERR(task)) { 7369 ret = PTR_ERR(task); 7370 goto out; 7371 } 7372 ret = rpc_wait_for_completion_task(task); 7373 if (!ret) { 7374 struct nfs4_sequence_res *res = task->tk_msg.rpc_resp; 7375 7376 if (task->tk_status == 0) 7377 nfs41_handle_sequence_flag_errors(clp, res->sr_status_flags); 7378 ret = task->tk_status; 7379 } 7380 rpc_put_task(task); 7381 out: 7382 dprintk("<-- %s status=%d\n", __func__, ret); 7383 return ret; 7384 } 7385 7386 struct nfs4_reclaim_complete_data { 7387 struct nfs_client *clp; 7388 struct nfs41_reclaim_complete_args arg; 7389 struct nfs41_reclaim_complete_res res; 7390 }; 7391 7392 static void nfs4_reclaim_complete_prepare(struct rpc_task *task, void *data) 7393 { 7394 struct nfs4_reclaim_complete_data *calldata = data; 7395 7396 nfs41_setup_sequence(calldata->clp->cl_session, 7397 &calldata->arg.seq_args, 7398 &calldata->res.seq_res, 7399 task); 7400 } 7401 7402 static int nfs41_reclaim_complete_handle_errors(struct rpc_task *task, struct nfs_client *clp) 7403 { 7404 switch(task->tk_status) { 7405 case 0: 7406 case -NFS4ERR_COMPLETE_ALREADY: 7407 case -NFS4ERR_WRONG_CRED: /* What to do here? */ 7408 break; 7409 case -NFS4ERR_DELAY: 7410 rpc_delay(task, NFS4_POLL_RETRY_MAX); 7411 /* fall through */ 7412 case -NFS4ERR_RETRY_UNCACHED_REP: 7413 return -EAGAIN; 7414 default: 7415 nfs4_schedule_lease_recovery(clp); 7416 } 7417 return 0; 7418 } 7419 7420 static void nfs4_reclaim_complete_done(struct rpc_task *task, void *data) 7421 { 7422 struct nfs4_reclaim_complete_data *calldata = data; 7423 struct nfs_client *clp = calldata->clp; 7424 struct nfs4_sequence_res *res = &calldata->res.seq_res; 7425 7426 dprintk("--> %s\n", __func__); 7427 if (!nfs41_sequence_done(task, res)) 7428 return; 7429 7430 trace_nfs4_reclaim_complete(clp, task->tk_status); 7431 if (nfs41_reclaim_complete_handle_errors(task, clp) == -EAGAIN) { 7432 rpc_restart_call_prepare(task); 7433 return; 7434 } 7435 dprintk("<-- %s\n", __func__); 7436 } 7437 7438 static void nfs4_free_reclaim_complete_data(void *data) 7439 { 7440 struct nfs4_reclaim_complete_data *calldata = data; 7441 7442 kfree(calldata); 7443 } 7444 7445 static const struct rpc_call_ops nfs4_reclaim_complete_call_ops = { 7446 .rpc_call_prepare = nfs4_reclaim_complete_prepare, 7447 .rpc_call_done = nfs4_reclaim_complete_done, 7448 .rpc_release = nfs4_free_reclaim_complete_data, 7449 }; 7450 7451 /* 7452 * Issue a global reclaim complete. 7453 */ 7454 static int nfs41_proc_reclaim_complete(struct nfs_client *clp, 7455 struct rpc_cred *cred) 7456 { 7457 struct nfs4_reclaim_complete_data *calldata; 7458 struct rpc_task *task; 7459 struct rpc_message msg = { 7460 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RECLAIM_COMPLETE], 7461 .rpc_cred = cred, 7462 }; 7463 struct rpc_task_setup task_setup_data = { 7464 .rpc_client = clp->cl_rpcclient, 7465 .rpc_message = &msg, 7466 .callback_ops = &nfs4_reclaim_complete_call_ops, 7467 .flags = RPC_TASK_ASYNC, 7468 }; 7469 int status = -ENOMEM; 7470 7471 dprintk("--> %s\n", __func__); 7472 calldata = kzalloc(sizeof(*calldata), GFP_NOFS); 7473 if (calldata == NULL) 7474 goto out; 7475 calldata->clp = clp; 7476 calldata->arg.one_fs = 0; 7477 7478 nfs4_init_sequence(&calldata->arg.seq_args, &calldata->res.seq_res, 0); 7479 nfs4_set_sequence_privileged(&calldata->arg.seq_args); 7480 msg.rpc_argp = &calldata->arg; 7481 msg.rpc_resp = &calldata->res; 7482 task_setup_data.callback_data = calldata; 7483 task = rpc_run_task(&task_setup_data); 7484 if (IS_ERR(task)) { 7485 status = PTR_ERR(task); 7486 goto out; 7487 } 7488 status = nfs4_wait_for_completion_rpc_task(task); 7489 if (status == 0) 7490 status = task->tk_status; 7491 rpc_put_task(task); 7492 return 0; 7493 out: 7494 dprintk("<-- %s status=%d\n", __func__, status); 7495 return status; 7496 } 7497 7498 static void 7499 nfs4_layoutget_prepare(struct rpc_task *task, void *calldata) 7500 { 7501 struct nfs4_layoutget *lgp = calldata; 7502 struct nfs_server *server = NFS_SERVER(lgp->args.inode); 7503 struct nfs4_session *session = nfs4_get_session(server); 7504 7505 dprintk("--> %s\n", __func__); 7506 /* Note the is a race here, where a CB_LAYOUTRECALL can come in 7507 * right now covering the LAYOUTGET we are about to send. 7508 * However, that is not so catastrophic, and there seems 7509 * to be no way to prevent it completely. 7510 */ 7511 if (nfs41_setup_sequence(session, &lgp->args.seq_args, 7512 &lgp->res.seq_res, task)) 7513 return; 7514 if (pnfs_choose_layoutget_stateid(&lgp->args.stateid, 7515 NFS_I(lgp->args.inode)->layout, 7516 lgp->args.ctx->state)) { 7517 rpc_exit(task, NFS4_OK); 7518 } 7519 } 7520 7521 static void nfs4_layoutget_done(struct rpc_task *task, void *calldata) 7522 { 7523 struct nfs4_layoutget *lgp = calldata; 7524 struct inode *inode = lgp->args.inode; 7525 struct nfs_server *server = NFS_SERVER(inode); 7526 struct pnfs_layout_hdr *lo; 7527 struct nfs4_state *state = NULL; 7528 unsigned long timeo, now, giveup; 7529 7530 dprintk("--> %s tk_status => %d\n", __func__, -task->tk_status); 7531 7532 if (!nfs41_sequence_done(task, &lgp->res.seq_res)) 7533 goto out; 7534 7535 switch (task->tk_status) { 7536 case 0: 7537 goto out; 7538 /* 7539 * NFS4ERR_LAYOUTTRYLATER is a conflict with another client 7540 * (or clients) writing to the same RAID stripe 7541 */ 7542 case -NFS4ERR_LAYOUTTRYLATER: 7543 /* 7544 * NFS4ERR_RECALLCONFLICT is when conflict with self (must recall 7545 * existing layout before getting a new one). 7546 */ 7547 case -NFS4ERR_RECALLCONFLICT: 7548 timeo = rpc_get_timeout(task->tk_client); 7549 giveup = lgp->args.timestamp + timeo; 7550 now = jiffies; 7551 if (time_after(giveup, now)) { 7552 unsigned long delay; 7553 7554 /* Delay for: 7555 * - Not less then NFS4_POLL_RETRY_MIN. 7556 * - One last time a jiffie before we give up 7557 * - exponential backoff (time_now minus start_attempt) 7558 */ 7559 delay = max_t(unsigned long, NFS4_POLL_RETRY_MIN, 7560 min((giveup - now - 1), 7561 now - lgp->args.timestamp)); 7562 7563 dprintk("%s: NFS4ERR_RECALLCONFLICT waiting %lu\n", 7564 __func__, delay); 7565 rpc_delay(task, delay); 7566 task->tk_status = 0; 7567 rpc_restart_call_prepare(task); 7568 goto out; /* Do not call nfs4_async_handle_error() */ 7569 } 7570 break; 7571 case -NFS4ERR_EXPIRED: 7572 case -NFS4ERR_BAD_STATEID: 7573 spin_lock(&inode->i_lock); 7574 lo = NFS_I(inode)->layout; 7575 if (!lo || list_empty(&lo->plh_segs)) { 7576 spin_unlock(&inode->i_lock); 7577 /* If the open stateid was bad, then recover it. */ 7578 state = lgp->args.ctx->state; 7579 } else { 7580 LIST_HEAD(head); 7581 7582 pnfs_mark_matching_lsegs_invalid(lo, &head, NULL); 7583 spin_unlock(&inode->i_lock); 7584 /* Mark the bad layout state as invalid, then 7585 * retry using the open stateid. */ 7586 pnfs_free_lseg_list(&head); 7587 } 7588 } 7589 if (nfs4_async_handle_error(task, server, state) == -EAGAIN) 7590 rpc_restart_call_prepare(task); 7591 out: 7592 dprintk("<-- %s\n", __func__); 7593 } 7594 7595 static size_t max_response_pages(struct nfs_server *server) 7596 { 7597 u32 max_resp_sz = server->nfs_client->cl_session->fc_attrs.max_resp_sz; 7598 return nfs_page_array_len(0, max_resp_sz); 7599 } 7600 7601 static void nfs4_free_pages(struct page **pages, size_t size) 7602 { 7603 int i; 7604 7605 if (!pages) 7606 return; 7607 7608 for (i = 0; i < size; i++) { 7609 if (!pages[i]) 7610 break; 7611 __free_page(pages[i]); 7612 } 7613 kfree(pages); 7614 } 7615 7616 static struct page **nfs4_alloc_pages(size_t size, gfp_t gfp_flags) 7617 { 7618 struct page **pages; 7619 int i; 7620 7621 pages = kcalloc(size, sizeof(struct page *), gfp_flags); 7622 if (!pages) { 7623 dprintk("%s: can't alloc array of %zu pages\n", __func__, size); 7624 return NULL; 7625 } 7626 7627 for (i = 0; i < size; i++) { 7628 pages[i] = alloc_page(gfp_flags); 7629 if (!pages[i]) { 7630 dprintk("%s: failed to allocate page\n", __func__); 7631 nfs4_free_pages(pages, size); 7632 return NULL; 7633 } 7634 } 7635 7636 return pages; 7637 } 7638 7639 static void nfs4_layoutget_release(void *calldata) 7640 { 7641 struct nfs4_layoutget *lgp = calldata; 7642 struct inode *inode = lgp->args.inode; 7643 struct nfs_server *server = NFS_SERVER(inode); 7644 size_t max_pages = max_response_pages(server); 7645 7646 dprintk("--> %s\n", __func__); 7647 nfs4_free_pages(lgp->args.layout.pages, max_pages); 7648 pnfs_put_layout_hdr(NFS_I(inode)->layout); 7649 put_nfs_open_context(lgp->args.ctx); 7650 kfree(calldata); 7651 dprintk("<-- %s\n", __func__); 7652 } 7653 7654 static const struct rpc_call_ops nfs4_layoutget_call_ops = { 7655 .rpc_call_prepare = nfs4_layoutget_prepare, 7656 .rpc_call_done = nfs4_layoutget_done, 7657 .rpc_release = nfs4_layoutget_release, 7658 }; 7659 7660 struct pnfs_layout_segment * 7661 nfs4_proc_layoutget(struct nfs4_layoutget *lgp, gfp_t gfp_flags) 7662 { 7663 struct inode *inode = lgp->args.inode; 7664 struct nfs_server *server = NFS_SERVER(inode); 7665 size_t max_pages = max_response_pages(server); 7666 struct rpc_task *task; 7667 struct rpc_message msg = { 7668 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTGET], 7669 .rpc_argp = &lgp->args, 7670 .rpc_resp = &lgp->res, 7671 .rpc_cred = lgp->cred, 7672 }; 7673 struct rpc_task_setup task_setup_data = { 7674 .rpc_client = server->client, 7675 .rpc_message = &msg, 7676 .callback_ops = &nfs4_layoutget_call_ops, 7677 .callback_data = lgp, 7678 .flags = RPC_TASK_ASYNC, 7679 }; 7680 struct pnfs_layout_segment *lseg = NULL; 7681 int status = 0; 7682 7683 dprintk("--> %s\n", __func__); 7684 7685 lgp->args.layout.pages = nfs4_alloc_pages(max_pages, gfp_flags); 7686 if (!lgp->args.layout.pages) { 7687 nfs4_layoutget_release(lgp); 7688 return ERR_PTR(-ENOMEM); 7689 } 7690 lgp->args.layout.pglen = max_pages * PAGE_SIZE; 7691 lgp->args.timestamp = jiffies; 7692 7693 lgp->res.layoutp = &lgp->args.layout; 7694 lgp->res.seq_res.sr_slot = NULL; 7695 nfs4_init_sequence(&lgp->args.seq_args, &lgp->res.seq_res, 0); 7696 7697 /* nfs4_layoutget_release calls pnfs_put_layout_hdr */ 7698 pnfs_get_layout_hdr(NFS_I(inode)->layout); 7699 7700 task = rpc_run_task(&task_setup_data); 7701 if (IS_ERR(task)) 7702 return ERR_CAST(task); 7703 status = nfs4_wait_for_completion_rpc_task(task); 7704 if (status == 0) 7705 status = task->tk_status; 7706 trace_nfs4_layoutget(lgp->args.ctx, 7707 &lgp->args.range, 7708 &lgp->res.range, 7709 status); 7710 /* if layoutp->len is 0, nfs4_layoutget_prepare called rpc_exit */ 7711 if (status == 0 && lgp->res.layoutp->len) 7712 lseg = pnfs_layout_process(lgp); 7713 rpc_put_task(task); 7714 dprintk("<-- %s status=%d\n", __func__, status); 7715 if (status) 7716 return ERR_PTR(status); 7717 return lseg; 7718 } 7719 7720 static void 7721 nfs4_layoutreturn_prepare(struct rpc_task *task, void *calldata) 7722 { 7723 struct nfs4_layoutreturn *lrp = calldata; 7724 7725 dprintk("--> %s\n", __func__); 7726 nfs41_setup_sequence(lrp->clp->cl_session, 7727 &lrp->args.seq_args, 7728 &lrp->res.seq_res, 7729 task); 7730 } 7731 7732 static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata) 7733 { 7734 struct nfs4_layoutreturn *lrp = calldata; 7735 struct nfs_server *server; 7736 7737 dprintk("--> %s\n", __func__); 7738 7739 if (!nfs41_sequence_done(task, &lrp->res.seq_res)) 7740 return; 7741 7742 server = NFS_SERVER(lrp->args.inode); 7743 switch (task->tk_status) { 7744 default: 7745 task->tk_status = 0; 7746 case 0: 7747 break; 7748 case -NFS4ERR_DELAY: 7749 if (nfs4_async_handle_error(task, server, NULL) != -EAGAIN) 7750 break; 7751 rpc_restart_call_prepare(task); 7752 return; 7753 } 7754 dprintk("<-- %s\n", __func__); 7755 } 7756 7757 static void nfs4_layoutreturn_release(void *calldata) 7758 { 7759 struct nfs4_layoutreturn *lrp = calldata; 7760 struct pnfs_layout_hdr *lo = lrp->args.layout; 7761 7762 dprintk("--> %s\n", __func__); 7763 spin_lock(&lo->plh_inode->i_lock); 7764 if (lrp->res.lrs_present) 7765 pnfs_set_layout_stateid(lo, &lrp->res.stateid, true); 7766 lo->plh_block_lgets--; 7767 spin_unlock(&lo->plh_inode->i_lock); 7768 pnfs_put_layout_hdr(lrp->args.layout); 7769 kfree(calldata); 7770 dprintk("<-- %s\n", __func__); 7771 } 7772 7773 static const struct rpc_call_ops nfs4_layoutreturn_call_ops = { 7774 .rpc_call_prepare = nfs4_layoutreturn_prepare, 7775 .rpc_call_done = nfs4_layoutreturn_done, 7776 .rpc_release = nfs4_layoutreturn_release, 7777 }; 7778 7779 int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp) 7780 { 7781 struct rpc_task *task; 7782 struct rpc_message msg = { 7783 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTRETURN], 7784 .rpc_argp = &lrp->args, 7785 .rpc_resp = &lrp->res, 7786 .rpc_cred = lrp->cred, 7787 }; 7788 struct rpc_task_setup task_setup_data = { 7789 .rpc_client = NFS_SERVER(lrp->args.inode)->client, 7790 .rpc_message = &msg, 7791 .callback_ops = &nfs4_layoutreturn_call_ops, 7792 .callback_data = lrp, 7793 }; 7794 int status; 7795 7796 dprintk("--> %s\n", __func__); 7797 nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1); 7798 task = rpc_run_task(&task_setup_data); 7799 if (IS_ERR(task)) 7800 return PTR_ERR(task); 7801 status = task->tk_status; 7802 trace_nfs4_layoutreturn(lrp->args.inode, status); 7803 dprintk("<-- %s status=%d\n", __func__, status); 7804 rpc_put_task(task); 7805 return status; 7806 } 7807 7808 /* 7809 * Retrieve the list of Data Server devices from the MDS. 7810 */ 7811 static int _nfs4_getdevicelist(struct nfs_server *server, 7812 const struct nfs_fh *fh, 7813 struct pnfs_devicelist *devlist) 7814 { 7815 struct nfs4_getdevicelist_args args = { 7816 .fh = fh, 7817 .layoutclass = server->pnfs_curr_ld->id, 7818 }; 7819 struct nfs4_getdevicelist_res res = { 7820 .devlist = devlist, 7821 }; 7822 struct rpc_message msg = { 7823 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETDEVICELIST], 7824 .rpc_argp = &args, 7825 .rpc_resp = &res, 7826 }; 7827 int status; 7828 7829 dprintk("--> %s\n", __func__); 7830 status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, 7831 &res.seq_res, 0); 7832 dprintk("<-- %s status=%d\n", __func__, status); 7833 return status; 7834 } 7835 7836 int nfs4_proc_getdevicelist(struct nfs_server *server, 7837 const struct nfs_fh *fh, 7838 struct pnfs_devicelist *devlist) 7839 { 7840 struct nfs4_exception exception = { }; 7841 int err; 7842 7843 do { 7844 err = nfs4_handle_exception(server, 7845 _nfs4_getdevicelist(server, fh, devlist), 7846 &exception); 7847 } while (exception.retry); 7848 7849 dprintk("%s: err=%d, num_devs=%u\n", __func__, 7850 err, devlist->num_devs); 7851 7852 return err; 7853 } 7854 EXPORT_SYMBOL_GPL(nfs4_proc_getdevicelist); 7855 7856 static int 7857 _nfs4_proc_getdeviceinfo(struct nfs_server *server, 7858 struct pnfs_device *pdev, 7859 struct rpc_cred *cred) 7860 { 7861 struct nfs4_getdeviceinfo_args args = { 7862 .pdev = pdev, 7863 }; 7864 struct nfs4_getdeviceinfo_res res = { 7865 .pdev = pdev, 7866 }; 7867 struct rpc_message msg = { 7868 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETDEVICEINFO], 7869 .rpc_argp = &args, 7870 .rpc_resp = &res, 7871 .rpc_cred = cred, 7872 }; 7873 int status; 7874 7875 dprintk("--> %s\n", __func__); 7876 status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0); 7877 dprintk("<-- %s status=%d\n", __func__, status); 7878 7879 return status; 7880 } 7881 7882 int nfs4_proc_getdeviceinfo(struct nfs_server *server, 7883 struct pnfs_device *pdev, 7884 struct rpc_cred *cred) 7885 { 7886 struct nfs4_exception exception = { }; 7887 int err; 7888 7889 do { 7890 err = nfs4_handle_exception(server, 7891 _nfs4_proc_getdeviceinfo(server, pdev, cred), 7892 &exception); 7893 } while (exception.retry); 7894 return err; 7895 } 7896 EXPORT_SYMBOL_GPL(nfs4_proc_getdeviceinfo); 7897 7898 static void nfs4_layoutcommit_prepare(struct rpc_task *task, void *calldata) 7899 { 7900 struct nfs4_layoutcommit_data *data = calldata; 7901 struct nfs_server *server = NFS_SERVER(data->args.inode); 7902 struct nfs4_session *session = nfs4_get_session(server); 7903 7904 nfs41_setup_sequence(session, 7905 &data->args.seq_args, 7906 &data->res.seq_res, 7907 task); 7908 } 7909 7910 static void 7911 nfs4_layoutcommit_done(struct rpc_task *task, void *calldata) 7912 { 7913 struct nfs4_layoutcommit_data *data = calldata; 7914 struct nfs_server *server = NFS_SERVER(data->args.inode); 7915 7916 if (!nfs41_sequence_done(task, &data->res.seq_res)) 7917 return; 7918 7919 switch (task->tk_status) { /* Just ignore these failures */ 7920 case -NFS4ERR_DELEG_REVOKED: /* layout was recalled */ 7921 case -NFS4ERR_BADIOMODE: /* no IOMODE_RW layout for range */ 7922 case -NFS4ERR_BADLAYOUT: /* no layout */ 7923 case -NFS4ERR_GRACE: /* loca_recalim always false */ 7924 task->tk_status = 0; 7925 case 0: 7926 break; 7927 default: 7928 if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) { 7929 rpc_restart_call_prepare(task); 7930 return; 7931 } 7932 } 7933 } 7934 7935 static void nfs4_layoutcommit_release(void *calldata) 7936 { 7937 struct nfs4_layoutcommit_data *data = calldata; 7938 7939 pnfs_cleanup_layoutcommit(data); 7940 nfs_post_op_update_inode_force_wcc(data->args.inode, 7941 data->res.fattr); 7942 put_rpccred(data->cred); 7943 kfree(data); 7944 } 7945 7946 static const struct rpc_call_ops nfs4_layoutcommit_ops = { 7947 .rpc_call_prepare = nfs4_layoutcommit_prepare, 7948 .rpc_call_done = nfs4_layoutcommit_done, 7949 .rpc_release = nfs4_layoutcommit_release, 7950 }; 7951 7952 int 7953 nfs4_proc_layoutcommit(struct nfs4_layoutcommit_data *data, bool sync) 7954 { 7955 struct rpc_message msg = { 7956 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTCOMMIT], 7957 .rpc_argp = &data->args, 7958 .rpc_resp = &data->res, 7959 .rpc_cred = data->cred, 7960 }; 7961 struct rpc_task_setup task_setup_data = { 7962 .task = &data->task, 7963 .rpc_client = NFS_CLIENT(data->args.inode), 7964 .rpc_message = &msg, 7965 .callback_ops = &nfs4_layoutcommit_ops, 7966 .callback_data = data, 7967 .flags = RPC_TASK_ASYNC, 7968 }; 7969 struct rpc_task *task; 7970 int status = 0; 7971 7972 dprintk("NFS: %4d initiating layoutcommit call. sync %d " 7973 "lbw: %llu inode %lu\n", 7974 data->task.tk_pid, sync, 7975 data->args.lastbytewritten, 7976 data->args.inode->i_ino); 7977 7978 nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1); 7979 task = rpc_run_task(&task_setup_data); 7980 if (IS_ERR(task)) 7981 return PTR_ERR(task); 7982 if (sync == false) 7983 goto out; 7984 status = nfs4_wait_for_completion_rpc_task(task); 7985 if (status != 0) 7986 goto out; 7987 status = task->tk_status; 7988 trace_nfs4_layoutcommit(data->args.inode, status); 7989 out: 7990 dprintk("%s: status %d\n", __func__, status); 7991 rpc_put_task(task); 7992 return status; 7993 } 7994 7995 /** 7996 * Use the state managment nfs_client cl_rpcclient, which uses krb5i (if 7997 * possible) as per RFC3530bis and RFC5661 Security Considerations sections 7998 */ 7999 static int 8000 _nfs41_proc_secinfo_no_name(struct nfs_server *server, struct nfs_fh *fhandle, 8001 struct nfs_fsinfo *info, 8002 struct nfs4_secinfo_flavors *flavors, bool use_integrity) 8003 { 8004 struct nfs41_secinfo_no_name_args args = { 8005 .style = SECINFO_STYLE_CURRENT_FH, 8006 }; 8007 struct nfs4_secinfo_res res = { 8008 .flavors = flavors, 8009 }; 8010 struct rpc_message msg = { 8011 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SECINFO_NO_NAME], 8012 .rpc_argp = &args, 8013 .rpc_resp = &res, 8014 }; 8015 struct rpc_clnt *clnt = server->client; 8016 struct rpc_cred *cred = NULL; 8017 int status; 8018 8019 if (use_integrity) { 8020 clnt = server->nfs_client->cl_rpcclient; 8021 cred = nfs4_get_clid_cred(server->nfs_client); 8022 msg.rpc_cred = cred; 8023 } 8024 8025 dprintk("--> %s\n", __func__); 8026 status = nfs4_call_sync(clnt, server, &msg, &args.seq_args, 8027 &res.seq_res, 0); 8028 dprintk("<-- %s status=%d\n", __func__, status); 8029 8030 if (cred) 8031 put_rpccred(cred); 8032 8033 return status; 8034 } 8035 8036 static int 8037 nfs41_proc_secinfo_no_name(struct nfs_server *server, struct nfs_fh *fhandle, 8038 struct nfs_fsinfo *info, struct nfs4_secinfo_flavors *flavors) 8039 { 8040 struct nfs4_exception exception = { }; 8041 int err; 8042 do { 8043 /* first try using integrity protection */ 8044 err = -NFS4ERR_WRONGSEC; 8045 8046 /* try to use integrity protection with machine cred */ 8047 if (_nfs4_is_integrity_protected(server->nfs_client)) 8048 err = _nfs41_proc_secinfo_no_name(server, fhandle, info, 8049 flavors, true); 8050 8051 /* 8052 * if unable to use integrity protection, or SECINFO with 8053 * integrity protection returns NFS4ERR_WRONGSEC (which is 8054 * disallowed by spec, but exists in deployed servers) use 8055 * the current filesystem's rpc_client and the user cred. 8056 */ 8057 if (err == -NFS4ERR_WRONGSEC) 8058 err = _nfs41_proc_secinfo_no_name(server, fhandle, info, 8059 flavors, false); 8060 8061 switch (err) { 8062 case 0: 8063 case -NFS4ERR_WRONGSEC: 8064 case -ENOTSUPP: 8065 goto out; 8066 default: 8067 err = nfs4_handle_exception(server, err, &exception); 8068 } 8069 } while (exception.retry); 8070 out: 8071 return err; 8072 } 8073 8074 static int 8075 nfs41_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle, 8076 struct nfs_fsinfo *info) 8077 { 8078 int err; 8079 struct page *page; 8080 rpc_authflavor_t flavor = RPC_AUTH_MAXFLAVOR; 8081 struct nfs4_secinfo_flavors *flavors; 8082 struct nfs4_secinfo4 *secinfo; 8083 int i; 8084 8085 page = alloc_page(GFP_KERNEL); 8086 if (!page) { 8087 err = -ENOMEM; 8088 goto out; 8089 } 8090 8091 flavors = page_address(page); 8092 err = nfs41_proc_secinfo_no_name(server, fhandle, info, flavors); 8093 8094 /* 8095 * Fall back on "guess and check" method if 8096 * the server doesn't support SECINFO_NO_NAME 8097 */ 8098 if (err == -NFS4ERR_WRONGSEC || err == -ENOTSUPP) { 8099 err = nfs4_find_root_sec(server, fhandle, info); 8100 goto out_freepage; 8101 } 8102 if (err) 8103 goto out_freepage; 8104 8105 for (i = 0; i < flavors->num_flavors; i++) { 8106 secinfo = &flavors->flavors[i]; 8107 8108 switch (secinfo->flavor) { 8109 case RPC_AUTH_NULL: 8110 case RPC_AUTH_UNIX: 8111 case RPC_AUTH_GSS: 8112 flavor = rpcauth_get_pseudoflavor(secinfo->flavor, 8113 &secinfo->flavor_info); 8114 break; 8115 default: 8116 flavor = RPC_AUTH_MAXFLAVOR; 8117 break; 8118 } 8119 8120 if (!nfs_auth_info_match(&server->auth_info, flavor)) 8121 flavor = RPC_AUTH_MAXFLAVOR; 8122 8123 if (flavor != RPC_AUTH_MAXFLAVOR) { 8124 err = nfs4_lookup_root_sec(server, fhandle, 8125 info, flavor); 8126 if (!err) 8127 break; 8128 } 8129 } 8130 8131 if (flavor == RPC_AUTH_MAXFLAVOR) 8132 err = -EPERM; 8133 8134 out_freepage: 8135 put_page(page); 8136 if (err == -EACCES) 8137 return -EPERM; 8138 out: 8139 return err; 8140 } 8141 8142 static int _nfs41_test_stateid(struct nfs_server *server, 8143 nfs4_stateid *stateid, 8144 struct rpc_cred *cred) 8145 { 8146 int status; 8147 struct nfs41_test_stateid_args args = { 8148 .stateid = stateid, 8149 }; 8150 struct nfs41_test_stateid_res res; 8151 struct rpc_message msg = { 8152 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_TEST_STATEID], 8153 .rpc_argp = &args, 8154 .rpc_resp = &res, 8155 .rpc_cred = cred, 8156 }; 8157 struct rpc_clnt *rpc_client = server->client; 8158 8159 nfs4_state_protect(server->nfs_client, NFS_SP4_MACH_CRED_STATEID, 8160 &rpc_client, &msg); 8161 8162 dprintk("NFS call test_stateid %p\n", stateid); 8163 nfs4_init_sequence(&args.seq_args, &res.seq_res, 0); 8164 nfs4_set_sequence_privileged(&args.seq_args); 8165 status = nfs4_call_sync_sequence(rpc_client, server, &msg, 8166 &args.seq_args, &res.seq_res); 8167 if (status != NFS_OK) { 8168 dprintk("NFS reply test_stateid: failed, %d\n", status); 8169 return status; 8170 } 8171 dprintk("NFS reply test_stateid: succeeded, %d\n", -res.status); 8172 return -res.status; 8173 } 8174 8175 /** 8176 * nfs41_test_stateid - perform a TEST_STATEID operation 8177 * 8178 * @server: server / transport on which to perform the operation 8179 * @stateid: state ID to test 8180 * @cred: credential 8181 * 8182 * Returns NFS_OK if the server recognizes that "stateid" is valid. 8183 * Otherwise a negative NFS4ERR value is returned if the operation 8184 * failed or the state ID is not currently valid. 8185 */ 8186 static int nfs41_test_stateid(struct nfs_server *server, 8187 nfs4_stateid *stateid, 8188 struct rpc_cred *cred) 8189 { 8190 struct nfs4_exception exception = { }; 8191 int err; 8192 do { 8193 err = _nfs41_test_stateid(server, stateid, cred); 8194 if (err != -NFS4ERR_DELAY) 8195 break; 8196 nfs4_handle_exception(server, err, &exception); 8197 } while (exception.retry); 8198 return err; 8199 } 8200 8201 struct nfs_free_stateid_data { 8202 struct nfs_server *server; 8203 struct nfs41_free_stateid_args args; 8204 struct nfs41_free_stateid_res res; 8205 }; 8206 8207 static void nfs41_free_stateid_prepare(struct rpc_task *task, void *calldata) 8208 { 8209 struct nfs_free_stateid_data *data = calldata; 8210 nfs41_setup_sequence(nfs4_get_session(data->server), 8211 &data->args.seq_args, 8212 &data->res.seq_res, 8213 task); 8214 } 8215 8216 static void nfs41_free_stateid_done(struct rpc_task *task, void *calldata) 8217 { 8218 struct nfs_free_stateid_data *data = calldata; 8219 8220 nfs41_sequence_done(task, &data->res.seq_res); 8221 8222 switch (task->tk_status) { 8223 case -NFS4ERR_DELAY: 8224 if (nfs4_async_handle_error(task, data->server, NULL) == -EAGAIN) 8225 rpc_restart_call_prepare(task); 8226 } 8227 } 8228 8229 static void nfs41_free_stateid_release(void *calldata) 8230 { 8231 kfree(calldata); 8232 } 8233 8234 static const struct rpc_call_ops nfs41_free_stateid_ops = { 8235 .rpc_call_prepare = nfs41_free_stateid_prepare, 8236 .rpc_call_done = nfs41_free_stateid_done, 8237 .rpc_release = nfs41_free_stateid_release, 8238 }; 8239 8240 static struct rpc_task *_nfs41_free_stateid(struct nfs_server *server, 8241 nfs4_stateid *stateid, 8242 struct rpc_cred *cred, 8243 bool privileged) 8244 { 8245 struct rpc_message msg = { 8246 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FREE_STATEID], 8247 .rpc_cred = cred, 8248 }; 8249 struct rpc_task_setup task_setup = { 8250 .rpc_client = server->client, 8251 .rpc_message = &msg, 8252 .callback_ops = &nfs41_free_stateid_ops, 8253 .flags = RPC_TASK_ASYNC, 8254 }; 8255 struct nfs_free_stateid_data *data; 8256 8257 nfs4_state_protect(server->nfs_client, NFS_SP4_MACH_CRED_STATEID, 8258 &task_setup.rpc_client, &msg); 8259 8260 dprintk("NFS call free_stateid %p\n", stateid); 8261 data = kmalloc(sizeof(*data), GFP_NOFS); 8262 if (!data) 8263 return ERR_PTR(-ENOMEM); 8264 data->server = server; 8265 nfs4_stateid_copy(&data->args.stateid, stateid); 8266 8267 task_setup.callback_data = data; 8268 8269 msg.rpc_argp = &data->args; 8270 msg.rpc_resp = &data->res; 8271 nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 0); 8272 if (privileged) 8273 nfs4_set_sequence_privileged(&data->args.seq_args); 8274 8275 return rpc_run_task(&task_setup); 8276 } 8277 8278 /** 8279 * nfs41_free_stateid - perform a FREE_STATEID operation 8280 * 8281 * @server: server / transport on which to perform the operation 8282 * @stateid: state ID to release 8283 * @cred: credential 8284 * 8285 * Returns NFS_OK if the server freed "stateid". Otherwise a 8286 * negative NFS4ERR value is returned. 8287 */ 8288 static int nfs41_free_stateid(struct nfs_server *server, 8289 nfs4_stateid *stateid, 8290 struct rpc_cred *cred) 8291 { 8292 struct rpc_task *task; 8293 int ret; 8294 8295 task = _nfs41_free_stateid(server, stateid, cred, true); 8296 if (IS_ERR(task)) 8297 return PTR_ERR(task); 8298 ret = rpc_wait_for_completion_task(task); 8299 if (!ret) 8300 ret = task->tk_status; 8301 rpc_put_task(task); 8302 return ret; 8303 } 8304 8305 static void 8306 nfs41_free_lock_state(struct nfs_server *server, struct nfs4_lock_state *lsp) 8307 { 8308 struct rpc_task *task; 8309 struct rpc_cred *cred = lsp->ls_state->owner->so_cred; 8310 8311 task = _nfs41_free_stateid(server, &lsp->ls_stateid, cred, false); 8312 nfs4_free_lock_state(server, lsp); 8313 if (IS_ERR(task)) 8314 return; 8315 rpc_put_task(task); 8316 } 8317 8318 static bool nfs41_match_stateid(const nfs4_stateid *s1, 8319 const nfs4_stateid *s2) 8320 { 8321 if (memcmp(s1->other, s2->other, sizeof(s1->other)) != 0) 8322 return false; 8323 8324 if (s1->seqid == s2->seqid) 8325 return true; 8326 if (s1->seqid == 0 || s2->seqid == 0) 8327 return true; 8328 8329 return false; 8330 } 8331 8332 #endif /* CONFIG_NFS_V4_1 */ 8333 8334 static bool nfs4_match_stateid(const nfs4_stateid *s1, 8335 const nfs4_stateid *s2) 8336 { 8337 return nfs4_stateid_match(s1, s2); 8338 } 8339 8340 8341 static const struct nfs4_state_recovery_ops nfs40_reboot_recovery_ops = { 8342 .owner_flag_bit = NFS_OWNER_RECLAIM_REBOOT, 8343 .state_flag_bit = NFS_STATE_RECLAIM_REBOOT, 8344 .recover_open = nfs4_open_reclaim, 8345 .recover_lock = nfs4_lock_reclaim, 8346 .establish_clid = nfs4_init_clientid, 8347 .detect_trunking = nfs40_discover_server_trunking, 8348 }; 8349 8350 #if defined(CONFIG_NFS_V4_1) 8351 static const struct nfs4_state_recovery_ops nfs41_reboot_recovery_ops = { 8352 .owner_flag_bit = NFS_OWNER_RECLAIM_REBOOT, 8353 .state_flag_bit = NFS_STATE_RECLAIM_REBOOT, 8354 .recover_open = nfs4_open_reclaim, 8355 .recover_lock = nfs4_lock_reclaim, 8356 .establish_clid = nfs41_init_clientid, 8357 .reclaim_complete = nfs41_proc_reclaim_complete, 8358 .detect_trunking = nfs41_discover_server_trunking, 8359 }; 8360 #endif /* CONFIG_NFS_V4_1 */ 8361 8362 static const struct nfs4_state_recovery_ops nfs40_nograce_recovery_ops = { 8363 .owner_flag_bit = NFS_OWNER_RECLAIM_NOGRACE, 8364 .state_flag_bit = NFS_STATE_RECLAIM_NOGRACE, 8365 .recover_open = nfs4_open_expired, 8366 .recover_lock = nfs4_lock_expired, 8367 .establish_clid = nfs4_init_clientid, 8368 }; 8369 8370 #if defined(CONFIG_NFS_V4_1) 8371 static const struct nfs4_state_recovery_ops nfs41_nograce_recovery_ops = { 8372 .owner_flag_bit = NFS_OWNER_RECLAIM_NOGRACE, 8373 .state_flag_bit = NFS_STATE_RECLAIM_NOGRACE, 8374 .recover_open = nfs41_open_expired, 8375 .recover_lock = nfs41_lock_expired, 8376 .establish_clid = nfs41_init_clientid, 8377 }; 8378 #endif /* CONFIG_NFS_V4_1 */ 8379 8380 static const struct nfs4_state_maintenance_ops nfs40_state_renewal_ops = { 8381 .sched_state_renewal = nfs4_proc_async_renew, 8382 .get_state_renewal_cred_locked = nfs4_get_renew_cred_locked, 8383 .renew_lease = nfs4_proc_renew, 8384 }; 8385 8386 #if defined(CONFIG_NFS_V4_1) 8387 static const struct nfs4_state_maintenance_ops nfs41_state_renewal_ops = { 8388 .sched_state_renewal = nfs41_proc_async_sequence, 8389 .get_state_renewal_cred_locked = nfs4_get_machine_cred_locked, 8390 .renew_lease = nfs4_proc_sequence, 8391 }; 8392 #endif 8393 8394 static const struct nfs4_mig_recovery_ops nfs40_mig_recovery_ops = { 8395 .get_locations = _nfs40_proc_get_locations, 8396 .fsid_present = _nfs40_proc_fsid_present, 8397 }; 8398 8399 #if defined(CONFIG_NFS_V4_1) 8400 static const struct nfs4_mig_recovery_ops nfs41_mig_recovery_ops = { 8401 .get_locations = _nfs41_proc_get_locations, 8402 .fsid_present = _nfs41_proc_fsid_present, 8403 }; 8404 #endif /* CONFIG_NFS_V4_1 */ 8405 8406 static const struct nfs4_minor_version_ops nfs_v4_0_minor_ops = { 8407 .minor_version = 0, 8408 .init_caps = NFS_CAP_READDIRPLUS 8409 | NFS_CAP_ATOMIC_OPEN 8410 | NFS_CAP_CHANGE_ATTR 8411 | NFS_CAP_POSIX_LOCK, 8412 .init_client = nfs40_init_client, 8413 .shutdown_client = nfs40_shutdown_client, 8414 .match_stateid = nfs4_match_stateid, 8415 .find_root_sec = nfs4_find_root_sec, 8416 .free_lock_state = nfs4_release_lockowner, 8417 .call_sync_ops = &nfs40_call_sync_ops, 8418 .reboot_recovery_ops = &nfs40_reboot_recovery_ops, 8419 .nograce_recovery_ops = &nfs40_nograce_recovery_ops, 8420 .state_renewal_ops = &nfs40_state_renewal_ops, 8421 .mig_recovery_ops = &nfs40_mig_recovery_ops, 8422 }; 8423 8424 #if defined(CONFIG_NFS_V4_1) 8425 static const struct nfs4_minor_version_ops nfs_v4_1_minor_ops = { 8426 .minor_version = 1, 8427 .init_caps = NFS_CAP_READDIRPLUS 8428 | NFS_CAP_ATOMIC_OPEN 8429 | NFS_CAP_CHANGE_ATTR 8430 | NFS_CAP_POSIX_LOCK 8431 | NFS_CAP_STATEID_NFSV41 8432 | NFS_CAP_ATOMIC_OPEN_V1, 8433 .init_client = nfs41_init_client, 8434 .shutdown_client = nfs41_shutdown_client, 8435 .match_stateid = nfs41_match_stateid, 8436 .find_root_sec = nfs41_find_root_sec, 8437 .free_lock_state = nfs41_free_lock_state, 8438 .call_sync_ops = &nfs41_call_sync_ops, 8439 .reboot_recovery_ops = &nfs41_reboot_recovery_ops, 8440 .nograce_recovery_ops = &nfs41_nograce_recovery_ops, 8441 .state_renewal_ops = &nfs41_state_renewal_ops, 8442 .mig_recovery_ops = &nfs41_mig_recovery_ops, 8443 }; 8444 #endif 8445 8446 #if defined(CONFIG_NFS_V4_2) 8447 static const struct nfs4_minor_version_ops nfs_v4_2_minor_ops = { 8448 .minor_version = 2, 8449 .init_caps = NFS_CAP_READDIRPLUS 8450 | NFS_CAP_ATOMIC_OPEN 8451 | NFS_CAP_CHANGE_ATTR 8452 | NFS_CAP_POSIX_LOCK 8453 | NFS_CAP_STATEID_NFSV41 8454 | NFS_CAP_ATOMIC_OPEN_V1, 8455 .init_client = nfs41_init_client, 8456 .shutdown_client = nfs41_shutdown_client, 8457 .match_stateid = nfs41_match_stateid, 8458 .find_root_sec = nfs41_find_root_sec, 8459 .free_lock_state = nfs41_free_lock_state, 8460 .call_sync_ops = &nfs41_call_sync_ops, 8461 .reboot_recovery_ops = &nfs41_reboot_recovery_ops, 8462 .nograce_recovery_ops = &nfs41_nograce_recovery_ops, 8463 .state_renewal_ops = &nfs41_state_renewal_ops, 8464 }; 8465 #endif 8466 8467 const struct nfs4_minor_version_ops *nfs_v4_minor_ops[] = { 8468 [0] = &nfs_v4_0_minor_ops, 8469 #if defined(CONFIG_NFS_V4_1) 8470 [1] = &nfs_v4_1_minor_ops, 8471 #endif 8472 #if defined(CONFIG_NFS_V4_2) 8473 [2] = &nfs_v4_2_minor_ops, 8474 #endif 8475 }; 8476 8477 static const struct inode_operations nfs4_dir_inode_operations = { 8478 .create = nfs_create, 8479 .lookup = nfs_lookup, 8480 .atomic_open = nfs_atomic_open, 8481 .link = nfs_link, 8482 .unlink = nfs_unlink, 8483 .symlink = nfs_symlink, 8484 .mkdir = nfs_mkdir, 8485 .rmdir = nfs_rmdir, 8486 .mknod = nfs_mknod, 8487 .rename = nfs_rename, 8488 .permission = nfs_permission, 8489 .getattr = nfs_getattr, 8490 .setattr = nfs_setattr, 8491 .getxattr = generic_getxattr, 8492 .setxattr = generic_setxattr, 8493 .listxattr = generic_listxattr, 8494 .removexattr = generic_removexattr, 8495 }; 8496 8497 static const struct inode_operations nfs4_file_inode_operations = { 8498 .permission = nfs_permission, 8499 .getattr = nfs_getattr, 8500 .setattr = nfs_setattr, 8501 .getxattr = generic_getxattr, 8502 .setxattr = generic_setxattr, 8503 .listxattr = generic_listxattr, 8504 .removexattr = generic_removexattr, 8505 }; 8506 8507 const struct nfs_rpc_ops nfs_v4_clientops = { 8508 .version = 4, /* protocol version */ 8509 .dentry_ops = &nfs4_dentry_operations, 8510 .dir_inode_ops = &nfs4_dir_inode_operations, 8511 .file_inode_ops = &nfs4_file_inode_operations, 8512 .file_ops = &nfs4_file_operations, 8513 .getroot = nfs4_proc_get_root, 8514 .submount = nfs4_submount, 8515 .try_mount = nfs4_try_mount, 8516 .getattr = nfs4_proc_getattr, 8517 .setattr = nfs4_proc_setattr, 8518 .lookup = nfs4_proc_lookup, 8519 .access = nfs4_proc_access, 8520 .readlink = nfs4_proc_readlink, 8521 .create = nfs4_proc_create, 8522 .remove = nfs4_proc_remove, 8523 .unlink_setup = nfs4_proc_unlink_setup, 8524 .unlink_rpc_prepare = nfs4_proc_unlink_rpc_prepare, 8525 .unlink_done = nfs4_proc_unlink_done, 8526 .rename_setup = nfs4_proc_rename_setup, 8527 .rename_rpc_prepare = nfs4_proc_rename_rpc_prepare, 8528 .rename_done = nfs4_proc_rename_done, 8529 .link = nfs4_proc_link, 8530 .symlink = nfs4_proc_symlink, 8531 .mkdir = nfs4_proc_mkdir, 8532 .rmdir = nfs4_proc_remove, 8533 .readdir = nfs4_proc_readdir, 8534 .mknod = nfs4_proc_mknod, 8535 .statfs = nfs4_proc_statfs, 8536 .fsinfo = nfs4_proc_fsinfo, 8537 .pathconf = nfs4_proc_pathconf, 8538 .set_capabilities = nfs4_server_capabilities, 8539 .decode_dirent = nfs4_decode_dirent, 8540 .pgio_rpc_prepare = nfs4_proc_pgio_rpc_prepare, 8541 .read_setup = nfs4_proc_read_setup, 8542 .read_done = nfs4_read_done, 8543 .write_setup = nfs4_proc_write_setup, 8544 .write_done = nfs4_write_done, 8545 .commit_setup = nfs4_proc_commit_setup, 8546 .commit_rpc_prepare = nfs4_proc_commit_rpc_prepare, 8547 .commit_done = nfs4_commit_done, 8548 .lock = nfs4_proc_lock, 8549 .clear_acl_cache = nfs4_zap_acl_attr, 8550 .close_context = nfs4_close_context, 8551 .open_context = nfs4_atomic_open, 8552 .have_delegation = nfs4_have_delegation, 8553 .return_delegation = nfs4_inode_return_delegation, 8554 .alloc_client = nfs4_alloc_client, 8555 .init_client = nfs4_init_client, 8556 .free_client = nfs4_free_client, 8557 .create_server = nfs4_create_server, 8558 .clone_server = nfs_clone_server, 8559 }; 8560 8561 static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = { 8562 .prefix = XATTR_NAME_NFSV4_ACL, 8563 .list = nfs4_xattr_list_nfs4_acl, 8564 .get = nfs4_xattr_get_nfs4_acl, 8565 .set = nfs4_xattr_set_nfs4_acl, 8566 }; 8567 8568 const struct xattr_handler *nfs4_xattr_handlers[] = { 8569 &nfs4_xattr_nfs4_acl_handler, 8570 #ifdef CONFIG_NFS_V4_SECURITY_LABEL 8571 &nfs4_xattr_nfs4_label_handler, 8572 #endif 8573 NULL 8574 }; 8575 8576 /* 8577 * Local variables: 8578 * c-basic-offset: 8 8579 * End: 8580 */ 8581