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

cifs: defer close file handles having RH lease

Previously we only deferred closing file handles with RHW
lease. To enhance performance benefits from deferred closes,
we now include handles with RH leases as well.
Signed-off-by: default avatarBharath SM <bharathsm@microsoft.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 279d44ce
...@@ -1073,6 +1073,19 @@ void smb2_deferred_work_close(struct work_struct *work) ...@@ -1073,6 +1073,19 @@ void smb2_deferred_work_close(struct work_struct *work)
_cifsFileInfo_put(cfile, true, false); _cifsFileInfo_put(cfile, true, false);
} }
static bool
smb2_can_defer_close(struct inode *inode, struct cifs_deferred_close *dclose)
{
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
struct cifsInodeInfo *cinode = CIFS_I(inode);
return (cifs_sb->ctx->closetimeo && cinode->lease_granted && dclose &&
(cinode->oplock == CIFS_CACHE_RHW_FLG ||
cinode->oplock == CIFS_CACHE_RH_FLG) &&
!test_bit(CIFS_INO_CLOSE_ON_LOCK, &cinode->flags));
}
int cifs_close(struct inode *inode, struct file *file) int cifs_close(struct inode *inode, struct file *file)
{ {
struct cifsFileInfo *cfile; struct cifsFileInfo *cfile;
...@@ -1086,10 +1099,8 @@ int cifs_close(struct inode *inode, struct file *file) ...@@ -1086,10 +1099,8 @@ int cifs_close(struct inode *inode, struct file *file)
cfile = file->private_data; cfile = file->private_data;
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 ((cifs_sb->ctx->closetimeo && cinode->oplock == CIFS_CACHE_RHW_FLG) if ((cfile->status_file_deleted == false) &&
&& cinode->lease_granted && (smb2_can_defer_close(inode, dclose))) {
!test_bit(CIFS_INO_CLOSE_ON_LOCK, &cinode->flags) &&
dclose && !(cfile->status_file_deleted)) {
if (test_and_clear_bit(CIFS_INO_MODIFIED_ATTR, &cinode->flags)) { if (test_and_clear_bit(CIFS_INO_MODIFIED_ATTR, &cinode->flags)) {
inode_set_mtime_to_ts(inode, inode_set_mtime_to_ts(inode,
inode_set_ctime_current(inode)); inode_set_ctime_current(inode));
......
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