NFSv4.1: Send lseg down into nfs_write_rpcsetup
authorFred Isaman <iisaman@netapp.com>
Thu, 3 Mar 2011 15:13:43 +0000 (15:13 +0000)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 11 Mar 2011 20:38:44 +0000 (15:38 -0500)
We grab the lseg sent in from the doio function and attach it to
each struct nfs_write_data created.  This is how the lseg will be
sent to the layout driver.

Signed-off-by: Fred Isaman <iisaman@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/write.c
include/linux/nfs_xdr.h

index ae035990941a1d69d7440935af12aee45020bb88..72b0ec0bb0e12b711ee0a26d9efeced04d57d01c 100644 (file)
@@ -97,6 +97,7 @@ void nfs_writedata_free(struct nfs_write_data *p)
 
 static void nfs_writedata_release(struct nfs_write_data *wdata)
 {
+       put_lseg(wdata->lseg);
        put_nfs_open_context(wdata->args.context);
        nfs_writedata_free(wdata);
 }
@@ -840,6 +841,7 @@ static int nfs_write_rpcsetup(struct nfs_page *req,
                struct nfs_write_data *data,
                const struct rpc_call_ops *call_ops,
                unsigned int count, unsigned int offset,
+               struct pnfs_layout_segment *lseg,
                int how)
 {
        struct inode *inode = req->wb_context->path.dentry->d_inode;
@@ -850,6 +852,7 @@ static int nfs_write_rpcsetup(struct nfs_page *req,
        data->req = req;
        data->inode = inode = req->wb_context->path.dentry->d_inode;
        data->cred = req->wb_context->cred;
+       data->lseg = get_lseg(lseg);
 
        data->args.fh     = NFS_FH(inode);
        data->args.offset = req_offset(req) + offset;
@@ -930,7 +933,7 @@ static int nfs_flush_multi(struct inode *inode, struct list_head *head, unsigned
                if (nbytes < wsize)
                        wsize = nbytes;
                ret2 = nfs_write_rpcsetup(req, data, &nfs_write_partial_ops,
-                                  wsize, offset, how);
+                                         wsize, offset, lseg, how);
                if (ret == 0)
                        ret = ret2;
                offset += wsize;
@@ -978,7 +981,7 @@ static int nfs_flush_one(struct inode *inode, struct list_head *head, unsigned i
        req = nfs_list_entry(data->pages.next);
 
        /* Set up the argument struct */
-       return nfs_write_rpcsetup(req, data, &nfs_write_full_ops, count, 0, how);
+       return nfs_write_rpcsetup(req, data, &nfs_write_full_ops, count, 0, lseg, how);
  out_bad:
        while (!list_empty(head)) {
                req = nfs_list_entry(head->next);
index 21cd41ddbca62506efbf5f7c3749ea1b86ff4352..09d96812d6d0fcd373b86aca7ef496a2a45a25de 100644 (file)
@@ -1038,6 +1038,7 @@ struct nfs_write_data {
        unsigned int            npages;         /* Max length of pagevec */
        struct nfs_writeargs    args;           /* argument struct */
        struct nfs_writeres     res;            /* result struct */
+       struct pnfs_layout_segment *lseg;
        int (*write_done_cb) (struct rpc_task *task, struct nfs_write_data *data);
 #ifdef CONFIG_NFS_V4
        unsigned long           timestamp;      /* For lease renewal */