Skip to content

Commit 0ab95c2

Browse files
rohiths-msftsmfrench
authored andcommitted
Defer close only when lease is enabled.
When smb2 lease parameter is disabled on server. Server grants batch oplock instead of RHW lease by default on open, inode page cache needs to be zapped immediatley upon close as cache is not valid. Signed-off-by: Rohith Surabattula <rohiths@microsoft.com> Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent 860b69a commit 0ab95c2

3 files changed

Lines changed: 4 additions & 0 deletions

File tree

fs/cifs/cifsglob.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1417,6 +1417,7 @@ struct cifsInodeInfo {
14171417
struct inode vfs_inode;
14181418
struct list_head deferred_closes; /* list of deferred closes */
14191419
spinlock_t deferred_lock; /* protection on deferred list */
1420+
bool lease_granted; /* Flag to indicate whether lease or oplock is granted. */
14201421
};
14211422

14221423
static inline struct cifsInodeInfo *

fs/cifs/file.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -896,6 +896,7 @@ int cifs_close(struct inode *inode, struct file *file)
896896
file->private_data = NULL;
897897
dclose = kmalloc(sizeof(struct cifs_deferred_close), GFP_KERNEL);
898898
if ((cinode->oplock == CIFS_CACHE_RHW_FLG) &&
899+
cinode->lease_granted &&
899900
dclose) {
900901
if (test_bit(CIFS_INO_MODIFIED_ATTR, &cinode->flags))
901902
inode->i_ctime = inode->i_mtime = current_time(inode);

fs/cifs/smb2ops.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3983,6 +3983,7 @@ smb2_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
39833983
unsigned int epoch, bool *purge_cache)
39843984
{
39853985
oplock &= 0xFF;
3986+
cinode->lease_granted = false;
39863987
if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
39873988
return;
39883989
if (oplock == SMB2_OPLOCK_LEVEL_BATCH) {
@@ -4009,6 +4010,7 @@ smb21_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
40094010
unsigned int new_oplock = 0;
40104011

40114012
oplock &= 0xFF;
4013+
cinode->lease_granted = true;
40124014
if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
40134015
return;
40144016

0 commit comments

Comments
 (0)