cregit-Linux how code gets into the kernel

Release 4.11 fs/nfs/proc.c

Directory: fs/nfs
/*
 *  linux/fs/nfs/proc.c
 *
 *  Copyright (C) 1992, 1993, 1994  Rick Sladkey
 *
 *  OS-independent nfs remote procedure call functions
 *
 *  Tuned by Alan Cox <A.Cox@swansea.ac.uk> for >3K buffers
 *  so at last we can have decent(ish) throughput off a 
 *  Sun server.
 *
 *  Coding optimized and cleaned up by Florian La Roche.
 *  Note: Error returns are optimized for NFS_OK, which isn't translated via
 *  nfs_stat_to_errno(), but happens to be already the right return code.
 *
 *  Also, the code currently doesn't check the size of the packet, when
 *  it decodes the packet.
 *
 *  Feel free to fix it and mail me the diffs if it worries you.
 *
 *  Completely rewritten to support the new RPC call interface;
 *  rewrote and moved the entire XDR stuff to xdr.c
 *  --Olaf Kirch June 1996
 *
 *  The code below initializes all auto variables explicitly, otherwise
 *  it will fail to work as a module (gcc generates a memset call for an
 *  incomplete struct).
 */

#include <linux/types.h>
#include <linux/param.h>
#include <linux/time.h>
#include <linux/mm.h>
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/in.h>
#include <linux/pagemap.h>
#include <linux/sunrpc/clnt.h>
#include <linux/nfs.h>
#include <linux/nfs2.h>
#include <linux/nfs_fs.h>
#include <linux/nfs_page.h>
#include <linux/lockd/bind.h>
#include <linux/freezer.h>
#include "internal.h"


#define NFSDBG_FACILITY		NFSDBG_PROC

/*
 * Bare-bones access to getattr: this is for nfs_read_super.
 */

static int nfs_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *info) { struct nfs_fattr *fattr = info->fattr; struct nfs2_fsstat fsinfo; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_GETATTR], .rpc_argp = fhandle, .rpc_resp = fattr, }; int status; dprintk("%s: call getattr\n", __func__); nfs_fattr_init(fattr); status = rpc_call_sync(server->client, &msg, 0); /* Retry with default authentication if different */ if (status && server->nfs_client->cl_rpcclient != server->client) status = rpc_call_sync(server->nfs_client->cl_rpcclient, &msg, 0); dprintk("%s: reply getattr: %d\n", __func__, status); if (status) return status; dprintk("%s: call statfs\n", __func__); msg.rpc_proc = &nfs_procedures[NFSPROC_STATFS]; msg.rpc_resp = &fsinfo; status = rpc_call_sync(server->client, &msg, 0); /* Retry with default authentication if different */ if (status && server->nfs_client->cl_rpcclient != server->client) status = rpc_call_sync(server->nfs_client->cl_rpcclient, &msg, 0); dprintk("%s: reply statfs: %d\n", __func__, status); if (status) return status; info->rtmax = NFS_MAXDATA; info->rtpref = fsinfo.tsize; info->rtmult = fsinfo.bsize; info->wtmax = NFS_MAXDATA; info->wtpref = fsinfo.tsize; info->wtmult = fsinfo.bsize; info->dtpref = fsinfo.tsize; info->maxfilesize = 0x7FFFFFFF; info->lease_time = 0; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust12744.25%320.00%
EG Keizer5820.21%16.67%
Chuck Lever4716.38%16.67%
Linus Torvalds (pre-git)4515.68%853.33%
David Howells62.09%16.67%
Harvey Harrison41.39%16.67%
Total287100.00%15100.00%

