From patchwork Sun Mar 28 18:20:36 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: piastry@etersoft.ru X-Patchwork-Id: 48785 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.samba.org (fn.samba.org [216.83.154.106]) by ozlabs.org (Postfix) with ESMTP id 82FEBB7CB6 for ; Mon, 29 Mar 2010 05:20:50 +1100 (EST) Received: from fn.samba.org (localhost [127.0.0.1]) by lists.samba.org (Postfix) with ESMTP id F0663AD1ED; Sun, 28 Mar 2010 12:20:50 -0600 (MDT) X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on fn.samba.org X-Spam-Level: X-Spam-Status: No, score=-2.6 required=3.8 tests=AWL, BAYES_00 autolearn=ham version=3.2.5 X-Original-To: linux-cifs-client@lists.samba.org Delivered-To: linux-cifs-client@lists.samba.org Received: from mail.etersoft.ru (mail.etersoft.ru [87.249.47.46]) by lists.samba.org (Postfix) with ESMTP id 65375AD1ED for ; Sun, 28 Mar 2010 12:20:44 -0600 (MDT) From: piastry@etersoft.ru To: Jeff Layton Date: Sun, 28 Mar 2010 22:20:36 +0400 User-Agent: KMail/1.13.1 (Linux/2.6.32.9-70.fc12.x86_64; KDE/4.4.1; x86_64; ; ) References: <201003241156.42545.piastry@etersoft.ru> <20100326215548.1c01d40c@tlielax.poochiereds.net> In-Reply-To: <20100326215548.1c01d40c@tlielax.poochiereds.net> MIME-Version: 1.0 Message-Id: <201003282220.37430.piastry@etersoft.ru> Cc: Steve French , linux-cifs-client@lists.samba.org Subject: Re: [linux-cifs-client] [PATCH 2/3] getlk problem X-BeenThere: linux-cifs-client@lists.samba.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: The Linux CIFS VFS client List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-cifs-client-bounces@lists.samba.org Errors-To: linux-cifs-client-bounces@lists.samba.org В сообщении от 27 марта 2010 04:55:48 вы написали: > On Wed, 24 Mar 2010 11:56:42 +0300 > > piastry@etersoft.ru 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 > > I think this looks reasonable, however it would be preferable to have a > proper description and SoB line in the right place. That makes it > easier to pull into the tree. In the future consider using > git-format-patch to generate them. > > Reviewed-by: Jeff Layton Ok, thanks for advice. See patch in attachment. --- Best regards, Pavel Shilovsky. From: Pavel Shilovsky 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 Reviewed-by: Jeff Layton --- fs/cifs/cifssmb.c | 15 ++++++++++++++- fs/cifs/file.c | 28 ++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 3 deletions(-) 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); -- 1.6.6.1