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 v18 05/11] NFSD: Update nfs4_get_vfs_file() to handle courtesy client
Date: Tue, 29 Mar 2022 12:11:13 -0400 [thread overview]
Message-ID: <20220329161113.GF29634@fieldses.org> (raw)
In-Reply-To: <e2b0140e-0580-5885-9305-d72b5a4f1d78@oracle.com>
On Tue, Mar 29, 2022 at 09:06:23AM -0700, dai.ngo@oracle.com wrote:
>
> On 3/29/22 8:24 AM, J. Bruce Fields wrote:
> >On Thu, Mar 24, 2022 at 09:34:45PM -0700, Dai Ngo wrote:
> >>Update nfs4_get_vfs_file and nfs4_upgrade_open to handle share
> >>reservation conflict with courtesy client.
> >>
> >>Update nfs4_get_vfs_file and nfs4_upgrade_open to handle share
> >>reservation conflict with courtesy client.
> >>
> >>When we have deny/access conflict we walk the fi_stateids of the
> >>file in question, looking for open stateid and check the deny/access
> >>of that stateid against the one from the open request. If there is
> >>a conflict then we check if the client that owns that stateid is
> >>a courtesy client. If it is then we set the client state to
> >>CLIENT_EXPIRED and allow the open request to continue. We have
> >>to scan all the stateid's of the file since the conflict can be
> >>caused by multiple open stateid's.
> >>
> >>Client with CLIENT_EXPIRED is expired by the laundromat.
> >>
> >>Signed-off-by: Dai Ngo <dai.ngo@oracle.com>
> >>---
> >> fs/nfsd/nfs4state.c | 85 +++++++++++++++++++++++++++++++++++++++++++++--------
> >> 1 file changed, 72 insertions(+), 13 deletions(-)
> >>
> >>diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> >>index f20c75890594..fe8969ba94b3 100644
> >>--- a/fs/nfsd/nfs4state.c
> >>+++ b/fs/nfsd/nfs4state.c
> >>@@ -701,9 +701,56 @@ __nfs4_file_get_access(struct nfs4_file *fp, u32 access)
> >> atomic_inc(&fp->fi_access[O_RDONLY]);
> >> }
> >>+/*
> >>+ * Check if courtesy clients have conflicting access and resolve it if possible
> >>+ *
> >>+ * access: is op_share_access if share_access is true.
> >>+ * Check if access mode, op_share_access, would conflict with
> >>+ * the current deny mode of the file 'fp'.
> >>+ * access: is op_share_deny if share_access is false.
> >>+ * Check if the deny mode, op_share_deny, would conflict with
> >>+ * current access of the file 'fp'.
> >>+ * stp: skip checking this entry.
> >>+ * new_stp: normal open, not open upgrade.
> >>+ *
> >>+ * Function returns:
> >>+ * false - access/deny mode conflict with normal client.
> >>+ * true - no conflict or conflict with courtesy client(s) is resolved.
> >>+ */
> >>+static bool
> >>+nfs4_resolve_deny_conflicts_locked(struct nfs4_file *fp, bool new_stp,
> >>+ struct nfs4_ol_stateid *stp, u32 access, bool share_access)
> >>+{
> >>+ struct nfs4_ol_stateid *st;
> >>+ struct nfs4_client *clp;
> >>+ bool conflict = true;
> >>+ unsigned char bmap;
> >>+
> >>+ lockdep_assert_held(&fp->fi_lock);
> >>+ list_for_each_entry(st, &fp->fi_stateids, st_perfile) {
> >>+ /* ignore lock stateid */
> >>+ if (st->st_openstp)
> >>+ continue;
> >>+ if (st == stp && new_stp)
> >>+ continue;
> >>+ /* check file access against deny mode or vice versa */
> >>+ bmap = share_access ? st->st_deny_bmap : st->st_access_bmap;
> >>+ if (!(access & bmap_to_share_mode(bmap)))
> >>+ continue;
> >As I said before, I recommend just doing *both* checks here. Then you
> >can remove the "bool share_access" argument. I think that'll make the
> >code easier to read.
>
> Bruce, I'm not clear how to check both here as I mentioned in my previous
> email.
>
> nfs4_resolve_deny_conflicts_locked is called from nfs4_file_get_access
> and nfs4_file_check_deny to check either access or deny mode separately
> so how do we check both access and deny in nfs4_resolve_deny_conflicts_locked?
Sorry, I forgot.
Uh, I guess on a quick skim I don't see a way to do that nicely, so,
fine, I'm OK with it as is.
--b.
next prev parent reply other threads:[~2022-03-29 16:11 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-25 4:34 [PATCH RFC v18 0/11] NFSD: Initial implementation of NFSv4 Courteous Server Dai Ngo
2022-03-25 4:34 ` [PATCH RFC v18 01/11] fs/lock: add helper locks_owner_has_blockers to check for blockers Dai Ngo
2022-03-25 4:34 ` [PATCH RFC v18 02/11] NFSD: Add courtesy client state, macro and spinlock to support courteous server Dai Ngo
2022-03-29 15:47 ` J. Bruce Fields
2022-03-29 16:20 ` dai.ngo
2022-03-29 16:30 ` J. Bruce Fields
2022-03-29 16:42 ` J. Bruce Fields
2022-03-29 18:19 ` dai.ngo
2022-03-29 18:39 ` J. Bruce Fields
2022-03-29 19:32 ` Chuck Lever III
2022-03-29 19:49 ` Bruce Fields
2022-03-29 19:58 ` Chuck Lever III
2022-03-29 20:01 ` Bruce Fields
2022-03-29 20:20 ` Chuck Lever III
2022-03-29 20:50 ` dai.ngo
2022-03-29 21:45 ` dai.ngo
2022-03-30 0:12 ` J. Bruce Fields
2022-03-30 1:17 ` dai.ngo
2022-03-30 1:48 ` J. Bruce Fields
2022-03-25 4:34 ` [PATCH RFC v18 03/11] NFSD: Add lm_lock_expired call out Dai Ngo
2022-03-25 4:34 ` [PATCH RFC v18 04/11] NFSD: Update nfsd_breaker_owns_lease() to handle courtesy clients Dai Ngo
2022-03-25 4:34 ` [PATCH RFC v18 05/11] NFSD: Update nfs4_get_vfs_file() to handle courtesy client Dai Ngo
2022-03-29 15:24 ` J. Bruce Fields
2022-03-29 16:06 ` dai.ngo
2022-03-29 16:11 ` J. Bruce Fields [this message]
2022-03-25 4:34 ` [PATCH RFC v18 06/11] NFSD: Update find_clp_in_name_tree() " Dai Ngo
2022-03-25 4:34 ` [PATCH RFC v18 07/11] NFSD: Update find_in_sessionid_hashtbl() " Dai Ngo
2022-03-25 4:34 ` [PATCH RFC v18 08/11] NFSD: Update find_client_in_id_table() " Dai Ngo
2022-03-25 4:34 ` [PATCH RFC v18 09/11] NFSD: Refactor nfsd4_laundromat() Dai Ngo
2022-03-25 4:34 ` [PATCH RFC v18 10/11] NFSD: Update laundromat to handle courtesy clients Dai Ngo
2022-03-25 4:34 ` [PATCH RFC v18 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=20220329161113.GF29634@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.