]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: remove leaked preallocated cap releases messages
authorYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 3 Apr 2009 17:25:39 +0000 (10:25 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 3 Apr 2009 17:25:39 +0000 (10:25 -0700)
src/kernel/mds_client.c
src/kernel/messenger.c
src/kernel/messenger.h

index f16e8b0a9faa589011cd5c6d9d6de0b9d8218ca9..c287982e7c580e5138a631eb94c90c0a62f8982d 100644 (file)
@@ -604,6 +604,27 @@ out:
        return 0;
 }
 
+/*
+ * Free preallocated cap messages assigned to this session
+ */
+static void cleanup_cap_releases(struct ceph_mds_session *session)
+{
+       struct ceph_msg *msg;
+
+       spin_lock(&session->s_cap_lock);
+       while (!list_empty(&session->s_cap_releases)) {
+               msg = list_first_entry(&session->s_cap_releases, struct ceph_msg,
+                                list_head);
+               ceph_msg_remove(msg);
+       }
+       while (!list_empty(&session->s_cap_releases_done)) {
+               msg = list_first_entry(&session->s_cap_releases_done, struct ceph_msg,
+                                list_head);
+               ceph_msg_remove(msg);
+       }
+       spin_unlock(&session->s_cap_lock);
+}
+
 /*
  * caller must hold session s_mutex
  */
@@ -622,6 +643,8 @@ static void remove_session_caps(struct ceph_mds_session *session)
                ceph_remove_cap(cap);
        }
        BUG_ON(session->s_nr_caps > 0);
+
+       cleanup_cap_releases(session);
 }
 
 /*
index 89a51876bf6bf2744fd966174ce4838b8cbcf446..934fdbbf4b6c52af45c42e1e731b7649d91eb68b 100644 (file)
@@ -1396,8 +1396,7 @@ static void process_ack(struct ceph_connection *con)
                        break;
                dout(5, "got ack for seq %llu type %d at %p\n", seq,
                     le16_to_cpu(m->hdr.type), m);
-               list_del_init(&m->list_head);
-               ceph_msg_put(m);
+               ceph_msg_remove(m);
        }
        spin_unlock(&con->out_queue_lock);
        prepare_read_tag(con);
index 4bfccf1066f17b915cac8ed5f207ed9cff2ae6eb..7a7224a6693173027b119a717b4b06e291ef4b54 100644 (file)
@@ -247,13 +247,18 @@ static inline struct ceph_msg *ceph_msg_get(struct ceph_msg *msg)
 
 extern void ceph_msg_put(struct ceph_msg *msg);
 
+static inline void ceph_msg_remove(struct ceph_msg *msg)
+{
+       list_del_init(&msg->list_head);
+       ceph_msg_put(msg);
+}
+
 static inline void ceph_msg_put_list(struct list_head *head)
 {
        while (!list_empty(head)) {
                struct ceph_msg *msg = list_first_entry(head, struct ceph_msg,
                                                        list_head);
-               list_del_init(&msg->list_head);
-               ceph_msg_put(msg);
+               ceph_msg_remove(msg);
        }
 }