All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@kernel.org>
To: ceph-devel@vger.kernel.org
Cc: ukernel@gmail.com, idryomov@gmail.com, sage@redhat.com
Subject: [PATCH] ceph: unify i_dirty_item and i_flushing_item handling when auth caps change
Date: Fri,  3 Apr 2020 10:47:51 -0400	[thread overview]
Message-ID: <20200403144751.23977-1-jlayton@kernel.org> (raw)

Suggested-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Jeff Layton <jlayton@kernel.org>
---
 fs/ceph/caps.c | 47 +++++++++++++++++++++++++----------------------
 1 file changed, 25 insertions(+), 22 deletions(-)

diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index eb190e4e203c..b3460d52a305 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -3700,6 +3700,27 @@ static bool handle_cap_trunc(struct inode *inode,
 	return queue_trunc;
 }
 
+/**
+ * transplant_auth_cap - move inode to appropriate lists when auth caps change
+ * @ci: inode to be moved
+ * @session: new auth caps session
+ */
+static void transplant_auth_ses(struct ceph_inode_info *ci,
+				struct ceph_mds_session *session)
+{
+	lockdep_assert_held(&ci->i_ceph_lock);
+
+	if (list_empty(&ci->i_dirty_item) && list_empty(&ci->i_flushing_item))
+		return;
+
+	spin_lock(&session->s_mdsc->cap_dirty_lock);
+	if (!list_empty(&ci->i_dirty_item))
+		list_move(&ci->i_dirty_item, &session->s_cap_dirty);
+	if (!list_empty(&ci->i_flushing_item))
+		list_move_tail(&ci->i_flushing_item, &session->s_cap_flushing);
+	spin_unlock(&session->s_mdsc->cap_dirty_lock);
+}
+
 /*
  * Handle EXPORT from MDS.  Cap is being migrated _from_ this mds to a
  * different one.  If we are the most recent migration we've seen (as
@@ -3771,22 +3792,9 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
 			tcap->issue_seq = t_seq - 1;
 			tcap->issued |= issued;
 			tcap->implemented |= issued;
-			if (cap == ci->i_auth_cap)
+			if (cap == ci->i_auth_cap) {
 				ci->i_auth_cap = tcap;
-
-			if (!list_empty(&ci->i_dirty_item)) {
-				spin_lock(&mdsc->cap_dirty_lock);
-				list_move(&ci->i_dirty_item,
-					  &tcap->session->s_cap_dirty);
-				spin_unlock(&mdsc->cap_dirty_lock);
-			}
-
-			if (!list_empty(&ci->i_cap_flush_list) &&
-			    ci->i_auth_cap == tcap) {
-				spin_lock(&mdsc->cap_dirty_lock);
-				list_move_tail(&ci->i_flushing_item,
-					       &tcap->session->s_cap_flushing);
-				spin_unlock(&mdsc->cap_dirty_lock);
+				transplant_auth_ses(ci, tcap->session);
 			}
 		}
 		__ceph_remove_cap(cap, false);
@@ -3798,13 +3806,8 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
 		ceph_add_cap(inode, tsession, t_cap_id, issued, 0,
 			     t_seq - 1, t_mseq, (u64)-1, flag, &new_cap);
 
-		if (!list_empty(&ci->i_cap_flush_list) &&
-		    ci->i_auth_cap == tcap) {
-			spin_lock(&mdsc->cap_dirty_lock);
-			list_move_tail(&ci->i_flushing_item,
-				       &tcap->session->s_cap_flushing);
-			spin_unlock(&mdsc->cap_dirty_lock);
-		}
+		if (ci->i_auth_cap == tcap)
+			transplant_auth_ses(ci, tcap->session);
 
 		__ceph_remove_cap(cap, false);
 		goto out_unlock;
-- 
2.25.1

             reply	other threads:[~2020-04-03 14:47 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-03 14:47 Jeff Layton [this message]
2020-04-03 19:12 ` [PATCH] ceph: unify i_dirty_item and i_flushing_item handling when auth caps change Jeff Layton
2020-04-06 14:55 ` Yan, Zheng
2020-04-06 19:51   ` Jeff Layton

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=20200403144751.23977-1-jlayton@kernel.org \
    --to=jlayton@kernel.org \
    --cc=ceph-devel@vger.kernel.org \
    --cc=idryomov@gmail.com \
    --cc=sage@redhat.com \
    --cc=ukernel@gmail.com \
    /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.