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