提交 3e621214 编写于 作者: T Trond Myklebust

NFSv4.1: Don't drop the pnfs_layout_hdr after a layoutget failure

We want to cache the pnfs_layout_hdr after a layoutget or i/o
failure so that pnfs_update_layout() can find it and know when
it is time to retry.
Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
上级 830ffb56
...@@ -247,10 +247,28 @@ pnfs_iomode_to_fail_bit(u32 iomode) ...@@ -247,10 +247,28 @@ pnfs_iomode_to_fail_bit(u32 iomode)
} }
static void static void
pnfs_layout_io_set_failed(struct pnfs_layout_hdr *lo, u32 iomode) pnfs_layout_set_fail_bit(struct pnfs_layout_hdr *lo, int fail_bit)
{ {
lo->plh_retry_timestamp = jiffies; lo->plh_retry_timestamp = jiffies;
set_bit(pnfs_iomode_to_fail_bit(iomode), &lo->plh_flags); if (test_and_set_bit(fail_bit, &lo->plh_flags))
atomic_inc(&lo->plh_refcount);
}
static void
pnfs_layout_clear_fail_bit(struct pnfs_layout_hdr *lo, int fail_bit)
{
if (test_and_clear_bit(fail_bit, &lo->plh_flags))
atomic_dec(&lo->plh_refcount);
}
static void
pnfs_layout_io_set_failed(struct pnfs_layout_hdr *lo, u32 iomode)
{
struct inode *inode = lo->plh_inode;
spin_lock(&inode->i_lock);
pnfs_layout_set_fail_bit(lo, pnfs_iomode_to_fail_bit(iomode));
spin_unlock(&inode->i_lock);
dprintk("%s Setting layout IOMODE_%s fail bit\n", __func__, dprintk("%s Setting layout IOMODE_%s fail bit\n", __func__,
iomode == IOMODE_RW ? "RW" : "READ"); iomode == IOMODE_RW ? "RW" : "READ");
} }
...@@ -259,14 +277,15 @@ static bool ...@@ -259,14 +277,15 @@ static bool
pnfs_layout_io_test_failed(struct pnfs_layout_hdr *lo, u32 iomode) pnfs_layout_io_test_failed(struct pnfs_layout_hdr *lo, u32 iomode)
{ {
unsigned long start, end; unsigned long start, end;
if (test_bit(pnfs_iomode_to_fail_bit(iomode), &lo->plh_flags) == 0) int fail_bit = pnfs_iomode_to_fail_bit(iomode);
if (test_bit(fail_bit, &lo->plh_flags) == 0)
return false; return false;
end = jiffies; end = jiffies;
start = end - PNFS_LAYOUTGET_RETRY_TIMEOUT; start = end - PNFS_LAYOUTGET_RETRY_TIMEOUT;
if (!time_in_range(lo->plh_retry_timestamp, start, end)) { if (!time_in_range(lo->plh_retry_timestamp, start, end)) {
/* It is time to retry the failed layoutgets */ /* It is time to retry the failed layoutgets */
clear_bit(NFS_LAYOUT_RW_FAILED, &lo->plh_flags); pnfs_layout_clear_fail_bit(lo, fail_bit);
clear_bit(NFS_LAYOUT_RO_FAILED, &lo->plh_flags);
return false; return false;
} }
return true; return true;
...@@ -493,9 +512,14 @@ pnfs_destroy_layout(struct nfs_inode *nfsi) ...@@ -493,9 +512,14 @@ pnfs_destroy_layout(struct nfs_inode *nfsi)
if (lo) { if (lo) {
lo->plh_block_lgets++; /* permanently block new LAYOUTGETs */ lo->plh_block_lgets++; /* permanently block new LAYOUTGETs */
pnfs_mark_matching_lsegs_invalid(lo, &tmp_list, NULL); pnfs_mark_matching_lsegs_invalid(lo, &tmp_list, NULL);
} pnfs_get_layout_hdr(lo);
spin_unlock(&nfsi->vfs_inode.i_lock); pnfs_layout_clear_fail_bit(lo, NFS_LAYOUT_RO_FAILED);
pnfs_free_lseg_list(&tmp_list); pnfs_layout_clear_fail_bit(lo, NFS_LAYOUT_RW_FAILED);
spin_unlock(&nfsi->vfs_inode.i_lock);
pnfs_free_lseg_list(&tmp_list);
pnfs_put_layout_hdr(lo);
} else
spin_unlock(&nfsi->vfs_inode.i_lock);
} }
EXPORT_SYMBOL_GPL(pnfs_destroy_layout); EXPORT_SYMBOL_GPL(pnfs_destroy_layout);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册