Skip to content

Commit 47592fa

Browse files
bharathsm-msSteve French
authored andcommitted
SMB3: Close all deferred handles of inode in case of handle lease break
Oplock break may occur for different file handle than the deferred handle. Check for inode deferred closes list, if it's not empty then close all the deferred handles of inode because we should not cache handles if we dont have handle lease. Eg: If openfilelist has one deferred file handle and another open file handle from app for a same file, then on a lease break we choose the first handle in openfile list. The first handle in list can be deferred handle or actual open file handle from app. In case if it is actual open handle then today, we don't close deferred handles if we lose handle lease on a file. Problem with this is, later if app decides to close the existing open handle then we still be caching deferred handles until deferred close timeout. Leaving open handle may result in sharing violation when windows client tries to open a file with limited file share access. So we should check for deferred list of inode and walk through the list of deferred files in inode and close all deferred files. Fixes: 9e31678 ("SMB3: fix lease break timeout when multiple deferred close handles for the same file.") Cc: stable@kernel.org Signed-off-by: Bharath SM <bharathsm@microsoft.com> Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent f1fcbaa commit 47592fa

File tree

1 file changed

+1
-8
lines changed

1 file changed

+1
-8
lines changed

fs/cifs/file.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4882,8 +4882,6 @@ void cifs_oplock_break(struct work_struct *work)
48824882
struct TCP_Server_Info *server = tcon->ses->server;
48834883
int rc = 0;
48844884
bool purge_cache = false;
4885-
struct cifs_deferred_close *dclose;
4886-
bool is_deferred = false;
48874885

48884886
wait_on_bit(&cinode->flags, CIFS_INODE_PENDING_WRITERS,
48894887
TASK_UNINTERRUPTIBLE);
@@ -4924,14 +4922,9 @@ void cifs_oplock_break(struct work_struct *work)
49244922
* file handles but cached, then schedule deferred close immediately.
49254923
* So, new open will not use cached handle.
49264924
*/
4927-
spin_lock(&CIFS_I(inode)->deferred_lock);
4928-
is_deferred = cifs_is_deferred_close(cfile, &dclose);
4929-
spin_unlock(&CIFS_I(inode)->deferred_lock);
49304925

4931-
if (!CIFS_CACHE_HANDLE(cinode) && is_deferred &&
4932-
cfile->deferred_close_scheduled && delayed_work_pending(&cfile->deferred)) {
4926+
if (!CIFS_CACHE_HANDLE(cinode) && !list_empty(&cinode->deferred_closes))
49334927
cifs_close_deferred_file(cinode);
4934-
}
49354928

49364929
/*
49374930
* releasing stale oplock after recent reconnect of smb session using

0 commit comments

Comments
 (0)