not overwriting file_lock structure after GET_LK
If we have preventing lock, cifs should overwrite file_lock structure with info about preventing lock. If we haven't preventing lock, cifs should leave it unchanged except for the lock type (change it to F_UNLCK). Signed-off-by: Pavel Shilovsky <piastryyy@gmail.com> Reviewed-by: Jeff Layton <jlayton@samba.org> Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
Родитель
6513a81e93
Коммит
f05337c6ac
|
@ -1810,8 +1810,21 @@ CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon,
|
|||
}
|
||||
parm_data = (struct cifs_posix_lock *)
|
||||
((char *)&pSMBr->hdr.Protocol + data_offset);
|
||||
if (parm_data->lock_type == cpu_to_le16(CIFS_UNLCK))
|
||||
if (parm_data->lock_type == __constant_cpu_to_le16(CIFS_UNLCK))
|
||||
pLockData->fl_type = F_UNLCK;
|
||||
else {
|
||||
if (parm_data->lock_type ==
|
||||
__constant_cpu_to_le16(CIFS_RDLCK))
|
||||
pLockData->fl_type = F_RDLCK;
|
||||
else if (parm_data->lock_type ==
|
||||
__constant_cpu_to_le16(CIFS_WRLCK))
|
||||
pLockData->fl_type = F_WRLCK;
|
||||
|
||||
pLockData->fl_start = parm_data->start;
|
||||
pLockData->fl_end = parm_data->start +
|
||||
parm_data->length - 1;
|
||||
pLockData->fl_pid = parm_data->pid;
|
||||
}
|
||||
}
|
||||
|
||||
plk_err_exit:
|
||||
|
|
|
@ -838,8 +838,32 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
|
|||
|
||||
} else {
|
||||
/* if rc == ERR_SHARING_VIOLATION ? */
|
||||
rc = 0; /* do not change lock type to unlock
|
||||
since range in use */
|
||||
rc = 0;
|
||||
|
||||
if (lockType & LOCKING_ANDX_SHARED_LOCK) {
|
||||
pfLock->fl_type = F_WRLCK;
|
||||
} else {
|
||||
rc = CIFSSMBLock(xid, tcon, netfid, length,
|
||||
pfLock->fl_start, 0, 1,
|
||||
lockType | LOCKING_ANDX_SHARED_LOCK,
|
||||
0 /* wait flag */);
|
||||
if (rc == 0) {
|
||||
rc = CIFSSMBLock(xid, tcon, netfid,
|
||||
length, pfLock->fl_start, 1, 0,
|
||||
lockType |
|
||||
LOCKING_ANDX_SHARED_LOCK,
|
||||
0 /* wait flag */);
|
||||
pfLock->fl_type = F_RDLCK;
|
||||
if (rc != 0)
|
||||
cERROR(1, ("Error unlocking "
|
||||
"previously locked range %d "
|
||||
"during test of lock", rc));
|
||||
rc = 0;
|
||||
} else {
|
||||
pfLock->fl_type = F_WRLCK;
|
||||
rc = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FreeXid(xid);
|
||||
|
|
Загрузка…
Ссылка в новой задаче