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: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
This commit is contained in:
parent
5efea49a98
commit
8b84de7940
|
@ -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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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)
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
&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)
|
||||||
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,
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue