From 5dd3ef1e8c13a0d98476d46d0e2d005b88622626 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Fri, 7 Oct 2011 10:31:24 -0400 Subject: [PATCH] limit retries on WRITE/COMMIT verifier mismatch Signed-off-by: Casey Bodley --- daemon/readwrite.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/daemon/readwrite.c b/daemon/readwrite.c index b81aca0..b61e507 100644 --- a/daemon/readwrite.c +++ b/daemon/readwrite.c @@ -34,6 +34,10 @@ #include "util.h" +/* number of times to retry on write/commit verifier mismatch */ +#define MAX_WRITE_RETRIES 6 + + const stateid4 special_read_stateid = {0xffffffff, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; @@ -184,6 +188,8 @@ static int write_to_mds( const uint32_t maxwritesize = max_write_size(session, &file->fh); uint32_t to_send, reloffset, len; int status = 0; + /* on write verifier mismatch, retry N times before failing */ + uint32_t retries = MAX_WRITE_RETRIES; retry_write: p = args->buffer; @@ -212,8 +218,10 @@ retry_write: status = 0; break; } - if (!verify_write(&verf, &committed)) - goto retry_write; + if (!verify_write(&verf, &committed)) { + if (retries--) goto retry_write; + goto out_verify_failed; + } } if (committed == UNSTABLE4) { dprintf(1, "sending COMMIT for offset=%d and len=%d\n", args->offset, len); @@ -221,12 +229,19 @@ retry_write: if (status) goto out; - if (!verify_commit(&verf)) - goto retry_write; + if (!verify_commit(&verf)) { + if (retries--) goto retry_write; + goto out_verify_failed; + } } out: args->out_len = len; return nfs_to_windows_error(status, ERROR_NET_WRITE_FAULT); + +out_verify_failed: + len = 0; + status = NFS4ERR_IO; + goto out; } static int write_to_pnfs(