Merge tag 'iwlwifi-next-for-kalle-2014-12-30' of https://git.kernel.org/pub/scm/linux...
[cascardo/linux.git] / block / bio.c
index 3e6331d..471d738 100644 (file)
@@ -428,6 +428,9 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, int nr_iovecs, struct bio_set *bs)
                front_pad = 0;
                inline_vecs = nr_iovecs;
        } else {
+               /* should not use nobvec bioset for nr_iovecs > 0 */
+               if (WARN_ON_ONCE(!bs->bvec_pool && nr_iovecs > 0))
+                       return NULL;
                /*
                 * generic_make_request() converts recursion to iteration; this
                 * means if we're running beneath it, any bios we allocate and
@@ -745,6 +748,7 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
                                }
                        }
 
+                       bio->bi_iter.bi_size += len;
                        goto done;
                }
 
@@ -761,28 +765,31 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
                return 0;
 
        /*
-        * we might lose a segment or two here, but rather that than
-        * make this too complex.
+        * setup the new entry, we might clear it again later if we
+        * cannot add the page
         */
+       bvec = &bio->bi_io_vec[bio->bi_vcnt];
+       bvec->bv_page = page;
+       bvec->bv_len = len;
+       bvec->bv_offset = offset;
+       bio->bi_vcnt++;
+       bio->bi_phys_segments++;
+       bio->bi_iter.bi_size += len;
 
-       while (bio->bi_phys_segments >= queue_max_segments(q)) {
+       /*
+        * Perform a recount if the number of segments is greater
+        * than queue_max_segments(q).
+        */
+
+       while (bio->bi_phys_segments > queue_max_segments(q)) {
 
                if (retried_segments)
-                       return 0;
+                       goto failed;
 
                retried_segments = 1;
                blk_recount_segments(q, bio);
        }
 
-       /*
-        * setup the new entry, we might clear it again later if we
-        * cannot add the page
-        */
-       bvec = &bio->bi_io_vec[bio->bi_vcnt];
-       bvec->bv_page = page;
-       bvec->bv_len = len;
-       bvec->bv_offset = offset;
-
        /*
         * if queue has other restrictions (eg varying max sector size
         * depending on offset), it can specify a merge_bvec_fn in the
@@ -792,7 +799,7 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
                struct bvec_merge_data bvm = {
                        .bi_bdev = bio->bi_bdev,
                        .bi_sector = bio->bi_iter.bi_sector,
-                       .bi_size = bio->bi_iter.bi_size,
+                       .bi_size = bio->bi_iter.bi_size - len,
                        .bi_rw = bio->bi_rw,
                };
 
@@ -800,23 +807,25 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
                 * merge_bvec_fn() returns number of bytes it can accept
                 * at this offset
                 */
-               if (q->merge_bvec_fn(q, &bvm, bvec) < bvec->bv_len) {
-                       bvec->bv_page = NULL;
-                       bvec->bv_len = 0;
-                       bvec->bv_offset = 0;
-                       return 0;
-               }
+               if (q->merge_bvec_fn(q, &bvm, bvec) < bvec->bv_len)
+                       goto failed;
        }
 
        /* If we may be able to merge these biovecs, force a recount */
-       if (bio->bi_vcnt && (BIOVEC_PHYS_MERGEABLE(bvec-1, bvec)))
+       if (bio->bi_vcnt > 1 && (BIOVEC_PHYS_MERGEABLE(bvec-1, bvec)))
                bio->bi_flags &= ~(1 << BIO_SEG_VALID);
 
-       bio->bi_vcnt++;
-       bio->bi_phys_segments++;
  done:
-       bio->bi_iter.bi_size += len;
        return len;
+
+ failed:
+       bvec->bv_page = NULL;
+       bvec->bv_len = 0;
+       bvec->bv_offset = 0;
+       bio->bi_vcnt--;
+       bio->bi_iter.bi_size -= len;
+       blk_recount_segments(q, bio);
+       return 0;
 }
 
 /**
@@ -1736,6 +1745,34 @@ void bio_check_pages_dirty(struct bio *bio)
        }
 }
 
+void generic_start_io_acct(int rw, unsigned long sectors,
+                          struct hd_struct *part)
+{
+       int cpu = part_stat_lock();
+
+       part_round_stats(cpu, part);
+       part_stat_inc(cpu, part, ios[rw]);
+       part_stat_add(cpu, part, sectors[rw], sectors);
+       part_inc_in_flight(part, rw);
+
+       part_stat_unlock();
+}
+EXPORT_SYMBOL(generic_start_io_acct);
+
+void generic_end_io_acct(int rw, struct hd_struct *part,
+                        unsigned long start_time)
+{
+       unsigned long duration = jiffies - start_time;
+       int cpu = part_stat_lock();
+
+       part_stat_add(cpu, part, ticks[rw], duration);
+       part_round_stats(cpu, part);
+       part_dec_in_flight(part, rw);
+
+       part_stat_unlock();
+}
+EXPORT_SYMBOL(generic_end_io_acct);
+
 #if ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE
 void bio_flush_dcache_pages(struct bio *bi)
 {
@@ -1900,20 +1937,9 @@ void bioset_free(struct bio_set *bs)
 }
 EXPORT_SYMBOL(bioset_free);
 
-/**
- * bioset_create  - Create a bio_set
- * @pool_size: Number of bio and bio_vecs to cache in the mempool
- * @front_pad: Number of bytes to allocate in front of the returned bio
- *
- * Description:
- *    Set up a bio_set to be used with @bio_alloc_bioset. Allows the caller
- *    to ask for a number of bytes to be allocated in front of the bio.
- *    Front pad allocation is useful for embedding the bio inside
- *    another structure, to avoid allocating extra data to go with the bio.
- *    Note that the bio must be embedded at the END of that structure always,
- *    or things will break badly.
- */
-struct bio_set *bioset_create(unsigned int pool_size, unsigned int front_pad)
+static struct bio_set *__bioset_create(unsigned int pool_size,
+                                      unsigned int front_pad,
+                                      bool create_bvec_pool)
 {
        unsigned int back_pad = BIO_INLINE_VECS * sizeof(struct bio_vec);
        struct bio_set *bs;
@@ -1938,9 +1964,11 @@ struct bio_set *bioset_create(unsigned int pool_size, unsigned int front_pad)
        if (!bs->bio_pool)
                goto bad;
 
-       bs->bvec_pool = biovec_create_pool(pool_size);
-       if (!bs->bvec_pool)
-               goto bad;
+       if (create_bvec_pool) {
+               bs->bvec_pool = biovec_create_pool(pool_size);
+               if (!bs->bvec_pool)
+                       goto bad;
+       }
 
        bs->rescue_workqueue = alloc_workqueue("bioset", WQ_MEM_RECLAIM, 0);
        if (!bs->rescue_workqueue)
@@ -1951,8 +1979,41 @@ bad:
        bioset_free(bs);
        return NULL;
 }
