]> Pileus Git - ~andy/linux/blobdiff - drivers/md/dm.c
Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelv...
[~andy/linux] / drivers / md / dm.c
index d22b9905c1682e79e6f998dc6e638f9915d57355..0cf68b478878f327598fb756fe2da173d5443468 100644 (file)
@@ -477,7 +477,8 @@ static void start_io_acct(struct dm_io *io)
        cpu = part_stat_lock();
        part_round_stats(cpu, &dm_disk(md)->part0);
        part_stat_unlock();
-       dm_disk(md)->part0.in_flight[rw] = atomic_inc_return(&md->pending[rw]);
+       atomic_set(&dm_disk(md)->part0.in_flight[rw],
+               atomic_inc_return(&md->pending[rw]));
 }
 
 static void end_io_acct(struct dm_io *io)
@@ -497,8 +498,8 @@ static void end_io_acct(struct dm_io *io)
         * After this is decremented the bio must not be touched if it is
         * a flush.
         */
-       dm_disk(md)->part0.in_flight[rw] = pending =
-               atomic_dec_return(&md->pending[rw]);
+       pending = atomic_dec_return(&md->pending[rw]);
+       atomic_set(&dm_disk(md)->part0.in_flight[rw], pending);
        pending += atomic_read(&md->pending[rw^0x1]);
 
        /* nudge anyone waiting on suspend queue */
@@ -2620,9 +2621,10 @@ int dm_noflush_suspending(struct dm_target *ti)
 }
 EXPORT_SYMBOL_GPL(dm_noflush_suspending);
 
-struct dm_md_mempools *dm_alloc_md_mempools(unsigned type)
+struct dm_md_mempools *dm_alloc_md_mempools(unsigned type, unsigned integrity)
 {
        struct dm_md_mempools *pools = kmalloc(sizeof(*pools), GFP_KERNEL);
+       unsigned int pool_size = (type == DM_TYPE_BIO_BASED) ? 16 : MIN_IOS;
 
        if (!pools)
                return NULL;
@@ -2639,13 +2641,18 @@ struct dm_md_mempools *dm_alloc_md_mempools(unsigned type)
        if (!pools->tio_pool)
                goto free_io_pool_and_out;
 
-       pools->bs = (type == DM_TYPE_BIO_BASED) ?
-                   bioset_create(16, 0) : bioset_create(MIN_IOS, 0);
+       pools->bs = bioset_create(pool_size, 0);
        if (!pools->bs)
                goto free_tio_pool_and_out;
 
+       if (integrity && bioset_integrity_create(pools->bs, pool_size))
+               goto free_bioset_and_out;
+
        return pools;
 
+free_bioset_and_out:
+       bioset_free(pools->bs);
+
 free_tio_pool_and_out:
        mempool_destroy(pools->tio_pool);