Linux-CIFS Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH] CIFS: unlock file across process
@ 2020-02-14  4:35 Murphy Zhou
  2020-02-14  5:32 ` Steve French
  2020-02-14 12:26 ` Jeff Layton
  0 siblings, 2 replies; 9+ messages in thread
From: Murphy Zhou @ 2020-02-14  4:35 UTC (permalink / raw)
  To: linux-cifs

Now child can't unlock the same file that has been locked by
parent. Fix this by not skipping unlock if requesting from
different process.

Patch tested by LTP and xfstests using samba server.

Signed-off-by: Murphy Zhou <jencce.kernel@gmail.com>
---
 fs/cifs/smb2file.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c
index afe1f03aabe3..b5bca0e13d51 100644
--- a/fs/cifs/smb2file.c
+++ b/fs/cifs/smb2file.c
@@ -151,8 +151,6 @@ smb2_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock,
 		    (flock->fl_start + length) <
 		    (li->offset + li->length))
 			continue;
-		if (current->tgid != li->pid)
-			continue;
 		if (cinode->can_cache_brlcks) {
 			/*
 			 * We can cache brlock requests - simply remove a lock
-- 
2.20.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] CIFS: unlock file across process
  2020-02-14  4:35 [PATCH] CIFS: unlock file across process Murphy Zhou
@ 2020-02-14  5:32 ` Steve French
  2020-02-14 12:26 ` Jeff Layton
  1 sibling, 0 replies; 9+ messages in thread
From: Steve French @ 2020-02-14  5:32 UTC (permalink / raw)
  To: Murphy Zhou; +Cc: CIFS

merged into cifs-2.6.git for-next

On Thu, Feb 13, 2020 at 10:35 PM Murphy Zhou <jencce.kernel@gmail.com> wrote:
>
> Now child can't unlock the same file that has been locked by
> parent. Fix this by not skipping unlock if requesting from
> different process.
>
> Patch tested by LTP and xfstests using samba server.
>
> Signed-off-by: Murphy Zhou <jencce.kernel@gmail.com>
> ---
>  fs/cifs/smb2file.c | 2 --
>  1 file changed, 2 deletions(-)
>
> diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c
> index afe1f03aabe3..b5bca0e13d51 100644
> --- a/fs/cifs/smb2file.c
> +++ b/fs/cifs/smb2file.c
> @@ -151,8 +151,6 @@ smb2_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock,
>                     (flock->fl_start + length) <
>                     (li->offset + li->length))
>                         continue;
> -               if (current->tgid != li->pid)
> -                       continue;
>                 if (cinode->can_cache_brlcks) {
>                         /*
>                          * We can cache brlock requests - simply remove a lock
> --
> 2.20.1
>


-- 
Thanks,

Steve

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] CIFS: unlock file across process
  2020-02-14  4:35 [PATCH] CIFS: unlock file across process Murphy Zhou
  2020-02-14  5:32 ` Steve French
@ 2020-02-14 12:26 ` Jeff Layton
  2020-02-14 14:28   ` Murphy Zhou
  1 sibling, 1 reply; 9+ messages in thread
From: Jeff Layton @ 2020-02-14 12:26 UTC (permalink / raw)
  To: Murphy Zhou, linux-cifs; +Cc: Steve French

On Fri, 2020-02-14 at 12:35 +0800, Murphy Zhou wrote:
> Now child can't unlock the same file that has been locked by
> parent. Fix this by not skipping unlock if requesting from
> different process.
> 
> Patch tested by LTP and xfstests using samba server.
> 
> Signed-off-by: Murphy Zhou <jencce.kernel@gmail.com>
> ---
>  fs/cifs/smb2file.c | 2 --
>  1 file changed, 2 deletions(-)
> 
> diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c
> index afe1f03aabe3..b5bca0e13d51 100644
> --- a/fs/cifs/smb2file.c
> +++ b/fs/cifs/smb2file.c
> @@ -151,8 +151,6 @@ smb2_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock,
>  		    (flock->fl_start + length) <
>  		    (li->offset + li->length))
>  			continue;
> -		if (current->tgid != li->pid)
> -			continue;
>  		if (cinode->can_cache_brlcks) {
>  			/*
>  			 * We can cache brlock requests - simply remove a lock

I'm not as familiar with this code as I once was, but...

From fork(2) manpage:

       *  The  child does not inherit process-associated record locks from its
          parent (fcntl(2)).  (On the other hand,  it  does  inherit  fcntl(2)
          open file description locks and flock(2) locks from its parent.)

It looks like cifs_setlk calls mand_unlock_range, and that gets called
from both fcntl and flock codepaths.

So, I'm not sure about just removing this. It seems like the pid check
is probably correct for traditional posix locks, but probably not for
OFD and flock locks? What ensures that completely unrelated tasks can't
unlock your locks?
-- 
Jeff Layton <jlayton@kernel.org>


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] CIFS: unlock file across process
  2020-02-14 12:26 ` Jeff Layton
@ 2020-02-14 14:28   ` Murphy Zhou
  2020-02-14 19:03     ` Pavel Shilovsky
  0 siblings, 1 reply; 9+ messages in thread
From: Murphy Zhou @ 2020-02-14 14:28 UTC (permalink / raw)
  To: Jeff Layton; +Cc: Murphy Zhou, linux-cifs, Steve French

On Fri, Feb 14, 2020 at 07:26:46AM -0500, Jeff Layton wrote:
> On Fri, 2020-02-14 at 12:35 +0800, Murphy Zhou wrote:
> > Now child can't unlock the same file that has been locked by
> > parent. Fix this by not skipping unlock if requesting from
> > different process.
> > 
> > Patch tested by LTP and xfstests using samba server.
> > 
> > Signed-off-by: Murphy Zhou <jencce.kernel@gmail.com>
> > ---
> >  fs/cifs/smb2file.c | 2 --
> >  1 file changed, 2 deletions(-)
> > 
> > diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c
> > index afe1f03aabe3..b5bca0e13d51 100644
> > --- a/fs/cifs/smb2file.c
> > +++ b/fs/cifs/smb2file.c
> > @@ -151,8 +151,6 @@ smb2_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock,
> >  		    (flock->fl_start + length) <
> >  		    (li->offset + li->length))
> >  			continue;
> > -		if (current->tgid != li->pid)
> > -			continue;
> >  		if (cinode->can_cache_brlcks) {
> >  			/*
> >  			 * We can cache brlock requests - simply remove a lock
> 
> I'm not as familiar with this code as I once was, but...
> 
> From fork(2) manpage:
> 
>        *  The  child does not inherit process-associated record locks from its
>           parent (fcntl(2)).  (On the other hand,  it  does  inherit  fcntl(2)
>           open file description locks and flock(2) locks from its parent.)
> 
> It looks like cifs_setlk calls mand_unlock_range, and that gets called
> from both fcntl and flock codepaths.
> 
> So, I'm not sure about just removing this. It seems like the pid check
> is probably correct for traditional posix locks, but probably not for
> OFD and flock locks? What ensures that completely unrelated tasks can't
> unlock your locks?

You are right Jeff. Just removing this is not right. We need to handle
at least 3 types of locks: posix, OFD and flock.

Thanks very much for reviewing! I'll try to sort this out.
> -- 
> Jeff Layton <jlayton@kernel.org>
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] CIFS: unlock file across process
  2020-02-14 14:28   ` Murphy Zhou
@ 2020-02-14 19:03     ` Pavel Shilovsky
  2020-02-19  2:10       ` Murphy Zhou
  0 siblings, 1 reply; 9+ messages in thread
From: Pavel Shilovsky @ 2020-02-14 19:03 UTC (permalink / raw)
  To: Murphy Zhou; +Cc: Jeff Layton, linux-cifs, Steve French

Also, please make sure that resulting patch works against Windows file
share since the locking semantics may be different there.

Depending on a kind of lease we have on a file, locks may be cached or
not. We probably don't want to have different behavior for cached and
non-cached locks. Especially given the fact that a lease may be broken
in the middle of app execution and the different behavior will be
applied immediately.

--
Best regards,
Pavel Shilovsky

пт, 14 февр. 2020 г. в 06:30, Murphy Zhou <jencce.kernel@gmail.com>:
>
> On Fri, Feb 14, 2020 at 07:26:46AM -0500, Jeff Layton wrote:
> > On Fri, 2020-02-14 at 12:35 +0800, Murphy Zhou wrote:
> > > Now child can't unlock the same file that has been locked by
> > > parent. Fix this by not skipping unlock if requesting from
> > > different process.
> > >
> > > Patch tested by LTP and xfstests using samba server.
> > >
> > > Signed-off-by: Murphy Zhou <jencce.kernel@gmail.com>
> > > ---
> > >  fs/cifs/smb2file.c | 2 --
> > >  1 file changed, 2 deletions(-)
> > >
> > > diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c
> > > index afe1f03aabe3..b5bca0e13d51 100644
> > > --- a/fs/cifs/smb2file.c
> > > +++ b/fs/cifs/smb2file.c
> > > @@ -151,8 +151,6 @@ smb2_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock,
> > >                 (flock->fl_start + length) <
> > >                 (li->offset + li->length))
> > >                     continue;
> > > -           if (current->tgid != li->pid)
> > > -                   continue;
> > >             if (cinode->can_cache_brlcks) {
> > >                     /*
> > >                      * We can cache brlock requests - simply remove a lock
> >
> > I'm not as familiar with this code as I once was, but...
> >
> > From fork(2) manpage:
> >
> >        *  The  child does not inherit process-associated record locks from its
> >           parent (fcntl(2)).  (On the other hand,  it  does  inherit  fcntl(2)
> >           open file description locks and flock(2) locks from its parent.)
> >
> > It looks like cifs_setlk calls mand_unlock_range, and that gets called
> > from both fcntl and flock codepaths.
> >
> > So, I'm not sure about just removing this. It seems like the pid check
> > is probably correct for traditional posix locks, but probably not for
> > OFD and flock locks? What ensures that completely unrelated tasks can't
> > unlock your locks?
>
> You are right Jeff. Just removing this is not right. We need to handle
> at least 3 types of locks: posix, OFD and flock.
>
> Thanks very much for reviewing! I'll try to sort this out.
> > --
> > Jeff Layton <jlayton@kernel.org>
> >

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] CIFS: unlock file across process
  2020-02-14 19:03     ` Pavel Shilovsky
@ 2020-02-19  2:10       ` Murphy Zhou
  2020-02-24 19:39         ` Pavel Shilovsky
  0 siblings, 1 reply; 9+ messages in thread
From: Murphy Zhou @ 2020-02-19  2:10 UTC (permalink / raw)
  To: Pavel Shilovsky; +Cc: Murphy Zhou, Jeff Layton, linux-cifs, Steve French

On Fri, Feb 14, 2020 at 11:03:00AM -0800, Pavel Shilovsky wrote:
> Also, please make sure that resulting patch works against Windows file
> share since the locking semantics may be different there.

OK.

> 
> Depending on a kind of lease we have on a file, locks may be cached or
> not. We probably don't want to have different behavior for cached and
> non-cached locks. Especially given the fact that a lease may be broken
> in the middle of app execution and the different behavior will be
> applied immediately.

Testing new patch with and without cache=none option, both samba
and Win2019 server.

Thanks very much for reviewing!

Murphy
> 
> --
> Best regards,
> Pavel Shilovsky
> 
> пт, 14 февр. 2020 г. в 06:30, Murphy Zhou <jencce.kernel@gmail.com>:
> >
> > On Fri, Feb 14, 2020 at 07:26:46AM -0500, Jeff Layton wrote:
> > > On Fri, 2020-02-14 at 12:35 +0800, Murphy Zhou wrote:
> > > > Now child can't unlock the same file that has been locked by
> > > > parent. Fix this by not skipping unlock if requesting from
> > > > different process.
> > > >
> > > > Patch tested by LTP and xfstests using samba server.
> > > >
> > > > Signed-off-by: Murphy Zhou <jencce.kernel@gmail.com>
> > > > ---
> > > >  fs/cifs/smb2file.c | 2 --
> > > >  1 file changed, 2 deletions(-)
> > > >
> > > > diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c
> > > > index afe1f03aabe3..b5bca0e13d51 100644
> > > > --- a/fs/cifs/smb2file.c
> > > > +++ b/fs/cifs/smb2file.c
> > > > @@ -151,8 +151,6 @@ smb2_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock,
> > > >                 (flock->fl_start + length) <
> > > >                 (li->offset + li->length))
> > > >                     continue;
> > > > -           if (current->tgid != li->pid)
> > > > -                   continue;
> > > >             if (cinode->can_cache_brlcks) {
> > > >                     /*
> > > >                      * We can cache brlock requests - simply remove a lock
> > >
> > > I'm not as familiar with this code as I once was, but...
> > >
> > > From fork(2) manpage:
> > >
> > >        *  The  child does not inherit process-associated record locks from its
> > >           parent (fcntl(2)).  (On the other hand,  it  does  inherit  fcntl(2)
> > >           open file description locks and flock(2) locks from its parent.)
> > >
> > > It looks like cifs_setlk calls mand_unlock_range, and that gets called
> > > from both fcntl and flock codepaths.
> > >
> > > So, I'm not sure about just removing this. It seems like the pid check
> > > is probably correct for traditional posix locks, but probably not for
> > > OFD and flock locks? What ensures that completely unrelated tasks can't
> > > unlock your locks?
> >
> > You are right Jeff. Just removing this is not right. We need to handle
> > at least 3 types of locks: posix, OFD and flock.
> >
> > Thanks very much for reviewing! I'll try to sort this out.
> > > --
> > > Jeff Layton <jlayton@kernel.org>
> > >

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] CIFS: unlock file across process
  2020-02-19  2:10       ` Murphy Zhou
@ 2020-02-24 19:39         ` Pavel Shilovsky
  2020-02-25  5:15           ` Murphy Zhou
  0 siblings, 1 reply; 9+ messages in thread
From: Pavel Shilovsky @ 2020-02-24 19:39 UTC (permalink / raw)
  To: Murphy Zhou; +Cc: Jeff Layton, linux-cifs, Steve French

вт, 18 февр. 2020 г. в 18:10, Murphy Zhou <jencce.kernel@gmail.com>:
>
> On Fri, Feb 14, 2020 at 11:03:00AM -0800, Pavel Shilovsky wrote:
> > Also, please make sure that resulting patch works against Windows file
> > share since the locking semantics may be different there.
>
> OK.
>
> >
> > Depending on a kind of lease we have on a file, locks may be cached or
> > not. We probably don't want to have different behavior for cached and
> > non-cached locks. Especially given the fact that a lease may be broken
> > in the middle of app execution and the different behavior will be
> > applied immediately.
>
> Testing new patch with and without cache=none option, both samba
> and Win2019 server.
>
> Thanks very much for reviewing!
>

cache=none only affects IO and doesn't change the client behavior
regarding locks. "nolease" mount option can be used to turn off leases
and make all locks go to the server.

--
Best regards,
Pavel Shilovsky

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] CIFS: unlock file across process
  2020-02-24 19:39         ` Pavel Shilovsky
@ 2020-02-25  5:15           ` Murphy Zhou
  2020-02-25 19:21             ` Pavel Shilovsky
  0 siblings, 1 reply; 9+ messages in thread
From: Murphy Zhou @ 2020-02-25  5:15 UTC (permalink / raw)
  To: Pavel Shilovsky; +Cc: Murphy Zhou, Jeff Layton, linux-cifs, Steve French

On Mon, Feb 24, 2020 at 11:39:27AM -0800, Pavel Shilovsky wrote:
> вт, 18 февр. 2020 г. в 18:10, Murphy Zhou <jencce.kernel@gmail.com>:
> >
> > On Fri, Feb 14, 2020 at 11:03:00AM -0800, Pavel Shilovsky wrote:
> > > Also, please make sure that resulting patch works against Windows file
> > > share since the locking semantics may be different there.
> >
> > OK.
> >
> > >
> > > Depending on a kind of lease we have on a file, locks may be cached or
> > > not. We probably don't want to have different behavior for cached and
> > > non-cached locks. Especially given the fact that a lease may be broken
> > > in the middle of app execution and the different behavior will be
> > > applied immediately.
> >
> > Testing new patch with and without cache=none option, both samba
> > and Win2019 server.
> >
> > Thanks very much for reviewing!
> >
> 
> cache=none only affects IO and doesn't change the client behavior
> regarding locks. "nolease" mount option can be used to turn off leases
> and make all locks go to the server.

Great to know! I can't find it in any man page. Doing more tests.

Thanks!

> 
> --
> Best regards,
> Pavel Shilovsky

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] CIFS: unlock file across process
  2020-02-25  5:15           ` Murphy Zhou
@ 2020-02-25 19:21             ` Pavel Shilovsky
  0 siblings, 0 replies; 9+ messages in thread
From: Pavel Shilovsky @ 2020-02-25 19:21 UTC (permalink / raw)
  To: Murphy Zhou; +Cc: Jeff Layton, linux-cifs, Steve French

пн, 24 февр. 2020 г. в 21:16, Murphy Zhou <jencce.kernel@gmail.com>:
>
> On Mon, Feb 24, 2020 at 11:39:27AM -0800, Pavel Shilovsky wrote:
> > вт, 18 февр. 2020 г. в 18:10, Murphy Zhou <jencce.kernel@gmail.com>:
> > >
> > > On Fri, Feb 14, 2020 at 11:03:00AM -0800, Pavel Shilovsky wrote:
> > > > Also, please make sure that resulting patch works against Windows file
> > > > share since the locking semantics may be different there.
> > >
> > > OK.
> > >
> > > >
> > > > Depending on a kind of lease we have on a file, locks may be cached or
> > > > not. We probably don't want to have different behavior for cached and
> > > > non-cached locks. Especially given the fact that a lease may be broken
> > > > in the middle of app execution and the different behavior will be
> > > > applied immediately.
> > >
> > > Testing new patch with and without cache=none option, both samba
> > > and Win2019 server.
> > >
> > > Thanks very much for reviewing!
> > >
> >
> > cache=none only affects IO and doesn't change the client behavior
> > regarding locks. "nolease" mount option can be used to turn off leases
> > and make all locks go to the server.
>
> Great to know! I can't find it in any man page. Doing more tests.
>

Good catch, it is missing in the man pages.

Now added: https://github.com/piastry/cifs-utils/commit/4b8b2e2680e7e4aa9cc8bd4278d04e5fe07d885e

Thanks!

--
Best regards,
Pavel Shilovsky

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, back to index

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-14  4:35 [PATCH] CIFS: unlock file across process Murphy Zhou
2020-02-14  5:32 ` Steve French
2020-02-14 12:26 ` Jeff Layton
2020-02-14 14:28   ` Murphy Zhou
2020-02-14 19:03     ` Pavel Shilovsky
2020-02-19  2:10       ` Murphy Zhou
2020-02-24 19:39         ` Pavel Shilovsky
2020-02-25  5:15           ` Murphy Zhou
2020-02-25 19:21             ` Pavel Shilovsky

Linux-CIFS Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-cifs/0 linux-cifs/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-cifs linux-cifs/ https://lore.kernel.org/linux-cifs \
		linux-cifs@vger.kernel.org
	public-inbox-index linux-cifs

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-cifs


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git