Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
[pandora-kernel.git] / fs / bio.c
index 29a44c1..d59ddbf 100644 (file)
--- 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;
 }
 
 /*