Re: [PATCH 2/3] getlk problem
Jeff Layton <[email protected]>
| Newsgroups | gmane.linux.file-systems.cifs |
|---|---|
| Message-ID | <[email protected]> |
On Wed, 24 Mar 2010 11:56:42 +0300 [email protected] wrote: > diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c > index 7cc7f83..b3bbb2b 100644 > --- a/fs/cifs/cifssmb.c > +++ b/fs/cifs/cifssmb.c > @@ -1793,8 +1793,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 ca2ba7a..d9e8650 100644 > --- a/fs/cifs/file.c > +++ b/fs/cifs/file.c > @@ -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); > > Signed-off-by: Pavel Shilovsky <[email protected]> The problem here is that "getlk problem" doesn't really convey exactly what the heck this patch is intended to do. Can you describe what the getlk problem actually is and how this patch fixes it? Thanks, -- Jeff Layton <[email protected]>