diff options
author | Ilya Dryomov <idryomov@gmail.com> | 2016-05-27 15:18:34 +0200 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2016-05-30 23:00:23 +0200 |
commit | dc045a9168c83b2dc590930a0565e066346de382 (patch) | |
tree | f2a0d74e082a7a359b470a40fe068dece067e42f | |
parent | b7ec35b304b64af2830027350cc99d31e6e537c2 (diff) | |
download | linux-dc045a9168c83b2dc590930a0565e066346de382.tar.bz2 |
libceph: put request only if it's done in handle_reply()
handle_reply() may be called twice on the same request: on ack and then
on commit. This occurs on btrfs-formatted OSDs or if cephfs sync write
path is triggered - CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK.
handle_reply() handles this with the help of done_request().
Fixes: 5aea3dcd5021 ("libceph: a major OSD client update")
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
-rw-r--r-- | net/ceph/osd_client.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 79c3bad87e62..cfe0be8bf2b7 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c @@ -2892,6 +2892,9 @@ static void handle_reply(struct ceph_osd *osd, struct ceph_msg *msg) dout("req %p tid %llu cb\n", req, req->r_tid); __complete_request(req); } + if (m.flags & CEPH_OSD_FLAG_ONDISK) + complete_all(&req->r_safe_completion); + ceph_osdc_put_request(req); } else { if (req->r_unsafe_callback) { dout("req %p tid %llu unsafe-cb\n", req, req->r_tid); @@ -2900,10 +2903,7 @@ static void handle_reply(struct ceph_osd *osd, struct ceph_msg *msg) WARN_ON(1); } } - if (m.flags & CEPH_OSD_FLAG_ONDISK) - complete_all(&req->r_safe_completion); - ceph_osdc_put_request(req); return; fail_request: |