Skip to content

Commit

Permalink
rbd: add rbd_obj_watch_request_helper() helper
Browse files Browse the repository at this point in the history
In the past, rbd_dev_header_watch_sync() used to handle both watch and
unwatch requests and was entangled and leaky.  Commit b30a01f
("rbd: fix osd_request memory leak in __rbd_dev_header_watch_sync()")
split it into two separate functions.  This commit cleanly abstracts
the common bits, relying on the fixed rbd_obj_request_wait().

Signed-off-by: Ilya Dryomov <[email protected]>
Reviewed-by: Alex Elder <[email protected]>
  • Loading branch information
idryomov committed Jul 8, 2014
1 parent 71c20a0 commit bb040aa
Showing 1 changed file with 53 additions and 0 deletions.
53 changes: 53 additions & 0 deletions drivers/block/rbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -2970,6 +2970,59 @@ static void rbd_watch_cb(u64 ver, u64 notify_id, u8 opcode, void *data)
rbd_obj_notify_ack_sync(rbd_dev, notify_id);
}

/*
* Send a (un)watch request and wait for the ack. Return a request
* with a ref held on success or error.
*/
static struct rbd_obj_request *rbd_obj_watch_request_helper(
struct rbd_device *rbd_dev,
bool watch)
{
struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc;
struct rbd_obj_request *obj_request;
int ret;

obj_request = rbd_obj_request_create(rbd_dev->header_name, 0, 0,
OBJ_REQUEST_NODATA);
if (!obj_request)
return ERR_PTR(-ENOMEM);

obj_request->osd_req = rbd_osd_req_create(rbd_dev, true, 1,
obj_request);
if (!obj_request->osd_req) {
ret = -ENOMEM;
goto out;
}

osd_req_op_watch_init(obj_request->osd_req, 0, CEPH_OSD_OP_WATCH,
rbd_dev->watch_event->cookie, 0, watch);
rbd_osd_req_format_write(obj_request);

if (watch)
ceph_osdc_set_request_linger(osdc, obj_request->osd_req);

ret = rbd_obj_request_submit(osdc, obj_request);
if (ret)
goto out;

ret = rbd_obj_request_wait(obj_request);
if (ret)
goto out;

ret = obj_request->result;
if (ret) {
if (watch)
rbd_obj_request_end(obj_request);
goto out;
}

return obj_request;

out:
rbd_obj_request_put(obj_request);
return ERR_PTR(ret);
}

/*
* Initiate a watch request, synchronously.
*/
Expand Down

0 comments on commit bb040aa

Please sign in to comment.