All of lore.kernel.org
 help / color / mirror / Atom feed
From: "J. Bruce Fields" <bfields@fieldses.org>
To: dai.ngo@oracle.com
Cc: chuck.lever@oracle.com, jlayton@redhat.com,
	viro@zeniv.linux.org.uk, linux-nfs@vger.kernel.org,
	linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH RFC v16 03/11] NFSD: Add lm_lock_expired call out
Date: Tue, 15 Mar 2022 13:20:51 -0400	[thread overview]
Message-ID: <20220315172051.GD19168@fieldses.org> (raw)
In-Reply-To: <1e1ff6a1-86cf-99d4-13ad-45352e58fe73@oracle.com>

On Tue, Mar 15, 2022 at 09:26:46AM -0700, dai.ngo@oracle.com wrote:
> 
> On 3/15/22 8:02 AM, J. Bruce Fields wrote:
> >On Fri, Mar 11, 2022 at 06:13:27PM -0800, Dai Ngo 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 a65d59510681..583ac807e98d 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;
> >>+		}
> >>+	}
> >I'd prefer:
> >
> >	if (test_bit(NFSD4_CLIENT_COURTESY, &clp->cl_flags))
> >		set_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags);
> 
> we also need to set rc to true here.

No, the next line does it because we set the EXPIRED bit.

--b.

> 
> >	if (test_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags))
> >		rc = true;
> 
> With v16 we need to check for NFSD4_CLIENT_EXPIRED first then
> NFSD4_CLIENT_COURTESY because both flags can be set. In the
> next patch version, we will clear NFSD4_CLIENT_COURTESY when
> setting NFSD4_CLIENT_EXPIRED so the order of check does not
> matter.
> 
> >
> >Same result, but more compact and straightforward, I think.
> 
> Chuck wants to replace the bits used for courtesy client in
> cl_flags with a  separate u8 field so it does not have to use
> bit operation to set/test.
> 
> -Dai
> 
> >
> >--b.
> >
> >>+	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_lm_get_owner,
> >>  	.lm_put_owner = nfsd4_lm_put_owner,
> >>+	.lm_lock_expired = nfsd4_lm_lock_expired,
> >>  };
> >>  static inline void
> >>-- 
> >>2.9.5

  reply	other threads:[~2022-03-15 17:21 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-12  2:13 [PATCH RFC v16 0/11] NFSD: Initial implementation of NFSv4 Courteous Server Dai Ngo
2022-03-12  2:13 ` [PATCH RFC v16 01/11] fs/lock: add helper locks_owner_has_blockers to check for blockers Dai Ngo
2022-03-16 14:27   ` Chuck Lever III
2022-03-16 17:46     ` dai.ngo
2022-03-12  2:13 ` [PATCH RFC v16 02/11] NFSD: Add client flags, macro and spinlock to support courteous server Dai Ngo
2022-03-12  2:13 ` [PATCH RFC v16 03/11] NFSD: Add lm_lock_expired call out Dai Ngo
2022-03-15 15:02   ` J. Bruce Fields
2022-03-15 16:26     ` dai.ngo
2022-03-15 17:20       ` J. Bruce Fields [this message]
2022-03-15 17:30         ` dai.ngo
2022-03-15 17:39       ` Chuck Lever III
2022-03-15 18:56         ` dai.ngo
2022-03-12  2:13 ` [PATCH RFC v16 04/11] NFSD: Update nfsd_breaker_owns_lease() to handle courtesy clients Dai Ngo
2022-03-13 16:04   ` Chuck Lever III
2022-03-15 15:13     ` Bruce Fields
2022-03-15 16:27       ` dai.ngo
2022-03-12  2:13 ` [PATCH RFC v16 05/11] NFSD: Update nfs4_get_vfs_file() " Dai Ngo
2022-03-15 15:39   ` J. Bruce Fields
2022-03-16  6:29     ` dai.ngo
2022-03-12  2:13 ` [PATCH RFC v16 06/11] NFSD: Update find_clp_in_name_tree() " Dai Ngo
2022-03-12  2:13 ` [PATCH RFC v16 07/11] NFSD: Update find_in_sessionid_hashtbl() " Dai Ngo
2022-03-12  2:13 ` [PATCH RFC v16 08/11] NFSD: Update find_client_in_id_table() " Dai Ngo
2022-03-12  2:13 ` [PATCH RFC v16 09/11] NFSD: Refactor nfsd4_laundromat() Dai Ngo
2022-03-12  2:13 ` [PATCH RFC v16 10/11] NFSD: Update laundromat to handle courtesy clients Dai Ngo
2022-03-12  2:13 ` [PATCH RFC v16 11/11] NFSD: Show state of courtesy clients in client info Dai Ngo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220315172051.GD19168@fieldses.org \
    --to=bfields@fieldses.org \
    --cc=chuck.lever@oracle.com \
    --cc=dai.ngo@oracle.com \
    --cc=jlayton@redhat.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.