提交 93b7f7ad 编写于 作者: O Olga Kornievskaia 提交者: Trond Myklebust

skip LAYOUTRETURN if layout is invalid

Currently, when IO to DS fails, client returns the layout and
retries against the MDS. However, then on umounting (inode eviction)
it returns the layout again.

This is because pnfs_return_layout() was changed in
commit d78471d3 ("pnfs/blocklayout: set PNFS_LAYOUTRETURN_ON_ERROR")
to always set NFS_LAYOUT_RETURN_REQUESTED so even if we returned
the layout, it will be returned again. Instead, let's also check
if we have already marked the layout invalid.
Signed-off-by: NOlga Kornievskaia <kolga@netapp.com>
Signed-off-by: NTrond Myklebust <trond.myklebust@hammerspace.com>
上级 f9312a54
...@@ -1211,7 +1211,7 @@ _pnfs_return_layout(struct inode *ino) ...@@ -1211,7 +1211,7 @@ _pnfs_return_layout(struct inode *ino)
LIST_HEAD(tmp_list); LIST_HEAD(tmp_list);
nfs4_stateid stateid; nfs4_stateid stateid;
int status = 0; int status = 0;
bool send; bool send, valid_layout;
dprintk("NFS: %s for inode %lu\n", __func__, ino->i_ino); dprintk("NFS: %s for inode %lu\n", __func__, ino->i_ino);
...@@ -1232,6 +1232,7 @@ _pnfs_return_layout(struct inode *ino) ...@@ -1232,6 +1232,7 @@ _pnfs_return_layout(struct inode *ino)
goto out_put_layout_hdr; goto out_put_layout_hdr;
spin_lock(&ino->i_lock); spin_lock(&ino->i_lock);
} }
valid_layout = pnfs_layout_is_valid(lo);
pnfs_clear_layoutcommit(ino, &tmp_list); pnfs_clear_layoutcommit(ino, &tmp_list);
pnfs_mark_matching_lsegs_invalid(lo, &tmp_list, NULL, 0); pnfs_mark_matching_lsegs_invalid(lo, &tmp_list, NULL, 0);
...@@ -1245,7 +1246,8 @@ _pnfs_return_layout(struct inode *ino) ...@@ -1245,7 +1246,8 @@ _pnfs_return_layout(struct inode *ino)
} }
/* Don't send a LAYOUTRETURN if list was initially empty */ /* Don't send a LAYOUTRETURN if list was initially empty */
if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags)) { if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags) ||
!valid_layout) {
spin_unlock(&ino->i_lock); spin_unlock(&ino->i_lock);
dprintk("NFS: %s no layout segments to return\n", __func__); dprintk("NFS: %s no layout segments to return\n", __func__);
goto out_put_layout_hdr; goto out_put_layout_hdr;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册