lkml.org 
[lkml]   [2006]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 08/30] NFS: Add a lookupfh NFS RPC op [try #11]
    Date
    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>
    ---

    fs/nfs/nfs4proc.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
    include/linux/nfs_xdr.h | 3 +++
    2 files changed, 50 insertions(+), 0 deletions(-)

    diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
    index eff6043..7fa2938 100644
    --- a/fs/nfs/nfs4proc.c
    +++ b/fs/nfs/nfs4proc.c
    @@ -1583,6 +1583,52 @@ nfs4_proc_setattr(struct dentry *dentry,
    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,
    struct nfs_fh *fhandle, struct nfs_fattr *fattr)
    {
    @@ -3698,6 +3744,7 @@ struct nfs_rpc_ops nfs_v4_clientops = {
    .getroot = nfs4_proc_get_root,
    .getattr = nfs4_proc_getattr,
    .setattr = nfs4_proc_setattr,
    + .lookupfh = nfs4_proc_lookupfh,
    .lookup = nfs4_proc_lookup,
    .access = nfs4_proc_access,
    .readlink = nfs4_proc_readlink,
    diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
    index 2d3fb64..be80310 100644
    --- a/include/linux/nfs_xdr.h
    +++ b/include/linux/nfs_xdr.h
    @@ -770,6 +770,9 @@ struct nfs_rpc_ops {

    int (*getroot) (struct nfs_server *, struct nfs_fh *,
    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 *,
    struct nfs_fattr *);
    int (*setattr) (struct dentry *, struct nfs_fattr *,
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2006-07-27 22:55    [W:0.030 / U:0.048 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site