diff options
author | Pavel Shilovsky <piastryyy@gmail.com> | 2019-09-30 10:06:18 -0700 |
---|---|---|
committer | Steve French <stfrench@microsoft.com> | 2019-10-06 22:05:28 -0500 |
commit | 30573a82fb179420b8aac30a3a3595aa96a93156 (patch) | |
tree | 465cf0eacea3c63ad6d8ddb6485ecefef3825641 /fs | |
parent | cb248819d209d113e45fed459773991518e8e80b (diff) | |
download | linux-30573a82fb179420b8aac30a3a3595aa96a93156.tar.gz linux-30573a82fb179420b8aac30a3a3595aa96a93156.tar.bz2 linux-30573a82fb179420b8aac30a3a3595aa96a93156.zip |
CIFS: Gracefully handle QueryInfo errors during open
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>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/cifs/file.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 3758237bf951..5ad15de2bb4f 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; |