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: 5aea3dcd50
("libceph: a major OSD client update")
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
b7ec35b304
commit
dc045a9168
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue