Commit 8b84de79 authored by Alex Elder's avatar Alex Elder

rbd: assign watch request more directly

Both rbd_req_sync_op() and rbd_do_request() have a "linger"
parameter, which is the address of a pointer that should refer to
the osd request structure used to issue a request to an osd.

Only one case ever supplies a non-null "linger" argument: an
CEPH_OSD_OP_WATCH start.  And in that one case it is assigned
&rbd_dev->watch_request.

Within rbd_do_request() (where the assignment ultimately gets made)
we know the rbd_dev and therefore its watch_request field.  We
also know whether the op being sent is CEPH_OSD_OP_WATCH start.

Stop opaquely passing down the "linger" pointer, and instead just
assign the value directly inside rbd_do_request() when it's needed.

This makes it unnecessary for rbd_req_sync_watch() to make
arrangements to hold a value that's not available until a
bit later.  This more clearly separates setting up a watch
request from submitting it.
Signed-off-by: default avatarAlex Elder <elder@inktank.com>
Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
parent 5efea49a
...@@ -1158,7 +1158,6 @@ static int rbd_do_request(struct request *rq, ...@@ -1158,7 +1158,6 @@ static int rbd_do_request(struct request *rq,
int coll_index, int coll_index,
void (*rbd_cb)(struct ceph_osd_request *, void (*rbd_cb)(struct ceph_osd_request *,
struct ceph_msg *), struct ceph_msg *),
struct ceph_osd_request **linger_req,
u64 *ver) u64 *ver)
{ {
struct ceph_osd_client *osdc; struct ceph_osd_client *osdc;
...@@ -1210,9 +1209,9 @@ static int rbd_do_request(struct request *rq, ...@@ -1210,9 +1209,9 @@ static int rbd_do_request(struct request *rq,
ceph_osdc_build_request(osd_req, ofs, len, 1, op, ceph_osdc_build_request(osd_req, ofs, len, 1, op,
snapc, snapid, &mtime); snapc, snapid, &mtime);
if (linger_req) { if (op->op == CEPH_OSD_OP_WATCH && op->watch.flag) {
ceph_osdc_set_request_linger(osdc, osd_req); ceph_osdc_set_request_linger(osdc, osd_req);
*linger_req = osd_req; rbd_dev->watch_request = osd_req;
} }
ret = ceph_osdc_start_request(osdc, osd_req, false); ret = ceph_osdc_start_request(osdc, osd_req, false);
...@@ -1296,7 +1295,6 @@ static int rbd_req_sync_op(struct rbd_device *rbd_dev, ...@@ -1296,7 +1295,6 @@ static int rbd_req_sync_op(struct rbd_device *rbd_dev,
const char *object_name, const char *object_name,
u64 ofs, u64 inbound_size, u64 ofs, u64 inbound_size,
char *inbound, char *inbound,
struct ceph_osd_request **linger_req,
u64 *ver) u64 *ver)
{ {
int ret; int ret;
...@@ -1317,7 +1315,7 @@ static int rbd_req_sync_op(struct rbd_device *rbd_dev, ...@@ -1317,7 +1315,7 @@ static int rbd_req_sync_op(struct rbd_device *rbd_dev,
op, op,
NULL, 0, NULL, 0,
NULL, NULL,
linger_req, ver); ver);
if (ret < 0) if (ret < 0)
goto done; goto done;
...@@ -1383,7 +1381,7 @@ static int rbd_do_op(struct request *rq, ...@@ -1383,7 +1381,7 @@ static int rbd_do_op(struct request *rq,
flags, flags,
op, op,
coll, coll_index, coll, coll_index,
rbd_req_cb, 0, NULL); rbd_req_cb, NULL);
if (ret < 0) if (ret < 0)
rbd_coll_end_req_index(rq, coll, coll_index, rbd_coll_end_req_index(rq, coll, coll_index,
(s32)ret, seg_len); (s32)ret, seg_len);
...@@ -1410,7 +1408,7 @@ static int rbd_req_sync_read(struct rbd_device *rbd_dev, ...@@ -1410,7 +1408,7 @@ static int rbd_req_sync_read(struct rbd_device *rbd_dev,
return -ENOMEM; return -ENOMEM;
ret = rbd_req_sync_op(rbd_dev, CEPH_OSD_FLAG_READ, ret = rbd_req_sync_op(rbd_dev, CEPH_OSD_FLAG_READ,
op, object_name, ofs, len, buf, NULL, ver); op, object_name, ofs, len, buf, ver);
rbd_osd_req_op_destroy(op); rbd_osd_req_op_destroy(op);
return ret; return ret;
...@@ -1436,7 +1434,7 @@ static int rbd_req_sync_notify_ack(struct rbd_device *rbd_dev, ...@@ -1436,7 +1434,7 @@ static int rbd_req_sync_notify_ack(struct rbd_device *rbd_dev,
CEPH_OSD_FLAG_READ, CEPH_OSD_FLAG_READ,
op, op,
NULL, 0, NULL, 0,
rbd_simple_req_cb, 0, NULL); rbd_simple_req_cb, NULL);
rbd_osd_req_op_destroy(op); rbd_osd_req_op_destroy(op);
...@@ -1469,7 +1467,6 @@ static void rbd_watch_cb(u64 ver, u64 notify_id, u8 opcode, void *data) ...@@ -1469,7 +1467,6 @@ static void rbd_watch_cb(u64 ver, u64 notify_id, u8 opcode, void *data)
*/ */
static int rbd_req_sync_watch(struct rbd_device *rbd_dev, int start) static int rbd_req_sync_watch(struct rbd_device *rbd_dev, int start)
{ {
struct ceph_osd_request **linger_req = NULL;
struct ceph_osd_req_op *op; struct ceph_osd_req_op *op;
int ret = 0; int ret = 0;
...@@ -1481,7 +1478,6 @@ static int rbd_req_sync_watch(struct rbd_device *rbd_dev, int start) ...@@ -1481,7 +1478,6 @@ static int rbd_req_sync_watch(struct rbd_device *rbd_dev, int start)
&rbd_dev->watch_event); &rbd_dev->watch_event);
if (ret < 0) if (ret < 0)
return ret; return ret;
linger_req = &rbd_dev->watch_request;
} else { } else {
rbd_assert(rbd_dev->watch_request != NULL); rbd_assert(rbd_dev->watch_request != NULL);
} }
...@@ -1493,7 +1489,7 @@ static int rbd_req_sync_watch(struct rbd_device *rbd_dev, int start) ...@@ -1493,7 +1489,7 @@ static int rbd_req_sync_watch(struct rbd_device *rbd_dev, int start)
ret = rbd_req_sync_op(rbd_dev, ret = rbd_req_sync_op(rbd_dev,
CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK, CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK,
op, rbd_dev->header_name, op, rbd_dev->header_name,
0, 0, NULL, linger_req, NULL); 0, 0, NULL, NULL);
/* Cancel the event if we're tearing down, or on error */ /* Cancel the event if we're tearing down, or on error */
...@@ -1537,7 +1533,7 @@ static int rbd_req_sync_exec(struct rbd_device *rbd_dev, ...@@ -1537,7 +1533,7 @@ static int rbd_req_sync_exec(struct rbd_device *rbd_dev,
ret = rbd_req_sync_op(rbd_dev, CEPH_OSD_FLAG_READ, op, ret = rbd_req_sync_op(rbd_dev, CEPH_OSD_FLAG_READ, op,
object_name, 0, inbound_size, inbound, object_name, 0, inbound_size, inbound,
NULL, ver); ver);
rbd_osd_req_op_destroy(op); rbd_osd_req_op_destroy(op);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment