Commit da787d5b authored by Bharath SM's avatar Bharath SM Committed by Steve French

SMB3: Do not send lease break acknowledgment if all file handles have been closed

In case if all existing file handles are deferred handles and if all of
them gets closed due to handle lease break then we dont need to send
lease break acknowledgment to server, because last handle close will be
considered as lease break ack.
After closing deferred handels, we check for openfile list of inode,
if its empty then we skip sending lease break ack.

Fixes: 59a556ae ("SMB3: drop reference to cfile before sending oplock break")
Reviewed-by: default avatarTom Talpey <tom@talpey.com>
Signed-off-by: default avatarBharath SM <bharathsm@microsoft.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 45a3e24f
...@@ -4936,20 +4936,19 @@ void cifs_oplock_break(struct work_struct *work) ...@@ -4936,20 +4936,19 @@ void cifs_oplock_break(struct work_struct *work)
_cifsFileInfo_put(cfile, false /* do not wait for ourself */, false); _cifsFileInfo_put(cfile, false /* do not wait for ourself */, false);
/* /*
* releasing stale oplock after recent reconnect of smb session using * MS-SMB2 3.2.5.19.1 and 3.2.5.19.2 (and MS-CIFS 3.2.5.42) do not require
* a now incorrect file handle is not a data integrity issue but do * an acknowledgment to be sent when the file has already been closed.
* not bother sending an oplock release if session to server still is * check for server null, since can race with kill_sb calling tree disconnect.
* disconnected since oplock already released by the server
*/ */
if (!oplock_break_cancelled) { spin_lock(&cinode->open_file_lock);
/* check for server null since can race with kill_sb calling tree disconnect */ if (tcon->ses && tcon->ses->server && !oplock_break_cancelled &&
if (tcon->ses && tcon->ses->server) { !list_empty(&cinode->openFileList)) {
spin_unlock(&cinode->open_file_lock);
rc = tcon->ses->server->ops->oplock_response(tcon, persistent_fid, rc = tcon->ses->server->ops->oplock_response(tcon, persistent_fid,
volatile_fid, net_fid, cinode); volatile_fid, net_fid, cinode);
cifs_dbg(FYI, "Oplock release rc = %d\n", rc); cifs_dbg(FYI, "Oplock release rc = %d\n", rc);
} else } else
pr_warn_once("lease break not sent for unmounted share\n"); spin_unlock(&cinode->open_file_lock);
}
cifs_done_oplock_break(cinode); cifs_done_oplock_break(cinode);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment