Message ID | 1645640197-1725-3-git-send-email-dai.ngo@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | NFSD: Initial implementation of NFSv4 Courteous Server | expand |
> On Feb 23, 2022, at 1:16 PM, Dai Ngo <dai.ngo@oracle.com> wrote: > > Add callout function nfsd4_lm_lock_expired for lm_lock_expired. > If lock request has conflict with courtesy client then expire the > courtesy client and return no conflict to caller. > > Signed-off-by: Dai Ngo <dai.ngo@oracle.com> > --- > fs/nfsd/nfs4state.c | 37 +++++++++++++++++++++++++++++++++++++ > 1 file changed, 37 insertions(+) > > diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c > index 6a10f089ef4c..6bca727978ea 100644 > --- a/fs/nfsd/nfs4state.c > +++ b/fs/nfsd/nfs4state.c > @@ -6578,10 +6578,47 @@ nfsd4_lm_notify(struct file_lock *fl) > } > } > > +/** > + * nfsd4_lm_lock_expired - check if lock conflict can be resolved. > + * > + * @fl: pointer to file_lock with a potential conflict > + * Return values: > + * %false: real conflict, lock conflict can not be resolved. > + * %true: no conflict, lock conflict was resolved. > + * > + * Note that this function is called while the flc_lock is held. > + */ > +static bool > +nfsd4_lm_lock_expired(struct file_lock *fl) > +{ > + struct nfs4_lockowner *lo; > + struct nfs4_client *clp; > + bool rc = false; > + > + if (!fl) > + return false; > + lo = (struct nfs4_lockowner *)fl->fl_owner; > + clp = lo->lo_owner.so_client; > + > + /* need to sync with courtesy client trying to reconnect */ > + spin_lock(&clp->cl_cs_lock); > + if (test_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags)) > + rc = true; > + else { > + if (test_bit(NFSD4_CLIENT_COURTESY, &clp->cl_flags)) { > + set_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags); > + rc = true; > + } > + } > + spin_unlock(&clp->cl_cs_lock); > + return rc; > +} > + > static const struct lock_manager_operations nfsd_posix_mng_ops = { > .lm_notify = nfsd4_lm_notify, > .lm_get_owner = nfsd4_fl_get_owner, > .lm_put_owner = nfsd4_fl_put_owner, I started to pull this series, but quickly realized it isn't based on the current contents of the NFSD for-next topic branch, which changes the names of nfsd4_fl_{put,get}_owner as we discussed during v13 review. The upshot is that I would have to apply each of these patches by hand, which is tedious and error prone for more than one or two patches. Please pull the latest from my for-next branch, rebase this series, and then post again. Thanks! > + .lm_lock_expired = nfsd4_lm_lock_expired, > }; > > static inline void > -- > 2.9.5 > -- Chuck Lever
On 2/25/22 8:29 AM, Chuck Lever III wrote: > >> On Feb 23, 2022, at 1:16 PM, Dai Ngo <dai.ngo@oracle.com> wrote: >> >> Add callout function nfsd4_lm_lock_expired for lm_lock_expired. >> If lock request has conflict with courtesy client then expire the >> courtesy client and return no conflict to caller. >> >> Signed-off-by: Dai Ngo <dai.ngo@oracle.com> >> --- >> fs/nfsd/nfs4state.c | 37 +++++++++++++++++++++++++++++++++++++ >> 1 file changed, 37 insertions(+) >> >> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c >> index 6a10f089ef4c..6bca727978ea 100644 >> --- a/fs/nfsd/nfs4state.c >> +++ b/fs/nfsd/nfs4state.c >> @@ -6578,10 +6578,47 @@ nfsd4_lm_notify(struct file_lock *fl) >> } >> } >> >> +/** >> + * nfsd4_lm_lock_expired - check if lock conflict can be resolved. >> + * >> + * @fl: pointer to file_lock with a potential conflict >> + * Return values: >> + * %false: real conflict, lock conflict can not be resolved. >> + * %true: no conflict, lock conflict was resolved. >> + * >> + * Note that this function is called while the flc_lock is held. >> + */ >> +static bool >> +nfsd4_lm_lock_expired(struct file_lock *fl) >> +{ >> + struct nfs4_lockowner *lo; >> + struct nfs4_client *clp; >> + bool rc = false; >> + >> + if (!fl) >> + return false; >> + lo = (struct nfs4_lockowner *)fl->fl_owner; >> + clp = lo->lo_owner.so_client; >> + >> + /* need to sync with courtesy client trying to reconnect */ >> + spin_lock(&clp->cl_cs_lock); >> + if (test_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags)) >> + rc = true; >> + else { >> + if (test_bit(NFSD4_CLIENT_COURTESY, &clp->cl_flags)) { >> + set_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags); >> + rc = true; >> + } >> + } >> + spin_unlock(&clp->cl_cs_lock); >> + return rc; >> +} >> + >> static const struct lock_manager_operations nfsd_posix_mng_ops = { >> .lm_notify = nfsd4_lm_notify, >> .lm_get_owner = nfsd4_fl_get_owner, >> .lm_put_owner = nfsd4_fl_put_owner, > I started to pull this series, but quickly realized it isn't > based on the current contents of the NFSD for-next topic > branch, which changes the names of nfsd4_fl_{put,get}_owner > as we discussed during v13 review. > > The upshot is that I would have to apply each of these patches > by hand, which is tedious and error prone for more than one > or two patches. > > Please pull the latest from my for-next branch, rebase this > series, and then post again. Thanks!' will do in v15. -Dai > > >> + .lm_lock_expired = nfsd4_lm_lock_expired, >> }; >> >> static inline void >> -- >> 2.9.5 >> > -- > Chuck Lever > > >
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 6a10f089ef4c..6bca727978ea 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -6578,10 +6578,47 @@ nfsd4_lm_notify(struct file_lock *fl) } } +/** + * nfsd4_lm_lock_expired - check if lock conflict can be resolved. + * + * @fl: pointer to file_lock with a potential conflict + * Return values: + * %false: real conflict, lock conflict can not be resolved. + * %true: no conflict, lock conflict was resolved. + * + * Note that this function is called while the flc_lock is held. + */ +static bool +nfsd4_lm_lock_expired(struct file_lock *fl) +{ + struct nfs4_lockowner *lo; + struct nfs4_client *clp; + bool rc = false; + + if (!fl) + return false; + lo = (struct nfs4_lockowner *)fl->fl_owner; + clp = lo->lo_owner.so_client; + + /* need to sync with courtesy client trying to reconnect */ + spin_lock(&clp->cl_cs_lock); + if (test_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags)) + rc = true; + else { + if (test_bit(NFSD4_CLIENT_COURTESY, &clp->cl_flags)) { + set_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags); + rc = true; + } + } + spin_unlock(&clp->cl_cs_lock); + return rc; +} + static const struct lock_manager_operations nfsd_posix_mng_ops = { .lm_notify = nfsd4_lm_notify, .lm_get_owner = nfsd4_fl_get_owner, .lm_put_owner = nfsd4_fl_put_owner, + .lm_lock_expired = nfsd4_lm_lock_expired, }; static inline void
Add callout function nfsd4_lm_lock_expired for lm_lock_expired. If lock request has conflict with courtesy client then expire the courtesy client and return no conflict to caller. Signed-off-by: Dai Ngo <dai.ngo@oracle.com> --- fs/nfsd/nfs4state.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)