rbd: define image request flags
authorAlex Elder <elder@inktank.com>
Fri, 8 Feb 2013 15:55:49 +0000 (09:55 -0600)
committerSage Weil <sage@inktank.com>
Thu, 2 May 2013 04:18:40 +0000 (21:18 -0700)
There are several Boolean values we'll be maintaining for image
requests.  Switch from the single write_request field to a
general-purpose flags field, and use one if its bits to represent
the direction of I/O for the image request.  Define helper functions
for setting and testing that flag.

Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
drivers/block/rbd.c

index f0124c5fbe4bf6f15130f4d4dec51f933c927380..5ea2e36926a866f809afe26483d4b6e4ff7d0e35 100644 (file)
@@ -202,12 +202,16 @@ struct rbd_obj_request {
        struct kref             kref;
 };
 
+enum img_req_flags {
+       IMG_REQ_WRITE,          /* read = 0, write = 1 */
+};
+
 struct rbd_img_request {
        struct request          *rq;
        struct rbd_device       *rbd_dev;
        u64                     offset; /* starting image byte offset */
        u64                     length; /* byte count from offset */
-       bool                    write_request;  /* false for read */
+       unsigned long           flags;
        union {
                struct ceph_snap_context *snapc;        /* for writes */
                u64             snap_id;                /* for reads */
@@ -1210,6 +1214,23 @@ static bool obj_request_done_test(struct rbd_obj_request *obj_request)
        return atomic_read(&obj_request->done) != 0;
 }
 
+/*
+ * The default/initial value for all image request flags is 0.  Each
+ * is conditionally set to 1 at image request initialization time
+ * and currently never change thereafter.
+ */
+static void img_request_write_set(struct rbd_img_request *img_request)
+{
+       set_bit(IMG_REQ_WRITE, &img_request->flags);
+       smp_mb();
+}
+
+static bool img_request_write_test(struct rbd_img_request *img_request)
+{
+       smp_mb();
+       return test_bit(IMG_REQ_WRITE, &img_request->flags) != 0;
+}
+
 static void
 rbd_img_obj_request_read_callback(struct rbd_obj_request *obj_request)
 {
@@ -1369,8 +1390,9 @@ static struct ceph_osd_request *rbd_osd_req_create(
        struct ceph_osd_request *osd_req;
 
        if (img_request) {
-               rbd_assert(img_request->write_request == write_request);
-               if (img_request->write_request)
+               rbd_assert(write_request ==
+                               img_request_write_test(img_request));
+               if (write_request)
                        snapc = img_request->snapc;
        }
 
@@ -1494,17 +1516,20 @@ static struct rbd_img_request *rbd_img_request_create(
                        kfree(img_request);
                        return NULL;    /* Shouldn't happen */
                }
+
        }
 
        img_request->rq = NULL;
        img_request->rbd_dev = rbd_dev;
        img_request->offset = offset;
        img_request->length = length;
-       img_request->write_request = write_request;
-       if (write_request)
+       img_request->flags = 0;
+       if (write_request) {
+               img_request_write_set(img_request);
                img_request->snapc = snapc;
-       else
+       } else {
                img_request->snap_id = rbd_dev->spec->snap_id;
+       }
        spin_lock_init(&img_request->completion_lock);
        img_request->next_completion = 0;
        img_request->callback = NULL;
@@ -1537,7 +1562,7 @@ static void rbd_img_request_destroy(struct kref *kref)
                rbd_img_obj_request_del(img_request, obj_request);
        rbd_assert(img_request->obj_request_count == 0);
 
-       if (img_request->write_request)
+       if (img_request_write_test(img_request))
                ceph_put_snap_context(img_request->snapc);
 
        kfree(img_request);
@@ -1580,7 +1605,8 @@ static void rbd_img_obj_callback(struct rbd_obj_request *obj_request)
                        struct rbd_device *rbd_dev = img_request->rbd_dev;
 
                        rbd_warn(rbd_dev, "%s %llx at %llx (%llx)\n",
-                               img_request->write_request ? "write" : "read",
+                               img_request_write_test(img_request) ? "write"
+                                                                   : "read",
                                obj_request->length, obj_request->img_offset,
                                obj_request->offset);
                        rbd_warn(rbd_dev, "  result %d xferred %x\n",
@@ -1608,7 +1634,7 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
        struct rbd_device *rbd_dev = img_request->rbd_dev;
        struct rbd_obj_request *obj_request = NULL;
        struct rbd_obj_request *next_obj_request;
-       bool write_request = img_request->write_request;
+       bool write_request = img_request_write_test(img_request);
        unsigned int bio_offset;
        u64 img_offset;
        u64 resid;