| From 30573a82fb179420b8aac30a3a3595aa96a93156 Mon Sep 17 00:00:00 2001 |
| From: Pavel Shilovsky <piastryyy@gmail.com> |
| Date: Mon, 30 Sep 2019 10:06:18 -0700 |
| Subject: CIFS: Gracefully handle QueryInfo errors during open |
| |
| From: Pavel Shilovsky <piastryyy@gmail.com> |
| |
| commit 30573a82fb179420b8aac30a3a3595aa96a93156 upstream. |
| |
| Currently if the client identifies problems when processing |
| metadata returned in CREATE response, the open handle is being |
| leaked. This causes multiple problems like a file missing a lease |
| break by that client which causes high latencies to other clients |
| accessing the file. Another side-effect of this is that the file |
| can't be deleted. |
| |
| Fix this by closing the file after the client hits an error after |
| the file was opened and the open descriptor wasn't returned to |
| the user space. Also convert -ESTALE to -EOPENSTALE to allow |
| the VFS to revalidate a dentry and retry the open. |
| |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Pavel Shilovsky <pshilov@microsoft.com> |
| Signed-off-by: Steve French <stfrench@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/cifs/file.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| --- a/fs/cifs/file.c |
| +++ b/fs/cifs/file.c |
| @@ -252,6 +252,12 @@ cifs_nt_open(char *full_path, struct ino |
| rc = cifs_get_inode_info(&inode, full_path, buf, inode->i_sb, |
| xid, fid); |
| |
| + if (rc) { |
| + server->ops->close(xid, tcon, fid); |
| + if (rc == -ESTALE) |
| + rc = -EOPENSTALE; |
| + } |
| + |
| out: |
| kfree(buf); |
| return rc; |