diff mbox

[REPOST] rbd: assign watch request more directly

Message ID 50E6F04B.8060102@inktank.com (mailing list archive)
State New, archived
Headers show

Commit Message

Alex Elder Jan. 4, 2013, 3:07 p.m. UTC
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>
---
 drivers/block/rbd.c |   20 ++++++++------------
 1 file changed, 8 insertions(+), 12 deletions(-)

 	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);

Comments

Josh Durgin Jan. 17, 2013, 4:28 a.m. UTC | #1
On 01/04/2013 07:07 AM, Alex Elder wrote:
> 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>

>   drivers/block/rbd.c |   20 ++++++++------------
>   1 file changed, 8 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
> index 21fbf82..02002b1 100644
> --- a/drivers/block/rbd.c
> +++ b/drivers/block/rbd.c
> @@ -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_client *osdc;
> @@ -1210,9 +1209,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);
>

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 21fbf82..02002b1 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -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_client *osdc;
@@ -1210,9 +1209,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);