This is a nontrivial change to the NFS client.
This patch does for the async WRITE and COMMIT paths what patch 14
did for the async READ path, by changing 'struct nfs_write_data'
so that the v2- and v3-specific parts are moved into a private area,
with room for a v4-specific part in parallel. None of the logic is
changed.
--- old/fs/nfs/write.c Sat Aug 10 23:12:28 2002
+++ new/fs/nfs/write.c Sat Aug 10 23:12:22 2002
@@ -72,12 +72,19 @@ struct nfs_write_data {
struct rpc_task task;
struct inode *inode;
struct rpc_cred *cred;
- struct nfs_writeargs args; /* argument struct */
- struct nfs_writeres res; /* result struct */
struct nfs_fattr fattr;
struct nfs_writeverf verf;
struct list_head pages; /* Coalesced requests we wish to flush */
struct page *pagevec[NFS_WRITE_MAXIOV];
+ union {
+ struct {
+ struct nfs_writeargs args;
+ struct nfs_writeres res;
+ } v3;
+#ifdef CONFIG_NFS_V4
+ /* NFSv4 data to come here... */
+#endif
+ } u;
};
/*
@@ -106,7 +113,6 @@ static __inline__ struct nfs_write_data
if (p) {
memset(p, 0, sizeof(*p));
INIT_LIST_HEAD(&p->pages);
- p->args.pages = p->pagevec;
}
return p;
}
@@ -864,10 +870,10 @@ nfs_write_rpcsetup(struct list_head *hea
/* Set up the RPC argument and reply structs
* NB: take care not to mess about with data->commit et al. */
- pages = data->args.pages;
+ pages = data->pagevec;
count = 0;
while (!list_empty(head)) {
- struct nfs_page *req = nfs_list_entry(head->next);
+ req = nfs_list_entry(head->next);
nfs_list_remove_request(req);
nfs_list_add_request(req, &data->pages);
*pages++ = req->wb_page;
@@ -876,13 +882,14 @@ nfs_write_rpcsetup(struct list_head *hea
req = nfs_list_entry(data->pages.next);
data->inode = req->wb_inode;
data->cred = req->wb_cred;
- data->args.fh = NFS_FH(req->wb_inode);
- data->args.offset = page_offset(req->wb_page) + req->wb_offset;
- data->args.pgbase = req->wb_offset;
- data->args.count = count;
- data->res.fattr = &data->fattr;
- data->res.count = count;
- data->res.verf = &data->verf;
+ data->u.v3.args.fh = NFS_FH(req->wb_inode);
+ data->u.v3.args.offset = page_offset(req->wb_page) + req->wb_offset;
+ data->u.v3.args.pgbase = req->wb_offset;
+ data->u.v3.args.pages = pages;
+ data->u.v3.args.count = count;
+ data->u.v3.res.fattr = &data->fattr;
+ data->u.v3.res.count = count;
+ data->u.v3.res.verf = &data->verf;
}
@@ -920,14 +927,14 @@ nfs_flush_one(struct list_head *head, st
/* Set up the argument struct */
nfs_write_rpcsetup(head, data);
if (nfsvers < 3)
- data->args.stable = NFS_FILE_SYNC;
+ data->u.v3.args.stable = NFS_FILE_SYNC;
else if (stable) {
if (!nfsi->ncommit)
- data->args.stable = NFS_FILE_SYNC;
+ data->u.v3.args.stable = NFS_FILE_SYNC;
else
- data->args.stable = NFS_DATA_SYNC;
+ data->u.v3.args.stable = NFS_DATA_SYNC;
} else
- data->args.stable = NFS_UNSTABLE;
+ data->u.v3.args.stable = NFS_UNSTABLE;
/* Finalize the task. */
rpc_init_task(task, clnt, nfs_writeback_done, flags);
@@ -940,16 +947,16 @@ nfs_flush_one(struct list_head *head, st
#else
msg.rpc_proc = NFSPROC_WRITE;
#endif
- msg.rpc_argp = &data->args;
- msg.rpc_resp = &data->res;
+ msg.rpc_argp = &data->u.v3.args;
+ msg.rpc_resp = &data->u.v3.res;
msg.rpc_cred = data->cred;
dprintk("NFS: %4d initiated write call (req %s/%Ld, %u bytes @ offset %Lu)\n",
task->tk_pid,
inode->i_sb->s_id,
(long long)NFS_FILEID(inode),
- (unsigned int)data->args.count,
- (unsigned long long)data->args.offset);
+ (unsigned int)data->u.v3.args.count,
+ (unsigned long long)data->u.v3.args.offset);
rpc_clnt_sigmask(clnt, &oldset);
rpc_call_setup(task, &msg, 0);
@@ -1003,8 +1010,8 @@ static void
nfs_writeback_done(struct rpc_task *task)
{
struct nfs_write_data *data = (struct nfs_write_data *) task->tk_calldata;
- struct nfs_writeargs *argp = &data->args;
- struct nfs_writeres *resp = &data->res;
+ struct nfs_writeargs *argp = &data->u.v3.args;
+ struct nfs_writeres *resp = &data->u.v3.res;
struct inode *inode = data->inode;
struct nfs_page *req;
struct page *page;
@@ -1128,11 +1135,11 @@ nfs_commit_rpcsetup(struct list_head *he
data->inode = inode;
data->cred = first->wb_cred;
- data->args.fh = NFS_FH(inode);
- data->args.offset = start;
- data->res.count = data->args.count = (u32)len;
- data->res.fattr = &data->fattr;
- data->res.verf = &data->verf;
+ data->u.v3.args.fh = NFS_FH(inode);
+ data->u.v3.args.offset = start;
+ data->u.v3.res.count = data->u.v3.args.count = (u32)len;
+ data->u.v3.res.fattr = &data->fattr;
+ data->u.v3.res.verf = &data->verf;
}
/*
@@ -1169,8 +1176,8 @@ nfs_commit_list(struct list_head *head,
task->tk_release = nfs_writedata_release;
msg.rpc_proc = NFS3PROC_COMMIT;
- msg.rpc_argp = &data->args;
- msg.rpc_resp = &data->res;
+ msg.rpc_argp = &data->u.v3.args;
+ msg.rpc_resp = &data->u.v3.res;
msg.rpc_cred = data->cred;
dprintk("NFS: %4d initiated commit call\n", task->tk_pid);
@@ -1198,7 +1205,7 @@ static void
nfs_commit_done(struct rpc_task *task)
{
struct nfs_write_data *data = (struct nfs_write_data *)task->tk_calldata;
- struct nfs_writeres *resp = &data->res;
+ struct nfs_writeres *resp = &data->u.v3.res;
struct nfs_page *req;
struct inode *inode = data->inode;
-
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/
This archive was generated by hypermail 2b29 : Thu Aug 15 2002 - 22:00:34 EST