lockd: Show pid of lockd for remote locks
diff mbox series

Message ID 62c22ff69bf762085a35d5706bd5e9e421bfbb33.1541093385.git.bcodding@redhat.com
State New
Headers show
Series
  • lockd: Show pid of lockd for remote locks
Related show

Commit Message

Benjamin Coddington Nov. 1, 2018, 5:39 p.m. UTC
Commit 9d5b86ac13c5 ("fs/locks: Remove fl_nspid and use fs-specific l_pid
for remote locks") specified that the l_pid returned for F_GETLK on a local
file that has a remote lock should be the pid of the lock manager process.
That commit, while updating other filesystems, failed to update lockd, such
that locks created by lockd had their fl_pid set to that of the remote
process holding the lock.  Fix that here to be the pid of lockd.

Also, fix the client case so that the returned lock pid is negative, which
indicates a remote lock on a remote file.

Fixes: 9d5b86ac13c5 ("fs/locks: Remove fl_nspid and use fs-specific...")
Cc: stable@vger.kernel.org

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
---
 fs/lockd/clntproc.c | 2 +-
 fs/lockd/xdr.c      | 4 ++--
 fs/lockd/xdr4.c     | 4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)

Comments

J. Bruce Fields Nov. 2, 2018, 6:45 p.m. UTC | #1
On Thu, Nov 01, 2018 at 01:39:49PM -0400, Benjamin Coddington wrote:
> Commit 9d5b86ac13c5 ("fs/locks: Remove fl_nspid and use fs-specific l_pid
> for remote locks") specified that the l_pid returned for F_GETLK on a local
> file that has a remote lock should be the pid of the lock manager process.
> That commit, while updating other filesystems, failed to update lockd, such
> that locks created by lockd had their fl_pid set to that of the remote
> process holding the lock.  Fix that here to be the pid of lockd.
> 
> Also, fix the client case so that the returned lock pid is negative, which
> indicates a remote lock on a remote file.

ACK.

Uh, I guess I'll take this if nobody else speaks up.

--b.

> 
> Fixes: 9d5b86ac13c5 ("fs/locks: Remove fl_nspid and use fs-specific...")
> Cc: stable@vger.kernel.org
> 
> Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
> ---
>  fs/lockd/clntproc.c | 2 +-
>  fs/lockd/xdr.c      | 4 ++--
>  fs/lockd/xdr4.c     | 4 ++--
>  3 files changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c
> index d20b92f271c2..0a67dd4250e9 100644
> --- a/fs/lockd/clntproc.c
> +++ b/fs/lockd/clntproc.c
> @@ -442,7 +442,7 @@ nlmclnt_test(struct nlm_rqst *req, struct file_lock *fl)
>  			fl->fl_start = req->a_res.lock.fl.fl_start;
>  			fl->fl_end = req->a_res.lock.fl.fl_end;
>  			fl->fl_type = req->a_res.lock.fl.fl_type;
> -			fl->fl_pid = 0;
> +			fl->fl_pid = -req->a_res.lock.fl.fl_pid;
>  			break;
>  		default:
>  			status = nlm_stat_to_errno(req->a_res.status);
> diff --git a/fs/lockd/xdr.c b/fs/lockd/xdr.c
> index 7147e4aebecc..9846f7e95282 100644
> --- a/fs/lockd/xdr.c
> +++ b/fs/lockd/xdr.c
> @@ -127,7 +127,7 @@ nlm_decode_lock(__be32 *p, struct nlm_lock *lock)
>  
>  	locks_init_lock(fl);
>  	fl->fl_owner = current->files;
> -	fl->fl_pid   = (pid_t)lock->svid;
> +	fl->fl_pid   = current->tgid;
>  	fl->fl_flags = FL_POSIX;
>  	fl->fl_type  = F_RDLCK;		/* as good as anything else */
>  	start = ntohl(*p++);
> @@ -269,7 +269,7 @@ nlmsvc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
>  	memset(lock, 0, sizeof(*lock));
>  	locks_init_lock(&lock->fl);
>  	lock->svid = ~(u32) 0;
> -	lock->fl.fl_pid = (pid_t)lock->svid;
> +	lock->fl.fl_pid = current->tgid;
>  
>  	if (!(p = nlm_decode_cookie(p, &argp->cookie))
>  	 || !(p = xdr_decode_string_inplace(p, &lock->caller,
> diff --git a/fs/lockd/xdr4.c b/fs/lockd/xdr4.c
> index 7ed9edf9aed4..70154f376695 100644
> --- a/fs/lockd/xdr4.c
> +++ b/fs/lockd/xdr4.c
> @@ -119,7 +119,7 @@ nlm4_decode_lock(__be32 *p, struct nlm_lock *lock)
>  
>  	locks_init_lock(fl);
>  	fl->fl_owner = current->files;
> -	fl->fl_pid   = (pid_t)lock->svid;
> +	fl->fl_pid   = current->tgid;
>  	fl->fl_flags = FL_POSIX;
>  	fl->fl_type  = F_RDLCK;		/* as good as anything else */
>  	p = xdr_decode_hyper(p, &start);
> @@ -266,7 +266,7 @@ nlm4svc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
>  	memset(lock, 0, sizeof(*lock));
>  	locks_init_lock(&lock->fl);
>  	lock->svid = ~(u32) 0;
> -	lock->fl.fl_pid = (pid_t)lock->svid;
> +	lock->fl.fl_pid = current->tgid;
>  
>  	if (!(p = nlm4_decode_cookie(p, &argp->cookie))
>  	 || !(p = xdr_decode_string_inplace(p, &lock->caller,
> -- 
> 2.14.3
J. Bruce Fields Dec. 14, 2018, 5:50 p.m. UTC | #2
On Fri, Nov 02, 2018 at 02:45:16PM -0400, J. Bruce Fields wrote:
> On Thu, Nov 01, 2018 at 01:39:49PM -0400, Benjamin Coddington wrote:
> > Commit 9d5b86ac13c5 ("fs/locks: Remove fl_nspid and use fs-specific l_pid
> > for remote locks") specified that the l_pid returned for F_GETLK on a local
> > file that has a remote lock should be the pid of the lock manager process.
> > That commit, while updating other filesystems, failed to update lockd, such
> > that locks created by lockd had their fl_pid set to that of the remote
> > process holding the lock.  Fix that here to be the pid of lockd.
> > 
> > Also, fix the client case so that the returned lock pid is negative, which
> > indicates a remote lock on a remote file.
> 
> ACK.
> 
> Uh, I guess I'll take this if nobody else speaks up.

Applied for 4.21.--b.

> 
> --b.
> 
> > 
> > Fixes: 9d5b86ac13c5 ("fs/locks: Remove fl_nspid and use fs-specific...")
> > Cc: stable@vger.kernel.org
> > 
> > Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
> > ---
> >  fs/lockd/clntproc.c | 2 +-
> >  fs/lockd/xdr.c      | 4 ++--
> >  fs/lockd/xdr4.c     | 4 ++--
> >  3 files changed, 5 insertions(+), 5 deletions(-)
> > 
> > diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c
> > index d20b92f271c2..0a67dd4250e9 100644
> > --- a/fs/lockd/clntproc.c
> > +++ b/fs/lockd/clntproc.c
> > @@ -442,7 +442,7 @@ nlmclnt_test(struct nlm_rqst *req, struct file_lock *fl)
> >  			fl->fl_start = req->a_res.lock.fl.fl_start;
> >  			fl->fl_end = req->a_res.lock.fl.fl_end;
> >  			fl->fl_type = req->a_res.lock.fl.fl_type;
> > -			fl->fl_pid = 0;
> > +			fl->fl_pid = -req->a_res.lock.fl.fl_pid;
> >  			break;
> >  		default:
> >  			status = nlm_stat_to_errno(req->a_res.status);
> > diff --git a/fs/lockd/xdr.c b/fs/lockd/xdr.c
> > index 7147e4aebecc..9846f7e95282 100644
> > --- a/fs/lockd/xdr.c
> > +++ b/fs/lockd/xdr.c
> > @@ -127,7 +127,7 @@ nlm_decode_lock(__be32 *p, struct nlm_lock *lock)
> >  
> >  	locks_init_lock(fl);
> >  	fl->fl_owner = current->files;
> > -	fl->fl_pid   = (pid_t)lock->svid;
> > +	fl->fl_pid   = current->tgid;
> >  	fl->fl_flags = FL_POSIX;
> >  	fl->fl_type  = F_RDLCK;		/* as good as anything else */
> >  	start = ntohl(*p++);
> > @@ -269,7 +269,7 @@ nlmsvc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
> >  	memset(lock, 0, sizeof(*lock));
> >  	locks_init_lock(&lock->fl);
> >  	lock->svid = ~(u32) 0;
> > -	lock->fl.fl_pid = (pid_t)lock->svid;
> > +	lock->fl.fl_pid = current->tgid;
> >  
> >  	if (!(p = nlm_decode_cookie(p, &argp->cookie))
> >  	 || !(p = xdr_decode_string_inplace(p, &lock->caller,
> > diff --git a/fs/lockd/xdr4.c b/fs/lockd/xdr4.c
> > index 7ed9edf9aed4..70154f376695 100644
> > --- a/fs/lockd/xdr4.c
> > +++ b/fs/lockd/xdr4.c
> > @@ -119,7 +119,7 @@ nlm4_decode_lock(__be32 *p, struct nlm_lock *lock)
> >  
> >  	locks_init_lock(fl);
> >  	fl->fl_owner = current->files;
> > -	fl->fl_pid   = (pid_t)lock->svid;
> > +	fl->fl_pid   = current->tgid;
> >  	fl->fl_flags = FL_POSIX;
> >  	fl->fl_type  = F_RDLCK;		/* as good as anything else */
> >  	p = xdr_decode_hyper(p, &start);
> > @@ -266,7 +266,7 @@ nlm4svc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
> >  	memset(lock, 0, sizeof(*lock));
> >  	locks_init_lock(&lock->fl);
> >  	lock->svid = ~(u32) 0;
> > -	lock->fl.fl_pid = (pid_t)lock->svid;
> > +	lock->fl.fl_pid = current->tgid;
> >  
> >  	if (!(p = nlm4_decode_cookie(p, &argp->cookie))
> >  	 || !(p = xdr_decode_string_inplace(p, &lock->caller,
> > -- 
> > 2.14.3

Patch
diff mbox series

diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c
index d20b92f271c2..0a67dd4250e9 100644
--- a/fs/lockd/clntproc.c
+++ b/fs/lockd/clntproc.c
@@ -442,7 +442,7 @@  nlmclnt_test(struct nlm_rqst *req, struct file_lock *fl)
 			fl->fl_start = req->a_res.lock.fl.fl_start;
 			fl->fl_end = req->a_res.lock.fl.fl_end;
 			fl->fl_type = req->a_res.lock.fl.fl_type;
-			fl->fl_pid = 0;
+			fl->fl_pid = -req->a_res.lock.fl.fl_pid;
 			break;
 		default:
 			status = nlm_stat_to_errno(req->a_res.status);
diff --git a/fs/lockd/xdr.c b/fs/lockd/xdr.c
index 7147e4aebecc..9846f7e95282 100644
--- a/fs/lockd/xdr.c
+++ b/fs/lockd/xdr.c
@@ -127,7 +127,7 @@  nlm_decode_lock(__be32 *p, struct nlm_lock *lock)
 
 	locks_init_lock(fl);
 	fl->fl_owner = current->files;
-	fl->fl_pid   = (pid_t)lock->svid;
+	fl->fl_pid   = current->tgid;
 	fl->fl_flags = FL_POSIX;
 	fl->fl_type  = F_RDLCK;		/* as good as anything else */
 	start = ntohl(*p++);
@@ -269,7 +269,7 @@  nlmsvc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
 	memset(lock, 0, sizeof(*lock));
 	locks_init_lock(&lock->fl);
 	lock->svid = ~(u32) 0;
-	lock->fl.fl_pid = (pid_t)lock->svid;
+	lock->fl.fl_pid = current->tgid;
 
 	if (!(p = nlm_decode_cookie(p, &argp->cookie))
 	 || !(p = xdr_decode_string_inplace(p, &lock->caller,
diff --git a/fs/lockd/xdr4.c b/fs/lockd/xdr4.c
index 7ed9edf9aed4..70154f376695 100644
--- a/fs/lockd/xdr4.c
+++ b/fs/lockd/xdr4.c
@@ -119,7 +119,7 @@  nlm4_decode_lock(__be32 *p, struct nlm_lock *lock)
 
 	locks_init_lock(fl);
 	fl->fl_owner = current->files;
-	fl->fl_pid   = (pid_t)lock->svid;
+	fl->fl_pid   = current->tgid;
 	fl->fl_flags = FL_POSIX;
 	fl->fl_type  = F_RDLCK;		/* as good as anything else */
 	p = xdr_decode_hyper(p, &start);
@@ -266,7 +266,7 @@  nlm4svc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
 	memset(lock, 0, sizeof(*lock));
 	locks_init_lock(&lock->fl);
 	lock->svid = ~(u32) 0;
-	lock->fl.fl_pid = (pid_t)lock->svid;
+	lock->fl.fl_pid = current->tgid;
 
 	if (!(p = nlm4_decode_cookie(p, &argp->cookie))
 	 || !(p = xdr_decode_string_inplace(p, &lock->caller,