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