/* * One function for each procedure in the NFS protocol. */
static int nfs_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr, struct nfs4_label *label) { struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_GETATTR], .rpc_argp = fhandle, .rpc_resp = fattr, }; int status; dprintk("NFS call getattr\n"); nfs_fattr_init(fattr); status = rpc_call_sync(server->client, &msg, 0); dprintk("NFS reply getattr: %d\n", status); return status; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)3944.32%337.50%
Chuck Lever2831.82%112.50%
Trond Myklebust1618.18%337.50%
David Quigley55.68%112.50%
Total88100.00%8100.00%


static int nfs_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr, struct iattr *sattr) { struct inode *inode = d_inode(dentry); struct nfs_sattrargs arg = { .fh = NFS_FH(inode), .sattr = sattr }; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_SETATTR], .rpc_argp = &arg, .rpc_resp = fattr, }; int status; /* Mask out the non-modebit related stuff from attr->ia_mode */ sattr->ia_mode &= S_IALLUGO; dprintk("NFS call setattr\n"); if (sattr->ia_valid & ATTR_FILE) msg.rpc_cred = nfs_file_cred(sattr->ia_file); nfs_fattr_init(fattr); status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0); if (status == 0) nfs_setattr_update_inode(inode, sattr, fattr); dprintk("NFS reply setattr: %d\n", status); return status; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)6240.00%738.89%
Trond Myklebust5636.13%738.89%
Chuck Lever2818.06%15.56%
Art Haas42.58%15.56%
David Howells31.94%15.56%
Dave Jones21.29%15.56%
Total155100.00%18100.00%


static int nfs_proc_lookup(struct inode *dir, const struct qstr *name, struct nfs_fh *fhandle, struct nfs_fattr *fattr, struct nfs4_label *label) { struct nfs_diropargs arg = { .fh = NFS_FH(dir), .name = name->name, .len = name->len }; struct nfs_diropok res = { .fh = fhandle, .fattr = fattr }; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_LOOKUP], .rpc_argp = &arg, .rpc_resp = &res, }; int status; dprintk("NFS call lookup %s\n", name->name); nfs_fattr_init(fattr); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); dprintk("NFS reply lookup: %d\n", status); return status; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)9263.45%650.00%
Chuck Lever2920.00%18.33%
Art Haas106.90%18.33%
Dave Jones53.45%18.33%
David Quigley53.45%18.33%
Trond Myklebust32.07%18.33%
Al Viro10.69%18.33%
Total145100.00%12100.00%


static int nfs_proc_readlink(struct inode *inode, struct page *page, unsigned int pgbase, unsigned int pglen) { struct nfs_readlinkargs args = { .fh = NFS_FH(inode), .pgbase = pgbase, .pglen = pglen, .pages = &page }; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_READLINK], .rpc_argp = &args, }; int status; dprintk("NFS call readlink\n"); status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0); dprintk("NFS reply readlink: %d\n", status); return status; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)5752.78%550.00%
Chuck Lever2321.30%110.00%
Trond Myklebust2119.44%220.00%
Art Haas65.56%110.00%
Dave Jones10.93%110.00%
Total108100.00%10100.00%

struct nfs_createdata { struct nfs_createargs arg; struct nfs_diropok res; struct nfs_fh fhandle; struct nfs_fattr fattr; };
static struct nfs_createdata *nfs_alloc_createdata(struct inode *dir, struct dentry *dentry, struct iattr *sattr) { struct nfs_createdata *data; data = kmalloc(sizeof(*data), GFP_KERNEL); if (data != NULL) { data->arg.fh = NFS_FH(dir); data->arg.name = dentry->d_name.name; data->arg.len = dentry->d_name.len; data->arg.sattr = sattr; nfs_fattr_init(&data->fattr); data->fhandle.size = 0; data->res.fh = &data->fhandle; data->res.fattr = &data->fattr; } return data; }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust8664.66%337.50%
Linus Torvalds (pre-git)3022.56%337.50%
Art Haas129.02%112.50%
Dave Jones53.76%112.50%
Total133100.00%8100.00%

;
static void nfs_free_createdata(const struct nfs_createdata *data) { kfree(data); }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust17100.00%1100.00%
Total17100.00%1100.00%


