From 459749d1e20b795163baf5ee309f244e8ab1a22d Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 7 Jan 2009 15:43:31 -0800 Subject: [PATCH] kclient: separate mds session lookup from ref get --- src/kernel/caps.c | 4 ++-- src/kernel/mds_client.c | 22 +++++++++++----------- src/kernel/mds_client.h | 11 +++++++++-- src/kernel/snap.c | 2 +- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/kernel/caps.c b/src/kernel/caps.c index 1a7f7cd0326fc..c29da0175eba4 100644 --- a/src/kernel/caps.c +++ b/src/kernel/caps.c @@ -626,7 +626,7 @@ retry: if (!session) { spin_unlock(&inode->i_lock); mutex_lock(&mdsc->mutex); - session = __ceph_get_mds_session(mdsc, mds); + session = __ceph_lookup_mds_session(mdsc, mds); mutex_unlock(&mdsc->mutex); if (session) { dout(10, "inverting session/ino locks on %p\n", @@ -1556,7 +1556,7 @@ void ceph_handle_caps(struct ceph_mds_client *mdsc, /* find session */ mutex_lock(&mdsc->mutex); - session = __ceph_get_mds_session(mdsc, mds); + session = __ceph_lookup_mds_session(mdsc, mds); if (session) down_write(&mdsc->snap_rwsem); mutex_unlock(&mdsc->mutex); diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index 098409d66752e..108fc00e0e46d 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -281,7 +281,7 @@ static const char *session_state_name(int s) /* * called under mdsc->mutex */ -struct ceph_mds_session *__ceph_get_mds_session(struct ceph_mds_client *mdsc, +struct ceph_mds_session *__ceph_lookup_mds_session(struct ceph_mds_client *mdsc, int mds) { struct ceph_mds_session *session; @@ -289,7 +289,7 @@ struct ceph_mds_session *__ceph_get_mds_session(struct ceph_mds_client *mdsc, if (mds >= mdsc->max_sessions || mdsc->sessions[mds] == NULL) return NULL; session = mdsc->sessions[mds]; - dout(30, "get_mds_session %p %d -> %d\n", session, + dout(30, "lookup_mds_session %p %d -> %d\n", session, atomic_read(&session->s_ref), atomic_read(&session->s_ref)+1); atomic_inc(&session->s_ref); return session; @@ -998,7 +998,7 @@ void ceph_mdsc_handle_session(struct ceph_mds_client *mdsc, seq = le64_to_cpu(h->seq); mutex_lock(&mdsc->mutex); - session = __ceph_get_mds_session(mdsc, mds); + session = __ceph_lookup_mds_session(mdsc, mds); if (session && mdsc->mdsmap) /* FIXME: this ttl calculation is generous */ session->s_ttl = jiffies + HZ*mdsc->mdsmap->m_session_autoclose; @@ -1194,7 +1194,7 @@ retry: } /* get session */ - session = __ceph_get_mds_session(mdsc, mds); + session = __ceph_lookup_mds_session(mdsc, mds); if (!session) session = register_session(mdsc, mds); dout(30, "do_request mds%d session %p state %s\n", mds, session, @@ -1317,7 +1317,7 @@ void ceph_mdsc_handle_reply(struct ceph_mds_client *mdsc, struct ceph_msg *msg) } if (req->r_session && req->r_session->s_mds != mds) { ceph_put_mds_session(req->r_session); - req->r_session = __ceph_get_mds_session(mdsc, mds); + req->r_session = __ceph_lookup_mds_session(mdsc, mds); } if (req->r_session == NULL) { derr(1, "got reply on %llu, but no session for mds%d\n", @@ -1429,8 +1429,8 @@ void ceph_mdsc_handle_forward(struct ceph_mds_client *mdsc, from_mds); req->r_num_fwd = fwd_seq; put_request_sessions(req); - req->r_session = __ceph_get_mds_session(mdsc, next_mds); - req->r_fwd_session = __ceph_get_mds_session(mdsc, from_mds); + req->r_session = __ceph_lookup_mds_session(mdsc, next_mds); + req->r_fwd_session = __ceph_lookup_mds_session(mdsc, from_mds); } else { /* no, resend. */ /* forward race not possible; mds would drop */ @@ -1483,7 +1483,7 @@ static void send_mds_reconnect(struct ceph_mds_client *mdsc, int mds) dout(1, "reconnect to recovering mds%d\n", mds); /* find session */ - session = __ceph_get_mds_session(mdsc, mds); + session = __ceph_lookup_mds_session(mdsc, mds); if (session) { session->s_state = CEPH_MDS_SESSION_RECONNECTING; session->s_seq = 0; @@ -1752,7 +1752,7 @@ void ceph_mdsc_handle_lease(struct ceph_mds_client *mdsc, struct ceph_msg *msg) /* find session */ mutex_lock(&mdsc->mutex); - session = __ceph_get_mds_session(mdsc, mds); + session = __ceph_lookup_mds_session(mdsc, mds); mutex_unlock(&mdsc->mutex); if (!session) { derr(0, "WTF, got lease but no session for mds%d\n", mds); @@ -1908,7 +1908,7 @@ static void delayed_work(struct work_struct *work) mdsc->last_renew_caps = jiffies; for (i = 0; i < mdsc->max_sessions; i++) { - struct ceph_mds_session *s = __ceph_get_mds_session(mdsc, i); + struct ceph_mds_session *s = __ceph_lookup_mds_session(mdsc, i); if (s == NULL) continue; if (s->s_state == CEPH_MDS_SESSION_CLOSING) { @@ -2047,7 +2047,7 @@ void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc) dout(10, "closing sessions\n"); n = 0; for (i = 0; i < mdsc->max_sessions; i++) { - session = __ceph_get_mds_session(mdsc, i); + session = __ceph_lookup_mds_session(mdsc, i); if (!session) continue; mutex_unlock(&mdsc->mutex); diff --git a/src/kernel/mds_client.h b/src/kernel/mds_client.h index 7196d0f7596f5..fa2280b018d52 100644 --- a/src/kernel/mds_client.h +++ b/src/kernel/mds_client.h @@ -207,8 +207,15 @@ struct ceph_mds_client { extern const char *ceph_mds_op_name(int op); -extern struct ceph_mds_session *__ceph_get_mds_session(struct ceph_mds_client *, - int mds); +extern struct ceph_mds_session * +__ceph_lookup_mds_session(struct ceph_mds_client *, int mds); + +inline static struct ceph_mds_session * +ceph_get_mds_session(struct ceph_mds_session *s) +{ + atomic_inc(&s->s_ref); + return s; +} extern void ceph_put_mds_session(struct ceph_mds_session *s); extern void ceph_send_msg_mds(struct ceph_mds_client *mdsc, diff --git a/src/kernel/snap.c b/src/kernel/snap.c index 27d08899178ad..20fa01111a1cd 100644 --- a/src/kernel/snap.c +++ b/src/kernel/snap.c @@ -607,7 +607,7 @@ void ceph_handle_snap(struct ceph_mds_client *mdsc, /* find session */ mutex_lock(&mdsc->mutex); - session = __ceph_get_mds_session(mdsc, mds); + session = __ceph_lookup_mds_session(mdsc, mds); if (session) down_write(&mdsc->snap_rwsem); mutex_unlock(&mdsc->mutex); -- 2.39.5