Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 79e3057c authored by Yehuda Sadeh's avatar Yehuda Sadeh Committed by Sage Weil
Browse files

rbd: cancel watch request when releasing the device



We were missing this cleanup, so when a device was released
the osd didn't clean up its watchers list, so following notifications
could be slow as osd needed to timeout on the client.

Signed-off-by: default avatarYehuda Sadeh <yehuda@hq.newdream.net>
parent 2f90b852
Loading
Loading
Loading
Loading
+30 −1
Original line number Diff line number Diff line
@@ -1253,6 +1253,35 @@ static int rbd_req_sync_watch(struct rbd_device *dev,
	return ret;
}

/*
 * Request sync osd unwatch
 */
static int rbd_req_sync_unwatch(struct rbd_device *dev,
				const char *obj)
{
	struct ceph_osd_req_op *ops;

	int ret = rbd_create_rw_ops(&ops, 1, CEPH_OSD_OP_WATCH, 0);
	if (ret < 0)
		return ret;

	ops[0].watch.ver = 0;
	ops[0].watch.cookie = cpu_to_le64(dev->watch_event->cookie);
	ops[0].watch.flag = 0;

	ret = rbd_req_sync_op(dev, NULL,
			      CEPH_NOSNAP,
			      0,
			      CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK,
			      ops,
			      1, obj, 0, 0, NULL, NULL, NULL);

	rbd_destroy_ops(ops);
	ceph_osdc_cancel_event(dev->watch_event);
	dev->watch_event = NULL;
	return ret;
}

struct rbd_notify_info {
	struct rbd_device *dev;
};
@@ -2290,7 +2319,7 @@ static void rbd_dev_release(struct device *dev)
		ceph_osdc_unregister_linger_request(&rbd_dev->client->osdc,
						    rbd_dev->watch_request);
	if (rbd_dev->watch_event)
		ceph_osdc_cancel_event(rbd_dev->watch_event);
		rbd_req_sync_unwatch(rbd_dev, rbd_dev->obj_md_name);

	rbd_put_client(rbd_dev);