[v3,1/1] PNFS dont retry some error when MDS=DS
diff mbox

Message ID 20170315200215.43997-1-kolga@netapp.com
State New
Headers show

Commit Message

Olga Kornievskaia March 15, 2017, 8:02 p.m. UTC
If we sent an operation to the "DS" and got an error, the code resends
to "MDS" but when they are the same, it gets the same error and goes
into the infinite loop. Example was COMMIT getting EACCES.

Since some setups like ONTAP where each node in the cluster is MDS and
DS need to check if MDS=DS based on if clientids are the same.

Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
 fs/nfs/filelayout/filelayout.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff mbox

diff --git a/fs/nfs/filelayout/filelayout.c b/fs/nfs/filelayout/filelayout.c
index 44347f4..e1d9bea 100644
--- a/fs/nfs/filelayout/filelayout.c
+++ b/fs/nfs/filelayout/filelayout.c
@@ -207,6 +207,10 @@  static int filelayout_async_handle_error(struct rpc_task *task,
 		/* fall through */
+		if (clp->cl_exchange_flags & EXCHGID4_FLAG_USE_PNFS_MDS &&
+			clp->cl_exchange_flags & EXCHGID4_FLAG_USE_PNFS_DS &&
+			clp->cl_clientid == mds_client->cl_clientid)
+			return task->tk_status;
 		dprintk("%s Retry through MDS. Error %d\n", __func__,
 		return -NFS4ERR_RESET_TO_MDS;
@@ -384,9 +388,10 @@  static int filelayout_commit_done_cb(struct rpc_task *task,
 		return -EAGAIN;
-	pnfs_set_layoutcommit(data->inode, data->lseg, data->lwb);
+	if (!err)
+		pnfs_set_layoutcommit(data->inode, data->lseg, data->lwb);
-	return 0;
+	return err;
 static void filelayout_write_prepare(struct rpc_task *task, void *data)