|
@@ -25,6 +25,7 @@
|
|
|
#include "delegation.h"
|
|
|
#include "internal.h"
|
|
|
#include "iostat.h"
|
|
|
+#include "nfs4_fs.h"
|
|
|
|
|
|
#define NFSDBG_FACILITY NFSDBG_PAGECACHE
|
|
|
|
|
@@ -1050,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,
|
|
|
};
|
|
@@ -1113,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,
|
|
|
};
|
|
@@ -1195,6 +1215,8 @@ 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(NFS_SERVER(data->inode)->nfs_client,
|
|
|
+ &data->res.seq_res);
|
|
|
return 0;
|
|
|
}
|
|
|
|