* 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,
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);
{
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);
}
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) {
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) {