static int nfs_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, int flags) { struct nfs_createdata *data; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_CREATE], }; int status = -ENOMEM; dprintk("NFS call create %pd\n", dentry); data = nfs_alloc_createdata(dir, dentry, sattr); if (data == NULL) goto out; msg.rpc_argp = &data->arg; msg.rpc_resp = &data->res; status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); nfs_mark_for_revalidate(dir); if (status == 0) status = nfs_instantiate(dentry, data->res.fh, data->res.fattr, NULL); nfs_free_createdata(data); out: dprintk("NFS reply create: %d\n", status); return status; }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust11471.70%555.56%
Linus Torvalds (pre-git)2515.72%111.11%
Chuck Lever1710.69%111.11%
David Quigley21.26%111.11%
Al Viro10.63%111.11%
Total159100.00%9100.00%

/* * In NFSv2, mknod is grafted onto the create call. */
static int nfs_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr, dev_t rdev) { struct nfs_createdata *data; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_CREATE], }; umode_t mode; int status = -ENOMEM; dprintk("NFS call mknod %pd\n", dentry); mode = sattr->ia_mode; if (S_ISFIFO(mode)) { sattr->ia_mode = (mode & ~S_IFMT) | S_IFCHR; sattr->ia_valid &= ~ATTR_SIZE; } else if (S_ISCHR(mode) || S_ISBLK(mode)) { sattr->ia_valid |= ATTR_SIZE; sattr->ia_size = new_encode_dev(rdev);/* get out your barf bag */ } data = nfs_alloc_createdata(dir, dentry, sattr); if (data == NULL) goto out; msg.rpc_argp = &data->arg; msg.rpc_resp = &data->res; status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); nfs_mark_for_revalidate(dir); if (status == -EINVAL && S_ISFIFO(mode)) { sattr->ia_mode = mode; nfs_fattr_init(data->res.fattr); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); } if (status == 0) status = nfs_instantiate(dentry, data->res.fh, data->res.fattr, NULL); nfs_free_createdata(data); out: dprintk("NFS reply mknod: %d\n", status); return status; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)15255.88%743.75%
Trond Myklebust9534.93%425.00%
Chuck Lever196.99%16.25%
Al Viro41.47%318.75%
David Quigley20.74%16.25%
Total272100.00%16100.00%


static int nfs_proc_remove(struct inode *dir, const struct qstr *name) { struct nfs_removeargs arg = { .fh = NFS_FH(dir), .name = *name, }; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_REMOVE], .rpc_argp = &arg, }; int status; dprintk("NFS call remove %s\n", name->name); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); nfs_mark_for_revalidate(dir); dprintk("NFS reply remove: %d\n", status); return status; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)7474.00%433.33%
Trond Myklebust1212.00%325.00%
Art Haas88.00%18.33%
Dave Jones33.00%18.33%
Al Viro11.00%18.33%
Linus Torvalds11.00%18.33%
Chuck Lever11.00%18.33%
Total100100.00%12100.00%


static void nfs_proc_unlink_setup(struct rpc_message *msg, struct inode *dir) { msg->rpc_proc = &nfs_procedures[NFSPROC_REMOVE]; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)2076.92%250.00%
Trond Myklebust623.08%250.00%
Total26100.00%4100.00%


static void nfs_proc_unlink_rpc_prepare(struct rpc_task *task, struct nfs_unlinkdata *data) { rpc_call_start(task); }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Schumaker21100.00%1100.00%
Total21100.00%1100.00%


static int nfs_proc_unlink_done(struct rpc_task *task, struct inode *dir) { nfs_mark_for_revalidate(dir); return 1; }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust1875.00%360.00%
Linus Torvalds (pre-git)625.00%240.00%
Total24100.00%5100.00%


static void nfs_proc_rename_setup(struct rpc_message *msg, struct inode *dir) { msg->rpc_proc = &nfs_procedures[NFSPROC_RENAME]; }

