[linux-cifs-client] F_GETLK request - returning value
diff mbox

Message ID 200903292204.02755.piastry@etersoft.ru
State New, archived
Headers show

Commit Message

Pavel Shilovsky March 29, 2009, 6:03 p.m. UTC
Ok, This is final version.


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

Patch
diff mbox

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);