From 6fc3fcb40f6083cc8ef6295c17a494cd7c960eeb Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Thu, 23 Oct 2008 11:49:27 -0700 Subject: [PATCH] kclient: use a new reply mutex, fixes locks dependency problem --- src/kernel/mds_client.c | 8 ++++++-- src/kernel/mds_client.h | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index 1355fc4adc21d..6af5cfb24626d 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -440,6 +440,7 @@ static struct ceph_mds_request *new_request(struct ceph_msg *msg) req->r_request = msg; req->r_started = jiffies; req->r_resend_mds = -1; + mutex_init(&req->r_mutex); atomic_set(&req->r_ref, 1); /* one for request_tree, one for caller */ init_completion(&req->r_completion); return req; @@ -1213,8 +1214,10 @@ retry: wait_for_completion(&req->r_completion); } mutex_lock(&mdsc->mutex); + mutex_lock(&req->r_mutex); if (req->r_reply == NULL && !err) { put_request_sessions(req); + mutex_unlock(&req->r_mutex); goto retry; } if (IS_ERR(req->r_reply)) { @@ -1225,6 +1228,7 @@ retry: /* all is well, reply has been parsed. */ err = le32_to_cpu(req->r_reply_info.head->result); + mutex_unlock(&req->r_mutex); finish: __unregister_request(mdsc, req); mutex_unlock(&mdsc->mutex); @@ -1349,14 +1353,14 @@ done: if (took_snap_sem) up_write(&mdsc->snap_rwsem); - mutex_lock(&mdsc->mutex); + mutex_lock(&req->r_mutex); if (err) { req->r_err = err; } else { req->r_reply = msg; ceph_msg_get(msg); } - mutex_unlock(&mdsc->mutex); + mutex_unlock(&req->r_mutex); mutex_unlock(&req->r_session->s_mutex); diff --git a/src/kernel/mds_client.h b/src/kernel/mds_client.h index e5a9c4b2e563c..7cb303aa29b27 100644 --- a/src/kernel/mds_client.h +++ b/src/kernel/mds_client.h @@ -158,6 +158,7 @@ struct ceph_mds_request { atomic_t r_ref; struct completion r_completion; + struct mutex r_mutex; }; /* -- 2.39.5