Contributors

PersonTokensPropCommitsCommitProp
Jeff Layton2596.15%150.00%
Linus Torvalds (pre-git)13.85%150.00%
Total26100.00%2100.00%


static void nfs_proc_rename_rpc_prepare(struct rpc_task *task, struct nfs_renamedata *data) { rpc_call_start(task); }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Schumaker21100.00%1100.00%
Total21100.00%1100.00%


static int nfs_proc_rename_done(struct rpc_task *task, struct inode *old_dir, struct inode *new_dir) { nfs_mark_for_revalidate(old_dir); nfs_mark_for_revalidate(new_dir); return 1; }

Contributors

PersonTokensPropCommitsCommitProp
Jeff Layton34100.00%1100.00%
Total34100.00%1100.00%


static int nfs_proc_link(struct inode *inode, struct inode *dir, const struct qstr *name) { struct nfs_linkargs arg = { .fromfh = NFS_FH(inode), .tofh = NFS_FH(dir), .toname = name->name, .tolen = name->len }; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_LINK], .rpc_argp = &arg, }; int status; dprintk("NFS call link %s\n", name->name); status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0); nfs_mark_for_revalidate(inode); nfs_mark_for_revalidate(dir); dprintk("NFS reply link: %d\n", status); return status; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)7962.70%541.67%
Chuck Lever2318.25%18.33%
Trond Myklebust107.94%216.67%
Art Haas86.35%18.33%
Dave Jones43.17%18.33%
Jeff Layton10.79%18.33%
Al Viro10.79%18.33%
Total126100.00%12100.00%


static int nfs_proc_symlink(struct inode *dir, struct dentry *dentry, struct page *page, unsigned int len, struct iattr *sattr) { struct nfs_fh *fh; struct nfs_fattr *fattr; struct nfs_symlinkargs arg = { .fromfh = NFS_FH(dir), .fromname = dentry->d_name.name, .fromlen = dentry->d_name.len, .pages = &page, .pathlen = len, .sattr = sattr }; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_SYMLINK], .rpc_argp = &arg, }; int status = -ENAMETOOLONG; dprintk("NFS call symlink %pd\n", dentry); if (len > NFS2_MAXPATHLEN) goto out; fh = nfs_alloc_fhandle(); fattr = nfs_alloc_fattr(); status = -ENOMEM; if (fh == NULL || fattr == NULL) goto out_free; status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); nfs_mark_for_revalidate(dir); /* * V2 SYMLINK requests don't return any attributes. Setting the * filehandle size to zero indicates to nfs_instantiate that it * should fill in the data with a LOOKUP call on the wire. */ if (status == 0) status = nfs_instantiate(dentry, fh, fattr, NULL); out_free: nfs_free_fattr(fattr); nfs_free_fhandle(fh); out: dprintk("NFS reply symlink: %d\n", status); return status; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)7734.53%842.11%
Chuck Lever6328.25%315.79%
Trond Myklebust6127.35%315.79%
Art Haas125.38%15.26%
Dave Jones41.79%15.26%
Jesper Juhl31.35%15.26%
David Quigley20.90%15.26%
Al Viro10.45%15.26%
Total223100.00%19100.00%


static int nfs_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr) { struct nfs_createdata *data; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_MKDIR], }; int status = -ENOMEM; dprintk("NFS call mkdir %pd\n", dentry); data = nfs_alloc_createdata(dir, dentry, sattr); if (data == NULL) goto out; msg.rpc_argp = &data->arg; msg.rpc_resp = &data->res; status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); nfs_mark_for_revalidate(dir); if (status == 0) status = nfs_instantiate(dentry, data->res.fh, data->res.fattr, NULL); nfs_free_createdata(data); out: dprintk("NFS reply mkdir: %d\n", status); return status; }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust8554.49%426.67%
Linus Torvalds (pre-git)5132.69%853.33%
Chuck Lever1710.90%16.67%
David Quigley21.28%16.67%
Al Viro10.64%16.67%
Total156100.00%15100.00%


static int nfs_proc_rmdir(struct inode *dir, const struct qstr *name) { struct nfs_diropargs arg = { .fh = NFS_FH(dir), .name = name->name, .len = name->len }; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_RMDIR], .rpc_argp = &arg, }; int status; dprintk("NFS call rmdir %s\n", name->name); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); nfs_mark_for_revalidate(dir); dprintk("NFS reply rmdir: %d\n", status); return status; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)7064.81%550.00%
Chuck Lever2321.30%110.00%
Art Haas65.56%110.00%
Trond Myklebust54.63%110.00%
Dave Jones32.78%110.00%
Al Viro10.93%110.00%
Total108100.00%10100.00%

/* * The READDIR implementation is somewhat hackish - we pass a temporary * buffer to the encode function, which installs it in the receive * the receive iovec. The decode function just parses the reply to make * sure it is syntactically correct; the entries itself are decoded * from nfs_readdir by calling the decode_entry function directly. */
static int nfs_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, u64 cookie, struct page **pages, unsigned int count, int plus) { struct inode *dir = d_inode(dentry); struct nfs_readdirargs arg = { .fh = NFS_FH(dir), .cookie = cookie, .count = count, .pages = pages, }; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_READDIR], .rpc_argp = &arg, .rpc_cred = cred, }; int status; dprintk("NFS call readdir %d\n", (unsigned int)cookie); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); nfs_invalidate_atime(dir); dprintk("NFS reply readdir: %d\n", status); return status; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)7956.03%430.77%
Trond Myklebust3726.24%430.77%
Art Haas149.93%17.69%
Dave Jones32.13%17.69%
David Howells32.13%17.69%
Bryan Schumaker32.13%17.69%
Chuck Lever21.42%17.69%
Total141100.00%13100.00%


static int nfs_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *stat) { struct nfs2_fsstat fsinfo; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_STATFS], .rpc_argp = fhandle, .rpc_resp = &fsinfo, }; int status; dprintk("NFS call statfs\n"); nfs_fattr_init(stat->fattr); status = rpc_call_sync(server->client, &msg, 0); dprintk("NFS reply statfs: %d\n", status); if (status) goto out; stat->tbytes = (u64)fsinfo.blocks * fsinfo.bsize; stat->fbytes = (u64)fsinfo.bfree * fsinfo.bsize; stat->abytes = (u64)fsinfo.bavail * fsinfo.bsize; stat->tfiles = 0; stat->ffiles = 0; stat->afiles = 0; out: return status; }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust10464.20%233.33%
Linus Torvalds (pre-git)3018.52%350.00%
Chuck Lever2817.28%116.67%
Total162100.00%6100.00%


static int nfs_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *info) { struct nfs2_fsstat fsinfo; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_STATFS], .rpc_argp = fhandle, .rpc_resp = &fsinfo, }; int status; dprintk("NFS call fsinfo\n"); nfs_fattr_init(info->fattr); status = rpc_call_sync(server->client, &msg, 0); dprintk("NFS reply fsinfo: %d\n", status); if (status) goto out; info->rtmax = NFS_MAXDATA; info->rtpref = fsinfo.tsize; info->rtmult = fsinfo.bsize; info->wtmax = NFS_MAXDATA; info->wtpref = fsinfo.tsize; info->wtmult = fsinfo.bsize; info->dtpref = fsinfo.tsize; info->maxfilesize = 0x7FFFFFFF; info->lease_time = 0; out: return status; }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust11168.10%220.00%
Chuck Lever2817.18%110.00%
Linus Torvalds (pre-git)2414.72%770.00%
Total163100.00%10100.00%


