The file layout driver could send the wrong data structure to the MDS on a commit split between DS and MDS. Signed-off-by: Fred Isaman <iisaman@xxxxxxxxxx> --- fs/nfs/nfs4filelayout.c | 15 +++++++++++++-- 1 files changed, 13 insertions(+), 2 deletions(-) diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c index 055816a..fb0efda 100644 --- a/fs/nfs/nfs4filelayout.c +++ b/fs/nfs/nfs4filelayout.c @@ -497,6 +497,7 @@ filelayout_commit(struct nfs_write_data *data, int sync) struct list_head **ds_page_list = NULL; u16 *indices_used; int num_indices_seen = 0; + bool used_mds = false; const struct rpc_call_ops *call_ops; struct rpc_clnt *clnt; struct nfs_write_data **clone_list = NULL; @@ -546,11 +547,21 @@ filelayout_commit(struct nfs_write_data *data, int sync) if (!clone_list) goto mem_error; for (i = 0; i < num_indices_seen - 1; i++) { + if (indices_used[i] == NFS4_PNFS_MAX_MULTI_CNT) { + used_mds = true; + clone_list[i] = data; + } else { + clone_list[i] = filelayout_clone_write_data(data); + if (!clone_list[i]) + goto mem_error; + } + } + if (used_mds) { clone_list[i] = filelayout_clone_write_data(data); if (!clone_list[i]) goto mem_error; - } - clone_list[i] = data; + } else + clone_list[i] = data; /* * Now send off the RPCs to each ds. Note that it is important * that any RPC to the MDS be sent last (or at least after all -- 1.7.2.1 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html