rbd: assign watch request more directly
Subsystems (2)
PATCH 1/1 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.
--- drivers/block/rbd.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-)
drivers/block/rbd.c +4 -6
@@ -1158,7 +1158,6 @@ static int rbd_do_request(struct request *rq,int coll_index, void (*rbd_cb)(struct ceph_osd_request *,struct ceph_msg *), - struct ceph_osd_request **linger_req, u64 *ver) { struct ceph_osd_request *osd_req;
@@ -1212,9 +1211,9 @@ static int rbd_do_request(struct request *rq,ceph_osdc_build_request (osd_req, ofs, len,1 , op, snapc, snapid, &mtime); -if (linger_req) { +if (op->op ==CEPH_OSD_OP_WATCH && op->watch.flag) {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);
@@ -1296,7 +1295,6 @@ static int rbd_req_sync_op(struct rbd_device *rbd_dev,const char *object_name, u64 ofs, u64 inbound_size, char *inbound, - struct ceph_osd_request **linger_req, u64 *ver) { int ret;
@@ -1317,7 +1315,7 @@ static int rbd_req_sync_op(struct rbd_device *rbd_dev, op,NULL ,0 ,NULL , - linger_req, ver); + ver);if (ret <0 ) goto done;
@@ -1383,7 +1381,7 @@ static int rbd_do_op(struct request *rq, flags, op, coll, coll_index, - rbd_req_cb, 0, NULL); + rbd_req_cb, NULL);if (ret <0 )rbd_coll_end_req_index (rq, coll, coll_index, (s32 ) ret, seg_len);
@@ -1410,7 +1408,7 @@ static int rbd_req_sync_read(struct rbd_device
*rbd_dev,
return -ENOMEM;
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);
return ret;
@@ -1436,7 +1434,7 @@ static int rbd_req_sync_notify_ack(struct rbd_device *rbd_dev,
CEPH_OSD_FLAG_READ,
op,
NULL, 0,
- rbd_simple_req_cb, 0, NULL);
+ rbd_simple_req_cb, NULL);
rbd_osd_req_op_destroy(op);
@@ -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) {
- struct ceph_osd_request **linger_req = NULL;
struct ceph_osd_req_op *op;
int ret = 0;
@@ -1481,7 +1478,6 @@ static int rbd_req_sync_watch(struct rbd_device *rbd_dev, int start)
&rbd_dev->watch_event);
if (ret < 0)
return ret;
- linger_req = &rbd_dev->watch_request;
} else {
rbd_assert(rbd_dev->watch_request != NULL);
}
@@ -1493,7 +1489,7 @@ static int rbd_req_sync_watch(struct rbd_device *rbd_dev, int start)
ret = rbd_req_sync_op(rbd_dev,
CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK, 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 */
@@ -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,
object_name, 0, inbound_size, inbound,
- NULL, ver);
+ ver);
rbd_osd_req_op_destroy(op);
Signature · 1 line
1.7.9.5