1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * linux/fs/nfs/nfs3proc.c 4 * 5 * Client-side NFSv3 procedures stubs. 6 * 7 * Copyright (C) 1997, Olaf Kirch 8 */ 9 10 #include <linux/mm.h> 11 #include <linux/errno.h> 12 #include <linux/string.h> 13 #include <linux/sunrpc/clnt.h> 14 #include <linux/slab.h> 15 #include <linux/nfs.h> 16 #include <linux/nfs3.h> 17 #include <linux/nfs_fs.h> 18 #include <linux/nfs_page.h> 19 #include <linux/lockd/bind.h> 20 #include <linux/nfs_mount.h> 21 #include <linux/freezer.h> 22 #include <linux/xattr.h> 23 24 #include "iostat.h" 25 #include "internal.h" 26 #include "nfs3_fs.h" 27 28 #define NFSDBG_FACILITY NFSDBG_PROC 29 30 /* A wrapper to handle the EJUKEBOX error messages */ 31 static int 32 nfs3_rpc_wrapper(struct rpc_clnt *clnt, struct rpc_message *msg, int flags) 33 { 34 int res; 35 do { 36 res = rpc_call_sync(clnt, msg, flags); 37 if (res != -EJUKEBOX) 38 break; 39 freezable_schedule_timeout_killable_unsafe(NFS_JUKEBOX_RETRY_TIME); 40 res = -ERESTARTSYS; 41 } while (!fatal_signal_pending(current)); 42 return res; 43 } 44 45 #define rpc_call_sync(clnt, msg, flags) nfs3_rpc_wrapper(clnt, msg, flags) 46 47 static int 48 nfs3_async_handle_jukebox(struct rpc_task *task, struct inode *inode) 49 { 50 if (task->tk_status != -EJUKEBOX) 51 return 0; 52 if (task->tk_status == -EJUKEBOX) 53 nfs_inc_stats(inode, NFSIOS_DELAY); 54 task->tk_status = 0; 55 rpc_restart_call(task); 56 rpc_delay(task, NFS_JUKEBOX_RETRY_TIME); 57 return 1; 58 } 59 60 static int 61 do_proc_get_root(struct rpc_clnt *client, struct nfs_fh *fhandle, 62 struct nfs_fsinfo *info) 63 { 64 struct rpc_message msg = { 65 .rpc_proc = &nfs3_procedures[NFS3PROC_FSINFO], 66 .rpc_argp = fhandle, 67 .rpc_resp = info, 68 }; 69 int status; 70 71 dprintk("%s: call fsinfo\n", __func__); 72 nfs_fattr_init(info->fattr); 73 status = rpc_call_sync(client, &msg, 0); 74 dprintk("%s: reply fsinfo: %d\n", __func__, status); 75 if (status == 0 && !(info->fattr->valid & NFS_ATTR_FATTR)) { 76 msg.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR]; 77 msg.rpc_resp = info->fattr; 78 status = rpc_call_sync(client, &msg, 0); 79 dprintk("%s: reply getattr: %d\n", __func__, status); 80 } 81 return status; 82 } 83 84 /* 85 * Bare-bones access to getattr: this is for nfs_get_root/nfs_get_sb 86 */ 87 static int 88 nfs3_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, 89 struct nfs_fsinfo *info) 90 { 91 int status; 92 93 status = do_proc_get_root(server->client, fhandle, info); 94 if (status && server->nfs_client->cl_rpcclient != server->client) 95 status = do_proc_get_root(server->nfs_client->cl_rpcclient, fhandle, info); 96 return status; 97 } 98 99 /* 100 * One function for each procedure in the NFS protocol. 101 */ 102 static int 103 nfs3_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, 104 struct nfs_fattr *fattr, struct nfs4_label *label, 105 struct inode *inode) 106 { 107 struct rpc_message msg = { 108 .rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR], 109 .rpc_argp = fhandle, 110 .rpc_resp = fattr, 111 }; 112 int status; 113 unsigned short task_flags = 0; 114 115 /* Is this is an attribute revalidation, subject to softreval? */ 116 if (inode && (server->flags & NFS_MOUNT_SOFTREVAL)) 117 task_flags |= RPC_TASK_TIMEOUT; 118 119 dprintk("NFS call getattr\n"); 120 nfs_fattr_init(fattr); 121 status = rpc_call_sync(server->client, &msg, task_flags); 122 dprintk("NFS reply getattr: %d\n", status); 123 return status; 124 } 125 126 static int 127 nfs3_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr, 128 struct iattr *sattr) 129 { 130 struct inode *inode = d_inode(dentry); 131 struct nfs3_sattrargs arg = { 132 .fh = NFS_FH(inode), 133 .sattr = sattr, 134 }; 135 struct rpc_message msg = { 136 .rpc_proc = &nfs3_procedures[NFS3PROC_SETATTR], 137 .rpc_argp = &arg, 138 .rpc_resp = fattr, 139 }; 140 int status; 141 142 dprintk("NFS call setattr\n"); 143 if (sattr->ia_valid & ATTR_FILE) 144 msg.rpc_cred = nfs_file_cred(sattr->ia_file); 145 nfs_fattr_init(fattr); 146 status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0); 147 if (status == 0) { 148 nfs_setattr_update_inode(inode, sattr, fattr); 149 if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_ACL) 150 nfs_zap_acl_cache(inode); 151 } 152 dprintk("NFS reply setattr: %d\n", status); 153 return status; 154 } 155 156 static int 157 nfs3_proc_lookup(struct inode *dir, struct dentry *dentry, 158 struct nfs_fh *fhandle, struct nfs_fattr *fattr, 159 struct nfs4_label *label) 160 { 161 struct nfs3_diropargs arg = { 162 .fh = NFS_FH(dir), 163 .name = dentry->d_name.name, 164 .len = dentry->d_name.len 165 }; 166 struct nfs3_diropres res = { 167 .fh = fhandle, 168 .fattr = fattr 169 }; 170 struct rpc_message msg = { 171 .rpc_proc = &nfs3_procedures[NFS3PROC_LOOKUP], 172 .rpc_argp = &arg, 173 .rpc_resp = &res, 174 }; 175 int status; 176 unsigned short task_flags = 0; 177 178 /* Is this is an attribute revalidation, subject to softreval? */ 179 if (nfs_lookup_is_soft_revalidate(dentry)) 180 task_flags |= RPC_TASK_TIMEOUT; 181 182 dprintk("NFS call lookup %pd2\n", dentry); 183 res.dir_attr = nfs_alloc_fattr(); 184 if (res.dir_attr == NULL) 185 return -ENOMEM; 186 187 nfs_fattr_init(fattr); 188 status = rpc_call_sync(NFS_CLIENT(dir), &msg, task_flags); 189 nfs_refresh_inode(dir, res.dir_attr); 190 if (status >= 0 && !(fattr->valid & NFS_ATTR_FATTR)) { 191 msg.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR]; 192 msg.rpc_argp = fhandle; 193 msg.rpc_resp = fattr; 194 status = rpc_call_sync(NFS_CLIENT(dir), &msg, task_flags); 195 } 196 nfs_free_fattr(res.dir_attr); 197 dprintk("NFS reply lookup: %d\n", status); 198 return status; 199 } 200 201 static int nfs3_proc_access(struct inode *inode, struct nfs_access_entry *entry) 202 { 203 struct nfs3_accessargs arg = { 204 .fh = NFS_FH(inode), 205 .access = entry->mask, 206 }; 207 struct nfs3_accessres res; 208 struct rpc_message msg = { 209 .rpc_proc = &nfs3_procedures[NFS3PROC_ACCESS], 210 .rpc_argp = &arg, 211 .rpc_resp = &res, 212 .rpc_cred = entry->cred, 213 }; 214 int status = -ENOMEM; 215 216 dprintk("NFS call access\n"); 217 res.fattr = nfs_alloc_fattr(); 218 if (res.fattr == NULL) 219 goto out; 220 221 status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0); 222 nfs_refresh_inode(inode, res.fattr); 223 if (status == 0) 224 nfs_access_set_mask(entry, res.access); 225 nfs_free_fattr(res.fattr); 226 out: 227 dprintk("NFS reply access: %d\n", status); 228 return status; 229 } 230 231 static int nfs3_proc_readlink(struct inode *inode, struct page *page, 232 unsigned int pgbase, unsigned int pglen) 233 { 234 struct nfs_fattr *fattr; 235 struct nfs3_readlinkargs args = { 236 .fh = NFS_FH(inode), 237 .pgbase = pgbase, 238 .pglen = pglen, 239 .pages = &page 240 }; 241 struct rpc_message msg = { 242 .rpc_proc = &nfs3_procedures[NFS3PROC_READLINK], 243 .rpc_argp = &args, 244 }; 245 int status = -ENOMEM; 246 247 dprintk("NFS call readlink\n"); 248 fattr = nfs_alloc_fattr(); 249 if (fattr == NULL) 250 goto out; 251 msg.rpc_resp = fattr; 252 253 status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0); 254 nfs_refresh_inode(inode, fattr); 255 nfs_free_fattr(fattr); 256 out: 257 dprintk("NFS reply readlink: %d\n", status); 258 return status; 259 } 260 261 struct nfs3_createdata { 262 struct rpc_message msg; 263 union { 264 struct nfs3_createargs create; 265 struct nfs3_mkdirargs mkdir; 266 struct nfs3_symlinkargs symlink; 267 struct nfs3_mknodargs mknod; 268 } arg; 269 struct nfs3_diropres res; 270 struct nfs_fh fh; 271 struct nfs_fattr fattr; 272 struct nfs_fattr dir_attr; 273 }; 274 275 static struct nfs3_createdata *nfs3_alloc_createdata(void) 276 { 277 struct nfs3_createdata *data; 278 279 data = kzalloc(sizeof(*data), GFP_KERNEL); 280 if (data != NULL) { 281 data->msg.rpc_argp = &data->arg; 282 data->msg.rpc_resp = &data->res; 283 data->res.fh = &data->fh; 284 data->res.fattr = &data->fattr; 285 data->res.dir_attr = &data->dir_attr; 286 nfs_fattr_init(data->res.fattr); 287 nfs_fattr_init(data->res.dir_attr); 288 } 289 return data; 290 } 291 292 static struct dentry * 293 nfs3_do_create(struct inode *dir, struct dentry *dentry, struct nfs3_createdata *data) 294 { 295 int status; 296 297 status = rpc_call_sync(NFS_CLIENT(dir), &data->msg, 0); 298 nfs_post_op_update_inode(dir, data->res.dir_attr); 299 if (status != 0) 300 return ERR_PTR(status); 301 302 return nfs_add_or_obtain(dentry, data->res.fh, data->res.fattr, NULL); 303 } 304 305 static void nfs3_free_createdata(struct nfs3_createdata *data) 306 { 307 kfree(data); 308 } 309 310 /* 311 * Create a regular file. 312 */ 313 static int 314 nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, 315 int flags) 316 { 317 struct posix_acl *default_acl, *acl; 318 struct nfs3_createdata *data; 319 struct dentry *d_alias; 320 int status = -ENOMEM; 321 322 dprintk("NFS call create %pd\n", dentry); 323 324 data = nfs3_alloc_createdata(); 325 if (data == NULL) 326 goto out; 327 328 data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_CREATE]; 329 data->arg.create.fh = NFS_FH(dir); 330 data->arg.create.name = dentry->d_name.name; 331 data->arg.create.len = dentry->d_name.len; 332 data->arg.create.sattr = sattr; 333 334 data->arg.create.createmode = NFS3_CREATE_UNCHECKED; 335 if (flags & O_EXCL) { 336 data->arg.create.createmode = NFS3_CREATE_EXCLUSIVE; 337 data->arg.create.verifier[0] = cpu_to_be32(jiffies); 338 data->arg.create.verifier[1] = cpu_to_be32(current->pid); 339 } 340 341 status = posix_acl_create(dir, &sattr->ia_mode, &default_acl, &acl); 342 if (status) 343 goto out; 344 345 for (;;) { 346 d_alias = nfs3_do_create(dir, dentry, data); 347 status = PTR_ERR_OR_ZERO(d_alias); 348 349 if (status != -ENOTSUPP) 350 break; 351 /* If the server doesn't support the exclusive creation 352 * semantics, try again with simple 'guarded' mode. */ 353 switch (data->arg.create.createmode) { 354 case NFS3_CREATE_EXCLUSIVE: 355 data->arg.create.createmode = NFS3_CREATE_GUARDED; 356 break; 357 358 case NFS3_CREATE_GUARDED: 359 data->arg.create.createmode = NFS3_CREATE_UNCHECKED; 360 break; 361 362 case NFS3_CREATE_UNCHECKED: 363 goto out; 364 } 365 nfs_fattr_init(data->res.dir_attr); 366 nfs_fattr_init(data->res.fattr); 367 } 368 369 if (status != 0) 370 goto out_release_acls; 371 372 if (d_alias) 373 dentry = d_alias; 374 375 /* When we created the file with exclusive semantics, make 376 * sure we set the attributes afterwards. */ 377 if (data->arg.create.createmode == NFS3_CREATE_EXCLUSIVE) { 378 dprintk("NFS call setattr (post-create)\n"); 379 380 if (!(sattr->ia_valid & ATTR_ATIME_SET)) 381 sattr->ia_valid |= ATTR_ATIME; 382 if (!(sattr->ia_valid & ATTR_MTIME_SET)) 383 sattr->ia_valid |= ATTR_MTIME; 384 385 /* Note: we could use a guarded setattr here, but I'm 386 * not sure this buys us anything (and I'd have 387 * to revamp the NFSv3 XDR code) */ 388 status = nfs3_proc_setattr(dentry, data->res.fattr, sattr); 389 nfs_post_op_update_inode(d_inode(dentry), data->res.fattr); 390 dprintk("NFS reply setattr (post-create): %d\n", status); 391 if (status != 0) 392 goto out_dput; 393 } 394 395 status = nfs3_proc_setacls(d_inode(dentry), acl, default_acl); 396 397 out_dput: 398 dput(d_alias); 399 out_release_acls: 400 posix_acl_release(acl); 401 posix_acl_release(default_acl); 402 out: 403 nfs3_free_createdata(data); 404 dprintk("NFS reply create: %d\n", status); 405 return status; 406 } 407 408 static int 409 nfs3_proc_remove(struct inode *dir, struct dentry *dentry) 410 { 411 struct nfs_removeargs arg = { 412 .fh = NFS_FH(dir), 413 .name = dentry->d_name, 414 }; 415 struct nfs_removeres res; 416 struct rpc_message msg = { 417 .rpc_proc = &nfs3_procedures[NFS3PROC_REMOVE], 418 .rpc_argp = &arg, 419 .rpc_resp = &res, 420 }; 421 int status = -ENOMEM; 422 423 dprintk("NFS call remove %pd2\n", dentry); 424 res.dir_attr = nfs_alloc_fattr(); 425 if (res.dir_attr == NULL) 426 goto out; 427 428 status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); 429 nfs_post_op_update_inode(dir, res.dir_attr); 430 nfs_free_fattr(res.dir_attr); 431 out: 432 dprintk("NFS reply remove: %d\n", status); 433 return status; 434 } 435 436 static void 437 nfs3_proc_unlink_setup(struct rpc_message *msg, 438 struct dentry *dentry, 439 struct inode *inode) 440 { 441 msg->rpc_proc = &nfs3_procedures[NFS3PROC_REMOVE]; 442 } 443 444 static void nfs3_proc_unlink_rpc_prepare(struct rpc_task *task, struct nfs_unlinkdata *data) 445 { 446 rpc_call_start(task); 447 } 448 449 static int 450 nfs3_proc_unlink_done(struct rpc_task *task, struct inode *dir) 451 { 452 struct nfs_removeres *res; 453 if (nfs3_async_handle_jukebox(task, dir)) 454 return 0; 455 res = task->tk_msg.rpc_resp; 456 nfs_post_op_update_inode(dir, res->dir_attr); 457 return 1; 458 } 459 460 static void 461 nfs3_proc_rename_setup(struct rpc_message *msg, 462 struct dentry *old_dentry, 463 struct dentry *new_dentry) 464 { 465 msg->rpc_proc = &nfs3_procedures[NFS3PROC_RENAME]; 466 } 467 468 static void nfs3_proc_rename_rpc_prepare(struct rpc_task *task, struct nfs_renamedata *data) 469 { 470 rpc_call_start(task); 471 } 472 473 static int 474 nfs3_proc_rename_done(struct rpc_task *task, struct inode *old_dir, 475 struct inode *new_dir) 476 { 477 struct nfs_renameres *res; 478 479 if (nfs3_async_handle_jukebox(task, old_dir)) 480 return 0; 481 res = task->tk_msg.rpc_resp; 482 483 nfs_post_op_update_inode(old_dir, res->old_fattr); 484 nfs_post_op_update_inode(new_dir, res->new_fattr); 485 return 1; 486 } 487 488 static int 489 nfs3_proc_link(struct inode *inode, struct inode *dir, const struct qstr *name) 490 { 491 struct nfs3_linkargs arg = { 492 .fromfh = NFS_FH(inode), 493 .tofh = NFS_FH(dir), 494 .toname = name->name, 495 .tolen = name->len 496 }; 497 struct nfs3_linkres res; 498 struct rpc_message msg = { 499 .rpc_proc = &nfs3_procedures[NFS3PROC_LINK], 500 .rpc_argp = &arg, 501 .rpc_resp = &res, 502 }; 503 int status = -ENOMEM; 504 505 dprintk("NFS call link %s\n", name->name); 506 res.fattr = nfs_alloc_fattr(); 507 res.dir_attr = nfs_alloc_fattr(); 508 if (res.fattr == NULL || res.dir_attr == NULL) 509 goto out; 510 511 status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0); 512 nfs_post_op_update_inode(dir, res.dir_attr); 513 nfs_post_op_update_inode(inode, res.fattr); 514 out: 515 nfs_free_fattr(res.dir_attr); 516 nfs_free_fattr(res.fattr); 517 dprintk("NFS reply link: %d\n", status); 518 return status; 519 } 520 521 static int 522 nfs3_proc_symlink(struct inode *dir, struct dentry *dentry, struct page *page, 523 unsigned int len, struct iattr *sattr) 524 { 525 struct nfs3_createdata *data; 526 struct dentry *d_alias; 527 int status = -ENOMEM; 528 529 if (len > NFS3_MAXPATHLEN) 530 return -ENAMETOOLONG; 531 532 dprintk("NFS call symlink %pd\n", dentry); 533 534 data = nfs3_alloc_createdata(); 535 if (data == NULL) 536 goto out; 537 data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_SYMLINK]; 538 data->arg.symlink.fromfh = NFS_FH(dir); 539 data->arg.symlink.fromname = dentry->d_name.name; 540 data->arg.symlink.fromlen = dentry->d_name.len; 541 data->arg.symlink.pages = &page; 542 data->arg.symlink.pathlen = len; 543 data->arg.symlink.sattr = sattr; 544 545 d_alias = nfs3_do_create(dir, dentry, data); 546 status = PTR_ERR_OR_ZERO(d_alias); 547 548 if (status == 0) 549 dput(d_alias); 550 551 nfs3_free_createdata(data); 552 out: 553 dprintk("NFS reply symlink: %d\n", status); 554 return status; 555 } 556 557 static int 558 nfs3_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr) 559 { 560 struct posix_acl *default_acl, *acl; 561 struct nfs3_createdata *data; 562 struct dentry *d_alias; 563 int status = -ENOMEM; 564 565 dprintk("NFS call mkdir %pd\n", dentry); 566 567 data = nfs3_alloc_createdata(); 568 if (data == NULL) 569 goto out; 570 571 status = posix_acl_create(dir, &sattr->ia_mode, &default_acl, &acl); 572 if (status) 573 goto out; 574 575 data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_MKDIR]; 576 data->arg.mkdir.fh = NFS_FH(dir); 577 data->arg.mkdir.name = dentry->d_name.name; 578 data->arg.mkdir.len = dentry->d_name.len; 579 data->arg.mkdir.sattr = sattr; 580 581 d_alias = nfs3_do_create(dir, dentry, data); 582 status = PTR_ERR_OR_ZERO(d_alias); 583 584 if (status != 0) 585 goto out_release_acls; 586 587 if (d_alias) 588 dentry = d_alias; 589 590 status = nfs3_proc_setacls(d_inode(dentry), acl, default_acl); 591 592 dput(d_alias); 593 out_release_acls: 594 posix_acl_release(acl); 595 posix_acl_release(default_acl); 596 out: 597 nfs3_free_createdata(data); 598 dprintk("NFS reply mkdir: %d\n", status); 599 return status; 600 } 601 602 static int 603 nfs3_proc_rmdir(struct inode *dir, const struct qstr *name) 604 { 605 struct nfs_fattr *dir_attr; 606 struct nfs3_diropargs arg = { 607 .fh = NFS_FH(dir), 608 .name = name->name, 609 .len = name->len 610 }; 611 struct rpc_message msg = { 612 .rpc_proc = &nfs3_procedures[NFS3PROC_RMDIR], 613 .rpc_argp = &arg, 614 }; 615 int status = -ENOMEM; 616 617 dprintk("NFS call rmdir %s\n", name->name); 618 dir_attr = nfs_alloc_fattr(); 619 if (dir_attr == NULL) 620 goto out; 621 622 msg.rpc_resp = dir_attr; 623 status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); 624 nfs_post_op_update_inode(dir, dir_attr); 625 nfs_free_fattr(dir_attr); 626 out: 627 dprintk("NFS reply rmdir: %d\n", status); 628 return status; 629 } 630 631 /* 632 * The READDIR implementation is somewhat hackish - we pass the user buffer 633 * to the encode function, which installs it in the receive iovec. 634 * The decode function itself doesn't perform any decoding, it just makes 635 * sure the reply is syntactically correct. 636 * 637 * Also note that this implementation handles both plain readdir and 638 * readdirplus. 639 */ 640 static int 641 nfs3_proc_readdir(struct dentry *dentry, const struct cred *cred, 642 u64 cookie, struct page **pages, unsigned int count, bool plus) 643 { 644 struct inode *dir = d_inode(dentry); 645 __be32 *verf = NFS_I(dir)->cookieverf; 646 struct nfs3_readdirargs arg = { 647 .fh = NFS_FH(dir), 648 .cookie = cookie, 649 .verf = {verf[0], verf[1]}, 650 .plus = plus, 651 .count = count, 652 .pages = pages 653 }; 654 struct nfs3_readdirres res = { 655 .verf = verf, 656 .plus = plus 657 }; 658 struct rpc_message msg = { 659 .rpc_proc = &nfs3_procedures[NFS3PROC_READDIR], 660 .rpc_argp = &arg, 661 .rpc_resp = &res, 662 .rpc_cred = cred, 663 }; 664 int status = -ENOMEM; 665 666 if (plus) 667 msg.rpc_proc = &nfs3_procedures[NFS3PROC_READDIRPLUS]; 668 669 dprintk("NFS call readdir%s %d\n", 670 plus? "plus" : "", (unsigned int) cookie); 671 672 res.dir_attr = nfs_alloc_fattr(); 673 if (res.dir_attr == NULL) 674 goto out; 675 676 status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); 677 678 nfs_invalidate_atime(dir); 679 nfs_refresh_inode(dir, res.dir_attr); 680 681 nfs_free_fattr(res.dir_attr); 682 out: 683 dprintk("NFS reply readdir%s: %d\n", 684 plus? "plus" : "", status); 685 return status; 686 } 687 688 static int 689 nfs3_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr, 690 dev_t rdev) 691 { 692 struct posix_acl *default_acl, *acl; 693 struct nfs3_createdata *data; 694 struct dentry *d_alias; 695 int status = -ENOMEM; 696 697 dprintk("NFS call mknod %pd %u:%u\n", dentry, 698 MAJOR(rdev), MINOR(rdev)); 699 700 data = nfs3_alloc_createdata(); 701 if (data == NULL) 702 goto out; 703 704 status = posix_acl_create(dir, &sattr->ia_mode, &default_acl, &acl); 705 if (status) 706 goto out; 707 708 data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_MKNOD]; 709 data->arg.mknod.fh = NFS_FH(dir); 710 data->arg.mknod.name = dentry->d_name.name; 711 data->arg.mknod.len = dentry->d_name.len; 712 data->arg.mknod.sattr = sattr; 713 data->arg.mknod.rdev = rdev; 714 715 switch (sattr->ia_mode & S_IFMT) { 716 case S_IFBLK: 717 data->arg.mknod.type = NF3BLK; 718 break; 719 case S_IFCHR: 720 data->arg.mknod.type = NF3CHR; 721 break; 722 case S_IFIFO: 723 data->arg.mknod.type = NF3FIFO; 724 break; 725 case S_IFSOCK: 726 data->arg.mknod.type = NF3SOCK; 727 break; 728 default: 729 status = -EINVAL; 730 goto out; 731 } 732 733 d_alias = nfs3_do_create(dir, dentry, data); 734 status = PTR_ERR_OR_ZERO(d_alias); 735 if (status != 0) 736 goto out_release_acls; 737 738 if (d_alias) 739 dentry = d_alias; 740 741 status = nfs3_proc_setacls(d_inode(dentry), acl, default_acl); 742 743 dput(d_alias); 744 out_release_acls: 745 posix_acl_release(acl); 746 posix_acl_release(default_acl); 747 out: 748 nfs3_free_createdata(data); 749 dprintk("NFS reply mknod: %d\n", status); 750 return status; 751 } 752 753 static int 754 nfs3_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, 755 struct nfs_fsstat *stat) 756 { 757 struct rpc_message msg = { 758 .rpc_proc = &nfs3_procedures[NFS3PROC_FSSTAT], 759 .rpc_argp = fhandle, 760 .rpc_resp = stat, 761 }; 762 int status; 763 764 dprintk("NFS call fsstat\n"); 765 nfs_fattr_init(stat->fattr); 766 status = rpc_call_sync(server->client, &msg, 0); 767 dprintk("NFS reply fsstat: %d\n", status); 768 return status; 769 } 770 771 static int 772 do_proc_fsinfo(struct rpc_clnt *client, struct nfs_fh *fhandle, 773 struct nfs_fsinfo *info) 774 { 775 struct rpc_message msg = { 776 .rpc_proc = &nfs3_procedures[NFS3PROC_FSINFO], 777 .rpc_argp = fhandle, 778 .rpc_resp = info, 779 }; 780 int status; 781 782 dprintk("NFS call fsinfo\n"); 783 nfs_fattr_init(info->fattr); 784 status = rpc_call_sync(client, &msg, 0); 785 dprintk("NFS reply fsinfo: %d\n", status); 786 return status; 787 } 788 789 /* 790 * Bare-bones access to fsinfo: this is for nfs_get_root/nfs_get_sb via 791 * nfs_create_server 792 */ 793 static int 794 nfs3_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, 795 struct nfs_fsinfo *info) 796 { 797 int status; 798 799 status = do_proc_fsinfo(server->client, fhandle, info); 800 if (status && server->nfs_client->cl_rpcclient != server->client) 801 status = do_proc_fsinfo(server->nfs_client->cl_rpcclient, fhandle, info); 802 return status; 803 } 804 805 static int 806 nfs3_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle, 807 struct nfs_pathconf *info) 808 { 809 struct rpc_message msg = { 810 .rpc_proc = &nfs3_procedures[NFS3PROC_PATHCONF], 811 .rpc_argp = fhandle, 812 .rpc_resp = info, 813 }; 814 int status; 815 816 dprintk("NFS call pathconf\n"); 817 nfs_fattr_init(info->fattr); 818 status = rpc_call_sync(server->client, &msg, 0); 819 dprintk("NFS reply pathconf: %d\n", status); 820 return status; 821 } 822 823 static int nfs3_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr) 824 { 825 struct inode *inode = hdr->inode; 826 struct nfs_server *server = NFS_SERVER(inode); 827 828 if (hdr->pgio_done_cb != NULL) 829 return hdr->pgio_done_cb(task, hdr); 830 831 if (nfs3_async_handle_jukebox(task, inode)) 832 return -EAGAIN; 833 834 if (task->tk_status >= 0 && !server->read_hdrsize) 835 cmpxchg(&server->read_hdrsize, 0, hdr->res.replen); 836 837 nfs_invalidate_atime(inode); 838 nfs_refresh_inode(inode, &hdr->fattr); 839 return 0; 840 } 841 842 static void nfs3_proc_read_setup(struct nfs_pgio_header *hdr, 843 struct rpc_message *msg) 844 { 845 msg->rpc_proc = &nfs3_procedures[NFS3PROC_READ]; 846 hdr->args.replen = NFS_SERVER(hdr->inode)->read_hdrsize; 847 } 848 849 static int nfs3_proc_pgio_rpc_prepare(struct rpc_task *task, 850 struct nfs_pgio_header *hdr) 851 { 852 rpc_call_start(task); 853 return 0; 854 } 855 856 static int nfs3_write_done(struct rpc_task *task, struct nfs_pgio_header *hdr) 857 { 858 struct inode *inode = hdr->inode; 859 860 if (hdr->pgio_done_cb != NULL) 861 return hdr->pgio_done_cb(task, hdr); 862 863 if (nfs3_async_handle_jukebox(task, inode)) 864 return -EAGAIN; 865 if (task->tk_status >= 0) 866 nfs_writeback_update_inode(hdr); 867 return 0; 868 } 869 870 static void nfs3_proc_write_setup(struct nfs_pgio_header *hdr, 871 struct rpc_message *msg, 872 struct rpc_clnt **clnt) 873 { 874 msg->rpc_proc = &nfs3_procedures[NFS3PROC_WRITE]; 875 } 876 877 static void nfs3_proc_commit_rpc_prepare(struct rpc_task *task, struct nfs_commit_data *data) 878 { 879 rpc_call_start(task); 880 } 881 882 static int nfs3_commit_done(struct rpc_task *task, struct nfs_commit_data *data) 883 { 884 if (data->commit_done_cb != NULL) 885 return data->commit_done_cb(task, data); 886 887 if (nfs3_async_handle_jukebox(task, data->inode)) 888 return -EAGAIN; 889 nfs_refresh_inode(data->inode, data->res.fattr); 890 return 0; 891 } 892 893 static void nfs3_proc_commit_setup(struct nfs_commit_data *data, struct rpc_message *msg, 894 struct rpc_clnt **clnt) 895 { 896 msg->rpc_proc = &nfs3_procedures[NFS3PROC_COMMIT]; 897 } 898 899 static void nfs3_nlm_alloc_call(void *data) 900 { 901 struct nfs_lock_context *l_ctx = data; 902 if (l_ctx && test_bit(NFS_CONTEXT_UNLOCK, &l_ctx->open_context->flags)) { 903 get_nfs_open_context(l_ctx->open_context); 904 nfs_get_lock_context(l_ctx->open_context); 905 } 906 } 907 908 static bool nfs3_nlm_unlock_prepare(struct rpc_task *task, void *data) 909 { 910 struct nfs_lock_context *l_ctx = data; 911 if (l_ctx && test_bit(NFS_CONTEXT_UNLOCK, &l_ctx->open_context->flags)) 912 return nfs_async_iocounter_wait(task, l_ctx); 913 return false; 914 915 } 916 917 static void nfs3_nlm_release_call(void *data) 918 { 919 struct nfs_lock_context *l_ctx = data; 920 struct nfs_open_context *ctx; 921 if (l_ctx && test_bit(NFS_CONTEXT_UNLOCK, &l_ctx->open_context->flags)) { 922 ctx = l_ctx->open_context; 923 nfs_put_lock_context(l_ctx); 924 put_nfs_open_context(ctx); 925 } 926 } 927 928 static const struct nlmclnt_operations nlmclnt_fl_close_lock_ops = { 929 .nlmclnt_alloc_call = nfs3_nlm_alloc_call, 930 .nlmclnt_unlock_prepare = nfs3_nlm_unlock_prepare, 931 .nlmclnt_release_call = nfs3_nlm_release_call, 932 }; 933 934 static int 935 nfs3_proc_lock(struct file *filp, int cmd, struct file_lock *fl) 936 { 937 struct inode *inode = file_inode(filp); 938 struct nfs_lock_context *l_ctx = NULL; 939 struct nfs_open_context *ctx = nfs_file_open_context(filp); 940 int status; 941 942 if (fl->fl_flags & FL_CLOSE) { 943 l_ctx = nfs_get_lock_context(ctx); 944 if (IS_ERR(l_ctx)) 945 l_ctx = NULL; 946 else 947 set_bit(NFS_CONTEXT_UNLOCK, &ctx->flags); 948 } 949 950 status = nlmclnt_proc(NFS_SERVER(inode)->nlm_host, cmd, fl, l_ctx); 951 952 if (l_ctx) 953 nfs_put_lock_context(l_ctx); 954 955 return status; 956 } 957 958 static int nfs3_have_delegation(struct inode *inode, fmode_t flags) 959 { 960 return 0; 961 } 962 963 static const struct inode_operations nfs3_dir_inode_operations = { 964 .create = nfs_create, 965 .lookup = nfs_lookup, 966 .link = nfs_link, 967 .unlink = nfs_unlink, 968 .symlink = nfs_symlink, 969 .mkdir = nfs_mkdir, 970 .rmdir = nfs_rmdir, 971 .mknod = nfs_mknod, 972 .rename = nfs_rename, 973 .permission = nfs_permission, 974 .getattr = nfs_getattr, 975 .setattr = nfs_setattr, 976 #ifdef CONFIG_NFS_V3_ACL 977 .listxattr = nfs3_listxattr, 978 .get_acl = nfs3_get_acl, 979 .set_acl = nfs3_set_acl, 980 #endif 981 }; 982 983 static const struct inode_operations nfs3_file_inode_operations = { 984 .permission = nfs_permission, 985 .getattr = nfs_getattr, 986 .setattr = nfs_setattr, 987 #ifdef CONFIG_NFS_V3_ACL 988 .listxattr = nfs3_listxattr, 989 .get_acl = nfs3_get_acl, 990 .set_acl = nfs3_set_acl, 991 #endif 992 }; 993 994 const struct nfs_rpc_ops nfs_v3_clientops = { 995 .version = 3, /* protocol version */ 996 .dentry_ops = &nfs_dentry_operations, 997 .dir_inode_ops = &nfs3_dir_inode_operations, 998 .file_inode_ops = &nfs3_file_inode_operations, 999 .file_ops = &nfs_file_operations, 1000 .nlmclnt_ops = &nlmclnt_fl_close_lock_ops, 1001 .getroot = nfs3_proc_get_root, 1002 .submount = nfs_submount, 1003 .try_get_tree = nfs_try_get_tree, 1004 .getattr = nfs3_proc_getattr, 1005 .setattr = nfs3_proc_setattr, 1006 .lookup = nfs3_proc_lookup, 1007 .access = nfs3_proc_access, 1008 .readlink = nfs3_proc_readlink, 1009 .create = nfs3_proc_create, 1010 .remove = nfs3_proc_remove, 1011 .unlink_setup = nfs3_proc_unlink_setup, 1012 .unlink_rpc_prepare = nfs3_proc_unlink_rpc_prepare, 1013 .unlink_done = nfs3_proc_unlink_done, 1014 .rename_setup = nfs3_proc_rename_setup, 1015 .rename_rpc_prepare = nfs3_proc_rename_rpc_prepare, 1016 .rename_done = nfs3_proc_rename_done, 1017 .link = nfs3_proc_link, 1018 .symlink = nfs3_proc_symlink, 1019 .mkdir = nfs3_proc_mkdir, 1020 .rmdir = nfs3_proc_rmdir, 1021 .readdir = nfs3_proc_readdir, 1022 .mknod = nfs3_proc_mknod, 1023 .statfs = nfs3_proc_statfs, 1024 .fsinfo = nfs3_proc_fsinfo, 1025 .pathconf = nfs3_proc_pathconf, 1026 .decode_dirent = nfs3_decode_dirent, 1027 .pgio_rpc_prepare = nfs3_proc_pgio_rpc_prepare, 1028 .read_setup = nfs3_proc_read_setup, 1029 .read_done = nfs3_read_done, 1030 .write_setup = nfs3_proc_write_setup, 1031 .write_done = nfs3_write_done, 1032 .commit_setup = nfs3_proc_commit_setup, 1033 .commit_rpc_prepare = nfs3_proc_commit_rpc_prepare, 1034 .commit_done = nfs3_commit_done, 1035 .lock = nfs3_proc_lock, 1036 .clear_acl_cache = forget_all_cached_acls, 1037 .close_context = nfs_close_context, 1038 .have_delegation = nfs3_have_delegation, 1039 .alloc_client = nfs_alloc_client, 1040 .init_client = nfs_init_client, 1041 .free_client = nfs_free_client, 1042 .create_server = nfs3_create_server, 1043 .clone_server = nfs3_clone_server, 1044 }; 1045