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

SMB3: Close deferred file handles in case of handle lease break

We should not cache deferred file handles if we dont have
handle lease on a file. And we should immediately close all
deferred handles in case of handle lease break.

Fixes: 9e31678f ("SMB3: fix lease break timeout when multiple deferred close handles for the same file.")
Signed-off-by: default avatarBharath SM <bharathsm@microsoft.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent ab9ddc87
...@@ -4882,6 +4882,8 @@ void cifs_oplock_break(struct work_struct *work) ...@@ -4882,6 +4882,8 @@ void cifs_oplock_break(struct work_struct *work)
struct TCP_Server_Info *server = tcon->ses->server; struct TCP_Server_Info *server = tcon->ses->server;
int rc = 0; int rc = 0;
bool purge_cache = false; bool purge_cache = false;
struct cifs_deferred_close *dclose;
bool is_deferred = false;
wait_on_bit(&cinode->flags, CIFS_INODE_PENDING_WRITERS, wait_on_bit(&cinode->flags, CIFS_INODE_PENDING_WRITERS,
TASK_UNINTERRUPTIBLE); TASK_UNINTERRUPTIBLE);
...@@ -4917,6 +4919,20 @@ void cifs_oplock_break(struct work_struct *work) ...@@ -4917,6 +4919,20 @@ void cifs_oplock_break(struct work_struct *work)
cifs_dbg(VFS, "Push locks rc = %d\n", rc); cifs_dbg(VFS, "Push locks rc = %d\n", rc);
oplock_break_ack: oplock_break_ack:
/*
* When oplock break is received and there are no active
* file handles but cached, then schedule deferred close immediately.
* So, new open will not use cached handle.
*/
spin_lock(&CIFS_I(inode)->deferred_lock);
is_deferred = cifs_is_deferred_close(cfile, &dclose);
spin_unlock(&CIFS_I(inode)->deferred_lock);
if (!CIFS_CACHE_HANDLE(cinode) && is_deferred &&
cfile->deferred_close_scheduled && delayed_work_pending(&cfile->deferred)) {
cifs_close_deferred_file(cinode);
}
/* /*
* releasing stale oplock after recent reconnect of smb session using * releasing stale oplock after recent reconnect of smb session using
* a now incorrect file handle is not a data integrity issue but do * a now incorrect file handle is not a data integrity issue but do
......
...@@ -764,7 +764,7 @@ cifs_close_deferred_file(struct cifsInodeInfo *cifs_inode) ...@@ -764,7 +764,7 @@ cifs_close_deferred_file(struct cifsInodeInfo *cifs_inode)
spin_unlock(&cifs_inode->open_file_lock); spin_unlock(&cifs_inode->open_file_lock);
list_for_each_entry_safe(tmp_list, tmp_next_list, &file_head, list) { list_for_each_entry_safe(tmp_list, tmp_next_list, &file_head, list) {
_cifsFileInfo_put(tmp_list->cfile, true, false); _cifsFileInfo_put(tmp_list->cfile, false, false);
list_del(&tmp_list->list); list_del(&tmp_list->list);
kfree(tmp_list); kfree(tmp_list);
} }
......
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