Release 4.11 fs/nfs/proc.c
/*
* 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
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 127 | 44.25% | 3 | 20.00% |
EG Keizer | 58 | 20.21% | 1 | 6.67% |
Chuck Lever | 47 | 16.38% | 1 | 6.67% |
Linus Torvalds (pre-git) | 45 | 15.68% | 8 | 53.33% |
David Howells | 6 | 2.09% | 1 | 6.67% |
Harvey Harrison | 4 | 1.39% | 1 | 6.67% |
Total | 287 | 100.00% | 15 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 39 | 44.32% | 3 | 37.50% |
Chuck Lever | 28 | 31.82% | 1 | 12.50% |
Trond Myklebust | 16 | 18.18% | 3 | 37.50% |
David Quigley | 5 | 5.68% | 1 | 12.50% |
Total | 88 | 100.00% | 8 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 62 | 40.00% | 7 | 38.89% |
Trond Myklebust | 56 | 36.13% | 7 | 38.89% |
Chuck Lever | 28 | 18.06% | 1 | 5.56% |
Art Haas | 4 | 2.58% | 1 | 5.56% |
David Howells | 3 | 1.94% | 1 | 5.56% |
Dave Jones | 2 | 1.29% | 1 | 5.56% |
Total | 155 | 100.00% | 18 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 92 | 63.45% | 6 | 50.00% |
Chuck Lever | 29 | 20.00% | 1 | 8.33% |
Art Haas | 10 | 6.90% | 1 | 8.33% |
Dave Jones | 5 | 3.45% | 1 | 8.33% |
David Quigley | 5 | 3.45% | 1 | 8.33% |
Trond Myklebust | 3 | 2.07% | 1 | 8.33% |
Al Viro | 1 | 0.69% | 1 | 8.33% |
Total | 145 | 100.00% | 12 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 57 | 52.78% | 5 | 50.00% |
Chuck Lever | 23 | 21.30% | 1 | 10.00% |
Trond Myklebust | 21 | 19.44% | 2 | 20.00% |
Art Haas | 6 | 5.56% | 1 | 10.00% |
Dave Jones | 1 | 0.93% | 1 | 10.00% |
Total | 108 | 100.00% | 10 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 86 | 64.66% | 3 | 37.50% |
Linus Torvalds (pre-git) | 30 | 22.56% | 3 | 37.50% |
Art Haas | 12 | 9.02% | 1 | 12.50% |
Dave Jones | 5 | 3.76% | 1 | 12.50% |
Total | 133 | 100.00% | 8 | 100.00% |
;
static void nfs_free_createdata(const struct nfs_createdata *data)
{
kfree(data);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 17 | 100.00% | 1 | 100.00% |
Total | 17 | 100.00% | 1 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 114 | 71.70% | 5 | 55.56% |
Linus Torvalds (pre-git) | 25 | 15.72% | 1 | 11.11% |
Chuck Lever | 17 | 10.69% | 1 | 11.11% |
David Quigley | 2 | 1.26% | 1 | 11.11% |
Al Viro | 1 | 0.63% | 1 | 11.11% |
Total | 159 | 100.00% | 9 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 152 | 55.88% | 7 | 43.75% |
Trond Myklebust | 95 | 34.93% | 4 | 25.00% |
Chuck Lever | 19 | 6.99% | 1 | 6.25% |
Al Viro | 4 | 1.47% | 3 | 18.75% |
David Quigley | 2 | 0.74% | 1 | 6.25% |
Total | 272 | 100.00% | 16 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 74 | 74.00% | 4 | 33.33% |
Trond Myklebust | 12 | 12.00% | 3 | 25.00% |
Art Haas | 8 | 8.00% | 1 | 8.33% |
Dave Jones | 3 | 3.00% | 1 | 8.33% |
Al Viro | 1 | 1.00% | 1 | 8.33% |
Linus Torvalds | 1 | 1.00% | 1 | 8.33% |
Chuck Lever | 1 | 1.00% | 1 | 8.33% |
Total | 100 | 100.00% | 12 | 100.00% |
static void
nfs_proc_unlink_setup(struct rpc_message *msg, struct inode *dir)
{
msg->rpc_proc = &nfs_procedures[NFSPROC_REMOVE];
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 20 | 76.92% | 2 | 50.00% |
Trond Myklebust | 6 | 23.08% | 2 | 50.00% |
Total | 26 | 100.00% | 4 | 100.00% |
static void nfs_proc_unlink_rpc_prepare(struct rpc_task *task, struct nfs_unlinkdata *data)
{
rpc_call_start(task);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Bryan Schumaker | 21 | 100.00% | 1 | 100.00% |
Total | 21 | 100.00% | 1 | 100.00% |
static int nfs_proc_unlink_done(struct rpc_task *task, struct inode *dir)
{
nfs_mark_for_revalidate(dir);
return 1;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 18 | 75.00% | 3 | 60.00% |
Linus Torvalds (pre-git) | 6 | 25.00% | 2 | 40.00% |
Total | 24 | 100.00% | 5 | 100.00% |
static void
nfs_proc_rename_setup(struct rpc_message *msg, struct inode *dir)
{
msg->rpc_proc = &nfs_procedures[NFSPROC_RENAME];
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Jeff Layton | 25 | 96.15% | 1 | 50.00% |
Linus Torvalds (pre-git) | 1 | 3.85% | 1 | 50.00% |
Total | 26 | 100.00% | 2 | 100.00% |
static void nfs_proc_rename_rpc_prepare(struct rpc_task *task, struct nfs_renamedata *data)
{
rpc_call_start(task);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Bryan Schumaker | 21 | 100.00% | 1 | 100.00% |
Total | 21 | 100.00% | 1 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Jeff Layton | 34 | 100.00% | 1 | 100.00% |
Total | 34 | 100.00% | 1 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 79 | 62.70% | 5 | 41.67% |
Chuck Lever | 23 | 18.25% | 1 | 8.33% |
Trond Myklebust | 10 | 7.94% | 2 | 16.67% |
Art Haas | 8 | 6.35% | 1 | 8.33% |
Dave Jones | 4 | 3.17% | 1 | 8.33% |
Jeff Layton | 1 | 0.79% | 1 | 8.33% |
Al Viro | 1 | 0.79% | 1 | 8.33% |
Total | 126 | 100.00% | 12 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 77 | 34.53% | 8 | 42.11% |
Chuck Lever | 63 | 28.25% | 3 | 15.79% |
Trond Myklebust | 61 | 27.35% | 3 | 15.79% |
Art Haas | 12 | 5.38% | 1 | 5.26% |
Dave Jones | 4 | 1.79% | 1 | 5.26% |
Jesper Juhl | 3 | 1.35% | 1 | 5.26% |
David Quigley | 2 | 0.90% | 1 | 5.26% |
Al Viro | 1 | 0.45% | 1 | 5.26% |
Total | 223 | 100.00% | 19 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 85 | 54.49% | 4 | 26.67% |
Linus Torvalds (pre-git) | 51 | 32.69% | 8 | 53.33% |
Chuck Lever | 17 | 10.90% | 1 | 6.67% |
David Quigley | 2 | 1.28% | 1 | 6.67% |
Al Viro | 1 | 0.64% | 1 | 6.67% |
Total | 156 | 100.00% | 15 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 70 | 64.81% | 5 | 50.00% |
Chuck Lever | 23 | 21.30% | 1 | 10.00% |
Art Haas | 6 | 5.56% | 1 | 10.00% |
Trond Myklebust | 5 | 4.63% | 1 | 10.00% |
Dave Jones | 3 | 2.78% | 1 | 10.00% |
Al Viro | 1 | 0.93% | 1 | 10.00% |
Total | 108 | 100.00% | 10 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 79 | 56.03% | 4 | 30.77% |
Trond Myklebust | 37 | 26.24% | 4 | 30.77% |
Art Haas | 14 | 9.93% | 1 | 7.69% |
Dave Jones | 3 | 2.13% | 1 | 7.69% |
David Howells | 3 | 2.13% | 1 | 7.69% |
Bryan Schumaker | 3 | 2.13% | 1 | 7.69% |
Chuck Lever | 2 | 1.42% | 1 | 7.69% |
Total | 141 | 100.00% | 13 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 104 | 64.20% | 2 | 33.33% |
Linus Torvalds (pre-git) | 30 | 18.52% | 3 | 50.00% |
Chuck Lever | 28 | 17.28% | 1 | 16.67% |
Total | 162 | 100.00% | 6 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 111 | 68.10% | 2 | 20.00% |
Chuck Lever | 28 | 17.18% | 1 | 10.00% |
Linus Torvalds (pre-git) | 24 | 14.72% | 7 | 70.00% |
Total | 163 | 100.00% | 10 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 36 | 100.00% | 1 | 100.00% |
Total | 36 | 100.00% | 1 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 68 | 80.00% | 6 | 66.67% |
Fred Isaman | 8 | 9.41% | 1 | 11.11% |
Weston Andros Adamson | 8 | 9.41% | 1 | 11.11% |
Sachin S. Prabhu | 1 | 1.18% | 1 | 11.11% |
Total | 85 | 100.00% | 9 | 100.00% |
static void nfs_proc_read_setup(struct nfs_pgio_header *hdr,
struct rpc_message *msg)
{
msg->rpc_proc = &nfs_procedures[NFSPROC_READ];
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 24 | 92.31% | 4 | 80.00% |
Weston Andros Adamson | 2 | 7.69% | 1 | 20.00% |
Total | 26 | 100.00% | 5 | 100.00% |
static int nfs_proc_pgio_rpc_prepare(struct rpc_task *task,
struct nfs_pgio_header *hdr)
{
rpc_call_start(task);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Bryan Schumaker | 17 | 70.83% | 1 | 25.00% |
Neil Brown | 4 | 16.67% | 1 | 25.00% |
Weston Andros Adamson | 2 | 8.33% | 1 | 25.00% |
Anna Schumaker | 1 | 4.17% | 1 | 25.00% |
Total | 24 | 100.00% | 4 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 29 | 90.62% | 5 | 83.33% |
Weston Andros Adamson | 3 | 9.38% | 1 | 16.67% |
Total | 32 | 100.00% | 6 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 32 | 91.43% | 5 | 83.33% |
Weston Andros Adamson | 3 | 8.57% | 1 | 16.67% |
Total | 35 | 100.00% | 6 | 100.00% |
static void nfs_proc_commit_rpc_prepare(struct rpc_task *task, struct nfs_commit_data *data)
{
BUG();
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Fred Isaman | 19 | 100.00% | 1 | 100.00% |
Total | 19 | 100.00% | 1 | 100.00% |
static void
nfs_proc_commit_setup(struct nfs_commit_data *data, struct rpc_message *msg)
{
BUG();
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 18 | 94.74% | 2 | 66.67% |
Fred Isaman | 1 | 5.26% | 1 | 33.33% |
Total | 19 | 100.00% | 3 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 26 | 59.09% | 1 | 33.33% |
Chuck Lever | 15 | 34.09% | 1 | 33.33% |
Al Viro | 3 | 6.82% | 1 | 33.33% |
Total | 44 | 100.00% | 3 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 100 | 100.00% | 1 | 100.00% |
Total | 100 | 100.00% | 1 | 100.00% |
static int nfs_have_delegation(struct inode *inode, fmode_t flags)
{
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Bryan Schumaker | 17 | 100.00% | 1 | 100.00% |
Total | 17 | 100.00% | 1 | 100.00% |
static int nfs_return_delegation(struct inode *inode)
{
nfs_wb_all(inode);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Bryan Schumaker | 19 | 100.00% | 1 | 100.00% |
Total | 19 | 100.00% | 1 | 100.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
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 1410 | 39.40% | 43 | 40.57% |
Linus Torvalds (pre-git) | 1102 | 30.79% | 17 | 16.04% |
Chuck Lever | 392 | 10.95% | 5 | 4.72% |
Bryan Schumaker | 242 | 6.76% | 12 | 11.32% |
Art Haas | 118 | 3.30% | 1 | 0.94% |
Jeff Layton | 79 | 2.21% | 3 | 2.83% |
EG Keizer | 58 | 1.62% | 1 | 0.94% |
Dave Jones | 50 | 1.40% | 2 | 1.89% |
Fred Isaman | 33 | 0.92% | 2 | 1.89% |
Weston Andros Adamson | 18 | 0.50% | 1 | 0.94% |
David Quigley | 18 | 0.50% | 1 | 0.94% |
Al Viro | 14 | 0.39% | 5 | 4.72% |
David Howells | 14 | 0.39% | 4 | 3.77% |
J. Bruce Fields | 6 | 0.17% | 1 | 0.94% |
Anna Schumaker | 5 | 0.14% | 1 | 0.94% |
Andy Adamson | 5 | 0.14% | 1 | 0.94% |
Neil Brown | 4 | 0.11% | 1 | 0.94% |
Harvey Harrison | 4 | 0.11% | 1 | 0.94% |
Jesper Juhl | 3 | 0.08% | 1 | 0.94% |
Dave Hansen | 2 | 0.06% | 1 | 0.94% |
Linus Torvalds | 1 | 0.03% | 1 | 0.94% |
Sachin S. Prabhu | 1 | 0.03% | 1 | 0.94% |
Total | 3579 | 100.00% | 106 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.