Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.24 /fs/bio.c

Filename:/fs/bio.c
Lines Added:22
Lines Deleted:51
Also changed in: (Previous) 2.6.24-rc8  2.6.24-rc7  2.6.24-rc6  2.6.24-rc5  2.6.24-rc4  2.6.24-rc3 
(Following) 2.6.24-git5  2.6.24-git6  2.6.24-git7  2.6.24-git8  2.6.24-git9  2.6.24-git10 

Location
[  2.6.24
  [  fs
     o  bio.c

Patch

diff --git a/fs/bio.c b/fs/bio.c
index 29a44c1..d59ddbf 100644
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -109,11 +109,14 @@ static inline struct bio_vec *bvec_alloc_bs(gfp_t gfp_mask, int nr, unsigned lon
 
 void bio_free(struct bio *bio, struct bio_set *bio_set)
 {
-   const int pool_idx = BIO_POOL_IDX(bio);
+   if (bio->bi_io_vec) {
+      const int pool_idx = BIO_POOL_IDX(bio);
 
-   BIO_BUG_ON(pool_idx >= BIOVEC_NR_POOLS);
+      BIO_BUG_ON(pool_idx >= BIOVEC_NR_POOLS);
+
+      mempool_free(bio->bi_io_vec, bio_set->bvec_pools[pool_idx]);
+   }
 
-   mempool_free(bio->bi_io_vec, bio_set->bvec_pools[pool_idx]);
    mempool_free(bio, bio_set->bio_pool);
 }
 
@@ -127,21 +130,9 @@ static void bio_fs_destructor(struct bio *bio)
 
 void bio_init(struct bio *bio)
 {
-   bio->bi_next = NULL;
-   bio->bi_bdev = NULL;
+   memset(bio, 0, sizeof(*bio));
    bio->bi_flags = 1 << BIO_UPTODATE;
-   bio->bi_rw = 0;
-   bio->bi_vcnt = 0;
-   bio->bi_idx = 0;
-   bio->bi_phys_segments = 0;
-   bio->bi_hw_segments = 0;
-   bio->bi_hw_front_size = 0;
-   bio->bi_hw_back_size = 0;
-   bio->bi_size = 0;
-   bio->bi_max_vecs = 0;
-   bio->bi_end_io = NULL;
    atomic_set(&bio->bi_cnt, 1);
-   bio->bi_private = NULL;
 }
 
 /**
@@ -798,13 +789,9 @@ void bio_unmap_user(struct bio *bio)
    bio_put(bio);
 }
 
-static int bio_map_kern_endio(struct bio *bio, unsigned int bytes_done, int err)
+static void bio_map_kern_endio(struct bio *bio, int err)
 {
-   if (bio->bi_size)
-      return 1;
-
    bio_put(bio);
-   return 0;
 }
 
 
@@ -1002,34 +989,26 @@ void bio_check_pages_dirty(struct bio *bio)
 /**
  * bio_endio - end I/O on a bio
  * @bio:   bio
- * @bytes_done:   number of bytes completed
  * @error:   error, if any
  *
  * Description:
- *   bio_endio() will end I/O on @bytes_done number of bytes. This may be
- *   just a partial part of the bio, or it may be the whole bio. bio_endio()
- *   is the preferred way to end I/O on a bio, it takes care of decrementing
- *   bi_size and clearing BIO_UPTODATE on error. @error is 0 on success, and
- *   and one of the established -Exxxx (-EIO, for instance) error values in
- *   case something went wrong. Noone should call bi_end_io() directly on
- *   a bio unless they own it and thus know that it has an end_io function.
+ *   bio_endio() will end I/O on the whole bio. bio_endio() is the
+ *   preferred way to end I/O on a bio, it takes care of clearing
+ *   BIO_UPTODATE on error. @error is 0 on success, and and one of the
+ *   established -Exxxx (-EIO, for instance) error values in case
+ *   something went wrong. Noone should call bi_end_io() directly on a
+ *   bio unless they own it and thus know that it has an end_io
+ *   function.
  **/
-void bio_endio(struct bio *bio, unsigned int bytes_done, int error)
+void bio_endio(struct bio *bio, int error)
 {
    if (error)
       clear_bit(BIO_UPTODATE, &bio->bi_flags);
-
-   if (unlikely(bytes_done > bio->bi_size)) {
-      printk("%s: want %u bytes done, only %u left\n", __FUNCTION__,
-                  bytes_done, bio->bi_size);
-      bytes_done = bio->bi_size;
-   }
-
-   bio->bi_size -= bytes_done;
-   bio->bi_sector += (bytes_done >> 9);
+   else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
+      error = -EIO;
 
    if (bio->bi_end_io)
-      bio->bi_end_io(bio, bytes_done, error);
+      bio->bi_end_io(bio, error);
 }
 
 void bio_pair_release(struct bio_pair *bp)
@@ -1037,37 +1016,29 @@ void bio_pair_release(struct bio_pair *bp)
    if (atomic_dec_and_test(&bp->cnt)) {
       struct bio *master = bp->bio1.bi_private;
 
-      bio_endio(master, master->bi_size, bp->error);
+      bio_endio(master, bp->error);
       mempool_free(bp, bp->bio2.bi_private);
    }
 }
 
-static int bio_pair_end_1(struct bio * bi, unsigned int done, int err)
+static void bio_pair_end_1(struct bio *bi, int err)
 {
    struct bio_pair *bp = container_of(bi, struct bio_pair, bio1);
 
    if (err)
       bp->error = err;
 
-   if (bi->bi_size)
-      return 1;
-
    bio_pair_release(bp);
-   return 0;
 }
 
-static int bio_pair_end_2(struct bio * bi, unsigned int done, int err)
+static void bio_pair_end_2(struct bio *bi, int err)
 {
    struct bio_pair *bp = container_of(bi, struct bio_pair, bio2);
 
    if (err)
       bp->error = err;
 
-   if (bi->bi_size)
-      return 1;
-
    bio_pair_release(bp);
-   return 0;
 }
 
 /*


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.