[linux-cifs-client] [PATCH] F_GETLK request - returning value

Pavel Shilovsky piastry at etersoft.ru
Sun Mar 29 18:03:55 GMT 2009


Ok, This is final version.

diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
index 8f0f86d..54a6a7f 100644
--- a/fs/cifs/cifssmb.c
+++ b/fs/cifs/cifssmb.c
@@ -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:
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 6851043..f8fefab 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -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);

Signed-off-by: Pavel Shilovsky <piastryyy at gmail.com>
Acked-by: Jeff Layton <jlayton at redhat.com>

-- 
Best regards,
Pavel Shilovsky.


More information about the linux-cifs-client mailing list