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/utsname.h> 40 #include <linux/delay.h> 41 #include <linux/errno.h> 42 #include <linux/string.h> 43 #include <linux/sunrpc/clnt.h> 44 #include <linux/nfs.h> 45 #include <linux/nfs4.h> 46 #include <linux/nfs_fs.h> 47 #include <linux/nfs_page.h> 48 #include <linux/namei.h> 49 #include <linux/mount.h> 50 #include <linux/module.h> 51 #include <linux/sunrpc/bc_xprt.h> 52 53 #include "nfs4_fs.h" 54 #include "delegation.h" 55 #include "internal.h" 56 #include "iostat.h" 57 #include "callback.h" 58 59 #define NFSDBG_FACILITY NFSDBG_PROC 60 61 #define NFS4_POLL_RETRY_MIN (HZ/10) 62 #define NFS4_POLL_RETRY_MAX (15*HZ) 63 64 #define NFS4_MAX_LOOP_ON_RECOVER (10) 65 66 struct nfs4_opendata; 67 static int _nfs4_proc_open(struct nfs4_opendata *data); 68 static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *); 69 static int nfs4_async_handle_error(struct rpc_task *, const struct nfs_server *, struct nfs4_state *); 70 static int _nfs4_proc_lookup(struct inode *dir, const struct qstr *name, struct nfs_fh *fhandle, struct nfs_fattr *fattr); 71 static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr); 72 73 /* Prevent leaks of NFSv4 errors into userland */ 74 static int nfs4_map_errors(int err) 75 { 76 if (err < -1000) { 77 dprintk("%s could not handle NFSv4 error %d\n", 78 __func__, -err); 79 return -EIO; 80 } 81 return err; 82 } 83 84 /* 85 * This is our standard bitmap for GETATTR requests. 86 */ 87 const u32 nfs4_fattr_bitmap[2] = { 88 FATTR4_WORD0_TYPE 89 | FATTR4_WORD0_CHANGE 90 | FATTR4_WORD0_SIZE 91 | FATTR4_WORD0_FSID 92 | FATTR4_WORD0_FILEID, 93 FATTR4_WORD1_MODE 94 | FATTR4_WORD1_NUMLINKS 95 | FATTR4_WORD1_OWNER 96 | FATTR4_WORD1_OWNER_GROUP 97 | FATTR4_WORD1_RAWDEV 98 | FATTR4_WORD1_SPACE_USED 99 | FATTR4_WORD1_TIME_ACCESS 100 | FATTR4_WORD1_TIME_METADATA 101 | FATTR4_WORD1_TIME_MODIFY 102 }; 103 104 const u32 nfs4_statfs_bitmap[2] = { 105 FATTR4_WORD0_FILES_AVAIL 106 | FATTR4_WORD0_FILES_FREE 107 | FATTR4_WORD0_FILES_TOTAL, 108 FATTR4_WORD1_SPACE_AVAIL 109 | FATTR4_WORD1_SPACE_FREE 110 | FATTR4_WORD1_SPACE_TOTAL 111 }; 112 113 const u32 nfs4_pathconf_bitmap[2] = { 114 FATTR4_WORD0_MAXLINK 115 | FATTR4_WORD0_MAXNAME, 116 0 117 }; 118 119 const u32 nfs4_fsinfo_bitmap[2] = { FATTR4_WORD0_MAXFILESIZE 120 | FATTR4_WORD0_MAXREAD 121 | FATTR4_WORD0_MAXWRITE 122 | FATTR4_WORD0_LEASE_TIME, 123 0 124 }; 125 126 const u32 nfs4_fs_locations_bitmap[2] = { 127 FATTR4_WORD0_TYPE 128 | FATTR4_WORD0_CHANGE 129 | FATTR4_WORD0_SIZE 130 | FATTR4_WORD0_FSID 131 | FATTR4_WORD0_FILEID 132 | FATTR4_WORD0_FS_LOCATIONS, 133 FATTR4_WORD1_MODE 134 | FATTR4_WORD1_NUMLINKS 135 | FATTR4_WORD1_OWNER 136 | FATTR4_WORD1_OWNER_GROUP 137 | FATTR4_WORD1_RAWDEV 138 | FATTR4_WORD1_SPACE_USED 139 | FATTR4_WORD1_TIME_ACCESS 140 | FATTR4_WORD1_TIME_METADATA 141 | FATTR4_WORD1_TIME_MODIFY 142 | FATTR4_WORD1_MOUNTED_ON_FILEID 143 }; 144 145 static void nfs4_setup_readdir(u64 cookie, __be32 *verifier, struct dentry *dentry, 146 struct nfs4_readdir_arg *readdir) 147 { 148 __be32 *start, *p; 149 150 BUG_ON(readdir->count < 80); 151 if (cookie > 2) { 152 readdir->cookie = cookie; 153 memcpy(&readdir->verifier, verifier, sizeof(readdir->verifier)); 154 return; 155 } 156 157 readdir->cookie = 0; 158 memset(&readdir->verifier, 0, sizeof(readdir->verifier)); 159 if (cookie == 2) 160 return; 161 162 /* 163 * NFSv4 servers do not return entries for '.' and '..' 164 * Therefore, we fake these entries here. We let '.' 165 * have cookie 0 and '..' have cookie 1. Note that 166 * when talking to the server, we always send cookie 0 167 * instead of 1 or 2. 168 */ 169 start = p = kmap_atomic(*readdir->pages, KM_USER0); 170 171 if (cookie == 0) { 172 *p++ = xdr_one; /* next */ 173 *p++ = xdr_zero; /* cookie, first word */ 174 *p++ = xdr_one; /* cookie, second word */ 175 *p++ = xdr_one; /* entry len */ 176 memcpy(p, ".\0\0\0", 4); /* entry */ 177 p++; 178 *p++ = xdr_one; /* bitmap length */ 179 *p++ = htonl(FATTR4_WORD0_FILEID); /* bitmap */ 180 *p++ = htonl(8); /* attribute buffer length */ 181 p = xdr_encode_hyper(p, NFS_FILEID(dentry->d_inode)); 182 } 183 184 *p++ = xdr_one; /* next */ 185 *p++ = xdr_zero; /* cookie, first word */ 186 *p++ = xdr_two; /* cookie, second word */ 187 *p++ = xdr_two; /* entry len */ 188 memcpy(p, "..\0\0", 4); /* entry */ 189 p++; 190 *p++ = xdr_one; /* bitmap length */ 191 *p++ = htonl(FATTR4_WORD0_FILEID); /* bitmap */ 192 *p++ = htonl(8); /* attribute buffer length */ 193 p = xdr_encode_hyper(p, NFS_FILEID(dentry->d_parent->d_inode)); 194 195 readdir->pgbase = (char *)p - (char *)start; 196 readdir->count -= readdir->pgbase; 197 kunmap_atomic(start, KM_USER0); 198 } 199 200 static int nfs4_wait_clnt_recover(struct nfs_client *clp) 201 { 202 int res; 203 204 might_sleep(); 205 206 res = wait_on_bit(&clp->cl_state, NFS4CLNT_MANAGER_RUNNING, 207 nfs_wait_bit_killable, TASK_KILLABLE); 208 return res; 209 } 210 211 static int nfs4_delay(struct rpc_clnt *clnt, long *timeout) 212 { 213 int res = 0; 214 215 might_sleep(); 216 217 if (*timeout <= 0) 218 *timeout = NFS4_POLL_RETRY_MIN; 219 if (*timeout > NFS4_POLL_RETRY_MAX) 220 *timeout = NFS4_POLL_RETRY_MAX; 221 schedule_timeout_killable(*timeout); 222 if (fatal_signal_pending(current)) 223 res = -ERESTARTSYS; 224 *timeout <<= 1; 225 return res; 226 } 227 228 /* This is the error handling routine for processes that are allowed 229 * to sleep. 230 */ 231 static int nfs4_handle_exception(const struct nfs_server *server, int errorcode, struct nfs4_exception *exception) 232 { 233 struct nfs_client *clp = server->nfs_client; 234 struct nfs4_state *state = exception->state; 235 int ret = errorcode; 236 237 exception->retry = 0; 238 switch(errorcode) { 239 case 0: 240 return 0; 241 case -NFS4ERR_ADMIN_REVOKED: 242 case -NFS4ERR_BAD_STATEID: 243 case -NFS4ERR_OPENMODE: 244 if (state == NULL) 245 break; 246 nfs4_state_mark_reclaim_nograce(clp, state); 247 case -NFS4ERR_STALE_CLIENTID: 248 case -NFS4ERR_STALE_STATEID: 249 case -NFS4ERR_EXPIRED: 250 nfs4_schedule_state_recovery(clp); 251 ret = nfs4_wait_clnt_recover(clp); 252 if (ret == 0) 253 exception->retry = 1; 254 #if !defined(CONFIG_NFS_V4_1) 255 break; 256 #else /* !defined(CONFIG_NFS_V4_1) */ 257 if (!nfs4_has_session(server->nfs_client)) 258 break; 259 /* FALLTHROUGH */ 260 case -NFS4ERR_BADSESSION: 261 case -NFS4ERR_BADSLOT: 262 case -NFS4ERR_BAD_HIGH_SLOT: 263 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: 264 case -NFS4ERR_DEADSESSION: 265 case -NFS4ERR_SEQ_FALSE_RETRY: 266 case -NFS4ERR_SEQ_MISORDERED: 267 dprintk("%s ERROR: %d Reset session\n", __func__, 268 errorcode); 269 set_bit(NFS4CLNT_SESSION_SETUP, &clp->cl_state); 270 exception->retry = 1; 271 /* FALLTHROUGH */ 272 #endif /* !defined(CONFIG_NFS_V4_1) */ 273 case -NFS4ERR_FILE_OPEN: 274 case -NFS4ERR_GRACE: 275 case -NFS4ERR_DELAY: 276 ret = nfs4_delay(server->client, &exception->timeout); 277 if (ret != 0) 278 break; 279 case -NFS4ERR_OLD_STATEID: 280 exception->retry = 1; 281 } 282 /* We failed to handle the error */ 283 return nfs4_map_errors(ret); 284 } 285 286 287 static void renew_lease(const struct nfs_server *server, unsigned long timestamp) 288 { 289 struct nfs_client *clp = server->nfs_client; 290 spin_lock(&clp->cl_lock); 291 if (time_before(clp->cl_last_renewal,timestamp)) 292 clp->cl_last_renewal = timestamp; 293 spin_unlock(&clp->cl_lock); 294 } 295 296 #if defined(CONFIG_NFS_V4_1) 297 298 /* 299 * nfs4_free_slot - free a slot and efficiently update slot table. 300 * 301 * freeing a slot is trivially done by clearing its respective bit 302 * in the bitmap. 303 * If the freed slotid equals highest_used_slotid we want to update it 304 * so that the server would be able to size down the slot table if needed, 305 * otherwise we know that the highest_used_slotid is still in use. 306 * When updating highest_used_slotid there may be "holes" in the bitmap 307 * so we need to scan down from highest_used_slotid to 0 looking for the now 308 * highest slotid in use. 309 * If none found, highest_used_slotid is set to -1. 310 */ 311 static void 312 nfs4_free_slot(struct nfs4_slot_table *tbl, u8 free_slotid) 313 { 314 int slotid = free_slotid; 315 316 spin_lock(&tbl->slot_tbl_lock); 317 /* clear used bit in bitmap */ 318 __clear_bit(slotid, tbl->used_slots); 319 320 /* update highest_used_slotid when it is freed */ 321 if (slotid == tbl->highest_used_slotid) { 322 slotid = find_last_bit(tbl->used_slots, tbl->max_slots); 323 if (slotid >= 0 && slotid < tbl->max_slots) 324 tbl->highest_used_slotid = slotid; 325 else 326 tbl->highest_used_slotid = -1; 327 } 328 rpc_wake_up_next(&tbl->slot_tbl_waitq); 329 spin_unlock(&tbl->slot_tbl_lock); 330 dprintk("%s: free_slotid %u highest_used_slotid %d\n", __func__, 331 free_slotid, tbl->highest_used_slotid); 332 } 333 334 void nfs41_sequence_free_slot(const struct nfs_client *clp, 335 struct nfs4_sequence_res *res) 336 { 337 struct nfs4_slot_table *tbl; 338 339 if (!nfs4_has_session(clp)) { 340 dprintk("%s: No session\n", __func__); 341 return; 342 } 343 tbl = &clp->cl_session->fc_slot_table; 344 if (res->sr_slotid == NFS4_MAX_SLOT_TABLE) { 345 dprintk("%s: No slot\n", __func__); 346 /* just wake up the next guy waiting since 347 * we may have not consumed a slot after all */ 348 rpc_wake_up_next(&tbl->slot_tbl_waitq); 349 return; 350 } 351 nfs4_free_slot(tbl, res->sr_slotid); 352 res->sr_slotid = NFS4_MAX_SLOT_TABLE; 353 } 354 355 static void nfs41_sequence_done(struct nfs_client *clp, 356 struct nfs4_sequence_res *res, 357 int rpc_status) 358 { 359 unsigned long timestamp; 360 struct nfs4_slot_table *tbl; 361 struct nfs4_slot *slot; 362 363 /* 364 * sr_status remains 1 if an RPC level error occurred. The server 365 * may or may not have processed the sequence operation.. 366 * Proceed as if the server received and processed the sequence 367 * operation. 368 */ 369 if (res->sr_status == 1) 370 res->sr_status = NFS_OK; 371 372 /* -ERESTARTSYS can result in skipping nfs41_sequence_setup */ 373 if (res->sr_slotid == NFS4_MAX_SLOT_TABLE) 374 goto out; 375 376 tbl = &clp->cl_session->fc_slot_table; 377 slot = tbl->slots + res->sr_slotid; 378 379 if (res->sr_status == 0) { 380 /* Update the slot's sequence and clientid lease timer */ 381 ++slot->seq_nr; 382 timestamp = res->sr_renewal_time; 383 spin_lock(&clp->cl_lock); 384 if (time_before(clp->cl_last_renewal, timestamp)) 385 clp->cl_last_renewal = timestamp; 386 spin_unlock(&clp->cl_lock); 387 return; 388 } 389 out: 390 /* The session may be reset by one of the error handlers. */ 391 dprintk("%s: Error %d free the slot \n", __func__, res->sr_status); 392 nfs41_sequence_free_slot(clp, res); 393 } 394 395 /* 396 * nfs4_find_slot - efficiently look for a free slot 397 * 398 * nfs4_find_slot looks for an unset bit in the used_slots bitmap. 399 * If found, we mark the slot as used, update the highest_used_slotid, 400 * and respectively set up the sequence operation args. 401 * The slot number is returned if found, or NFS4_MAX_SLOT_TABLE otherwise. 402 * 403 * Note: must be called with under the slot_tbl_lock. 404 */ 405 static u8 406 nfs4_find_slot(struct nfs4_slot_table *tbl, struct rpc_task *task) 407 { 408 int slotid; 409 u8 ret_id = NFS4_MAX_SLOT_TABLE; 410 BUILD_BUG_ON((u8)NFS4_MAX_SLOT_TABLE != (int)NFS4_MAX_SLOT_TABLE); 411 412 dprintk("--> %s used_slots=%04lx highest_used=%d max_slots=%d\n", 413 __func__, tbl->used_slots[0], tbl->highest_used_slotid, 414 tbl->max_slots); 415 slotid = find_first_zero_bit(tbl->used_slots, tbl->max_slots); 416 if (slotid >= tbl->max_slots) 417 goto out; 418 __set_bit(slotid, tbl->used_slots); 419 if (slotid > tbl->highest_used_slotid) 420 tbl->highest_used_slotid = slotid; 421 ret_id = slotid; 422 out: 423 dprintk("<-- %s used_slots=%04lx highest_used=%d slotid=%d \n", 424 __func__, tbl->used_slots[0], tbl->highest_used_slotid, ret_id); 425 return ret_id; 426 } 427 428 static int nfs4_recover_session(struct nfs4_session *session) 429 { 430 struct nfs_client *clp = session->clp; 431 unsigned int loop; 432 int ret; 433 434 for (loop = NFS4_MAX_LOOP_ON_RECOVER; loop != 0; loop--) { 435 ret = nfs4_wait_clnt_recover(clp); 436 if (ret != 0) 437 break; 438 if (!test_bit(NFS4CLNT_SESSION_SETUP, &clp->cl_state)) 439 break; 440 nfs4_schedule_state_manager(clp); 441 ret = -EIO; 442 } 443 return ret; 444 } 445 446 static int nfs41_setup_sequence(struct nfs4_session *session, 447 struct nfs4_sequence_args *args, 448 struct nfs4_sequence_res *res, 449 int cache_reply, 450 struct rpc_task *task) 451 { 452 struct nfs4_slot *slot; 453 struct nfs4_slot_table *tbl; 454 int status = 0; 455 u8 slotid; 456 457 dprintk("--> %s\n", __func__); 458 /* slot already allocated? */ 459 if (res->sr_slotid != NFS4_MAX_SLOT_TABLE) 460 return 0; 461 462 memset(res, 0, sizeof(*res)); 463 res->sr_slotid = NFS4_MAX_SLOT_TABLE; 464 tbl = &session->fc_slot_table; 465 466 spin_lock(&tbl->slot_tbl_lock); 467 if (test_bit(NFS4CLNT_SESSION_SETUP, &session->clp->cl_state)) { 468 if (tbl->highest_used_slotid != -1) { 469 rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL); 470 spin_unlock(&tbl->slot_tbl_lock); 471 dprintk("<-- %s: Session reset: draining\n", __func__); 472 return -EAGAIN; 473 } 474 475 /* The slot table is empty; start the reset thread */ 476 dprintk("%s Session Reset\n", __func__); 477 spin_unlock(&tbl->slot_tbl_lock); 478 status = nfs4_recover_session(session); 479 if (status) 480 return status; 481 spin_lock(&tbl->slot_tbl_lock); 482 } 483 484 slotid = nfs4_find_slot(tbl, task); 485 if (slotid == NFS4_MAX_SLOT_TABLE) { 486 rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL); 487 spin_unlock(&tbl->slot_tbl_lock); 488 dprintk("<-- %s: no free slots\n", __func__); 489 return -EAGAIN; 490 } 491 spin_unlock(&tbl->slot_tbl_lock); 492 493 slot = tbl->slots + slotid; 494 args->sa_session = session; 495 args->sa_slotid = slotid; 496 args->sa_cache_this = cache_reply; 497 498 dprintk("<-- %s slotid=%d seqid=%d\n", __func__, slotid, slot->seq_nr); 499 500 res->sr_session = session; 501 res->sr_slotid = slotid; 502 res->sr_renewal_time = jiffies; 503 /* 504 * sr_status is only set in decode_sequence, and so will remain 505 * set to 1 if an rpc level failure occurs. 506 */ 507 res->sr_status = 1; 508 return 0; 509 } 510 511 int nfs4_setup_sequence(struct nfs_client *clp, 512 struct nfs4_sequence_args *args, 513 struct nfs4_sequence_res *res, 514 int cache_reply, 515 struct rpc_task *task) 516 { 517 int ret = 0; 518 519 dprintk("--> %s clp %p session %p sr_slotid %d\n", 520 __func__, clp, clp->cl_session, res->sr_slotid); 521 522 if (!nfs4_has_session(clp)) 523 goto out; 524 ret = nfs41_setup_sequence(clp->cl_session, args, res, cache_reply, 525 task); 526 if (ret != -EAGAIN) { 527 /* terminate rpc task */ 528 task->tk_status = ret; 529 task->tk_action = NULL; 530 } 531 out: 532 dprintk("<-- %s status=%d\n", __func__, ret); 533 return ret; 534 } 535 536 struct nfs41_call_sync_data { 537 struct nfs_client *clp; 538 struct nfs4_sequence_args *seq_args; 539 struct nfs4_sequence_res *seq_res; 540 int cache_reply; 541 }; 542 543 static void nfs41_call_sync_prepare(struct rpc_task *task, void *calldata) 544 { 545 struct nfs41_call_sync_data *data = calldata; 546 547 dprintk("--> %s data->clp->cl_session %p\n", __func__, 548 data->clp->cl_session); 549 if (nfs4_setup_sequence(data->clp, data->seq_args, 550 data->seq_res, data->cache_reply, task)) 551 return; 552 rpc_call_start(task); 553 } 554 555 static void nfs41_call_sync_done(struct rpc_task *task, void *calldata) 556 { 557 struct nfs41_call_sync_data *data = calldata; 558 559 nfs41_sequence_done(data->clp, data->seq_res, task->tk_status); 560 nfs41_sequence_free_slot(data->clp, data->seq_res); 561 } 562 563 struct rpc_call_ops nfs41_call_sync_ops = { 564 .rpc_call_prepare = nfs41_call_sync_prepare, 565 .rpc_call_done = nfs41_call_sync_done, 566 }; 567 568 static int nfs4_call_sync_sequence(struct nfs_client *clp, 569 struct rpc_clnt *clnt, 570 struct rpc_message *msg, 571 struct nfs4_sequence_args *args, 572 struct nfs4_sequence_res *res, 573 int cache_reply) 574 { 575 int ret; 576 struct rpc_task *task; 577 struct nfs41_call_sync_data data = { 578 .clp = clp, 579 .seq_args = args, 580 .seq_res = res, 581 .cache_reply = cache_reply, 582 }; 583 struct rpc_task_setup task_setup = { 584 .rpc_client = clnt, 585 .rpc_message = msg, 586 .callback_ops = &nfs41_call_sync_ops, 587 .callback_data = &data 588 }; 589 590 res->sr_slotid = NFS4_MAX_SLOT_TABLE; 591 task = rpc_run_task(&task_setup); 592 if (IS_ERR(task)) 593 ret = PTR_ERR(task); 594 else { 595 ret = task->tk_status; 596 rpc_put_task(task); 597 } 598 return ret; 599 } 600 601 int _nfs4_call_sync_session(struct nfs_server *server, 602 struct rpc_message *msg, 603 struct nfs4_sequence_args *args, 604 struct nfs4_sequence_res *res, 605 int cache_reply) 606 { 607 return nfs4_call_sync_sequence(server->nfs_client, server->client, 608 msg, args, res, cache_reply); 609 } 610 611 #endif /* CONFIG_NFS_V4_1 */ 612 613 int _nfs4_call_sync(struct nfs_server *server, 614 struct rpc_message *msg, 615 struct nfs4_sequence_args *args, 616 struct nfs4_sequence_res *res, 617 int cache_reply) 618 { 619 args->sa_session = res->sr_session = NULL; 620 return rpc_call_sync(server->client, msg, 0); 621 } 622 623 #define nfs4_call_sync(server, msg, args, res, cache_reply) \ 624 (server)->nfs_client->cl_call_sync((server), (msg), &(args)->seq_args, \ 625 &(res)->seq_res, (cache_reply)) 626 627 static void nfs4_sequence_done(const struct nfs_server *server, 628 struct nfs4_sequence_res *res, int rpc_status) 629 { 630 #ifdef CONFIG_NFS_V4_1 631 if (nfs4_has_session(server->nfs_client)) 632 nfs41_sequence_done(server->nfs_client, res, rpc_status); 633 #endif /* CONFIG_NFS_V4_1 */ 634 } 635 636 /* no restart, therefore free slot here */ 637 static void nfs4_sequence_done_free_slot(const struct nfs_server *server, 638 struct nfs4_sequence_res *res, 639 int rpc_status) 640 { 641 nfs4_sequence_done(server, res, rpc_status); 642 nfs4_sequence_free_slot(server->nfs_client, res); 643 } 644 645 static void update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo) 646 { 647 struct nfs_inode *nfsi = NFS_I(dir); 648 649 spin_lock(&dir->i_lock); 650 nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA; 651 if (!cinfo->atomic || cinfo->before != nfsi->change_attr) 652 nfs_force_lookup_revalidate(dir); 653 nfsi->change_attr = cinfo->after; 654 spin_unlock(&dir->i_lock); 655 } 656 657 struct nfs4_opendata { 658 struct kref kref; 659 struct nfs_openargs o_arg; 660 struct nfs_openres o_res; 661 struct nfs_open_confirmargs c_arg; 662 struct nfs_open_confirmres c_res; 663 struct nfs_fattr f_attr; 664 struct nfs_fattr dir_attr; 665 struct path path; 666 struct dentry *dir; 667 struct nfs4_state_owner *owner; 668 struct nfs4_state *state; 669 struct iattr attrs; 670 unsigned long timestamp; 671 unsigned int rpc_done : 1; 672 int rpc_status; 673 int cancelled; 674 }; 675 676 677 static void nfs4_init_opendata_res(struct nfs4_opendata *p) 678 { 679 p->o_res.f_attr = &p->f_attr; 680 p->o_res.dir_attr = &p->dir_attr; 681 p->o_res.seqid = p->o_arg.seqid; 682 p->c_res.seqid = p->c_arg.seqid; 683 p->o_res.server = p->o_arg.server; 684 nfs_fattr_init(&p->f_attr); 685 nfs_fattr_init(&p->dir_attr); 686 p->o_res.seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE; 687 } 688 689 static struct nfs4_opendata *nfs4_opendata_alloc(struct path *path, 690 struct nfs4_state_owner *sp, fmode_t fmode, int flags, 691 const struct iattr *attrs) 692 { 693 struct dentry *parent = dget_parent(path->dentry); 694 struct inode *dir = parent->d_inode; 695 struct nfs_server *server = NFS_SERVER(dir); 696 struct nfs4_opendata *p; 697 698 p = kzalloc(sizeof(*p), GFP_KERNEL); 699 if (p == NULL) 700 goto err; 701 p->o_arg.seqid = nfs_alloc_seqid(&sp->so_seqid); 702 if (p->o_arg.seqid == NULL) 703 goto err_free; 704 p->path.mnt = mntget(path->mnt); 705 p->path.dentry = dget(path->dentry); 706 p->dir = parent; 707 p->owner = sp; 708 atomic_inc(&sp->so_count); 709 p->o_arg.fh = NFS_FH(dir); 710 p->o_arg.open_flags = flags; 711 p->o_arg.fmode = fmode & (FMODE_READ|FMODE_WRITE); 712 p->o_arg.clientid = server->nfs_client->cl_clientid; 713 p->o_arg.id = sp->so_owner_id.id; 714 p->o_arg.name = &p->path.dentry->d_name; 715 p->o_arg.server = server; 716 p->o_arg.bitmask = server->attr_bitmask; 717 p->o_arg.claim = NFS4_OPEN_CLAIM_NULL; 718 if (flags & O_EXCL) { 719 u32 *s = (u32 *) p->o_arg.u.verifier.data; 720 s[0] = jiffies; 721 s[1] = current->pid; 722 } else if (flags & O_CREAT) { 723 p->o_arg.u.attrs = &p->attrs; 724 memcpy(&p->attrs, attrs, sizeof(p->attrs)); 725 } 726 p->c_arg.fh = &p->o_res.fh; 727 p->c_arg.stateid = &p->o_res.stateid; 728 p->c_arg.seqid = p->o_arg.seqid; 729 nfs4_init_opendata_res(p); 730 kref_init(&p->kref); 731 return p; 732 err_free: 733 kfree(p); 734 err: 735 dput(parent); 736 return NULL; 737 } 738 739 static void nfs4_opendata_free(struct kref *kref) 740 { 741 struct nfs4_opendata *p = container_of(kref, 742 struct nfs4_opendata, kref); 743 744 nfs_free_seqid(p->o_arg.seqid); 745 if (p->state != NULL) 746 nfs4_put_open_state(p->state); 747 nfs4_put_state_owner(p->owner); 748 dput(p->dir); 749 path_put(&p->path); 750 kfree(p); 751 } 752 753 static void nfs4_opendata_put(struct nfs4_opendata *p) 754 { 755 if (p != NULL) 756 kref_put(&p->kref, nfs4_opendata_free); 757 } 758 759 static int nfs4_wait_for_completion_rpc_task(struct rpc_task *task) 760 { 761 int ret; 762 763 ret = rpc_wait_for_completion_task(task); 764 return ret; 765 } 766 767 static int can_open_cached(struct nfs4_state *state, fmode_t mode, int open_mode) 768 { 769 int ret = 0; 770 771 if (open_mode & O_EXCL) 772 goto out; 773 switch (mode & (FMODE_READ|FMODE_WRITE)) { 774 case FMODE_READ: 775 ret |= test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0; 776 break; 777 case FMODE_WRITE: 778 ret |= test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0; 779 break; 780 case FMODE_READ|FMODE_WRITE: 781 ret |= test_bit(NFS_O_RDWR_STATE, &state->flags) != 0; 782 } 783 out: 784 return ret; 785 } 786 787 static int can_open_delegated(struct nfs_delegation *delegation, fmode_t fmode) 788 { 789 if ((delegation->type & fmode) != fmode) 790 return 0; 791 if (test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags)) 792 return 0; 793 nfs_mark_delegation_referenced(delegation); 794 return 1; 795 } 796 797 static void update_open_stateflags(struct nfs4_state *state, fmode_t fmode) 798 { 799 switch (fmode) { 800 case FMODE_WRITE: 801 state->n_wronly++; 802 break; 803 case FMODE_READ: 804 state->n_rdonly++; 805 break; 806 case FMODE_READ|FMODE_WRITE: 807 state->n_rdwr++; 808 } 809 nfs4_state_set_mode_locked(state, state->state | fmode); 810 } 811 812 static void nfs_set_open_stateid_locked(struct nfs4_state *state, nfs4_stateid *stateid, fmode_t fmode) 813 { 814 if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0) 815 memcpy(state->stateid.data, stateid->data, sizeof(state->stateid.data)); 816 memcpy(state->open_stateid.data, stateid->data, sizeof(state->open_stateid.data)); 817 switch (fmode) { 818 case FMODE_READ: 819 set_bit(NFS_O_RDONLY_STATE, &state->flags); 820 break; 821 case FMODE_WRITE: 822 set_bit(NFS_O_WRONLY_STATE, &state->flags); 823 break; 824 case FMODE_READ|FMODE_WRITE: 825 set_bit(NFS_O_RDWR_STATE, &state->flags); 826 } 827 } 828 829 static void nfs_set_open_stateid(struct nfs4_state *state, nfs4_stateid *stateid, fmode_t fmode) 830 { 831 write_seqlock(&state->seqlock); 832 nfs_set_open_stateid_locked(state, stateid, fmode); 833 write_sequnlock(&state->seqlock); 834 } 835 836 static void __update_open_stateid(struct nfs4_state *state, nfs4_stateid *open_stateid, const nfs4_stateid *deleg_stateid, fmode_t fmode) 837 { 838 /* 839 * Protect the call to nfs4_state_set_mode_locked and 840 * serialise the stateid update 841 */ 842 write_seqlock(&state->seqlock); 843 if (deleg_stateid != NULL) { 844 memcpy(state->stateid.data, deleg_stateid->data, sizeof(state->stateid.data)); 845 set_bit(NFS_DELEGATED_STATE, &state->flags); 846 } 847 if (open_stateid != NULL) 848 nfs_set_open_stateid_locked(state, open_stateid, fmode); 849 write_sequnlock(&state->seqlock); 850 spin_lock(&state->owner->so_lock); 851 update_open_stateflags(state, fmode); 852 spin_unlock(&state->owner->so_lock); 853 } 854 855 static int update_open_stateid(struct nfs4_state *state, nfs4_stateid *open_stateid, nfs4_stateid *delegation, fmode_t fmode) 856 { 857 struct nfs_inode *nfsi = NFS_I(state->inode); 858 struct nfs_delegation *deleg_cur; 859 int ret = 0; 860 861 fmode &= (FMODE_READ|FMODE_WRITE); 862 863 rcu_read_lock(); 864 deleg_cur = rcu_dereference(nfsi->delegation); 865 if (deleg_cur == NULL) 866 goto no_delegation; 867 868 spin_lock(&deleg_cur->lock); 869 if (nfsi->delegation != deleg_cur || 870 (deleg_cur->type & fmode) != fmode) 871 goto no_delegation_unlock; 872 873 if (delegation == NULL) 874 delegation = &deleg_cur->stateid; 875 else if (memcmp(deleg_cur->stateid.data, delegation->data, NFS4_STATEID_SIZE) != 0) 876 goto no_delegation_unlock; 877 878 nfs_mark_delegation_referenced(deleg_cur); 879 __update_open_stateid(state, open_stateid, &deleg_cur->stateid, fmode); 880 ret = 1; 881 no_delegation_unlock: 882 spin_unlock(&deleg_cur->lock); 883 no_delegation: 884 rcu_read_unlock(); 885 886 if (!ret && open_stateid != NULL) { 887 __update_open_stateid(state, open_stateid, NULL, fmode); 888 ret = 1; 889 } 890 891 return ret; 892 } 893 894 895 static void nfs4_return_incompatible_delegation(struct inode *inode, fmode_t fmode) 896 { 897 struct nfs_delegation *delegation; 898 899 rcu_read_lock(); 900 delegation = rcu_dereference(NFS_I(inode)->delegation); 901 if (delegation == NULL || (delegation->type & fmode) == fmode) { 902 rcu_read_unlock(); 903 return; 904 } 905 rcu_read_unlock(); 906 nfs_inode_return_delegation(inode); 907 } 908 909 static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata) 910 { 911 struct nfs4_state *state = opendata->state; 912 struct nfs_inode *nfsi = NFS_I(state->inode); 913 struct nfs_delegation *delegation; 914 int open_mode = opendata->o_arg.open_flags & O_EXCL; 915 fmode_t fmode = opendata->o_arg.fmode; 916 nfs4_stateid stateid; 917 int ret = -EAGAIN; 918 919 for (;;) { 920 if (can_open_cached(state, fmode, open_mode)) { 921 spin_lock(&state->owner->so_lock); 922 if (can_open_cached(state, fmode, open_mode)) { 923 update_open_stateflags(state, fmode); 924 spin_unlock(&state->owner->so_lock); 925 goto out_return_state; 926 } 927 spin_unlock(&state->owner->so_lock); 928 } 929 rcu_read_lock(); 930 delegation = rcu_dereference(nfsi->delegation); 931 if (delegation == NULL || 932 !can_open_delegated(delegation, fmode)) { 933 rcu_read_unlock(); 934 break; 935 } 936 /* Save the delegation */ 937 memcpy(stateid.data, delegation->stateid.data, sizeof(stateid.data)); 938 rcu_read_unlock(); 939 ret = nfs_may_open(state->inode, state->owner->so_cred, open_mode); 940 if (ret != 0) 941 goto out; 942 ret = -EAGAIN; 943 944 /* Try to update the stateid using the delegation */ 945 if (update_open_stateid(state, NULL, &stateid, fmode)) 946 goto out_return_state; 947 } 948 out: 949 return ERR_PTR(ret); 950 out_return_state: 951 atomic_inc(&state->count); 952 return state; 953 } 954 955 static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data) 956 { 957 struct inode *inode; 958 struct nfs4_state *state = NULL; 959 struct nfs_delegation *delegation; 960 int ret; 961 962 if (!data->rpc_done) { 963 state = nfs4_try_open_cached(data); 964 goto out; 965 } 966 967 ret = -EAGAIN; 968 if (!(data->f_attr.valid & NFS_ATTR_FATTR)) 969 goto err; 970 inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh, &data->f_attr); 971 ret = PTR_ERR(inode); 972 if (IS_ERR(inode)) 973 goto err; 974 ret = -ENOMEM; 975 state = nfs4_get_open_state(inode, data->owner); 976 if (state == NULL) 977 goto err_put_inode; 978 if (data->o_res.delegation_type != 0) { 979 int delegation_flags = 0; 980 981 rcu_read_lock(); 982 delegation = rcu_dereference(NFS_I(inode)->delegation); 983 if (delegation) 984 delegation_flags = delegation->flags; 985 rcu_read_unlock(); 986 if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0) 987 nfs_inode_set_delegation(state->inode, 988 data->owner->so_cred, 989 &data->o_res); 990 else 991 nfs_inode_reclaim_delegation(state->inode, 992 data->owner->so_cred, 993 &data->o_res); 994 } 995 996 update_open_stateid(state, &data->o_res.stateid, NULL, 997 data->o_arg.fmode); 998 iput(inode); 999 out: 1000 return state; 1001 err_put_inode: 1002 iput(inode); 1003 err: 1004 return ERR_PTR(ret); 1005 } 1006 1007 static struct nfs_open_context *nfs4_state_find_open_context(struct nfs4_state *state) 1008 { 1009 struct nfs_inode *nfsi = NFS_I(state->inode); 1010 struct nfs_open_context *ctx; 1011 1012 spin_lock(&state->inode->i_lock); 1013 list_for_each_entry(ctx, &nfsi->open_files, list) { 1014 if (ctx->state != state) 1015 continue; 1016 get_nfs_open_context(ctx); 1017 spin_unlock(&state->inode->i_lock); 1018 return ctx; 1019 } 1020 spin_unlock(&state->inode->i_lock); 1021 return ERR_PTR(-ENOENT); 1022 } 1023 1024 static struct nfs4_opendata *nfs4_open_recoverdata_alloc(struct nfs_open_context *ctx, struct nfs4_state *state) 1025 { 1026 struct nfs4_opendata *opendata; 1027 1028 opendata = nfs4_opendata_alloc(&ctx->path, state->owner, 0, 0, NULL); 1029 if (opendata == NULL) 1030 return ERR_PTR(-ENOMEM); 1031 opendata->state = state; 1032 atomic_inc(&state->count); 1033 return opendata; 1034 } 1035 1036 static int nfs4_open_recover_helper(struct nfs4_opendata *opendata, fmode_t fmode, struct nfs4_state **res) 1037 { 1038 struct nfs4_state *newstate; 1039 int ret; 1040 1041 opendata->o_arg.open_flags = 0; 1042 opendata->o_arg.fmode = fmode; 1043 memset(&opendata->o_res, 0, sizeof(opendata->o_res)); 1044 memset(&opendata->c_res, 0, sizeof(opendata->c_res)); 1045 nfs4_init_opendata_res(opendata); 1046 ret = _nfs4_proc_open(opendata); 1047 if (ret != 0) 1048 return ret; 1049 newstate = nfs4_opendata_to_nfs4_state(opendata); 1050 if (IS_ERR(newstate)) 1051 return PTR_ERR(newstate); 1052 nfs4_close_state(&opendata->path, newstate, fmode); 1053 *res = newstate; 1054 return 0; 1055 } 1056 1057 static int nfs4_open_recover(struct nfs4_opendata *opendata, struct nfs4_state *state) 1058 { 1059 struct nfs4_state *newstate; 1060 int ret; 1061 1062 /* memory barrier prior to reading state->n_* */ 1063 clear_bit(NFS_DELEGATED_STATE, &state->flags); 1064 smp_rmb(); 1065 if (state->n_rdwr != 0) { 1066 ret = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE, &newstate); 1067 if (ret != 0) 1068 return ret; 1069 if (newstate != state) 1070 return -ESTALE; 1071 } 1072 if (state->n_wronly != 0) { 1073 ret = nfs4_open_recover_helper(opendata, FMODE_WRITE, &newstate); 1074 if (ret != 0) 1075 return ret; 1076 if (newstate != state) 1077 return -ESTALE; 1078 } 1079 if (state->n_rdonly != 0) { 1080 ret = nfs4_open_recover_helper(opendata, FMODE_READ, &newstate); 1081 if (ret != 0) 1082 return ret; 1083 if (newstate != state) 1084 return -ESTALE; 1085 } 1086 /* 1087 * We may have performed cached opens for all three recoveries. 1088 * Check if we need to update the current stateid. 1089 */ 1090 if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0 && 1091 memcmp(state->stateid.data, state->open_stateid.data, sizeof(state->stateid.data)) != 0) { 1092 write_seqlock(&state->seqlock); 1093 if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0) 1094 memcpy(state->stateid.data, state->open_stateid.data, sizeof(state->stateid.data)); 1095 write_sequnlock(&state->seqlock); 1096 } 1097 return 0; 1098 } 1099 1100 /* 1101 * OPEN_RECLAIM: 1102 * reclaim state on the server after a reboot. 1103 */ 1104 static int _nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state *state) 1105 { 1106 struct nfs_delegation *delegation; 1107 struct nfs4_opendata *opendata; 1108 fmode_t delegation_type = 0; 1109 int status; 1110 1111 opendata = nfs4_open_recoverdata_alloc(ctx, state); 1112 if (IS_ERR(opendata)) 1113 return PTR_ERR(opendata); 1114 opendata->o_arg.claim = NFS4_OPEN_CLAIM_PREVIOUS; 1115 opendata->o_arg.fh = NFS_FH(state->inode); 1116 rcu_read_lock(); 1117 delegation = rcu_dereference(NFS_I(state->inode)->delegation); 1118 if (delegation != NULL && test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags) != 0) 1119 delegation_type = delegation->type; 1120 rcu_read_unlock(); 1121 opendata->o_arg.u.delegation_type = delegation_type; 1122 status = nfs4_open_recover(opendata, state); 1123 nfs4_opendata_put(opendata); 1124 return status; 1125 } 1126 1127 static int nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state *state) 1128 { 1129 struct nfs_server *server = NFS_SERVER(state->inode); 1130 struct nfs4_exception exception = { }; 1131 int err; 1132 do { 1133 err = _nfs4_do_open_reclaim(ctx, state); 1134 if (err != -NFS4ERR_DELAY) 1135 break; 1136 nfs4_handle_exception(server, err, &exception); 1137 } while (exception.retry); 1138 return err; 1139 } 1140 1141 static int nfs4_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state) 1142 { 1143 struct nfs_open_context *ctx; 1144 int ret; 1145 1146 ctx = nfs4_state_find_open_context(state); 1147 if (IS_ERR(ctx)) 1148 return PTR_ERR(ctx); 1149 ret = nfs4_do_open_reclaim(ctx, state); 1150 put_nfs_open_context(ctx); 1151 return ret; 1152 } 1153 1154 static int _nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid) 1155 { 1156 struct nfs4_opendata *opendata; 1157 int ret; 1158 1159 opendata = nfs4_open_recoverdata_alloc(ctx, state); 1160 if (IS_ERR(opendata)) 1161 return PTR_ERR(opendata); 1162 opendata->o_arg.claim = NFS4_OPEN_CLAIM_DELEGATE_CUR; 1163 memcpy(opendata->o_arg.u.delegation.data, stateid->data, 1164 sizeof(opendata->o_arg.u.delegation.data)); 1165 ret = nfs4_open_recover(opendata, state); 1166 nfs4_opendata_put(opendata); 1167 return ret; 1168 } 1169 1170 int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid) 1171 { 1172 struct nfs4_exception exception = { }; 1173 struct nfs_server *server = NFS_SERVER(state->inode); 1174 int err; 1175 do { 1176 err = _nfs4_open_delegation_recall(ctx, state, stateid); 1177 switch (err) { 1178 case 0: 1179 case -ENOENT: 1180 case -ESTALE: 1181 goto out; 1182 case -NFS4ERR_STALE_CLIENTID: 1183 case -NFS4ERR_STALE_STATEID: 1184 case -NFS4ERR_EXPIRED: 1185 /* Don't recall a delegation if it was lost */ 1186 nfs4_schedule_state_recovery(server->nfs_client); 1187 goto out; 1188 case -ERESTARTSYS: 1189 /* 1190 * The show must go on: exit, but mark the 1191 * stateid as needing recovery. 1192 */ 1193 case -NFS4ERR_ADMIN_REVOKED: 1194 case -NFS4ERR_BAD_STATEID: 1195 nfs4_state_mark_reclaim_nograce(server->nfs_client, state); 1196 case -ENOMEM: 1197 err = 0; 1198 goto out; 1199 } 1200 err = nfs4_handle_exception(server, err, &exception); 1201 } while (exception.retry); 1202 out: 1203 return err; 1204 } 1205 1206 static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata) 1207 { 1208 struct nfs4_opendata *data = calldata; 1209 1210 data->rpc_status = task->tk_status; 1211 if (RPC_ASSASSINATED(task)) 1212 return; 1213 if (data->rpc_status == 0) { 1214 memcpy(data->o_res.stateid.data, data->c_res.stateid.data, 1215 sizeof(data->o_res.stateid.data)); 1216 nfs_confirm_seqid(&data->owner->so_seqid, 0); 1217 renew_lease(data->o_res.server, data->timestamp); 1218 data->rpc_done = 1; 1219 } 1220 } 1221 1222 static void nfs4_open_confirm_release(void *calldata) 1223 { 1224 struct nfs4_opendata *data = calldata; 1225 struct nfs4_state *state = NULL; 1226 1227 /* If this request hasn't been cancelled, do nothing */ 1228 if (data->cancelled == 0) 1229 goto out_free; 1230 /* In case of error, no cleanup! */ 1231 if (!data->rpc_done) 1232 goto out_free; 1233 state = nfs4_opendata_to_nfs4_state(data); 1234 if (!IS_ERR(state)) 1235 nfs4_close_state(&data->path, state, data->o_arg.fmode); 1236 out_free: 1237 nfs4_opendata_put(data); 1238 } 1239 1240 static const struct rpc_call_ops nfs4_open_confirm_ops = { 1241 .rpc_call_done = nfs4_open_confirm_done, 1242 .rpc_release = nfs4_open_confirm_release, 1243 }; 1244 1245 /* 1246 * Note: On error, nfs4_proc_open_confirm will free the struct nfs4_opendata 1247 */ 1248 static int _nfs4_proc_open_confirm(struct nfs4_opendata *data) 1249 { 1250 struct nfs_server *server = NFS_SERVER(data->dir->d_inode); 1251 struct rpc_task *task; 1252 struct rpc_message msg = { 1253 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM], 1254 .rpc_argp = &data->c_arg, 1255 .rpc_resp = &data->c_res, 1256 .rpc_cred = data->owner->so_cred, 1257 }; 1258 struct rpc_task_setup task_setup_data = { 1259 .rpc_client = server->client, 1260 .rpc_message = &msg, 1261 .callback_ops = &nfs4_open_confirm_ops, 1262 .callback_data = data, 1263 .workqueue = nfsiod_workqueue, 1264 .flags = RPC_TASK_ASYNC, 1265 }; 1266 int status; 1267 1268 kref_get(&data->kref); 1269 data->rpc_done = 0; 1270 data->rpc_status = 0; 1271 data->timestamp = jiffies; 1272 task = rpc_run_task(&task_setup_data); 1273 if (IS_ERR(task)) 1274 return PTR_ERR(task); 1275 status = nfs4_wait_for_completion_rpc_task(task); 1276 if (status != 0) { 1277 data->cancelled = 1; 1278 smp_wmb(); 1279 } else 1280 status = data->rpc_status; 1281 rpc_put_task(task); 1282 return status; 1283 } 1284 1285 static void nfs4_open_prepare(struct rpc_task *task, void *calldata) 1286 { 1287 struct nfs4_opendata *data = calldata; 1288 struct nfs4_state_owner *sp = data->owner; 1289 1290 if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0) 1291 return; 1292 /* 1293 * Check if we still need to send an OPEN call, or if we can use 1294 * a delegation instead. 1295 */ 1296 if (data->state != NULL) { 1297 struct nfs_delegation *delegation; 1298 1299 if (can_open_cached(data->state, data->o_arg.fmode, data->o_arg.open_flags)) 1300 goto out_no_action; 1301 rcu_read_lock(); 1302 delegation = rcu_dereference(NFS_I(data->state->inode)->delegation); 1303 if (delegation != NULL && 1304 test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags) == 0) { 1305 rcu_read_unlock(); 1306 goto out_no_action; 1307 } 1308 rcu_read_unlock(); 1309 } 1310 /* Update sequence id. */ 1311 data->o_arg.id = sp->so_owner_id.id; 1312 data->o_arg.clientid = sp->so_client->cl_clientid; 1313 if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) { 1314 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR]; 1315 nfs_copy_fh(&data->o_res.fh, data->o_arg.fh); 1316 } 1317 data->timestamp = jiffies; 1318 if (nfs4_setup_sequence(data->o_arg.server->nfs_client, 1319 &data->o_arg.seq_args, 1320 &data->o_res.seq_res, 1, task)) 1321 return; 1322 rpc_call_start(task); 1323 return; 1324 out_no_action: 1325 task->tk_action = NULL; 1326 1327 } 1328 1329 static void nfs4_open_done(struct rpc_task *task, void *calldata) 1330 { 1331 struct nfs4_opendata *data = calldata; 1332 1333 data->rpc_status = task->tk_status; 1334 1335 nfs4_sequence_done_free_slot(data->o_arg.server, &data->o_res.seq_res, 1336 task->tk_status); 1337 1338 if (RPC_ASSASSINATED(task)) 1339 return; 1340 if (task->tk_status == 0) { 1341 switch (data->o_res.f_attr->mode & S_IFMT) { 1342 case S_IFREG: 1343 break; 1344 case S_IFLNK: 1345 data->rpc_status = -ELOOP; 1346 break; 1347 case S_IFDIR: 1348 data->rpc_status = -EISDIR; 1349 break; 1350 default: 1351 data->rpc_status = -ENOTDIR; 1352 } 1353 renew_lease(data->o_res.server, data->timestamp); 1354 if (!(data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM)) 1355 nfs_confirm_seqid(&data->owner->so_seqid, 0); 1356 } 1357 data->rpc_done = 1; 1358 } 1359 1360 static void nfs4_open_release(void *calldata) 1361 { 1362 struct nfs4_opendata *data = calldata; 1363 struct nfs4_state *state = NULL; 1364 1365 /* If this request hasn't been cancelled, do nothing */ 1366 if (data->cancelled == 0) 1367 goto out_free; 1368 /* In case of error, no cleanup! */ 1369 if (data->rpc_status != 0 || !data->rpc_done) 1370 goto out_free; 1371 /* In case we need an open_confirm, no cleanup! */ 1372 if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM) 1373 goto out_free; 1374 state = nfs4_opendata_to_nfs4_state(data); 1375 if (!IS_ERR(state)) 1376 nfs4_close_state(&data->path, state, data->o_arg.fmode); 1377 out_free: 1378 nfs4_opendata_put(data); 1379 } 1380 1381 static const struct rpc_call_ops nfs4_open_ops = { 1382 .rpc_call_prepare = nfs4_open_prepare, 1383 .rpc_call_done = nfs4_open_done, 1384 .rpc_release = nfs4_open_release, 1385 }; 1386 1387 /* 1388 * Note: On error, nfs4_proc_open will free the struct nfs4_opendata 1389 */ 1390 static int _nfs4_proc_open(struct nfs4_opendata *data) 1391 { 1392 struct inode *dir = data->dir->d_inode; 1393 struct nfs_server *server = NFS_SERVER(dir); 1394 struct nfs_openargs *o_arg = &data->o_arg; 1395 struct nfs_openres *o_res = &data->o_res; 1396 struct rpc_task *task; 1397 struct rpc_message msg = { 1398 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN], 1399 .rpc_argp = o_arg, 1400 .rpc_resp = o_res, 1401 .rpc_cred = data->owner->so_cred, 1402 }; 1403 struct rpc_task_setup task_setup_data = { 1404 .rpc_client = server->client, 1405 .rpc_message = &msg, 1406 .callback_ops = &nfs4_open_ops, 1407 .callback_data = data, 1408 .workqueue = nfsiod_workqueue, 1409 .flags = RPC_TASK_ASYNC, 1410 }; 1411 int status; 1412 1413 kref_get(&data->kref); 1414 data->rpc_done = 0; 1415 data->rpc_status = 0; 1416 data->cancelled = 0; 1417 task = rpc_run_task(&task_setup_data); 1418 if (IS_ERR(task)) 1419 return PTR_ERR(task); 1420 status = nfs4_wait_for_completion_rpc_task(task); 1421 if (status != 0) { 1422 data->cancelled = 1; 1423 smp_wmb(); 1424 } else 1425 status = data->rpc_status; 1426 rpc_put_task(task); 1427 if (status != 0 || !data->rpc_done) 1428 return status; 1429 1430 if (o_res->fh.size == 0) 1431 _nfs4_proc_lookup(dir, o_arg->name, &o_res->fh, o_res->f_attr); 1432 1433 if (o_arg->open_flags & O_CREAT) { 1434 update_changeattr(dir, &o_res->cinfo); 1435 nfs_post_op_update_inode(dir, o_res->dir_attr); 1436 } else 1437 nfs_refresh_inode(dir, o_res->dir_attr); 1438 if(o_res->rflags & NFS4_OPEN_RESULT_CONFIRM) { 1439 status = _nfs4_proc_open_confirm(data); 1440 if (status != 0) 1441 return status; 1442 } 1443 if (!(o_res->f_attr->valid & NFS_ATTR_FATTR)) 1444 _nfs4_proc_getattr(server, &o_res->fh, o_res->f_attr); 1445 return 0; 1446 } 1447 1448 static int nfs4_recover_expired_lease(struct nfs_server *server) 1449 { 1450 struct nfs_client *clp = server->nfs_client; 1451 unsigned int loop; 1452 int ret; 1453 1454 for (loop = NFS4_MAX_LOOP_ON_RECOVER; loop != 0; loop--) { 1455 ret = nfs4_wait_clnt_recover(clp); 1456 if (ret != 0) 1457 break; 1458 if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) && 1459 !test_bit(NFS4CLNT_CHECK_LEASE,&clp->cl_state)) 1460 break; 1461 nfs4_schedule_state_recovery(clp); 1462 ret = -EIO; 1463 } 1464 return ret; 1465 } 1466 1467 /* 1468 * OPEN_EXPIRED: 1469 * reclaim state on the server after a network partition. 1470 * Assumes caller holds the appropriate lock 1471 */ 1472 static int _nfs4_open_expired(struct nfs_open_context *ctx, struct nfs4_state *state) 1473 { 1474 struct nfs4_opendata *opendata; 1475 int ret; 1476 1477 opendata = nfs4_open_recoverdata_alloc(ctx, state); 1478 if (IS_ERR(opendata)) 1479 return PTR_ERR(opendata); 1480 ret = nfs4_open_recover(opendata, state); 1481 if (ret == -ESTALE) 1482 d_drop(ctx->path.dentry); 1483 nfs4_opendata_put(opendata); 1484 return ret; 1485 } 1486 1487 static inline int nfs4_do_open_expired(struct nfs_open_context *ctx, struct nfs4_state *state) 1488 { 1489 struct nfs_server *server = NFS_SERVER(state->inode); 1490 struct nfs4_exception exception = { }; 1491 int err; 1492 1493 do { 1494 err = _nfs4_open_expired(ctx, state); 1495 if (err != -NFS4ERR_DELAY) 1496 break; 1497 nfs4_handle_exception(server, err, &exception); 1498 } while (exception.retry); 1499 return err; 1500 } 1501 1502 static int nfs4_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state) 1503 { 1504 struct nfs_open_context *ctx; 1505 int ret; 1506 1507 ctx = nfs4_state_find_open_context(state); 1508 if (IS_ERR(ctx)) 1509 return PTR_ERR(ctx); 1510 ret = nfs4_do_open_expired(ctx, state); 1511 put_nfs_open_context(ctx); 1512 return ret; 1513 } 1514 1515 /* 1516 * on an EXCLUSIVE create, the server should send back a bitmask with FATTR4-* 1517 * fields corresponding to attributes that were used to store the verifier. 1518 * Make sure we clobber those fields in the later setattr call 1519 */ 1520 static inline void nfs4_exclusive_attrset(struct nfs4_opendata *opendata, struct iattr *sattr) 1521 { 1522 if ((opendata->o_res.attrset[1] & FATTR4_WORD1_TIME_ACCESS) && 1523 !(sattr->ia_valid & ATTR_ATIME_SET)) 1524 sattr->ia_valid |= ATTR_ATIME; 1525 1526 if ((opendata->o_res.attrset[1] & FATTR4_WORD1_TIME_MODIFY) && 1527 !(sattr->ia_valid & ATTR_MTIME_SET)) 1528 sattr->ia_valid |= ATTR_MTIME; 1529 } 1530 1531 /* 1532 * Returns a referenced nfs4_state 1533 */ 1534 static int _nfs4_do_open(struct inode *dir, struct path *path, fmode_t fmode, int flags, struct iattr *sattr, struct rpc_cred *cred, struct nfs4_state **res) 1535 { 1536 struct nfs4_state_owner *sp; 1537 struct nfs4_state *state = NULL; 1538 struct nfs_server *server = NFS_SERVER(dir); 1539 struct nfs4_opendata *opendata; 1540 int status; 1541 1542 /* Protect against reboot recovery conflicts */ 1543 status = -ENOMEM; 1544 if (!(sp = nfs4_get_state_owner(server, cred))) { 1545 dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n"); 1546 goto out_err; 1547 } 1548 status = nfs4_recover_expired_lease(server); 1549 if (status != 0) 1550 goto err_put_state_owner; 1551 if (path->dentry->d_inode != NULL) 1552 nfs4_return_incompatible_delegation(path->dentry->d_inode, fmode); 1553 status = -ENOMEM; 1554 opendata = nfs4_opendata_alloc(path, sp, fmode, flags, sattr); 1555 if (opendata == NULL) 1556 goto err_put_state_owner; 1557 1558 if (path->dentry->d_inode != NULL) 1559 opendata->state = nfs4_get_open_state(path->dentry->d_inode, sp); 1560 1561 status = _nfs4_proc_open(opendata); 1562 if (status != 0) 1563 goto err_opendata_put; 1564 1565 if (opendata->o_arg.open_flags & O_EXCL) 1566 nfs4_exclusive_attrset(opendata, sattr); 1567 1568 state = nfs4_opendata_to_nfs4_state(opendata); 1569 status = PTR_ERR(state); 1570 if (IS_ERR(state)) 1571 goto err_opendata_put; 1572 nfs4_opendata_put(opendata); 1573 nfs4_put_state_owner(sp); 1574 *res = state; 1575 return 0; 1576 err_opendata_put: 1577 nfs4_opendata_put(opendata); 1578 err_put_state_owner: 1579 nfs4_put_state_owner(sp); 1580 out_err: 1581 *res = NULL; 1582 return status; 1583 } 1584 1585 1586 static struct nfs4_state *nfs4_do_open(struct inode *dir, struct path *path, fmode_t fmode, int flags, struct iattr *sattr, struct rpc_cred *cred) 1587 { 1588 struct nfs4_exception exception = { }; 1589 struct nfs4_state *res; 1590 int status; 1591 1592 do { 1593 status = _nfs4_do_open(dir, path, fmode, flags, sattr, cred, &res); 1594 if (status == 0) 1595 break; 1596 /* NOTE: BAD_SEQID means the server and client disagree about the 1597 * book-keeping w.r.t. state-changing operations 1598 * (OPEN/CLOSE/LOCK/LOCKU...) 1599 * It is actually a sign of a bug on the client or on the server. 1600 * 1601 * If we receive a BAD_SEQID error in the particular case of 1602 * doing an OPEN, we assume that nfs_increment_open_seqid() will 1603 * have unhashed the old state_owner for us, and that we can 1604 * therefore safely retry using a new one. We should still warn 1605 * the user though... 1606 */ 1607 if (status == -NFS4ERR_BAD_SEQID) { 1608 printk(KERN_WARNING "NFS: v4 server %s " 1609 " returned a bad sequence-id error!\n", 1610 NFS_SERVER(dir)->nfs_client->cl_hostname); 1611 exception.retry = 1; 1612 continue; 1613 } 1614 /* 1615 * BAD_STATEID on OPEN means that the server cancelled our 1616 * state before it received the OPEN_CONFIRM. 1617 * Recover by retrying the request as per the discussion 1618 * on Page 181 of RFC3530. 1619 */ 1620 if (status == -NFS4ERR_BAD_STATEID) { 1621 exception.retry = 1; 1622 continue; 1623 } 1624 if (status == -EAGAIN) { 1625 /* We must have found a delegation */ 1626 exception.retry = 1; 1627 continue; 1628 } 1629 res = ERR_PTR(nfs4_handle_exception(NFS_SERVER(dir), 1630 status, &exception)); 1631 } while (exception.retry); 1632 return res; 1633 } 1634 1635 static int _nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred, 1636 struct nfs_fattr *fattr, struct iattr *sattr, 1637 struct nfs4_state *state) 1638 { 1639 struct nfs_server *server = NFS_SERVER(inode); 1640 struct nfs_setattrargs arg = { 1641 .fh = NFS_FH(inode), 1642 .iap = sattr, 1643 .server = server, 1644 .bitmask = server->attr_bitmask, 1645 }; 1646 struct nfs_setattrres res = { 1647 .fattr = fattr, 1648 .server = server, 1649 }; 1650 struct rpc_message msg = { 1651 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETATTR], 1652 .rpc_argp = &arg, 1653 .rpc_resp = &res, 1654 .rpc_cred = cred, 1655 }; 1656 unsigned long timestamp = jiffies; 1657 int status; 1658 1659 nfs_fattr_init(fattr); 1660 1661 if (nfs4_copy_delegation_stateid(&arg.stateid, inode)) { 1662 /* Use that stateid */ 1663 } else if (state != NULL) { 1664 nfs4_copy_stateid(&arg.stateid, state, current->files); 1665 } else 1666 memcpy(&arg.stateid, &zero_stateid, sizeof(arg.stateid)); 1667 1668 status = nfs4_call_sync(server, &msg, &arg, &res, 1); 1669 if (status == 0 && state != NULL) 1670 renew_lease(server, timestamp); 1671 return status; 1672 } 1673 1674 static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred, 1675 struct nfs_fattr *fattr, struct iattr *sattr, 1676 struct nfs4_state *state) 1677 { 1678 struct nfs_server *server = NFS_SERVER(inode); 1679 struct nfs4_exception exception = { }; 1680 int err; 1681 do { 1682 err = nfs4_handle_exception(server, 1683 _nfs4_do_setattr(inode, cred, fattr, sattr, state), 1684 &exception); 1685 } while (exception.retry); 1686 return err; 1687 } 1688 1689 struct nfs4_closedata { 1690 struct path path; 1691 struct inode *inode; 1692 struct nfs4_state *state; 1693 struct nfs_closeargs arg; 1694 struct nfs_closeres res; 1695 struct nfs_fattr fattr; 1696 unsigned long timestamp; 1697 }; 1698 1699 static void nfs4_free_closedata(void *data) 1700 { 1701 struct nfs4_closedata *calldata = data; 1702 struct nfs4_state_owner *sp = calldata->state->owner; 1703 1704 nfs4_put_open_state(calldata->state); 1705 nfs_free_seqid(calldata->arg.seqid); 1706 nfs4_put_state_owner(sp); 1707 path_put(&calldata->path); 1708 kfree(calldata); 1709 } 1710 1711 static void nfs4_close_done(struct rpc_task *task, void *data) 1712 { 1713 struct nfs4_closedata *calldata = data; 1714 struct nfs4_state *state = calldata->state; 1715 struct nfs_server *server = NFS_SERVER(calldata->inode); 1716 1717 nfs4_sequence_done(server, &calldata->res.seq_res, task->tk_status); 1718 if (RPC_ASSASSINATED(task)) 1719 return; 1720 /* hmm. we are done with the inode, and in the process of freeing 1721 * the state_owner. we keep this around to process errors 1722 */ 1723 switch (task->tk_status) { 1724 case 0: 1725 nfs_set_open_stateid(state, &calldata->res.stateid, 0); 1726 renew_lease(server, calldata->timestamp); 1727 break; 1728 case -NFS4ERR_STALE_STATEID: 1729 case -NFS4ERR_OLD_STATEID: 1730 case -NFS4ERR_BAD_STATEID: 1731 case -NFS4ERR_EXPIRED: 1732 if (calldata->arg.fmode == 0) 1733 break; 1734 default: 1735 if (nfs4_async_handle_error(task, server, state) == -EAGAIN) { 1736 nfs4_restart_rpc(task, server->nfs_client); 1737 return; 1738 } 1739 } 1740 nfs4_sequence_free_slot(server->nfs_client, &calldata->res.seq_res); 1741 nfs_refresh_inode(calldata->inode, calldata->res.fattr); 1742 } 1743 1744 static void nfs4_close_prepare(struct rpc_task *task, void *data) 1745 { 1746 struct nfs4_closedata *calldata = data; 1747 struct nfs4_state *state = calldata->state; 1748 int clear_rd, clear_wr, clear_rdwr; 1749 1750 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0) 1751 return; 1752 1753 clear_rd = clear_wr = clear_rdwr = 0; 1754 spin_lock(&state->owner->so_lock); 1755 /* Calculate the change in open mode */ 1756 if (state->n_rdwr == 0) { 1757 if (state->n_rdonly == 0) { 1758 clear_rd |= test_and_clear_bit(NFS_O_RDONLY_STATE, &state->flags); 1759 clear_rdwr |= test_and_clear_bit(NFS_O_RDWR_STATE, &state->flags); 1760 } 1761 if (state->n_wronly == 0) { 1762 clear_wr |= test_and_clear_bit(NFS_O_WRONLY_STATE, &state->flags); 1763 clear_rdwr |= test_and_clear_bit(NFS_O_RDWR_STATE, &state->flags); 1764 } 1765 } 1766 spin_unlock(&state->owner->so_lock); 1767 if (!clear_rd && !clear_wr && !clear_rdwr) { 1768 /* Note: exit _without_ calling nfs4_close_done */ 1769 task->tk_action = NULL; 1770 return; 1771 } 1772 nfs_fattr_init(calldata->res.fattr); 1773 if (test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0) { 1774 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE]; 1775 calldata->arg.fmode = FMODE_READ; 1776 } else if (test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0) { 1777 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE]; 1778 calldata->arg.fmode = FMODE_WRITE; 1779 } 1780 calldata->timestamp = jiffies; 1781 if (nfs4_setup_sequence((NFS_SERVER(calldata->inode))->nfs_client, 1782 &calldata->arg.seq_args, &calldata->res.seq_res, 1783 1, task)) 1784 return; 1785 rpc_call_start(task); 1786 } 1787 1788 static const struct rpc_call_ops nfs4_close_ops = { 1789 .rpc_call_prepare = nfs4_close_prepare, 1790 .rpc_call_done = nfs4_close_done, 1791 .rpc_release = nfs4_free_closedata, 1792 }; 1793 1794 /* 1795 * It is possible for data to be read/written from a mem-mapped file 1796 * after the sys_close call (which hits the vfs layer as a flush). 1797 * This means that we can't safely call nfsv4 close on a file until 1798 * the inode is cleared. This in turn means that we are not good 1799 * NFSv4 citizens - we do not indicate to the server to update the file's 1800 * share state even when we are done with one of the three share 1801 * stateid's in the inode. 1802 * 1803 * NOTE: Caller must be holding the sp->so_owner semaphore! 1804 */ 1805 int nfs4_do_close(struct path *path, struct nfs4_state *state, int wait) 1806 { 1807 struct nfs_server *server = NFS_SERVER(state->inode); 1808 struct nfs4_closedata *calldata; 1809 struct nfs4_state_owner *sp = state->owner; 1810 struct rpc_task *task; 1811 struct rpc_message msg = { 1812 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE], 1813 .rpc_cred = state->owner->so_cred, 1814 }; 1815 struct rpc_task_setup task_setup_data = { 1816 .rpc_client = server->client, 1817 .rpc_message = &msg, 1818 .callback_ops = &nfs4_close_ops, 1819 .workqueue = nfsiod_workqueue, 1820 .flags = RPC_TASK_ASYNC, 1821 }; 1822 int status = -ENOMEM; 1823 1824 calldata = kzalloc(sizeof(*calldata), GFP_KERNEL); 1825 if (calldata == NULL) 1826 goto out; 1827 calldata->inode = state->inode; 1828 calldata->state = state; 1829 calldata->arg.fh = NFS_FH(state->inode); 1830 calldata->arg.stateid = &state->open_stateid; 1831 if (nfs4_has_session(server->nfs_client)) 1832 memset(calldata->arg.stateid->data, 0, 4); /* clear seqid */ 1833 /* Serialization for the sequence id */ 1834 calldata->arg.seqid = nfs_alloc_seqid(&state->owner->so_seqid); 1835 if (calldata->arg.seqid == NULL) 1836 goto out_free_calldata; 1837 calldata->arg.fmode = 0; 1838 calldata->arg.bitmask = server->cache_consistency_bitmask; 1839 calldata->res.fattr = &calldata->fattr; 1840 calldata->res.seqid = calldata->arg.seqid; 1841 calldata->res.server = server; 1842 calldata->res.seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE; 1843 calldata->path.mnt = mntget(path->mnt); 1844 calldata->path.dentry = dget(path->dentry); 1845 1846 msg.rpc_argp = &calldata->arg, 1847 msg.rpc_resp = &calldata->res, 1848 task_setup_data.callback_data = calldata; 1849 task = rpc_run_task(&task_setup_data); 1850 if (IS_ERR(task)) 1851 return PTR_ERR(task); 1852 status = 0; 1853 if (wait) 1854 status = rpc_wait_for_completion_task(task); 1855 rpc_put_task(task); 1856 return status; 1857 out_free_calldata: 1858 kfree(calldata); 1859 out: 1860 nfs4_put_open_state(state); 1861 nfs4_put_state_owner(sp); 1862 return status; 1863 } 1864 1865 static int nfs4_intent_set_file(struct nameidata *nd, struct path *path, struct nfs4_state *state, fmode_t fmode) 1866 { 1867 struct file *filp; 1868 int ret; 1869 1870 /* If the open_intent is for execute, we have an extra check to make */ 1871 if (fmode & FMODE_EXEC) { 1872 ret = nfs_may_open(state->inode, 1873 state->owner->so_cred, 1874 nd->intent.open.flags); 1875 if (ret < 0) 1876 goto out_close; 1877 } 1878 filp = lookup_instantiate_filp(nd, path->dentry, NULL); 1879 if (!IS_ERR(filp)) { 1880 struct nfs_open_context *ctx; 1881 ctx = nfs_file_open_context(filp); 1882 ctx->state = state; 1883 return 0; 1884 } 1885 ret = PTR_ERR(filp); 1886 out_close: 1887 nfs4_close_sync(path, state, fmode & (FMODE_READ|FMODE_WRITE)); 1888 return ret; 1889 } 1890 1891 struct dentry * 1892 nfs4_atomic_open(struct inode *dir, struct dentry *dentry, struct nameidata *nd) 1893 { 1894 struct path path = { 1895 .mnt = nd->path.mnt, 1896 .dentry = dentry, 1897 }; 1898 struct dentry *parent; 1899 struct iattr attr; 1900 struct rpc_cred *cred; 1901 struct nfs4_state *state; 1902 struct dentry *res; 1903 fmode_t fmode = nd->intent.open.flags & (FMODE_READ | FMODE_WRITE | FMODE_EXEC); 1904 1905 if (nd->flags & LOOKUP_CREATE) { 1906 attr.ia_mode = nd->intent.open.create_mode; 1907 attr.ia_valid = ATTR_MODE; 1908 if (!IS_POSIXACL(dir)) 1909 attr.ia_mode &= ~current_umask(); 1910 } else { 1911 attr.ia_valid = 0; 1912 BUG_ON(nd->intent.open.flags & O_CREAT); 1913 } 1914 1915 cred = rpc_lookup_cred(); 1916 if (IS_ERR(cred)) 1917 return (struct dentry *)cred; 1918 parent = dentry->d_parent; 1919 /* Protect against concurrent sillydeletes */ 1920 nfs_block_sillyrename(parent); 1921 state = nfs4_do_open(dir, &path, fmode, nd->intent.open.flags, &attr, cred); 1922 put_rpccred(cred); 1923 if (IS_ERR(state)) { 1924 if (PTR_ERR(state) == -ENOENT) { 1925 d_add(dentry, NULL); 1926 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 1927 } 1928 nfs_unblock_sillyrename(parent); 1929 return (struct dentry *)state; 1930 } 1931 res = d_add_unique(dentry, igrab(state->inode)); 1932 if (res != NULL) 1933 path.dentry = res; 1934 nfs_set_verifier(path.dentry, nfs_save_change_attribute(dir)); 1935 nfs_unblock_sillyrename(parent); 1936 nfs4_intent_set_file(nd, &path, state, fmode); 1937 return res; 1938 } 1939 1940 int 1941 nfs4_open_revalidate(struct inode *dir, struct dentry *dentry, int openflags, struct nameidata *nd) 1942 { 1943 struct path path = { 1944 .mnt = nd->path.mnt, 1945 .dentry = dentry, 1946 }; 1947 struct rpc_cred *cred; 1948 struct nfs4_state *state; 1949 fmode_t fmode = openflags & (FMODE_READ | FMODE_WRITE); 1950 1951 cred = rpc_lookup_cred(); 1952 if (IS_ERR(cred)) 1953 return PTR_ERR(cred); 1954 state = nfs4_do_open(dir, &path, fmode, openflags, NULL, cred); 1955 put_rpccred(cred); 1956 if (IS_ERR(state)) { 1957 switch (PTR_ERR(state)) { 1958 case -EPERM: 1959 case -EACCES: 1960 case -EDQUOT: 1961 case -ENOSPC: 1962 case -EROFS: 1963 lookup_instantiate_filp(nd, (struct dentry *)state, NULL); 1964 return 1; 1965 default: 1966 goto out_drop; 1967 } 1968 } 1969 if (state->inode == dentry->d_inode) { 1970 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 1971 nfs4_intent_set_file(nd, &path, state, fmode); 1972 return 1; 1973 } 1974 nfs4_close_sync(&path, state, fmode); 1975 out_drop: 1976 d_drop(dentry); 1977 return 0; 1978 } 1979 1980 void nfs4_close_context(struct nfs_open_context *ctx, int is_sync) 1981 { 1982 if (ctx->state == NULL) 1983 return; 1984 if (is_sync) 1985 nfs4_close_sync(&ctx->path, ctx->state, ctx->mode); 1986 else 1987 nfs4_close_state(&ctx->path, ctx->state, ctx->mode); 1988 } 1989 1990 static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle) 1991 { 1992 struct nfs4_server_caps_arg args = { 1993 .fhandle = fhandle, 1994 }; 1995 struct nfs4_server_caps_res res = {}; 1996 struct rpc_message msg = { 1997 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SERVER_CAPS], 1998 .rpc_argp = &args, 1999 .rpc_resp = &res, 2000 }; 2001 int status; 2002 2003 status = nfs4_call_sync(server, &msg, &args, &res, 0); 2004 if (status == 0) { 2005 memcpy(server->attr_bitmask, res.attr_bitmask, sizeof(server->attr_bitmask)); 2006 server->caps &= ~(NFS_CAP_ACLS|NFS_CAP_HARDLINKS| 2007 NFS_CAP_SYMLINKS|NFS_CAP_FILEID| 2008 NFS_CAP_MODE|NFS_CAP_NLINK|NFS_CAP_OWNER| 2009 NFS_CAP_OWNER_GROUP|NFS_CAP_ATIME| 2010 NFS_CAP_CTIME|NFS_CAP_MTIME); 2011 if (res.attr_bitmask[0] & FATTR4_WORD0_ACL) 2012 server->caps |= NFS_CAP_ACLS; 2013 if (res.has_links != 0) 2014 server->caps |= NFS_CAP_HARDLINKS; 2015 if (res.has_symlinks != 0) 2016 server->caps |= NFS_CAP_SYMLINKS; 2017 if (res.attr_bitmask[0] & FATTR4_WORD0_FILEID) 2018 server->caps |= NFS_CAP_FILEID; 2019 if (res.attr_bitmask[1] & FATTR4_WORD1_MODE) 2020 server->caps |= NFS_CAP_MODE; 2021 if (res.attr_bitmask[1] & FATTR4_WORD1_NUMLINKS) 2022 server->caps |= NFS_CAP_NLINK; 2023 if (res.attr_bitmask[1] & FATTR4_WORD1_OWNER) 2024 server->caps |= NFS_CAP_OWNER; 2025 if (res.attr_bitmask[1] & FATTR4_WORD1_OWNER_GROUP) 2026 server->caps |= NFS_CAP_OWNER_GROUP; 2027 if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_ACCESS) 2028 server->caps |= NFS_CAP_ATIME; 2029 if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_METADATA) 2030 server->caps |= NFS_CAP_CTIME; 2031 if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_MODIFY) 2032 server->caps |= NFS_CAP_MTIME; 2033 2034 memcpy(server->cache_consistency_bitmask, res.attr_bitmask, sizeof(server->cache_consistency_bitmask)); 2035 server->cache_consistency_bitmask[0] &= FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE; 2036 server->cache_consistency_bitmask[1] &= FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY; 2037 server->acl_bitmask = res.acl_bitmask; 2038 } 2039 2040 return status; 2041 } 2042 2043 int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle) 2044 { 2045 struct nfs4_exception exception = { }; 2046 int err; 2047 do { 2048 err = nfs4_handle_exception(server, 2049 _nfs4_server_capabilities(server, fhandle), 2050 &exception); 2051 } while (exception.retry); 2052 return err; 2053 } 2054 2055 static int _nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle, 2056 struct nfs_fsinfo *info) 2057 { 2058 struct nfs4_lookup_root_arg args = { 2059 .bitmask = nfs4_fattr_bitmap, 2060 }; 2061 struct nfs4_lookup_res res = { 2062 .server = server, 2063 .fattr = info->fattr, 2064 .fh = fhandle, 2065 }; 2066 struct rpc_message msg = { 2067 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP_ROOT], 2068 .rpc_argp = &args, 2069 .rpc_resp = &res, 2070 }; 2071 2072 nfs_fattr_init(info->fattr); 2073 return nfs4_call_sync(server, &msg, &args, &res, 0); 2074 } 2075 2076 static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle, 2077 struct nfs_fsinfo *info) 2078 { 2079 struct nfs4_exception exception = { }; 2080 int err; 2081 do { 2082 err = nfs4_handle_exception(server, 2083 _nfs4_lookup_root(server, fhandle, info), 2084 &exception); 2085 } while (exception.retry); 2086 return err; 2087 } 2088 2089 /* 2090 * get the file handle for the "/" directory on the server 2091 */ 2092 static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, 2093 struct nfs_fsinfo *info) 2094 { 2095 int status; 2096 2097 status = nfs4_lookup_root(server, fhandle, info); 2098 if (status == 0) 2099 status = nfs4_server_capabilities(server, fhandle); 2100 if (status == 0) 2101 status = nfs4_do_fsinfo(server, fhandle, info); 2102 return nfs4_map_errors(status); 2103 } 2104 2105 /* 2106 * Get locations and (maybe) other attributes of a referral. 2107 * Note that we'll actually follow the referral later when 2108 * we detect fsid mismatch in inode revalidation 2109 */ 2110 static int nfs4_get_referral(struct inode *dir, const struct qstr *name, struct nfs_fattr *fattr, struct nfs_fh *fhandle) 2111 { 2112 int status = -ENOMEM; 2113 struct page *page = NULL; 2114 struct nfs4_fs_locations *locations = NULL; 2115 2116 page = alloc_page(GFP_KERNEL); 2117 if (page == NULL) 2118 goto out; 2119 locations = kmalloc(sizeof(struct nfs4_fs_locations), GFP_KERNEL); 2120 if (locations == NULL) 2121 goto out; 2122 2123 status = nfs4_proc_fs_locations(dir, name, locations, page); 2124 if (status != 0) 2125 goto out; 2126 /* Make sure server returned a different fsid for the referral */ 2127 if (nfs_fsid_equal(&NFS_SERVER(dir)->fsid, &locations->fattr.fsid)) { 2128 dprintk("%s: server did not return a different fsid for a referral at %s\n", __func__, name->name); 2129 status = -EIO; 2130 goto out; 2131 } 2132 2133 memcpy(fattr, &locations->fattr, sizeof(struct nfs_fattr)); 2134 fattr->valid |= NFS_ATTR_FATTR_V4_REFERRAL; 2135 if (!fattr->mode) 2136 fattr->mode = S_IFDIR; 2137 memset(fhandle, 0, sizeof(struct nfs_fh)); 2138 out: 2139 if (page) 2140 __free_page(page); 2141 if (locations) 2142 kfree(locations); 2143 return status; 2144 } 2145 2146 static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr) 2147 { 2148 struct nfs4_getattr_arg args = { 2149 .fh = fhandle, 2150 .bitmask = server->attr_bitmask, 2151 }; 2152 struct nfs4_getattr_res res = { 2153 .fattr = fattr, 2154 .server = server, 2155 }; 2156 struct rpc_message msg = { 2157 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETATTR], 2158 .rpc_argp = &args, 2159 .rpc_resp = &res, 2160 }; 2161 2162 nfs_fattr_init(fattr); 2163 return nfs4_call_sync(server, &msg, &args, &res, 0); 2164 } 2165 2166 static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr) 2167 { 2168 struct nfs4_exception exception = { }; 2169 int err; 2170 do { 2171 err = nfs4_handle_exception(server, 2172 _nfs4_proc_getattr(server, fhandle, fattr), 2173 &exception); 2174 } while (exception.retry); 2175 return err; 2176 } 2177 2178 /* 2179 * The file is not closed if it is opened due to the a request to change 2180 * the size of the file. The open call will not be needed once the 2181 * VFS layer lookup-intents are implemented. 2182 * 2183 * Close is called when the inode is destroyed. 2184 * If we haven't opened the file for O_WRONLY, we 2185 * need to in the size_change case to obtain a stateid. 2186 * 2187 * Got race? 2188 * Because OPEN is always done by name in nfsv4, it is 2189 * possible that we opened a different file by the same 2190 * name. We can recognize this race condition, but we 2191 * can't do anything about it besides returning an error. 2192 * 2193 * This will be fixed with VFS changes (lookup-intent). 2194 */ 2195 static int 2196 nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr, 2197 struct iattr *sattr) 2198 { 2199 struct inode *inode = dentry->d_inode; 2200 struct rpc_cred *cred = NULL; 2201 struct nfs4_state *state = NULL; 2202 int status; 2203 2204 nfs_fattr_init(fattr); 2205 2206 /* Search for an existing open(O_WRITE) file */ 2207 if (sattr->ia_valid & ATTR_FILE) { 2208 struct nfs_open_context *ctx; 2209 2210 ctx = nfs_file_open_context(sattr->ia_file); 2211 if (ctx) { 2212 cred = ctx->cred; 2213 state = ctx->state; 2214 } 2215 } 2216 2217 status = nfs4_do_setattr(inode, cred, fattr, sattr, state); 2218 if (status == 0) 2219 nfs_setattr_update_inode(inode, sattr); 2220 return status; 2221 } 2222 2223 static int _nfs4_proc_lookupfh(struct nfs_server *server, const struct nfs_fh *dirfh, 2224 const struct qstr *name, struct nfs_fh *fhandle, 2225 struct nfs_fattr *fattr) 2226 { 2227 int status; 2228 struct nfs4_lookup_arg args = { 2229 .bitmask = server->attr_bitmask, 2230 .dir_fh = dirfh, 2231 .name = name, 2232 }; 2233 struct nfs4_lookup_res res = { 2234 .server = server, 2235 .fattr = fattr, 2236 .fh = fhandle, 2237 }; 2238 struct rpc_message msg = { 2239 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP], 2240 .rpc_argp = &args, 2241 .rpc_resp = &res, 2242 }; 2243 2244 nfs_fattr_init(fattr); 2245 2246 dprintk("NFS call lookupfh %s\n", name->name); 2247 status = nfs4_call_sync(server, &msg, &args, &res, 0); 2248 dprintk("NFS reply lookupfh: %d\n", status); 2249 return status; 2250 } 2251 2252 static int nfs4_proc_lookupfh(struct nfs_server *server, struct nfs_fh *dirfh, 2253 struct qstr *name, struct nfs_fh *fhandle, 2254 struct nfs_fattr *fattr) 2255 { 2256 struct nfs4_exception exception = { }; 2257 int err; 2258 do { 2259 err = _nfs4_proc_lookupfh(server, dirfh, name, fhandle, fattr); 2260 /* FIXME: !!!! */ 2261 if (err == -NFS4ERR_MOVED) { 2262 err = -EREMOTE; 2263 break; 2264 } 2265 err = nfs4_handle_exception(server, err, &exception); 2266 } while (exception.retry); 2267 return err; 2268 } 2269 2270 static int _nfs4_proc_lookup(struct inode *dir, const struct qstr *name, 2271 struct nfs_fh *fhandle, struct nfs_fattr *fattr) 2272 { 2273 int status; 2274 2275 dprintk("NFS call lookup %s\n", name->name); 2276 status = _nfs4_proc_lookupfh(NFS_SERVER(dir), NFS_FH(dir), name, fhandle, fattr); 2277 if (status == -NFS4ERR_MOVED) 2278 status = nfs4_get_referral(dir, name, fattr, fhandle); 2279 dprintk("NFS reply lookup: %d\n", status); 2280 return status; 2281 } 2282 2283 static int nfs4_proc_lookup(struct inode *dir, struct qstr *name, struct nfs_fh *fhandle, struct nfs_fattr *fattr) 2284 { 2285 struct nfs4_exception exception = { }; 2286 int err; 2287 do { 2288 err = nfs4_handle_exception(NFS_SERVER(dir), 2289 _nfs4_proc_lookup(dir, name, fhandle, fattr), 2290 &exception); 2291 } while (exception.retry); 2292 return err; 2293 } 2294 2295 static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry) 2296 { 2297 struct nfs_server *server = NFS_SERVER(inode); 2298 struct nfs_fattr fattr; 2299 struct nfs4_accessargs args = { 2300 .fh = NFS_FH(inode), 2301 .bitmask = server->attr_bitmask, 2302 }; 2303 struct nfs4_accessres res = { 2304 .server = server, 2305 .fattr = &fattr, 2306 }; 2307 struct rpc_message msg = { 2308 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ACCESS], 2309 .rpc_argp = &args, 2310 .rpc_resp = &res, 2311 .rpc_cred = entry->cred, 2312 }; 2313 int mode = entry->mask; 2314 int status; 2315 2316 /* 2317 * Determine which access bits we want to ask for... 2318 */ 2319 if (mode & MAY_READ) 2320 args.access |= NFS4_ACCESS_READ; 2321 if (S_ISDIR(inode->i_mode)) { 2322 if (mode & MAY_WRITE) 2323 args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE; 2324 if (mode & MAY_EXEC) 2325 args.access |= NFS4_ACCESS_LOOKUP; 2326 } else { 2327 if (mode & MAY_WRITE) 2328 args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND; 2329 if (mode & MAY_EXEC) 2330 args.access |= NFS4_ACCESS_EXECUTE; 2331 } 2332 nfs_fattr_init(&fattr); 2333 status = nfs4_call_sync(server, &msg, &args, &res, 0); 2334 if (!status) { 2335 entry->mask = 0; 2336 if (res.access & NFS4_ACCESS_READ) 2337 entry->mask |= MAY_READ; 2338 if (res.access & (NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE)) 2339 entry->mask |= MAY_WRITE; 2340 if (res.access & (NFS4_ACCESS_LOOKUP|NFS4_ACCESS_EXECUTE)) 2341 entry->mask |= MAY_EXEC; 2342 nfs_refresh_inode(inode, &fattr); 2343 } 2344 return status; 2345 } 2346 2347 static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry) 2348 { 2349 struct nfs4_exception exception = { }; 2350 int err; 2351 do { 2352 err = nfs4_handle_exception(NFS_SERVER(inode), 2353 _nfs4_proc_access(inode, entry), 2354 &exception); 2355 } while (exception.retry); 2356 return err; 2357 } 2358 2359 /* 2360 * TODO: For the time being, we don't try to get any attributes 2361 * along with any of the zero-copy operations READ, READDIR, 2362 * READLINK, WRITE. 2363 * 2364 * In the case of the first three, we want to put the GETATTR 2365 * after the read-type operation -- this is because it is hard 2366 * to predict the length of a GETATTR response in v4, and thus 2367 * align the READ data correctly. This means that the GETATTR 2368 * may end up partially falling into the page cache, and we should 2369 * shift it into the 'tail' of the xdr_buf before processing. 2370 * To do this efficiently, we need to know the total length 2371 * of data received, which doesn't seem to be available outside 2372 * of the RPC layer. 2373 * 2374 * In the case of WRITE, we also want to put the GETATTR after 2375 * the operation -- in this case because we want to make sure 2376 * we get the post-operation mtime and size. This means that 2377 * we can't use xdr_encode_pages() as written: we need a variant 2378 * of it which would leave room in the 'tail' iovec. 2379 * 2380 * Both of these changes to the XDR layer would in fact be quite 2381 * minor, but I decided to leave them for a subsequent patch. 2382 */ 2383 static int _nfs4_proc_readlink(struct inode *inode, struct page *page, 2384 unsigned int pgbase, unsigned int pglen) 2385 { 2386 struct nfs4_readlink args = { 2387 .fh = NFS_FH(inode), 2388 .pgbase = pgbase, 2389 .pglen = pglen, 2390 .pages = &page, 2391 }; 2392 struct nfs4_readlink_res res; 2393 struct rpc_message msg = { 2394 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READLINK], 2395 .rpc_argp = &args, 2396 .rpc_resp = &res, 2397 }; 2398 2399 return nfs4_call_sync(NFS_SERVER(inode), &msg, &args, &res, 0); 2400 } 2401 2402 static int nfs4_proc_readlink(struct inode *inode, struct page *page, 2403 unsigned int pgbase, unsigned int pglen) 2404 { 2405 struct nfs4_exception exception = { }; 2406 int err; 2407 do { 2408 err = nfs4_handle_exception(NFS_SERVER(inode), 2409 _nfs4_proc_readlink(inode, page, pgbase, pglen), 2410 &exception); 2411 } while (exception.retry); 2412 return err; 2413 } 2414 2415 /* 2416 * Got race? 2417 * We will need to arrange for the VFS layer to provide an atomic open. 2418 * Until then, this create/open method is prone to inefficiency and race 2419 * conditions due to the lookup, create, and open VFS calls from sys_open() 2420 * placed on the wire. 2421 * 2422 * Given the above sorry state of affairs, I'm simply sending an OPEN. 2423 * The file will be opened again in the subsequent VFS open call 2424 * (nfs4_proc_file_open). 2425 * 2426 * The open for read will just hang around to be used by any process that 2427 * opens the file O_RDONLY. This will all be resolved with the VFS changes. 2428 */ 2429 2430 static int 2431 nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, 2432 int flags, struct nameidata *nd) 2433 { 2434 struct path path = { 2435 .mnt = nd->path.mnt, 2436 .dentry = dentry, 2437 }; 2438 struct nfs4_state *state; 2439 struct rpc_cred *cred; 2440 fmode_t fmode = flags & (FMODE_READ | FMODE_WRITE); 2441 int status = 0; 2442 2443 cred = rpc_lookup_cred(); 2444 if (IS_ERR(cred)) { 2445 status = PTR_ERR(cred); 2446 goto out; 2447 } 2448 state = nfs4_do_open(dir, &path, fmode, flags, sattr, cred); 2449 d_drop(dentry); 2450 if (IS_ERR(state)) { 2451 status = PTR_ERR(state); 2452 goto out_putcred; 2453 } 2454 d_add(dentry, igrab(state->inode)); 2455 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 2456 if (flags & O_EXCL) { 2457 struct nfs_fattr fattr; 2458 status = nfs4_do_setattr(state->inode, cred, &fattr, sattr, state); 2459 if (status == 0) 2460 nfs_setattr_update_inode(state->inode, sattr); 2461 nfs_post_op_update_inode(state->inode, &fattr); 2462 } 2463 if (status == 0 && (nd->flags & LOOKUP_OPEN) != 0) 2464 status = nfs4_intent_set_file(nd, &path, state, fmode); 2465 else 2466 nfs4_close_sync(&path, state, fmode); 2467 out_putcred: 2468 put_rpccred(cred); 2469 out: 2470 return status; 2471 } 2472 2473 static int _nfs4_proc_remove(struct inode *dir, struct qstr *name) 2474 { 2475 struct nfs_server *server = NFS_SERVER(dir); 2476 struct nfs_removeargs args = { 2477 .fh = NFS_FH(dir), 2478 .name.len = name->len, 2479 .name.name = name->name, 2480 .bitmask = server->attr_bitmask, 2481 }; 2482 struct nfs_removeres res = { 2483 .server = server, 2484 }; 2485 struct rpc_message msg = { 2486 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE], 2487 .rpc_argp = &args, 2488 .rpc_resp = &res, 2489 }; 2490 int status; 2491 2492 nfs_fattr_init(&res.dir_attr); 2493 status = nfs4_call_sync(server, &msg, &args, &res, 1); 2494 if (status == 0) { 2495 update_changeattr(dir, &res.cinfo); 2496 nfs_post_op_update_inode(dir, &res.dir_attr); 2497 } 2498 return status; 2499 } 2500 2501 static int nfs4_proc_remove(struct inode *dir, struct qstr *name) 2502 { 2503 struct nfs4_exception exception = { }; 2504 int err; 2505 do { 2506 err = nfs4_handle_exception(NFS_SERVER(dir), 2507 _nfs4_proc_remove(dir, name), 2508 &exception); 2509 } while (exception.retry); 2510 return err; 2511 } 2512 2513 static void nfs4_proc_unlink_setup(struct rpc_message *msg, struct inode *dir) 2514 { 2515 struct nfs_server *server = NFS_SERVER(dir); 2516 struct nfs_removeargs *args = msg->rpc_argp; 2517 struct nfs_removeres *res = msg->rpc_resp; 2518 2519 args->bitmask = server->cache_consistency_bitmask; 2520 res->server = server; 2521 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE]; 2522 } 2523 2524 static int nfs4_proc_unlink_done(struct rpc_task *task, struct inode *dir) 2525 { 2526 struct nfs_removeres *res = task->tk_msg.rpc_resp; 2527 2528 nfs4_sequence_done(res->server, &res->seq_res, task->tk_status); 2529 if (nfs4_async_handle_error(task, res->server, NULL) == -EAGAIN) 2530 return 0; 2531 nfs4_sequence_free_slot(res->server->nfs_client, &res->seq_res); 2532 update_changeattr(dir, &res->cinfo); 2533 nfs_post_op_update_inode(dir, &res->dir_attr); 2534 return 1; 2535 } 2536 2537 static int _nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name, 2538 struct inode *new_dir, struct qstr *new_name) 2539 { 2540 struct nfs_server *server = NFS_SERVER(old_dir); 2541 struct nfs4_rename_arg arg = { 2542 .old_dir = NFS_FH(old_dir), 2543 .new_dir = NFS_FH(new_dir), 2544 .old_name = old_name, 2545 .new_name = new_name, 2546 .bitmask = server->attr_bitmask, 2547 }; 2548 struct nfs_fattr old_fattr, new_fattr; 2549 struct nfs4_rename_res res = { 2550 .server = server, 2551 .old_fattr = &old_fattr, 2552 .new_fattr = &new_fattr, 2553 }; 2554 struct rpc_message msg = { 2555 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENAME], 2556 .rpc_argp = &arg, 2557 .rpc_resp = &res, 2558 }; 2559 int status; 2560 2561 nfs_fattr_init(res.old_fattr); 2562 nfs_fattr_init(res.new_fattr); 2563 status = nfs4_call_sync(server, &msg, &arg, &res, 1); 2564 2565 if (!status) { 2566 update_changeattr(old_dir, &res.old_cinfo); 2567 nfs_post_op_update_inode(old_dir, res.old_fattr); 2568 update_changeattr(new_dir, &res.new_cinfo); 2569 nfs_post_op_update_inode(new_dir, res.new_fattr); 2570 } 2571 return status; 2572 } 2573 2574 static int nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name, 2575 struct inode *new_dir, struct qstr *new_name) 2576 { 2577 struct nfs4_exception exception = { }; 2578 int err; 2579 do { 2580 err = nfs4_handle_exception(NFS_SERVER(old_dir), 2581 _nfs4_proc_rename(old_dir, old_name, 2582 new_dir, new_name), 2583 &exception); 2584 } while (exception.retry); 2585 return err; 2586 } 2587 2588 static int _nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name) 2589 { 2590 struct nfs_server *server = NFS_SERVER(inode); 2591 struct nfs4_link_arg arg = { 2592 .fh = NFS_FH(inode), 2593 .dir_fh = NFS_FH(dir), 2594 .name = name, 2595 .bitmask = server->attr_bitmask, 2596 }; 2597 struct nfs_fattr fattr, dir_attr; 2598 struct nfs4_link_res res = { 2599 .server = server, 2600 .fattr = &fattr, 2601 .dir_attr = &dir_attr, 2602 }; 2603 struct rpc_message msg = { 2604 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LINK], 2605 .rpc_argp = &arg, 2606 .rpc_resp = &res, 2607 }; 2608 int status; 2609 2610 nfs_fattr_init(res.fattr); 2611 nfs_fattr_init(res.dir_attr); 2612 status = nfs4_call_sync(server, &msg, &arg, &res, 1); 2613 if (!status) { 2614 update_changeattr(dir, &res.cinfo); 2615 nfs_post_op_update_inode(dir, res.dir_attr); 2616 nfs_post_op_update_inode(inode, res.fattr); 2617 } 2618 2619 return status; 2620 } 2621 2622 static int nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name) 2623 { 2624 struct nfs4_exception exception = { }; 2625 int err; 2626 do { 2627 err = nfs4_handle_exception(NFS_SERVER(inode), 2628 _nfs4_proc_link(inode, dir, name), 2629 &exception); 2630 } while (exception.retry); 2631 return err; 2632 } 2633 2634 struct nfs4_createdata { 2635 struct rpc_message msg; 2636 struct nfs4_create_arg arg; 2637 struct nfs4_create_res res; 2638 struct nfs_fh fh; 2639 struct nfs_fattr fattr; 2640 struct nfs_fattr dir_fattr; 2641 }; 2642 2643 static struct nfs4_createdata *nfs4_alloc_createdata(struct inode *dir, 2644 struct qstr *name, struct iattr *sattr, u32 ftype) 2645 { 2646 struct nfs4_createdata *data; 2647 2648 data = kzalloc(sizeof(*data), GFP_KERNEL); 2649 if (data != NULL) { 2650 struct nfs_server *server = NFS_SERVER(dir); 2651 2652 data->msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE]; 2653 data->msg.rpc_argp = &data->arg; 2654 data->msg.rpc_resp = &data->res; 2655 data->arg.dir_fh = NFS_FH(dir); 2656 data->arg.server = server; 2657 data->arg.name = name; 2658 data->arg.attrs = sattr; 2659 data->arg.ftype = ftype; 2660 data->arg.bitmask = server->attr_bitmask; 2661 data->res.server = server; 2662 data->res.fh = &data->fh; 2663 data->res.fattr = &data->fattr; 2664 data->res.dir_fattr = &data->dir_fattr; 2665 nfs_fattr_init(data->res.fattr); 2666 nfs_fattr_init(data->res.dir_fattr); 2667 } 2668 return data; 2669 } 2670 2671 static int nfs4_do_create(struct inode *dir, struct dentry *dentry, struct nfs4_createdata *data) 2672 { 2673 int status = nfs4_call_sync(NFS_SERVER(dir), &data->msg, 2674 &data->arg, &data->res, 1); 2675 if (status == 0) { 2676 update_changeattr(dir, &data->res.dir_cinfo); 2677 nfs_post_op_update_inode(dir, data->res.dir_fattr); 2678 status = nfs_instantiate(dentry, data->res.fh, data->res.fattr); 2679 } 2680 return status; 2681 } 2682 2683 static void nfs4_free_createdata(struct nfs4_createdata *data) 2684 { 2685 kfree(data); 2686 } 2687 2688 static int _nfs4_proc_symlink(struct inode *dir, struct dentry *dentry, 2689 struct page *page, unsigned int len, struct iattr *sattr) 2690 { 2691 struct nfs4_createdata *data; 2692 int status = -ENAMETOOLONG; 2693 2694 if (len > NFS4_MAXPATHLEN) 2695 goto out; 2696 2697 status = -ENOMEM; 2698 data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4LNK); 2699 if (data == NULL) 2700 goto out; 2701 2702 data->msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SYMLINK]; 2703 data->arg.u.symlink.pages = &page; 2704 data->arg.u.symlink.len = len; 2705 2706 status = nfs4_do_create(dir, dentry, data); 2707 2708 nfs4_free_createdata(data); 2709 out: 2710 return status; 2711 } 2712 2713 static int nfs4_proc_symlink(struct inode *dir, struct dentry *dentry, 2714 struct page *page, unsigned int len, struct iattr *sattr) 2715 { 2716 struct nfs4_exception exception = { }; 2717 int err; 2718 do { 2719 err = nfs4_handle_exception(NFS_SERVER(dir), 2720 _nfs4_proc_symlink(dir, dentry, page, 2721 len, sattr), 2722 &exception); 2723 } while (exception.retry); 2724 return err; 2725 } 2726 2727 static int _nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry, 2728 struct iattr *sattr) 2729 { 2730 struct nfs4_createdata *data; 2731 int status = -ENOMEM; 2732 2733 data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4DIR); 2734 if (data == NULL) 2735 goto out; 2736 2737 status = nfs4_do_create(dir, dentry, data); 2738 2739 nfs4_free_createdata(data); 2740 out: 2741 return status; 2742 } 2743 2744 static int nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry, 2745 struct iattr *sattr) 2746 { 2747 struct nfs4_exception exception = { }; 2748 int err; 2749 do { 2750 err = nfs4_handle_exception(NFS_SERVER(dir), 2751 _nfs4_proc_mkdir(dir, dentry, sattr), 2752 &exception); 2753 } while (exception.retry); 2754 return err; 2755 } 2756 2757 static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, 2758 u64 cookie, struct page *page, unsigned int count, int plus) 2759 { 2760 struct inode *dir = dentry->d_inode; 2761 struct nfs4_readdir_arg args = { 2762 .fh = NFS_FH(dir), 2763 .pages = &page, 2764 .pgbase = 0, 2765 .count = count, 2766 .bitmask = NFS_SERVER(dentry->d_inode)->cache_consistency_bitmask, 2767 }; 2768 struct nfs4_readdir_res res; 2769 struct rpc_message msg = { 2770 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READDIR], 2771 .rpc_argp = &args, 2772 .rpc_resp = &res, 2773 .rpc_cred = cred, 2774 }; 2775 int status; 2776 2777 dprintk("%s: dentry = %s/%s, cookie = %Lu\n", __func__, 2778 dentry->d_parent->d_name.name, 2779 dentry->d_name.name, 2780 (unsigned long long)cookie); 2781 nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args); 2782 res.pgbase = args.pgbase; 2783 status = nfs4_call_sync(NFS_SERVER(dir), &msg, &args, &res, 0); 2784 if (status == 0) 2785 memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE); 2786 2787 nfs_invalidate_atime(dir); 2788 2789 dprintk("%s: returns %d\n", __func__, status); 2790 return status; 2791 } 2792 2793 static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, 2794 u64 cookie, struct page *page, unsigned int count, int plus) 2795 { 2796 struct nfs4_exception exception = { }; 2797 int err; 2798 do { 2799 err = nfs4_handle_exception(NFS_SERVER(dentry->d_inode), 2800 _nfs4_proc_readdir(dentry, cred, cookie, 2801 page, count, plus), 2802 &exception); 2803 } while (exception.retry); 2804 return err; 2805 } 2806 2807 static int _nfs4_proc_mknod(struct inode *dir, struct dentry *dentry, 2808 struct iattr *sattr, dev_t rdev) 2809 { 2810 struct nfs4_createdata *data; 2811 int mode = sattr->ia_mode; 2812 int status = -ENOMEM; 2813 2814 BUG_ON(!(sattr->ia_valid & ATTR_MODE)); 2815 BUG_ON(!S_ISFIFO(mode) && !S_ISBLK(mode) && !S_ISCHR(mode) && !S_ISSOCK(mode)); 2816 2817 data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4SOCK); 2818 if (data == NULL) 2819 goto out; 2820 2821 if (S_ISFIFO(mode)) 2822 data->arg.ftype = NF4FIFO; 2823 else if (S_ISBLK(mode)) { 2824 data->arg.ftype = NF4BLK; 2825 data->arg.u.device.specdata1 = MAJOR(rdev); 2826 data->arg.u.device.specdata2 = MINOR(rdev); 2827 } 2828 else if (S_ISCHR(mode)) { 2829 data->arg.ftype = NF4CHR; 2830 data->arg.u.device.specdata1 = MAJOR(rdev); 2831 data->arg.u.device.specdata2 = MINOR(rdev); 2832 } 2833 2834 status = nfs4_do_create(dir, dentry, data); 2835 2836 nfs4_free_createdata(data); 2837 out: 2838 return status; 2839 } 2840 2841 static int nfs4_proc_mknod(struct inode *dir, struct dentry *dentry, 2842 struct iattr *sattr, dev_t rdev) 2843 { 2844 struct nfs4_exception exception = { }; 2845 int err; 2846 do { 2847 err = nfs4_handle_exception(NFS_SERVER(dir), 2848 _nfs4_proc_mknod(dir, dentry, sattr, rdev), 2849 &exception); 2850 } while (exception.retry); 2851 return err; 2852 } 2853 2854 static int _nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, 2855 struct nfs_fsstat *fsstat) 2856 { 2857 struct nfs4_statfs_arg args = { 2858 .fh = fhandle, 2859 .bitmask = server->attr_bitmask, 2860 }; 2861 struct nfs4_statfs_res res = { 2862 .fsstat = fsstat, 2863 }; 2864 struct rpc_message msg = { 2865 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_STATFS], 2866 .rpc_argp = &args, 2867 .rpc_resp = &res, 2868 }; 2869 2870 nfs_fattr_init(fsstat->fattr); 2871 return nfs4_call_sync(server, &msg, &args, &res, 0); 2872 } 2873 2874 static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *fsstat) 2875 { 2876 struct nfs4_exception exception = { }; 2877 int err; 2878 do { 2879 err = nfs4_handle_exception(server, 2880 _nfs4_proc_statfs(server, fhandle, fsstat), 2881 &exception); 2882 } while (exception.retry); 2883 return err; 2884 } 2885 2886 static int _nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, 2887 struct nfs_fsinfo *fsinfo) 2888 { 2889 struct nfs4_fsinfo_arg args = { 2890 .fh = fhandle, 2891 .bitmask = server->attr_bitmask, 2892 }; 2893 struct nfs4_fsinfo_res res = { 2894 .fsinfo = fsinfo, 2895 }; 2896 struct rpc_message msg = { 2897 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FSINFO], 2898 .rpc_argp = &args, 2899 .rpc_resp = &res, 2900 }; 2901 2902 return nfs4_call_sync(server, &msg, &args, &res, 0); 2903 } 2904 2905 static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo) 2906 { 2907 struct nfs4_exception exception = { }; 2908 int err; 2909 2910 do { 2911 err = nfs4_handle_exception(server, 2912 _nfs4_do_fsinfo(server, fhandle, fsinfo), 2913 &exception); 2914 } while (exception.retry); 2915 return err; 2916 } 2917 2918 static int nfs4_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo) 2919 { 2920 nfs_fattr_init(fsinfo->fattr); 2921 return nfs4_do_fsinfo(server, fhandle, fsinfo); 2922 } 2923 2924 static int _nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle, 2925 struct nfs_pathconf *pathconf) 2926 { 2927 struct nfs4_pathconf_arg args = { 2928 .fh = fhandle, 2929 .bitmask = server->attr_bitmask, 2930 }; 2931 struct nfs4_pathconf_res res = { 2932 .pathconf = pathconf, 2933 }; 2934 struct rpc_message msg = { 2935 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_PATHCONF], 2936 .rpc_argp = &args, 2937 .rpc_resp = &res, 2938 }; 2939 2940 /* None of the pathconf attributes are mandatory to implement */ 2941 if ((args.bitmask[0] & nfs4_pathconf_bitmap[0]) == 0) { 2942 memset(pathconf, 0, sizeof(*pathconf)); 2943 return 0; 2944 } 2945 2946 nfs_fattr_init(pathconf->fattr); 2947 return nfs4_call_sync(server, &msg, &args, &res, 0); 2948 } 2949 2950 static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle, 2951 struct nfs_pathconf *pathconf) 2952 { 2953 struct nfs4_exception exception = { }; 2954 int err; 2955 2956 do { 2957 err = nfs4_handle_exception(server, 2958 _nfs4_proc_pathconf(server, fhandle, pathconf), 2959 &exception); 2960 } while (exception.retry); 2961 return err; 2962 } 2963 2964 static int nfs4_read_done(struct rpc_task *task, struct nfs_read_data *data) 2965 { 2966 struct nfs_server *server = NFS_SERVER(data->inode); 2967 2968 dprintk("--> %s\n", __func__); 2969 2970 /* nfs4_sequence_free_slot called in the read rpc_call_done */ 2971 nfs4_sequence_done(server, &data->res.seq_res, task->tk_status); 2972 2973 if (nfs4_async_handle_error(task, server, data->args.context->state) == -EAGAIN) { 2974 nfs4_restart_rpc(task, server->nfs_client); 2975 return -EAGAIN; 2976 } 2977 2978 nfs_invalidate_atime(data->inode); 2979 if (task->tk_status > 0) 2980 renew_lease(server, data->timestamp); 2981 return 0; 2982 } 2983 2984 static void nfs4_proc_read_setup(struct nfs_read_data *data, struct rpc_message *msg) 2985 { 2986 data->timestamp = jiffies; 2987 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ]; 2988 } 2989 2990 static int nfs4_write_done(struct rpc_task *task, struct nfs_write_data *data) 2991 { 2992 struct inode *inode = data->inode; 2993 2994 /* slot is freed in nfs_writeback_done */ 2995 nfs4_sequence_done(NFS_SERVER(inode), &data->res.seq_res, 2996 task->tk_status); 2997 2998 if (nfs4_async_handle_error(task, NFS_SERVER(inode), data->args.context->state) == -EAGAIN) { 2999 nfs4_restart_rpc(task, NFS_SERVER(inode)->nfs_client); 3000 return -EAGAIN; 3001 } 3002 if (task->tk_status >= 0) { 3003 renew_lease(NFS_SERVER(inode), data->timestamp); 3004 nfs_post_op_update_inode_force_wcc(inode, data->res.fattr); 3005 } 3006 return 0; 3007 } 3008 3009 static void nfs4_proc_write_setup(struct nfs_write_data *data, struct rpc_message *msg) 3010 { 3011 struct nfs_server *server = NFS_SERVER(data->inode); 3012 3013 data->args.bitmask = server->cache_consistency_bitmask; 3014 data->res.server = server; 3015 data->timestamp = jiffies; 3016 3017 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE]; 3018 } 3019 3020 static int nfs4_commit_done(struct rpc_task *task, struct nfs_write_data *data) 3021 { 3022 struct inode *inode = data->inode; 3023 3024 nfs4_sequence_done(NFS_SERVER(inode), &data->res.seq_res, 3025 task->tk_status); 3026 if (nfs4_async_handle_error(task, NFS_SERVER(inode), NULL) == -EAGAIN) { 3027 nfs4_restart_rpc(task, NFS_SERVER(inode)->nfs_client); 3028 return -EAGAIN; 3029 } 3030 nfs4_sequence_free_slot(NFS_SERVER(inode)->nfs_client, 3031 &data->res.seq_res); 3032 nfs_refresh_inode(inode, data->res.fattr); 3033 return 0; 3034 } 3035 3036 static void nfs4_proc_commit_setup(struct nfs_write_data *data, struct rpc_message *msg) 3037 { 3038 struct nfs_server *server = NFS_SERVER(data->inode); 3039 3040 data->args.bitmask = server->cache_consistency_bitmask; 3041 data->res.server = server; 3042 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT]; 3043 } 3044 3045 /* 3046 * nfs4_proc_async_renew(): This is not one of the nfs_rpc_ops; it is a special 3047 * standalone procedure for queueing an asynchronous RENEW. 3048 */ 3049 static void nfs4_renew_done(struct rpc_task *task, void *data) 3050 { 3051 struct nfs_client *clp = (struct nfs_client *)task->tk_msg.rpc_argp; 3052 unsigned long timestamp = (unsigned long)data; 3053 3054 if (task->tk_status < 0) { 3055 /* Unless we're shutting down, schedule state recovery! */ 3056 if (test_bit(NFS_CS_RENEWD, &clp->cl_res_state) != 0) 3057 nfs4_schedule_state_recovery(clp); 3058 return; 3059 } 3060 spin_lock(&clp->cl_lock); 3061 if (time_before(clp->cl_last_renewal,timestamp)) 3062 clp->cl_last_renewal = timestamp; 3063 spin_unlock(&clp->cl_lock); 3064 dprintk("%s calling put_rpccred on rpc_cred %p\n", __func__, 3065 task->tk_msg.rpc_cred); 3066 put_rpccred(task->tk_msg.rpc_cred); 3067 } 3068 3069 static const struct rpc_call_ops nfs4_renew_ops = { 3070 .rpc_call_done = nfs4_renew_done, 3071 }; 3072 3073 int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred) 3074 { 3075 struct rpc_message msg = { 3076 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW], 3077 .rpc_argp = clp, 3078 .rpc_cred = cred, 3079 }; 3080 3081 return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_SOFT, 3082 &nfs4_renew_ops, (void *)jiffies); 3083 } 3084 3085 int nfs4_proc_renew(struct nfs_client *clp, struct rpc_cred *cred) 3086 { 3087 struct rpc_message msg = { 3088 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW], 3089 .rpc_argp = clp, 3090 .rpc_cred = cred, 3091 }; 3092 unsigned long now = jiffies; 3093 int status; 3094 3095 status = rpc_call_sync(clp->cl_rpcclient, &msg, 0); 3096 if (status < 0) 3097 return status; 3098 spin_lock(&clp->cl_lock); 3099 if (time_before(clp->cl_last_renewal,now)) 3100 clp->cl_last_renewal = now; 3101 spin_unlock(&clp->cl_lock); 3102 return 0; 3103 } 3104 3105 static inline int nfs4_server_supports_acls(struct nfs_server *server) 3106 { 3107 return (server->caps & NFS_CAP_ACLS) 3108 && (server->acl_bitmask & ACL4_SUPPORT_ALLOW_ACL) 3109 && (server->acl_bitmask & ACL4_SUPPORT_DENY_ACL); 3110 } 3111 3112 /* Assuming that XATTR_SIZE_MAX is a multiple of PAGE_CACHE_SIZE, and that 3113 * it's OK to put sizeof(void) * (XATTR_SIZE_MAX/PAGE_CACHE_SIZE) bytes on 3114 * the stack. 3115 */ 3116 #define NFS4ACL_MAXPAGES (XATTR_SIZE_MAX >> PAGE_CACHE_SHIFT) 3117 3118 static void buf_to_pages(const void *buf, size_t buflen, 3119 struct page **pages, unsigned int *pgbase) 3120 { 3121 const void *p = buf; 3122 3123 *pgbase = offset_in_page(buf); 3124 p -= *pgbase; 3125 while (p < buf + buflen) { 3126 *(pages++) = virt_to_page(p); 3127 p += PAGE_CACHE_SIZE; 3128 } 3129 } 3130 3131 struct nfs4_cached_acl { 3132 int cached; 3133 size_t len; 3134 char data[0]; 3135 }; 3136 3137 static void nfs4_set_cached_acl(struct inode *inode, struct nfs4_cached_acl *acl) 3138 { 3139 struct nfs_inode *nfsi = NFS_I(inode); 3140 3141 spin_lock(&inode->i_lock); 3142 kfree(nfsi->nfs4_acl); 3143 nfsi->nfs4_acl = acl; 3144 spin_unlock(&inode->i_lock); 3145 } 3146 3147 static void nfs4_zap_acl_attr(struct inode *inode) 3148 { 3149 nfs4_set_cached_acl(inode, NULL); 3150 } 3151 3152 static inline ssize_t nfs4_read_cached_acl(struct inode *inode, char *buf, size_t buflen) 3153 { 3154 struct nfs_inode *nfsi = NFS_I(inode); 3155 struct nfs4_cached_acl *acl; 3156 int ret = -ENOENT; 3157 3158 spin_lock(&inode->i_lock); 3159 acl = nfsi->nfs4_acl; 3160 if (acl == NULL) 3161 goto out; 3162 if (buf == NULL) /* user is just asking for length */ 3163 goto out_len; 3164 if (acl->cached == 0) 3165 goto out; 3166 ret = -ERANGE; /* see getxattr(2) man page */ 3167 if (acl->len > buflen) 3168 goto out; 3169 memcpy(buf, acl->data, acl->len); 3170 out_len: 3171 ret = acl->len; 3172 out: 3173 spin_unlock(&inode->i_lock); 3174 return ret; 3175 } 3176 3177 static void nfs4_write_cached_acl(struct inode *inode, const char *buf, size_t acl_len) 3178 { 3179 struct nfs4_cached_acl *acl; 3180 3181 if (buf && acl_len <= PAGE_SIZE) { 3182 acl = kmalloc(sizeof(*acl) + acl_len, GFP_KERNEL); 3183 if (acl == NULL) 3184 goto out; 3185 acl->cached = 1; 3186 memcpy(acl->data, buf, acl_len); 3187 } else { 3188 acl = kmalloc(sizeof(*acl), GFP_KERNEL); 3189 if (acl == NULL) 3190 goto out; 3191 acl->cached = 0; 3192 } 3193 acl->len = acl_len; 3194 out: 3195 nfs4_set_cached_acl(inode, acl); 3196 } 3197 3198 static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen) 3199 { 3200 struct page *pages[NFS4ACL_MAXPAGES]; 3201 struct nfs_getaclargs args = { 3202 .fh = NFS_FH(inode), 3203 .acl_pages = pages, 3204 .acl_len = buflen, 3205 }; 3206 struct nfs_getaclres res = { 3207 .acl_len = buflen, 3208 }; 3209 void *resp_buf; 3210 struct rpc_message msg = { 3211 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETACL], 3212 .rpc_argp = &args, 3213 .rpc_resp = &res, 3214 }; 3215 struct page *localpage = NULL; 3216 int ret; 3217 3218 if (buflen < PAGE_SIZE) { 3219 /* As long as we're doing a round trip to the server anyway, 3220 * let's be prepared for a page of acl data. */ 3221 localpage = alloc_page(GFP_KERNEL); 3222 resp_buf = page_address(localpage); 3223 if (localpage == NULL) 3224 return -ENOMEM; 3225 args.acl_pages[0] = localpage; 3226 args.acl_pgbase = 0; 3227 args.acl_len = PAGE_SIZE; 3228 } else { 3229 resp_buf = buf; 3230 buf_to_pages(buf, buflen, args.acl_pages, &args.acl_pgbase); 3231 } 3232 ret = nfs4_call_sync(NFS_SERVER(inode), &msg, &args, &res, 0); 3233 if (ret) 3234 goto out_free; 3235 if (res.acl_len > args.acl_len) 3236 nfs4_write_cached_acl(inode, NULL, res.acl_len); 3237 else 3238 nfs4_write_cached_acl(inode, resp_buf, res.acl_len); 3239 if (buf) { 3240 ret = -ERANGE; 3241 if (res.acl_len > buflen) 3242 goto out_free; 3243 if (localpage) 3244 memcpy(buf, resp_buf, res.acl_len); 3245 } 3246 ret = res.acl_len; 3247 out_free: 3248 if (localpage) 3249 __free_page(localpage); 3250 return ret; 3251 } 3252 3253 static ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen) 3254 { 3255 struct nfs4_exception exception = { }; 3256 ssize_t ret; 3257 do { 3258 ret = __nfs4_get_acl_uncached(inode, buf, buflen); 3259 if (ret >= 0) 3260 break; 3261 ret = nfs4_handle_exception(NFS_SERVER(inode), ret, &exception); 3262 } while (exception.retry); 3263 return ret; 3264 } 3265 3266 static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen) 3267 { 3268 struct nfs_server *server = NFS_SERVER(inode); 3269 int ret; 3270 3271 if (!nfs4_server_supports_acls(server)) 3272 return -EOPNOTSUPP; 3273 ret = nfs_revalidate_inode(server, inode); 3274 if (ret < 0) 3275 return ret; 3276 ret = nfs4_read_cached_acl(inode, buf, buflen); 3277 if (ret != -ENOENT) 3278 return ret; 3279 return nfs4_get_acl_uncached(inode, buf, buflen); 3280 } 3281 3282 static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen) 3283 { 3284 struct nfs_server *server = NFS_SERVER(inode); 3285 struct page *pages[NFS4ACL_MAXPAGES]; 3286 struct nfs_setaclargs arg = { 3287 .fh = NFS_FH(inode), 3288 .acl_pages = pages, 3289 .acl_len = buflen, 3290 }; 3291 struct nfs_setaclres res; 3292 struct rpc_message msg = { 3293 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETACL], 3294 .rpc_argp = &arg, 3295 .rpc_resp = &res, 3296 }; 3297 int ret; 3298 3299 if (!nfs4_server_supports_acls(server)) 3300 return -EOPNOTSUPP; 3301 nfs_inode_return_delegation(inode); 3302 buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase); 3303 ret = nfs4_call_sync(server, &msg, &arg, &res, 1); 3304 nfs_access_zap_cache(inode); 3305 nfs_zap_acl_cache(inode); 3306 return ret; 3307 } 3308 3309 static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen) 3310 { 3311 struct nfs4_exception exception = { }; 3312 int err; 3313 do { 3314 err = nfs4_handle_exception(NFS_SERVER(inode), 3315 __nfs4_proc_set_acl(inode, buf, buflen), 3316 &exception); 3317 } while (exception.retry); 3318 return err; 3319 } 3320 3321 static int 3322 _nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server, struct nfs_client *clp, struct nfs4_state *state) 3323 { 3324 if (!clp || task->tk_status >= 0) 3325 return 0; 3326 switch(task->tk_status) { 3327 case -NFS4ERR_ADMIN_REVOKED: 3328 case -NFS4ERR_BAD_STATEID: 3329 case -NFS4ERR_OPENMODE: 3330 if (state == NULL) 3331 break; 3332 nfs4_state_mark_reclaim_nograce(clp, state); 3333 case -NFS4ERR_STALE_CLIENTID: 3334 case -NFS4ERR_STALE_STATEID: 3335 case -NFS4ERR_EXPIRED: 3336 rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL); 3337 nfs4_schedule_state_recovery(clp); 3338 if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0) 3339 rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task); 3340 task->tk_status = 0; 3341 return -EAGAIN; 3342 #if defined(CONFIG_NFS_V4_1) 3343 case -NFS4ERR_BADSESSION: 3344 case -NFS4ERR_BADSLOT: 3345 case -NFS4ERR_BAD_HIGH_SLOT: 3346 case -NFS4ERR_DEADSESSION: 3347 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: 3348 case -NFS4ERR_SEQ_FALSE_RETRY: 3349 case -NFS4ERR_SEQ_MISORDERED: 3350 dprintk("%s ERROR %d, Reset session\n", __func__, 3351 task->tk_status); 3352 set_bit(NFS4CLNT_SESSION_SETUP, &clp->cl_state); 3353 task->tk_status = 0; 3354 return -EAGAIN; 3355 #endif /* CONFIG_NFS_V4_1 */ 3356 case -NFS4ERR_DELAY: 3357 if (server) 3358 nfs_inc_server_stats(server, NFSIOS_DELAY); 3359 case -NFS4ERR_GRACE: 3360 rpc_delay(task, NFS4_POLL_RETRY_MAX); 3361 task->tk_status = 0; 3362 return -EAGAIN; 3363 case -NFS4ERR_OLD_STATEID: 3364 task->tk_status = 0; 3365 return -EAGAIN; 3366 } 3367 task->tk_status = nfs4_map_errors(task->tk_status); 3368 return 0; 3369 } 3370 3371 static int 3372 nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server, struct nfs4_state *state) 3373 { 3374 return _nfs4_async_handle_error(task, server, server->nfs_client, state); 3375 } 3376 3377 int nfs4_proc_setclientid(struct nfs_client *clp, u32 program, unsigned short port, struct rpc_cred *cred) 3378 { 3379 nfs4_verifier sc_verifier; 3380 struct nfs4_setclientid setclientid = { 3381 .sc_verifier = &sc_verifier, 3382 .sc_prog = program, 3383 }; 3384 struct rpc_message msg = { 3385 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID], 3386 .rpc_argp = &setclientid, 3387 .rpc_resp = clp, 3388 .rpc_cred = cred, 3389 }; 3390 __be32 *p; 3391 int loop = 0; 3392 int status; 3393 3394 p = (__be32*)sc_verifier.data; 3395 *p++ = htonl((u32)clp->cl_boot_time.tv_sec); 3396 *p = htonl((u32)clp->cl_boot_time.tv_nsec); 3397 3398 for(;;) { 3399 setclientid.sc_name_len = scnprintf(setclientid.sc_name, 3400 sizeof(setclientid.sc_name), "%s/%s %s %s %u", 3401 clp->cl_ipaddr, 3402 rpc_peeraddr2str(clp->cl_rpcclient, 3403 RPC_DISPLAY_ADDR), 3404 rpc_peeraddr2str(clp->cl_rpcclient, 3405 RPC_DISPLAY_PROTO), 3406 clp->cl_rpcclient->cl_auth->au_ops->au_name, 3407 clp->cl_id_uniquifier); 3408 setclientid.sc_netid_len = scnprintf(setclientid.sc_netid, 3409 sizeof(setclientid.sc_netid), 3410 rpc_peeraddr2str(clp->cl_rpcclient, 3411 RPC_DISPLAY_NETID)); 3412 setclientid.sc_uaddr_len = scnprintf(setclientid.sc_uaddr, 3413 sizeof(setclientid.sc_uaddr), "%s.%u.%u", 3414 clp->cl_ipaddr, port >> 8, port & 255); 3415 3416 status = rpc_call_sync(clp->cl_rpcclient, &msg, 0); 3417 if (status != -NFS4ERR_CLID_INUSE) 3418 break; 3419 if (signalled()) 3420 break; 3421 if (loop++ & 1) 3422 ssleep(clp->cl_lease_time + 1); 3423 else 3424 if (++clp->cl_id_uniquifier == 0) 3425 break; 3426 } 3427 return status; 3428 } 3429 3430 static int _nfs4_proc_setclientid_confirm(struct nfs_client *clp, struct rpc_cred *cred) 3431 { 3432 struct nfs_fsinfo fsinfo; 3433 struct rpc_message msg = { 3434 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID_CONFIRM], 3435 .rpc_argp = clp, 3436 .rpc_resp = &fsinfo, 3437 .rpc_cred = cred, 3438 }; 3439 unsigned long now; 3440 int status; 3441 3442 now = jiffies; 3443 status = rpc_call_sync(clp->cl_rpcclient, &msg, 0); 3444 if (status == 0) { 3445 spin_lock(&clp->cl_lock); 3446 clp->cl_lease_time = fsinfo.lease_time * HZ; 3447 clp->cl_last_renewal = now; 3448 spin_unlock(&clp->cl_lock); 3449 } 3450 return status; 3451 } 3452 3453 int nfs4_proc_setclientid_confirm(struct nfs_client *clp, struct rpc_cred *cred) 3454 { 3455 long timeout = 0; 3456 int err; 3457 do { 3458 err = _nfs4_proc_setclientid_confirm(clp, cred); 3459 switch (err) { 3460 case 0: 3461 return err; 3462 case -NFS4ERR_RESOURCE: 3463 /* The IBM lawyers misread another document! */ 3464 case -NFS4ERR_DELAY: 3465 err = nfs4_delay(clp->cl_rpcclient, &timeout); 3466 } 3467 } while (err == 0); 3468 return err; 3469 } 3470 3471 struct nfs4_delegreturndata { 3472 struct nfs4_delegreturnargs args; 3473 struct nfs4_delegreturnres res; 3474 struct nfs_fh fh; 3475 nfs4_stateid stateid; 3476 unsigned long timestamp; 3477 struct nfs_fattr fattr; 3478 int rpc_status; 3479 }; 3480 3481 static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata) 3482 { 3483 struct nfs4_delegreturndata *data = calldata; 3484 3485 nfs4_sequence_done_free_slot(data->res.server, &data->res.seq_res, 3486 task->tk_status); 3487 3488 data->rpc_status = task->tk_status; 3489 if (data->rpc_status == 0) 3490 renew_lease(data->res.server, data->timestamp); 3491 } 3492 3493 static void nfs4_delegreturn_release(void *calldata) 3494 { 3495 kfree(calldata); 3496 } 3497 3498 #if defined(CONFIG_NFS_V4_1) 3499 static void nfs4_delegreturn_prepare(struct rpc_task *task, void *data) 3500 { 3501 struct nfs4_delegreturndata *d_data; 3502 3503 d_data = (struct nfs4_delegreturndata *)data; 3504 3505 if (nfs4_setup_sequence(d_data->res.server->nfs_client, 3506 &d_data->args.seq_args, 3507 &d_data->res.seq_res, 1, task)) 3508 return; 3509 rpc_call_start(task); 3510 } 3511 #endif /* CONFIG_NFS_V4_1 */ 3512 3513 static const struct rpc_call_ops nfs4_delegreturn_ops = { 3514 #if defined(CONFIG_NFS_V4_1) 3515 .rpc_call_prepare = nfs4_delegreturn_prepare, 3516 #endif /* CONFIG_NFS_V4_1 */ 3517 .rpc_call_done = nfs4_delegreturn_done, 3518 .rpc_release = nfs4_delegreturn_release, 3519 }; 3520 3521 static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync) 3522 { 3523 struct nfs4_delegreturndata *data; 3524 struct nfs_server *server = NFS_SERVER(inode); 3525 struct rpc_task *task; 3526 struct rpc_message msg = { 3527 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DELEGRETURN], 3528 .rpc_cred = cred, 3529 }; 3530 struct rpc_task_setup task_setup_data = { 3531 .rpc_client = server->client, 3532 .rpc_message = &msg, 3533 .callback_ops = &nfs4_delegreturn_ops, 3534 .flags = RPC_TASK_ASYNC, 3535 }; 3536 int status = 0; 3537 3538 data = kzalloc(sizeof(*data), GFP_KERNEL); 3539 if (data == NULL) 3540 return -ENOMEM; 3541 data->args.fhandle = &data->fh; 3542 data->args.stateid = &data->stateid; 3543 data->args.bitmask = server->attr_bitmask; 3544 nfs_copy_fh(&data->fh, NFS_FH(inode)); 3545 memcpy(&data->stateid, stateid, sizeof(data->stateid)); 3546 data->res.fattr = &data->fattr; 3547 data->res.server = server; 3548 data->res.seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE; 3549 nfs_fattr_init(data->res.fattr); 3550 data->timestamp = jiffies; 3551 data->rpc_status = 0; 3552 3553 task_setup_data.callback_data = data; 3554 msg.rpc_argp = &data->args, 3555 msg.rpc_resp = &data->res, 3556 task = rpc_run_task(&task_setup_data); 3557 if (IS_ERR(task)) 3558 return PTR_ERR(task); 3559 if (!issync) 3560 goto out; 3561 status = nfs4_wait_for_completion_rpc_task(task); 3562 if (status != 0) 3563 goto out; 3564 status = data->rpc_status; 3565 if (status != 0) 3566 goto out; 3567 nfs_refresh_inode(inode, &data->fattr); 3568 out: 3569 rpc_put_task(task); 3570 return status; 3571 } 3572 3573 int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync) 3574 { 3575 struct nfs_server *server = NFS_SERVER(inode); 3576 struct nfs4_exception exception = { }; 3577 int err; 3578 do { 3579 err = _nfs4_proc_delegreturn(inode, cred, stateid, issync); 3580 switch (err) { 3581 case -NFS4ERR_STALE_STATEID: 3582 case -NFS4ERR_EXPIRED: 3583 case 0: 3584 return 0; 3585 } 3586 err = nfs4_handle_exception(server, err, &exception); 3587 } while (exception.retry); 3588 return err; 3589 } 3590 3591 #define NFS4_LOCK_MINTIMEOUT (1 * HZ) 3592 #define NFS4_LOCK_MAXTIMEOUT (30 * HZ) 3593 3594 /* 3595 * sleep, with exponential backoff, and retry the LOCK operation. 3596 */ 3597 static unsigned long 3598 nfs4_set_lock_task_retry(unsigned long timeout) 3599 { 3600 schedule_timeout_killable(timeout); 3601 timeout <<= 1; 3602 if (timeout > NFS4_LOCK_MAXTIMEOUT) 3603 return NFS4_LOCK_MAXTIMEOUT; 3604 return timeout; 3605 } 3606 3607 static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request) 3608 { 3609 struct inode *inode = state->inode; 3610 struct nfs_server *server = NFS_SERVER(inode); 3611 struct nfs_client *clp = server->nfs_client; 3612 struct nfs_lockt_args arg = { 3613 .fh = NFS_FH(inode), 3614 .fl = request, 3615 }; 3616 struct nfs_lockt_res res = { 3617 .denied = request, 3618 }; 3619 struct rpc_message msg = { 3620 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKT], 3621 .rpc_argp = &arg, 3622 .rpc_resp = &res, 3623 .rpc_cred = state->owner->so_cred, 3624 }; 3625 struct nfs4_lock_state *lsp; 3626 int status; 3627 3628 arg.lock_owner.clientid = clp->cl_clientid; 3629 status = nfs4_set_lock_state(state, request); 3630 if (status != 0) 3631 goto out; 3632 lsp = request->fl_u.nfs4_fl.owner; 3633 arg.lock_owner.id = lsp->ls_id.id; 3634 status = nfs4_call_sync(server, &msg, &arg, &res, 1); 3635 switch (status) { 3636 case 0: 3637 request->fl_type = F_UNLCK; 3638 break; 3639 case -NFS4ERR_DENIED: 3640 status = 0; 3641 } 3642 request->fl_ops->fl_release_private(request); 3643 out: 3644 return status; 3645 } 3646 3647 static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request) 3648 { 3649 struct nfs4_exception exception = { }; 3650 int err; 3651 3652 do { 3653 err = nfs4_handle_exception(NFS_SERVER(state->inode), 3654 _nfs4_proc_getlk(state, cmd, request), 3655 &exception); 3656 } while (exception.retry); 3657 return err; 3658 } 3659 3660 static int do_vfs_lock(struct file *file, struct file_lock *fl) 3661 { 3662 int res = 0; 3663 switch (fl->fl_flags & (FL_POSIX|FL_FLOCK)) { 3664 case FL_POSIX: 3665 res = posix_lock_file_wait(file, fl); 3666 break; 3667 case FL_FLOCK: 3668 res = flock_lock_file_wait(file, fl); 3669 break; 3670 default: 3671 BUG(); 3672 } 3673 return res; 3674 } 3675 3676 struct nfs4_unlockdata { 3677 struct nfs_locku_args arg; 3678 struct nfs_locku_res res; 3679 struct nfs4_lock_state *lsp; 3680 struct nfs_open_context *ctx; 3681 struct file_lock fl; 3682 const struct nfs_server *server; 3683 unsigned long timestamp; 3684 }; 3685 3686 static struct nfs4_unlockdata *nfs4_alloc_unlockdata(struct file_lock *fl, 3687 struct nfs_open_context *ctx, 3688 struct nfs4_lock_state *lsp, 3689 struct nfs_seqid *seqid) 3690 { 3691 struct nfs4_unlockdata *p; 3692 struct inode *inode = lsp->ls_state->inode; 3693 3694 p = kzalloc(sizeof(*p), GFP_KERNEL); 3695 if (p == NULL) 3696 return NULL; 3697 p->arg.fh = NFS_FH(inode); 3698 p->arg.fl = &p->fl; 3699 p->arg.seqid = seqid; 3700 p->res.seqid = seqid; 3701 p->res.seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE; 3702 p->arg.stateid = &lsp->ls_stateid; 3703 p->lsp = lsp; 3704 atomic_inc(&lsp->ls_count); 3705 /* Ensure we don't close file until we're done freeing locks! */ 3706 p->ctx = get_nfs_open_context(ctx); 3707 memcpy(&p->fl, fl, sizeof(p->fl)); 3708 p->server = NFS_SERVER(inode); 3709 return p; 3710 } 3711 3712 static void nfs4_locku_release_calldata(void *data) 3713 { 3714 struct nfs4_unlockdata *calldata = data; 3715 nfs_free_seqid(calldata->arg.seqid); 3716 nfs4_put_lock_state(calldata->lsp); 3717 put_nfs_open_context(calldata->ctx); 3718 kfree(calldata); 3719 } 3720 3721 static void nfs4_locku_done(struct rpc_task *task, void *data) 3722 { 3723 struct nfs4_unlockdata *calldata = data; 3724 3725 nfs4_sequence_done(calldata->server, &calldata->res.seq_res, 3726 task->tk_status); 3727 if (RPC_ASSASSINATED(task)) 3728 return; 3729 switch (task->tk_status) { 3730 case 0: 3731 memcpy(calldata->lsp->ls_stateid.data, 3732 calldata->res.stateid.data, 3733 sizeof(calldata->lsp->ls_stateid.data)); 3734 renew_lease(calldata->server, calldata->timestamp); 3735 break; 3736 case -NFS4ERR_BAD_STATEID: 3737 case -NFS4ERR_OLD_STATEID: 3738 case -NFS4ERR_STALE_STATEID: 3739 case -NFS4ERR_EXPIRED: 3740 break; 3741 default: 3742 if (nfs4_async_handle_error(task, calldata->server, NULL) == -EAGAIN) 3743 nfs4_restart_rpc(task, 3744 calldata->server->nfs_client); 3745 } 3746 nfs4_sequence_free_slot(calldata->server->nfs_client, 3747 &calldata->res.seq_res); 3748 } 3749 3750 static void nfs4_locku_prepare(struct rpc_task *task, void *data) 3751 { 3752 struct nfs4_unlockdata *calldata = data; 3753 3754 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0) 3755 return; 3756 if ((calldata->lsp->ls_flags & NFS_LOCK_INITIALIZED) == 0) { 3757 /* Note: exit _without_ running nfs4_locku_done */ 3758 task->tk_action = NULL; 3759 return; 3760 } 3761 calldata->timestamp = jiffies; 3762 if (nfs4_setup_sequence(calldata->server->nfs_client, 3763 &calldata->arg.seq_args, 3764 &calldata->res.seq_res, 1, task)) 3765 return; 3766 rpc_call_start(task); 3767 } 3768 3769 static const struct rpc_call_ops nfs4_locku_ops = { 3770 .rpc_call_prepare = nfs4_locku_prepare, 3771 .rpc_call_done = nfs4_locku_done, 3772 .rpc_release = nfs4_locku_release_calldata, 3773 }; 3774 3775 static struct rpc_task *nfs4_do_unlck(struct file_lock *fl, 3776 struct nfs_open_context *ctx, 3777 struct nfs4_lock_state *lsp, 3778 struct nfs_seqid *seqid) 3779 { 3780 struct nfs4_unlockdata *data; 3781 struct rpc_message msg = { 3782 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKU], 3783 .rpc_cred = ctx->cred, 3784 }; 3785 struct rpc_task_setup task_setup_data = { 3786 .rpc_client = NFS_CLIENT(lsp->ls_state->inode), 3787 .rpc_message = &msg, 3788 .callback_ops = &nfs4_locku_ops, 3789 .workqueue = nfsiod_workqueue, 3790 .flags = RPC_TASK_ASYNC, 3791 }; 3792 3793 /* Ensure this is an unlock - when canceling a lock, the 3794 * canceled lock is passed in, and it won't be an unlock. 3795 */ 3796 fl->fl_type = F_UNLCK; 3797 3798 data = nfs4_alloc_unlockdata(fl, ctx, lsp, seqid); 3799 if (data == NULL) { 3800 nfs_free_seqid(seqid); 3801 return ERR_PTR(-ENOMEM); 3802 } 3803 3804 msg.rpc_argp = &data->arg, 3805 msg.rpc_resp = &data->res, 3806 task_setup_data.callback_data = data; 3807 return rpc_run_task(&task_setup_data); 3808 } 3809 3810 static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request) 3811 { 3812 struct nfs_inode *nfsi = NFS_I(state->inode); 3813 struct nfs_seqid *seqid; 3814 struct nfs4_lock_state *lsp; 3815 struct rpc_task *task; 3816 int status = 0; 3817 unsigned char fl_flags = request->fl_flags; 3818 3819 status = nfs4_set_lock_state(state, request); 3820 /* Unlock _before_ we do the RPC call */ 3821 request->fl_flags |= FL_EXISTS; 3822 down_read(&nfsi->rwsem); 3823 if (do_vfs_lock(request->fl_file, request) == -ENOENT) { 3824 up_read(&nfsi->rwsem); 3825 goto out; 3826 } 3827 up_read(&nfsi->rwsem); 3828 if (status != 0) 3829 goto out; 3830 /* Is this a delegated lock? */ 3831 if (test_bit(NFS_DELEGATED_STATE, &state->flags)) 3832 goto out; 3833 lsp = request->fl_u.nfs4_fl.owner; 3834 seqid = nfs_alloc_seqid(&lsp->ls_seqid); 3835 status = -ENOMEM; 3836 if (seqid == NULL) 3837 goto out; 3838 task = nfs4_do_unlck(request, nfs_file_open_context(request->fl_file), lsp, seqid); 3839 status = PTR_ERR(task); 3840 if (IS_ERR(task)) 3841 goto out; 3842 status = nfs4_wait_for_completion_rpc_task(task); 3843 rpc_put_task(task); 3844 out: 3845 request->fl_flags = fl_flags; 3846 return status; 3847 } 3848 3849 struct nfs4_lockdata { 3850 struct nfs_lock_args arg; 3851 struct nfs_lock_res res; 3852 struct nfs4_lock_state *lsp; 3853 struct nfs_open_context *ctx; 3854 struct file_lock fl; 3855 unsigned long timestamp; 3856 int rpc_status; 3857 int cancelled; 3858 struct nfs_server *server; 3859 }; 3860 3861 static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl, 3862 struct nfs_open_context *ctx, struct nfs4_lock_state *lsp) 3863 { 3864 struct nfs4_lockdata *p; 3865 struct inode *inode = lsp->ls_state->inode; 3866 struct nfs_server *server = NFS_SERVER(inode); 3867 3868 p = kzalloc(sizeof(*p), GFP_KERNEL); 3869 if (p == NULL) 3870 return NULL; 3871 3872 p->arg.fh = NFS_FH(inode); 3873 p->arg.fl = &p->fl; 3874 p->arg.open_seqid = nfs_alloc_seqid(&lsp->ls_state->owner->so_seqid); 3875 if (p->arg.open_seqid == NULL) 3876 goto out_free; 3877 p->arg.lock_seqid = nfs_alloc_seqid(&lsp->ls_seqid); 3878 if (p->arg.lock_seqid == NULL) 3879 goto out_free_seqid; 3880 p->arg.lock_stateid = &lsp->ls_stateid; 3881 p->arg.lock_owner.clientid = server->nfs_client->cl_clientid; 3882 p->arg.lock_owner.id = lsp->ls_id.id; 3883 p->res.lock_seqid = p->arg.lock_seqid; 3884 p->res.seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE; 3885 p->lsp = lsp; 3886 p->server = server; 3887 atomic_inc(&lsp->ls_count); 3888 p->ctx = get_nfs_open_context(ctx); 3889 memcpy(&p->fl, fl, sizeof(p->fl)); 3890 return p; 3891 out_free_seqid: 3892 nfs_free_seqid(p->arg.open_seqid); 3893 out_free: 3894 kfree(p); 3895 return NULL; 3896 } 3897 3898 static void nfs4_lock_prepare(struct rpc_task *task, void *calldata) 3899 { 3900 struct nfs4_lockdata *data = calldata; 3901 struct nfs4_state *state = data->lsp->ls_state; 3902 3903 dprintk("%s: begin!\n", __func__); 3904 if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0) 3905 return; 3906 /* Do we need to do an open_to_lock_owner? */ 3907 if (!(data->arg.lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED)) { 3908 if (nfs_wait_on_sequence(data->arg.open_seqid, task) != 0) 3909 return; 3910 data->arg.open_stateid = &state->stateid; 3911 data->arg.new_lock_owner = 1; 3912 data->res.open_seqid = data->arg.open_seqid; 3913 } else 3914 data->arg.new_lock_owner = 0; 3915 data->timestamp = jiffies; 3916 if (nfs4_setup_sequence(data->server->nfs_client, &data->arg.seq_args, 3917 &data->res.seq_res, 1, task)) 3918 return; 3919 rpc_call_start(task); 3920 dprintk("%s: done!, ret = %d\n", __func__, data->rpc_status); 3921 } 3922 3923 static void nfs4_lock_done(struct rpc_task *task, void *calldata) 3924 { 3925 struct nfs4_lockdata *data = calldata; 3926 3927 dprintk("%s: begin!\n", __func__); 3928 3929 nfs4_sequence_done_free_slot(data->server, &data->res.seq_res, 3930 task->tk_status); 3931 3932 data->rpc_status = task->tk_status; 3933 if (RPC_ASSASSINATED(task)) 3934 goto out; 3935 if (data->arg.new_lock_owner != 0) { 3936 if (data->rpc_status == 0) 3937 nfs_confirm_seqid(&data->lsp->ls_seqid, 0); 3938 else 3939 goto out; 3940 } 3941 if (data->rpc_status == 0) { 3942 memcpy(data->lsp->ls_stateid.data, data->res.stateid.data, 3943 sizeof(data->lsp->ls_stateid.data)); 3944 data->lsp->ls_flags |= NFS_LOCK_INITIALIZED; 3945 renew_lease(NFS_SERVER(data->ctx->path.dentry->d_inode), data->timestamp); 3946 } 3947 out: 3948 dprintk("%s: done, ret = %d!\n", __func__, data->rpc_status); 3949 } 3950 3951 static void nfs4_lock_release(void *calldata) 3952 { 3953 struct nfs4_lockdata *data = calldata; 3954 3955 dprintk("%s: begin!\n", __func__); 3956 nfs_free_seqid(data->arg.open_seqid); 3957 if (data->cancelled != 0) { 3958 struct rpc_task *task; 3959 task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp, 3960 data->arg.lock_seqid); 3961 if (!IS_ERR(task)) 3962 rpc_put_task(task); 3963 dprintk("%s: cancelling lock!\n", __func__); 3964 } else 3965 nfs_free_seqid(data->arg.lock_seqid); 3966 nfs4_put_lock_state(data->lsp); 3967 put_nfs_open_context(data->ctx); 3968 kfree(data); 3969 dprintk("%s: done!\n", __func__); 3970 } 3971 3972 static const struct rpc_call_ops nfs4_lock_ops = { 3973 .rpc_call_prepare = nfs4_lock_prepare, 3974 .rpc_call_done = nfs4_lock_done, 3975 .rpc_release = nfs4_lock_release, 3976 }; 3977 3978 static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int reclaim) 3979 { 3980 struct nfs4_lockdata *data; 3981 struct rpc_task *task; 3982 struct rpc_message msg = { 3983 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCK], 3984 .rpc_cred = state->owner->so_cred, 3985 }; 3986 struct rpc_task_setup task_setup_data = { 3987 .rpc_client = NFS_CLIENT(state->inode), 3988 .rpc_message = &msg, 3989 .callback_ops = &nfs4_lock_ops, 3990 .workqueue = nfsiod_workqueue, 3991 .flags = RPC_TASK_ASYNC, 3992 }; 3993 int ret; 3994 3995 dprintk("%s: begin!\n", __func__); 3996 data = nfs4_alloc_lockdata(fl, nfs_file_open_context(fl->fl_file), 3997 fl->fl_u.nfs4_fl.owner); 3998 if (data == NULL) 3999 return -ENOMEM; 4000 if (IS_SETLKW(cmd)) 4001 data->arg.block = 1; 4002 if (reclaim != 0) 4003 data->arg.reclaim = 1; 4004 msg.rpc_argp = &data->arg, 4005 msg.rpc_resp = &data->res, 4006 task_setup_data.callback_data = data; 4007 task = rpc_run_task(&task_setup_data); 4008 if (IS_ERR(task)) 4009 return PTR_ERR(task); 4010 ret = nfs4_wait_for_completion_rpc_task(task); 4011 if (ret == 0) { 4012 ret = data->rpc_status; 4013 } else 4014 data->cancelled = 1; 4015 rpc_put_task(task); 4016 dprintk("%s: done, ret = %d!\n", __func__, ret); 4017 return ret; 4018 } 4019 4020 static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request) 4021 { 4022 struct nfs_server *server = NFS_SERVER(state->inode); 4023 struct nfs4_exception exception = { }; 4024 int err; 4025 4026 do { 4027 /* Cache the lock if possible... */ 4028 if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0) 4029 return 0; 4030 err = _nfs4_do_setlk(state, F_SETLK, request, 1); 4031 if (err != -NFS4ERR_DELAY) 4032 break; 4033 nfs4_handle_exception(server, err, &exception); 4034 } while (exception.retry); 4035 return err; 4036 } 4037 4038 static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request) 4039 { 4040 struct nfs_server *server = NFS_SERVER(state->inode); 4041 struct nfs4_exception exception = { }; 4042 int err; 4043 4044 err = nfs4_set_lock_state(state, request); 4045 if (err != 0) 4046 return err; 4047 do { 4048 if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0) 4049 return 0; 4050 err = _nfs4_do_setlk(state, F_SETLK, request, 0); 4051 if (err != -NFS4ERR_DELAY) 4052 break; 4053 nfs4_handle_exception(server, err, &exception); 4054 } while (exception.retry); 4055 return err; 4056 } 4057 4058 static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request) 4059 { 4060 struct nfs_inode *nfsi = NFS_I(state->inode); 4061 unsigned char fl_flags = request->fl_flags; 4062 int status; 4063 4064 /* Is this a delegated open? */ 4065 status = nfs4_set_lock_state(state, request); 4066 if (status != 0) 4067 goto out; 4068 request->fl_flags |= FL_ACCESS; 4069 status = do_vfs_lock(request->fl_file, request); 4070 if (status < 0) 4071 goto out; 4072 down_read(&nfsi->rwsem); 4073 if (test_bit(NFS_DELEGATED_STATE, &state->flags)) { 4074 /* Yes: cache locks! */ 4075 /* ...but avoid races with delegation recall... */ 4076 request->fl_flags = fl_flags & ~FL_SLEEP; 4077 status = do_vfs_lock(request->fl_file, request); 4078 goto out_unlock; 4079 } 4080 status = _nfs4_do_setlk(state, cmd, request, 0); 4081 if (status != 0) 4082 goto out_unlock; 4083 /* Note: we always want to sleep here! */ 4084 request->fl_flags = fl_flags | FL_SLEEP; 4085 if (do_vfs_lock(request->fl_file, request) < 0) 4086 printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", __func__); 4087 out_unlock: 4088 up_read(&nfsi->rwsem); 4089 out: 4090 request->fl_flags = fl_flags; 4091 return status; 4092 } 4093 4094 static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request) 4095 { 4096 struct nfs4_exception exception = { }; 4097 int err; 4098 4099 do { 4100 err = _nfs4_proc_setlk(state, cmd, request); 4101 if (err == -NFS4ERR_DENIED) 4102 err = -EAGAIN; 4103 err = nfs4_handle_exception(NFS_SERVER(state->inode), 4104 err, &exception); 4105 } while (exception.retry); 4106 return err; 4107 } 4108 4109 static int 4110 nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request) 4111 { 4112 struct nfs_open_context *ctx; 4113 struct nfs4_state *state; 4114 unsigned long timeout = NFS4_LOCK_MINTIMEOUT; 4115 int status; 4116 4117 /* verify open state */ 4118 ctx = nfs_file_open_context(filp); 4119 state = ctx->state; 4120 4121 if (request->fl_start < 0 || request->fl_end < 0) 4122 return -EINVAL; 4123 4124 if (IS_GETLK(cmd)) { 4125 if (state != NULL) 4126 return nfs4_proc_getlk(state, F_GETLK, request); 4127 return 0; 4128 } 4129 4130 if (!(IS_SETLK(cmd) || IS_SETLKW(cmd))) 4131 return -EINVAL; 4132 4133 if (request->fl_type == F_UNLCK) { 4134 if (state != NULL) 4135 return nfs4_proc_unlck(state, cmd, request); 4136 return 0; 4137 } 4138 4139 if (state == NULL) 4140 return -ENOLCK; 4141 do { 4142 status = nfs4_proc_setlk(state, cmd, request); 4143 if ((status != -EAGAIN) || IS_SETLK(cmd)) 4144 break; 4145 timeout = nfs4_set_lock_task_retry(timeout); 4146 status = -ERESTARTSYS; 4147 if (signalled()) 4148 break; 4149 } while(status < 0); 4150 return status; 4151 } 4152 4153 int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl) 4154 { 4155 struct nfs_server *server = NFS_SERVER(state->inode); 4156 struct nfs4_exception exception = { }; 4157 int err; 4158 4159 err = nfs4_set_lock_state(state, fl); 4160 if (err != 0) 4161 goto out; 4162 do { 4163 err = _nfs4_do_setlk(state, F_SETLK, fl, 0); 4164 switch (err) { 4165 default: 4166 printk(KERN_ERR "%s: unhandled error %d.\n", 4167 __func__, err); 4168 case 0: 4169 case -ESTALE: 4170 goto out; 4171 case -NFS4ERR_EXPIRED: 4172 case -NFS4ERR_STALE_CLIENTID: 4173 case -NFS4ERR_STALE_STATEID: 4174 nfs4_schedule_state_recovery(server->nfs_client); 4175 goto out; 4176 case -ERESTARTSYS: 4177 /* 4178 * The show must go on: exit, but mark the 4179 * stateid as needing recovery. 4180 */ 4181 case -NFS4ERR_ADMIN_REVOKED: 4182 case -NFS4ERR_BAD_STATEID: 4183 case -NFS4ERR_OPENMODE: 4184 nfs4_state_mark_reclaim_nograce(server->nfs_client, state); 4185 err = 0; 4186 goto out; 4187 case -ENOMEM: 4188 case -NFS4ERR_DENIED: 4189 /* kill_proc(fl->fl_pid, SIGLOST, 1); */ 4190 err = 0; 4191 goto out; 4192 case -NFS4ERR_DELAY: 4193 break; 4194 } 4195 err = nfs4_handle_exception(server, err, &exception); 4196 } while (exception.retry); 4197 out: 4198 return err; 4199 } 4200 4201 #define XATTR_NAME_NFSV4_ACL "system.nfs4_acl" 4202 4203 int nfs4_setxattr(struct dentry *dentry, const char *key, const void *buf, 4204 size_t buflen, int flags) 4205 { 4206 struct inode *inode = dentry->d_inode; 4207 4208 if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0) 4209 return -EOPNOTSUPP; 4210 4211 return nfs4_proc_set_acl(inode, buf, buflen); 4212 } 4213 4214 /* The getxattr man page suggests returning -ENODATA for unknown attributes, 4215 * and that's what we'll do for e.g. user attributes that haven't been set. 4216 * But we'll follow ext2/ext3's lead by returning -EOPNOTSUPP for unsupported 4217 * attributes in kernel-managed attribute namespaces. */ 4218 ssize_t nfs4_getxattr(struct dentry *dentry, const char *key, void *buf, 4219 size_t buflen) 4220 { 4221 struct inode *inode = dentry->d_inode; 4222 4223 if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0) 4224 return -EOPNOTSUPP; 4225 4226 return nfs4_proc_get_acl(inode, buf, buflen); 4227 } 4228 4229 ssize_t nfs4_listxattr(struct dentry *dentry, char *buf, size_t buflen) 4230 { 4231 size_t len = strlen(XATTR_NAME_NFSV4_ACL) + 1; 4232 4233 if (!nfs4_server_supports_acls(NFS_SERVER(dentry->d_inode))) 4234 return 0; 4235 if (buf && buflen < len) 4236 return -ERANGE; 4237 if (buf) 4238 memcpy(buf, XATTR_NAME_NFSV4_ACL, len); 4239 return len; 4240 } 4241 4242 static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr) 4243 { 4244 if (!((fattr->valid & NFS_ATTR_FATTR_FILEID) && 4245 (fattr->valid & NFS_ATTR_FATTR_FSID) && 4246 (fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL))) 4247 return; 4248 4249 fattr->valid |= NFS_ATTR_FATTR_TYPE | NFS_ATTR_FATTR_MODE | 4250 NFS_ATTR_FATTR_NLINK; 4251 fattr->mode = S_IFDIR | S_IRUGO | S_IXUGO; 4252 fattr->nlink = 2; 4253 } 4254 4255 int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name, 4256 struct nfs4_fs_locations *fs_locations, struct page *page) 4257 { 4258 struct nfs_server *server = NFS_SERVER(dir); 4259 u32 bitmask[2] = { 4260 [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS, 4261 [1] = FATTR4_WORD1_MOUNTED_ON_FILEID, 4262 }; 4263 struct nfs4_fs_locations_arg args = { 4264 .dir_fh = NFS_FH(dir), 4265 .name = name, 4266 .page = page, 4267 .bitmask = bitmask, 4268 }; 4269 struct nfs4_fs_locations_res res = { 4270 .fs_locations = fs_locations, 4271 }; 4272 struct rpc_message msg = { 4273 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FS_LOCATIONS], 4274 .rpc_argp = &args, 4275 .rpc_resp = &res, 4276 }; 4277 int status; 4278 4279 dprintk("%s: start\n", __func__); 4280 nfs_fattr_init(&fs_locations->fattr); 4281 fs_locations->server = server; 4282 fs_locations->nlocations = 0; 4283 status = nfs4_call_sync(server, &msg, &args, &res, 0); 4284 nfs_fixup_referral_attributes(&fs_locations->fattr); 4285 dprintk("%s: returned status = %d\n", __func__, status); 4286 return status; 4287 } 4288 4289 #ifdef CONFIG_NFS_V4_1 4290 /* 4291 * nfs4_proc_exchange_id() 4292 * 4293 * Since the clientid has expired, all compounds using sessions 4294 * associated with the stale clientid will be returning 4295 * NFS4ERR_BADSESSION in the sequence operation, and will therefore 4296 * be in some phase of session reset. 4297 */ 4298 static int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred) 4299 { 4300 nfs4_verifier verifier; 4301 struct nfs41_exchange_id_args args = { 4302 .client = clp, 4303 .flags = clp->cl_exchange_flags, 4304 }; 4305 struct nfs41_exchange_id_res res = { 4306 .client = clp, 4307 }; 4308 int status; 4309 struct rpc_message msg = { 4310 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_EXCHANGE_ID], 4311 .rpc_argp = &args, 4312 .rpc_resp = &res, 4313 .rpc_cred = cred, 4314 }; 4315 __be32 *p; 4316 4317 dprintk("--> %s\n", __func__); 4318 BUG_ON(clp == NULL); 4319 4320 p = (u32 *)verifier.data; 4321 *p++ = htonl((u32)clp->cl_boot_time.tv_sec); 4322 *p = htonl((u32)clp->cl_boot_time.tv_nsec); 4323 args.verifier = &verifier; 4324 4325 while (1) { 4326 args.id_len = scnprintf(args.id, sizeof(args.id), 4327 "%s/%s %u", 4328 clp->cl_ipaddr, 4329 rpc_peeraddr2str(clp->cl_rpcclient, 4330 RPC_DISPLAY_ADDR), 4331 clp->cl_id_uniquifier); 4332 4333 status = rpc_call_sync(clp->cl_rpcclient, &msg, 0); 4334 4335 if (status != NFS4ERR_CLID_INUSE) 4336 break; 4337 4338 if (signalled()) 4339 break; 4340 4341 if (++clp->cl_id_uniquifier == 0) 4342 break; 4343 } 4344 4345 dprintk("<-- %s status= %d\n", __func__, status); 4346 return status; 4347 } 4348 4349 struct nfs4_get_lease_time_data { 4350 struct nfs4_get_lease_time_args *args; 4351 struct nfs4_get_lease_time_res *res; 4352 struct nfs_client *clp; 4353 }; 4354 4355 static void nfs4_get_lease_time_prepare(struct rpc_task *task, 4356 void *calldata) 4357 { 4358 int ret; 4359 struct nfs4_get_lease_time_data *data = 4360 (struct nfs4_get_lease_time_data *)calldata; 4361 4362 dprintk("--> %s\n", __func__); 4363 /* just setup sequence, do not trigger session recovery 4364 since we're invoked within one */ 4365 ret = nfs41_setup_sequence(data->clp->cl_session, 4366 &data->args->la_seq_args, 4367 &data->res->lr_seq_res, 0, task); 4368 4369 BUG_ON(ret == -EAGAIN); 4370 rpc_call_start(task); 4371 dprintk("<-- %s\n", __func__); 4372 } 4373 4374 /* 4375 * Called from nfs4_state_manager thread for session setup, so don't recover 4376 * from sequence operation or clientid errors. 4377 */ 4378 static void nfs4_get_lease_time_done(struct rpc_task *task, void *calldata) 4379 { 4380 struct nfs4_get_lease_time_data *data = 4381 (struct nfs4_get_lease_time_data *)calldata; 4382 4383 dprintk("--> %s\n", __func__); 4384 nfs41_sequence_done(data->clp, &data->res->lr_seq_res, task->tk_status); 4385 switch (task->tk_status) { 4386 case -NFS4ERR_DELAY: 4387 case -NFS4ERR_GRACE: 4388 dprintk("%s Retry: tk_status %d\n", __func__, task->tk_status); 4389 rpc_delay(task, NFS4_POLL_RETRY_MIN); 4390 task->tk_status = 0; 4391 nfs4_restart_rpc(task, data->clp); 4392 return; 4393 } 4394 nfs41_sequence_free_slot(data->clp, &data->res->lr_seq_res); 4395 dprintk("<-- %s\n", __func__); 4396 } 4397 4398 struct rpc_call_ops nfs4_get_lease_time_ops = { 4399 .rpc_call_prepare = nfs4_get_lease_time_prepare, 4400 .rpc_call_done = nfs4_get_lease_time_done, 4401 }; 4402 4403 int nfs4_proc_get_lease_time(struct nfs_client *clp, struct nfs_fsinfo *fsinfo) 4404 { 4405 struct rpc_task *task; 4406 struct nfs4_get_lease_time_args args; 4407 struct nfs4_get_lease_time_res res = { 4408 .lr_fsinfo = fsinfo, 4409 }; 4410 struct nfs4_get_lease_time_data data = { 4411 .args = &args, 4412 .res = &res, 4413 .clp = clp, 4414 }; 4415 struct rpc_message msg = { 4416 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GET_LEASE_TIME], 4417 .rpc_argp = &args, 4418 .rpc_resp = &res, 4419 }; 4420 struct rpc_task_setup task_setup = { 4421 .rpc_client = clp->cl_rpcclient, 4422 .rpc_message = &msg, 4423 .callback_ops = &nfs4_get_lease_time_ops, 4424 .callback_data = &data 4425 }; 4426 int status; 4427 4428 res.lr_seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE; 4429 dprintk("--> %s\n", __func__); 4430 task = rpc_run_task(&task_setup); 4431 4432 if (IS_ERR(task)) 4433 status = PTR_ERR(task); 4434 else { 4435 status = task->tk_status; 4436 rpc_put_task(task); 4437 } 4438 dprintk("<-- %s return %d\n", __func__, status); 4439 4440 return status; 4441 } 4442 4443 /* 4444 * Reset a slot table 4445 */ 4446 static int nfs4_reset_slot_table(struct nfs4_slot_table *tbl, int max_slots, 4447 int old_max_slots, int ivalue) 4448 { 4449 int i; 4450 int ret = 0; 4451 4452 dprintk("--> %s: max_reqs=%u, tbl %p\n", __func__, max_slots, tbl); 4453 4454 /* 4455 * Until we have dynamic slot table adjustment, insist 4456 * upon the same slot table size 4457 */ 4458 if (max_slots != old_max_slots) { 4459 dprintk("%s reset slot table does't match old\n", 4460 __func__); 4461 ret = -EINVAL; /*XXX NFS4ERR_REQ_TOO_BIG ? */ 4462 goto out; 4463 } 4464 spin_lock(&tbl->slot_tbl_lock); 4465 for (i = 0; i < max_slots; ++i) 4466 tbl->slots[i].seq_nr = ivalue; 4467 tbl->highest_used_slotid = -1; 4468 spin_unlock(&tbl->slot_tbl_lock); 4469 dprintk("%s: tbl=%p slots=%p max_slots=%d\n", __func__, 4470 tbl, tbl->slots, tbl->max_slots); 4471 out: 4472 dprintk("<-- %s: return %d\n", __func__, ret); 4473 return ret; 4474 } 4475 4476 /* 4477 * Reset the forechannel and backchannel slot tables 4478 */ 4479 static int nfs4_reset_slot_tables(struct nfs4_session *session) 4480 { 4481 int status; 4482 4483 status = nfs4_reset_slot_table(&session->fc_slot_table, 4484 session->fc_attrs.max_reqs, 4485 session->fc_slot_table.max_slots, 4486 1); 4487 if (status) 4488 return status; 4489 4490 status = nfs4_reset_slot_table(&session->bc_slot_table, 4491 session->bc_attrs.max_reqs, 4492 session->bc_slot_table.max_slots, 4493 0); 4494 return status; 4495 } 4496 4497 /* Destroy the slot table */ 4498 static void nfs4_destroy_slot_tables(struct nfs4_session *session) 4499 { 4500 if (session->fc_slot_table.slots != NULL) { 4501 kfree(session->fc_slot_table.slots); 4502 session->fc_slot_table.slots = NULL; 4503 } 4504 if (session->bc_slot_table.slots != NULL) { 4505 kfree(session->bc_slot_table.slots); 4506 session->bc_slot_table.slots = NULL; 4507 } 4508 return; 4509 } 4510 4511 /* 4512 * Initialize slot table 4513 */ 4514 static int nfs4_init_slot_table(struct nfs4_slot_table *tbl, 4515 int max_slots, int ivalue) 4516 { 4517 int i; 4518 struct nfs4_slot *slot; 4519 int ret = -ENOMEM; 4520 4521 BUG_ON(max_slots > NFS4_MAX_SLOT_TABLE); 4522 4523 dprintk("--> %s: max_reqs=%u\n", __func__, max_slots); 4524 4525 slot = kcalloc(max_slots, sizeof(struct nfs4_slot), GFP_KERNEL); 4526 if (!slot) 4527 goto out; 4528 for (i = 0; i < max_slots; ++i) 4529 slot[i].seq_nr = ivalue; 4530 ret = 0; 4531 4532 spin_lock(&tbl->slot_tbl_lock); 4533 if (tbl->slots != NULL) { 4534 spin_unlock(&tbl->slot_tbl_lock); 4535 dprintk("%s: slot table already initialized. tbl=%p slots=%p\n", 4536 __func__, tbl, tbl->slots); 4537 WARN_ON(1); 4538 goto out_free; 4539 } 4540 tbl->max_slots = max_slots; 4541 tbl->slots = slot; 4542 tbl->highest_used_slotid = -1; /* no slot is currently used */ 4543 spin_unlock(&tbl->slot_tbl_lock); 4544 dprintk("%s: tbl=%p slots=%p max_slots=%d\n", __func__, 4545 tbl, tbl->slots, tbl->max_slots); 4546 out: 4547 dprintk("<-- %s: return %d\n", __func__, ret); 4548 return ret; 4549 4550 out_free: 4551 kfree(slot); 4552 goto out; 4553 } 4554 4555 /* 4556 * Initialize the forechannel and backchannel tables 4557 */ 4558 static int nfs4_init_slot_tables(struct nfs4_session *session) 4559 { 4560 int status; 4561 4562 status = nfs4_init_slot_table(&session->fc_slot_table, 4563 session->fc_attrs.max_reqs, 1); 4564 if (status) 4565 return status; 4566 4567 status = nfs4_init_slot_table(&session->bc_slot_table, 4568 session->bc_attrs.max_reqs, 0); 4569 if (status) 4570 nfs4_destroy_slot_tables(session); 4571 4572 return status; 4573 } 4574 4575 struct nfs4_session *nfs4_alloc_session(struct nfs_client *clp) 4576 { 4577 struct nfs4_session *session; 4578 struct nfs4_slot_table *tbl; 4579 4580 session = kzalloc(sizeof(struct nfs4_session), GFP_KERNEL); 4581 if (!session) 4582 return NULL; 4583 4584 set_bit(NFS4CLNT_SESSION_SETUP, &clp->cl_state); 4585 /* 4586 * The create session reply races with the server back 4587 * channel probe. Mark the client NFS_CS_SESSION_INITING 4588 * so that the client back channel can find the 4589 * nfs_client struct 4590 */ 4591 clp->cl_cons_state = NFS_CS_SESSION_INITING; 4592 4593 tbl = &session->fc_slot_table; 4594 spin_lock_init(&tbl->slot_tbl_lock); 4595 rpc_init_wait_queue(&tbl->slot_tbl_waitq, "ForeChannel Slot table"); 4596 4597 tbl = &session->bc_slot_table; 4598 spin_lock_init(&tbl->slot_tbl_lock); 4599 rpc_init_wait_queue(&tbl->slot_tbl_waitq, "BackChannel Slot table"); 4600 4601 session->clp = clp; 4602 return session; 4603 } 4604 4605 void nfs4_destroy_session(struct nfs4_session *session) 4606 { 4607 nfs4_proc_destroy_session(session); 4608 dprintk("%s Destroy backchannel for xprt %p\n", 4609 __func__, session->clp->cl_rpcclient->cl_xprt); 4610 xprt_destroy_backchannel(session->clp->cl_rpcclient->cl_xprt, 4611 NFS41_BC_MIN_CALLBACKS); 4612 nfs4_destroy_slot_tables(session); 4613 kfree(session); 4614 } 4615 4616 /* 4617 * Initialize the values to be used by the client in CREATE_SESSION 4618 * If nfs4_init_session set the fore channel request and response sizes, 4619 * use them. 4620 * 4621 * Set the back channel max_resp_sz_cached to zero to force the client to 4622 * always set csa_cachethis to FALSE because the current implementation 4623 * of the back channel DRC only supports caching the CB_SEQUENCE operation. 4624 */ 4625 static void nfs4_init_channel_attrs(struct nfs41_create_session_args *args) 4626 { 4627 struct nfs4_session *session = args->client->cl_session; 4628 unsigned int mxrqst_sz = session->fc_attrs.max_rqst_sz, 4629 mxresp_sz = session->fc_attrs.max_resp_sz; 4630 4631 if (mxrqst_sz == 0) 4632 mxrqst_sz = NFS_MAX_FILE_IO_SIZE; 4633 if (mxresp_sz == 0) 4634 mxresp_sz = NFS_MAX_FILE_IO_SIZE; 4635 /* Fore channel attributes */ 4636 args->fc_attrs.headerpadsz = 0; 4637 args->fc_attrs.max_rqst_sz = mxrqst_sz; 4638 args->fc_attrs.max_resp_sz = mxresp_sz; 4639 args->fc_attrs.max_resp_sz_cached = mxresp_sz; 4640 args->fc_attrs.max_ops = NFS4_MAX_OPS; 4641 args->fc_attrs.max_reqs = session->clp->cl_rpcclient->cl_xprt->max_reqs; 4642 4643 dprintk("%s: Fore Channel : max_rqst_sz=%u max_resp_sz=%u " 4644 "max_resp_sz_cached=%u max_ops=%u max_reqs=%u\n", 4645 __func__, 4646 args->fc_attrs.max_rqst_sz, args->fc_attrs.max_resp_sz, 4647 args->fc_attrs.max_resp_sz_cached, args->fc_attrs.max_ops, 4648 args->fc_attrs.max_reqs); 4649 4650 /* Back channel attributes */ 4651 args->bc_attrs.headerpadsz = 0; 4652 args->bc_attrs.max_rqst_sz = PAGE_SIZE; 4653 args->bc_attrs.max_resp_sz = PAGE_SIZE; 4654 args->bc_attrs.max_resp_sz_cached = 0; 4655 args->bc_attrs.max_ops = NFS4_MAX_BACK_CHANNEL_OPS; 4656 args->bc_attrs.max_reqs = 1; 4657 4658 dprintk("%s: Back Channel : max_rqst_sz=%u max_resp_sz=%u " 4659 "max_resp_sz_cached=%u max_ops=%u max_reqs=%u\n", 4660 __func__, 4661 args->bc_attrs.max_rqst_sz, args->bc_attrs.max_resp_sz, 4662 args->bc_attrs.max_resp_sz_cached, args->bc_attrs.max_ops, 4663 args->bc_attrs.max_reqs); 4664 } 4665 4666 static int _verify_channel_attr(char *chan, char *attr_name, u32 sent, u32 rcvd) 4667 { 4668 if (rcvd <= sent) 4669 return 0; 4670 printk(KERN_WARNING "%s: Session INVALID: %s channel %s increased. " 4671 "sent=%u rcvd=%u\n", __func__, chan, attr_name, sent, rcvd); 4672 return -EINVAL; 4673 } 4674 4675 #define _verify_fore_channel_attr(_name_) \ 4676 _verify_channel_attr("fore", #_name_, \ 4677 args->fc_attrs._name_, \ 4678 session->fc_attrs._name_) 4679 4680 #define _verify_back_channel_attr(_name_) \ 4681 _verify_channel_attr("back", #_name_, \ 4682 args->bc_attrs._name_, \ 4683 session->bc_attrs._name_) 4684 4685 /* 4686 * The server is not allowed to increase the fore channel header pad size, 4687 * maximum response size, or maximum number of operations. 4688 * 4689 * The back channel attributes are only negotiatied down: We send what the 4690 * (back channel) server insists upon. 4691 */ 4692 static int nfs4_verify_channel_attrs(struct nfs41_create_session_args *args, 4693 struct nfs4_session *session) 4694 { 4695 int ret = 0; 4696 4697 ret |= _verify_fore_channel_attr(headerpadsz); 4698 ret |= _verify_fore_channel_attr(max_resp_sz); 4699 ret |= _verify_fore_channel_attr(max_ops); 4700 4701 ret |= _verify_back_channel_attr(headerpadsz); 4702 ret |= _verify_back_channel_attr(max_rqst_sz); 4703 ret |= _verify_back_channel_attr(max_resp_sz); 4704 ret |= _verify_back_channel_attr(max_resp_sz_cached); 4705 ret |= _verify_back_channel_attr(max_ops); 4706 ret |= _verify_back_channel_attr(max_reqs); 4707 4708 return ret; 4709 } 4710 4711 static int _nfs4_proc_create_session(struct nfs_client *clp) 4712 { 4713 struct nfs4_session *session = clp->cl_session; 4714 struct nfs41_create_session_args args = { 4715 .client = clp, 4716 .cb_program = NFS4_CALLBACK, 4717 }; 4718 struct nfs41_create_session_res res = { 4719 .client = clp, 4720 }; 4721 struct rpc_message msg = { 4722 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE_SESSION], 4723 .rpc_argp = &args, 4724 .rpc_resp = &res, 4725 }; 4726 int status; 4727 4728 nfs4_init_channel_attrs(&args); 4729 args.flags = (SESSION4_PERSIST | SESSION4_BACK_CHAN); 4730 4731 status = rpc_call_sync(session->clp->cl_rpcclient, &msg, 0); 4732 4733 if (!status) 4734 /* Verify the session's negotiated channel_attrs values */ 4735 status = nfs4_verify_channel_attrs(&args, session); 4736 if (!status) { 4737 /* Increment the clientid slot sequence id */ 4738 clp->cl_seqid++; 4739 } 4740 4741 return status; 4742 } 4743 4744 /* 4745 * Issues a CREATE_SESSION operation to the server. 4746 * It is the responsibility of the caller to verify the session is 4747 * expired before calling this routine. 4748 */ 4749 int nfs4_proc_create_session(struct nfs_client *clp, int reset) 4750 { 4751 int status; 4752 unsigned *ptr; 4753 struct nfs_fsinfo fsinfo; 4754 struct nfs4_session *session = clp->cl_session; 4755 4756 dprintk("--> %s clp=%p session=%p\n", __func__, clp, session); 4757 4758 status = _nfs4_proc_create_session(clp); 4759 if (status) 4760 goto out; 4761 4762 /* Init or reset the fore channel */ 4763 if (reset) 4764 status = nfs4_reset_slot_tables(session); 4765 else 4766 status = nfs4_init_slot_tables(session); 4767 dprintk("fore channel slot table initialization returned %d\n", status); 4768 if (status) 4769 goto out; 4770 4771 ptr = (unsigned *)&session->sess_id.data[0]; 4772 dprintk("%s client>seqid %d sessionid %u:%u:%u:%u\n", __func__, 4773 clp->cl_seqid, ptr[0], ptr[1], ptr[2], ptr[3]); 4774 4775 if (reset) 4776 /* Lease time is aleady set */ 4777 goto out; 4778 4779 /* Get the lease time */ 4780 status = nfs4_proc_get_lease_time(clp, &fsinfo); 4781 if (status == 0) { 4782 /* Update lease time and schedule renewal */ 4783 spin_lock(&clp->cl_lock); 4784 clp->cl_lease_time = fsinfo.lease_time * HZ; 4785 clp->cl_last_renewal = jiffies; 4786 clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); 4787 spin_unlock(&clp->cl_lock); 4788 4789 nfs4_schedule_state_renewal(clp); 4790 } 4791 out: 4792 dprintk("<-- %s\n", __func__); 4793 return status; 4794 } 4795 4796 /* 4797 * Issue the over-the-wire RPC DESTROY_SESSION. 4798 * The caller must serialize access to this routine. 4799 */ 4800 int nfs4_proc_destroy_session(struct nfs4_session *session) 4801 { 4802 int status = 0; 4803 struct rpc_message msg; 4804 4805 dprintk("--> nfs4_proc_destroy_session\n"); 4806 4807 /* session is still being setup */ 4808 if (session->clp->cl_cons_state != NFS_CS_READY) 4809 return status; 4810 4811 msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DESTROY_SESSION]; 4812 msg.rpc_argp = session; 4813 msg.rpc_resp = NULL; 4814 msg.rpc_cred = NULL; 4815 status = rpc_call_sync(session->clp->cl_rpcclient, &msg, 0); 4816 4817 if (status) 4818 printk(KERN_WARNING 4819 "Got error %d from the server on DESTROY_SESSION. " 4820 "Session has been destroyed regardless...\n", status); 4821 4822 dprintk("<-- nfs4_proc_destroy_session\n"); 4823 return status; 4824 } 4825 4826 int nfs4_init_session(struct nfs_server *server) 4827 { 4828 struct nfs_client *clp = server->nfs_client; 4829 int ret; 4830 4831 if (!nfs4_has_session(clp)) 4832 return 0; 4833 4834 clp->cl_session->fc_attrs.max_rqst_sz = server->wsize; 4835 clp->cl_session->fc_attrs.max_resp_sz = server->rsize; 4836 ret = nfs4_recover_expired_lease(server); 4837 if (!ret) 4838 ret = nfs4_check_client_ready(clp); 4839 return ret; 4840 } 4841 4842 /* 4843 * Renew the cl_session lease. 4844 */ 4845 static int nfs4_proc_sequence(struct nfs_client *clp, struct rpc_cred *cred) 4846 { 4847 struct nfs4_sequence_args args; 4848 struct nfs4_sequence_res res; 4849 4850 struct rpc_message msg = { 4851 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SEQUENCE], 4852 .rpc_argp = &args, 4853 .rpc_resp = &res, 4854 .rpc_cred = cred, 4855 }; 4856 4857 args.sa_cache_this = 0; 4858 4859 return nfs4_call_sync_sequence(clp, clp->cl_rpcclient, &msg, &args, 4860 &res, 0); 4861 } 4862 4863 void nfs41_sequence_call_done(struct rpc_task *task, void *data) 4864 { 4865 struct nfs_client *clp = (struct nfs_client *)data; 4866 4867 nfs41_sequence_done(clp, task->tk_msg.rpc_resp, task->tk_status); 4868 4869 if (task->tk_status < 0) { 4870 dprintk("%s ERROR %d\n", __func__, task->tk_status); 4871 4872 if (_nfs4_async_handle_error(task, NULL, clp, NULL) 4873 == -EAGAIN) { 4874 nfs4_restart_rpc(task, clp); 4875 return; 4876 } 4877 } 4878 nfs41_sequence_free_slot(clp, task->tk_msg.rpc_resp); 4879 dprintk("%s rpc_cred %p\n", __func__, task->tk_msg.rpc_cred); 4880 4881 put_rpccred(task->tk_msg.rpc_cred); 4882 kfree(task->tk_msg.rpc_argp); 4883 kfree(task->tk_msg.rpc_resp); 4884 4885 dprintk("<-- %s\n", __func__); 4886 } 4887 4888 static void nfs41_sequence_prepare(struct rpc_task *task, void *data) 4889 { 4890 struct nfs_client *clp; 4891 struct nfs4_sequence_args *args; 4892 struct nfs4_sequence_res *res; 4893 4894 clp = (struct nfs_client *)data; 4895 args = task->tk_msg.rpc_argp; 4896 res = task->tk_msg.rpc_resp; 4897 4898 if (nfs4_setup_sequence(clp, args, res, 0, task)) 4899 return; 4900 rpc_call_start(task); 4901 } 4902 4903 static const struct rpc_call_ops nfs41_sequence_ops = { 4904 .rpc_call_done = nfs41_sequence_call_done, 4905 .rpc_call_prepare = nfs41_sequence_prepare, 4906 }; 4907 4908 static int nfs41_proc_async_sequence(struct nfs_client *clp, 4909 struct rpc_cred *cred) 4910 { 4911 struct nfs4_sequence_args *args; 4912 struct nfs4_sequence_res *res; 4913 struct rpc_message msg = { 4914 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SEQUENCE], 4915 .rpc_cred = cred, 4916 }; 4917 4918 args = kzalloc(sizeof(*args), GFP_KERNEL); 4919 if (!args) 4920 return -ENOMEM; 4921 res = kzalloc(sizeof(*res), GFP_KERNEL); 4922 if (!res) { 4923 kfree(args); 4924 return -ENOMEM; 4925 } 4926 res->sr_slotid = NFS4_MAX_SLOT_TABLE; 4927 msg.rpc_argp = args; 4928 msg.rpc_resp = res; 4929 4930 return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_SOFT, 4931 &nfs41_sequence_ops, (void *)clp); 4932 } 4933 4934 #endif /* CONFIG_NFS_V4_1 */ 4935 4936 struct nfs4_state_recovery_ops nfs40_reboot_recovery_ops = { 4937 .owner_flag_bit = NFS_OWNER_RECLAIM_REBOOT, 4938 .state_flag_bit = NFS_STATE_RECLAIM_REBOOT, 4939 .recover_open = nfs4_open_reclaim, 4940 .recover_lock = nfs4_lock_reclaim, 4941 .establish_clid = nfs4_init_clientid, 4942 .get_clid_cred = nfs4_get_setclientid_cred, 4943 }; 4944 4945 #if defined(CONFIG_NFS_V4_1) 4946 struct nfs4_state_recovery_ops nfs41_reboot_recovery_ops = { 4947 .owner_flag_bit = NFS_OWNER_RECLAIM_REBOOT, 4948 .state_flag_bit = NFS_STATE_RECLAIM_REBOOT, 4949 .recover_open = nfs4_open_reclaim, 4950 .recover_lock = nfs4_lock_reclaim, 4951 .establish_clid = nfs4_proc_exchange_id, 4952 .get_clid_cred = nfs4_get_exchange_id_cred, 4953 }; 4954 #endif /* CONFIG_NFS_V4_1 */ 4955 4956 struct nfs4_state_recovery_ops nfs40_nograce_recovery_ops = { 4957 .owner_flag_bit = NFS_OWNER_RECLAIM_NOGRACE, 4958 .state_flag_bit = NFS_STATE_RECLAIM_NOGRACE, 4959 .recover_open = nfs4_open_expired, 4960 .recover_lock = nfs4_lock_expired, 4961 .establish_clid = nfs4_init_clientid, 4962 .get_clid_cred = nfs4_get_setclientid_cred, 4963 }; 4964 4965 #if defined(CONFIG_NFS_V4_1) 4966 struct nfs4_state_recovery_ops nfs41_nograce_recovery_ops = { 4967 .owner_flag_bit = NFS_OWNER_RECLAIM_NOGRACE, 4968 .state_flag_bit = NFS_STATE_RECLAIM_NOGRACE, 4969 .recover_open = nfs4_open_expired, 4970 .recover_lock = nfs4_lock_expired, 4971 .establish_clid = nfs4_proc_exchange_id, 4972 .get_clid_cred = nfs4_get_exchange_id_cred, 4973 }; 4974 #endif /* CONFIG_NFS_V4_1 */ 4975 4976 struct nfs4_state_maintenance_ops nfs40_state_renewal_ops = { 4977 .sched_state_renewal = nfs4_proc_async_renew, 4978 .get_state_renewal_cred_locked = nfs4_get_renew_cred_locked, 4979 .renew_lease = nfs4_proc_renew, 4980 }; 4981 4982 #if defined(CONFIG_NFS_V4_1) 4983 struct nfs4_state_maintenance_ops nfs41_state_renewal_ops = { 4984 .sched_state_renewal = nfs41_proc_async_sequence, 4985 .get_state_renewal_cred_locked = nfs4_get_machine_cred_locked, 4986 .renew_lease = nfs4_proc_sequence, 4987 }; 4988 #endif 4989 4990 /* 4991 * Per minor version reboot and network partition recovery ops 4992 */ 4993 4994 struct nfs4_state_recovery_ops *nfs4_reboot_recovery_ops[] = { 4995 &nfs40_reboot_recovery_ops, 4996 #if defined(CONFIG_NFS_V4_1) 4997 &nfs41_reboot_recovery_ops, 4998 #endif 4999 }; 5000 5001 struct nfs4_state_recovery_ops *nfs4_nograce_recovery_ops[] = { 5002 &nfs40_nograce_recovery_ops, 5003 #if defined(CONFIG_NFS_V4_1) 5004 &nfs41_nograce_recovery_ops, 5005 #endif 5006 }; 5007 5008 struct nfs4_state_maintenance_ops *nfs4_state_renewal_ops[] = { 5009 &nfs40_state_renewal_ops, 5010 #if defined(CONFIG_NFS_V4_1) 5011 &nfs41_state_renewal_ops, 5012 #endif 5013 }; 5014 5015 static const struct inode_operations nfs4_file_inode_operations = { 5016 .permission = nfs_permission, 5017 .getattr = nfs_getattr, 5018 .setattr = nfs_setattr, 5019 .getxattr = nfs4_getxattr, 5020 .setxattr = nfs4_setxattr, 5021 .listxattr = nfs4_listxattr, 5022 }; 5023 5024 const struct nfs_rpc_ops nfs_v4_clientops = { 5025 .version = 4, /* protocol version */ 5026 .dentry_ops = &nfs4_dentry_operations, 5027 .dir_inode_ops = &nfs4_dir_inode_operations, 5028 .file_inode_ops = &nfs4_file_inode_operations, 5029 .getroot = nfs4_proc_get_root, 5030 .getattr = nfs4_proc_getattr, 5031 .setattr = nfs4_proc_setattr, 5032 .lookupfh = nfs4_proc_lookupfh, 5033 .lookup = nfs4_proc_lookup, 5034 .access = nfs4_proc_access, 5035 .readlink = nfs4_proc_readlink, 5036 .create = nfs4_proc_create, 5037 .remove = nfs4_proc_remove, 5038 .unlink_setup = nfs4_proc_unlink_setup, 5039 .unlink_done = nfs4_proc_unlink_done, 5040 .rename = nfs4_proc_rename, 5041 .link = nfs4_proc_link, 5042 .symlink = nfs4_proc_symlink, 5043 .mkdir = nfs4_proc_mkdir, 5044 .rmdir = nfs4_proc_remove, 5045 .readdir = nfs4_proc_readdir, 5046 .mknod = nfs4_proc_mknod, 5047 .statfs = nfs4_proc_statfs, 5048 .fsinfo = nfs4_proc_fsinfo, 5049 .pathconf = nfs4_proc_pathconf, 5050 .set_capabilities = nfs4_server_capabilities, 5051 .decode_dirent = nfs4_decode_dirent, 5052 .read_setup = nfs4_proc_read_setup, 5053 .read_done = nfs4_read_done, 5054 .write_setup = nfs4_proc_write_setup, 5055 .write_done = nfs4_write_done, 5056 .commit_setup = nfs4_proc_commit_setup, 5057 .commit_done = nfs4_commit_done, 5058 .lock = nfs4_proc_lock, 5059 .clear_acl_cache = nfs4_zap_acl_attr, 5060 .close_context = nfs4_close_context, 5061 }; 5062 5063 /* 5064 * Local variables: 5065 * c-basic-offset: 8 5066 * End: 5067 */ 5068