mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
NFS: Add a lookupfh NFS RPC op
Add a lookup filehandle NFS RPC op so that a file handle can be looked up without requiring dentries and inodes and other VFS stuff when doing an NFS4 pathwalk during mounting. Signed-Off-By: David Howells <dhowells@redhat.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
b7162792b5
commit
2b3de4411b
2 changed files with 50 additions and 0 deletions
|
@ -1583,6 +1583,52 @@ nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _nfs4_proc_lookupfh(struct nfs_server *server, struct nfs_fh *dirfh,
|
||||||
|
struct qstr *name, struct nfs_fh *fhandle,
|
||||||
|
struct nfs_fattr *fattr)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
struct nfs4_lookup_arg args = {
|
||||||
|
.bitmask = server->attr_bitmask,
|
||||||
|
.dir_fh = dirfh,
|
||||||
|
.name = name,
|
||||||
|
};
|
||||||
|
struct nfs4_lookup_res res = {
|
||||||
|
.server = server,
|
||||||
|
.fattr = fattr,
|
||||||
|
.fh = fhandle,
|
||||||
|
};
|
||||||
|
struct rpc_message msg = {
|
||||||
|
.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP],
|
||||||
|
.rpc_argp = &args,
|
||||||
|
.rpc_resp = &res,
|
||||||
|
};
|
||||||
|
|
||||||
|
nfs_fattr_init(fattr);
|
||||||
|
|
||||||
|
dprintk("NFS call lookupfh %s\n", name->name);
|
||||||
|
status = rpc_call_sync(server->client, &msg, 0);
|
||||||
|
dprintk("NFS reply lookupfh: %d\n", status);
|
||||||
|
if (status == -NFS4ERR_MOVED)
|
||||||
|
status = -EREMOTE;
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int nfs4_proc_lookupfh(struct nfs_server *server, struct nfs_fh *dirfh,
|
||||||
|
struct qstr *name, struct nfs_fh *fhandle,
|
||||||
|
struct nfs_fattr *fattr)
|
||||||
|
{
|
||||||
|
struct nfs4_exception exception = { };
|
||||||
|
int err;
|
||||||
|
do {
|
||||||
|
err = nfs4_handle_exception(server,
|
||||||
|
_nfs4_proc_lookupfh(server, dirfh, name,
|
||||||
|
fhandle, fattr),
|
||||||
|
&exception);
|
||||||
|
} while (exception.retry);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
static int _nfs4_proc_lookup(struct inode *dir, struct qstr *name,
|
static int _nfs4_proc_lookup(struct inode *dir, struct qstr *name,
|
||||||
struct nfs_fh *fhandle, struct nfs_fattr *fattr)
|
struct nfs_fh *fhandle, struct nfs_fattr *fattr)
|
||||||
{
|
{
|
||||||
|
@ -3723,6 +3769,7 @@ struct nfs_rpc_ops nfs_v4_clientops = {
|
||||||
.getroot = nfs4_proc_get_root,
|
.getroot = nfs4_proc_get_root,
|
||||||
.getattr = nfs4_proc_getattr,
|
.getattr = nfs4_proc_getattr,
|
||||||
.setattr = nfs4_proc_setattr,
|
.setattr = nfs4_proc_setattr,
|
||||||
|
.lookupfh = nfs4_proc_lookupfh,
|
||||||
.lookup = nfs4_proc_lookup,
|
.lookup = nfs4_proc_lookup,
|
||||||
.access = nfs4_proc_access,
|
.access = nfs4_proc_access,
|
||||||
.readlink = nfs4_proc_readlink,
|
.readlink = nfs4_proc_readlink,
|
||||||
|
|
|
@ -770,6 +770,9 @@ struct nfs_rpc_ops {
|
||||||
|
|
||||||
int (*getroot) (struct nfs_server *, struct nfs_fh *,
|
int (*getroot) (struct nfs_server *, struct nfs_fh *,
|
||||||
struct nfs_fsinfo *);
|
struct nfs_fsinfo *);
|
||||||
|
int (*lookupfh)(struct nfs_server *, struct nfs_fh *,
|
||||||
|
struct qstr *, struct nfs_fh *,
|
||||||
|
struct nfs_fattr *);
|
||||||
int (*getattr) (struct nfs_server *, struct nfs_fh *,
|
int (*getattr) (struct nfs_server *, struct nfs_fh *,
|
||||||
struct nfs_fattr *);
|
struct nfs_fattr *);
|
||||||
int (*setattr) (struct dentry *, struct nfs_fattr *,
|
int (*setattr) (struct dentry *, struct nfs_fattr *,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue