linux/fs/nfs/proc.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 *  linux/fs/nfs/proc.c
   4 *
   5 *  Copyright (C) 1992, 1993, 1994  Rick Sladkey
   6 *
   7 *  OS-independent nfs remote procedure call functions
   8 *
   9 *  Tuned by Alan Cox <A.Cox@swansea.ac.uk> for >3K buffers
  10 *  so at last we can have decent(ish) throughput off a 
  11 *  Sun server.
  12 *
  13 *  Coding optimized and cleaned up by Florian La Roche.
  14 *  Note: Error returns are optimized for NFS_OK, which isn't translated via
  15 *  nfs_stat_to_errno(), but happens to be already the right return code.
  16 *
  17 *  Also, the code currently doesn't check the size of the packet, when
  18 *  it decodes the packet.
  19 *
  20 *  Feel free to fix it and mail me the diffs if it worries you.
  21 *
  22 *  Completely rewritten to support the new RPC call interface;
  23 *  rewrote and moved the entire XDR stuff to xdr.c
  24 *  --Olaf Kirch June 1996
  25 *
  26 *  The code below initializes all auto variables explicitly, otherwise
  27 *  it will fail to work as a module (gcc generates a memset call for an
  28 *  incomplete struct).
  29 */
  30
  31#include <linux/types.h>
  32#include <linux/param.h>
  33#include <linux/time.h>
  34#include <linux/mm.h>
  35#include <linux/errno.h>
  36#include <linux/string.h>
  37#include <linux/in.h>
  38#include <linux/pagemap.h>
  39#include <linux/sunrpc/clnt.h>
  40#include <linux/nfs.h>
  41#include <linux/nfs2.h>
  42#include <linux/nfs_fs.h>
  43#include <linux/nfs_page.h>
  44#include <linux/lockd/bind.h>
  45#include <linux/freezer.h>
  46#include "internal.h"
  47
  48#define NFSDBG_FACILITY         NFSDBG_PROC
  49
  50/*
  51 * Bare-bones access to getattr: this is for nfs_read_super.
  52 */
  53static int
  54nfs_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
  55                  struct nfs_fsinfo *info)
  56{
  57        struct nfs_fattr *fattr = info->fattr;
  58        struct nfs2_fsstat fsinfo;
  59        struct rpc_message msg = {
  60                .rpc_proc       = &nfs_procedures[NFSPROC_GETATTR],
  61                .rpc_argp       = fhandle,
  62                .rpc_resp       = fattr,
  63        };
  64        int status;
  65
  66        dprintk("%s: call getattr\n", __func__);
  67        nfs_fattr_init(fattr);
  68        status = rpc_call_sync(server->client, &msg, 0);
  69        /* Retry with default authentication if different */
  70        if (status && server->nfs_client->cl_rpcclient != server->client)
  71                status = rpc_call_sync(server->nfs_client->cl_rpcclient, &msg, 0);
  72        dprintk("%s: reply getattr: %d\n", __func__, status);
  73        if (status)
  74                return status;
  75        dprintk("%s: call statfs\n", __func__);
  76        msg.rpc_proc = &nfs_procedures[NFSPROC_STATFS];
  77        msg.rpc_resp = &fsinfo;
  78        status = rpc_call_sync(server->client, &msg, 0);
  79        /* Retry with default authentication if different */
  80        if (status && server->nfs_client->cl_rpcclient != server->client)
  81                status = rpc_call_sync(server->nfs_client->cl_rpcclient, &msg, 0);
  82        dprintk("%s: reply statfs: %d\n", __func__, status);
  83        if (status)
  84                return status;
  85        info->rtmax  = NFS_MAXDATA;
  86        info->rtpref = fsinfo.tsize;
  87        info->rtmult = fsinfo.bsize;
  88        info->wtmax  = NFS_MAXDATA;
  89        info->wtpref = fsinfo.tsize;
  90        info->wtmult = fsinfo.bsize;
  91        info->dtpref = fsinfo.tsize;
  92        info->maxfilesize = 0x7FFFFFFF;
  93        info->lease_time = 0;
  94        info->change_attr_type = NFS4_CHANGE_TYPE_IS_TIME_METADATA;
  95        return 0;
  96}
  97
  98/*
  99 * One function for each procedure in the NFS protocol.
 100 */
 101static int
 102nfs_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
 103                struct nfs_fattr *fattr, struct nfs4_label *label,
 104                struct inode *inode)
 105{
 106        struct rpc_message msg = {
 107                .rpc_proc       = &nfs_procedures[NFSPROC_GETATTR],
 108                .rpc_argp       = fhandle,
 109                .rpc_resp       = fattr,
 110        };
 111        int     status;
 112        unsigned short task_flags = 0;
 113
 114        /* Is this is an attribute revalidation, subject to softreval? */
 115        if (inode && (server->flags & NFS_MOUNT_SOFTREVAL))
 116                task_flags |= RPC_TASK_TIMEOUT;
 117
 118        dprintk("NFS call  getattr\n");
 119        nfs_fattr_init(fattr);
 120        status = rpc_call_sync(server->client, &msg, task_flags);
 121        dprintk("NFS reply getattr: %d\n", status);
 122        return status;
 123}
 124
 125static int
 126nfs_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
 127                 struct iattr *sattr)
 128{
 129        struct inode *inode = d_inode(dentry);
 130        struct nfs_sattrargs    arg = { 
 131                .fh     = NFS_FH(inode),
 132                .sattr  = sattr
 133        };
 134        struct rpc_message msg = {
 135                .rpc_proc       = &nfs_procedures[NFSPROC_SETATTR],
 136                .rpc_argp       = &arg,
 137                .rpc_resp       = fattr,
 138        };
 139        int     status;
 140
 141        /* Mask out the non-modebit related stuff from attr->ia_mode */
 142        sattr->ia_mode &= S_IALLUGO;
 143
 144        dprintk("NFS call  setattr\n");
 145        if (sattr->ia_valid & ATTR_FILE)
 146                msg.rpc_cred = nfs_file_cred(sattr->ia_file);
 147        nfs_fattr_init(fattr);
 148        status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
 149        if (status == 0)
 150                nfs_setattr_update_inode(inode, sattr, fattr);
 151        dprintk("NFS reply setattr: %d\n", status);
 152        return status;
 153}
 154
 155static int
 156nfs_proc_lookup(struct inode *dir, struct dentry *dentry,
 157                struct nfs_fh *fhandle, struct nfs_fattr *fattr,
 158                struct nfs4_label *label)
 159{
 160        struct nfs_diropargs    arg = {
 161                .fh             = NFS_FH(dir),
 162                .name           = dentry->d_name.name,
 163                .len            = dentry->d_name.len
 164        };
 165        struct nfs_diropok      res = {
 166                .fh             = fhandle,
 167                .fattr          = fattr
 168        };
 169        struct rpc_message msg = {
 170                .rpc_proc       = &nfs_procedures[NFSPROC_LOOKUP],
 171                .rpc_argp       = &arg,
 172                .rpc_resp       = &res,
 173        };
 174        int                     status;
 175        unsigned short task_flags = 0;
 176
 177        /* Is this is an attribute revalidation, subject to softreval? */
 178        if (nfs_lookup_is_soft_revalidate(dentry))
 179                task_flags |= RPC_TASK_TIMEOUT;
 180
 181        dprintk("NFS call  lookup %pd2\n", dentry);
 182        nfs_fattr_init(fattr);
 183        status = rpc_call_sync(NFS_CLIENT(dir), &msg, task_flags);
 184        dprintk("NFS reply lookup: %d\n", status);
 185        return status;
 186}
 187
 188static int nfs_proc_readlink(struct inode *inode, struct page *page,
 189                unsigned int pgbase, unsigned int pglen)
 190{
 191        struct nfs_readlinkargs args = {
 192                .fh             = NFS_FH(inode),
 193                .pgbase         = pgbase,
 194                .pglen          = pglen,
 195                .pages          = &page
 196        };
 197        struct rpc_message msg = {
 198                .rpc_proc       = &nfs_procedures[NFSPROC_READLINK],
 199                .rpc_argp       = &args,
 200        };
 201        int                     status;
 202
 203        dprintk("NFS call  readlink\n");
 204        status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
 205        dprintk("NFS reply readlink: %d\n", status);
 206        return status;
 207}
 208
 209struct nfs_createdata {
 210        struct nfs_createargs arg;
 211        struct nfs_diropok res;
 212        struct nfs_fh fhandle;
 213        struct nfs_fattr fattr;
 214};
 215
 216static struct nfs_createdata *nfs_alloc_createdata(struct inode *dir,
 217                struct dentry *dentry, struct iattr *sattr)
 218{
 219        struct nfs_createdata *data;
 220
 221        data = kmalloc(sizeof(*data), GFP_KERNEL);
 222
 223        if (data != NULL) {
 224                data->arg.fh = NFS_FH(dir);
 225                data->arg.name = dentry->d_name.name;
 226                data->arg.len = dentry->d_name.len;
 227                data->arg.sattr = sattr;
 228                nfs_fattr_init(&data->fattr);
 229                data->fhandle.size = 0;
 230                data->res.fh = &data->fhandle;
 231                data->res.fattr = &data->fattr;
 232        }
 233        return data;
 234};
 235
 236static void nfs_free_createdata(const struct nfs_createdata *data)
 237{
 238        kfree(data);
 239}
 240
 241static int
 242nfs_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
 243                int flags)
 244{
 245        struct nfs_createdata *data;
 246        struct rpc_message msg = {
 247                .rpc_proc       = &nfs_procedures[NFSPROC_CREATE],
 248        };
 249        int status = -ENOMEM;
 250
 251        dprintk("NFS call  create %pd\n", dentry);
 252        data = nfs_alloc_createdata(dir, dentry, sattr);
 253        if (data == NULL)
 254                goto out;
 255        msg.rpc_argp = &data->arg;
 256        msg.rpc_resp = &data->res;
 257        status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
 258        nfs_mark_for_revalidate(dir);
 259        if (status == 0)
 260                status = nfs_instantiate(dentry, data->res.fh, data->res.fattr, NULL);
 261        nfs_free_createdata(data);
 262out:
 263        dprintk("NFS reply create: %d\n", status);
 264        return status;
 265}
 266
 267/*
 268 * In NFSv2, mknod is grafted onto the create call.
 269 */
 270static int
 271nfs_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
 272               dev_t rdev)
 273{
 274        struct nfs_createdata *data;
 275        struct rpc_message msg = {
 276                .rpc_proc       = &nfs_procedures[NFSPROC_CREATE],
 277        };
 278        umode_t mode;
 279        int status = -ENOMEM;
 280
 281        dprintk("NFS call  mknod %pd\n", dentry);
 282
 283        mode = sattr->ia_mode;
 284        if (S_ISFIFO(mode)) {
 285                sattr->ia_mode = (mode & ~S_IFMT) | S_IFCHR;
 286                sattr->ia_valid &= ~ATTR_SIZE;
 287        } else if (S_ISCHR(mode) || S_ISBLK(mode)) {
 288                sattr->ia_valid |= ATTR_SIZE;
 289                sattr->ia_size = new_encode_dev(rdev);/* get out your barf bag */
 290        }
 291
 292        data = nfs_alloc_createdata(dir, dentry, sattr);
 293        if (data == NULL)
 294                goto out;
 295        msg.rpc_argp = &data->arg;
 296        msg.rpc_resp = &data->res;
 297
 298        status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
 299        nfs_mark_for_revalidate(dir);
 300
 301        if (status == -EINVAL && S_ISFIFO(mode)) {
 302                sattr->ia_mode = mode;
 303                nfs_fattr_init(data->res.fattr);
 304                status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
 305        }
 306        if (status == 0)
 307                status = nfs_instantiate(dentry, data->res.fh, data->res.fattr, NULL);
 308        nfs_free_createdata(data);
 309out:
 310        dprintk("NFS reply mknod: %d\n", status);
 311        return status;
 312}
 313  
 314static int
 315nfs_proc_remove(struct inode *dir, struct dentry *dentry)
 316{
 317        struct nfs_removeargs arg = {
 318                .fh = NFS_FH(dir),
 319                .name = dentry->d_name,
 320        };
 321        struct rpc_message msg = { 
 322                .rpc_proc = &nfs_procedures[NFSPROC_REMOVE],
 323                .rpc_argp = &arg,
 324        };
 325        int                     status;
 326
 327        dprintk("NFS call  remove %pd2\n",dentry);
 328        status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
 329        nfs_mark_for_revalidate(dir);
 330
 331        dprintk("NFS reply remove: %d\n", status);
 332        return status;
 333}
 334
 335static void
 336nfs_proc_unlink_setup(struct rpc_message *msg,
 337                struct dentry *dentry,
 338                struct inode *inode)
 339{
 340        msg->rpc_proc = &nfs_procedures[NFSPROC_REMOVE];
 341}
 342
 343static void nfs_proc_unlink_rpc_prepare(struct rpc_task *task, struct nfs_unlinkdata *data)
 344{
 345        rpc_call_start(task);
 346}
 347
 348static int nfs_proc_unlink_done(struct rpc_task *task, struct inode *dir)
 349{
 350        nfs_mark_for_revalidate(dir);
 351        return 1;
 352}
 353
 354static void
 355nfs_proc_rename_setup(struct rpc_message *msg,
 356                struct dentry *old_dentry,
 357                struct dentry *new_dentry)
 358{
 359        msg->rpc_proc = &nfs_procedures[NFSPROC_RENAME];
 360}
 361
 362static void nfs_proc_rename_rpc_prepare(struct rpc_task *task, struct nfs_renamedata *data)
 363{
 364        rpc_call_start(task);
 365}
 366
 367static int
 368nfs_proc_rename_done(struct rpc_task *task, struct inode *old_dir,
 369                     struct inode *new_dir)
 370{
 371        nfs_mark_for_revalidate(old_dir);
 372        nfs_mark_for_revalidate(new_dir);
 373        return 1;
 374}
 375
 376static int
 377nfs_proc_link(struct inode *inode, struct inode *dir, const struct qstr *name)
 378{
 379        struct nfs_linkargs     arg = {
 380                .fromfh         = NFS_FH(inode),
 381                .tofh           = NFS_FH(dir),
 382                .toname         = name->name,
 383                .tolen          = name->len
 384        };
 385        struct rpc_message msg = {
 386                .rpc_proc       = &nfs_procedures[NFSPROC_LINK],
 387                .rpc_argp       = &arg,
 388        };
 389        int                     status;
 390
 391        dprintk("NFS call  link %s\n", name->name);
 392        status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
 393        nfs_mark_for_revalidate(inode);
 394        nfs_mark_for_revalidate(dir);
 395        dprintk("NFS reply link: %d\n", status);
 396        return status;
 397}
 398
 399static int
 400nfs_proc_symlink(struct inode *dir, struct dentry *dentry, struct page *page,
 401                 unsigned int len, struct iattr *sattr)
 402{
 403        struct nfs_fh *fh;
 404        struct nfs_fattr *fattr;
 405        struct nfs_symlinkargs  arg = {
 406                .fromfh         = NFS_FH(dir),
 407                .fromname       = dentry->d_name.name,
 408                .fromlen        = dentry->d_name.len,
 409                .pages          = &page,
 410                .pathlen        = len,
 411                .sattr          = sattr
 412        };
 413        struct rpc_message msg = {
 414                .rpc_proc       = &nfs_procedures[NFSPROC_SYMLINK],
 415                .rpc_argp       = &arg,
 416        };
 417        int status = -ENAMETOOLONG;
 418
 419        dprintk("NFS call  symlink %pd\n", dentry);
 420
 421        if (len > NFS2_MAXPATHLEN)
 422                goto out;
 423
 424        fh = nfs_alloc_fhandle();
 425        fattr = nfs_alloc_fattr();
 426        status = -ENOMEM;
 427        if (fh == NULL || fattr == NULL)
 428                goto out_free;
 429
 430        status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
 431        nfs_mark_for_revalidate(dir);
 432
 433        /*
 434         * V2 SYMLINK requests don't return any attributes.  Setting the
 435         * filehandle size to zero indicates to nfs_instantiate that it
 436         * should fill in the data with a LOOKUP call on the wire.
 437         */
 438        if (status == 0)
 439                status = nfs_instantiate(dentry, fh, fattr, NULL);
 440
 441out_free:
 442        nfs_free_fattr(fattr);
 443        nfs_free_fhandle(fh);
 444out:
 445        dprintk("NFS reply symlink: %d\n", status);
 446        return status;
 447}
 448
 449static int
 450nfs_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr)
 451{
 452        struct nfs_createdata *data;
 453        struct rpc_message msg = {
 454                .rpc_proc       = &nfs_procedures[NFSPROC_MKDIR],
 455        };
 456        int status = -ENOMEM;
 457
 458        dprintk("NFS call  mkdir %pd\n", dentry);
 459        data = nfs_alloc_createdata(dir, dentry, sattr);
 460        if (data == NULL)
 461                goto out;
 462        msg.rpc_argp = &data->arg;
 463        msg.rpc_resp = &data->res;
 464
 465        status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
 466        nfs_mark_for_revalidate(dir);
 467        if (status == 0)
 468                status = nfs_instantiate(dentry, data->res.fh, data->res.fattr, NULL);
 469        nfs_free_createdata(data);
 470out:
 471        dprintk("NFS reply mkdir: %d\n", status);
 472        return status;
 473}
 474
 475static int
 476nfs_proc_rmdir(struct inode *dir, const struct qstr *name)
 477{
 478        struct nfs_diropargs    arg = {
 479                .fh             = NFS_FH(dir),
 480                .name           = name->name,
 481                .len            = name->len
 482        };
 483        struct rpc_message msg = {
 484                .rpc_proc       = &nfs_procedures[NFSPROC_RMDIR],
 485                .rpc_argp       = &arg,
 486        };
 487        int                     status;
 488
 489        dprintk("NFS call  rmdir %s\n", name->name);
 490        status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
 491        nfs_mark_for_revalidate(dir);
 492        dprintk("NFS reply rmdir: %d\n", status);
 493        return status;
 494}
 495
 496/*
 497 * The READDIR implementation is somewhat hackish - we pass a temporary
 498 * buffer to the encode function, which installs it in the receive
 499 * the receive iovec. The decode function just parses the reply to make
 500 * sure it is syntactically correct; the entries itself are decoded
 501 * from nfs_readdir by calling the decode_entry function directly.
 502 */
 503static int nfs_proc_readdir(struct nfs_readdir_arg *nr_arg,
 504                            struct nfs_readdir_res *nr_res)
 505{
 506        struct inode            *dir = d_inode(nr_arg->dentry);
 507        struct nfs_readdirargs  arg = {
 508                .fh             = NFS_FH(dir),
 509                .cookie         = nr_arg->cookie,
 510                .count          = nr_arg->page_len,
 511                .pages          = nr_arg->pages,
 512        };
 513        struct rpc_message      msg = {
 514                .rpc_proc       = &nfs_procedures[NFSPROC_READDIR],
 515                .rpc_argp       = &arg,
 516                .rpc_cred       = nr_arg->cred,
 517        };
 518        int                     status;
 519
 520        dprintk("NFS call  readdir %llu\n", (unsigned long long)nr_arg->cookie);
 521        status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
 522        nr_res->verf[0] = nr_res->verf[1] = 0;
 523
 524        nfs_invalidate_atime(dir);
 525
 526        dprintk("NFS reply readdir: %d\n", status);
 527        return status;
 528}
 529
 530static int
 531nfs_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
 532                        struct nfs_fsstat *stat)
 533{
 534        struct nfs2_fsstat fsinfo;
 535        struct rpc_message msg = {
 536                .rpc_proc       = &nfs_procedures[NFSPROC_STATFS],
 537                .rpc_argp       = fhandle,
 538                .rpc_resp       = &fsinfo,
 539        };
 540        int     status;
 541
 542        dprintk("NFS call  statfs\n");
 543        nfs_fattr_init(stat->fattr);
 544        status = rpc_call_sync(server->client, &msg, 0);
 545        dprintk("NFS reply statfs: %d\n", status);
 546        if (status)
 547                goto out;
 548        stat->tbytes = (u64)fsinfo.blocks * fsinfo.bsize;
 549        stat->fbytes = (u64)fsinfo.bfree  * fsinfo.bsize;
 550        stat->abytes = (u64)fsinfo.bavail * fsinfo.bsize;
 551        stat->tfiles = 0;
 552        stat->ffiles = 0;
 553        stat->afiles = 0;
 554out:
 555        return status;
 556}
 557
 558static int
 559nfs_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
 560                        struct nfs_fsinfo *info)
 561{
 562        struct nfs2_fsstat fsinfo;
 563        struct rpc_message msg = {
 564                .rpc_proc       = &nfs_procedures[NFSPROC_STATFS],
 565                .rpc_argp       = fhandle,
 566                .rpc_resp       = &fsinfo,
 567        };
 568        int     status;
 569
 570        dprintk("NFS call  fsinfo\n");
 571        nfs_fattr_init(info->fattr);
 572        status = rpc_call_sync(server->client, &msg, 0);
 573        dprintk("NFS reply fsinfo: %d\n", status);
 574        if (status)
 575                goto out;
 576        info->rtmax  = NFS_MAXDATA;
 577        info->rtpref = fsinfo.tsize;
 578        info->rtmult = fsinfo.bsize;
 579        info->wtmax  = NFS_MAXDATA;
 580        info->wtpref = fsinfo.tsize;
 581        info->wtmult = fsinfo.bsize;
 582        info->dtpref = fsinfo.tsize;
 583        info->maxfilesize = 0x7FFFFFFF;
 584        info->lease_time = 0;
 585out:
 586        return status;
 587}
 588
 589static int
 590nfs_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
 591                  struct nfs_pathconf *info)
 592{
 593        info->max_link = 0;
 594        info->max_namelen = NFS2_MAXNAMLEN;
 595        return 0;
 596}
 597
 598static int nfs_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr)
 599{
 600        struct inode *inode = hdr->inode;
 601
 602        nfs_invalidate_atime(inode);
 603        if (task->tk_status >= 0) {
 604                nfs_refresh_inode(inode, hdr->res.fattr);
 605                /* Emulate the eof flag, which isn't normally needed in NFSv2
 606                 * as it is guaranteed to always return the file attributes
 607                 */
 608                if ((hdr->res.count == 0 && hdr->args.count > 0) ||
 609                    hdr->args.offset + hdr->res.count >= hdr->res.fattr->size)
 610                        hdr->res.eof = 1;
 611        }
 612        return 0;
 613}
 614
 615static void nfs_proc_read_setup(struct nfs_pgio_header *hdr,
 616                                struct rpc_message *msg)
 617{
 618        msg->rpc_proc = &nfs_procedures[NFSPROC_READ];
 619}
 620
 621static int nfs_proc_pgio_rpc_prepare(struct rpc_task *task,
 622                                     struct nfs_pgio_header *hdr)
 623{
 624        rpc_call_start(task);
 625        return 0;
 626}
 627
 628static int nfs_write_done(struct rpc_task *task, struct nfs_pgio_header *hdr)
 629{
 630        if (task->tk_status >= 0) {
 631                hdr->res.count = hdr->args.count;
 632                nfs_writeback_update_inode(hdr);
 633        }
 634        return 0;
 635}
 636
 637static void nfs_proc_write_setup(struct nfs_pgio_header *hdr,
 638                                 struct rpc_message *msg,
 639                                 struct rpc_clnt **clnt)
 640{
 641        /* Note: NFSv2 ignores @stable and always uses NFS_FILE_SYNC */
 642        hdr->args.stable = NFS_FILE_SYNC;
 643        msg->rpc_proc = &nfs_procedures[NFSPROC_WRITE];
 644}
 645
 646static void nfs_proc_commit_rpc_prepare(struct rpc_task *task, struct nfs_commit_data *data)
 647{
 648        BUG();
 649}
 650
 651static void
 652nfs_proc_commit_setup(struct nfs_commit_data *data, struct rpc_message *msg,
 653                        struct rpc_clnt **clnt)
 654{
 655        BUG();
 656}
 657
 658static int
 659nfs_proc_lock(struct file *filp, int cmd, struct file_lock *fl)
 660{
 661        struct inode *inode = file_inode(filp);
 662
 663        return nlmclnt_proc(NFS_SERVER(inode)->nlm_host, cmd, fl, NULL);
 664}
 665
 666/* Helper functions for NFS lock bounds checking */
 667#define NFS_LOCK32_OFFSET_MAX ((__s32)0x7fffffffUL)
 668static int nfs_lock_check_bounds(const struct file_lock *fl)
 669{
 670        __s32 start, end;
 671
 672        start = (__s32)fl->fl_start;
 673        if ((loff_t)start != fl->fl_start)
 674                goto out_einval;
 675
 676        if (fl->fl_end != OFFSET_MAX) {
 677                end = (__s32)fl->fl_end;
 678                if ((loff_t)end != fl->fl_end)
 679                        goto out_einval;
 680        } else
 681                end = NFS_LOCK32_OFFSET_MAX;
 682
 683        if (start < 0 || start > end)
 684                goto out_einval;
 685        return 0;
 686out_einval:
 687        return -EINVAL;
 688}
 689
 690static int nfs_have_delegation(struct inode *inode, fmode_t flags)
 691{
 692        return 0;
 693}
 694
 695static const struct inode_operations nfs_dir_inode_operations = {
 696        .create         = nfs_create,
 697        .lookup         = nfs_lookup,
 698        .link           = nfs_link,
 699        .unlink         = nfs_unlink,
 700        .symlink        = nfs_symlink,
 701        .mkdir          = nfs_mkdir,
 702        .rmdir          = nfs_rmdir,
 703        .mknod          = nfs_mknod,
 704        .rename         = nfs_rename,
 705        .permission     = nfs_permission,
 706        .getattr        = nfs_getattr,
 707        .setattr        = nfs_setattr,
 708};
 709
 710static const struct inode_operations nfs_file_inode_operations = {
 711        .permission     = nfs_permission,
 712        .getattr        = nfs_getattr,
 713        .setattr        = nfs_setattr,
 714};
 715
 716const struct nfs_rpc_ops nfs_v2_clientops = {
 717        .version        = 2,                   /* protocol version */
 718        .dentry_ops     = &nfs_dentry_operations,
 719        .dir_inode_ops  = &nfs_dir_inode_operations,
 720        .file_inode_ops = &nfs_file_inode_operations,
 721        .file_ops       = &nfs_file_operations,
 722        .getroot        = nfs_proc_get_root,
 723        .submount       = nfs_submount,
 724        .try_get_tree   = nfs_try_get_tree,
 725        .getattr        = nfs_proc_getattr,
 726        .setattr        = nfs_proc_setattr,
 727        .lookup         = nfs_proc_lookup,
 728        .access         = NULL,                /* access */
 729        .readlink       = nfs_proc_readlink,
 730        .create         = nfs_proc_create,
 731        .remove         = nfs_proc_remove,
 732        .unlink_setup   = nfs_proc_unlink_setup,
 733        .unlink_rpc_prepare = nfs_proc_unlink_rpc_prepare,
 734        .unlink_done    = nfs_proc_unlink_done,
 735        .rename_setup   = nfs_proc_rename_setup,
 736        .rename_rpc_prepare = nfs_proc_rename_rpc_prepare,
 737        .rename_done    = nfs_proc_rename_done,
 738        .link           = nfs_proc_link,
 739        .symlink        = nfs_proc_symlink,
 740        .mkdir          = nfs_proc_mkdir,
 741        .rmdir          = nfs_proc_rmdir,
 742        .readdir        = nfs_proc_readdir,
 743        .mknod          = nfs_proc_mknod,
 744        .statfs         = nfs_proc_statfs,
 745        .fsinfo         = nfs_proc_fsinfo,
 746        .pathconf       = nfs_proc_pathconf,
 747        .decode_dirent  = nfs2_decode_dirent,
 748        .pgio_rpc_prepare = nfs_proc_pgio_rpc_prepare,
 749        .read_setup     = nfs_proc_read_setup,
 750        .read_done      = nfs_read_done,
 751        .write_setup    = nfs_proc_write_setup,
 752        .write_done     = nfs_write_done,
 753        .commit_setup   = nfs_proc_commit_setup,
 754        .commit_rpc_prepare = nfs_proc_commit_rpc_prepare,
 755        .lock           = nfs_proc_lock,
 756        .lock_check_bounds = nfs_lock_check_bounds,
 757        .close_context  = nfs_close_context,
 758        .have_delegation = nfs_have_delegation,
 759        .alloc_client   = nfs_alloc_client,
 760        .init_client    = nfs_init_client,
 761        .free_client    = nfs_free_client,
 762        .create_server  = nfs_create_server,
 763        .clone_server   = nfs_clone_server,
 764};
 765