From: Sage Weil Date: Thu, 19 Feb 2009 23:22:12 +0000 (-0800) Subject: kclient: only unregister after both acks X-Git-Tag: v0.7~185 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=06e396139bfdcd678c1b41bd54415d7cd9adb6ee;p=ceph.git kclient: only unregister after both acks 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... --- diff --git a/src/TODO b/src/TODO index 9283ac8b57ae..d806f9becef9 100644 --- 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 diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index 86df0aa043cd..946da1431c02 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -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) {