@@ -1880,8 +1880,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:
@@ -896,8 +896,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, pTcon, netfid, length,
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pfLock->fl_start, 0, 1,
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lockType | LOCKING_ANDX_SHARED_LOCK,
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0 /* wait flag */ );
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (rc == 0) {
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? rc = CIFSSMBLock(xid, pTcon, 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);