Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=9e4e5f87ebcadb7ad9aca640bbe1038e1545e9f8
Commit:     9e4e5f87ebcadb7ad9aca640bbe1038e1545e9f8
Parent:     def5b5b26e6d97820465fadcb7d1cb73cc4daf33
Author:     Milan Broz <[EMAIL PROTECTED]>
AuthorDate: Fri Oct 19 22:38:53 2007 +0100
Committer:  Alasdair G Kergon <[EMAIL PROTECTED]>
CommitDate: Sat Oct 20 02:01:09 2007 +0100

    dm: tidy bio_io_error usage
    
    Use bio_io_error() in only two places and tidy the code,
    preparing for later patches.
    
    There is no functional change in this patch.
    
    Signed-off-by: Milan Broz <[EMAIL PROTECTED]>
    Signed-off-by: Alasdair G Kergon <[EMAIL PROTECTED]>
---
 drivers/md/dm.c |   37 ++++++++++++++++++-------------------
 1 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 7cb61ab..41c9549 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -751,15 +751,13 @@ static void __clone_and_map(struct clone_info *ci)
 /*
  * Split the bio into several clones.
  */
-static void __split_bio(struct mapped_device *md, struct bio *bio)
+static int __split_bio(struct mapped_device *md, struct bio *bio)
 {
        struct clone_info ci;
 
        ci.map = dm_get_table(md);
-       if (!ci.map) {
-               bio_io_error(bio);
-               return;
-       }
+       if (unlikely(!ci.map))
+               return -EIO;
 
        ci.md = md;
        ci.bio = bio;
@@ -779,6 +777,8 @@ static void __split_bio(struct mapped_device *md, struct 
bio *bio)
        /* drop the extra reference count */
        dec_pending(ci.io, 0);
        dm_table_put(ci.map);
+
+       return 0;
 }
 /*-----------------------------------------------------------------
  * CRUD END
@@ -790,7 +790,7 @@ static void __split_bio(struct mapped_device *md, struct 
bio *bio)
  */
 static int dm_request(struct request_queue *q, struct bio *bio)
 {
-       int r;
+       int r = -EIO;
        int rw = bio_data_dir(bio);
        struct mapped_device *md = q->queuedata;
 
@@ -815,18 +815,11 @@ static int dm_request(struct request_queue *q, struct bio 
*bio)
        while (test_bit(DMF_BLOCK_IO, &md->flags)) {
                up_read(&md->io_lock);
 
-               if (bio_rw(bio) == READA) {
-                       bio_io_error(bio);
-                       return 0;
-               }
-
-               r = queue_io(md, bio);
-               if (r < 0) {
-                       bio_io_error(bio);
-                       return 0;
+               if (bio_rw(bio) != READA)
+                       r = queue_io(md, bio);
 
-               } else if (r == 0)
-                       return 0;       /* deferred successfully */
+               if (r <= 0)
+                       goto out_req;
 
                /*
                 * We're in a while loop, because someone could suspend
@@ -835,8 +828,13 @@ static int dm_request(struct request_queue *q, struct bio 
*bio)
                down_read(&md->io_lock);
        }
 
-       __split_bio(md, bio);
+       r = __split_bio(md, bio);
        up_read(&md->io_lock);
+
+out_req:
+       if (r < 0)
+               bio_io_error(bio);
+
        return 0;
 }
 
@@ -1235,7 +1233,8 @@ static void __flush_deferred_io(struct mapped_device *md, 
struct bio *c)
        while (c) {
                n = c->bi_next;
                c->bi_next = NULL;
-               __split_bio(md, c);
+               if (__split_bio(md, c))
+                       bio_io_error(c);
                c = n;
        }
 }
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to