diff options
Diffstat (limited to 'drivers/md/dm-bio-prison.h')
-rw-r--r-- | drivers/md/dm-bio-prison.h | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/drivers/md/dm-bio-prison.h b/drivers/md/dm-bio-prison.h index 6805a142b750..74cf01144b1f 100644 --- a/drivers/md/dm-bio-prison.h +++ b/drivers/md/dm-bio-prison.h | |||
@@ -10,8 +10,8 @@ | |||
10 | #include "persistent-data/dm-block-manager.h" /* FIXME: for dm_block_t */ | 10 | #include "persistent-data/dm-block-manager.h" /* FIXME: for dm_block_t */ |
11 | #include "dm-thin-metadata.h" /* FIXME: for dm_thin_id */ | 11 | #include "dm-thin-metadata.h" /* FIXME: for dm_thin_id */ |
12 | 12 | ||
13 | #include <linux/list.h> | ||
14 | #include <linux/bio.h> | 13 | #include <linux/bio.h> |
14 | #include <linux/rbtree.h> | ||
15 | 15 | ||
16 | /*----------------------------------------------------------------*/ | 16 | /*----------------------------------------------------------------*/ |
17 | 17 | ||
@@ -23,11 +23,14 @@ | |||
23 | */ | 23 | */ |
24 | struct dm_bio_prison; | 24 | struct dm_bio_prison; |
25 | 25 | ||
26 | /* FIXME: this needs to be more abstract */ | 26 | /* |
27 | * Keys define a range of blocks within either a virtual or physical | ||
28 | * device. | ||
29 | */ | ||
27 | struct dm_cell_key { | 30 | struct dm_cell_key { |
28 | int virtual; | 31 | int virtual; |
29 | dm_thin_id dev; | 32 | dm_thin_id dev; |
30 | dm_block_t block; | 33 | dm_block_t block_begin, block_end; |
31 | }; | 34 | }; |
32 | 35 | ||
33 | /* | 36 | /* |
@@ -35,13 +38,15 @@ struct dm_cell_key { | |||
35 | * themselves. | 38 | * themselves. |
36 | */ | 39 | */ |
37 | struct dm_bio_prison_cell { | 40 | struct dm_bio_prison_cell { |
38 | struct hlist_node list; | 41 | struct list_head user_list; /* for client use */ |
42 | struct rb_node node; | ||
43 | |||
39 | struct dm_cell_key key; | 44 | struct dm_cell_key key; |
40 | struct bio *holder; | 45 | struct bio *holder; |
41 | struct bio_list bios; | 46 | struct bio_list bios; |
42 | }; | 47 | }; |
43 | 48 | ||
44 | struct dm_bio_prison *dm_bio_prison_create(unsigned nr_cells); | 49 | struct dm_bio_prison *dm_bio_prison_create(void); |
45 | void dm_bio_prison_destroy(struct dm_bio_prison *prison); | 50 | void dm_bio_prison_destroy(struct dm_bio_prison *prison); |
46 | 51 | ||
47 | /* | 52 | /* |
@@ -57,7 +62,7 @@ void dm_bio_prison_free_cell(struct dm_bio_prison *prison, | |||
57 | struct dm_bio_prison_cell *cell); | 62 | struct dm_bio_prison_cell *cell); |
58 | 63 | ||
59 | /* | 64 | /* |
60 | * Creates, or retrieves a cell for the given key. | 65 | * Creates, or retrieves a cell that overlaps the given key. |
61 | * | 66 | * |
62 | * Returns 1 if pre-existing cell returned, zero if new cell created using | 67 | * Returns 1 if pre-existing cell returned, zero if new cell created using |
63 | * @cell_prealloc. | 68 | * @cell_prealloc. |
@@ -68,7 +73,8 @@ int dm_get_cell(struct dm_bio_prison *prison, | |||
68 | struct dm_bio_prison_cell **cell_result); | 73 | struct dm_bio_prison_cell **cell_result); |
69 | 74 | ||
70 | /* | 75 | /* |
71 | * An atomic op that combines retrieving a cell, and adding a bio to it. | 76 | * An atomic op that combines retrieving or creating a cell, and adding a |
77 | * bio to it. | ||
72 | * | 78 | * |
73 | * Returns 1 if the cell was already held, 0 if @inmate is the new holder. | 79 | * Returns 1 if the cell was already held, 0 if @inmate is the new holder. |
74 | */ | 80 | */ |
@@ -87,6 +93,14 @@ void dm_cell_release_no_holder(struct dm_bio_prison *prison, | |||
87 | void dm_cell_error(struct dm_bio_prison *prison, | 93 | void dm_cell_error(struct dm_bio_prison *prison, |
88 | struct dm_bio_prison_cell *cell, int error); | 94 | struct dm_bio_prison_cell *cell, int error); |
89 | 95 | ||
96 | /* | ||
97 | * Visits the cell and then releases. Guarantees no new inmates are | ||
98 | * inserted between the visit and release. | ||
99 | */ | ||
100 | void dm_cell_visit_release(struct dm_bio_prison *prison, | ||
101 | void (*visit_fn)(void *, struct dm_bio_prison_cell *), | ||
102 | void *context, struct dm_bio_prison_cell *cell); | ||
103 | |||
90 | /*----------------------------------------------------------------*/ | 104 | /*----------------------------------------------------------------*/ |
91 | 105 | ||
92 | /* | 106 | /* |