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