[v2] ceph: rename get_session and switch to use ceph_get_mds_session
diff mbox series

Message ID 20191219010716.60987-1-xiubli@redhat.com
State New
Headers show
Series
  • [v2] ceph: rename get_session and switch to use ceph_get_mds_session
Related show

Commit Message

Xiubo Li Dec. 19, 2019, 1:07 a.m. UTC
From: Xiubo Li <xiubli@redhat.com>

Just in case the session's refcount reach 0 and is releasing, and
if we get the session without checking it, we may encounter kernel
crash.

Rename get_session to ceph_get_mds_session and make it global.

Signed-off-by: Xiubo Li <xiubli@redhat.com>
---

Changed in V2:
- there has some conflict and rebase to upstream code.


 fs/ceph/mds_client.c | 16 ++++++++--------
 fs/ceph/mds_client.h |  9 ++-------
 2 files changed, 10 insertions(+), 15 deletions(-)

Comments

Ilya Dryomov Dec. 19, 2019, 10:45 a.m. UTC | #1
On Thu, Dec 19, 2019 at 2:07 AM <xiubli@redhat.com> wrote:
>
> From: Xiubo Li <xiubli@redhat.com>
>
> Just in case the session's refcount reach 0 and is releasing, and
> if we get the session without checking it, we may encounter kernel
> crash.
>
> Rename get_session to ceph_get_mds_session and make it global.
>
> Signed-off-by: Xiubo Li <xiubli@redhat.com>
> ---
>
> Changed in V2:
> - there has some conflict and rebase to upstream code.

Hi Xiubo,

There were two patches in the testing branch that weren't meant to be
there, one of them touching con_get().  I've just rebased and removed
them.  (5.5-rc2 is broken, so it is based on 5.5-rc2 plus the fix for
the breakage for now.)

It looks like neither v1 or v2 were based on testing though, so this is
more of an FYI.  The reason I'm still sending this message is that both
v1 and v2 appear to be whitespace corrupt and will need to be redone.

Thanks,

                Ilya
Xiubo Li Dec. 19, 2019, 11:32 a.m. UTC | #2
On 2019/12/19 18:45, Ilya Dryomov wrote:
> On Thu, Dec 19, 2019 at 2:07 AM <xiubli@redhat.com> wrote:
>> From: Xiubo Li <xiubli@redhat.com>
>>
>> Just in case the session's refcount reach 0 and is releasing, and
>> if we get the session without checking it, we may encounter kernel
>> crash.
>>
>> Rename get_session to ceph_get_mds_session and make it global.
>>
>> Signed-off-by: Xiubo Li <xiubli@redhat.com>
>> ---
>>
>> Changed in V2:
>> - there has some conflict and rebase to upstream code.
> Hi Xiubo,
>
> There were two patches in the testing branch that weren't meant to be
> there, one of them touching con_get().  I've just rebased and removed
> them.  (5.5-rc2 is broken, so it is based on 5.5-rc2 plus the fix for
> the breakage for now.)
>
> It looks like neither v1 or v2 were based on testing though, so this is
> more of an FYI.  The reason I'm still sending this message is that both
> v1 and v2 appear to be whitespace corrupt and will need to be redone.

I am using the "testing" branch, so I will post it again later.

Thanks.


> Thanks,
>
>                  Ilya
>

Patch
diff mbox series

diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index d8bb3eebfaeb..a64f9ccdc2ff 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -538,7 +538,7 @@  const char *ceph_session_state_name(int s)
 	}
 }
 
-static struct ceph_mds_session *get_session(struct ceph_mds_session *s)
+struct ceph_mds_session *ceph_get_mds_session(struct ceph_mds_session *s)
 {
 	if (refcount_inc_not_zero(&s->s_ref)) {
 		dout("mdsc get_session %p %d -> %d\n", s,
@@ -569,7 +569,7 @@  struct ceph_mds_session *__ceph_lookup_mds_session(struct ceph_mds_client *mdsc,
 {
 	if (mds >= mdsc->max_sessions || !mdsc->sessions[mds])
 		return NULL;
-	return get_session(mdsc->sessions[mds]);
+	return ceph_get_mds_session(mdsc->sessions[mds]);
 }
 
 static bool __have_session(struct ceph_mds_client *mdsc, int mds)
@@ -1990,7 +1990,7 @@  void ceph_flush_cap_releases(struct ceph_mds_client *mdsc,
 	if (mdsc->stopping)
 		return;
 
-	get_session(session);
+	ceph_get_mds_session(session);
 	if (queue_work(mdsc->fsc->cap_wq,
 		       &session->s_cap_release_work)) {
 		dout("cap release work queued\n");
@@ -2605,7 +2605,7 @@  static void __do_request(struct ceph_mds_client *mdsc,
 			goto finish;
 		}
 	}
-	req->r_session = get_session(session);
+	req->r_session = ceph_get_mds_session(session);
 
 	dout("do_request mds%d session %p state %s\n", mds, session,
 	     ceph_session_state_name(session->s_state));
@@ -3129,7 +3129,7 @@  static void handle_session(struct ceph_mds_session *session,
 
 	mutex_lock(&mdsc->mutex);
 	if (op == CEPH_SESSION_CLOSE) {
-		get_session(session);
+		ceph_get_mds_session(session);
 		__unregister_session(mdsc, session);
 	}
 	/* FIXME: this ttl calculation is generous */
@@ -3804,7 +3804,7 @@  static void check_new_map(struct ceph_mds_client *mdsc,
 
 		if (i >= newmap->m_num_mds) {
 			/* force close session for stopped mds */
-			get_session(s);
+			ceph_get_mds_session(s);
 			__unregister_session(mdsc, s);
 			__wake_requests(mdsc, &s->s_waiting);
 			mutex_unlock(&mdsc->mutex);
@@ -4404,7 +4404,7 @@  void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc)
 	mutex_lock(&mdsc->mutex);
 	for (i = 0; i < mdsc->max_sessions; i++) {
 		if (mdsc->sessions[i]) {
-			session = get_session(mdsc->sessions[i]);
+			session = ceph_get_mds_session(mdsc->sessions[i]);
 			__unregister_session(mdsc, session);
 			mutex_unlock(&mdsc->mutex);
 			mutex_lock(&session->s_mutex);
@@ -4632,7 +4632,7 @@  static struct ceph_connection *con_get(struct ceph_connection *con)
 {
 	struct ceph_mds_session *s = con->private;
 
-	if (get_session(s)) {
+	if (ceph_get_mds_session(s)) {
 		dout("mdsc con_get %p ok (%d)\n", s, refcount_read(&s->s_ref));
 		return con;
 	}
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h
index 9fb2063b0600..a7a94cf57150 100644
--- a/fs/ceph/mds_client.h
+++ b/fs/ceph/mds_client.h
@@ -443,15 +443,10 @@  extern const char *ceph_mds_op_name(int op);
 extern struct ceph_mds_session *
 __ceph_lookup_mds_session(struct ceph_mds_client *, int mds);
 
-static inline struct ceph_mds_session *
-ceph_get_mds_session(struct ceph_mds_session *s)
-{
-	refcount_inc(&s->s_ref);
-	return s;
-}
-
 extern const char *ceph_session_state_name(int s);
 
+extern struct ceph_mds_session *
+ceph_get_mds_session(struct ceph_mds_session *s);
 extern void ceph_put_mds_session(struct ceph_mds_session *s);
 
 extern int ceph_send_msg_mds(struct ceph_mds_client *mdsc,