| From foo@baz Mon Sep 17 12:33:31 CEST 2018 |
| From: Trond Myklebust <trond.myklebust@hammerspace.com> |
| Date: Thu, 12 Jul 2018 14:19:03 -0400 |
| Subject: NFSv4.1: Fix a potential layoutget/layoutrecall deadlock |
| |
| From: Trond Myklebust <trond.myklebust@hammerspace.com> |
| |
| [ Upstream commit bd3d16a887b0c19a2a20d35ffed499e3a3637feb ] |
| |
| If the client is sending a layoutget, but the server issues a callback |
| to recall what it thinks may be an outstanding layout, then we may find |
| an uninitialised layout attached to the inode due to the layoutget. |
| In that case, it is appropriate to return NFS4ERR_NOMATCHING_LAYOUT |
| rather than NFS4ERR_DELAY, as the latter can end up deadlocking. |
| |
| Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/nfs/callback_proc.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/fs/nfs/callback_proc.c |
| +++ b/fs/nfs/callback_proc.c |
| @@ -213,9 +213,9 @@ static u32 pnfs_check_callback_stateid(s |
| { |
| u32 oldseq, newseq; |
| |
| - /* Is the stateid still not initialised? */ |
| + /* Is the stateid not initialised? */ |
| if (!pnfs_layout_is_valid(lo)) |
| - return NFS4ERR_DELAY; |
| + return NFS4ERR_NOMATCHING_LAYOUT; |
| |
| /* Mismatched stateid? */ |
| if (!nfs4_stateid_match_other(&lo->plh_stateid, new)) |