summaryrefslogtreecommitdiffstats
path: root/fs/nfs/pnfs.c
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2012-09-18 23:01:12 +0200
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-09-28 22:03:09 +0200
commit25c7533357a4c4a9311d40cc92e9648c8a7e763e (patch)
treee38cc8e24d50ba9390dc669b448e8bb644def788 /fs/nfs/pnfs.c
parentNFSv4.1: Add helpers for setting/reading the I/O fail bit (diff)
downloadlinux-25c7533357a4c4a9311d40cc92e9648c8a7e763e.tar.xz
linux-25c7533357a4c4a9311d40cc92e9648c8a7e763e.zip
NFSv4.1: Retry pNFS after a 2 minute timeout
If we had to fall back to read/write through MDS, then assume that we should retry pNFS after a suitable timeout period. The following patch sets a timeout of 2 minutes. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/pnfs.c')
-rw-r--r--fs/nfs/pnfs.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index f46f9bc4f767..2c59da5511db 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -35,6 +35,7 @@
#include "iostat.h"
#define NFSDBG_FACILITY NFSDBG_PNFS
+#define PNFS_LAYOUTGET_RETRY_TIMEOUT (120*HZ)
/* Locking:
*
@@ -248,6 +249,7 @@ pnfs_iomode_to_fail_bit(u32 iomode)
static void
pnfs_layout_io_set_failed(struct pnfs_layout_hdr *lo, u32 iomode)
{
+ lo->plh_retry_timestamp = jiffies;
set_bit(pnfs_iomode_to_fail_bit(iomode), &lo->plh_flags);
dprintk("%s Setting layout IOMODE_%s fail bit\n", __func__,
iomode == IOMODE_RW ? "RW" : "READ");
@@ -256,7 +258,18 @@ pnfs_layout_io_set_failed(struct pnfs_layout_hdr *lo, u32 iomode)
static bool
pnfs_layout_io_test_failed(struct pnfs_layout_hdr *lo, u32 iomode)
{
- return test_bit(pnfs_iomode_to_fail_bit(iomode), &lo->plh_flags) != 0;
+ unsigned long start, end;
+ if (test_bit(pnfs_iomode_to_fail_bit(iomode), &lo->plh_flags) == 0)
+ return false;
+ end = jiffies;
+ start = end - PNFS_LAYOUTGET_RETRY_TIMEOUT;
+ if (!time_in_range(lo->plh_retry_timestamp, start, end)) {
+ /* It is time to retry the failed layoutgets */
+ clear_bit(NFS_LAYOUT_RW_FAILED, &lo->plh_flags);
+ clear_bit(NFS_LAYOUT_RO_FAILED, &lo->plh_flags);
+ return false;
+ }
+ return true;
}
static void