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