| From 47fec5822f7b3081af40595c2ea2f6af770cefe6 Mon Sep 17 00:00:00 2001 |
| From: Pavel Shilovsky <piastryyy@gmail.com> |
| Date: Mon, 30 Sep 2019 10:06:18 -0700 |
| Subject: [PATCH] CIFS: Gracefully handle QueryInfo errors during open |
| |
| 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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/cifs/file.c b/fs/cifs/file.c |
| index 97090693d182..168b76de193a 100644 |
| --- a/fs/cifs/file.c |
| +++ b/fs/cifs/file.c |
| @@ -253,6 +253,12 @@ cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb, |
| 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; |
| -- |
| 2.7.4 |
| |