Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 360327
b: refs/heads/master
c: b0d8ed4
h: refs/heads/master
i:
  360325: 3b83f2c
  360323: eaceeba
  360319: 0e13771
v: v3
  • Loading branch information
Alasdair G Kergon committed Mar 1, 2013
1 parent cec16d6 commit 8abea79
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: df5d2e9089c7d5b8c46f767e4278610ea3e815b9
refs/heads/master: b0d8ed4d96a26ef3ac54a4aa8911c9413070662e
22 changes: 15 additions & 7 deletions trunk/drivers/md/dm.c
Original file line number Diff line number Diff line change
Expand Up @@ -1152,15 +1152,23 @@ static void __clone_and_map_data_bio(struct clone_info *ci, struct dm_target *ti
{
struct bio *bio = ci->bio;
struct dm_target_io *tio;
unsigned target_bio_nr;
unsigned num_target_bios = 1;

tio = alloc_tio(ci, ti, nr_iovecs, 0);

if (split_bvec)
clone_split_bio(tio, bio, sector, idx, offset, len);
else
clone_bio(tio, bio, sector, idx, bv_count, len);
/*
* Does the target want to receive duplicate copies of the bio?
*/
if (bio_data_dir(bio) == WRITE && ti->num_write_bios)
num_target_bios = ti->num_write_bios(ti, bio);

__map_bio(tio);
for (target_bio_nr = 0; target_bio_nr < num_target_bios; target_bio_nr++) {
tio = alloc_tio(ci, ti, nr_iovecs, target_bio_nr);
if (split_bvec)
clone_split_bio(tio, bio, sector, idx, offset, len);
else
clone_bio(tio, bio, sector, idx, bv_count, len);
__map_bio(tio);
}
}

typedef unsigned (*get_num_bios_fn)(struct dm_target *ti);
Expand Down
15 changes: 15 additions & 0 deletions trunk/include/linux/device-mapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,14 @@ struct target_type {
#define DM_TARGET_IMMUTABLE 0x00000004
#define dm_target_is_immutable(type) ((type)->features & DM_TARGET_IMMUTABLE)

/*
* Some targets need to be sent the same WRITE bio severals times so
* that they can send copies of it to different devices. This function
* examines any supplied bio and returns the number of copies of it the
* target requires.
*/
typedef unsigned (*dm_num_write_bios_fn) (struct dm_target *ti, struct bio *bio);

struct dm_target {
struct dm_table *table;
struct target_type *type;
Expand Down Expand Up @@ -214,6 +222,13 @@ struct dm_target {
*/
unsigned per_bio_data_size;

/*
* If defined, this function is called to find out how many
* duplicate bios should be sent to the target when writing
* data.
*/
dm_num_write_bios_fn num_write_bios;

/* target specific data */
void *private;

Expand Down

0 comments on commit 8abea79

Please sign in to comment.