aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm.c
diff options
context:
space:
mode:
authorKent Overstreet <koverstreet@google.com>2012-09-06 18:34:55 -0400
committerJens Axboe <axboe@kernel.dk>2012-09-09 04:35:38 -0400
commit395c72a707d966b36d5a42fe12c3a237ded3a0d9 (patch)
tree79e4450a4f31409815d80ee8e1a7e1490a140f22 /drivers/md/dm.c
parenteeea3ac912207dcf759b95b2b4c36f96bce583bf (diff)
block: Generalized bio pool freeing
With the old code, when you allocate a bio from a bio pool you have to implement your own destructor that knows how to find the bio pool the bio was originally allocated from. This adds a new field to struct bio (bi_pool) and changes bio_alloc_bioset() to use it. This makes various bio destructors unnecessary, so they're then deleted. v6: Explain the temporary if statement in bio_put Signed-off-by: Kent Overstreet <koverstreet@google.com> CC: Jens Axboe <axboe@kernel.dk> CC: NeilBrown <neilb@suse.de> CC: Alasdair Kergon <agk@redhat.com> CC: Nicholas Bellinger <nab@linux-iscsi.org> CC: Lars Ellenberg <lars.ellenberg@linbit.com> Acked-by: Tejun Heo <tj@kernel.org> Acked-by: Nicholas Bellinger <nab@linux-iscsi.org> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/md/dm.c')
-rw-r--r--drivers/md/dm.c20
1 files changed, 0 insertions, 20 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 4e09b6ff5b49..0c3d6dd51897 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -681,11 +681,6 @@ static void clone_endio(struct bio *bio, int error)
681 } 681 }
682 } 682 }
683 683
684 /*
685 * Store md for cleanup instead of tio which is about to get freed.
686 */
687 bio->bi_private = md->bs;
688
689 free_tio(md, tio); 684 free_tio(md, tio);
690 bio_put(bio); 685 bio_put(bio);
691 dec_pending(io, error); 686 dec_pending(io, error);
@@ -1032,11 +1027,6 @@ static void __map_bio(struct dm_target *ti, struct bio *clone,
1032 /* error the io and bail out, or requeue it if needed */ 1027 /* error the io and bail out, or requeue it if needed */
1033 md = tio->io->md; 1028 md = tio->io->md;
1034 dec_pending(tio->io, r); 1029 dec_pending(tio->io, r);
1035 /*
1036 * Store bio_set for cleanup.
1037 */
1038 clone->bi_end_io = NULL;
1039 clone->bi_private = md->bs;
1040 bio_put(clone); 1030 bio_put(clone);
1041 free_tio(md, tio); 1031 free_tio(md, tio);
1042 } else if (r) { 1032 } else if (r) {
@@ -1055,13 +1045,6 @@ struct clone_info {
1055 unsigned short idx; 1045 unsigned short idx;
1056}; 1046};
1057 1047
1058static void dm_bio_destructor(struct bio *bio)
1059{
1060 struct bio_set *bs = bio->bi_private;
1061
1062 bio_free(bio, bs);
1063}
1064
1065/* 1048/*
1066 * Creates a little bio that just does part of a bvec. 1049 * Creates a little bio that just does part of a bvec.
1067 */ 1050 */
@@ -1073,7 +1056,6 @@ static struct bio *split_bvec(struct bio *bio, sector_t sector,
1073 struct bio_vec *bv = bio->bi_io_vec + idx; 1056 struct bio_vec *bv = bio->bi_io_vec + idx;
1074 1057
1075 clone = bio_alloc_bioset(GFP_NOIO, 1, bs); 1058 clone = bio_alloc_bioset(GFP_NOIO, 1, bs);
1076 clone->bi_destructor = dm_bio_destructor;
1077 *clone->bi_io_vec = *bv; 1059 *clone->bi_io_vec = *bv;
1078 1060
1079 clone->bi_sector = sector; 1061 clone->bi_sector = sector;
@@ -1105,7 +1087,6 @@ static struct bio *clone_bio(struct bio *bio, sector_t sector,
1105 1087
1106 clone = bio_alloc_bioset(GFP_NOIO, bio->bi_max_vecs, bs); 1088 clone = bio_alloc_bioset(GFP_NOIO, bio->bi_max_vecs, bs);
1107 __bio_clone(clone, bio); 1089 __bio_clone(clone, bio);
1108 clone->bi_destructor = dm_bio_destructor;
1109 clone->bi_sector = sector; 1090 clone->bi_sector = sector;
1110 clone->bi_idx = idx; 1091 clone->bi_idx = idx;
1111 clone->bi_vcnt = idx + bv_count; 1092 clone->bi_vcnt = idx + bv_count;
@@ -1150,7 +1131,6 @@ static void __issue_target_request(struct clone_info *ci, struct dm_target *ti,
1150 */ 1131 */
1151 clone = bio_alloc_bioset(GFP_NOIO, ci->bio->bi_max_vecs, ci->md->bs); 1132 clone = bio_alloc_bioset(GFP_NOIO, ci->bio->bi_max_vecs, ci->md->bs);
1152 __bio_clone(clone, ci->bio); 1133 __bio_clone(clone, ci->bio);
1153 clone->bi_destructor = dm_bio_destructor;
1154 if (len) { 1134 if (len) {
1155 clone->bi_sector = ci->sector; 1135 clone->bi_sector = ci->sector;
1156 clone->bi_size = to_bytes(len); 1136 clone->bi_size = to_bytes(len);