Message ID | 1646440633-3542-5-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 Mar 4, 2022, at 7:37 PM, Dai Ngo <dai.ngo@oracle.com> wrote: > > Update nfsd_breaker_owns_lease() to handle delegation conflict > with courtesy clients. If conflict was caused courtesy client > then discard the courtesy client by setting CLIENT_EXPIRED and > return conflict resolved. Client with CLIENT_EXPIRED is expired > by the laundromat. > > Signed-off-by: Dai Ngo <dai.ngo@oracle.com> > --- > fs/nfsd/nfs4state.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c > index 583ac807e98d..40a357fd1a14 100644 > --- a/fs/nfsd/nfs4state.c > +++ b/fs/nfsd/nfs4state.c > @@ -4727,6 +4727,24 @@ static bool nfsd_breaker_owns_lease(struct file_lock *fl) > struct svc_rqst *rqst; > struct nfs4_client *clp; > > + clp = dl->dl_stid.sc_client; > + /* > + * need to sync with courtesy client trying to reconnect using > + * the cl_cs_lock, nn->client_lock can not be used since this > + * function is called with the fl_lck held. > + */ > + spin_lock(&clp->cl_cs_lock); > + if (test_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags)) { > + spin_unlock(&clp->cl_cs_lock); > + return true; > + } > + if (test_bit(NFSD4_CLIENT_COURTESY, &clp->cl_flags)) { > + set_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags); > + spin_unlock(&clp->cl_cs_lock); > + return true; > + } > + spin_unlock(&clp->cl_cs_lock); > + Nit: Please add nfs4_check_and_expire_courtesy_client() in this patch instead of in 05/11. > if (!i_am_nfsd()) > return false; > rqst = kthread_data(current); > -- > 2.9.5 > -- Chuck Lever
On 3/9/22 1:46 PM, Chuck Lever III wrote: > >> On Mar 4, 2022, at 7:37 PM, Dai Ngo <dai.ngo@oracle.com> wrote: >> >> Update nfsd_breaker_owns_lease() to handle delegation conflict >> with courtesy clients. If conflict was caused courtesy client >> then discard the courtesy client by setting CLIENT_EXPIRED and >> return conflict resolved. Client with CLIENT_EXPIRED is expired >> by the laundromat. >> >> Signed-off-by: Dai Ngo <dai.ngo@oracle.com> >> --- >> fs/nfsd/nfs4state.c | 18 ++++++++++++++++++ >> 1 file changed, 18 insertions(+) >> >> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c >> index 583ac807e98d..40a357fd1a14 100644 >> --- a/fs/nfsd/nfs4state.c >> +++ b/fs/nfsd/nfs4state.c >> @@ -4727,6 +4727,24 @@ static bool nfsd_breaker_owns_lease(struct file_lock *fl) >> struct svc_rqst *rqst; >> struct nfs4_client *clp; >> >> + clp = dl->dl_stid.sc_client; >> + /* >> + * need to sync with courtesy client trying to reconnect using >> + * the cl_cs_lock, nn->client_lock can not be used since this >> + * function is called with the fl_lck held. >> + */ >> + spin_lock(&clp->cl_cs_lock); >> + if (test_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags)) { >> + spin_unlock(&clp->cl_cs_lock); >> + return true; >> + } >> + if (test_bit(NFSD4_CLIENT_COURTESY, &clp->cl_flags)) { >> + set_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags); >> + spin_unlock(&clp->cl_cs_lock); >> + return true; >> + } >> + spin_unlock(&clp->cl_cs_lock); >> + > Nit: Please add nfs4_check_and_expire_courtesy_client() in this patch > instead of in 05/11. That means nfs4_check_and_expire_courtesy_client is being called in 05/11 but is not defined in 05/11. Is that ok? -Dai > > >> if (!i_am_nfsd()) >> return false; >> rqst = kthread_data(current); >> -- >> 2.9.5 >> > -- > Chuck Lever > > >
> On Mar 10, 2022, at 12:09 AM, Dai Ngo <dai.ngo@oracle.com> wrote: > > > On 3/9/22 1:46 PM, Chuck Lever III wrote: >> >>> On Mar 4, 2022, at 7:37 PM, Dai Ngo <dai.ngo@oracle.com> wrote: >>> >>> Update nfsd_breaker_owns_lease() to handle delegation conflict >>> with courtesy clients. If conflict was caused courtesy client >>> then discard the courtesy client by setting CLIENT_EXPIRED and >>> return conflict resolved. Client with CLIENT_EXPIRED is expired >>> by the laundromat. >>> >>> Signed-off-by: Dai Ngo <dai.ngo@oracle.com> >>> --- >>> fs/nfsd/nfs4state.c | 18 ++++++++++++++++++ >>> 1 file changed, 18 insertions(+) >>> >>> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c >>> index 583ac807e98d..40a357fd1a14 100644 >>> --- a/fs/nfsd/nfs4state.c >>> +++ b/fs/nfsd/nfs4state.c >>> @@ -4727,6 +4727,24 @@ static bool nfsd_breaker_owns_lease(struct file_lock *fl) >>> struct svc_rqst *rqst; >>> struct nfs4_client *clp; >>> >>> + clp = dl->dl_stid.sc_client; >>> + /* >>> + * need to sync with courtesy client trying to reconnect using >>> + * the cl_cs_lock, nn->client_lock can not be used since this >>> + * function is called with the fl_lck held. >>> + */ >>> + spin_lock(&clp->cl_cs_lock); >>> + if (test_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags)) { >>> + spin_unlock(&clp->cl_cs_lock); >>> + return true; >>> + } >>> + if (test_bit(NFSD4_CLIENT_COURTESY, &clp->cl_flags)) { >>> + set_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags); >>> + spin_unlock(&clp->cl_cs_lock); >>> + return true; >>> + } >>> + spin_unlock(&clp->cl_cs_lock); >>> + >> Nit: Please add nfs4_check_and_expire_courtesy_client() in this patch >> instead of in 05/11. > > That means nfs4_check_and_expire_courtesy_client is being called > in 05/11 but is not defined in 05/11. Is that ok? I thought I saw a hunk in 5/11 that converts nfsd_breaker_owns_lease() to use nfs4_check_and_expire_courtesy_client(). If so, I prefer if you add nfs4_check_and_expire_courtesy_client() in this patch, and call it from nfsd_breaker_owns_lease(). Then the additional clean-up in 5/11 isn't needed. Again, this is a nit. But since you are driving a v16 soon anyway, I'd like the patches changed before they are merged. > -Dai > >> >> >>> if (!i_am_nfsd()) >>> return false; >>> rqst = kthread_data(current); >>> -- >>> 2.9.5 >>> >> -- >> Chuck Lever >> >> >> -- Chuck Lever
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 583ac807e98d..40a357fd1a14 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -4727,6 +4727,24 @@ static bool nfsd_breaker_owns_lease(struct file_lock *fl) struct svc_rqst *rqst; struct nfs4_client *clp; + clp = dl->dl_stid.sc_client; + /* + * need to sync with courtesy client trying to reconnect using + * the cl_cs_lock, nn->client_lock can not be used since this + * function is called with the fl_lck held. + */ + spin_lock(&clp->cl_cs_lock); + if (test_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags)) { + spin_unlock(&clp->cl_cs_lock); + return true; + } + if (test_bit(NFSD4_CLIENT_COURTESY, &clp->cl_flags)) { + set_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags); + spin_unlock(&clp->cl_cs_lock); + return true; + } + spin_unlock(&clp->cl_cs_lock); + if (!i_am_nfsd()) return false; rqst = kthread_data(current);
Update nfsd_breaker_owns_lease() to handle delegation conflict with courtesy clients. If conflict was caused courtesy client then discard the courtesy client by setting CLIENT_EXPIRED and return conflict resolved. Client with CLIENT_EXPIRED is expired by the laundromat. Signed-off-by: Dai Ngo <dai.ngo@oracle.com> --- fs/nfsd/nfs4state.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)