1 /* 2 * fs/nfs/nfs4proc.c 3 * 4 * Client-side procedure declarations for NFSv4. 5 * 6 * Copyright (c) 2002 The Regents of the University of Michigan. 7 * All rights reserved. 8 * 9 * Kendrick Smith <kmsmith@umich.edu> 10 * Andy Adamson <andros@umich.edu> 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 3. Neither the name of the University nor the names of its 22 * contributors may be used to endorse or promote products derived 23 * from this software without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 26 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 27 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 28 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 32 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 33 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 34 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36 */ 37 38 #include <linux/mm.h> 39 #include <linux/utsname.h> 40 #include <linux/delay.h> 41 #include <linux/errno.h> 42 #include <linux/string.h> 43 #include <linux/sunrpc/clnt.h> 44 #include <linux/nfs.h> 45 #include <linux/nfs4.h> 46 #include <linux/nfs_fs.h> 47 #include <linux/nfs_page.h> 48 #include <linux/smp_lock.h> 49 #include <linux/namei.h> 50 #include <linux/mount.h> 51 52 #include "nfs4_fs.h" 53 #include "delegation.h" 54 #include "iostat.h" 55 56 #define NFSDBG_FACILITY NFSDBG_PROC 57 58 #define NFS4_POLL_RETRY_MIN (HZ/10) 59 #define NFS4_POLL_RETRY_MAX (15*HZ) 60 61 struct nfs4_opendata; 62 static int _nfs4_proc_open(struct nfs4_opendata *data); 63 static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *); 64 static int nfs4_async_handle_error(struct rpc_task *, const struct nfs_server *); 65 static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry); 66 static int nfs4_handle_exception(const struct nfs_server *server, int errorcode, struct nfs4_exception *exception); 67 static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs_client *clp); 68 69 /* Prevent leaks of NFSv4 errors into userland */ 70 int nfs4_map_errors(int err) 71 { 72 if (err < -1000) { 73 dprintk("%s could not handle NFSv4 error %d\n", 74 __FUNCTION__, -err); 75 return -EIO; 76 } 77 return err; 78 } 79 80 /* 81 * This is our standard bitmap for GETATTR requests. 82 */ 83 const u32 nfs4_fattr_bitmap[2] = { 84 FATTR4_WORD0_TYPE 85 | FATTR4_WORD0_CHANGE 86 | FATTR4_WORD0_SIZE 87 | FATTR4_WORD0_FSID 88 | FATTR4_WORD0_FILEID, 89 FATTR4_WORD1_MODE 90 | FATTR4_WORD1_NUMLINKS 91 | FATTR4_WORD1_OWNER 92 | FATTR4_WORD1_OWNER_GROUP 93 | FATTR4_WORD1_RAWDEV 94 | FATTR4_WORD1_SPACE_USED 95 | FATTR4_WORD1_TIME_ACCESS 96 | FATTR4_WORD1_TIME_METADATA 97 | FATTR4_WORD1_TIME_MODIFY 98 }; 99 100 const u32 nfs4_statfs_bitmap[2] = { 101 FATTR4_WORD0_FILES_AVAIL 102 | FATTR4_WORD0_FILES_FREE 103 | FATTR4_WORD0_FILES_TOTAL, 104 FATTR4_WORD1_SPACE_AVAIL 105 | FATTR4_WORD1_SPACE_FREE 106 | FATTR4_WORD1_SPACE_TOTAL 107 }; 108 109 const u32 nfs4_pathconf_bitmap[2] = { 110 FATTR4_WORD0_MAXLINK 111 | FATTR4_WORD0_MAXNAME, 112 0 113 }; 114 115 const u32 nfs4_fsinfo_bitmap[2] = { FATTR4_WORD0_MAXFILESIZE 116 | FATTR4_WORD0_MAXREAD 117 | FATTR4_WORD0_MAXWRITE 118 | FATTR4_WORD0_LEASE_TIME, 119 0 120 }; 121 122 const u32 nfs4_fs_locations_bitmap[2] = { 123 FATTR4_WORD0_TYPE 124 | FATTR4_WORD0_CHANGE 125 | FATTR4_WORD0_SIZE 126 | FATTR4_WORD0_FSID 127 | FATTR4_WORD0_FILEID 128 | FATTR4_WORD0_FS_LOCATIONS, 129 FATTR4_WORD1_MODE 130 | FATTR4_WORD1_NUMLINKS 131 | FATTR4_WORD1_OWNER 132 | FATTR4_WORD1_OWNER_GROUP 133 | FATTR4_WORD1_RAWDEV 134 | FATTR4_WORD1_SPACE_USED 135 | FATTR4_WORD1_TIME_ACCESS 136 | FATTR4_WORD1_TIME_METADATA 137 | FATTR4_WORD1_TIME_MODIFY 138 | FATTR4_WORD1_MOUNTED_ON_FILEID 139 }; 140 141 static void nfs4_setup_readdir(u64 cookie, __be32 *verifier, struct dentry *dentry, 142 struct nfs4_readdir_arg *readdir) 143 { 144 __be32 *start, *p; 145 146 BUG_ON(readdir->count < 80); 147 if (cookie > 2) { 148 readdir->cookie = cookie; 149 memcpy(&readdir->verifier, verifier, sizeof(readdir->verifier)); 150 return; 151 } 152 153 readdir->cookie = 0; 154 memset(&readdir->verifier, 0, sizeof(readdir->verifier)); 155 if (cookie == 2) 156 return; 157 158 /* 159 * NFSv4 servers do not return entries for '.' and '..' 160 * Therefore, we fake these entries here. We let '.' 161 * have cookie 0 and '..' have cookie 1. Note that 162 * when talking to the server, we always send cookie 0 163 * instead of 1 or 2. 164 */ 165 start = p = kmap_atomic(*readdir->pages, KM_USER0); 166 167 if (cookie == 0) { 168 *p++ = xdr_one; /* next */ 169 *p++ = xdr_zero; /* cookie, first word */ 170 *p++ = xdr_one; /* cookie, second word */ 171 *p++ = xdr_one; /* entry len */ 172 memcpy(p, ".\0\0\0", 4); /* entry */ 173 p++; 174 *p++ = xdr_one; /* bitmap length */ 175 *p++ = htonl(FATTR4_WORD0_FILEID); /* bitmap */ 176 *p++ = htonl(8); /* attribute buffer length */ 177 p = xdr_encode_hyper(p, dentry->d_inode->i_ino); 178 } 179 180 *p++ = xdr_one; /* next */ 181 *p++ = xdr_zero; /* cookie, first word */ 182 *p++ = xdr_two; /* cookie, second word */ 183 *p++ = xdr_two; /* entry len */ 184 memcpy(p, "..\0\0", 4); /* entry */ 185 p++; 186 *p++ = xdr_one; /* bitmap length */ 187 *p++ = htonl(FATTR4_WORD0_FILEID); /* bitmap */ 188 *p++ = htonl(8); /* attribute buffer length */ 189 p = xdr_encode_hyper(p, dentry->d_parent->d_inode->i_ino); 190 191 readdir->pgbase = (char *)p - (char *)start; 192 readdir->count -= readdir->pgbase; 193 kunmap_atomic(start, KM_USER0); 194 } 195 196 static void renew_lease(const struct nfs_server *server, unsigned long timestamp) 197 { 198 struct nfs_client *clp = server->nfs_client; 199 spin_lock(&clp->cl_lock); 200 if (time_before(clp->cl_last_renewal,timestamp)) 201 clp->cl_last_renewal = timestamp; 202 spin_unlock(&clp->cl_lock); 203 } 204 205 static void update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo) 206 { 207 struct nfs_inode *nfsi = NFS_I(dir); 208 209 spin_lock(&dir->i_lock); 210 nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA; 211 if (cinfo->before == nfsi->change_attr && cinfo->atomic) 212 nfsi->change_attr = cinfo->after; 213 spin_unlock(&dir->i_lock); 214 } 215 216 struct nfs4_opendata { 217 atomic_t count; 218 struct nfs_openargs o_arg; 219 struct nfs_openres o_res; 220 struct nfs_open_confirmargs c_arg; 221 struct nfs_open_confirmres c_res; 222 struct nfs_fattr f_attr; 223 struct nfs_fattr dir_attr; 224 struct dentry *dentry; 225 struct dentry *dir; 226 struct nfs4_state_owner *owner; 227 struct iattr attrs; 228 unsigned long timestamp; 229 int rpc_status; 230 int cancelled; 231 }; 232 233 static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry, 234 struct nfs4_state_owner *sp, int flags, 235 const struct iattr *attrs) 236 { 237 struct dentry *parent = dget_parent(dentry); 238 struct inode *dir = parent->d_inode; 239 struct nfs_server *server = NFS_SERVER(dir); 240 struct nfs4_opendata *p; 241 242 p = kzalloc(sizeof(*p), GFP_KERNEL); 243 if (p == NULL) 244 goto err; 245 p->o_arg.seqid = nfs_alloc_seqid(&sp->so_seqid); 246 if (p->o_arg.seqid == NULL) 247 goto err_free; 248 atomic_set(&p->count, 1); 249 p->dentry = dget(dentry); 250 p->dir = parent; 251 p->owner = sp; 252 atomic_inc(&sp->so_count); 253 p->o_arg.fh = NFS_FH(dir); 254 p->o_arg.open_flags = flags, 255 p->o_arg.clientid = server->nfs_client->cl_clientid; 256 p->o_arg.id = sp->so_id; 257 p->o_arg.name = &dentry->d_name; 258 p->o_arg.server = server; 259 p->o_arg.bitmask = server->attr_bitmask; 260 p->o_arg.claim = NFS4_OPEN_CLAIM_NULL; 261 p->o_res.f_attr = &p->f_attr; 262 p->o_res.dir_attr = &p->dir_attr; 263 p->o_res.server = server; 264 nfs_fattr_init(&p->f_attr); 265 nfs_fattr_init(&p->dir_attr); 266 if (flags & O_EXCL) { 267 u32 *s = (u32 *) p->o_arg.u.verifier.data; 268 s[0] = jiffies; 269 s[1] = current->pid; 270 } else if (flags & O_CREAT) { 271 p->o_arg.u.attrs = &p->attrs; 272 memcpy(&p->attrs, attrs, sizeof(p->attrs)); 273 } 274 p->c_arg.fh = &p->o_res.fh; 275 p->c_arg.stateid = &p->o_res.stateid; 276 p->c_arg.seqid = p->o_arg.seqid; 277 return p; 278 err_free: 279 kfree(p); 280 err: 281 dput(parent); 282 return NULL; 283 } 284 285 static void nfs4_opendata_free(struct nfs4_opendata *p) 286 { 287 if (p != NULL && atomic_dec_and_test(&p->count)) { 288 nfs_free_seqid(p->o_arg.seqid); 289 nfs4_put_state_owner(p->owner); 290 dput(p->dir); 291 dput(p->dentry); 292 kfree(p); 293 } 294 } 295 296 /* Helper for asynchronous RPC calls */ 297 static int nfs4_call_async(struct rpc_clnt *clnt, 298 const struct rpc_call_ops *tk_ops, void *calldata) 299 { 300 struct rpc_task *task; 301 302 if (!(task = rpc_new_task(clnt, RPC_TASK_ASYNC, tk_ops, calldata))) 303 return -ENOMEM; 304 rpc_execute(task); 305 return 0; 306 } 307 308 static int nfs4_wait_for_completion_rpc_task(struct rpc_task *task) 309 { 310 sigset_t oldset; 311 int ret; 312 313 rpc_clnt_sigmask(task->tk_client, &oldset); 314 ret = rpc_wait_for_completion_task(task); 315 rpc_clnt_sigunmask(task->tk_client, &oldset); 316 return ret; 317 } 318 319 static inline void update_open_stateflags(struct nfs4_state *state, mode_t open_flags) 320 { 321 switch (open_flags) { 322 case FMODE_WRITE: 323 state->n_wronly++; 324 break; 325 case FMODE_READ: 326 state->n_rdonly++; 327 break; 328 case FMODE_READ|FMODE_WRITE: 329 state->n_rdwr++; 330 } 331 } 332 333 static void update_open_stateid(struct nfs4_state *state, nfs4_stateid *stateid, int open_flags) 334 { 335 struct inode *inode = state->inode; 336 337 open_flags &= (FMODE_READ|FMODE_WRITE); 338 /* Protect against nfs4_find_state_byowner() */ 339 spin_lock(&state->owner->so_lock); 340 spin_lock(&inode->i_lock); 341 memcpy(&state->stateid, stateid, sizeof(state->stateid)); 342 update_open_stateflags(state, open_flags); 343 nfs4_state_set_mode_locked(state, state->state | open_flags); 344 spin_unlock(&inode->i_lock); 345 spin_unlock(&state->owner->so_lock); 346 } 347 348 static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data) 349 { 350 struct inode *inode; 351 struct nfs4_state *state = NULL; 352 353 if (!(data->f_attr.valid & NFS_ATTR_FATTR)) 354 goto out; 355 inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh, &data->f_attr); 356 if (IS_ERR(inode)) 357 goto out; 358 state = nfs4_get_open_state(inode, data->owner); 359 if (state == NULL) 360 goto put_inode; 361 update_open_stateid(state, &data->o_res.stateid, data->o_arg.open_flags); 362 put_inode: 363 iput(inode); 364 out: 365 return state; 366 } 367 368 static struct nfs_open_context *nfs4_state_find_open_context(struct nfs4_state *state) 369 { 370 struct nfs_inode *nfsi = NFS_I(state->inode); 371 struct nfs_open_context *ctx; 372 373 spin_lock(&state->inode->i_lock); 374 list_for_each_entry(ctx, &nfsi->open_files, list) { 375 if (ctx->state != state) 376 continue; 377 get_nfs_open_context(ctx); 378 spin_unlock(&state->inode->i_lock); 379 return ctx; 380 } 381 spin_unlock(&state->inode->i_lock); 382 return ERR_PTR(-ENOENT); 383 } 384 385 static int nfs4_open_recover_helper(struct nfs4_opendata *opendata, mode_t openflags, nfs4_stateid *stateid) 386 { 387 int ret; 388 389 opendata->o_arg.open_flags = openflags; 390 ret = _nfs4_proc_open(opendata); 391 if (ret != 0) 392 return ret; 393 memcpy(stateid->data, opendata->o_res.stateid.data, 394 sizeof(stateid->data)); 395 return 0; 396 } 397 398 static int nfs4_open_recover(struct nfs4_opendata *opendata, struct nfs4_state *state) 399 { 400 nfs4_stateid stateid; 401 struct nfs4_state *newstate; 402 int mode = 0; 403 int delegation = 0; 404 int ret; 405 406 /* memory barrier prior to reading state->n_* */ 407 smp_rmb(); 408 if (state->n_rdwr != 0) { 409 ret = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE, &stateid); 410 if (ret != 0) 411 return ret; 412 mode |= FMODE_READ|FMODE_WRITE; 413 if (opendata->o_res.delegation_type != 0) 414 delegation = opendata->o_res.delegation_type; 415 smp_rmb(); 416 } 417 if (state->n_wronly != 0) { 418 ret = nfs4_open_recover_helper(opendata, FMODE_WRITE, &stateid); 419 if (ret != 0) 420 return ret; 421 mode |= FMODE_WRITE; 422 if (opendata->o_res.delegation_type != 0) 423 delegation = opendata->o_res.delegation_type; 424 smp_rmb(); 425 } 426 if (state->n_rdonly != 0) { 427 ret = nfs4_open_recover_helper(opendata, FMODE_READ, &stateid); 428 if (ret != 0) 429 return ret; 430 mode |= FMODE_READ; 431 } 432 clear_bit(NFS_DELEGATED_STATE, &state->flags); 433 if (mode == 0) 434 return 0; 435 if (opendata->o_res.delegation_type == 0) 436 opendata->o_res.delegation_type = delegation; 437 opendata->o_arg.open_flags |= mode; 438 newstate = nfs4_opendata_to_nfs4_state(opendata); 439 if (newstate != NULL) { 440 if (opendata->o_res.delegation_type != 0) { 441 struct nfs_inode *nfsi = NFS_I(newstate->inode); 442 int delegation_flags = 0; 443 if (nfsi->delegation) 444 delegation_flags = nfsi->delegation->flags; 445 if (!(delegation_flags & NFS_DELEGATION_NEED_RECLAIM)) 446 nfs_inode_set_delegation(newstate->inode, 447 opendata->owner->so_cred, 448 &opendata->o_res); 449 else 450 nfs_inode_reclaim_delegation(newstate->inode, 451 opendata->owner->so_cred, 452 &opendata->o_res); 453 } 454 nfs4_close_state(newstate, opendata->o_arg.open_flags); 455 } 456 if (newstate != state) 457 return -ESTALE; 458 return 0; 459 } 460 461 /* 462 * OPEN_RECLAIM: 463 * reclaim state on the server after a reboot. 464 */ 465 static int _nfs4_do_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state, struct dentry *dentry) 466 { 467 struct nfs_delegation *delegation = NFS_I(state->inode)->delegation; 468 struct nfs4_opendata *opendata; 469 int delegation_type = 0; 470 int status; 471 472 if (delegation != NULL) { 473 if (!(delegation->flags & NFS_DELEGATION_NEED_RECLAIM)) { 474 memcpy(&state->stateid, &delegation->stateid, 475 sizeof(state->stateid)); 476 set_bit(NFS_DELEGATED_STATE, &state->flags); 477 return 0; 478 } 479 delegation_type = delegation->type; 480 } 481 opendata = nfs4_opendata_alloc(dentry, sp, 0, NULL); 482 if (opendata == NULL) 483 return -ENOMEM; 484 opendata->o_arg.claim = NFS4_OPEN_CLAIM_PREVIOUS; 485 opendata->o_arg.fh = NFS_FH(state->inode); 486 nfs_copy_fh(&opendata->o_res.fh, opendata->o_arg.fh); 487 opendata->o_arg.u.delegation_type = delegation_type; 488 status = nfs4_open_recover(opendata, state); 489 nfs4_opendata_free(opendata); 490 return status; 491 } 492 493 static int nfs4_do_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state, struct dentry *dentry) 494 { 495 struct nfs_server *server = NFS_SERVER(state->inode); 496 struct nfs4_exception exception = { }; 497 int err; 498 do { 499 err = _nfs4_do_open_reclaim(sp, state, dentry); 500 if (err != -NFS4ERR_DELAY) 501 break; 502 nfs4_handle_exception(server, err, &exception); 503 } while (exception.retry); 504 return err; 505 } 506 507 static int nfs4_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state) 508 { 509 struct nfs_open_context *ctx; 510 int ret; 511 512 ctx = nfs4_state_find_open_context(state); 513 if (IS_ERR(ctx)) 514 return PTR_ERR(ctx); 515 ret = nfs4_do_open_reclaim(sp, state, ctx->dentry); 516 put_nfs_open_context(ctx); 517 return ret; 518 } 519 520 static int _nfs4_open_delegation_recall(struct dentry *dentry, struct nfs4_state *state) 521 { 522 struct nfs4_state_owner *sp = state->owner; 523 struct nfs4_opendata *opendata; 524 int ret; 525 526 if (!test_bit(NFS_DELEGATED_STATE, &state->flags)) 527 return 0; 528 opendata = nfs4_opendata_alloc(dentry, sp, 0, NULL); 529 if (opendata == NULL) 530 return -ENOMEM; 531 opendata->o_arg.claim = NFS4_OPEN_CLAIM_DELEGATE_CUR; 532 memcpy(opendata->o_arg.u.delegation.data, state->stateid.data, 533 sizeof(opendata->o_arg.u.delegation.data)); 534 ret = nfs4_open_recover(opendata, state); 535 nfs4_opendata_free(opendata); 536 return ret; 537 } 538 539 int nfs4_open_delegation_recall(struct dentry *dentry, struct nfs4_state *state) 540 { 541 struct nfs4_exception exception = { }; 542 struct nfs_server *server = NFS_SERVER(dentry->d_inode); 543 int err; 544 do { 545 err = _nfs4_open_delegation_recall(dentry, state); 546 switch (err) { 547 case 0: 548 return err; 549 case -NFS4ERR_STALE_CLIENTID: 550 case -NFS4ERR_STALE_STATEID: 551 case -NFS4ERR_EXPIRED: 552 /* Don't recall a delegation if it was lost */ 553 nfs4_schedule_state_recovery(server->nfs_client); 554 return err; 555 } 556 err = nfs4_handle_exception(server, err, &exception); 557 } while (exception.retry); 558 return err; 559 } 560 561 static void nfs4_open_confirm_prepare(struct rpc_task *task, void *calldata) 562 { 563 struct nfs4_opendata *data = calldata; 564 struct rpc_message msg = { 565 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM], 566 .rpc_argp = &data->c_arg, 567 .rpc_resp = &data->c_res, 568 .rpc_cred = data->owner->so_cred, 569 }; 570 data->timestamp = jiffies; 571 rpc_call_setup(task, &msg, 0); 572 } 573 574 static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata) 575 { 576 struct nfs4_opendata *data = calldata; 577 578 data->rpc_status = task->tk_status; 579 if (RPC_ASSASSINATED(task)) 580 return; 581 if (data->rpc_status == 0) { 582 memcpy(data->o_res.stateid.data, data->c_res.stateid.data, 583 sizeof(data->o_res.stateid.data)); 584 renew_lease(data->o_res.server, data->timestamp); 585 } 586 nfs_increment_open_seqid(data->rpc_status, data->c_arg.seqid); 587 nfs_confirm_seqid(&data->owner->so_seqid, data->rpc_status); 588 } 589 590 static void nfs4_open_confirm_release(void *calldata) 591 { 592 struct nfs4_opendata *data = calldata; 593 struct nfs4_state *state = NULL; 594 595 /* If this request hasn't been cancelled, do nothing */ 596 if (data->cancelled == 0) 597 goto out_free; 598 /* In case of error, no cleanup! */ 599 if (data->rpc_status != 0) 600 goto out_free; 601 nfs_confirm_seqid(&data->owner->so_seqid, 0); 602 state = nfs4_opendata_to_nfs4_state(data); 603 if (state != NULL) 604 nfs4_close_state(state, data->o_arg.open_flags); 605 out_free: 606 nfs4_opendata_free(data); 607 } 608 609 static const struct rpc_call_ops nfs4_open_confirm_ops = { 610 .rpc_call_prepare = nfs4_open_confirm_prepare, 611 .rpc_call_done = nfs4_open_confirm_done, 612 .rpc_release = nfs4_open_confirm_release, 613 }; 614 615 /* 616 * Note: On error, nfs4_proc_open_confirm will free the struct nfs4_opendata 617 */ 618 static int _nfs4_proc_open_confirm(struct nfs4_opendata *data) 619 { 620 struct nfs_server *server = NFS_SERVER(data->dir->d_inode); 621 struct rpc_task *task; 622 int status; 623 624 atomic_inc(&data->count); 625 /* 626 * If rpc_run_task() ends up calling ->rpc_release(), we 627 * want to ensure that it takes the 'error' code path. 628 */ 629 data->rpc_status = -ENOMEM; 630 task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_open_confirm_ops, data); 631 if (IS_ERR(task)) 632 return PTR_ERR(task); 633 status = nfs4_wait_for_completion_rpc_task(task); 634 if (status != 0) { 635 data->cancelled = 1; 636 smp_wmb(); 637 } else 638 status = data->rpc_status; 639 rpc_put_task(task); 640 return status; 641 } 642 643 static void nfs4_open_prepare(struct rpc_task *task, void *calldata) 644 { 645 struct nfs4_opendata *data = calldata; 646 struct nfs4_state_owner *sp = data->owner; 647 struct rpc_message msg = { 648 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN], 649 .rpc_argp = &data->o_arg, 650 .rpc_resp = &data->o_res, 651 .rpc_cred = sp->so_cred, 652 }; 653 654 if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0) 655 return; 656 /* Update sequence id. */ 657 data->o_arg.id = sp->so_id; 658 data->o_arg.clientid = sp->so_client->cl_clientid; 659 if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) 660 msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR]; 661 data->timestamp = jiffies; 662 rpc_call_setup(task, &msg, 0); 663 } 664 665 static void nfs4_open_done(struct rpc_task *task, void *calldata) 666 { 667 struct nfs4_opendata *data = calldata; 668 669 data->rpc_status = task->tk_status; 670 if (RPC_ASSASSINATED(task)) 671 return; 672 if (task->tk_status == 0) { 673 switch (data->o_res.f_attr->mode & S_IFMT) { 674 case S_IFREG: 675 break; 676 case S_IFLNK: 677 data->rpc_status = -ELOOP; 678 break; 679 case S_IFDIR: 680 data->rpc_status = -EISDIR; 681 break; 682 default: 683 data->rpc_status = -ENOTDIR; 684 } 685 renew_lease(data->o_res.server, data->timestamp); 686 } 687 nfs_increment_open_seqid(data->rpc_status, data->o_arg.seqid); 688 } 689 690 static void nfs4_open_release(void *calldata) 691 { 692 struct nfs4_opendata *data = calldata; 693 struct nfs4_state *state = NULL; 694 695 /* If this request hasn't been cancelled, do nothing */ 696 if (data->cancelled == 0) 697 goto out_free; 698 /* In case of error, no cleanup! */ 699 if (data->rpc_status != 0) 700 goto out_free; 701 /* In case we need an open_confirm, no cleanup! */ 702 if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM) 703 goto out_free; 704 nfs_confirm_seqid(&data->owner->so_seqid, 0); 705 state = nfs4_opendata_to_nfs4_state(data); 706 if (state != NULL) 707 nfs4_close_state(state, data->o_arg.open_flags); 708 out_free: 709 nfs4_opendata_free(data); 710 } 711 712 static const struct rpc_call_ops nfs4_open_ops = { 713 .rpc_call_prepare = nfs4_open_prepare, 714 .rpc_call_done = nfs4_open_done, 715 .rpc_release = nfs4_open_release, 716 }; 717 718 /* 719 * Note: On error, nfs4_proc_open will free the struct nfs4_opendata 720 */ 721 static int _nfs4_proc_open(struct nfs4_opendata *data) 722 { 723 struct inode *dir = data->dir->d_inode; 724 struct nfs_server *server = NFS_SERVER(dir); 725 struct nfs_openargs *o_arg = &data->o_arg; 726 struct nfs_openres *o_res = &data->o_res; 727 struct rpc_task *task; 728 int status; 729 730 atomic_inc(&data->count); 731 /* 732 * If rpc_run_task() ends up calling ->rpc_release(), we 733 * want to ensure that it takes the 'error' code path. 734 */ 735 data->rpc_status = -ENOMEM; 736 task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_open_ops, data); 737 if (IS_ERR(task)) 738 return PTR_ERR(task); 739 status = nfs4_wait_for_completion_rpc_task(task); 740 if (status != 0) { 741 data->cancelled = 1; 742 smp_wmb(); 743 } else 744 status = data->rpc_status; 745 rpc_put_task(task); 746 if (status != 0) 747 return status; 748 749 if (o_arg->open_flags & O_CREAT) { 750 update_changeattr(dir, &o_res->cinfo); 751 nfs_post_op_update_inode(dir, o_res->dir_attr); 752 } else 753 nfs_refresh_inode(dir, o_res->dir_attr); 754 if(o_res->rflags & NFS4_OPEN_RESULT_CONFIRM) { 755 status = _nfs4_proc_open_confirm(data); 756 if (status != 0) 757 return status; 758 } 759 nfs_confirm_seqid(&data->owner->so_seqid, 0); 760 if (!(o_res->f_attr->valid & NFS_ATTR_FATTR)) 761 return server->nfs_client->rpc_ops->getattr(server, &o_res->fh, o_res->f_attr); 762 return 0; 763 } 764 765 static int _nfs4_do_access(struct inode *inode, struct rpc_cred *cred, int openflags) 766 { 767 struct nfs_access_entry cache; 768 int mask = 0; 769 int status; 770 771 if (openflags & FMODE_READ) 772 mask |= MAY_READ; 773 if (openflags & FMODE_WRITE) 774 mask |= MAY_WRITE; 775 status = nfs_access_get_cached(inode, cred, &cache); 776 if (status == 0) 777 goto out; 778 779 /* Be clever: ask server to check for all possible rights */ 780 cache.mask = MAY_EXEC | MAY_WRITE | MAY_READ; 781 cache.cred = cred; 782 cache.jiffies = jiffies; 783 status = _nfs4_proc_access(inode, &cache); 784 if (status != 0) 785 return status; 786 nfs_access_add_cache(inode, &cache); 787 out: 788 if ((cache.mask & mask) == mask) 789 return 0; 790 return -EACCES; 791 } 792 793 int nfs4_recover_expired_lease(struct nfs_server *server) 794 { 795 struct nfs_client *clp = server->nfs_client; 796 int ret; 797 798 for (;;) { 799 ret = nfs4_wait_clnt_recover(server->client, clp); 800 if (ret != 0) 801 return ret; 802 if (!test_and_clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) 803 break; 804 nfs4_schedule_state_recovery(clp); 805 } 806 return 0; 807 } 808 809 /* 810 * OPEN_EXPIRED: 811 * reclaim state on the server after a network partition. 812 * Assumes caller holds the appropriate lock 813 */ 814 static int _nfs4_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state, struct dentry *dentry) 815 { 816 struct inode *inode = state->inode; 817 struct nfs_delegation *delegation = NFS_I(inode)->delegation; 818 struct nfs4_opendata *opendata; 819 int openflags = state->state & (FMODE_READ|FMODE_WRITE); 820 int ret; 821 822 if (delegation != NULL && !(delegation->flags & NFS_DELEGATION_NEED_RECLAIM)) { 823 ret = _nfs4_do_access(inode, sp->so_cred, openflags); 824 if (ret < 0) 825 return ret; 826 memcpy(&state->stateid, &delegation->stateid, sizeof(state->stateid)); 827 set_bit(NFS_DELEGATED_STATE, &state->flags); 828 return 0; 829 } 830 opendata = nfs4_opendata_alloc(dentry, sp, openflags, NULL); 831 if (opendata == NULL) 832 return -ENOMEM; 833 ret = nfs4_open_recover(opendata, state); 834 if (ret == -ESTALE) { 835 /* Invalidate the state owner so we don't ever use it again */ 836 nfs4_drop_state_owner(sp); 837 d_drop(dentry); 838 } 839 nfs4_opendata_free(opendata); 840 return ret; 841 } 842 843 static inline int nfs4_do_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state, struct dentry *dentry) 844 { 845 struct nfs_server *server = NFS_SERVER(dentry->d_inode); 846 struct nfs4_exception exception = { }; 847 int err; 848 849 do { 850 err = _nfs4_open_expired(sp, state, dentry); 851 if (err == -NFS4ERR_DELAY) 852 nfs4_handle_exception(server, err, &exception); 853 } while (exception.retry); 854 return err; 855 } 856 857 static int nfs4_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state) 858 { 859 struct nfs_open_context *ctx; 860 int ret; 861 862 ctx = nfs4_state_find_open_context(state); 863 if (IS_ERR(ctx)) 864 return PTR_ERR(ctx); 865 ret = nfs4_do_open_expired(sp, state, ctx->dentry); 866 put_nfs_open_context(ctx); 867 return ret; 868 } 869 870 /* 871 * Returns a referenced nfs4_state if there is an open delegation on the file 872 */ 873 static int _nfs4_open_delegated(struct inode *inode, int flags, struct rpc_cred *cred, struct nfs4_state **res) 874 { 875 struct nfs_delegation *delegation; 876 struct nfs_server *server = NFS_SERVER(inode); 877 struct nfs_client *clp = server->nfs_client; 878 struct nfs_inode *nfsi = NFS_I(inode); 879 struct nfs4_state_owner *sp = NULL; 880 struct nfs4_state *state = NULL; 881 int open_flags = flags & (FMODE_READ|FMODE_WRITE); 882 int err; 883 884 err = -ENOMEM; 885 if (!(sp = nfs4_get_state_owner(server, cred))) { 886 dprintk("%s: nfs4_get_state_owner failed!\n", __FUNCTION__); 887 return err; 888 } 889 err = nfs4_recover_expired_lease(server); 890 if (err != 0) 891 goto out_put_state_owner; 892 /* Protect against reboot recovery - NOTE ORDER! */ 893 down_read(&clp->cl_sem); 894 /* Protect against delegation recall */ 895 down_read(&nfsi->rwsem); 896 delegation = NFS_I(inode)->delegation; 897 err = -ENOENT; 898 if (delegation == NULL || (delegation->type & open_flags) != open_flags) 899 goto out_err; 900 err = -ENOMEM; 901 state = nfs4_get_open_state(inode, sp); 902 if (state == NULL) 903 goto out_err; 904 905 err = -ENOENT; 906 if ((state->state & open_flags) == open_flags) { 907 spin_lock(&inode->i_lock); 908 update_open_stateflags(state, open_flags); 909 spin_unlock(&inode->i_lock); 910 goto out_ok; 911 } else if (state->state != 0) 912 goto out_put_open_state; 913 914 lock_kernel(); 915 err = _nfs4_do_access(inode, cred, open_flags); 916 unlock_kernel(); 917 if (err != 0) 918 goto out_put_open_state; 919 set_bit(NFS_DELEGATED_STATE, &state->flags); 920 update_open_stateid(state, &delegation->stateid, open_flags); 921 out_ok: 922 nfs4_put_state_owner(sp); 923 up_read(&nfsi->rwsem); 924 up_read(&clp->cl_sem); 925 *res = state; 926 return 0; 927 out_put_open_state: 928 nfs4_put_open_state(state); 929 out_err: 930 up_read(&nfsi->rwsem); 931 up_read(&clp->cl_sem); 932 if (err != -EACCES) 933 nfs_inode_return_delegation(inode); 934 out_put_state_owner: 935 nfs4_put_state_owner(sp); 936 return err; 937 } 938 939 static struct nfs4_state *nfs4_open_delegated(struct inode *inode, int flags, struct rpc_cred *cred) 940 { 941 struct nfs4_exception exception = { }; 942 struct nfs4_state *res = ERR_PTR(-EIO); 943 int err; 944 945 do { 946 err = _nfs4_open_delegated(inode, flags, cred, &res); 947 if (err == 0) 948 break; 949 res = ERR_PTR(nfs4_handle_exception(NFS_SERVER(inode), 950 err, &exception)); 951 } while (exception.retry); 952 return res; 953 } 954 955 /* 956 * Returns a referenced nfs4_state 957 */ 958 static int _nfs4_do_open(struct inode *dir, struct dentry *dentry, int flags, struct iattr *sattr, struct rpc_cred *cred, struct nfs4_state **res) 959 { 960 struct nfs4_state_owner *sp; 961 struct nfs4_state *state = NULL; 962 struct nfs_server *server = NFS_SERVER(dir); 963 struct nfs_client *clp = server->nfs_client; 964 struct nfs4_opendata *opendata; 965 int status; 966 967 /* Protect against reboot recovery conflicts */ 968 status = -ENOMEM; 969 if (!(sp = nfs4_get_state_owner(server, cred))) { 970 dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n"); 971 goto out_err; 972 } 973 status = nfs4_recover_expired_lease(server); 974 if (status != 0) 975 goto err_put_state_owner; 976 down_read(&clp->cl_sem); 977 status = -ENOMEM; 978 opendata = nfs4_opendata_alloc(dentry, sp, flags, sattr); 979 if (opendata == NULL) 980 goto err_release_rwsem; 981 982 status = _nfs4_proc_open(opendata); 983 if (status != 0) 984 goto err_opendata_free; 985 986 status = -ENOMEM; 987 state = nfs4_opendata_to_nfs4_state(opendata); 988 if (state == NULL) 989 goto err_opendata_free; 990 if (opendata->o_res.delegation_type != 0) 991 nfs_inode_set_delegation(state->inode, cred, &opendata->o_res); 992 nfs4_opendata_free(opendata); 993 nfs4_put_state_owner(sp); 994 up_read(&clp->cl_sem); 995 *res = state; 996 return 0; 997 err_opendata_free: 998 nfs4_opendata_free(opendata); 999 err_release_rwsem: 1000 up_read(&clp->cl_sem); 1001 err_put_state_owner: 1002 nfs4_put_state_owner(sp); 1003 out_err: 1004 *res = NULL; 1005 return status; 1006 } 1007 1008 1009 static struct nfs4_state *nfs4_do_open(struct inode *dir, struct dentry *dentry, int flags, struct iattr *sattr, struct rpc_cred *cred) 1010 { 1011 struct nfs4_exception exception = { }; 1012 struct nfs4_state *res; 1013 int status; 1014 1015 do { 1016 status = _nfs4_do_open(dir, dentry, flags, sattr, cred, &res); 1017 if (status == 0) 1018 break; 1019 /* NOTE: BAD_SEQID means the server and client disagree about the 1020 * book-keeping w.r.t. state-changing operations 1021 * (OPEN/CLOSE/LOCK/LOCKU...) 1022 * It is actually a sign of a bug on the client or on the server. 1023 * 1024 * If we receive a BAD_SEQID error in the particular case of 1025 * doing an OPEN, we assume that nfs_increment_open_seqid() will 1026 * have unhashed the old state_owner for us, and that we can 1027 * therefore safely retry using a new one. We should still warn 1028 * the user though... 1029 */ 1030 if (status == -NFS4ERR_BAD_SEQID) { 1031 printk(KERN_WARNING "NFS: v4 server returned a bad sequence-id error!\n"); 1032 exception.retry = 1; 1033 continue; 1034 } 1035 /* 1036 * BAD_STATEID on OPEN means that the server cancelled our 1037 * state before it received the OPEN_CONFIRM. 1038 * Recover by retrying the request as per the discussion 1039 * on Page 181 of RFC3530. 1040 */ 1041 if (status == -NFS4ERR_BAD_STATEID) { 1042 exception.retry = 1; 1043 continue; 1044 } 1045 res = ERR_PTR(nfs4_handle_exception(NFS_SERVER(dir), 1046 status, &exception)); 1047 } while (exception.retry); 1048 return res; 1049 } 1050 1051 static int _nfs4_do_setattr(struct inode *inode, struct nfs_fattr *fattr, 1052 struct iattr *sattr, struct nfs4_state *state) 1053 { 1054 struct nfs_server *server = NFS_SERVER(inode); 1055 struct nfs_setattrargs arg = { 1056 .fh = NFS_FH(inode), 1057 .iap = sattr, 1058 .server = server, 1059 .bitmask = server->attr_bitmask, 1060 }; 1061 struct nfs_setattrres res = { 1062 .fattr = fattr, 1063 .server = server, 1064 }; 1065 struct rpc_message msg = { 1066 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETATTR], 1067 .rpc_argp = &arg, 1068 .rpc_resp = &res, 1069 }; 1070 unsigned long timestamp = jiffies; 1071 int status; 1072 1073 nfs_fattr_init(fattr); 1074 1075 if (nfs4_copy_delegation_stateid(&arg.stateid, inode)) { 1076 /* Use that stateid */ 1077 } else if (state != NULL) { 1078 msg.rpc_cred = state->owner->so_cred; 1079 nfs4_copy_stateid(&arg.stateid, state, current->files); 1080 } else 1081 memcpy(&arg.stateid, &zero_stateid, sizeof(arg.stateid)); 1082 1083 status = rpc_call_sync(server->client, &msg, 0); 1084 if (status == 0 && state != NULL) 1085 renew_lease(server, timestamp); 1086 return status; 1087 } 1088 1089 static int nfs4_do_setattr(struct inode *inode, struct nfs_fattr *fattr, 1090 struct iattr *sattr, struct nfs4_state *state) 1091 { 1092 struct nfs_server *server = NFS_SERVER(inode); 1093 struct nfs4_exception exception = { }; 1094 int err; 1095 do { 1096 err = nfs4_handle_exception(server, 1097 _nfs4_do_setattr(inode, fattr, sattr, state), 1098 &exception); 1099 } while (exception.retry); 1100 return err; 1101 } 1102 1103 struct nfs4_closedata { 1104 struct inode *inode; 1105 struct nfs4_state *state; 1106 struct nfs_closeargs arg; 1107 struct nfs_closeres res; 1108 struct nfs_fattr fattr; 1109 unsigned long timestamp; 1110 }; 1111 1112 static void nfs4_free_closedata(void *data) 1113 { 1114 struct nfs4_closedata *calldata = data; 1115 struct nfs4_state_owner *sp = calldata->state->owner; 1116 1117 nfs4_put_open_state(calldata->state); 1118 nfs_free_seqid(calldata->arg.seqid); 1119 nfs4_put_state_owner(sp); 1120 kfree(calldata); 1121 } 1122 1123 static void nfs4_close_done(struct rpc_task *task, void *data) 1124 { 1125 struct nfs4_closedata *calldata = data; 1126 struct nfs4_state *state = calldata->state; 1127 struct nfs_server *server = NFS_SERVER(calldata->inode); 1128 1129 if (RPC_ASSASSINATED(task)) 1130 return; 1131 /* hmm. we are done with the inode, and in the process of freeing 1132 * the state_owner. we keep this around to process errors 1133 */ 1134 nfs_increment_open_seqid(task->tk_status, calldata->arg.seqid); 1135 switch (task->tk_status) { 1136 case 0: 1137 memcpy(&state->stateid, &calldata->res.stateid, 1138 sizeof(state->stateid)); 1139 renew_lease(server, calldata->timestamp); 1140 break; 1141 case -NFS4ERR_STALE_STATEID: 1142 case -NFS4ERR_EXPIRED: 1143 nfs4_schedule_state_recovery(server->nfs_client); 1144 break; 1145 default: 1146 if (nfs4_async_handle_error(task, server) == -EAGAIN) { 1147 rpc_restart_call(task); 1148 return; 1149 } 1150 } 1151 nfs_refresh_inode(calldata->inode, calldata->res.fattr); 1152 } 1153 1154 static void nfs4_close_prepare(struct rpc_task *task, void *data) 1155 { 1156 struct nfs4_closedata *calldata = data; 1157 struct nfs4_state *state = calldata->state; 1158 struct rpc_message msg = { 1159 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE], 1160 .rpc_argp = &calldata->arg, 1161 .rpc_resp = &calldata->res, 1162 .rpc_cred = state->owner->so_cred, 1163 }; 1164 int mode = 0, old_mode; 1165 1166 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0) 1167 return; 1168 /* Recalculate the new open mode in case someone reopened the file 1169 * while we were waiting in line to be scheduled. 1170 */ 1171 spin_lock(&state->owner->so_lock); 1172 spin_lock(&calldata->inode->i_lock); 1173 mode = old_mode = state->state; 1174 if (state->n_rdwr == 0) { 1175 if (state->n_rdonly == 0) 1176 mode &= ~FMODE_READ; 1177 if (state->n_wronly == 0) 1178 mode &= ~FMODE_WRITE; 1179 } 1180 nfs4_state_set_mode_locked(state, mode); 1181 spin_unlock(&calldata->inode->i_lock); 1182 spin_unlock(&state->owner->so_lock); 1183 if (mode == old_mode || test_bit(NFS_DELEGATED_STATE, &state->flags)) { 1184 /* Note: exit _without_ calling nfs4_close_done */ 1185 task->tk_action = NULL; 1186 return; 1187 } 1188 nfs_fattr_init(calldata->res.fattr); 1189 if (mode != 0) 1190 msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE]; 1191 calldata->arg.open_flags = mode; 1192 calldata->timestamp = jiffies; 1193 rpc_call_setup(task, &msg, 0); 1194 } 1195 1196 static const struct rpc_call_ops nfs4_close_ops = { 1197 .rpc_call_prepare = nfs4_close_prepare, 1198 .rpc_call_done = nfs4_close_done, 1199 .rpc_release = nfs4_free_closedata, 1200 }; 1201 1202 /* 1203 * It is possible for data to be read/written from a mem-mapped file 1204 * after the sys_close call (which hits the vfs layer as a flush). 1205 * This means that we can't safely call nfsv4 close on a file until 1206 * the inode is cleared. This in turn means that we are not good 1207 * NFSv4 citizens - we do not indicate to the server to update the file's 1208 * share state even when we are done with one of the three share 1209 * stateid's in the inode. 1210 * 1211 * NOTE: Caller must be holding the sp->so_owner semaphore! 1212 */ 1213 int nfs4_do_close(struct inode *inode, struct nfs4_state *state) 1214 { 1215 struct nfs_server *server = NFS_SERVER(inode); 1216 struct nfs4_closedata *calldata; 1217 int status = -ENOMEM; 1218 1219 calldata = kmalloc(sizeof(*calldata), GFP_KERNEL); 1220 if (calldata == NULL) 1221 goto out; 1222 calldata->inode = inode; 1223 calldata->state = state; 1224 calldata->arg.fh = NFS_FH(inode); 1225 calldata->arg.stateid = &state->stateid; 1226 /* Serialization for the sequence id */ 1227 calldata->arg.seqid = nfs_alloc_seqid(&state->owner->so_seqid); 1228 if (calldata->arg.seqid == NULL) 1229 goto out_free_calldata; 1230 calldata->arg.bitmask = server->attr_bitmask; 1231 calldata->res.fattr = &calldata->fattr; 1232 calldata->res.server = server; 1233 1234 status = nfs4_call_async(server->client, &nfs4_close_ops, calldata); 1235 if (status == 0) 1236 goto out; 1237 1238 nfs_free_seqid(calldata->arg.seqid); 1239 out_free_calldata: 1240 kfree(calldata); 1241 out: 1242 return status; 1243 } 1244 1245 static int nfs4_intent_set_file(struct nameidata *nd, struct dentry *dentry, struct nfs4_state *state) 1246 { 1247 struct file *filp; 1248 1249 filp = lookup_instantiate_filp(nd, dentry, NULL); 1250 if (!IS_ERR(filp)) { 1251 struct nfs_open_context *ctx; 1252 ctx = (struct nfs_open_context *)filp->private_data; 1253 ctx->state = state; 1254 return 0; 1255 } 1256 nfs4_close_state(state, nd->intent.open.flags); 1257 return PTR_ERR(filp); 1258 } 1259 1260 struct dentry * 1261 nfs4_atomic_open(struct inode *dir, struct dentry *dentry, struct nameidata *nd) 1262 { 1263 struct iattr attr; 1264 struct rpc_cred *cred; 1265 struct nfs4_state *state; 1266 struct dentry *res; 1267 1268 if (nd->flags & LOOKUP_CREATE) { 1269 attr.ia_mode = nd->intent.open.create_mode; 1270 attr.ia_valid = ATTR_MODE; 1271 if (!IS_POSIXACL(dir)) 1272 attr.ia_mode &= ~current->fs->umask; 1273 } else { 1274 attr.ia_valid = 0; 1275 BUG_ON(nd->intent.open.flags & O_CREAT); 1276 } 1277 1278 cred = rpcauth_lookupcred(NFS_CLIENT(dir)->cl_auth, 0); 1279 if (IS_ERR(cred)) 1280 return (struct dentry *)cred; 1281 state = nfs4_do_open(dir, dentry, nd->intent.open.flags, &attr, cred); 1282 put_rpccred(cred); 1283 if (IS_ERR(state)) { 1284 if (PTR_ERR(state) == -ENOENT) 1285 d_add(dentry, NULL); 1286 return (struct dentry *)state; 1287 } 1288 res = d_add_unique(dentry, igrab(state->inode)); 1289 if (res != NULL) 1290 dentry = res; 1291 nfs4_intent_set_file(nd, dentry, state); 1292 return res; 1293 } 1294 1295 int 1296 nfs4_open_revalidate(struct inode *dir, struct dentry *dentry, int openflags, struct nameidata *nd) 1297 { 1298 struct rpc_cred *cred; 1299 struct nfs4_state *state; 1300 1301 cred = rpcauth_lookupcred(NFS_CLIENT(dir)->cl_auth, 0); 1302 if (IS_ERR(cred)) 1303 return PTR_ERR(cred); 1304 state = nfs4_open_delegated(dentry->d_inode, openflags, cred); 1305 if (IS_ERR(state)) 1306 state = nfs4_do_open(dir, dentry, openflags, NULL, cred); 1307 put_rpccred(cred); 1308 if (IS_ERR(state)) { 1309 switch (PTR_ERR(state)) { 1310 case -EPERM: 1311 case -EACCES: 1312 case -EDQUOT: 1313 case -ENOSPC: 1314 case -EROFS: 1315 lookup_instantiate_filp(nd, (struct dentry *)state, NULL); 1316 return 1; 1317 default: 1318 goto out_drop; 1319 } 1320 } 1321 if (state->inode == dentry->d_inode) { 1322 nfs4_intent_set_file(nd, dentry, state); 1323 return 1; 1324 } 1325 nfs4_close_state(state, openflags); 1326 out_drop: 1327 d_drop(dentry); 1328 return 0; 1329 } 1330 1331 1332 static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle) 1333 { 1334 struct nfs4_server_caps_res res = {}; 1335 struct rpc_message msg = { 1336 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SERVER_CAPS], 1337 .rpc_argp = fhandle, 1338 .rpc_resp = &res, 1339 }; 1340 int status; 1341 1342 status = rpc_call_sync(server->client, &msg, 0); 1343 if (status == 0) { 1344 memcpy(server->attr_bitmask, res.attr_bitmask, sizeof(server->attr_bitmask)); 1345 if (res.attr_bitmask[0] & FATTR4_WORD0_ACL) 1346 server->caps |= NFS_CAP_ACLS; 1347 if (res.has_links != 0) 1348 server->caps |= NFS_CAP_HARDLINKS; 1349 if (res.has_symlinks != 0) 1350 server->caps |= NFS_CAP_SYMLINKS; 1351 server->acl_bitmask = res.acl_bitmask; 1352 } 1353 return status; 1354 } 1355 1356 int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle) 1357 { 1358 struct nfs4_exception exception = { }; 1359 int err; 1360 do { 1361 err = nfs4_handle_exception(server, 1362 _nfs4_server_capabilities(server, fhandle), 1363 &exception); 1364 } while (exception.retry); 1365 return err; 1366 } 1367 1368 static int _nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle, 1369 struct nfs_fsinfo *info) 1370 { 1371 struct nfs4_lookup_root_arg args = { 1372 .bitmask = nfs4_fattr_bitmap, 1373 }; 1374 struct nfs4_lookup_res res = { 1375 .server = server, 1376 .fattr = info->fattr, 1377 .fh = fhandle, 1378 }; 1379 struct rpc_message msg = { 1380 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP_ROOT], 1381 .rpc_argp = &args, 1382 .rpc_resp = &res, 1383 }; 1384 nfs_fattr_init(info->fattr); 1385 return rpc_call_sync(server->client, &msg, 0); 1386 } 1387 1388 static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle, 1389 struct nfs_fsinfo *info) 1390 { 1391 struct nfs4_exception exception = { }; 1392 int err; 1393 do { 1394 err = nfs4_handle_exception(server, 1395 _nfs4_lookup_root(server, fhandle, info), 1396 &exception); 1397 } while (exception.retry); 1398 return err; 1399 } 1400 1401 /* 1402 * get the file handle for the "/" directory on the server 1403 */ 1404 static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, 1405 struct nfs_fsinfo *info) 1406 { 1407 int status; 1408 1409 status = nfs4_lookup_root(server, fhandle, info); 1410 if (status == 0) 1411 status = nfs4_server_capabilities(server, fhandle); 1412 if (status == 0) 1413 status = nfs4_do_fsinfo(server, fhandle, info); 1414 return nfs4_map_errors(status); 1415 } 1416 1417 /* 1418 * Get locations and (maybe) other attributes of a referral. 1419 * Note that we'll actually follow the referral later when 1420 * we detect fsid mismatch in inode revalidation 1421 */ 1422 static int nfs4_get_referral(struct inode *dir, struct qstr *name, struct nfs_fattr *fattr, struct nfs_fh *fhandle) 1423 { 1424 int status = -ENOMEM; 1425 struct page *page = NULL; 1426 struct nfs4_fs_locations *locations = NULL; 1427 struct dentry dentry = {}; 1428 1429 page = alloc_page(GFP_KERNEL); 1430 if (page == NULL) 1431 goto out; 1432 locations = kmalloc(sizeof(struct nfs4_fs_locations), GFP_KERNEL); 1433 if (locations == NULL) 1434 goto out; 1435 1436 dentry.d_name.name = name->name; 1437 dentry.d_name.len = name->len; 1438 status = nfs4_proc_fs_locations(dir, &dentry, locations, page); 1439 if (status != 0) 1440 goto out; 1441 /* Make sure server returned a different fsid for the referral */ 1442 if (nfs_fsid_equal(&NFS_SERVER(dir)->fsid, &locations->fattr.fsid)) { 1443 dprintk("%s: server did not return a different fsid for a referral at %s\n", __FUNCTION__, name->name); 1444 status = -EIO; 1445 goto out; 1446 } 1447 1448 memcpy(fattr, &locations->fattr, sizeof(struct nfs_fattr)); 1449 fattr->valid |= NFS_ATTR_FATTR_V4_REFERRAL; 1450 if (!fattr->mode) 1451 fattr->mode = S_IFDIR; 1452 memset(fhandle, 0, sizeof(struct nfs_fh)); 1453 out: 1454 if (page) 1455 __free_page(page); 1456 if (locations) 1457 kfree(locations); 1458 return status; 1459 } 1460 1461 static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr) 1462 { 1463 struct nfs4_getattr_arg args = { 1464 .fh = fhandle, 1465 .bitmask = server->attr_bitmask, 1466 }; 1467 struct nfs4_getattr_res res = { 1468 .fattr = fattr, 1469 .server = server, 1470 }; 1471 struct rpc_message msg = { 1472 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETATTR], 1473 .rpc_argp = &args, 1474 .rpc_resp = &res, 1475 }; 1476 1477 nfs_fattr_init(fattr); 1478 return rpc_call_sync(server->client, &msg, 0); 1479 } 1480 1481 static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr) 1482 { 1483 struct nfs4_exception exception = { }; 1484 int err; 1485 do { 1486 err = nfs4_handle_exception(server, 1487 _nfs4_proc_getattr(server, fhandle, fattr), 1488 &exception); 1489 } while (exception.retry); 1490 return err; 1491 } 1492 1493 /* 1494 * The file is not closed if it is opened due to the a request to change 1495 * the size of the file. The open call will not be needed once the 1496 * VFS layer lookup-intents are implemented. 1497 * 1498 * Close is called when the inode is destroyed. 1499 * If we haven't opened the file for O_WRONLY, we 1500 * need to in the size_change case to obtain a stateid. 1501 * 1502 * Got race? 1503 * Because OPEN is always done by name in nfsv4, it is 1504 * possible that we opened a different file by the same 1505 * name. We can recognize this race condition, but we 1506 * can't do anything about it besides returning an error. 1507 * 1508 * This will be fixed with VFS changes (lookup-intent). 1509 */ 1510 static int 1511 nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr, 1512 struct iattr *sattr) 1513 { 1514 struct rpc_cred *cred; 1515 struct inode *inode = dentry->d_inode; 1516 struct nfs_open_context *ctx; 1517 struct nfs4_state *state = NULL; 1518 int status; 1519 1520 nfs_fattr_init(fattr); 1521 1522 cred = rpcauth_lookupcred(NFS_CLIENT(inode)->cl_auth, 0); 1523 if (IS_ERR(cred)) 1524 return PTR_ERR(cred); 1525 1526 /* Search for an existing open(O_WRITE) file */ 1527 ctx = nfs_find_open_context(inode, cred, FMODE_WRITE); 1528 if (ctx != NULL) 1529 state = ctx->state; 1530 1531 status = nfs4_do_setattr(inode, fattr, sattr, state); 1532 if (status == 0) 1533 nfs_setattr_update_inode(inode, sattr); 1534 if (ctx != NULL) 1535 put_nfs_open_context(ctx); 1536 put_rpccred(cred); 1537 return status; 1538 } 1539 1540 static int _nfs4_proc_lookupfh(struct nfs_server *server, struct nfs_fh *dirfh, 1541 struct qstr *name, struct nfs_fh *fhandle, 1542 struct nfs_fattr *fattr) 1543 { 1544 int status; 1545 struct nfs4_lookup_arg args = { 1546 .bitmask = server->attr_bitmask, 1547 .dir_fh = dirfh, 1548 .name = name, 1549 }; 1550 struct nfs4_lookup_res res = { 1551 .server = server, 1552 .fattr = fattr, 1553 .fh = fhandle, 1554 }; 1555 struct rpc_message msg = { 1556 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP], 1557 .rpc_argp = &args, 1558 .rpc_resp = &res, 1559 }; 1560 1561 nfs_fattr_init(fattr); 1562 1563 dprintk("NFS call lookupfh %s\n", name->name); 1564 status = rpc_call_sync(server->client, &msg, 0); 1565 dprintk("NFS reply lookupfh: %d\n", status); 1566 if (status == -NFS4ERR_MOVED) 1567 status = -EREMOTE; 1568 return status; 1569 } 1570 1571 static int nfs4_proc_lookupfh(struct nfs_server *server, struct nfs_fh *dirfh, 1572 struct qstr *name, struct nfs_fh *fhandle, 1573 struct nfs_fattr *fattr) 1574 { 1575 struct nfs4_exception exception = { }; 1576 int err; 1577 do { 1578 err = nfs4_handle_exception(server, 1579 _nfs4_proc_lookupfh(server, dirfh, name, 1580 fhandle, fattr), 1581 &exception); 1582 } while (exception.retry); 1583 return err; 1584 } 1585 1586 static int _nfs4_proc_lookup(struct inode *dir, struct qstr *name, 1587 struct nfs_fh *fhandle, struct nfs_fattr *fattr) 1588 { 1589 int status; 1590 struct nfs_server *server = NFS_SERVER(dir); 1591 struct nfs4_lookup_arg args = { 1592 .bitmask = server->attr_bitmask, 1593 .dir_fh = NFS_FH(dir), 1594 .name = name, 1595 }; 1596 struct nfs4_lookup_res res = { 1597 .server = server, 1598 .fattr = fattr, 1599 .fh = fhandle, 1600 }; 1601 struct rpc_message msg = { 1602 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP], 1603 .rpc_argp = &args, 1604 .rpc_resp = &res, 1605 }; 1606 1607 nfs_fattr_init(fattr); 1608 1609 dprintk("NFS call lookup %s\n", name->name); 1610 status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); 1611 if (status == -NFS4ERR_MOVED) 1612 status = nfs4_get_referral(dir, name, fattr, fhandle); 1613 dprintk("NFS reply lookup: %d\n", status); 1614 return status; 1615 } 1616 1617 static int nfs4_proc_lookup(struct inode *dir, struct qstr *name, struct nfs_fh *fhandle, struct nfs_fattr *fattr) 1618 { 1619 struct nfs4_exception exception = { }; 1620 int err; 1621 do { 1622 err = nfs4_handle_exception(NFS_SERVER(dir), 1623 _nfs4_proc_lookup(dir, name, fhandle, fattr), 1624 &exception); 1625 } while (exception.retry); 1626 return err; 1627 } 1628 1629 static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry) 1630 { 1631 struct nfs4_accessargs args = { 1632 .fh = NFS_FH(inode), 1633 }; 1634 struct nfs4_accessres res = { 0 }; 1635 struct rpc_message msg = { 1636 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ACCESS], 1637 .rpc_argp = &args, 1638 .rpc_resp = &res, 1639 .rpc_cred = entry->cred, 1640 }; 1641 int mode = entry->mask; 1642 int status; 1643 1644 /* 1645 * Determine which access bits we want to ask for... 1646 */ 1647 if (mode & MAY_READ) 1648 args.access |= NFS4_ACCESS_READ; 1649 if (S_ISDIR(inode->i_mode)) { 1650 if (mode & MAY_WRITE) 1651 args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE; 1652 if (mode & MAY_EXEC) 1653 args.access |= NFS4_ACCESS_LOOKUP; 1654 } else { 1655 if (mode & MAY_WRITE) 1656 args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND; 1657 if (mode & MAY_EXEC) 1658 args.access |= NFS4_ACCESS_EXECUTE; 1659 } 1660 status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0); 1661 if (!status) { 1662 entry->mask = 0; 1663 if (res.access & NFS4_ACCESS_READ) 1664 entry->mask |= MAY_READ; 1665 if (res.access & (NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE)) 1666 entry->mask |= MAY_WRITE; 1667 if (res.access & (NFS4_ACCESS_LOOKUP|NFS4_ACCESS_EXECUTE)) 1668 entry->mask |= MAY_EXEC; 1669 } 1670 return status; 1671 } 1672 1673 static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry) 1674 { 1675 struct nfs4_exception exception = { }; 1676 int err; 1677 do { 1678 err = nfs4_handle_exception(NFS_SERVER(inode), 1679 _nfs4_proc_access(inode, entry), 1680 &exception); 1681 } while (exception.retry); 1682 return err; 1683 } 1684 1685 /* 1686 * TODO: For the time being, we don't try to get any attributes 1687 * along with any of the zero-copy operations READ, READDIR, 1688 * READLINK, WRITE. 1689 * 1690 * In the case of the first three, we want to put the GETATTR 1691 * after the read-type operation -- this is because it is hard 1692 * to predict the length of a GETATTR response in v4, and thus 1693 * align the READ data correctly. This means that the GETATTR 1694 * may end up partially falling into the page cache, and we should 1695 * shift it into the 'tail' of the xdr_buf before processing. 1696 * To do this efficiently, we need to know the total length 1697 * of data received, which doesn't seem to be available outside 1698 * of the RPC layer. 1699 * 1700 * In the case of WRITE, we also want to put the GETATTR after 1701 * the operation -- in this case because we want to make sure 1702 * we get the post-operation mtime and size. This means that 1703 * we can't use xdr_encode_pages() as written: we need a variant 1704 * of it which would leave room in the 'tail' iovec. 1705 * 1706 * Both of these changes to the XDR layer would in fact be quite 1707 * minor, but I decided to leave them for a subsequent patch. 1708 */ 1709 static int _nfs4_proc_readlink(struct inode *inode, struct page *page, 1710 unsigned int pgbase, unsigned int pglen) 1711 { 1712 struct nfs4_readlink args = { 1713 .fh = NFS_FH(inode), 1714 .pgbase = pgbase, 1715 .pglen = pglen, 1716 .pages = &page, 1717 }; 1718 struct rpc_message msg = { 1719 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READLINK], 1720 .rpc_argp = &args, 1721 .rpc_resp = NULL, 1722 }; 1723 1724 return rpc_call_sync(NFS_CLIENT(inode), &msg, 0); 1725 } 1726 1727 static int nfs4_proc_readlink(struct inode *inode, struct page *page, 1728 unsigned int pgbase, unsigned int pglen) 1729 { 1730 struct nfs4_exception exception = { }; 1731 int err; 1732 do { 1733 err = nfs4_handle_exception(NFS_SERVER(inode), 1734 _nfs4_proc_readlink(inode, page, pgbase, pglen), 1735 &exception); 1736 } while (exception.retry); 1737 return err; 1738 } 1739 1740 static int _nfs4_proc_read(struct nfs_read_data *rdata) 1741 { 1742 int flags = rdata->flags; 1743 struct inode *inode = rdata->inode; 1744 struct nfs_fattr *fattr = rdata->res.fattr; 1745 struct nfs_server *server = NFS_SERVER(inode); 1746 struct rpc_message msg = { 1747 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ], 1748 .rpc_argp = &rdata->args, 1749 .rpc_resp = &rdata->res, 1750 .rpc_cred = rdata->cred, 1751 }; 1752 unsigned long timestamp = jiffies; 1753 int status; 1754 1755 dprintk("NFS call read %d @ %Ld\n", rdata->args.count, 1756 (long long) rdata->args.offset); 1757 1758 nfs_fattr_init(fattr); 1759 status = rpc_call_sync(server->client, &msg, flags); 1760 if (!status) 1761 renew_lease(server, timestamp); 1762 dprintk("NFS reply read: %d\n", status); 1763 return status; 1764 } 1765 1766 static int nfs4_proc_read(struct nfs_read_data *rdata) 1767 { 1768 struct nfs4_exception exception = { }; 1769 int err; 1770 do { 1771 err = nfs4_handle_exception(NFS_SERVER(rdata->inode), 1772 _nfs4_proc_read(rdata), 1773 &exception); 1774 } while (exception.retry); 1775 return err; 1776 } 1777 1778 /* 1779 * Got race? 1780 * We will need to arrange for the VFS layer to provide an atomic open. 1781 * Until then, this create/open method is prone to inefficiency and race 1782 * conditions due to the lookup, create, and open VFS calls from sys_open() 1783 * placed on the wire. 1784 * 1785 * Given the above sorry state of affairs, I'm simply sending an OPEN. 1786 * The file will be opened again in the subsequent VFS open call 1787 * (nfs4_proc_file_open). 1788 * 1789 * The open for read will just hang around to be used by any process that 1790 * opens the file O_RDONLY. This will all be resolved with the VFS changes. 1791 */ 1792 1793 static int 1794 nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, 1795 int flags, struct nameidata *nd) 1796 { 1797 struct nfs4_state *state; 1798 struct rpc_cred *cred; 1799 int status = 0; 1800 1801 cred = rpcauth_lookupcred(NFS_CLIENT(dir)->cl_auth, 0); 1802 if (IS_ERR(cred)) { 1803 status = PTR_ERR(cred); 1804 goto out; 1805 } 1806 state = nfs4_do_open(dir, dentry, flags, sattr, cred); 1807 put_rpccred(cred); 1808 if (IS_ERR(state)) { 1809 status = PTR_ERR(state); 1810 goto out; 1811 } 1812 d_instantiate(dentry, igrab(state->inode)); 1813 if (flags & O_EXCL) { 1814 struct nfs_fattr fattr; 1815 status = nfs4_do_setattr(state->inode, &fattr, sattr, state); 1816 if (status == 0) 1817 nfs_setattr_update_inode(state->inode, sattr); 1818 } 1819 if (status == 0 && nd != NULL && (nd->flags & LOOKUP_OPEN)) 1820 status = nfs4_intent_set_file(nd, dentry, state); 1821 else 1822 nfs4_close_state(state, flags); 1823 out: 1824 return status; 1825 } 1826 1827 static int _nfs4_proc_remove(struct inode *dir, struct qstr *name) 1828 { 1829 struct nfs_server *server = NFS_SERVER(dir); 1830 struct nfs4_remove_arg args = { 1831 .fh = NFS_FH(dir), 1832 .name = name, 1833 .bitmask = server->attr_bitmask, 1834 }; 1835 struct nfs_fattr dir_attr; 1836 struct nfs4_remove_res res = { 1837 .server = server, 1838 .dir_attr = &dir_attr, 1839 }; 1840 struct rpc_message msg = { 1841 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE], 1842 .rpc_argp = &args, 1843 .rpc_resp = &res, 1844 }; 1845 int status; 1846 1847 nfs_fattr_init(res.dir_attr); 1848 status = rpc_call_sync(server->client, &msg, 0); 1849 if (status == 0) { 1850 update_changeattr(dir, &res.cinfo); 1851 nfs_post_op_update_inode(dir, res.dir_attr); 1852 } 1853 return status; 1854 } 1855 1856 static int nfs4_proc_remove(struct inode *dir, struct qstr *name) 1857 { 1858 struct nfs4_exception exception = { }; 1859 int err; 1860 do { 1861 err = nfs4_handle_exception(NFS_SERVER(dir), 1862 _nfs4_proc_remove(dir, name), 1863 &exception); 1864 } while (exception.retry); 1865 return err; 1866 } 1867 1868 struct unlink_desc { 1869 struct nfs4_remove_arg args; 1870 struct nfs4_remove_res res; 1871 struct nfs_fattr dir_attr; 1872 }; 1873 1874 static int nfs4_proc_unlink_setup(struct rpc_message *msg, struct dentry *dir, 1875 struct qstr *name) 1876 { 1877 struct nfs_server *server = NFS_SERVER(dir->d_inode); 1878 struct unlink_desc *up; 1879 1880 up = kmalloc(sizeof(*up), GFP_KERNEL); 1881 if (!up) 1882 return -ENOMEM; 1883 1884 up->args.fh = NFS_FH(dir->d_inode); 1885 up->args.name = name; 1886 up->args.bitmask = server->attr_bitmask; 1887 up->res.server = server; 1888 up->res.dir_attr = &up->dir_attr; 1889 1890 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE]; 1891 msg->rpc_argp = &up->args; 1892 msg->rpc_resp = &up->res; 1893 return 0; 1894 } 1895 1896 static int nfs4_proc_unlink_done(struct dentry *dir, struct rpc_task *task) 1897 { 1898 struct rpc_message *msg = &task->tk_msg; 1899 struct unlink_desc *up; 1900 1901 if (msg->rpc_resp != NULL) { 1902 up = container_of(msg->rpc_resp, struct unlink_desc, res); 1903 update_changeattr(dir->d_inode, &up->res.cinfo); 1904 nfs_post_op_update_inode(dir->d_inode, up->res.dir_attr); 1905 kfree(up); 1906 msg->rpc_resp = NULL; 1907 msg->rpc_argp = NULL; 1908 } 1909 return 0; 1910 } 1911 1912 static int _nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name, 1913 struct inode *new_dir, struct qstr *new_name) 1914 { 1915 struct nfs_server *server = NFS_SERVER(old_dir); 1916 struct nfs4_rename_arg arg = { 1917 .old_dir = NFS_FH(old_dir), 1918 .new_dir = NFS_FH(new_dir), 1919 .old_name = old_name, 1920 .new_name = new_name, 1921 .bitmask = server->attr_bitmask, 1922 }; 1923 struct nfs_fattr old_fattr, new_fattr; 1924 struct nfs4_rename_res res = { 1925 .server = server, 1926 .old_fattr = &old_fattr, 1927 .new_fattr = &new_fattr, 1928 }; 1929 struct rpc_message msg = { 1930 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENAME], 1931 .rpc_argp = &arg, 1932 .rpc_resp = &res, 1933 }; 1934 int status; 1935 1936 nfs_fattr_init(res.old_fattr); 1937 nfs_fattr_init(res.new_fattr); 1938 status = rpc_call_sync(server->client, &msg, 0); 1939 1940 if (!status) { 1941 update_changeattr(old_dir, &res.old_cinfo); 1942 nfs_post_op_update_inode(old_dir, res.old_fattr); 1943 update_changeattr(new_dir, &res.new_cinfo); 1944 nfs_post_op_update_inode(new_dir, res.new_fattr); 1945 } 1946 return status; 1947 } 1948 1949 static int nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name, 1950 struct inode *new_dir, struct qstr *new_name) 1951 { 1952 struct nfs4_exception exception = { }; 1953 int err; 1954 do { 1955 err = nfs4_handle_exception(NFS_SERVER(old_dir), 1956 _nfs4_proc_rename(old_dir, old_name, 1957 new_dir, new_name), 1958 &exception); 1959 } while (exception.retry); 1960 return err; 1961 } 1962 1963 static int _nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name) 1964 { 1965 struct nfs_server *server = NFS_SERVER(inode); 1966 struct nfs4_link_arg arg = { 1967 .fh = NFS_FH(inode), 1968 .dir_fh = NFS_FH(dir), 1969 .name = name, 1970 .bitmask = server->attr_bitmask, 1971 }; 1972 struct nfs_fattr fattr, dir_attr; 1973 struct nfs4_link_res res = { 1974 .server = server, 1975 .fattr = &fattr, 1976 .dir_attr = &dir_attr, 1977 }; 1978 struct rpc_message msg = { 1979 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LINK], 1980 .rpc_argp = &arg, 1981 .rpc_resp = &res, 1982 }; 1983 int status; 1984 1985 nfs_fattr_init(res.fattr); 1986 nfs_fattr_init(res.dir_attr); 1987 status = rpc_call_sync(server->client, &msg, 0); 1988 if (!status) { 1989 update_changeattr(dir, &res.cinfo); 1990 nfs_post_op_update_inode(dir, res.dir_attr); 1991 nfs_post_op_update_inode(inode, res.fattr); 1992 } 1993 1994 return status; 1995 } 1996 1997 static int nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name) 1998 { 1999 struct nfs4_exception exception = { }; 2000 int err; 2001 do { 2002 err = nfs4_handle_exception(NFS_SERVER(inode), 2003 _nfs4_proc_link(inode, dir, name), 2004 &exception); 2005 } while (exception.retry); 2006 return err; 2007 } 2008 2009 static int _nfs4_proc_symlink(struct inode *dir, struct dentry *dentry, 2010 struct page *page, unsigned int len, struct iattr *sattr) 2011 { 2012 struct nfs_server *server = NFS_SERVER(dir); 2013 struct nfs_fh fhandle; 2014 struct nfs_fattr fattr, dir_fattr; 2015 struct nfs4_create_arg arg = { 2016 .dir_fh = NFS_FH(dir), 2017 .server = server, 2018 .name = &dentry->d_name, 2019 .attrs = sattr, 2020 .ftype = NF4LNK, 2021 .bitmask = server->attr_bitmask, 2022 }; 2023 struct nfs4_create_res res = { 2024 .server = server, 2025 .fh = &fhandle, 2026 .fattr = &fattr, 2027 .dir_fattr = &dir_fattr, 2028 }; 2029 struct rpc_message msg = { 2030 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SYMLINK], 2031 .rpc_argp = &arg, 2032 .rpc_resp = &res, 2033 }; 2034 int status; 2035 2036 if (len > NFS4_MAXPATHLEN) 2037 return -ENAMETOOLONG; 2038 2039 arg.u.symlink.pages = &page; 2040 arg.u.symlink.len = len; 2041 nfs_fattr_init(&fattr); 2042 nfs_fattr_init(&dir_fattr); 2043 2044 status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); 2045 if (!status) { 2046 update_changeattr(dir, &res.dir_cinfo); 2047 nfs_post_op_update_inode(dir, res.dir_fattr); 2048 status = nfs_instantiate(dentry, &fhandle, &fattr); 2049 } 2050 return status; 2051 } 2052 2053 static int nfs4_proc_symlink(struct inode *dir, struct dentry *dentry, 2054 struct page *page, unsigned int len, struct iattr *sattr) 2055 { 2056 struct nfs4_exception exception = { }; 2057 int err; 2058 do { 2059 err = nfs4_handle_exception(NFS_SERVER(dir), 2060 _nfs4_proc_symlink(dir, dentry, page, 2061 len, sattr), 2062 &exception); 2063 } while (exception.retry); 2064 return err; 2065 } 2066 2067 static int _nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry, 2068 struct iattr *sattr) 2069 { 2070 struct nfs_server *server = NFS_SERVER(dir); 2071 struct nfs_fh fhandle; 2072 struct nfs_fattr fattr, dir_fattr; 2073 struct nfs4_create_arg arg = { 2074 .dir_fh = NFS_FH(dir), 2075 .server = server, 2076 .name = &dentry->d_name, 2077 .attrs = sattr, 2078 .ftype = NF4DIR, 2079 .bitmask = server->attr_bitmask, 2080 }; 2081 struct nfs4_create_res res = { 2082 .server = server, 2083 .fh = &fhandle, 2084 .fattr = &fattr, 2085 .dir_fattr = &dir_fattr, 2086 }; 2087 struct rpc_message msg = { 2088 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE], 2089 .rpc_argp = &arg, 2090 .rpc_resp = &res, 2091 }; 2092 int status; 2093 2094 nfs_fattr_init(&fattr); 2095 nfs_fattr_init(&dir_fattr); 2096 2097 status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); 2098 if (!status) { 2099 update_changeattr(dir, &res.dir_cinfo); 2100 nfs_post_op_update_inode(dir, res.dir_fattr); 2101 status = nfs_instantiate(dentry, &fhandle, &fattr); 2102 } 2103 return status; 2104 } 2105 2106 static int nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry, 2107 struct iattr *sattr) 2108 { 2109 struct nfs4_exception exception = { }; 2110 int err; 2111 do { 2112 err = nfs4_handle_exception(NFS_SERVER(dir), 2113 _nfs4_proc_mkdir(dir, dentry, sattr), 2114 &exception); 2115 } while (exception.retry); 2116 return err; 2117 } 2118 2119 static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, 2120 u64 cookie, struct page *page, unsigned int count, int plus) 2121 { 2122 struct inode *dir = dentry->d_inode; 2123 struct nfs4_readdir_arg args = { 2124 .fh = NFS_FH(dir), 2125 .pages = &page, 2126 .pgbase = 0, 2127 .count = count, 2128 .bitmask = NFS_SERVER(dentry->d_inode)->attr_bitmask, 2129 }; 2130 struct nfs4_readdir_res res; 2131 struct rpc_message msg = { 2132 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READDIR], 2133 .rpc_argp = &args, 2134 .rpc_resp = &res, 2135 .rpc_cred = cred, 2136 }; 2137 int status; 2138 2139 dprintk("%s: dentry = %s/%s, cookie = %Lu\n", __FUNCTION__, 2140 dentry->d_parent->d_name.name, 2141 dentry->d_name.name, 2142 (unsigned long long)cookie); 2143 nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args); 2144 res.pgbase = args.pgbase; 2145 status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); 2146 if (status == 0) 2147 memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE); 2148 dprintk("%s: returns %d\n", __FUNCTION__, status); 2149 return status; 2150 } 2151 2152 static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, 2153 u64 cookie, struct page *page, unsigned int count, int plus) 2154 { 2155 struct nfs4_exception exception = { }; 2156 int err; 2157 do { 2158 err = nfs4_handle_exception(NFS_SERVER(dentry->d_inode), 2159 _nfs4_proc_readdir(dentry, cred, cookie, 2160 page, count, plus), 2161 &exception); 2162 } while (exception.retry); 2163 return err; 2164 } 2165 2166 static int _nfs4_proc_mknod(struct inode *dir, struct dentry *dentry, 2167 struct iattr *sattr, dev_t rdev) 2168 { 2169 struct nfs_server *server = NFS_SERVER(dir); 2170 struct nfs_fh fh; 2171 struct nfs_fattr fattr, dir_fattr; 2172 struct nfs4_create_arg arg = { 2173 .dir_fh = NFS_FH(dir), 2174 .server = server, 2175 .name = &dentry->d_name, 2176 .attrs = sattr, 2177 .bitmask = server->attr_bitmask, 2178 }; 2179 struct nfs4_create_res res = { 2180 .server = server, 2181 .fh = &fh, 2182 .fattr = &fattr, 2183 .dir_fattr = &dir_fattr, 2184 }; 2185 struct rpc_message msg = { 2186 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE], 2187 .rpc_argp = &arg, 2188 .rpc_resp = &res, 2189 }; 2190 int status; 2191 int mode = sattr->ia_mode; 2192 2193 nfs_fattr_init(&fattr); 2194 nfs_fattr_init(&dir_fattr); 2195 2196 BUG_ON(!(sattr->ia_valid & ATTR_MODE)); 2197 BUG_ON(!S_ISFIFO(mode) && !S_ISBLK(mode) && !S_ISCHR(mode) && !S_ISSOCK(mode)); 2198 if (S_ISFIFO(mode)) 2199 arg.ftype = NF4FIFO; 2200 else if (S_ISBLK(mode)) { 2201 arg.ftype = NF4BLK; 2202 arg.u.device.specdata1 = MAJOR(rdev); 2203 arg.u.device.specdata2 = MINOR(rdev); 2204 } 2205 else if (S_ISCHR(mode)) { 2206 arg.ftype = NF4CHR; 2207 arg.u.device.specdata1 = MAJOR(rdev); 2208 arg.u.device.specdata2 = MINOR(rdev); 2209 } 2210 else 2211 arg.ftype = NF4SOCK; 2212 2213 status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); 2214 if (status == 0) { 2215 update_changeattr(dir, &res.dir_cinfo); 2216 nfs_post_op_update_inode(dir, res.dir_fattr); 2217 status = nfs_instantiate(dentry, &fh, &fattr); 2218 } 2219 return status; 2220 } 2221 2222 static int nfs4_proc_mknod(struct inode *dir, struct dentry *dentry, 2223 struct iattr *sattr, dev_t rdev) 2224 { 2225 struct nfs4_exception exception = { }; 2226 int err; 2227 do { 2228 err = nfs4_handle_exception(NFS_SERVER(dir), 2229 _nfs4_proc_mknod(dir, dentry, sattr, rdev), 2230 &exception); 2231 } while (exception.retry); 2232 return err; 2233 } 2234 2235 static int _nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, 2236 struct nfs_fsstat *fsstat) 2237 { 2238 struct nfs4_statfs_arg args = { 2239 .fh = fhandle, 2240 .bitmask = server->attr_bitmask, 2241 }; 2242 struct rpc_message msg = { 2243 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_STATFS], 2244 .rpc_argp = &args, 2245 .rpc_resp = fsstat, 2246 }; 2247 2248 nfs_fattr_init(fsstat->fattr); 2249 return rpc_call_sync(server->client, &msg, 0); 2250 } 2251 2252 static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *fsstat) 2253 { 2254 struct nfs4_exception exception = { }; 2255 int err; 2256 do { 2257 err = nfs4_handle_exception(server, 2258 _nfs4_proc_statfs(server, fhandle, fsstat), 2259 &exception); 2260 } while (exception.retry); 2261 return err; 2262 } 2263 2264 static int _nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, 2265 struct nfs_fsinfo *fsinfo) 2266 { 2267 struct nfs4_fsinfo_arg args = { 2268 .fh = fhandle, 2269 .bitmask = server->attr_bitmask, 2270 }; 2271 struct rpc_message msg = { 2272 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FSINFO], 2273 .rpc_argp = &args, 2274 .rpc_resp = fsinfo, 2275 }; 2276 2277 return rpc_call_sync(server->client, &msg, 0); 2278 } 2279 2280 static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo) 2281 { 2282 struct nfs4_exception exception = { }; 2283 int err; 2284 2285 do { 2286 err = nfs4_handle_exception(server, 2287 _nfs4_do_fsinfo(server, fhandle, fsinfo), 2288 &exception); 2289 } while (exception.retry); 2290 return err; 2291 } 2292 2293 static int nfs4_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo) 2294 { 2295 nfs_fattr_init(fsinfo->fattr); 2296 return nfs4_do_fsinfo(server, fhandle, fsinfo); 2297 } 2298 2299 static int _nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle, 2300 struct nfs_pathconf *pathconf) 2301 { 2302 struct nfs4_pathconf_arg args = { 2303 .fh = fhandle, 2304 .bitmask = server->attr_bitmask, 2305 }; 2306 struct rpc_message msg = { 2307 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_PATHCONF], 2308 .rpc_argp = &args, 2309 .rpc_resp = pathconf, 2310 }; 2311 2312 /* None of the pathconf attributes are mandatory to implement */ 2313 if ((args.bitmask[0] & nfs4_pathconf_bitmap[0]) == 0) { 2314 memset(pathconf, 0, sizeof(*pathconf)); 2315 return 0; 2316 } 2317 2318 nfs_fattr_init(pathconf->fattr); 2319 return rpc_call_sync(server->client, &msg, 0); 2320 } 2321 2322 static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle, 2323 struct nfs_pathconf *pathconf) 2324 { 2325 struct nfs4_exception exception = { }; 2326 int err; 2327 2328 do { 2329 err = nfs4_handle_exception(server, 2330 _nfs4_proc_pathconf(server, fhandle, pathconf), 2331 &exception); 2332 } while (exception.retry); 2333 return err; 2334 } 2335 2336 static int nfs4_read_done(struct rpc_task *task, struct nfs_read_data *data) 2337 { 2338 struct nfs_server *server = NFS_SERVER(data->inode); 2339 2340 if (nfs4_async_handle_error(task, server) == -EAGAIN) { 2341 rpc_restart_call(task); 2342 return -EAGAIN; 2343 } 2344 if (task->tk_status > 0) 2345 renew_lease(server, data->timestamp); 2346 return 0; 2347 } 2348 2349 static void nfs4_proc_read_setup(struct nfs_read_data *data) 2350 { 2351 struct rpc_message msg = { 2352 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ], 2353 .rpc_argp = &data->args, 2354 .rpc_resp = &data->res, 2355 .rpc_cred = data->cred, 2356 }; 2357 2358 data->timestamp = jiffies; 2359 2360 rpc_call_setup(&data->task, &msg, 0); 2361 } 2362 2363 static int nfs4_write_done(struct rpc_task *task, struct nfs_write_data *data) 2364 { 2365 struct inode *inode = data->inode; 2366 2367 if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) { 2368 rpc_restart_call(task); 2369 return -EAGAIN; 2370 } 2371 if (task->tk_status >= 0) { 2372 renew_lease(NFS_SERVER(inode), data->timestamp); 2373 nfs_post_op_update_inode(inode, data->res.fattr); 2374 } 2375 return 0; 2376 } 2377 2378 static void nfs4_proc_write_setup(struct nfs_write_data *data, int how) 2379 { 2380 struct rpc_message msg = { 2381 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE], 2382 .rpc_argp = &data->args, 2383 .rpc_resp = &data->res, 2384 .rpc_cred = data->cred, 2385 }; 2386 struct inode *inode = data->inode; 2387 struct nfs_server *server = NFS_SERVER(inode); 2388 int stable; 2389 2390 if (how & FLUSH_STABLE) { 2391 if (!NFS_I(inode)->ncommit) 2392 stable = NFS_FILE_SYNC; 2393 else 2394 stable = NFS_DATA_SYNC; 2395 } else 2396 stable = NFS_UNSTABLE; 2397 data->args.stable = stable; 2398 data->args.bitmask = server->attr_bitmask; 2399 data->res.server = server; 2400 2401 data->timestamp = jiffies; 2402 2403 /* Finalize the task. */ 2404 rpc_call_setup(&data->task, &msg, 0); 2405 } 2406 2407 static int nfs4_commit_done(struct rpc_task *task, struct nfs_write_data *data) 2408 { 2409 struct inode *inode = data->inode; 2410 2411 if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) { 2412 rpc_restart_call(task); 2413 return -EAGAIN; 2414 } 2415 if (task->tk_status >= 0) 2416 nfs_post_op_update_inode(inode, data->res.fattr); 2417 return 0; 2418 } 2419 2420 static void nfs4_proc_commit_setup(struct nfs_write_data *data, int how) 2421 { 2422 struct rpc_message msg = { 2423 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT], 2424 .rpc_argp = &data->args, 2425 .rpc_resp = &data->res, 2426 .rpc_cred = data->cred, 2427 }; 2428 struct nfs_server *server = NFS_SERVER(data->inode); 2429 2430 data->args.bitmask = server->attr_bitmask; 2431 data->res.server = server; 2432 2433 rpc_call_setup(&data->task, &msg, 0); 2434 } 2435 2436 /* 2437 * nfs4_proc_async_renew(): This is not one of the nfs_rpc_ops; it is a special 2438 * standalone procedure for queueing an asynchronous RENEW. 2439 */ 2440 static void nfs4_renew_done(struct rpc_task *task, void *data) 2441 { 2442 struct nfs_client *clp = (struct nfs_client *)task->tk_msg.rpc_argp; 2443 unsigned long timestamp = (unsigned long)data; 2444 2445 if (task->tk_status < 0) { 2446 switch (task->tk_status) { 2447 case -NFS4ERR_STALE_CLIENTID: 2448 case -NFS4ERR_EXPIRED: 2449 case -NFS4ERR_CB_PATH_DOWN: 2450 nfs4_schedule_state_recovery(clp); 2451 } 2452 return; 2453 } 2454 spin_lock(&clp->cl_lock); 2455 if (time_before(clp->cl_last_renewal,timestamp)) 2456 clp->cl_last_renewal = timestamp; 2457 spin_unlock(&clp->cl_lock); 2458 } 2459 2460 static const struct rpc_call_ops nfs4_renew_ops = { 2461 .rpc_call_done = nfs4_renew_done, 2462 }; 2463 2464 int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred) 2465 { 2466 struct rpc_message msg = { 2467 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW], 2468 .rpc_argp = clp, 2469 .rpc_cred = cred, 2470 }; 2471 2472 return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_SOFT, 2473 &nfs4_renew_ops, (void *)jiffies); 2474 } 2475 2476 int nfs4_proc_renew(struct nfs_client *clp, struct rpc_cred *cred) 2477 { 2478 struct rpc_message msg = { 2479 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW], 2480 .rpc_argp = clp, 2481 .rpc_cred = cred, 2482 }; 2483 unsigned long now = jiffies; 2484 int status; 2485 2486 status = rpc_call_sync(clp->cl_rpcclient, &msg, 0); 2487 if (status < 0) 2488 return status; 2489 spin_lock(&clp->cl_lock); 2490 if (time_before(clp->cl_last_renewal,now)) 2491 clp->cl_last_renewal = now; 2492 spin_unlock(&clp->cl_lock); 2493 return 0; 2494 } 2495 2496 static inline int nfs4_server_supports_acls(struct nfs_server *server) 2497 { 2498 return (server->caps & NFS_CAP_ACLS) 2499 && (server->acl_bitmask & ACL4_SUPPORT_ALLOW_ACL) 2500 && (server->acl_bitmask & ACL4_SUPPORT_DENY_ACL); 2501 } 2502 2503 /* Assuming that XATTR_SIZE_MAX is a multiple of PAGE_CACHE_SIZE, and that 2504 * it's OK to put sizeof(void) * (XATTR_SIZE_MAX/PAGE_CACHE_SIZE) bytes on 2505 * the stack. 2506 */ 2507 #define NFS4ACL_MAXPAGES (XATTR_SIZE_MAX >> PAGE_CACHE_SHIFT) 2508 2509 static void buf_to_pages(const void *buf, size_t buflen, 2510 struct page **pages, unsigned int *pgbase) 2511 { 2512 const void *p = buf; 2513 2514 *pgbase = offset_in_page(buf); 2515 p -= *pgbase; 2516 while (p < buf + buflen) { 2517 *(pages++) = virt_to_page(p); 2518 p += PAGE_CACHE_SIZE; 2519 } 2520 } 2521 2522 struct nfs4_cached_acl { 2523 int cached; 2524 size_t len; 2525 char data[0]; 2526 }; 2527 2528 static void nfs4_set_cached_acl(struct inode *inode, struct nfs4_cached_acl *acl) 2529 { 2530 struct nfs_inode *nfsi = NFS_I(inode); 2531 2532 spin_lock(&inode->i_lock); 2533 kfree(nfsi->nfs4_acl); 2534 nfsi->nfs4_acl = acl; 2535 spin_unlock(&inode->i_lock); 2536 } 2537 2538 static void nfs4_zap_acl_attr(struct inode *inode) 2539 { 2540 nfs4_set_cached_acl(inode, NULL); 2541 } 2542 2543 static inline ssize_t nfs4_read_cached_acl(struct inode *inode, char *buf, size_t buflen) 2544 { 2545 struct nfs_inode *nfsi = NFS_I(inode); 2546 struct nfs4_cached_acl *acl; 2547 int ret = -ENOENT; 2548 2549 spin_lock(&inode->i_lock); 2550 acl = nfsi->nfs4_acl; 2551 if (acl == NULL) 2552 goto out; 2553 if (buf == NULL) /* user is just asking for length */ 2554 goto out_len; 2555 if (acl->cached == 0) 2556 goto out; 2557 ret = -ERANGE; /* see getxattr(2) man page */ 2558 if (acl->len > buflen) 2559 goto out; 2560 memcpy(buf, acl->data, acl->len); 2561 out_len: 2562 ret = acl->len; 2563 out: 2564 spin_unlock(&inode->i_lock); 2565 return ret; 2566 } 2567 2568 static void nfs4_write_cached_acl(struct inode *inode, const char *buf, size_t acl_len) 2569 { 2570 struct nfs4_cached_acl *acl; 2571 2572 if (buf && acl_len <= PAGE_SIZE) { 2573 acl = kmalloc(sizeof(*acl) + acl_len, GFP_KERNEL); 2574 if (acl == NULL) 2575 goto out; 2576 acl->cached = 1; 2577 memcpy(acl->data, buf, acl_len); 2578 } else { 2579 acl = kmalloc(sizeof(*acl), GFP_KERNEL); 2580 if (acl == NULL) 2581 goto out; 2582 acl->cached = 0; 2583 } 2584 acl->len = acl_len; 2585 out: 2586 nfs4_set_cached_acl(inode, acl); 2587 } 2588 2589 static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen) 2590 { 2591 struct page *pages[NFS4ACL_MAXPAGES]; 2592 struct nfs_getaclargs args = { 2593 .fh = NFS_FH(inode), 2594 .acl_pages = pages, 2595 .acl_len = buflen, 2596 }; 2597 size_t resp_len = buflen; 2598 void *resp_buf; 2599 struct rpc_message msg = { 2600 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETACL], 2601 .rpc_argp = &args, 2602 .rpc_resp = &resp_len, 2603 }; 2604 struct page *localpage = NULL; 2605 int ret; 2606 2607 if (buflen < PAGE_SIZE) { 2608 /* As long as we're doing a round trip to the server anyway, 2609 * let's be prepared for a page of acl data. */ 2610 localpage = alloc_page(GFP_KERNEL); 2611 resp_buf = page_address(localpage); 2612 if (localpage == NULL) 2613 return -ENOMEM; 2614 args.acl_pages[0] = localpage; 2615 args.acl_pgbase = 0; 2616 resp_len = args.acl_len = PAGE_SIZE; 2617 } else { 2618 resp_buf = buf; 2619 buf_to_pages(buf, buflen, args.acl_pages, &args.acl_pgbase); 2620 } 2621 ret = rpc_call_sync(NFS_CLIENT(inode), &msg, 0); 2622 if (ret) 2623 goto out_free; 2624 if (resp_len > args.acl_len) 2625 nfs4_write_cached_acl(inode, NULL, resp_len); 2626 else 2627 nfs4_write_cached_acl(inode, resp_buf, resp_len); 2628 if (buf) { 2629 ret = -ERANGE; 2630 if (resp_len > buflen) 2631 goto out_free; 2632 if (localpage) 2633 memcpy(buf, resp_buf, resp_len); 2634 } 2635 ret = resp_len; 2636 out_free: 2637 if (localpage) 2638 __free_page(localpage); 2639 return ret; 2640 } 2641 2642 static ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen) 2643 { 2644 struct nfs4_exception exception = { }; 2645 ssize_t ret; 2646 do { 2647 ret = __nfs4_get_acl_uncached(inode, buf, buflen); 2648 if (ret >= 0) 2649 break; 2650 ret = nfs4_handle_exception(NFS_SERVER(inode), ret, &exception); 2651 } while (exception.retry); 2652 return ret; 2653 } 2654 2655 static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen) 2656 { 2657 struct nfs_server *server = NFS_SERVER(inode); 2658 int ret; 2659 2660 if (!nfs4_server_supports_acls(server)) 2661 return -EOPNOTSUPP; 2662 ret = nfs_revalidate_inode(server, inode); 2663 if (ret < 0) 2664 return ret; 2665 ret = nfs4_read_cached_acl(inode, buf, buflen); 2666 if (ret != -ENOENT) 2667 return ret; 2668 return nfs4_get_acl_uncached(inode, buf, buflen); 2669 } 2670 2671 static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen) 2672 { 2673 struct nfs_server *server = NFS_SERVER(inode); 2674 struct page *pages[NFS4ACL_MAXPAGES]; 2675 struct nfs_setaclargs arg = { 2676 .fh = NFS_FH(inode), 2677 .acl_pages = pages, 2678 .acl_len = buflen, 2679 }; 2680 struct rpc_message msg = { 2681 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETACL], 2682 .rpc_argp = &arg, 2683 .rpc_resp = NULL, 2684 }; 2685 int ret; 2686 2687 if (!nfs4_server_supports_acls(server)) 2688 return -EOPNOTSUPP; 2689 nfs_inode_return_delegation(inode); 2690 buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase); 2691 ret = rpc_call_sync(NFS_CLIENT(inode), &msg, 0); 2692 if (ret == 0) 2693 nfs4_write_cached_acl(inode, buf, buflen); 2694 return ret; 2695 } 2696 2697 static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen) 2698 { 2699 struct nfs4_exception exception = { }; 2700 int err; 2701 do { 2702 err = nfs4_handle_exception(NFS_SERVER(inode), 2703 __nfs4_proc_set_acl(inode, buf, buflen), 2704 &exception); 2705 } while (exception.retry); 2706 return err; 2707 } 2708 2709 static int 2710 nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server) 2711 { 2712 struct nfs_client *clp = server->nfs_client; 2713 2714 if (!clp || task->tk_status >= 0) 2715 return 0; 2716 switch(task->tk_status) { 2717 case -NFS4ERR_STALE_CLIENTID: 2718 case -NFS4ERR_STALE_STATEID: 2719 case -NFS4ERR_EXPIRED: 2720 rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL, NULL); 2721 nfs4_schedule_state_recovery(clp); 2722 if (test_bit(NFS4CLNT_STATE_RECOVER, &clp->cl_state) == 0) 2723 rpc_wake_up_task(task); 2724 task->tk_status = 0; 2725 return -EAGAIN; 2726 case -NFS4ERR_DELAY: 2727 nfs_inc_server_stats((struct nfs_server *) server, 2728 NFSIOS_DELAY); 2729 case -NFS4ERR_GRACE: 2730 rpc_delay(task, NFS4_POLL_RETRY_MAX); 2731 task->tk_status = 0; 2732 return -EAGAIN; 2733 case -NFS4ERR_OLD_STATEID: 2734 task->tk_status = 0; 2735 return -EAGAIN; 2736 } 2737 task->tk_status = nfs4_map_errors(task->tk_status); 2738 return 0; 2739 } 2740 2741 static int nfs4_wait_bit_interruptible(void *word) 2742 { 2743 if (signal_pending(current)) 2744 return -ERESTARTSYS; 2745 schedule(); 2746 return 0; 2747 } 2748 2749 static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs_client *clp) 2750 { 2751 sigset_t oldset; 2752 int res; 2753 2754 might_sleep(); 2755 2756 rpc_clnt_sigmask(clnt, &oldset); 2757 res = wait_on_bit(&clp->cl_state, NFS4CLNT_STATE_RECOVER, 2758 nfs4_wait_bit_interruptible, 2759 TASK_INTERRUPTIBLE); 2760 rpc_clnt_sigunmask(clnt, &oldset); 2761 return res; 2762 } 2763 2764 static int nfs4_delay(struct rpc_clnt *clnt, long *timeout) 2765 { 2766 sigset_t oldset; 2767 int res = 0; 2768 2769 might_sleep(); 2770 2771 if (*timeout <= 0) 2772 *timeout = NFS4_POLL_RETRY_MIN; 2773 if (*timeout > NFS4_POLL_RETRY_MAX) 2774 *timeout = NFS4_POLL_RETRY_MAX; 2775 rpc_clnt_sigmask(clnt, &oldset); 2776 if (clnt->cl_intr) { 2777 schedule_timeout_interruptible(*timeout); 2778 if (signalled()) 2779 res = -ERESTARTSYS; 2780 } else 2781 schedule_timeout_uninterruptible(*timeout); 2782 rpc_clnt_sigunmask(clnt, &oldset); 2783 *timeout <<= 1; 2784 return res; 2785 } 2786 2787 /* This is the error handling routine for processes that are allowed 2788 * to sleep. 2789 */ 2790 int nfs4_handle_exception(const struct nfs_server *server, int errorcode, struct nfs4_exception *exception) 2791 { 2792 struct nfs_client *clp = server->nfs_client; 2793 int ret = errorcode; 2794 2795 exception->retry = 0; 2796 switch(errorcode) { 2797 case 0: 2798 return 0; 2799 case -NFS4ERR_STALE_CLIENTID: 2800 case -NFS4ERR_STALE_STATEID: 2801 case -NFS4ERR_EXPIRED: 2802 nfs4_schedule_state_recovery(clp); 2803 ret = nfs4_wait_clnt_recover(server->client, clp); 2804 if (ret == 0) 2805 exception->retry = 1; 2806 break; 2807 case -NFS4ERR_FILE_OPEN: 2808 case -NFS4ERR_GRACE: 2809 case -NFS4ERR_DELAY: 2810 ret = nfs4_delay(server->client, &exception->timeout); 2811 if (ret != 0) 2812 break; 2813 case -NFS4ERR_OLD_STATEID: 2814 exception->retry = 1; 2815 } 2816 /* We failed to handle the error */ 2817 return nfs4_map_errors(ret); 2818 } 2819 2820 int nfs4_proc_setclientid(struct nfs_client *clp, u32 program, unsigned short port, struct rpc_cred *cred) 2821 { 2822 nfs4_verifier sc_verifier; 2823 struct nfs4_setclientid setclientid = { 2824 .sc_verifier = &sc_verifier, 2825 .sc_prog = program, 2826 }; 2827 struct rpc_message msg = { 2828 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID], 2829 .rpc_argp = &setclientid, 2830 .rpc_resp = clp, 2831 .rpc_cred = cred, 2832 }; 2833 __be32 *p; 2834 int loop = 0; 2835 int status; 2836 2837 p = (__be32*)sc_verifier.data; 2838 *p++ = htonl((u32)clp->cl_boot_time.tv_sec); 2839 *p = htonl((u32)clp->cl_boot_time.tv_nsec); 2840 2841 for(;;) { 2842 setclientid.sc_name_len = scnprintf(setclientid.sc_name, 2843 sizeof(setclientid.sc_name), "%s/%u.%u.%u.%u %s %u", 2844 clp->cl_ipaddr, NIPQUAD(clp->cl_addr.sin_addr), 2845 cred->cr_ops->cr_name, 2846 clp->cl_id_uniquifier); 2847 setclientid.sc_netid_len = scnprintf(setclientid.sc_netid, 2848 sizeof(setclientid.sc_netid), "tcp"); 2849 setclientid.sc_uaddr_len = scnprintf(setclientid.sc_uaddr, 2850 sizeof(setclientid.sc_uaddr), "%s.%d.%d", 2851 clp->cl_ipaddr, port >> 8, port & 255); 2852 2853 status = rpc_call_sync(clp->cl_rpcclient, &msg, 0); 2854 if (status != -NFS4ERR_CLID_INUSE) 2855 break; 2856 if (signalled()) 2857 break; 2858 if (loop++ & 1) 2859 ssleep(clp->cl_lease_time + 1); 2860 else 2861 if (++clp->cl_id_uniquifier == 0) 2862 break; 2863 } 2864 return status; 2865 } 2866 2867 static int _nfs4_proc_setclientid_confirm(struct nfs_client *clp, struct rpc_cred *cred) 2868 { 2869 struct nfs_fsinfo fsinfo; 2870 struct rpc_message msg = { 2871 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID_CONFIRM], 2872 .rpc_argp = clp, 2873 .rpc_resp = &fsinfo, 2874 .rpc_cred = cred, 2875 }; 2876 unsigned long now; 2877 int status; 2878 2879 now = jiffies; 2880 status = rpc_call_sync(clp->cl_rpcclient, &msg, 0); 2881 if (status == 0) { 2882 spin_lock(&clp->cl_lock); 2883 clp->cl_lease_time = fsinfo.lease_time * HZ; 2884 clp->cl_last_renewal = now; 2885 clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); 2886 spin_unlock(&clp->cl_lock); 2887 } 2888 return status; 2889 } 2890 2891 int nfs4_proc_setclientid_confirm(struct nfs_client *clp, struct rpc_cred *cred) 2892 { 2893 long timeout; 2894 int err; 2895 do { 2896 err = _nfs4_proc_setclientid_confirm(clp, cred); 2897 switch (err) { 2898 case 0: 2899 return err; 2900 case -NFS4ERR_RESOURCE: 2901 /* The IBM lawyers misread another document! */ 2902 case -NFS4ERR_DELAY: 2903 err = nfs4_delay(clp->cl_rpcclient, &timeout); 2904 } 2905 } while (err == 0); 2906 return err; 2907 } 2908 2909 struct nfs4_delegreturndata { 2910 struct nfs4_delegreturnargs args; 2911 struct nfs4_delegreturnres res; 2912 struct nfs_fh fh; 2913 nfs4_stateid stateid; 2914 struct rpc_cred *cred; 2915 unsigned long timestamp; 2916 struct nfs_fattr fattr; 2917 int rpc_status; 2918 }; 2919 2920 static void nfs4_delegreturn_prepare(struct rpc_task *task, void *calldata) 2921 { 2922 struct nfs4_delegreturndata *data = calldata; 2923 struct rpc_message msg = { 2924 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DELEGRETURN], 2925 .rpc_argp = &data->args, 2926 .rpc_resp = &data->res, 2927 .rpc_cred = data->cred, 2928 }; 2929 nfs_fattr_init(data->res.fattr); 2930 rpc_call_setup(task, &msg, 0); 2931 } 2932 2933 static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata) 2934 { 2935 struct nfs4_delegreturndata *data = calldata; 2936 data->rpc_status = task->tk_status; 2937 if (data->rpc_status == 0) 2938 renew_lease(data->res.server, data->timestamp); 2939 } 2940 2941 static void nfs4_delegreturn_release(void *calldata) 2942 { 2943 struct nfs4_delegreturndata *data = calldata; 2944 2945 put_rpccred(data->cred); 2946 kfree(calldata); 2947 } 2948 2949 static const struct rpc_call_ops nfs4_delegreturn_ops = { 2950 .rpc_call_prepare = nfs4_delegreturn_prepare, 2951 .rpc_call_done = nfs4_delegreturn_done, 2952 .rpc_release = nfs4_delegreturn_release, 2953 }; 2954 2955 static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid) 2956 { 2957 struct nfs4_delegreturndata *data; 2958 struct nfs_server *server = NFS_SERVER(inode); 2959 struct rpc_task *task; 2960 int status; 2961 2962 data = kmalloc(sizeof(*data), GFP_KERNEL); 2963 if (data == NULL) 2964 return -ENOMEM; 2965 data->args.fhandle = &data->fh; 2966 data->args.stateid = &data->stateid; 2967 data->args.bitmask = server->attr_bitmask; 2968 nfs_copy_fh(&data->fh, NFS_FH(inode)); 2969 memcpy(&data->stateid, stateid, sizeof(data->stateid)); 2970 data->res.fattr = &data->fattr; 2971 data->res.server = server; 2972 data->cred = get_rpccred(cred); 2973 data->timestamp = jiffies; 2974 data->rpc_status = 0; 2975 2976 task = rpc_run_task(NFS_CLIENT(inode), RPC_TASK_ASYNC, &nfs4_delegreturn_ops, data); 2977 if (IS_ERR(task)) 2978 return PTR_ERR(task); 2979 status = nfs4_wait_for_completion_rpc_task(task); 2980 if (status == 0) { 2981 status = data->rpc_status; 2982 if (status == 0) 2983 nfs_post_op_update_inode(inode, &data->fattr); 2984 } 2985 rpc_put_task(task); 2986 return status; 2987 } 2988 2989 int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid) 2990 { 2991 struct nfs_server *server = NFS_SERVER(inode); 2992 struct nfs4_exception exception = { }; 2993 int err; 2994 do { 2995 err = _nfs4_proc_delegreturn(inode, cred, stateid); 2996 switch (err) { 2997 case -NFS4ERR_STALE_STATEID: 2998 case -NFS4ERR_EXPIRED: 2999 nfs4_schedule_state_recovery(server->nfs_client); 3000 case 0: 3001 return 0; 3002 } 3003 err = nfs4_handle_exception(server, err, &exception); 3004 } while (exception.retry); 3005 return err; 3006 } 3007 3008 #define NFS4_LOCK_MINTIMEOUT (1 * HZ) 3009 #define NFS4_LOCK_MAXTIMEOUT (30 * HZ) 3010 3011 /* 3012 * sleep, with exponential backoff, and retry the LOCK operation. 3013 */ 3014 static unsigned long 3015 nfs4_set_lock_task_retry(unsigned long timeout) 3016 { 3017 schedule_timeout_interruptible(timeout); 3018 timeout <<= 1; 3019 if (timeout > NFS4_LOCK_MAXTIMEOUT) 3020 return NFS4_LOCK_MAXTIMEOUT; 3021 return timeout; 3022 } 3023 3024 static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request) 3025 { 3026 struct inode *inode = state->inode; 3027 struct nfs_server *server = NFS_SERVER(inode); 3028 struct nfs_client *clp = server->nfs_client; 3029 struct nfs_lockt_args arg = { 3030 .fh = NFS_FH(inode), 3031 .fl = request, 3032 }; 3033 struct nfs_lockt_res res = { 3034 .denied = request, 3035 }; 3036 struct rpc_message msg = { 3037 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKT], 3038 .rpc_argp = &arg, 3039 .rpc_resp = &res, 3040 .rpc_cred = state->owner->so_cred, 3041 }; 3042 struct nfs4_lock_state *lsp; 3043 int status; 3044 3045 down_read(&clp->cl_sem); 3046 arg.lock_owner.clientid = clp->cl_clientid; 3047 status = nfs4_set_lock_state(state, request); 3048 if (status != 0) 3049 goto out; 3050 lsp = request->fl_u.nfs4_fl.owner; 3051 arg.lock_owner.id = lsp->ls_id; 3052 status = rpc_call_sync(server->client, &msg, 0); 3053 switch (status) { 3054 case 0: 3055 request->fl_type = F_UNLCK; 3056 break; 3057 case -NFS4ERR_DENIED: 3058 status = 0; 3059 } 3060 out: 3061 up_read(&clp->cl_sem); 3062 return status; 3063 } 3064 3065 static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request) 3066 { 3067 struct nfs4_exception exception = { }; 3068 int err; 3069 3070 do { 3071 err = nfs4_handle_exception(NFS_SERVER(state->inode), 3072 _nfs4_proc_getlk(state, cmd, request), 3073 &exception); 3074 } while (exception.retry); 3075 return err; 3076 } 3077 3078 static int do_vfs_lock(struct file *file, struct file_lock *fl) 3079 { 3080 int res = 0; 3081 switch (fl->fl_flags & (FL_POSIX|FL_FLOCK)) { 3082 case FL_POSIX: 3083 res = posix_lock_file_wait(file, fl); 3084 break; 3085 case FL_FLOCK: 3086 res = flock_lock_file_wait(file, fl); 3087 break; 3088 default: 3089 BUG(); 3090 } 3091 return res; 3092 } 3093 3094 struct nfs4_unlockdata { 3095 struct nfs_locku_args arg; 3096 struct nfs_locku_res res; 3097 struct nfs4_lock_state *lsp; 3098 struct nfs_open_context *ctx; 3099 struct file_lock fl; 3100 const struct nfs_server *server; 3101 unsigned long timestamp; 3102 }; 3103 3104 static struct nfs4_unlockdata *nfs4_alloc_unlockdata(struct file_lock *fl, 3105 struct nfs_open_context *ctx, 3106 struct nfs4_lock_state *lsp, 3107 struct nfs_seqid *seqid) 3108 { 3109 struct nfs4_unlockdata *p; 3110 struct inode *inode = lsp->ls_state->inode; 3111 3112 p = kmalloc(sizeof(*p), GFP_KERNEL); 3113 if (p == NULL) 3114 return NULL; 3115 p->arg.fh = NFS_FH(inode); 3116 p->arg.fl = &p->fl; 3117 p->arg.seqid = seqid; 3118 p->arg.stateid = &lsp->ls_stateid; 3119 p->lsp = lsp; 3120 atomic_inc(&lsp->ls_count); 3121 /* Ensure we don't close file until we're done freeing locks! */ 3122 p->ctx = get_nfs_open_context(ctx); 3123 memcpy(&p->fl, fl, sizeof(p->fl)); 3124 p->server = NFS_SERVER(inode); 3125 return p; 3126 } 3127 3128 static void nfs4_locku_release_calldata(void *data) 3129 { 3130 struct nfs4_unlockdata *calldata = data; 3131 nfs_free_seqid(calldata->arg.seqid); 3132 nfs4_put_lock_state(calldata->lsp); 3133 put_nfs_open_context(calldata->ctx); 3134 kfree(calldata); 3135 } 3136 3137 static void nfs4_locku_done(struct rpc_task *task, void *data) 3138 { 3139 struct nfs4_unlockdata *calldata = data; 3140 3141 if (RPC_ASSASSINATED(task)) 3142 return; 3143 nfs_increment_lock_seqid(task->tk_status, calldata->arg.seqid); 3144 switch (task->tk_status) { 3145 case 0: 3146 memcpy(calldata->lsp->ls_stateid.data, 3147 calldata->res.stateid.data, 3148 sizeof(calldata->lsp->ls_stateid.data)); 3149 renew_lease(calldata->server, calldata->timestamp); 3150 break; 3151 case -NFS4ERR_STALE_STATEID: 3152 case -NFS4ERR_EXPIRED: 3153 nfs4_schedule_state_recovery(calldata->server->nfs_client); 3154 break; 3155 default: 3156 if (nfs4_async_handle_error(task, calldata->server) == -EAGAIN) { 3157 rpc_restart_call(task); 3158 } 3159 } 3160 } 3161 3162 static void nfs4_locku_prepare(struct rpc_task *task, void *data) 3163 { 3164 struct nfs4_unlockdata *calldata = data; 3165 struct rpc_message msg = { 3166 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKU], 3167 .rpc_argp = &calldata->arg, 3168 .rpc_resp = &calldata->res, 3169 .rpc_cred = calldata->lsp->ls_state->owner->so_cred, 3170 }; 3171 3172 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0) 3173 return; 3174 if ((calldata->lsp->ls_flags & NFS_LOCK_INITIALIZED) == 0) { 3175 /* Note: exit _without_ running nfs4_locku_done */ 3176 task->tk_action = NULL; 3177 return; 3178 } 3179 calldata->timestamp = jiffies; 3180 rpc_call_setup(task, &msg, 0); 3181 } 3182 3183 static const struct rpc_call_ops nfs4_locku_ops = { 3184 .rpc_call_prepare = nfs4_locku_prepare, 3185 .rpc_call_done = nfs4_locku_done, 3186 .rpc_release = nfs4_locku_release_calldata, 3187 }; 3188 3189 static struct rpc_task *nfs4_do_unlck(struct file_lock *fl, 3190 struct nfs_open_context *ctx, 3191 struct nfs4_lock_state *lsp, 3192 struct nfs_seqid *seqid) 3193 { 3194 struct nfs4_unlockdata *data; 3195 3196 data = nfs4_alloc_unlockdata(fl, ctx, lsp, seqid); 3197 if (data == NULL) { 3198 nfs_free_seqid(seqid); 3199 return ERR_PTR(-ENOMEM); 3200 } 3201 3202 return rpc_run_task(NFS_CLIENT(lsp->ls_state->inode), RPC_TASK_ASYNC, &nfs4_locku_ops, data); 3203 } 3204 3205 static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request) 3206 { 3207 struct nfs_seqid *seqid; 3208 struct nfs4_lock_state *lsp; 3209 struct rpc_task *task; 3210 int status = 0; 3211 3212 status = nfs4_set_lock_state(state, request); 3213 /* Unlock _before_ we do the RPC call */ 3214 request->fl_flags |= FL_EXISTS; 3215 if (do_vfs_lock(request->fl_file, request) == -ENOENT) 3216 goto out; 3217 if (status != 0) 3218 goto out; 3219 /* Is this a delegated lock? */ 3220 if (test_bit(NFS_DELEGATED_STATE, &state->flags)) 3221 goto out; 3222 lsp = request->fl_u.nfs4_fl.owner; 3223 seqid = nfs_alloc_seqid(&lsp->ls_seqid); 3224 status = -ENOMEM; 3225 if (seqid == NULL) 3226 goto out; 3227 task = nfs4_do_unlck(request, request->fl_file->private_data, lsp, seqid); 3228 status = PTR_ERR(task); 3229 if (IS_ERR(task)) 3230 goto out; 3231 status = nfs4_wait_for_completion_rpc_task(task); 3232 rpc_put_task(task); 3233 out: 3234 return status; 3235 } 3236 3237 struct nfs4_lockdata { 3238 struct nfs_lock_args arg; 3239 struct nfs_lock_res res; 3240 struct nfs4_lock_state *lsp; 3241 struct nfs_open_context *ctx; 3242 struct file_lock fl; 3243 unsigned long timestamp; 3244 int rpc_status; 3245 int cancelled; 3246 }; 3247 3248 static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl, 3249 struct nfs_open_context *ctx, struct nfs4_lock_state *lsp) 3250 { 3251 struct nfs4_lockdata *p; 3252 struct inode *inode = lsp->ls_state->inode; 3253 struct nfs_server *server = NFS_SERVER(inode); 3254 3255 p = kzalloc(sizeof(*p), GFP_KERNEL); 3256 if (p == NULL) 3257 return NULL; 3258 3259 p->arg.fh = NFS_FH(inode); 3260 p->arg.fl = &p->fl; 3261 p->arg.lock_seqid = nfs_alloc_seqid(&lsp->ls_seqid); 3262 if (p->arg.lock_seqid == NULL) 3263 goto out_free; 3264 p->arg.lock_stateid = &lsp->ls_stateid; 3265 p->arg.lock_owner.clientid = server->nfs_client->cl_clientid; 3266 p->arg.lock_owner.id = lsp->ls_id; 3267 p->lsp = lsp; 3268 atomic_inc(&lsp->ls_count); 3269 p->ctx = get_nfs_open_context(ctx); 3270 memcpy(&p->fl, fl, sizeof(p->fl)); 3271 return p; 3272 out_free: 3273 kfree(p); 3274 return NULL; 3275 } 3276 3277 static void nfs4_lock_prepare(struct rpc_task *task, void *calldata) 3278 { 3279 struct nfs4_lockdata *data = calldata; 3280 struct nfs4_state *state = data->lsp->ls_state; 3281 struct nfs4_state_owner *sp = state->owner; 3282 struct rpc_message msg = { 3283 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCK], 3284 .rpc_argp = &data->arg, 3285 .rpc_resp = &data->res, 3286 .rpc_cred = sp->so_cred, 3287 }; 3288 3289 if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0) 3290 return; 3291 dprintk("%s: begin!\n", __FUNCTION__); 3292 /* Do we need to do an open_to_lock_owner? */ 3293 if (!(data->arg.lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED)) { 3294 data->arg.open_seqid = nfs_alloc_seqid(&sp->so_seqid); 3295 if (data->arg.open_seqid == NULL) { 3296 data->rpc_status = -ENOMEM; 3297 task->tk_action = NULL; 3298 goto out; 3299 } 3300 data->arg.open_stateid = &state->stateid; 3301 data->arg.new_lock_owner = 1; 3302 } 3303 data->timestamp = jiffies; 3304 rpc_call_setup(task, &msg, 0); 3305 out: 3306 dprintk("%s: done!, ret = %d\n", __FUNCTION__, data->rpc_status); 3307 } 3308 3309 static void nfs4_lock_done(struct rpc_task *task, void *calldata) 3310 { 3311 struct nfs4_lockdata *data = calldata; 3312 3313 dprintk("%s: begin!\n", __FUNCTION__); 3314 3315 data->rpc_status = task->tk_status; 3316 if (RPC_ASSASSINATED(task)) 3317 goto out; 3318 if (data->arg.new_lock_owner != 0) { 3319 nfs_increment_open_seqid(data->rpc_status, data->arg.open_seqid); 3320 if (data->rpc_status == 0) 3321 nfs_confirm_seqid(&data->lsp->ls_seqid, 0); 3322 else 3323 goto out; 3324 } 3325 if (data->rpc_status == 0) { 3326 memcpy(data->lsp->ls_stateid.data, data->res.stateid.data, 3327 sizeof(data->lsp->ls_stateid.data)); 3328 data->lsp->ls_flags |= NFS_LOCK_INITIALIZED; 3329 renew_lease(NFS_SERVER(data->ctx->dentry->d_inode), data->timestamp); 3330 } 3331 nfs_increment_lock_seqid(data->rpc_status, data->arg.lock_seqid); 3332 out: 3333 dprintk("%s: done, ret = %d!\n", __FUNCTION__, data->rpc_status); 3334 } 3335 3336 static void nfs4_lock_release(void *calldata) 3337 { 3338 struct nfs4_lockdata *data = calldata; 3339 3340 dprintk("%s: begin!\n", __FUNCTION__); 3341 if (data->arg.open_seqid != NULL) 3342 nfs_free_seqid(data->arg.open_seqid); 3343 if (data->cancelled != 0) { 3344 struct rpc_task *task; 3345 task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp, 3346 data->arg.lock_seqid); 3347 if (!IS_ERR(task)) 3348 rpc_put_task(task); 3349 dprintk("%s: cancelling lock!\n", __FUNCTION__); 3350 } else 3351 nfs_free_seqid(data->arg.lock_seqid); 3352 nfs4_put_lock_state(data->lsp); 3353 put_nfs_open_context(data->ctx); 3354 kfree(data); 3355 dprintk("%s: done!\n", __FUNCTION__); 3356 } 3357 3358 static const struct rpc_call_ops nfs4_lock_ops = { 3359 .rpc_call_prepare = nfs4_lock_prepare, 3360 .rpc_call_done = nfs4_lock_done, 3361 .rpc_release = nfs4_lock_release, 3362 }; 3363 3364 static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int reclaim) 3365 { 3366 struct nfs4_lockdata *data; 3367 struct rpc_task *task; 3368 int ret; 3369 3370 dprintk("%s: begin!\n", __FUNCTION__); 3371 data = nfs4_alloc_lockdata(fl, fl->fl_file->private_data, 3372 fl->fl_u.nfs4_fl.owner); 3373 if (data == NULL) 3374 return -ENOMEM; 3375 if (IS_SETLKW(cmd)) 3376 data->arg.block = 1; 3377 if (reclaim != 0) 3378 data->arg.reclaim = 1; 3379 task = rpc_run_task(NFS_CLIENT(state->inode), RPC_TASK_ASYNC, 3380 &nfs4_lock_ops, data); 3381 if (IS_ERR(task)) 3382 return PTR_ERR(task); 3383 ret = nfs4_wait_for_completion_rpc_task(task); 3384 if (ret == 0) { 3385 ret = data->rpc_status; 3386 if (ret == -NFS4ERR_DENIED) 3387 ret = -EAGAIN; 3388 } else 3389 data->cancelled = 1; 3390 rpc_put_task(task); 3391 dprintk("%s: done, ret = %d!\n", __FUNCTION__, ret); 3392 return ret; 3393 } 3394 3395 static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request) 3396 { 3397 struct nfs_server *server = NFS_SERVER(state->inode); 3398 struct nfs4_exception exception = { }; 3399 int err; 3400 3401 do { 3402 /* Cache the lock if possible... */ 3403 if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0) 3404 return 0; 3405 err = _nfs4_do_setlk(state, F_SETLK, request, 1); 3406 if (err != -NFS4ERR_DELAY) 3407 break; 3408 nfs4_handle_exception(server, err, &exception); 3409 } while (exception.retry); 3410 return err; 3411 } 3412 3413 static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request) 3414 { 3415 struct nfs_server *server = NFS_SERVER(state->inode); 3416 struct nfs4_exception exception = { }; 3417 int err; 3418 3419 err = nfs4_set_lock_state(state, request); 3420 if (err != 0) 3421 return err; 3422 do { 3423 if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0) 3424 return 0; 3425 err = _nfs4_do_setlk(state, F_SETLK, request, 0); 3426 if (err != -NFS4ERR_DELAY) 3427 break; 3428 nfs4_handle_exception(server, err, &exception); 3429 } while (exception.retry); 3430 return err; 3431 } 3432 3433 static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request) 3434 { 3435 struct nfs_client *clp = state->owner->so_client; 3436 unsigned char fl_flags = request->fl_flags; 3437 int status; 3438 3439 /* Is this a delegated open? */ 3440 status = nfs4_set_lock_state(state, request); 3441 if (status != 0) 3442 goto out; 3443 request->fl_flags |= FL_ACCESS; 3444 status = do_vfs_lock(request->fl_file, request); 3445 if (status < 0) 3446 goto out; 3447 down_read(&clp->cl_sem); 3448 if (test_bit(NFS_DELEGATED_STATE, &state->flags)) { 3449 struct nfs_inode *nfsi = NFS_I(state->inode); 3450 /* Yes: cache locks! */ 3451 down_read(&nfsi->rwsem); 3452 /* ...but avoid races with delegation recall... */ 3453 if (test_bit(NFS_DELEGATED_STATE, &state->flags)) { 3454 request->fl_flags = fl_flags & ~FL_SLEEP; 3455 status = do_vfs_lock(request->fl_file, request); 3456 up_read(&nfsi->rwsem); 3457 goto out_unlock; 3458 } 3459 up_read(&nfsi->rwsem); 3460 } 3461 status = _nfs4_do_setlk(state, cmd, request, 0); 3462 if (status != 0) 3463 goto out_unlock; 3464 /* Note: we always want to sleep here! */ 3465 request->fl_flags = fl_flags | FL_SLEEP; 3466 if (do_vfs_lock(request->fl_file, request) < 0) 3467 printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", __FUNCTION__); 3468 out_unlock: 3469 up_read(&clp->cl_sem); 3470 out: 3471 request->fl_flags = fl_flags; 3472 return status; 3473 } 3474 3475 static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request) 3476 { 3477 struct nfs4_exception exception = { }; 3478 int err; 3479 3480 do { 3481 err = nfs4_handle_exception(NFS_SERVER(state->inode), 3482 _nfs4_proc_setlk(state, cmd, request), 3483 &exception); 3484 } while (exception.retry); 3485 return err; 3486 } 3487 3488 static int 3489 nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request) 3490 { 3491 struct nfs_open_context *ctx; 3492 struct nfs4_state *state; 3493 unsigned long timeout = NFS4_LOCK_MINTIMEOUT; 3494 int status; 3495 3496 /* verify open state */ 3497 ctx = (struct nfs_open_context *)filp->private_data; 3498 state = ctx->state; 3499 3500 if (request->fl_start < 0 || request->fl_end < 0) 3501 return -EINVAL; 3502 3503 if (IS_GETLK(cmd)) 3504 return nfs4_proc_getlk(state, F_GETLK, request); 3505 3506 if (!(IS_SETLK(cmd) || IS_SETLKW(cmd))) 3507 return -EINVAL; 3508 3509 if (request->fl_type == F_UNLCK) 3510 return nfs4_proc_unlck(state, cmd, request); 3511 3512 do { 3513 status = nfs4_proc_setlk(state, cmd, request); 3514 if ((status != -EAGAIN) || IS_SETLK(cmd)) 3515 break; 3516 timeout = nfs4_set_lock_task_retry(timeout); 3517 status = -ERESTARTSYS; 3518 if (signalled()) 3519 break; 3520 } while(status < 0); 3521 return status; 3522 } 3523 3524 int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl) 3525 { 3526 struct nfs_server *server = NFS_SERVER(state->inode); 3527 struct nfs4_exception exception = { }; 3528 int err; 3529 3530 err = nfs4_set_lock_state(state, fl); 3531 if (err != 0) 3532 goto out; 3533 do { 3534 err = _nfs4_do_setlk(state, F_SETLK, fl, 0); 3535 if (err != -NFS4ERR_DELAY) 3536 break; 3537 err = nfs4_handle_exception(server, err, &exception); 3538 } while (exception.retry); 3539 out: 3540 return err; 3541 } 3542 3543 #define XATTR_NAME_NFSV4_ACL "system.nfs4_acl" 3544 3545 int nfs4_setxattr(struct dentry *dentry, const char *key, const void *buf, 3546 size_t buflen, int flags) 3547 { 3548 struct inode *inode = dentry->d_inode; 3549 3550 if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0) 3551 return -EOPNOTSUPP; 3552 3553 if (!S_ISREG(inode->i_mode) && 3554 (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) 3555 return -EPERM; 3556 3557 return nfs4_proc_set_acl(inode, buf, buflen); 3558 } 3559 3560 /* The getxattr man page suggests returning -ENODATA for unknown attributes, 3561 * and that's what we'll do for e.g. user attributes that haven't been set. 3562 * But we'll follow ext2/ext3's lead by returning -EOPNOTSUPP for unsupported 3563 * attributes in kernel-managed attribute namespaces. */ 3564 ssize_t nfs4_getxattr(struct dentry *dentry, const char *key, void *buf, 3565 size_t buflen) 3566 { 3567 struct inode *inode = dentry->d_inode; 3568 3569 if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0) 3570 return -EOPNOTSUPP; 3571 3572 return nfs4_proc_get_acl(inode, buf, buflen); 3573 } 3574 3575 ssize_t nfs4_listxattr(struct dentry *dentry, char *buf, size_t buflen) 3576 { 3577 size_t len = strlen(XATTR_NAME_NFSV4_ACL) + 1; 3578 3579 if (!nfs4_server_supports_acls(NFS_SERVER(dentry->d_inode))) 3580 return 0; 3581 if (buf && buflen < len) 3582 return -ERANGE; 3583 if (buf) 3584 memcpy(buf, XATTR_NAME_NFSV4_ACL, len); 3585 return len; 3586 } 3587 3588 int nfs4_proc_fs_locations(struct inode *dir, struct dentry *dentry, 3589 struct nfs4_fs_locations *fs_locations, struct page *page) 3590 { 3591 struct nfs_server *server = NFS_SERVER(dir); 3592 u32 bitmask[2] = { 3593 [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS, 3594 [1] = FATTR4_WORD1_MOUNTED_ON_FILEID, 3595 }; 3596 struct nfs4_fs_locations_arg args = { 3597 .dir_fh = NFS_FH(dir), 3598 .name = &dentry->d_name, 3599 .page = page, 3600 .bitmask = bitmask, 3601 }; 3602 struct rpc_message msg = { 3603 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FS_LOCATIONS], 3604 .rpc_argp = &args, 3605 .rpc_resp = fs_locations, 3606 }; 3607 int status; 3608 3609 dprintk("%s: start\n", __FUNCTION__); 3610 fs_locations->fattr.valid = 0; 3611 fs_locations->server = server; 3612 fs_locations->nlocations = 0; 3613 status = rpc_call_sync(server->client, &msg, 0); 3614 dprintk("%s: returned status = %d\n", __FUNCTION__, status); 3615 return status; 3616 } 3617 3618 struct nfs4_state_recovery_ops nfs4_reboot_recovery_ops = { 3619 .recover_open = nfs4_open_reclaim, 3620 .recover_lock = nfs4_lock_reclaim, 3621 }; 3622 3623 struct nfs4_state_recovery_ops nfs4_network_partition_recovery_ops = { 3624 .recover_open = nfs4_open_expired, 3625 .recover_lock = nfs4_lock_expired, 3626 }; 3627 3628 static struct inode_operations nfs4_file_inode_operations = { 3629 .permission = nfs_permission, 3630 .getattr = nfs_getattr, 3631 .setattr = nfs_setattr, 3632 .getxattr = nfs4_getxattr, 3633 .setxattr = nfs4_setxattr, 3634 .listxattr = nfs4_listxattr, 3635 }; 3636 3637 const struct nfs_rpc_ops nfs_v4_clientops = { 3638 .version = 4, /* protocol version */ 3639 .dentry_ops = &nfs4_dentry_operations, 3640 .dir_inode_ops = &nfs4_dir_inode_operations, 3641 .file_inode_ops = &nfs4_file_inode_operations, 3642 .getroot = nfs4_proc_get_root, 3643 .getattr = nfs4_proc_getattr, 3644 .setattr = nfs4_proc_setattr, 3645 .lookupfh = nfs4_proc_lookupfh, 3646 .lookup = nfs4_proc_lookup, 3647 .access = nfs4_proc_access, 3648 .readlink = nfs4_proc_readlink, 3649 .read = nfs4_proc_read, 3650 .create = nfs4_proc_create, 3651 .remove = nfs4_proc_remove, 3652 .unlink_setup = nfs4_proc_unlink_setup, 3653 .unlink_done = nfs4_proc_unlink_done, 3654 .rename = nfs4_proc_rename, 3655 .link = nfs4_proc_link, 3656 .symlink = nfs4_proc_symlink, 3657 .mkdir = nfs4_proc_mkdir, 3658 .rmdir = nfs4_proc_remove, 3659 .readdir = nfs4_proc_readdir, 3660 .mknod = nfs4_proc_mknod, 3661 .statfs = nfs4_proc_statfs, 3662 .fsinfo = nfs4_proc_fsinfo, 3663 .pathconf = nfs4_proc_pathconf, 3664 .set_capabilities = nfs4_server_capabilities, 3665 .decode_dirent = nfs4_decode_dirent, 3666 .read_setup = nfs4_proc_read_setup, 3667 .read_done = nfs4_read_done, 3668 .write_setup = nfs4_proc_write_setup, 3669 .write_done = nfs4_write_done, 3670 .commit_setup = nfs4_proc_commit_setup, 3671 .commit_done = nfs4_commit_done, 3672 .file_open = nfs_open, 3673 .file_release = nfs_release, 3674 .lock = nfs4_proc_lock, 3675 .clear_acl_cache = nfs4_zap_acl_attr, 3676 }; 3677 3678 /* 3679 * Local variables: 3680 * c-basic-offset: 8 3681 * End: 3682 */ 3683