static int nfs_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_pathconf *info) { info->max_link = 0; info->max_namelen = NFS2_MAXNAMLEN; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust36100.00%1100.00%
Total36100.00%1100.00%


static int nfs_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr) { struct inode *inode = hdr->inode; nfs_invalidate_atime(inode); if (task->tk_status >= 0) { nfs_refresh_inode(inode, hdr->res.fattr); /* Emulate the eof flag, which isn't normally needed in NFSv2 * as it is guaranteed to always return the file attributes */ if (hdr->args.offset + hdr->res.count >= hdr->res.fattr->size) hdr->res.eof = 1; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust6880.00%666.67%
Fred Isaman89.41%111.11%
Weston Andros Adamson89.41%111.11%
Sachin S. Prabhu11.18%111.11%
Total85100.00%9100.00%


static void nfs_proc_read_setup(struct nfs_pgio_header *hdr, struct rpc_message *msg) { msg->rpc_proc = &nfs_procedures[NFSPROC_READ]; }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust2492.31%480.00%
Weston Andros Adamson27.69%120.00%
Total26100.00%5100.00%


static int nfs_proc_pgio_rpc_prepare(struct rpc_task *task, struct nfs_pgio_header *hdr) { rpc_call_start(task); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Schumaker1770.83%125.00%
Neil Brown416.67%125.00%
Weston Andros Adamson28.33%125.00%
Anna Schumaker14.17%125.00%
Total24100.00%4100.00%


static int nfs_write_done(struct rpc_task *task, struct nfs_pgio_header *hdr) { if (task->tk_status >= 0) nfs_writeback_update_inode(hdr); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust2990.62%583.33%
Weston Andros Adamson39.38%116.67%
Total32100.00%6100.00%


static void nfs_proc_write_setup(struct nfs_pgio_header *hdr, struct rpc_message *msg) { /* Note: NFSv2 ignores @stable and always uses NFS_FILE_SYNC */ hdr->args.stable = NFS_FILE_SYNC; msg->rpc_proc = &nfs_procedures[NFSPROC_WRITE]; }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust3291.43%583.33%
Weston Andros Adamson38.57%116.67%
Total35100.00%6100.00%


static void nfs_proc_commit_rpc_prepare(struct rpc_task *task, struct nfs_commit_data *data) { BUG(); }

Contributors

PersonTokensPropCommitsCommitProp
Fred Isaman19100.00%1100.00%
Total19100.00%1100.00%


static void nfs_proc_commit_setup(struct nfs_commit_data *data, struct rpc_message *msg) { BUG(); }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust1894.74%266.67%
Fred Isaman15.26%133.33%
Total19100.00%3100.00%


static int nfs_proc_lock(struct file *filp, int cmd, struct file_lock *fl) { struct inode *inode = file_inode(filp); return nlmclnt_proc(NFS_SERVER(inode)->nlm_host, cmd, fl); }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust2659.09%133.33%
Chuck Lever1534.09%133.33%
Al Viro36.82%133.33%
Total44100.00%3100.00%

/* Helper functions for NFS lock bounds checking */ #define NFS_LOCK32_OFFSET_MAX ((__s32)0x7fffffffUL)
static int nfs_lock_check_bounds(const struct file_lock *fl) { __s32 start, end; start = (__s32)fl->fl_start; if ((loff_t)start != fl->fl_start) goto out_einval; if (fl->fl_end != OFFSET_MAX) { end = (__s32)fl->fl_end; if ((loff_t)end != fl->fl_end) goto out_einval; } else end = NFS_LOCK32_OFFSET_MAX; if (start < 0 || start > end) goto out_einval; return 0; out_einval: return -EINVAL; }

Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust100100.00%1100.00%
Total100100.00%1100.00%


static int nfs_have_delegation(struct inode *inode, fmode_t flags) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Schumaker17100.00%1100.00%
Total17100.00%1100.00%


static int nfs_return_delegation(struct inode *inode) { nfs_wb_all(inode); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Schumaker19100.00%1100.00%
Total19100.00%1100.00%

static const struct inode_operations nfs_dir_inode_operations = { .create = nfs_create, .lookup = nfs_lookup, .link = nfs_link, .unlink = nfs_unlink, .symlink = nfs_symlink, .mkdir = nfs_mkdir, .rmdir = nfs_rmdir, .mknod = nfs_mknod, .rename = nfs_rename, .permission = nfs_permission, .getattr = nfs_getattr, .setattr = nfs_setattr, }; static const struct inode_operations nfs_file_inode_operations = { .permission = nfs_permission, .getattr = nfs_getattr, .setattr = nfs_setattr, }; const struct nfs_rpc_ops nfs_v2_clientops = { .version = 2, /* protocol version */ .dentry_ops = &nfs_dentry_operations, .dir_inode_ops = &nfs_dir_inode_operations, .file_inode_ops = &nfs_file_inode_operations, .file_ops = &nfs_file_operations, .getroot = nfs_proc_get_root, .submount = nfs_submount, .try_mount = nfs_try_mount, .getattr = nfs_proc_getattr, .setattr = nfs_proc_setattr, .lookup = nfs_proc_lookup, .access = NULL, /* access */ .readlink = nfs_proc_readlink, .create = nfs_proc_create, .remove = nfs_proc_remove, .unlink_setup = nfs_proc_unlink_setup, .unlink_rpc_prepare = nfs_proc_unlink_rpc_prepare, .unlink_done = nfs_proc_unlink_done, .rename_setup = nfs_proc_rename_setup, .rename_rpc_prepare = nfs_proc_rename_rpc_prepare, .rename_done = nfs_proc_rename_done, .link = nfs_proc_link, .symlink = nfs_proc_symlink, .mkdir = nfs_proc_mkdir, .rmdir = nfs_proc_rmdir, .readdir = nfs_proc_readdir, .mknod = nfs_proc_mknod, .statfs = nfs_proc_statfs, .fsinfo = nfs_proc_fsinfo, .pathconf = nfs_proc_pathconf, .decode_dirent = nfs2_decode_dirent, .pgio_rpc_prepare = nfs_proc_pgio_rpc_prepare, .read_setup = nfs_proc_read_setup, .read_done = nfs_read_done, .write_setup = nfs_proc_write_setup, .write_done = nfs_write_done, .commit_setup = nfs_proc_commit_setup, .commit_rpc_prepare = nfs_proc_commit_rpc_prepare, .lock = nfs_proc_lock, .lock_check_bounds = nfs_lock_check_bounds, .close_context = nfs_close_context, .have_delegation = nfs_have_delegation, .return_delegation = nfs_return_delegation, .alloc_client = nfs_alloc_client, .init_client = nfs_init_client, .free_client = nfs_free_client, .create_server = nfs_create_server, .clone_server = nfs_clone_server, };

Overall Contributors

PersonTokensPropCommitsCommitProp
Trond Myklebust141039.40%4340.57%
Linus Torvalds (pre-git)110230.79%1716.04%
Chuck Lever39210.95%54.72%
Bryan Schumaker2426.76%1211.32%
Art Haas1183.30%10.94%
Jeff Layton792.21%32.83%
EG Keizer581.62%10.94%
Dave Jones501.40%21.89%
Fred Isaman330.92%21.89%
Weston Andros Adamson180.50%10.94%
David Quigley180.50%10.94%
Al Viro140.39%54.72%
David Howells140.39%43.77%
J. Bruce Fields60.17%10.94%
Anna Schumaker50.14%10.94%
Andy Adamson50.14%10.94%
Neil Brown40.11%10.94%
Harvey Harrison40.11%10.94%
Jesper Juhl30.08%10.94%
Dave Hansen20.06%10.94%
Linus Torvalds10.03%10.94%
Sachin S. Prabhu10.03%10.94%
Total3579100.00%106100.00%
Directory: fs/nfs
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.