diff options
| author | Sage Weil <sage@inktank.com> | 2012-05-31 23:22:18 -0400 |
|---|---|---|
| committer | Alex Elder <elder@inktank.com> | 2012-06-20 08:43:49 -0400 |
| commit | 88ed6ea0b295f8e2383d599a04027ec596cdf97b (patch) | |
| tree | e9a49af02373e76a9ce0ed94b4120ccc184a7461 | |
| parent | 680584fab05efff732b5ae16ad601ba994d7b505 (diff) | |
libceph: use con get/put ops from osd_client
There were a few direct calls to ceph_con_{get,put}() instead of the con
ops from osd_client.c. This is a bug since those ops aren't defined to
be ceph_con_get/put.
This breaks refcounting on the ceph_osd structs that contain the
ceph_connections, and could lead to all manner of strangeness.
The purpose of the ->get and ->put methods in a ceph connection are
to allow the connection to indicate it has a reference to something
external to the messaging system, *not* to indicate something
external has a reference to the connection.
[elder@inktank.com: added that last sentence]
Signed-off-by: Sage Weil <sage@newdream.net>
Reviewed-by: Alex Elder <elder@inktank.com>
(cherry picked from commit 0d47766f14211a73eaf54cab234db134ece79f49)
| -rw-r--r-- | net/ceph/osd_client.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 13538da41dd6..ca59e66c9787 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c | |||
| @@ -144,7 +144,7 @@ void ceph_osdc_release_request(struct kref *kref) | |||
| 144 | req->r_pages, req->r_con_filling_msg); | 144 | req->r_pages, req->r_con_filling_msg); |
| 145 | ceph_con_revoke_message(req->r_con_filling_msg, | 145 | ceph_con_revoke_message(req->r_con_filling_msg, |
| 146 | req->r_reply); | 146 | req->r_reply); |
| 147 | ceph_con_put(req->r_con_filling_msg); | 147 | req->r_con_filling_msg->ops->put(req->r_con_filling_msg); |
| 148 | } | 148 | } |
| 149 | if (req->r_reply) | 149 | if (req->r_reply) |
| 150 | ceph_msg_put(req->r_reply); | 150 | ceph_msg_put(req->r_reply); |
| @@ -1216,7 +1216,7 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg, | |||
| 1216 | if (req->r_con_filling_msg == con && req->r_reply == msg) { | 1216 | if (req->r_con_filling_msg == con && req->r_reply == msg) { |
| 1217 | dout(" dropping con_filling_msg ref %p\n", con); | 1217 | dout(" dropping con_filling_msg ref %p\n", con); |
| 1218 | req->r_con_filling_msg = NULL; | 1218 | req->r_con_filling_msg = NULL; |
| 1219 | ceph_con_put(con); | 1219 | con->ops->put(con); |
| 1220 | } | 1220 | } |
| 1221 | 1221 | ||
| 1222 | if (!req->r_got_reply) { | 1222 | if (!req->r_got_reply) { |
| @@ -2028,7 +2028,7 @@ static struct ceph_msg *get_reply(struct ceph_connection *con, | |||
| 2028 | dout("get_reply revoking msg %p from old con %p\n", | 2028 | dout("get_reply revoking msg %p from old con %p\n", |
| 2029 | req->r_reply, req->r_con_filling_msg); | 2029 | req->r_reply, req->r_con_filling_msg); |
| 2030 | ceph_con_revoke_message(req->r_con_filling_msg, req->r_reply); | 2030 | ceph_con_revoke_message(req->r_con_filling_msg, req->r_reply); |
| 2031 | ceph_con_put(req->r_con_filling_msg); | 2031 | req->r_con_filling_msg->ops->put(req->r_con_filling_msg); |
| 2032 | req->r_con_filling_msg = NULL; | 2032 | req->r_con_filling_msg = NULL; |
| 2033 | } | 2033 | } |
| 2034 | 2034 | ||
| @@ -2063,7 +2063,7 @@ static struct ceph_msg *get_reply(struct ceph_connection *con, | |||
| 2063 | #endif | 2063 | #endif |
| 2064 | } | 2064 | } |
| 2065 | *skip = 0; | 2065 | *skip = 0; |
| 2066 | req->r_con_filling_msg = ceph_con_get(con); | 2066 | req->r_con_filling_msg = con->ops->get(con); |
| 2067 | dout("get_reply tid %lld %p\n", tid, m); | 2067 | dout("get_reply tid %lld %p\n", tid, m); |
| 2068 | 2068 | ||
| 2069 | out: | 2069 | out: |