+
+/**
+ * bioset_create  - Create a bio_set
+ * @pool_size: Number of bio and bio_vecs to cache in the mempool
+ * @front_pad: Number of bytes to allocate in front of the returned bio
+ *
+ * Description:
+ *    Set up a bio_set to be used with @bio_alloc_bioset. Allows the caller
+ *    to ask for a number of bytes to be allocated in front of the bio.
+ *    Front pad allocation is useful for embedding the bio inside
+ *    another structure, to avoid allocating extra data to go with the bio.
+ *    Note that the bio must be embedded at the END of that structure always,
+ *    or things will break badly.
+ */
+struct bio_set *bioset_create(unsigned int pool_size, unsigned int front_pad)
+{
+       return __bioset_create(pool_size, front_pad, true);
+}
 EXPORT_SYMBOL(bioset_create);
 
+/**
+ * bioset_create_nobvec  - Create a bio_set without bio_vec mempool
+ * @pool_size: Number of bio to cache in the mempool
+ * @front_pad: Number of bytes to allocate in front of the returned bio
+ *
+ * Description:
+ *    Same functionality as bioset_create() except that mempool is not
+ *    created for bio_vecs. Saving some memory for bio_clone_fast() users.
+ */
+struct bio_set *bioset_create_nobvec(unsigned int pool_size, unsigned int front_pad)
+{
+       return __bioset_create(pool_size, front_pad, false);
+}
+EXPORT_SYMBOL(bioset_create_nobvec);
+
 #ifdef CONFIG_BLK_CGROUP
 /**
  * bio_associate_current - associate a bio with %current