mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
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>
This commit is contained in:
parent
860b69a9d7
commit
0ab95c2510
@ -1417,6 +1417,7 @@ struct cifsInodeInfo {
|
|||||||
struct inode vfs_inode;
|
struct inode vfs_inode;
|
||||||
struct list_head deferred_closes; /* list of deferred closes */
|
struct list_head deferred_closes; /* list of deferred closes */
|
||||||
spinlock_t deferred_lock; /* protection on deferred list */
|
spinlock_t deferred_lock; /* protection on deferred list */
|
||||||
|
bool lease_granted; /* Flag to indicate whether lease or oplock is granted. */
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct cifsInodeInfo *
|
static inline struct cifsInodeInfo *
|
||||||
|
@ -896,6 +896,7 @@ int cifs_close(struct inode *inode, struct file *file)
|
|||||||
file->private_data = NULL;
|
file->private_data = NULL;
|
||||||
dclose = kmalloc(sizeof(struct cifs_deferred_close), GFP_KERNEL);
|
dclose = kmalloc(sizeof(struct cifs_deferred_close), GFP_KERNEL);
|
||||||
if ((cinode->oplock == CIFS_CACHE_RHW_FLG) &&
|
if ((cinode->oplock == CIFS_CACHE_RHW_FLG) &&
|
||||||
|
cinode->lease_granted &&
|
||||||
dclose) {
|
dclose) {
|
||||||
if (test_bit(CIFS_INO_MODIFIED_ATTR, &cinode->flags))
|
if (test_bit(CIFS_INO_MODIFIED_ATTR, &cinode->flags))
|
||||||
inode->i_ctime = inode->i_mtime = current_time(inode);
|
inode->i_ctime = inode->i_mtime = current_time(inode);
|
||||||
|
@ -3983,6 +3983,7 @@ smb2_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
|
|||||||
unsigned int epoch, bool *purge_cache)
|
unsigned int epoch, bool *purge_cache)
|
||||||
{
|
{
|
||||||
oplock &= 0xFF;
|
oplock &= 0xFF;
|
||||||
|
cinode->lease_granted = false;
|
||||||
if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
|
if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
|
||||||
return;
|
return;
|
||||||
if (oplock == SMB2_OPLOCK_LEVEL_BATCH) {
|
if (oplock == SMB2_OPLOCK_LEVEL_BATCH) {
|
||||||
@ -4009,6 +4010,7 @@ smb21_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
|
|||||||
unsigned int new_oplock = 0;
|
unsigned int new_oplock = 0;
|
||||||
|
|
||||||
oplock &= 0xFF;
|
oplock &= 0xFF;
|
||||||
|
cinode->lease_granted = true;
|
||||||
if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
|
if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user