diff options
author | Kent Overstreet <koverstreet@google.com> | 2012-09-06 18:34:55 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2012-09-09 04:35:38 -0400 |
commit | 395c72a707d966b36d5a42fe12c3a237ded3a0d9 (patch) | |
tree | 79e4450a4f31409815d80ee8e1a7e1490a140f22 /drivers/md/dm.c | |
parent | eeea3ac912207dcf759b95b2b4c36f96bce583bf (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.c | 20 |
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 | ||
1058 | static 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); |