OSDN Git Service

rbd: a little more cleanup of rbd_rq_fn()
authorAlex Elder <elder@dreamhost.com>
Thu, 8 Nov 2012 14:01:39 +0000 (08:01 -0600)
committerAlex Elder <elder@inktank.com>
Thu, 17 Jan 2013 21:51:51 +0000 (15:51 -0600)
Now that a big hunk in the middle of rbd_rq_fn() has been moved
into its own routine we can simplify it a little more.

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

index 21468d0..9d49e5b 100644 (file)
@@ -1644,53 +1644,51 @@ static int rbd_dev_do_request(struct request *rq,
 static void rbd_rq_fn(struct request_queue *q)
 {
        struct rbd_device *rbd_dev = q->queuedata;
+       bool read_only = rbd_dev->mapping.read_only;
        struct request *rq;
 
        while ((rq = blk_fetch_request(q))) {
-               struct bio *bio;
-               bool do_write;
-               unsigned int size;
-               u64 ofs;
-               struct ceph_snap_context *snapc;
+               struct ceph_snap_context *snapc = NULL;
+               unsigned int size = 0;
                int result;
 
                dout("fetched request\n");
 
-               /* filter out block requests we don't understand */
+               /* Filter out block requests we don't understand */
+
                if ((rq->cmd_type != REQ_TYPE_FS)) {
                        __blk_end_request_all(rq, 0);
                        continue;
                }
+               spin_unlock_irq(q->queue_lock);
 
-               /* deduce our operation (read, write) */
-               do_write = (rq_data_dir(rq) == WRITE);
-               if (do_write && rbd_dev->mapping.read_only) {
-                       __blk_end_request_all(rq, -EROFS);
-                       continue;
-               }
+               /* Stop writes to a read-only device */
 
-               spin_unlock_irq(q->queue_lock);
+               result = -EROFS;
+               if (read_only && rq_data_dir(rq) == WRITE)
+                       goto out_end_request;
+
+               /* Grab a reference to the snapshot context */
 
                down_read(&rbd_dev->header_rwsem);
+               if (rbd_dev->exists) {
+                       snapc = ceph_get_snap_context(rbd_dev->header.snapc);
+                       rbd_assert(snapc != NULL);
+               }
+               up_read(&rbd_dev->header_rwsem);
 
-               if (!rbd_dev->exists) {
+               if (!snapc) {
                        rbd_assert(rbd_dev->spec->snap_id != CEPH_NOSNAP);
-                       up_read(&rbd_dev->header_rwsem);
                        dout("request for non-existent snapshot");
-                       spin_lock_irq(q->queue_lock);
-                       __blk_end_request_all(rq, -ENXIO);
-                       continue;
+                       result = -ENXIO;
+                       goto out_end_request;
                }
 
-               snapc = ceph_get_snap_context(rbd_dev->header.snapc);
-
-               up_read(&rbd_dev->header_rwsem);
-
                size = blk_rq_bytes(rq);
-               ofs = blk_rq_pos(rq) * SECTOR_SIZE;
-               bio = rq->bio;
-
-               result = rbd_dev_do_request(rq, rbd_dev, snapc, ofs, size, bio);
+               result = rbd_dev_do_request(rq, rbd_dev, snapc,
+                               blk_rq_pos(rq) * SECTOR_SIZE,
+                               size, rq->bio);
+out_end_request:
                ceph_put_snap_context(snapc);
                spin_lock_irq(q->queue_lock);
                if (!size || result < 0)