pNFS: Allow layout drivers to manage private data in struct nfs4_layoutreturn
authorTrond Myklebust <trond.myklebust@primarydata.com>
Fri, 23 Sep 2016 15:38:08 +0000 (11:38 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Sat, 3 Dec 2016 04:37:45 +0000 (23:37 -0500)
Cleanup to allow layout drivers to attach private data to layoutreturn,
and manage the data.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/nfs4proc.c
fs/nfs/nfs4xdr.c
fs/nfs/pnfs.c
include/linux/nfs_xdr.h

index 1c629f5e1ae57b5cd2a04af9d59bd73d098123c2..f992281c9b29c2e02401d8af6228b6a2d6a9641d 100644 (file)
@@ -3039,6 +3039,7 @@ struct nfs4_closedata {
        struct {
                struct nfs4_layoutreturn_args arg;
                struct nfs4_layoutreturn_res res;
+               struct nfs4_xdr_opaque_data ld_private;
                u32 roc_barrier;
                bool roc;
        } lr;
@@ -3267,6 +3268,7 @@ int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int wait)
        if (IS_ERR(calldata->arg.seqid))
                goto out_free_calldata;
        calldata->arg.fmode = 0;
+       calldata->lr.arg.ld_private = &calldata->lr.ld_private;
        calldata->res.fattr = &calldata->fattr;
        calldata->res.seqid = calldata->arg.seqid;
        calldata->res.server = server;
@@ -5599,6 +5601,7 @@ struct nfs4_delegreturndata {
        struct {
                struct nfs4_layoutreturn_args arg;
                struct nfs4_layoutreturn_res res;
+               struct nfs4_xdr_opaque_data ld_private;
                u32 roc_barrier;
                bool roc;
        } lr;
@@ -5735,6 +5738,7 @@ static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, co
        data->res.fattr = &data->fattr;
        data->res.server = server;
        data->res.lr_ret = -NFS4ERR_NOMATCHING_LAYOUT;
+       data->lr.arg.ld_private = &data->lr.ld_private;
        nfs_fattr_init(data->res.fattr);
        data->timestamp = jiffies;
        data->rpc_status = 0;
@@ -8633,6 +8637,8 @@ static void nfs4_layoutreturn_release(void *calldata)
        nfs4_sequence_free_slot(&lrp->res.seq_res);
        pnfs_put_layout_hdr(lrp->args.layout);
        nfs_iput_and_deactive(lrp->inode);
+       if (lrp->ld_private.ops && lrp->ld_private.ops->free)
+               lrp->ld_private.ops->free(&lrp->ld_private);
        kfree(calldata);
        dprintk("<-- %s\n", __func__);
 }
index 84fdcf27138c1ae128ca234ba90c99187a597fe4..1c1768a8fcd15ef5cc606686b49ee33f30223f39 100644 (file)
@@ -2035,7 +2035,9 @@ encode_layoutreturn(struct xdr_stream *xdr,
        spin_lock(&args->inode->i_lock);
        encode_nfs4_stateid(xdr, &args->stateid);
        spin_unlock(&args->inode->i_lock);
-       if (lr_ops->encode_layoutreturn)
+       if (args->ld_private->ops && args->ld_private->ops->encode)
+               args->ld_private->ops->encode(xdr, args, args->ld_private);
+       else if (lr_ops->encode_layoutreturn)
                lr_ops->encode_layoutreturn(xdr, args);
        else
                encode_uint32(xdr, 0);
index 0b25a1c820ba523ede716903e1eb7f06657ef0aa..4631d15227ae20b65fd1fc395ccfa7194939745c 100644 (file)
@@ -1086,6 +1086,7 @@ pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo, const nfs4_stateid *stateid,
        }
 
        pnfs_init_layoutreturn_args(&lrp->args, lo, stateid, iomode);
+       lrp->args.ld_private = &lrp->ld_private;
        lrp->clp = NFS_SERVER(ino)->nfs_client;
        lrp->cred = lo->plh_lc_cred;
 
index 331a3200eb0134fb85f793c6f4a69208ded1232b..b64177d669fd938a4e419f823ea1b5e188691170 100644 (file)
@@ -320,6 +320,7 @@ struct nfs4_layoutreturn_args {
        struct pnfs_layout_range range;
        nfs4_stateid stateid;
        __u32   layout_type;
+       struct nfs4_xdr_opaque_data *ld_private;
 };
 
 struct nfs4_layoutreturn_res {
@@ -335,6 +336,7 @@ struct nfs4_layoutreturn {
        struct nfs_client *clp;
        struct inode *inode;
        int rpc_status;
+       struct nfs4_xdr_opaque_data ld_private;
 };
 
 #define PNFS_LAYOUTSTATS_MAXSIZE 256