diff mbox series

[5/5] lockd: Remove unneeded initialization of file_lock::c.flc_flags

Message ID 20241017133631.213274-6-cel@kernel.org (mailing list archive)
State New
Headers show
Series Simple lockd clean-ups | expand

Commit Message

Chuck Lever Oct. 17, 2024, 1:36 p.m. UTC
From: Chuck Lever <chuck.lever@oracle.com>

Since commit 75c7940d2a86 ("lockd: set missing fl_flags field when
retrieving args"), nlmsvc_retrieve_args() initializes the flc_flags
field. svcxdr_decode_lock() no longer needs to do this.

This clean up removes one dependency on the nlm_lock:fl field. No
behavior change is expected.

Analysis:

svcxdr_decode_lock() is called by:

nlm4svc_decode_testargs()
nlm4svc_decode_lockargs()
nlm4svc_decode_cancargs()
nlm4svc_decode_unlockargs()

nlm4svc_decode_testargs() is used by:
- NLMPROC4_TEST and NLMPROC4_TEST_MSG, which call nlmsvc_retrieve_args()
- NLMPROC4_GRANTED and NLMPROC4_GRANTED_MSG, which don't pass the
  lock's file_lock to the generic lock API

nlm4svc_decode_lockargs() is used by:
- NLMPROC4_LOCK and NLM4PROC4_LOCK_MSG, which call nlmsvc_retrieve_args()
- NLMPROC4_UNLOCK and NLM4PROC4_UNLOCK_MSG, which call nlmsvc_retrieve_args()
- NLMPROC4_NM_LOCK, which calls nlmsvc_retrieve_args()

nlm4svc_decode_cancargs() is used by:
- NLMPROC4_CANCEL and NLMPROC4_CANCEL_MSG, which call nlmsvc_retrieve_args()

nlm4svc_decode_unlockargs() is used by:
- NLMPROC4_UNLOCK and NLMPROC4_UNLOCK_MSG, which call nlmsvc_retrieve_args()

All callers except GRANTED/GRANTED_MSG eventually call
nlmsvc_retrieve_args() before using nlm_lock::fl.c.flc_flags. Thus
this change is safe.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 fs/lockd/svc4proc.c | 5 +++--
 fs/lockd/xdr4.c     | 1 -
 2 files changed, 3 insertions(+), 3 deletions(-)

Comments

Jeff Layton Oct. 17, 2024, 7:13 p.m. UTC | #1
On Thu, 2024-10-17 at 09:36 -0400, cel@kernel.org wrote:
> From: Chuck Lever <chuck.lever@oracle.com>
> 
> Since commit 75c7940d2a86 ("lockd: set missing fl_flags field when
> retrieving args"), nlmsvc_retrieve_args() initializes the flc_flags
> field. svcxdr_decode_lock() no longer needs to do this.
> 
> This clean up removes one dependency on the nlm_lock:fl field. No
> behavior change is expected.
> 
> Analysis:
> 
> svcxdr_decode_lock() is called by:
> 
> nlm4svc_decode_testargs()
> nlm4svc_decode_lockargs()
> nlm4svc_decode_cancargs()
> nlm4svc_decode_unlockargs()
> 
> nlm4svc_decode_testargs() is used by:
> - NLMPROC4_TEST and NLMPROC4_TEST_MSG, which call nlmsvc_retrieve_args()
> - NLMPROC4_GRANTED and NLMPROC4_GRANTED_MSG, which don't pass the
>   lock's file_lock to the generic lock API
> 
> nlm4svc_decode_lockargs() is used by:
> - NLMPROC4_LOCK and NLM4PROC4_LOCK_MSG, which call nlmsvc_retrieve_args()
> - NLMPROC4_UNLOCK and NLM4PROC4_UNLOCK_MSG, which call nlmsvc_retrieve_args()
> - NLMPROC4_NM_LOCK, which calls nlmsvc_retrieve_args()
> 
> nlm4svc_decode_cancargs() is used by:
> - NLMPROC4_CANCEL and NLMPROC4_CANCEL_MSG, which call nlmsvc_retrieve_args()
> 
> nlm4svc_decode_unlockargs() is used by:
> - NLMPROC4_UNLOCK and NLMPROC4_UNLOCK_MSG, which call nlmsvc_retrieve_args()
> 
> All callers except GRANTED/GRANTED_MSG eventually call
> nlmsvc_retrieve_args() before using nlm_lock::fl.c.flc_flags. Thus
> this change is safe.
> 
> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
> ---
>  fs/lockd/svc4proc.c | 5 +++--
>  fs/lockd/xdr4.c     | 1 -
>  2 files changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/lockd/svc4proc.c b/fs/lockd/svc4proc.c
> index 2cb603013111..109e5caae8c7 100644
> --- a/fs/lockd/svc4proc.c
> +++ b/fs/lockd/svc4proc.c
> @@ -46,14 +46,15 @@ nlm4svc_retrieve_args(struct svc_rqst *rqstp, struct nlm_args *argp,
>  	if (filp != NULL) {
>  		int mode = lock_to_openmode(&lock->fl);
>  
> +		lock->fl.c.flc_flags = FL_POSIX;
> +
>  		error = nlm_lookup_file(rqstp, &file, lock);
>  		if (error)
>  			goto no_locks;
>  		*filp = file;
>  
>  		/* Set up the missing parts of the file_lock structure */
> -		lock->fl.c.flc_flags = FL_POSIX;
> -		lock->fl.c.flc_file  = file->f_file[mode];
> +		lock->fl.c.flc_file = file->f_file[mode];
>  		lock->fl.c.flc_pid = current->tgid;
>  		lock->fl.fl_start = (loff_t)lock->lock_start;
>  		lock->fl.fl_end = lock->lock_len ?
> diff --git a/fs/lockd/xdr4.c b/fs/lockd/xdr4.c
> index 60466b8bac58..e343c820301f 100644
> --- a/fs/lockd/xdr4.c
> +++ b/fs/lockd/xdr4.c
> @@ -89,7 +89,6 @@ svcxdr_decode_lock(struct xdr_stream *xdr, struct nlm_lock *lock)
>  		return false;
>  
>  	locks_init_lock(fl);
> -	fl->c.flc_flags = FL_POSIX;
>  	fl->c.flc_type  = F_RDLCK;
>  	nlm4svc_set_file_lock_range(fl, lock->lock_start, lock->lock_len);
>  	return true;

1-4 look fine. You can add my R-b to those.

For this one, I think I'd rather see this go the other way, and just
eliminate the setting of flc_flags in nlm4svc_retrieve_args. We only
deal with FL_POSIX locks in svc lockd, and that does it right after
locks_init_lock, so I think that means it'll be done earlier, no?

Also, I think the same duplication is in nlmsvc_retrieve_args and the
nlmv3 version of svcxdr_decode_lock.
--
Jeff Layton <jlayton@kernel.org>
Chuck Lever Oct. 17, 2024, 7:16 p.m. UTC | #2
> On Oct 17, 2024, at 3:13 PM, Jeff Layton <jlayton@kernel.org> wrote:
> 
> On Thu, 2024-10-17 at 09:36 -0400, cel@kernel.org wrote:
>> From: Chuck Lever <chuck.lever@oracle.com>
>> 
>> Since commit 75c7940d2a86 ("lockd: set missing fl_flags field when
>> retrieving args"), nlmsvc_retrieve_args() initializes the flc_flags
>> field. svcxdr_decode_lock() no longer needs to do this.
>> 
>> This clean up removes one dependency on the nlm_lock:fl field. No
>> behavior change is expected.
>> 
>> Analysis:
>> 
>> svcxdr_decode_lock() is called by:
>> 
>> nlm4svc_decode_testargs()
>> nlm4svc_decode_lockargs()
>> nlm4svc_decode_cancargs()
>> nlm4svc_decode_unlockargs()
>> 
>> nlm4svc_decode_testargs() is used by:
>> - NLMPROC4_TEST and NLMPROC4_TEST_MSG, which call nlmsvc_retrieve_args()
>> - NLMPROC4_GRANTED and NLMPROC4_GRANTED_MSG, which don't pass the
>>  lock's file_lock to the generic lock API
>> 
>> nlm4svc_decode_lockargs() is used by:
>> - NLMPROC4_LOCK and NLM4PROC4_LOCK_MSG, which call nlmsvc_retrieve_args()
>> - NLMPROC4_UNLOCK and NLM4PROC4_UNLOCK_MSG, which call nlmsvc_retrieve_args()
>> - NLMPROC4_NM_LOCK, which calls nlmsvc_retrieve_args()
>> 
>> nlm4svc_decode_cancargs() is used by:
>> - NLMPROC4_CANCEL and NLMPROC4_CANCEL_MSG, which call nlmsvc_retrieve_args()
>> 
>> nlm4svc_decode_unlockargs() is used by:
>> - NLMPROC4_UNLOCK and NLMPROC4_UNLOCK_MSG, which call nlmsvc_retrieve_args()
>> 
>> All callers except GRANTED/GRANTED_MSG eventually call
>> nlmsvc_retrieve_args() before using nlm_lock::fl.c.flc_flags. Thus
>> this change is safe.
>> 
>> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
>> ---
>> fs/lockd/svc4proc.c | 5 +++--
>> fs/lockd/xdr4.c     | 1 -
>> 2 files changed, 3 insertions(+), 3 deletions(-)
>> 
>> diff --git a/fs/lockd/svc4proc.c b/fs/lockd/svc4proc.c
>> index 2cb603013111..109e5caae8c7 100644
>> --- a/fs/lockd/svc4proc.c
>> +++ b/fs/lockd/svc4proc.c
>> @@ -46,14 +46,15 @@ nlm4svc_retrieve_args(struct svc_rqst *rqstp, struct nlm_args *argp,
>> if (filp != NULL) {
>> int mode = lock_to_openmode(&lock->fl);
>> 
>> + lock->fl.c.flc_flags = FL_POSIX;
>> +
>> error = nlm_lookup_file(rqstp, &file, lock);
>> if (error)
>> goto no_locks;
>> *filp = file;
>> 
>> /* Set up the missing parts of the file_lock structure */
>> - lock->fl.c.flc_flags = FL_POSIX;
>> - lock->fl.c.flc_file  = file->f_file[mode];
>> + lock->fl.c.flc_file = file->f_file[mode];
>> lock->fl.c.flc_pid = current->tgid;
>> lock->fl.fl_start = (loff_t)lock->lock_start;
>> lock->fl.fl_end = lock->lock_len ?
>> diff --git a/fs/lockd/xdr4.c b/fs/lockd/xdr4.c
>> index 60466b8bac58..e343c820301f 100644
>> --- a/fs/lockd/xdr4.c
>> +++ b/fs/lockd/xdr4.c
>> @@ -89,7 +89,6 @@ svcxdr_decode_lock(struct xdr_stream *xdr, struct nlm_lock *lock)
>> return false;
>> 
>> locks_init_lock(fl);
>> - fl->c.flc_flags = FL_POSIX;
>> fl->c.flc_type  = F_RDLCK;
>> nlm4svc_set_file_lock_range(fl, lock->lock_start, lock->lock_len);
>> return true;
> 
> 1-4 look fine. You can add my R-b to those.

Thanks!


> For this one, I think I'd rather see this go the other way, and just
> eliminate the setting of flc_flags in nlm4svc_retrieve_args. We only
> deal with FL_POSIX locks in svc lockd, and that does it right after
> locks_init_lock, so I think that means it'll be done earlier, no?

Have a look at the nlm4 branch in my kernel.org <http://kernel.org/> repo to see where
this is headed.


> Also, I think the same duplication is in nlmsvc_retrieve_args and the
> nlmv3 version of svcxdr_decode_lock.

Which is going away when NFSv2 is removed. I'm not too concerned
about that duplication.


--
Chuck Lever
Jeff Layton Oct. 17, 2024, 7:30 p.m. UTC | #3
On Thu, 2024-10-17 at 19:16 +0000, Chuck Lever III wrote:
> 
> > On Oct 17, 2024, at 3:13 PM, Jeff Layton <jlayton@kernel.org> wrote:
> > 
> > On Thu, 2024-10-17 at 09:36 -0400, cel@kernel.org wrote:
> > > From: Chuck Lever <chuck.lever@oracle.com>
> > > 
> > > Since commit 75c7940d2a86 ("lockd: set missing fl_flags field when
> > > retrieving args"), nlmsvc_retrieve_args() initializes the flc_flags
> > > field. svcxdr_decode_lock() no longer needs to do this.
> > > 
> > > This clean up removes one dependency on the nlm_lock:fl field. No
> > > behavior change is expected.
> > > 
> > > Analysis:
> > > 
> > > svcxdr_decode_lock() is called by:
> > > 
> > > nlm4svc_decode_testargs()
> > > nlm4svc_decode_lockargs()
> > > nlm4svc_decode_cancargs()
> > > nlm4svc_decode_unlockargs()
> > > 
> > > nlm4svc_decode_testargs() is used by:
> > > - NLMPROC4_TEST and NLMPROC4_TEST_MSG, which call nlmsvc_retrieve_args()
> > > - NLMPROC4_GRANTED and NLMPROC4_GRANTED_MSG, which don't pass the
> > >  lock's file_lock to the generic lock API
> > > 
> > > nlm4svc_decode_lockargs() is used by:
> > > - NLMPROC4_LOCK and NLM4PROC4_LOCK_MSG, which call nlmsvc_retrieve_args()
> > > - NLMPROC4_UNLOCK and NLM4PROC4_UNLOCK_MSG, which call nlmsvc_retrieve_args()
> > > - NLMPROC4_NM_LOCK, which calls nlmsvc_retrieve_args()
> > > 
> > > nlm4svc_decode_cancargs() is used by:
> > > - NLMPROC4_CANCEL and NLMPROC4_CANCEL_MSG, which call nlmsvc_retrieve_args()
> > > 
> > > nlm4svc_decode_unlockargs() is used by:
> > > - NLMPROC4_UNLOCK and NLMPROC4_UNLOCK_MSG, which call nlmsvc_retrieve_args()
> > > 
> > > All callers except GRANTED/GRANTED_MSG eventually call
> > > nlmsvc_retrieve_args() before using nlm_lock::fl.c.flc_flags. Thus
> > > this change is safe.
> > > 
> > > Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
> > > ---
> > > fs/lockd/svc4proc.c | 5 +++--
> > > fs/lockd/xdr4.c     | 1 -
> > > 2 files changed, 3 insertions(+), 3 deletions(-)
> > > 
> > > diff --git a/fs/lockd/svc4proc.c b/fs/lockd/svc4proc.c
> > > index 2cb603013111..109e5caae8c7 100644
> > > --- a/fs/lockd/svc4proc.c
> > > +++ b/fs/lockd/svc4proc.c
> > > @@ -46,14 +46,15 @@ nlm4svc_retrieve_args(struct svc_rqst *rqstp, struct nlm_args *argp,
> > > if (filp != NULL) {
> > > int mode = lock_to_openmode(&lock->fl);
> > > 
> > > + lock->fl.c.flc_flags = FL_POSIX;
> > > +
> > > error = nlm_lookup_file(rqstp, &file, lock);
> > > if (error)
> > > goto no_locks;
> > > *filp = file;
> > > 
> > > /* Set up the missing parts of the file_lock structure */
> > > - lock->fl.c.flc_flags = FL_POSIX;
> > > - lock->fl.c.flc_file  = file->f_file[mode];
> > > + lock->fl.c.flc_file = file->f_file[mode];
> > > lock->fl.c.flc_pid = current->tgid;
> > > lock->fl.fl_start = (loff_t)lock->lock_start;
> > > lock->fl.fl_end = lock->lock_len ?
> > > diff --git a/fs/lockd/xdr4.c b/fs/lockd/xdr4.c
> > > index 60466b8bac58..e343c820301f 100644
> > > --- a/fs/lockd/xdr4.c
> > > +++ b/fs/lockd/xdr4.c
> > > @@ -89,7 +89,6 @@ svcxdr_decode_lock(struct xdr_stream *xdr, struct nlm_lock *lock)
> > > return false;
> > > 
> > > locks_init_lock(fl);
> > > - fl->c.flc_flags = FL_POSIX;
> > > fl->c.flc_type  = F_RDLCK;
> > > nlm4svc_set_file_lock_range(fl, lock->lock_start, lock->lock_len);
> > > return true;
> > 
> > 1-4 look fine. You can add my R-b to those.
> 
> Thanks!
> 
> 
> > For this one, I think I'd rather see this go the other way, and just
> > eliminate the setting of flc_flags in nlm4svc_retrieve_args. We only
> > deal with FL_POSIX locks in svc lockd, and that does it right after
> > locks_init_lock, so I think that means it'll be done earlier, no?
> 
> Have a look at the nlm4 branch in my kernel.org <http://kernel.org/> repo to see where
> this is headed.
> 

(For everyone following along: It's actually in Chuck's xdrgen branch)

Oh ok, I see. This is an interim step toward moving all of the lock
initialization into nlm4svc_retrieve_args(). That probably is better. I
withdraw my objection.

> 
> > Also, I think the same duplication is in nlmsvc_retrieve_args and the
> > nlmv3 version of svcxdr_decode_lock.
> 
> Which is going away when NFSv2 is removed. I'm not too concerned
> about that duplication.
> 

Fair enough. I'm fine with leaving that to wither for now:

Reviewed-by: Jeff Layton <jlayton@kernel.org>
NeilBrown Oct. 17, 2024, 8:56 p.m. UTC | #4
On Fri, 18 Oct 2024, Chuck Lever III wrote:
> 
> Which is going away when NFSv2 is removed. I'm not too concerned
> about that duplication.
> 

We have a customer with industrial hardware which stores data (logs?)
via NFSv2.  So we might need to continue to support v2 indefinitely.

Possibly we could use a user-space-nfsd solution if/when v2 service is
removed from the kernel, but I would rather not.

Reverting the nfs-utils patches which remove v2 support is fairly easy. 
Reverting kernel patches that remove v2 support wouldn't be so easy in
the long term.

So I'd vote for not removing NFSv2 from the server.

Thanks,
NeilBrown
NeilBrown Oct. 17, 2024, 9:22 p.m. UTC | #5
On Fri, 18 Oct 2024, Jeff Layton wrote:
> On Thu, 2024-10-17 at 19:16 +0000, Chuck Lever III wrote:
> > 
> > > On Oct 17, 2024, at 3:13 PM, Jeff Layton <jlayton@kernel.org> wrote:
> > > 
> > > On Thu, 2024-10-17 at 09:36 -0400, cel@kernel.org wrote:
> > > > From: Chuck Lever <chuck.lever@oracle.com>
> > > > 
> > > > Since commit 75c7940d2a86 ("lockd: set missing fl_flags field when
> > > > retrieving args"), nlmsvc_retrieve_args() initializes the flc_flags
> > > > field. svcxdr_decode_lock() no longer needs to do this.
> > > > 
> > > > This clean up removes one dependency on the nlm_lock:fl field. No
> > > > behavior change is expected.
> > > > 
> > > > Analysis:
> > > > 
> > > > svcxdr_decode_lock() is called by:
> > > > 
> > > > nlm4svc_decode_testargs()
> > > > nlm4svc_decode_lockargs()
> > > > nlm4svc_decode_cancargs()
> > > > nlm4svc_decode_unlockargs()
> > > > 
> > > > nlm4svc_decode_testargs() is used by:
> > > > - NLMPROC4_TEST and NLMPROC4_TEST_MSG, which call nlmsvc_retrieve_args()
> > > > - NLMPROC4_GRANTED and NLMPROC4_GRANTED_MSG, which don't pass the
> > > >  lock's file_lock to the generic lock API
> > > > 
> > > > nlm4svc_decode_lockargs() is used by:
> > > > - NLMPROC4_LOCK and NLM4PROC4_LOCK_MSG, which call nlmsvc_retrieve_args()
> > > > - NLMPROC4_UNLOCK and NLM4PROC4_UNLOCK_MSG, which call nlmsvc_retrieve_args()
> > > > - NLMPROC4_NM_LOCK, which calls nlmsvc_retrieve_args()
> > > > 
> > > > nlm4svc_decode_cancargs() is used by:
> > > > - NLMPROC4_CANCEL and NLMPROC4_CANCEL_MSG, which call nlmsvc_retrieve_args()
> > > > 
> > > > nlm4svc_decode_unlockargs() is used by:
> > > > - NLMPROC4_UNLOCK and NLMPROC4_UNLOCK_MSG, which call nlmsvc_retrieve_args()
> > > > 
> > > > All callers except GRANTED/GRANTED_MSG eventually call
> > > > nlmsvc_retrieve_args() before using nlm_lock::fl.c.flc_flags. Thus
> > > > this change is safe.
> > > > 
> > > > Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
> > > > ---
> > > > fs/lockd/svc4proc.c | 5 +++--
> > > > fs/lockd/xdr4.c     | 1 -
> > > > 2 files changed, 3 insertions(+), 3 deletions(-)
> > > > 
> > > > diff --git a/fs/lockd/svc4proc.c b/fs/lockd/svc4proc.c
> > > > index 2cb603013111..109e5caae8c7 100644
> > > > --- a/fs/lockd/svc4proc.c
> > > > +++ b/fs/lockd/svc4proc.c
> > > > @@ -46,14 +46,15 @@ nlm4svc_retrieve_args(struct svc_rqst *rqstp, struct nlm_args *argp,
> > > > if (filp != NULL) {
> > > > int mode = lock_to_openmode(&lock->fl);
> > > > 
> > > > + lock->fl.c.flc_flags = FL_POSIX;
> > > > +
> > > > error = nlm_lookup_file(rqstp, &file, lock);
> > > > if (error)
> > > > goto no_locks;
> > > > *filp = file;
> > > > 
> > > > /* Set up the missing parts of the file_lock structure */
> > > > - lock->fl.c.flc_flags = FL_POSIX;
> > > > - lock->fl.c.flc_file  = file->f_file[mode];
> > > > + lock->fl.c.flc_file = file->f_file[mode];
> > > > lock->fl.c.flc_pid = current->tgid;
> > > > lock->fl.fl_start = (loff_t)lock->lock_start;
> > > > lock->fl.fl_end = lock->lock_len ?
> > > > diff --git a/fs/lockd/xdr4.c b/fs/lockd/xdr4.c
> > > > index 60466b8bac58..e343c820301f 100644
> > > > --- a/fs/lockd/xdr4.c
> > > > +++ b/fs/lockd/xdr4.c
> > > > @@ -89,7 +89,6 @@ svcxdr_decode_lock(struct xdr_stream *xdr, struct nlm_lock *lock)
> > > > return false;
> > > > 
> > > > locks_init_lock(fl);
> > > > - fl->c.flc_flags = FL_POSIX;
> > > > fl->c.flc_type  = F_RDLCK;
> > > > nlm4svc_set_file_lock_range(fl, lock->lock_start, lock->lock_len);
> > > > return true;
> > > 
> > > 1-4 look fine. You can add my R-b to those.
> > 
> > Thanks!
> > 
> > 
> > > For this one, I think I'd rather see this go the other way, and just
> > > eliminate the setting of flc_flags in nlm4svc_retrieve_args. We only
> > > deal with FL_POSIX locks in svc lockd, and that does it right after
> > > locks_init_lock, so I think that means it'll be done earlier, no?
> > 
> > Have a look at the nlm4 branch in my kernel.org <http://kernel.org/> repo to see where
> > this is headed.
> > 
> 
> (For everyone following along: It's actually in Chuck's xdrgen branch)
> 
> Oh ok, I see. This is an interim step toward moving all of the lock
> initialization into nlm4svc_retrieve_args(). That probably is better. I
> withdraw my objection.

Adding that observation to the commit message would help with review.
I agree that moving the initialisation to nlm4svc_retrieve_args() seems
sensible.  The half-way version in this patch looks really odd without
that explanation.

But the whole series
 Reviewed-by: NeilBrown <neilb@suse.de>

Thanks,
NeilBrown



> 
> > 
> > > Also, I think the same duplication is in nlmsvc_retrieve_args and the
> > > nlmv3 version of svcxdr_decode_lock.
> > 
> > Which is going away when NFSv2 is removed. I'm not too concerned
> > about that duplication.
> > 
> 
> Fair enough. I'm fine with leaving that to wither for now:
> 
> Reviewed-by: Jeff Layton <jlayton@kernel.org>
>
Chuck Lever Oct. 17, 2024, 9:34 p.m. UTC | #6
On Fri, Oct 18, 2024 at 08:22:38AM +1100, NeilBrown wrote:
> On Fri, 18 Oct 2024, Jeff Layton wrote:
> > On Thu, 2024-10-17 at 19:16 +0000, Chuck Lever III wrote:
> > > 
> > > > On Oct 17, 2024, at 3:13 PM, Jeff Layton <jlayton@kernel.org> wrote:
> > > > 
> > > > On Thu, 2024-10-17 at 09:36 -0400, cel@kernel.org wrote:
> > > > > From: Chuck Lever <chuck.lever@oracle.com>
> > > > > 
> > > > > Since commit 75c7940d2a86 ("lockd: set missing fl_flags field when
> > > > > retrieving args"), nlmsvc_retrieve_args() initializes the flc_flags
> > > > > field. svcxdr_decode_lock() no longer needs to do this.
> > > > > 
> > > > > This clean up removes one dependency on the nlm_lock:fl field. No
> > > > > behavior change is expected.
> > > > > 
> > > > > Analysis:
> > > > > 
> > > > > svcxdr_decode_lock() is called by:
> > > > > 
> > > > > nlm4svc_decode_testargs()
> > > > > nlm4svc_decode_lockargs()
> > > > > nlm4svc_decode_cancargs()
> > > > > nlm4svc_decode_unlockargs()
> > > > > 
> > > > > nlm4svc_decode_testargs() is used by:
> > > > > - NLMPROC4_TEST and NLMPROC4_TEST_MSG, which call nlmsvc_retrieve_args()
> > > > > - NLMPROC4_GRANTED and NLMPROC4_GRANTED_MSG, which don't pass the
> > > > >  lock's file_lock to the generic lock API
> > > > > 
> > > > > nlm4svc_decode_lockargs() is used by:
> > > > > - NLMPROC4_LOCK and NLM4PROC4_LOCK_MSG, which call nlmsvc_retrieve_args()
> > > > > - NLMPROC4_UNLOCK and NLM4PROC4_UNLOCK_MSG, which call nlmsvc_retrieve_args()
> > > > > - NLMPROC4_NM_LOCK, which calls nlmsvc_retrieve_args()
> > > > > 
> > > > > nlm4svc_decode_cancargs() is used by:
> > > > > - NLMPROC4_CANCEL and NLMPROC4_CANCEL_MSG, which call nlmsvc_retrieve_args()
> > > > > 
> > > > > nlm4svc_decode_unlockargs() is used by:
> > > > > - NLMPROC4_UNLOCK and NLMPROC4_UNLOCK_MSG, which call nlmsvc_retrieve_args()
> > > > > 
> > > > > All callers except GRANTED/GRANTED_MSG eventually call
> > > > > nlmsvc_retrieve_args() before using nlm_lock::fl.c.flc_flags. Thus
> > > > > this change is safe.
> > > > > 
> > > > > Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
> > > > > ---
> > > > > fs/lockd/svc4proc.c | 5 +++--
> > > > > fs/lockd/xdr4.c     | 1 -
> > > > > 2 files changed, 3 insertions(+), 3 deletions(-)
> > > > > 
> > > > > diff --git a/fs/lockd/svc4proc.c b/fs/lockd/svc4proc.c
> > > > > index 2cb603013111..109e5caae8c7 100644
> > > > > --- a/fs/lockd/svc4proc.c
> > > > > +++ b/fs/lockd/svc4proc.c
> > > > > @@ -46,14 +46,15 @@ nlm4svc_retrieve_args(struct svc_rqst *rqstp, struct nlm_args *argp,
> > > > > if (filp != NULL) {
> > > > > int mode = lock_to_openmode(&lock->fl);
> > > > > 
> > > > > + lock->fl.c.flc_flags = FL_POSIX;
> > > > > +
> > > > > error = nlm_lookup_file(rqstp, &file, lock);
> > > > > if (error)
> > > > > goto no_locks;
> > > > > *filp = file;
> > > > > 
> > > > > /* Set up the missing parts of the file_lock structure */
> > > > > - lock->fl.c.flc_flags = FL_POSIX;
> > > > > - lock->fl.c.flc_file  = file->f_file[mode];
> > > > > + lock->fl.c.flc_file = file->f_file[mode];
> > > > > lock->fl.c.flc_pid = current->tgid;
> > > > > lock->fl.fl_start = (loff_t)lock->lock_start;
> > > > > lock->fl.fl_end = lock->lock_len ?
> > > > > diff --git a/fs/lockd/xdr4.c b/fs/lockd/xdr4.c
> > > > > index 60466b8bac58..e343c820301f 100644
> > > > > --- a/fs/lockd/xdr4.c
> > > > > +++ b/fs/lockd/xdr4.c
> > > > > @@ -89,7 +89,6 @@ svcxdr_decode_lock(struct xdr_stream *xdr, struct nlm_lock *lock)
> > > > > return false;
> > > > > 
> > > > > locks_init_lock(fl);
> > > > > - fl->c.flc_flags = FL_POSIX;
> > > > > fl->c.flc_type  = F_RDLCK;
> > > > > nlm4svc_set_file_lock_range(fl, lock->lock_start, lock->lock_len);
> > > > > return true;
> > > > 
> > > > 1-4 look fine. You can add my R-b to those.
> > > 
> > > Thanks!
> > > 
> > > 
> > > > For this one, I think I'd rather see this go the other way, and just
> > > > eliminate the setting of flc_flags in nlm4svc_retrieve_args. We only
> > > > deal with FL_POSIX locks in svc lockd, and that does it right after
> > > > locks_init_lock, so I think that means it'll be done earlier, no?
> > > 
> > > Have a look at the nlm4 branch in my kernel.org <http://kernel.org/> repo to see where
> > > this is headed.
> > > 
> > 
> > (For everyone following along: It's actually in Chuck's xdrgen branch)
> > 
> > Oh ok, I see. This is an interim step toward moving all of the lock
> > initialization into nlm4svc_retrieve_args(). That probably is better. I
> > withdraw my objection.
> 
> Adding that observation to the commit message would help with review.

I was hoping to break these up to make them easier to review, but
for 5/5 I guess it didn't help.

I can send more of these clean-up/refactors along for v6.13. But I'm
not sure the actual conversion later in the xdrgen branch is ready
for prime time.


> I agree that moving the initialisation to nlm4svc_retrieve_args() seems
> sensible.  The half-way version in this patch looks really odd without
> that explanation.
> 
> But the whole series
>  Reviewed-by: NeilBrown <neilb@suse.de>
> 
> Thanks,
> NeilBrown
> 
> 
> 
> > 
> > > 
> > > > Also, I think the same duplication is in nlmsvc_retrieve_args and the
> > > > nlmv3 version of svcxdr_decode_lock.
> > > 
> > > Which is going away when NFSv2 is removed. I'm not too concerned
> > > about that duplication.
> > > 
> > 
> > Fair enough. I'm fine with leaving that to wither for now:
> > 
> > Reviewed-by: Jeff Layton <jlayton@kernel.org>
> > 
>
diff mbox series

Patch

diff --git a/fs/lockd/svc4proc.c b/fs/lockd/svc4proc.c
index 2cb603013111..109e5caae8c7 100644
--- a/fs/lockd/svc4proc.c
+++ b/fs/lockd/svc4proc.c
@@ -46,14 +46,15 @@  nlm4svc_retrieve_args(struct svc_rqst *rqstp, struct nlm_args *argp,
 	if (filp != NULL) {
 		int mode = lock_to_openmode(&lock->fl);
 
+		lock->fl.c.flc_flags = FL_POSIX;
+
 		error = nlm_lookup_file(rqstp, &file, lock);
 		if (error)
 			goto no_locks;
 		*filp = file;
 
 		/* Set up the missing parts of the file_lock structure */
-		lock->fl.c.flc_flags = FL_POSIX;
-		lock->fl.c.flc_file  = file->f_file[mode];
+		lock->fl.c.flc_file = file->f_file[mode];
 		lock->fl.c.flc_pid = current->tgid;
 		lock->fl.fl_start = (loff_t)lock->lock_start;
 		lock->fl.fl_end = lock->lock_len ?
diff --git a/fs/lockd/xdr4.c b/fs/lockd/xdr4.c
index 60466b8bac58..e343c820301f 100644
--- a/fs/lockd/xdr4.c
+++ b/fs/lockd/xdr4.c
@@ -89,7 +89,6 @@  svcxdr_decode_lock(struct xdr_stream *xdr, struct nlm_lock *lock)
 		return false;
 
 	locks_init_lock(fl);
-	fl->c.flc_flags = FL_POSIX;
 	fl->c.flc_type  = F_RDLCK;
 	nlm4svc_set_file_lock_range(fl, lock->lock_start, lock->lock_len);
 	return true;