Reviewed-by: Cheng Jian cj.chengjian@huawei.com
在 2021/10/23 20:55, smilezhangs 写道:
From: Trond Myklebust trond.myklebust@hammerspace.com
stable inclusion from stable-v5.10.44 commit d973bd0d6e7f9b4ea976cc619e8d6e0d235b9056 bugzilla: https://bugzilla.openeuler.org/show_bug.cgi?id=462 CVE: NA
commit c3aba897c6e67fa464ec02b1f17911577d619713 upstream.
If the inode is being evicted but has to return a layout first, then that too can cause a deadlock in the corner case where the server reboots.
Signed-off-by: Trond Myklebust trond.myklebust@hammerspace.com Signed-off-by: Greg Kroah-Hartman gregkh@linuxfoundation.org Signed-off-by: Hang haihangyiyuan@163.com Reviewed-by: Jian Cheng <cj.chengjian(a)huawei.com> Signed-off-by: Wang ShaoBo bobo.shaobowang@huawei.com
fs/nfs/nfs4proc.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index c92d6ff0fcea..eedcbe6832fb 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -9619,15 +9619,20 @@ int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync) &task_setup_data.rpc_client, &msg);
dprintk("--> %s\n", __func__);
- lrp->inode = nfs_igrab_and_active(lrp->args.inode); if (!sync) {
if (!lrp->inode) { nfs4_layoutreturn_release(lrp); return -EAGAIN; } task_setup_data.flags |= RPC_TASK_ASYNC; }lrp->inode = nfs_igrab_and_active(lrp->args.inode);
- nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1, 0);
- if (!lrp->inode)
nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1,
1);
- else
nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1,
task = rpc_run_task(&task_setup_data); if (IS_ERR(task)) return PTR_ERR(task);0);