]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: only unregister after both acks
authorSage Weil <sage@newdream.net>
Thu, 19 Feb 2009 23:22:12 +0000 (15:22 -0800)
committerSage Weil <sage@newdream.net>
Thu, 19 Feb 2009 23:22:12 +0000 (15:22 -0800)
Partially reverts behavior of b732c0ddb8a990a97b98606a6d9a387e5a21e3e5

We need the request to stay in the request_tree so that when the
safe arrives we can look it up (duh).  Also, we need to keep a
reference to the request during that period...

src/TODO
src/kernel/mds_client.c

index 9283ac8b57ae8b8e9bb056507e45d1a206613e05..d806f9becef97245f03a3e9a49ee344b0a29512a 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -102,6 +102,7 @@ userspace client
 - fix readdir vs fragment race by keeping a separate frag pos, and ignoring dentries below it
 
 mds
+- already completed replies should wait for journal to flush, if necessary
 - linkage vs cdentry replicas and remote rename....
 - move root inode into stray dir
 - make recovery work with early replies
index 86df0aa043cd64cae25590f2883717dde7de92e7..946da1431c02f36af33199c8cd3a8257dc00df00 100644 (file)
@@ -429,23 +429,22 @@ static struct ceph_mds_request *__lookup_request(struct ceph_mds_client *mdsc,
  * Called under mdsc->mutex.
  */
 static void __register_request(struct ceph_mds_client *mdsc,
-                              struct ceph_mds_request *req)
+                              struct ceph_mds_request *req,
+                              struct inode *listener)
 {
        req->r_tid = ++mdsc->last_tid;
        dout(30, "__register_request %p tid %lld\n", req, req->r_tid);
        ceph_mdsc_get_request(req);
        radix_tree_insert(&mdsc->request_tree, req->r_tid, (void *)req);
-}
-
-static void __register_listener(struct ceph_mds_request *req,
-                               struct inode *listener)
-{
-       struct ceph_inode_info *ci = ceph_inode(listener);
 
-       req->r_listener = listener;
-       spin_lock(&ci->i_listener_lock);
-       list_add_tail(&req->r_listener_item, &ci->i_listener_list);
-       spin_unlock(&ci->i_listener_lock);
+       if (listener) {
+               struct ceph_inode_info *ci = ceph_inode(listener);
+               
+               spin_lock(&ci->i_listener_lock);
+               req->r_listener = listener;
+               list_add_tail(&req->r_listener_item, &ci->i_listener_list);
+               spin_unlock(&ci->i_listener_lock);
+       }
 }
 
 static void __unregister_request(struct ceph_mds_client *mdsc,
@@ -454,10 +453,7 @@ static void __unregister_request(struct ceph_mds_client *mdsc,
        dout(30, "__unregister_request %p tid %lld\n", req, req->r_tid);
        radix_tree_delete(&mdsc->request_tree, req->r_tid);
        ceph_mdsc_put_request(req);
-}
 
-static void __unregister_listener(struct ceph_mds_request *req)
-{
        if (req->r_listener) {
                struct ceph_inode_info *ci = ceph_inode(req->r_listener);
 
@@ -1209,7 +1205,7 @@ void ceph_mdsc_submit_request(struct ceph_mds_client *mdsc,
 {
        dout(30, "submit_request on %p\n", req);
        mutex_lock(&mdsc->mutex);
-       __register_request(mdsc, req);
+       __register_request(mdsc, req, NULL);
        __do_request(mdsc, req);
        mutex_unlock(&mdsc->mutex);
 }
@@ -1227,9 +1223,7 @@ int ceph_mdsc_do_request(struct ceph_mds_client *mdsc,
        dout(30, "do_request on %p\n", req);
 
        mutex_lock(&mdsc->mutex);
-       __register_request(mdsc, req);
-       if (listener)
-               __register_listener(req, listener);
+       __register_request(mdsc, req, listener);
        __do_request(mdsc, req);
 
        if (!req->r_reply) {
@@ -1310,12 +1304,9 @@ void ceph_mdsc_handle_reply(struct ceph_mds_client *mdsc, struct ceph_msg *msg)
                return;
        }
 
-       if (!req->r_got_unsafe && !req->r_got_safe)
-               __unregister_request(mdsc, req);
-
        if (head->safe) {
                req->r_got_safe = true;
-               __unregister_listener(req);
+               __unregister_request(mdsc, req);
                complete(&req->r_safe_completion);
 
                if (req->r_got_unsafe) {