aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/device-mapper.h
diff options
context:
space:
mode:
authorMikulas Patocka <mpatocka@redhat.com>2012-12-21 15:23:38 -0500
committerAlasdair G Kergon <agk@redhat.com>2012-12-21 15:23:38 -0500
commitc0820cf5ad09522bdd9ff68e84841a09c9f339d8 (patch)
tree04817d6d9a7d213ac96d1e014a9714f8f29ff07a /include/linux/device-mapper.h
parent70d6c400acc386ea910c77318688541fc32e7ce8 (diff)
dm: introduce per_bio_data
Introduce a field per_bio_data_size in struct dm_target. Targets can set this field in the constructor. If a target sets this field to a non-zero value, "per_bio_data_size" bytes of auxiliary data are allocated for each bio submitted to the target. These data can be used for any purpose by the target and help us improve performance by removing some per-target mempools. Per-bio data is accessed with dm_per_bio_data. The argument data_size must be the same as the value per_bio_data_size in dm_target. If the target has a pointer to per_bio_data, it can get a pointer to the bio with dm_bio_from_per_bio_data() function (data_size must be the same as the value passed to dm_per_bio_data). Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Diffstat (limited to 'include/linux/device-mapper.h')
-rw-r--r--include/linux/device-mapper.h30
1 files changed, 30 insertions, 0 deletions
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h
index d1f6cd8486f2..6f0e73b4a80d 100644
--- a/include/linux/device-mapper.h
+++ b/include/linux/device-mapper.h
@@ -210,6 +210,12 @@ struct dm_target {
210 */ 210 */
211 unsigned num_write_same_requests; 211 unsigned num_write_same_requests;
212 212
213 /*
214 * The minimum number of extra bytes allocated in each bio for the
215 * target to use. dm_per_bio_data returns the data location.
216 */
217 unsigned per_bio_data_size;
218
213 /* target specific data */ 219 /* target specific data */
214 void *private; 220 void *private;
215 221
@@ -246,6 +252,30 @@ struct dm_target_callbacks {
246 int (*congested_fn) (struct dm_target_callbacks *, int); 252 int (*congested_fn) (struct dm_target_callbacks *, int);
247}; 253};
248 254
255/*
256 * For bio-based dm.
257 * One of these is allocated for each bio.
258 * This structure shouldn't be touched directly by target drivers.
259 * It is here so that we can inline dm_per_bio_data and
260 * dm_bio_from_per_bio_data
261 */
262struct dm_target_io {
263 struct dm_io *io;
264 struct dm_target *ti;
265 union map_info info;
266 struct bio clone;
267};
268
269static inline void *dm_per_bio_data(struct bio *bio, size_t data_size)
270{
271 return (char *)bio - offsetof(struct dm_target_io, clone) - data_size;
272}
273
274static inline struct bio *dm_bio_from_per_bio_data(void *data, size_t data_size)
275{
276 return (struct bio *)((char *)data + data_size + offsetof(struct dm_target_io, clone));
277}
278
249int dm_register_target(struct target_type *t); 279int dm_register_target(struct target_type *t);
250void dm_unregister_target(struct target_type *t); 280void dm_unregister_target(struct target_type *t);
251 281