Release 4.11 fs/nfs/nfs3proc.c
/*
* linux/fs/nfs/nfs3proc.c
*
* Client-side NFSv3 procedures stubs.
*
* Copyright (C) 1997, Olaf Kirch
*/
#include <linux/mm.h>
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/sunrpc/clnt.h>
#include <linux/slab.h>
#include <linux/nfs.h>
#include <linux/nfs3.h>
#include <linux/nfs_fs.h>
#include <linux/nfs_page.h>
#include <linux/lockd/bind.h>
#include <linux/nfs_mount.h>
#include <linux/freezer.h>
#include <linux/xattr.h>
#include "iostat.h"
#include "internal.h"
#include "nfs3_fs.h"
#define NFSDBG_FACILITY NFSDBG_PROC
/* A wrapper to handle the EJUKEBOX error messages */
static int
nfs3_rpc_wrapper(struct rpc_clnt *clnt, struct rpc_message *msg, int flags)
{
int res;
do {
res = rpc_call_sync(clnt, msg, flags);
if (res != -EJUKEBOX)
break;
freezable_schedule_timeout_killable_unsafe(NFS_JUKEBOX_RETRY_TIME);
res = -ERESTARTSYS;
} while (!fatal_signal_pending(current));
return res;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 61 | 92.42% | 1 | 33.33% |
Matthew Wilcox | 4 | 6.06% | 1 | 33.33% |
Colin Cross | 1 | 1.52% | 1 | 33.33% |
Total | 66 | 100.00% | 3 | 100.00% |
#define rpc_call_sync(clnt, msg, flags) nfs3_rpc_wrapper(clnt, msg, flags)
static int
nfs3_async_handle_jukebox(struct rpc_task *task, struct inode *inode)
{
if (task->tk_status != -EJUKEBOX)
return 0;
if (task->tk_status == -EJUKEBOX)
nfs_inc_stats(inode, NFSIOS_DELAY);
task->tk_status = 0;
rpc_restart_call(task);
rpc_delay(task, NFS_JUKEBOX_RETRY_TIME);
return 1;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 44 | 67.69% | 1 | 33.33% |
Chuck Lever | 12 | 18.46% | 1 | 33.33% |
Jeff Layton | 9 | 13.85% | 1 | 33.33% |
Total | 65 | 100.00% | 3 | 100.00% |
static int
do_proc_get_root(struct rpc_clnt *client, struct nfs_fh *fhandle,
struct nfs_fsinfo *info)
{
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_FSINFO],
.rpc_argp = fhandle,
.rpc_resp = info,
};
int status;
dprintk("%s: call fsinfo\n", __func__);
nfs_fattr_init(info->fattr);
status = rpc_call_sync(client, &msg, 0);
dprintk("%s: reply fsinfo: %d\n", __func__, status);
if (status == 0 && !(info->fattr->valid & NFS_ATTR_FATTR)) {
msg.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR];
msg.rpc_resp = info->fattr;
status = rpc_call_sync(client, &msg, 0);
dprintk("%s: reply getattr: %d\n", __func__, status);
}
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Chuck Lever | 49 | 33.79% | 1 | 12.50% |
Trond Myklebust | 48 | 33.10% | 4 | 50.00% |
Linus Torvalds (pre-git) | 41 | 28.28% | 1 | 12.50% |
J. Bruce Fields | 4 | 2.76% | 1 | 12.50% |
Harvey Harrison | 3 | 2.07% | 1 | 12.50% |
Total | 145 | 100.00% | 8 | 100.00% |
/*
* Bare-bones access to getattr: this is for nfs_get_root/nfs_get_sb
*/
static int
nfs3_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
struct nfs_fsinfo *info)
{
int status;
status = do_proc_get_root(server->client, fhandle, info);
if (status && server->nfs_client->cl_rpcclient != server->client)
status = do_proc_get_root(server->nfs_client->cl_rpcclient, fhandle, info);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
J. Bruce Fields | 63 | 91.30% | 1 | 50.00% |
David Howells | 6 | 8.70% | 1 | 50.00% |
Total | 69 | 100.00% | 2 | 100.00% |
/*
* One function for each procedure in the NFS protocol.
*/
static int
nfs3_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
struct nfs_fattr *fattr, struct nfs4_label *label)
{
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_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% | 1 | 16.67% |
Chuck Lever | 28 | 31.82% | 1 | 16.67% |
Trond Myklebust | 16 | 18.18% | 3 | 50.00% |
David Quigley | 5 | 5.68% | 1 | 16.67% |
Total | 88 | 100.00% | 6 | 100.00% |
static int
nfs3_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
struct iattr *sattr)
{
struct inode *inode = d_inode(dentry);
struct nfs3_sattrargs arg = {
.fh = NFS_FH(inode),
.sattr = sattr,
};
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_SETATTR],
.rpc_argp = &arg,
.rpc_resp = fattr,
};
int status;
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) | 61 | 41.22% | 2 | 16.67% |
Trond Myklebust | 49 | 33.11% | 6 | 50.00% |
Chuck Lever | 28 | 18.92% | 1 | 8.33% |
Art Haas | 4 | 2.70% | 1 | 8.33% |
David Howells | 3 | 2.03% | 1 | 8.33% |
Dave Jones | 3 | 2.03% | 1 | 8.33% |
Total | 148 | 100.00% | 12 | 100.00% |
static int
nfs3_proc_lookup(struct inode *dir, const struct qstr *name,
struct nfs_fh *fhandle, struct nfs_fattr *fattr,
struct nfs4_label *label)
{
struct nfs3_diropargs arg = {
.fh = NFS_FH(dir),
.name = name->name,
.len = name->len
};
struct nfs3_diropres res = {
.fh = fhandle,
.fattr = fattr
};
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_LOOKUP],
.rpc_argp = &arg,
.rpc_resp = &res,
};
int status;
dprintk("NFS call lookup %s\n", name->name);
res.dir_attr = nfs_alloc_fattr();
if (res.dir_attr == NULL)
return -ENOMEM;
nfs_fattr_init(fattr);
status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
nfs_refresh_inode(dir, res.dir_attr);
if (status >= 0 && !(fattr->valid & NFS_ATTR_FATTR)) {
msg.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR];
msg.rpc_argp = fhandle;
msg.rpc_resp = fattr;
status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
}
nfs_free_fattr(res.dir_attr);
dprintk("NFS reply lookup: %d\n", status);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 121 | 51.71% | 2 | 20.00% |
Chuck Lever | 56 | 23.93% | 1 | 10.00% |
Trond Myklebust | 36 | 15.38% | 3 | 30.00% |
Art Haas | 10 | 4.27% | 1 | 10.00% |
David Quigley | 5 | 2.14% | 1 | 10.00% |
Dave Jones | 5 | 2.14% | 1 | 10.00% |
Al Viro | 1 | 0.43% | 1 | 10.00% |
Total | 234 | 100.00% | 10 | 100.00% |
static int nfs3_proc_access(struct inode *inode, struct nfs_access_entry *entry)
{
struct nfs3_accessargs arg = {
.fh = NFS_FH(inode),
};
struct nfs3_accessres res;
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_ACCESS],
.rpc_argp = &arg,
.rpc_resp = &res,
.rpc_cred = entry->cred,
};
int mode = entry->mask;
int status = -ENOMEM;
dprintk("NFS call access\n");
if (mode & MAY_READ)
arg.access |= NFS3_ACCESS_READ;
if (S_ISDIR(inode->i_mode)) {
if (mode & MAY_WRITE)
arg.access |= NFS3_ACCESS_MODIFY | NFS3_ACCESS_EXTEND | NFS3_ACCESS_DELETE;
if (mode & MAY_EXEC)
arg.access |= NFS3_ACCESS_LOOKUP;
} else {
if (mode & MAY_WRITE)
arg.access |= NFS3_ACCESS_MODIFY | NFS3_ACCESS_EXTEND;
if (mode & MAY_EXEC)
arg.access |= NFS3_ACCESS_EXECUTE;
}
res.fattr = nfs_alloc_fattr();
if (res.fattr == NULL)
goto out;
status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
nfs_refresh_inode(inode, res.fattr);
if (status == 0) {
entry->mask = 0;
if (res.access & NFS3_ACCESS_READ)
entry->mask |= MAY_READ;
if (res.access & (NFS3_ACCESS_MODIFY | NFS3_ACCESS_EXTEND | NFS3_ACCESS_DELETE))
entry->mask |= MAY_WRITE;
if (res.access & (NFS3_ACCESS_LOOKUP|NFS3_ACCESS_EXECUTE))
entry->mask |= MAY_EXEC;
}
nfs_free_fattr(res.fattr);
out:
dprintk("NFS reply access: %d\n", status);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 153 | 52.22% | 2 | 20.00% |
Trond Myklebust | 137 | 46.76% | 6 | 60.00% |
Dave Jones | 2 | 0.68% | 1 | 10.00% |
Chuck Lever | 1 | 0.34% | 1 | 10.00% |
Total | 293 | 100.00% | 10 | 100.00% |
static int nfs3_proc_readlink(struct inode *inode, struct page *page,
unsigned int pgbase, unsigned int pglen)
{
struct nfs_fattr *fattr;
struct nfs3_readlinkargs args = {
.fh = NFS_FH(inode),
.pgbase = pgbase,
.pglen = pglen,
.pages = &page
};
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_READLINK],
.rpc_argp = &args,
};
int status = -ENOMEM;
dprintk("NFS call readlink\n");
fattr = nfs_alloc_fattr();
if (fattr == NULL)
goto out;
msg.rpc_resp = fattr;
status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
nfs_refresh_inode(inode, fattr);
nfs_free_fattr(fattr);
out:
dprintk("NFS reply readlink: %d\n", status);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 71 | 47.33% | 2 | 25.00% |
Trond Myklebust | 49 | 32.67% | 3 | 37.50% |
Chuck Lever | 23 | 15.33% | 1 | 12.50% |
Art Haas | 6 | 4.00% | 1 | 12.50% |
Dave Jones | 1 | 0.67% | 1 | 12.50% |
Total | 150 | 100.00% | 8 | 100.00% |
struct nfs3_createdata {
struct rpc_message msg;
union {
struct nfs3_createargs create;
struct nfs3_mkdirargs mkdir;
struct nfs3_symlinkargs symlink;
struct nfs3_mknodargs mknod;
}
arg;
struct nfs3_diropres res;
struct nfs_fh fh;
struct nfs_fattr fattr;
struct nfs_fattr dir_attr;
};
static struct nfs3_createdata *nfs3_alloc_createdata(void)
{
struct nfs3_createdata *data;
data = kzalloc(sizeof(*data), GFP_KERNEL);
if (data != NULL) {
data->msg.rpc_argp = &data->arg;
data->msg.rpc_resp = &data->res;
data->res.fh = &data->fh;
data->res.fattr = &data->fattr;
data->res.dir_attr = &data->dir_attr;
nfs_fattr_init(data->res.fattr);
nfs_fattr_init(data->res.dir_attr);
}
return data;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 91 | 81.25% | 2 | 40.00% |
Linus Torvalds (pre-git) | 10 | 8.93% | 1 | 20.00% |
Art Haas | 9 | 8.04% | 1 | 20.00% |
Dave Jones | 2 | 1.79% | 1 | 20.00% |
Total | 112 | 100.00% | 5 | 100.00% |
static int nfs3_do_create(struct inode *dir, struct dentry *dentry, struct nfs3_createdata *data)
{
int status;
status = rpc_call_sync(NFS_CLIENT(dir), &data->msg, 0);
nfs_post_op_update_inode(dir, data->res.dir_attr);
if (status == 0)
status = nfs_instantiate(dentry, data->res.fh, data->res.fattr, NULL);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 72 | 87.80% | 1 | 33.33% |
Chuck Lever | 8 | 9.76% | 1 | 33.33% |
David Quigley | 2 | 2.44% | 1 | 33.33% |
Total | 82 | 100.00% | 3 | 100.00% |
static void nfs3_free_createdata(struct nfs3_createdata *data)
{
kfree(data);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 16 | 100.00% | 1 | 100.00% |
Total | 16 | 100.00% | 1 | 100.00% |
/*
* Create a regular file.
*/
static int
nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
int flags)
{
struct posix_acl *default_acl, *acl;
struct nfs3_createdata *data;
int status = -ENOMEM;
dprintk("NFS call create %pd\n", dentry);
data = nfs3_alloc_createdata();
if (data == NULL)
goto out;
data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_CREATE];
data->arg.create.fh = NFS_FH(dir);
data->arg.create.name = dentry->d_name.name;
data->arg.create.len = dentry->d_name.len;
data->arg.create.sattr = sattr;
data->arg.create.createmode = NFS3_CREATE_UNCHECKED;
if (flags & O_EXCL) {
data->arg.create.createmode = NFS3_CREATE_EXCLUSIVE;
data->arg.create.verifier[0] = cpu_to_be32(jiffies);
data->arg.create.verifier[1] = cpu_to_be32(current->pid);
}
status = posix_acl_create(dir, &sattr->ia_mode, &default_acl, &acl);
if (status)
goto out;
for (;;) {
status = nfs3_do_create(dir, dentry, data);
if (status != -ENOTSUPP)
break;
/* If the server doesn't support the exclusive creation
* semantics, try again with simple 'guarded' mode. */
switch (data->arg.create.createmode) {
case NFS3_CREATE_EXCLUSIVE:
data->arg.create.createmode = NFS3_CREATE_GUARDED;
break;
case NFS3_CREATE_GUARDED:
data->arg.create.createmode = NFS3_CREATE_UNCHECKED;
break;
case NFS3_CREATE_UNCHECKED:
goto out;
}
nfs_fattr_init(data->res.dir_attr);
nfs_fattr_init(data->res.fattr);
}
if (status != 0)
goto out_release_acls;
/* When we created the file with exclusive semantics, make
* sure we set the attributes afterwards. */
if (data->arg.create.createmode == NFS3_CREATE_EXCLUSIVE) {
dprintk("NFS call setattr (post-create)\n");
if (!(sattr->ia_valid & ATTR_ATIME_SET))
sattr->ia_valid |= ATTR_ATIME;
if (!(sattr->ia_valid & ATTR_MTIME_SET))
sattr->ia_valid |= ATTR_MTIME;
/* Note: we could use a guarded setattr here, but I'm
* not sure this buys us anything (and I'd have
* to revamp the NFSv3 XDR code) */
status = nfs3_proc_setattr(dentry, data->res.fattr, sattr);
nfs_post_op_update_inode(d_inode(dentry), data->res.fattr);
dprintk("NFS reply setattr (post-create): %d\n", status);
if (status != 0)
goto out_release_acls;
}
status = nfs3_proc_setacls(d_inode(dentry), acl, default_acl);
out_release_acls:
posix_acl_release(acl);
posix_acl_release(default_acl);
out:
nfs3_free_createdata(data);
dprintk("NFS reply create: %d\n", status);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 264 | 57.77% | 7 | 50.00% |
Linus Torvalds (pre-git) | 118 | 25.82% | 1 | 7.14% |
Christoph Hellwig | 47 | 10.28% | 1 | 7.14% |
Andreas Gruenbacher | 18 | 3.94% | 1 | 7.14% |
David Howells | 6 | 1.31% | 1 | 7.14% |
Andy Ryan | 2 | 0.44% | 1 | 7.14% |
Chuck Lever | 1 | 0.22% | 1 | 7.14% |
Al Viro | 1 | 0.22% | 1 | 7.14% |
Total | 457 | 100.00% | 14 | 100.00% |
static int
nfs3_proc_remove(struct inode *dir, const struct qstr *name)
{
struct nfs_removeargs arg = {
.fh = NFS_FH(dir),
.name = *name,
};
struct nfs_removeres res;
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_REMOVE],
.rpc_argp = &arg,
.rpc_resp = &res,
};
int status = -ENOMEM;
dprintk("NFS call remove %s\n", name->name);
res.dir_attr = nfs_alloc_fattr();
if (res.dir_attr == NULL)
goto out;
status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
nfs_post_op_update_inode(dir, res.dir_attr);
nfs_free_fattr(res.dir_attr);
out:
dprintk("NFS reply remove: %d\n", status);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 84 | 58.33% | 2 | 20.00% |
Trond Myklebust | 43 | 29.86% | 4 | 40.00% |
Art Haas | 10 | 6.94% | 1 | 10.00% |
Dave Jones | 5 | 3.47% | 1 | 10.00% |
Al Viro | 1 | 0.69% | 1 | 10.00% |
Linus Torvalds | 1 | 0.69% | 1 | 10.00% |
Total | 144 | 100.00% | 10 | 100.00% |
static void
nfs3_proc_unlink_setup(struct rpc_message *msg, struct inode *dir)
{
msg->rpc_proc = &nfs3_procedures[NFS3PROC_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 nfs3_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
nfs3_proc_unlink_done(struct rpc_task *task, struct inode *dir)
{
struct nfs_removeres *res;
if (nfs3_async_handle_jukebox(task, dir))
return 0;
res = task->tk_msg.rpc_resp;
nfs_post_op_update_inode(dir, res->dir_attr);
return 1;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 26 | 49.06% | 2 | 28.57% |
Trond Myklebust | 25 | 47.17% | 4 | 57.14% |
Chuck Lever | 2 | 3.77% | 1 | 14.29% |
Total | 53 | 100.00% | 7 | 100.00% |
static void
nfs3_proc_rename_setup(struct rpc_message *msg, struct inode *dir)
{
msg->rpc_proc = &nfs3_procedures[NFS3PROC_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 nfs3_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
nfs3_proc_rename_done(struct rpc_task *task, struct inode *old_dir,
struct inode *new_dir)
{
struct nfs_renameres *res;
if (nfs3_async_handle_jukebox(task, old_dir))
return 0;
res = task->tk_msg.rpc_resp;
nfs_post_op_update_inode(old_dir, res->old_fattr);
nfs_post_op_update_inode(new_dir, res->new_fattr);
return 1;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Jeff Layton | 67 | 100.00% | 1 | 100.00% |
Total | 67 | 100.00% | 1 | 100.00% |
static int
nfs3_proc_link(struct inode *inode, struct inode *dir, const struct qstr *name)
{
struct nfs3_linkargs arg = {
.fromfh = NFS_FH(inode),
.tofh = NFS_FH(dir),
.toname = name->name,
.tolen = name->len
};
struct nfs3_linkres res;
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_LINK],
.rpc_argp = &arg,
.rpc_resp = &res,
};
int status = -ENOMEM;
dprintk("NFS call link %s\n", name->name);
res.fattr = nfs_alloc_fattr();
res.dir_attr = nfs_alloc_fattr();
if (res.fattr == NULL || res.dir_attr == NULL)
goto out;
status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
nfs_post_op_update_inode(dir, res.dir_attr);
nfs_post_op_update_inode(inode, res.fattr);
out:
nfs_free_fattr(res.dir_attr);
nfs_free_fattr(res.fattr);
dprintk("NFS reply link: %d\n", status);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 79 | 40.72% | 3 | 25.00% |
Linus Torvalds (pre-git) | 69 | 35.57% | 3 | 25.00% |
Chuck Lever | 35 | 18.04% | 2 | 16.67% |
Art Haas | 8 | 4.12% | 1 | 8.33% |
Al Viro | 1 | 0.52% | 1 | 8.33% |
Jeff Layton | 1 | 0.52% | 1 | 8.33% |
Dave Jones | 1 | 0.52% | 1 | 8.33% |
Total | 194 | 100.00% | 12 | 100.00% |
static int
nfs3_proc_symlink(struct inode *dir, struct dentry *dentry, struct page *page,
unsigned int len, struct iattr *sattr)
{
struct nfs3_createdata *data;
int status = -ENOMEM;
if (len > NFS3_MAXPATHLEN)
return -ENAMETOOLONG;
dprintk("NFS call symlink %pd\n", dentry);
data = nfs3_alloc_createdata();
if (data == NULL)
goto out;
data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_SYMLINK];
data->arg.symlink.fromfh = NFS_FH(dir);
data->arg.symlink.fromname = dentry->d_name.name;
data->arg.symlink.fromlen = dentry->d_name.len;
data->arg.symlink.pages = &page;
data->arg.symlink.pathlen = len;
data->arg.symlink.sattr = sattr;
status = nfs3_do_create(dir, dentry, data);
nfs3_free_createdata(data);
out:
dprintk("NFS reply symlink: %d\n", status);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 142 | 77.17% | 2 | 28.57% |
Linus Torvalds (pre-git) | 26 | 14.13% | 2 | 28.57% |
Chuck Lever | 8 | 4.35% | 1 | 14.29% |
Art Haas | 7 | 3.80% | 1 | 14.29% |
Al Viro | 1 | 0.54% | 1 | 14.29% |
Total | 184 | 100.00% | 7 | 100.00% |
static int
nfs3_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr)
{
struct posix_acl *default_acl, *acl;
struct nfs3_createdata *data;
int status = -ENOMEM;
dprintk("NFS call mkdir %pd\n", dentry);
data = nfs3_alloc_createdata();
if (data == NULL)
goto out;
status = posix_acl_create(dir, &sattr->ia_mode, &default_acl, &acl);
if (status)
goto out;
data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_MKDIR];
data->arg.mkdir.fh = NFS_FH(dir);
data->arg.mkdir.name = dentry->d_name.name;
data->arg.mkdir.len = dentry->d_name.len;
data->arg.mkdir.sattr = sattr;
status = nfs3_do_create(dir, dentry, data);
if (status != 0)
goto out_release_acls;
status = nfs3_proc_setacls(d_inode(dentry), acl, default_acl);
out_release_acls:
posix_acl_release(acl);
posix_acl_release(default_acl);
out:
nfs3_free_createdata(data);
dprintk("NFS reply mkdir: %d\n", status);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 115 | 54.25% | 3 | 33.33% |
Christoph Hellwig | 50 | 23.58% | 1 | 11.11% |
Linus Torvalds (pre-git) | 24 | 11.32% | 1 | 11.11% |
Andreas Gruenbacher | 18 | 8.49% | 1 | 11.11% |
David Howells | 3 | 1.42% | 1 | 11.11% |
Al Viro | 1 | 0.47% | 1 | 11.11% |
Chuck Lever | 1 | 0.47% | 1 | 11.11% |
Total | 212 | 100.00% | 9 | 100.00% |
static int
nfs3_proc_rmdir(struct inode *dir, const struct qstr *name)
{
struct nfs_fattr *dir_attr;
struct nfs3_diropargs arg = {
.fh = NFS_FH(dir),
.name = name->name,
.len = name->len
};
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_RMDIR],
.rpc_argp = &arg,
};
int status = -ENOMEM;
dprintk("NFS call rmdir %s\n", name->name);
dir_attr = nfs_alloc_fattr();
if (dir_attr == NULL)
goto out;
msg.rpc_resp = dir_attr;
status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
nfs_post_op_update_inode(dir, dir_attr);
nfs_free_fattr(dir_attr);
out:
dprintk("NFS reply rmdir: %d\n", status);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 82 | 56.55% | 2 | 25.00% |
Trond Myklebust | 30 | 20.69% | 2 | 25.00% |
Chuck Lever | 23 | 15.86% | 1 | 12.50% |
Art Haas | 6 | 4.14% | 1 | 12.50% |
Dave Jones | 3 | 2.07% | 1 | 12.50% |
Al Viro | 1 | 0.69% | 1 | 12.50% |
Total | 145 | 100.00% | 8 | 100.00% |
/*
* The READDIR implementation is somewhat hackish - we pass the user buffer
* to the encode function, which installs it in the receive iovec.
* The decode function itself doesn't perform any decoding, it just makes
* sure the reply is syntactically correct.
*
* Also note that this implementation handles both plain readdir and
* readdirplus.
*/
static int
nfs3_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);
__be32 *verf = NFS_I(dir)->cookieverf;
struct nfs3_readdirargs arg = {
.fh = NFS_FH(dir),
.cookie = cookie,
.verf = {verf[0], verf[1]},
.plus = plus,
.count = count,
.pages = pages
};
struct nfs3_readdirres res = {
.verf = verf,
.plus = plus
};
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_READDIR],
.rpc_argp = &arg,
.rpc_resp = &res,
.rpc_cred = cred
};
int status = -ENOMEM;
if (plus)
msg.rpc_proc = &nfs3_procedures[NFS3PROC_READDIRPLUS];
dprintk("NFS call readdir%s %d\n",
plus? "plus" : "", (unsigned int) cookie);
res.dir_attr = nfs_alloc_fattr();
if (res.dir_attr == NULL)
goto out;
status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
nfs_invalidate_atime(dir);
nfs_refresh_inode(dir, res.dir_attr);
nfs_free_fattr(res.dir_attr);
out:
dprintk("NFS reply readdir%s: %d\n",
plus? "plus" : "", status);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 119 | 45.95% | 3 | 18.75% |
Trond Myklebust | 96 | 37.07% | 7 | 43.75% |
Art Haas | 24 | 9.27% | 1 | 6.25% |
Chuck Lever | 7 | 2.70% | 1 | 6.25% |
Dave Jones | 6 | 2.32% | 1 | 6.25% |
David Howells | 3 | 1.16% | 1 | 6.25% |
Bryan Schumaker | 3 | 1.16% | 1 | 6.25% |
Al Viro | 1 | 0.39% | 1 | 6.25% |
Total | 259 | 100.00% | 16 | 100.00% |
static int
nfs3_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
dev_t rdev)
{
struct posix_acl *default_acl, *acl;
struct nfs3_createdata *data;
int status = -ENOMEM;
dprintk("NFS call mknod %pd %u:%u\n", dentry,
MAJOR(rdev), MINOR(rdev));
data = nfs3_alloc_createdata();
if (data == NULL)
goto out;
status = posix_acl_create(dir, &sattr->ia_mode, &default_acl, &acl);
if (status)
goto out;
data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_MKNOD];
data->arg.mknod.fh = NFS_FH(dir);
data->arg.mknod.name = dentry->d_name.name;
data->arg.mknod.len = dentry->d_name.len;
data->arg.mknod.sattr = sattr;
data->arg.mknod.rdev = rdev;
switch (sattr->ia_mode & S_IFMT) {
case S_IFBLK:
data->arg.mknod.type = NF3BLK;
break;
case S_IFCHR:
data->arg.mknod.type = NF3CHR;
break;
case S_IFIFO:
data->arg.mknod.type = NF3FIFO;
break;
case S_IFSOCK:
data->arg.mknod.type = NF3SOCK;
break;
default:
status = -EINVAL;
goto out;
}
status = nfs3_do_create(dir, dentry, data);
if (status != 0)
goto out_release_acls;
status = nfs3_proc_setacls(d_inode(dentry), acl, default_acl);
out_release_acls:
posix_acl_release(acl);
posix_acl_release(default_acl);
out:
nfs3_free_createdata(data);
dprintk("NFS reply mknod: %d\n", status);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 146 | 47.10% | 2 | 22.22% |
Linus Torvalds (pre-git) | 76 | 24.52% | 1 | 11.11% |
Christoph Hellwig | 50 | 16.13% | 1 | 11.11% |
Andreas Gruenbacher | 20 | 6.45% | 1 | 11.11% |
Art Haas | 10 | 3.23% | 1 | 11.11% |
Dave Jones | 4 | 1.29% | 1 | 11.11% |
David Howells | 3 | 0.97% | 1 | 11.11% |
Al Viro | 1 | 0.32% | 1 | 11.11% |
Total | 310 | 100.00% | 9 | 100.00% |
static int
nfs3_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
struct nfs_fsstat *stat)
{
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_FSSTAT],
.rpc_argp = fhandle,
.rpc_resp = stat,
};
int status;
dprintk("NFS call fsstat\n");
nfs_fattr_init(stat->fattr);
status = rpc_call_sync(server->client, &msg, 0);
dprintk("NFS reply fsstat: %d\n", status);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 30 | 35.29% | 1 | 20.00% |
Chuck Lever | 29 | 34.12% | 2 | 40.00% |
Trond Myklebust | 26 | 30.59% | 2 | 40.00% |
Total | 85 | 100.00% | 5 | 100.00% |
static int
do_proc_fsinfo(struct rpc_clnt *client, struct nfs_fh *fhandle,
struct nfs_fsinfo *info)
{
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_FSINFO],
.rpc_argp = fhandle,
.rpc_resp = info,
};
int status;
dprintk("NFS call fsinfo\n");
nfs_fattr_init(info->fattr);
status = rpc_call_sync(client, &msg, 0);
dprintk("NFS reply fsinfo: %d\n", status);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 40 | 48.19% | 2 | 40.00% |
Chuck Lever | 28 | 33.73% | 1 | 20.00% |
Linus Torvalds (pre-git) | 11 | 13.25% | 1 | 20.00% |
EG Keizer | 4 | 4.82% | 1 | 20.00% |
Total | 83 | 100.00% | 5 | 100.00% |
/*
* Bare-bones access to fsinfo: this is for nfs_get_root/nfs_get_sb via
* nfs_create_server
*/
static int
nfs3_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
struct nfs_fsinfo *info)
{
int status;
status = do_proc_fsinfo(server->client, fhandle, info);
if (status && server->nfs_client->cl_rpcclient != server->client)
status = do_proc_fsinfo(server->nfs_client->cl_rpcclient, fhandle, info);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
EG Keizer | 69 | 100.00% | 1 | 100.00% |
Total | 69 | 100.00% | 1 | 100.00% |
static int
nfs3_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
struct nfs_pathconf *info)
{
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_PATHCONF],
.rpc_argp = fhandle,
.rpc_resp = info,
};
int status;
dprintk("NFS call pathconf\n");
nfs_fattr_init(info->fattr);
status = rpc_call_sync(server->client, &msg, 0);
dprintk("NFS reply pathconf: %d\n", status);
return status;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 36 | 42.35% | 2 | 50.00% |
Chuck Lever | 28 | 32.94% | 1 | 25.00% |
Linus Torvalds (pre-git) | 21 | 24.71% | 1 | 25.00% |
Total | 85 | 100.00% | 4 | 100.00% |
static int nfs3_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr)
{
struct inode *inode = hdr->inode;
if (hdr->pgio_done_cb != NULL)
return hdr->pgio_done_cb(task, hdr);
if (nfs3_async_handle_jukebox(task, inode))
return -EAGAIN;
nfs_invalidate_atime(inode);
nfs_refresh_inode(inode, &hdr->fattr);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 60 | 81.08% | 7 | 70.00% |
Fred Isaman | 8 | 10.81% | 1 | 10.00% |
Weston Andros Adamson | 4 | 5.41% | 1 | 10.00% |
Chuck Lever | 2 | 2.70% | 1 | 10.00% |
Total | 74 | 100.00% | 10 | 100.00% |
static void nfs3_proc_read_setup(struct nfs_pgio_header *hdr,
struct rpc_message *msg)
{
msg->rpc_proc = &nfs3_procedures[NFS3PROC_READ];
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 24 | 92.31% | 3 | 75.00% |
Weston Andros Adamson | 2 | 7.69% | 1 | 25.00% |
Total | 26 | 100.00% | 4 | 100.00% |
static int nfs3_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 nfs3_write_done(struct rpc_task *task, struct nfs_pgio_header *hdr)
{
struct inode *inode = hdr->inode;
if (hdr->pgio_done_cb != NULL)
return hdr->pgio_done_cb(task, hdr);
if (nfs3_async_handle_jukebox(task, inode))
return -EAGAIN;
if (task->tk_status >= 0)
nfs_writeback_update_inode(hdr);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 58 | 80.56% | 7 | 70.00% |
Fred Isaman | 8 | 11.11% | 1 | 10.00% |
Weston Andros Adamson | 4 | 5.56% | 1 | 10.00% |
Chuck Lever | 2 | 2.78% | 1 | 10.00% |
Total | 72 | 100.00% | 10 | 100.00% |
static void nfs3_proc_write_setup(struct nfs_pgio_header *hdr,
struct rpc_message *msg)
{
msg->rpc_proc = &nfs3_procedures[NFS3PROC_WRITE];
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 24 | 92.31% | 3 | 75.00% |
Weston Andros Adamson | 2 | 7.69% | 1 | 25.00% |
Total | 26 | 100.00% | 4 | 100.00% |
static void nfs3_proc_commit_rpc_prepare(struct rpc_task *task, struct nfs_commit_data *data)
{
rpc_call_start(task);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Fred Isaman | 21 | 100.00% | 1 | 100.00% |
Total | 21 | 100.00% | 1 | 100.00% |
static int nfs3_commit_done(struct rpc_task *task, struct nfs_commit_data *data)
{
if (data->commit_done_cb != NULL)
return data->commit_done_cb(task, data);
if (nfs3_async_handle_jukebox(task, data->inode))
return -EAGAIN;
nfs_refresh_inode(data->inode, data->res.fattr);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 60 | 92.31% | 7 | 77.78% |
Chuck Lever | 4 | 6.15% | 1 | 11.11% |
Fred Isaman | 1 | 1.54% | 1 | 11.11% |
Total | 65 | 100.00% | 9 | 100.00% |
static void nfs3_proc_commit_setup(struct nfs_commit_data *data, struct rpc_message *msg)
{
msg->rpc_proc = &nfs3_procedures[NFS3PROC_COMMIT];
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 25 | 96.15% | 3 | 75.00% |
Fred Isaman | 1 | 3.85% | 1 | 25.00% |
Total | 26 | 100.00% | 4 | 100.00% |
static int
nfs3_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% |
static int nfs3_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 nfs3_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 nfs3_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,
#ifdef CONFIG_NFS_V3_ACL
.listxattr = nfs3_listxattr,
.get_acl = nfs3_get_acl,
.set_acl = nfs3_set_acl,
#endif
};
static const struct inode_operations nfs3_file_inode_operations = {
.permission = nfs_permission,
.getattr = nfs_getattr,
.setattr = nfs_setattr,
#ifdef CONFIG_NFS_V3_ACL
.listxattr = nfs3_listxattr,
.get_acl = nfs3_get_acl,
.set_acl = nfs3_set_acl,
#endif
};
const struct nfs_rpc_ops nfs_v3_clientops = {
.version = 3, /* protocol version */
.dentry_ops = &nfs_dentry_operations,
.dir_inode_ops = &nfs3_dir_inode_operations,
.file_inode_ops = &nfs3_file_inode_operations,
.file_ops = &nfs_file_operations,
.getroot = nfs3_proc_get_root,
.submount = nfs_submount,
.try_mount = nfs_try_mount,
.getattr = nfs3_proc_getattr,
.setattr = nfs3_proc_setattr,
.lookup = nfs3_proc_lookup,
.access = nfs3_proc_access,
.readlink = nfs3_proc_readlink,
.create = nfs3_proc_create,
.remove = nfs3_proc_remove,
.unlink_setup = nfs3_proc_unlink_setup,
.unlink_rpc_prepare = nfs3_proc_unlink_rpc_prepare,
.unlink_done = nfs3_proc_unlink_done,
.rename_setup = nfs3_proc_rename_setup,
.rename_rpc_prepare = nfs3_proc_rename_rpc_prepare,
.rename_done = nfs3_proc_rename_done,
.link = nfs3_proc_link,
.symlink = nfs3_proc_symlink,
.mkdir = nfs3_proc_mkdir,
.rmdir = nfs3_proc_rmdir,
.readdir = nfs3_proc_readdir,
.mknod = nfs3_proc_mknod,
.statfs = nfs3_proc_statfs,
.fsinfo = nfs3_proc_fsinfo,
.pathconf = nfs3_proc_pathconf,
.decode_dirent = nfs3_decode_dirent,
.pgio_rpc_prepare = nfs3_proc_pgio_rpc_prepare,
.read_setup = nfs3_proc_read_setup,
.read_done = nfs3_read_done,
.write_setup = nfs3_proc_write_setup,
.write_done = nfs3_write_done,
.commit_setup = nfs3_proc_commit_setup,
.commit_rpc_prepare = nfs3_proc_commit_rpc_prepare,
.commit_done = nfs3_commit_done,
.lock = nfs3_proc_lock,
.clear_acl_cache = forget_all_cached_acls,
.close_context = nfs_close_context,
.have_delegation = nfs3_have_delegation,
.return_delegation = nfs3_return_delegation,
.alloc_client = nfs_alloc_client,
.init_client = nfs_init_client,
.free_client = nfs_free_client,
.create_server = nfs3_create_server,
.clone_server = nfs3_clone_server,
};
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Trond Myklebust | 2054 | 42.53% | 56 | 46.67% |
Linus Torvalds (pre-git) | 1288 | 26.67% | 5 | 4.17% |
Chuck Lever | 393 | 8.14% | 5 | 4.17% |
Bryan Schumaker | 252 | 5.22% | 12 | 10.00% |
Christoph Hellwig | 180 | 3.73% | 3 | 2.50% |
Art Haas | 132 | 2.73% | 1 | 0.83% |
Jeff Layton | 121 | 2.51% | 4 | 3.33% |
EG Keizer | 74 | 1.53% | 1 | 0.83% |
J. Bruce Fields | 72 | 1.49% | 2 | 1.67% |
Andreas Gruenbacher | 63 | 1.30% | 3 | 2.50% |
Dave Jones | 51 | 1.06% | 1 | 0.83% |
Fred Isaman | 44 | 0.91% | 2 | 1.67% |
David Howells | 29 | 0.60% | 5 | 4.17% |
Weston Andros Adamson | 14 | 0.29% | 1 | 0.83% |
Al Viro | 12 | 0.25% | 4 | 3.33% |
David Quigley | 12 | 0.25% | 1 | 0.83% |
Anna Schumaker | 8 | 0.17% | 2 | 1.67% |
Andy Adamson | 6 | 0.12% | 2 | 1.67% |
Tejun Heo | 6 | 0.12% | 2 | 1.67% |
Neil Brown | 4 | 0.08% | 1 | 0.83% |
Matthew Wilcox | 4 | 0.08% | 1 | 0.83% |
Harvey Harrison | 3 | 0.06% | 1 | 0.83% |
Andy Ryan | 2 | 0.04% | 1 | 0.83% |
Dave Hansen | 2 | 0.04% | 1 | 0.83% |
Colin Cross | 1 | 0.02% | 1 | 0.83% |
Harshula Jayasuriya | 1 | 0.02% | 1 | 0.83% |
Linus Torvalds | 1 | 0.02% | 1 | 0.83% |
Total | 4829 | 100.00% | 120 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.