diff options
Diffstat (limited to 'fs/nfs/write.c')
| -rw-r--r-- | fs/nfs/write.c | 31 | 
1 files changed, 29 insertions, 2 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index e560a78995a..ce728829f79 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -25,6 +25,7 @@  #include "delegation.h"  #include "internal.h"  #include "iostat.h" +#include "nfs4_fs.h"  #define NFSDBG_FACILITY		NFSDBG_PAGECACHE @@ -52,6 +53,7 @@ struct nfs_write_data *nfs_commitdata_alloc(void)  	if (p) {  		memset(p, 0, sizeof(*p));  		INIT_LIST_HEAD(&p->pages); +		p->res.seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE;  	}  	return p;  } @@ -71,6 +73,7 @@ struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount)  		memset(p, 0, sizeof(*p));  		INIT_LIST_HEAD(&p->pages);  		p->npages = pagecount; +		p->res.seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE;  		if (pagecount <= ARRAY_SIZE(p->page_array))  			p->pagevec = p->page_array;  		else { @@ -1048,7 +1051,23 @@ out:  	nfs_writedata_release(calldata);  } +#if defined(CONFIG_NFS_V4_1) +void nfs_write_prepare(struct rpc_task *task, void *calldata) +{ +	struct nfs_write_data *data = calldata; +	struct nfs_client *clp = (NFS_SERVER(data->inode))->nfs_client; + +	if (nfs4_setup_sequence(clp, &data->args.seq_args, +				&data->res.seq_res, 1, task)) +		return; +	rpc_call_start(task); +} +#endif /* CONFIG_NFS_V4_1 */ +  static const struct rpc_call_ops nfs_write_partial_ops = { +#if defined(CONFIG_NFS_V4_1) +	.rpc_call_prepare = nfs_write_prepare, +#endif /* CONFIG_NFS_V4_1 */  	.rpc_call_done = nfs_writeback_done_partial,  	.rpc_release = nfs_writeback_release_partial,  }; @@ -1111,6 +1130,9 @@ remove_request:  }  static const struct rpc_call_ops nfs_write_full_ops = { +#if defined(CONFIG_NFS_V4_1) +	.rpc_call_prepare = nfs_write_prepare, +#endif /* CONFIG_NFS_V4_1 */  	.rpc_call_done = nfs_writeback_done_full,  	.rpc_release = nfs_writeback_release_full,  }; @@ -1123,6 +1145,7 @@ int nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)  {  	struct nfs_writeargs	*argp = &data->args;  	struct nfs_writeres	*resp = &data->res; +	struct nfs_server	*server = NFS_SERVER(data->inode);  	int status;  	dprintk("NFS: %5u nfs_writeback_done (status %d)\n", @@ -1155,7 +1178,7 @@ int nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)  		if (time_before(complain, jiffies)) {  			dprintk("NFS:       faulty NFS server %s:"  				" (committed = %d) != (stable = %d)\n", -				NFS_SERVER(data->inode)->nfs_client->cl_hostname, +				server->nfs_client->cl_hostname,  				resp->verf->committed, argp->stable);  			complain = jiffies + 300 * HZ;  		} @@ -1181,7 +1204,7 @@ int nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)  				 */  				argp->stable = NFS_FILE_SYNC;  			} -			rpc_restart_call(task); +			nfs4_restart_rpc(task, server->nfs_client);  			return -EAGAIN;  		}  		if (time_before(complain, jiffies)) { @@ -1193,6 +1216,7 @@ int nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)  		/* Can't do anything about it except throw an error. */  		task->tk_status = -EIO;  	} +	nfs4_sequence_free_slot(server->nfs_client, &data->res.seq_res);  	return 0;  } @@ -1349,6 +1373,9 @@ static void nfs_commit_release(void *calldata)  }  static const struct rpc_call_ops nfs_commit_ops = { +#if defined(CONFIG_NFS_V4_1) +	.rpc_call_prepare = nfs_write_prepare, +#endif /* CONFIG_NFS_V4_1 */  	.rpc_call_done = nfs_commit_done,  	.rpc_release = nfs_commit_release,  };  | 
