CIFS: Move oplock break to ops struct
Signed-off-by: Pavel Shilovsky <pshilovsky@samba.org> Signed-off-by: Steve French <smfrench@gmail.com>
This commit is contained in:
parent
2e44b28878
commit
95a3f2f377
3 changed files with 17 additions and 4 deletions
|
@ -178,6 +178,7 @@ struct cifs_readdata;
|
|||
struct cifs_writedata;
|
||||
struct cifs_io_parms;
|
||||
struct cifs_search_info;
|
||||
struct cifsInodeInfo;
|
||||
|
||||
struct smb_version_operations {
|
||||
int (*send_cancel)(struct TCP_Server_Info *, void *,
|
||||
|
@ -330,6 +331,9 @@ struct smb_version_operations {
|
|||
unsigned int (*calc_smb_size)(void *);
|
||||
/* check for STATUS_PENDING and process it in a positive case */
|
||||
bool (*is_status_pending)(char *, struct TCP_Server_Info *, int);
|
||||
/* send oplock break response */
|
||||
int (*oplock_response)(struct cifs_tcon *, struct cifs_fid *,
|
||||
struct cifsInodeInfo *);
|
||||
};
|
||||
|
||||
struct smb_version_values {
|
||||
|
|
|
@ -3404,6 +3404,7 @@ void cifs_oplock_break(struct work_struct *work)
|
|||
oplock_break);
|
||||
struct inode *inode = cfile->dentry->d_inode;
|
||||
struct cifsInodeInfo *cinode = CIFS_I(inode);
|
||||
struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
|
||||
int rc = 0;
|
||||
|
||||
if (inode && S_ISREG(inode->i_mode)) {
|
||||
|
@ -3431,10 +3432,8 @@ void cifs_oplock_break(struct work_struct *work)
|
|||
* disconnected since oplock already released by the server
|
||||
*/
|
||||
if (!cfile->oplock_break_cancelled) {
|
||||
rc = CIFSSMBLock(0, tlink_tcon(cfile->tlink), cfile->fid.netfid,
|
||||
current->tgid, 0, 0, 0, 0,
|
||||
LOCKING_ANDX_OPLOCK_RELEASE, false,
|
||||
cinode->clientCanCacheRead ? 1 : 0);
|
||||
rc = tcon->ses->server->ops->oplock_response(tcon, &cfile->fid,
|
||||
cinode);
|
||||
cFYI(1, "Oplock release rc = %d", rc);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -863,6 +863,15 @@ cifs_close_dir(const unsigned int xid, struct cifs_tcon *tcon,
|
|||
return CIFSFindClose(xid, tcon, fid->netfid);
|
||||
}
|
||||
|
||||
static int
|
||||
cifs_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid,
|
||||
struct cifsInodeInfo *cinode)
|
||||
{
|
||||
return CIFSSMBLock(0, tcon, fid->netfid, current->tgid, 0, 0, 0, 0,
|
||||
LOCKING_ANDX_OPLOCK_RELEASE, false,
|
||||
cinode->clientCanCacheRead ? 1 : 0);
|
||||
}
|
||||
|
||||
struct smb_version_operations smb1_operations = {
|
||||
.send_cancel = send_nt_cancel,
|
||||
.compare_fids = cifs_compare_fids,
|
||||
|
@ -922,6 +931,7 @@ struct smb_version_operations smb1_operations = {
|
|||
.query_dir_next = cifs_query_dir_next,
|
||||
.close_dir = cifs_close_dir,
|
||||
.calc_smb_size = smbCalcSize,
|
||||
.oplock_response = cifs_oplock_response,
|
||||
};
|
||||
|
||||
struct smb_version_values smb1_values = {
|
||||
|
|
Loading…
Reference in a new issue