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