[dm-devel] [PATCH 1/6] dm raid45 target: export region hash functions and add a needed one
heinzm at redhat.com
heinzm at redhat.com
Mon Jun 15 17:21:05 UTC 2009
Hi,
this patch series introduces the raid45 target.
Please include upstream.
The raid45 target supports RAID4 mappings with a dedicated and selectable
parity device and RAID5 mappings with rotating parity (left/right (a)symmetric).
Initial and partial resynchronization functionality utilizes the dm
dirty log module.
A stripe cache handled by the target in order to update or reconstruct
parity is based on memory objects being managed in a separate, sharable
dm-memcache module, which allows for allocation of such objects with
N chunks of page lists with M pages each.
Message interface parsing is performed in the seperate, sharable
dm-message module.
Heinz
Summary of the patch-set
========================
1/5: dm raid45 target: export region hash functions and add a needed one
2/5: dm raid45 target: introduce memory cache
3/5: dm raid45 target: introduce message parser
4/5: dm raid45 target: export dm_disk from dm.c
5/5: dm raid45 target: introcuce the raid45 target
6/5: dm raid45 target: add raid45 modules to Makefile and adjust Kconfig
include/linux/dm-region-hash.h | 4 ++++
drivers/md/dm-region-hash.c | 21 +++++++++++++++++--
drivers/md/dm-memcache.h | 68 ++++++++++++++++++++++
drivers/md/dm-memcache.c | 301 ++++++++++++++++++++++
drivers/md/dm-message.h | 91 ++++++++++++++++++++++++
drivers/md/dm-message.c | 183 ++++++++++++++++++++++++
drivers/md/dm.c | 1 +
drivers/md/dm-raid45.h | 28 ++++++++++++++++++++++++++
drivers/md/dm-raid45.c | 4580 ++++++++++++++++++++++++++
drivers/md/Makefile | 3 +++
drivers/md/Kconfig | 9 +++++++++
11 files changed, 5286 insertions(+), 3 deletions(-)
.../{dm-region-hash.h.orig => dm-region-hash.h} | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/include/linux/dm-region-hash.h.orig b/include/linux/dm-region-hash.h
index a9e652a..bfd21cb 100644
--- a/include/linux/dm-region-hash.h.orig
+++ b/include/linux/dm-region-hash.h
@@ -49,6 +49,7 @@ struct dm_dirty_log *dm_rh_dirty_log(struct dm_region_hash *rh);
*/
region_t dm_rh_bio_to_region(struct dm_region_hash *rh, struct bio *bio);
sector_t dm_rh_region_to_sector(struct dm_region_hash *rh, region_t region);
+region_t dm_rh_sector_to_region(struct dm_region_hash *rh, sector_t sector);
void *dm_rh_region_context(struct dm_region *reg);
/*
@@ -72,11 +73,14 @@ void dm_rh_update_states(struct dm_region_hash *rh, int errors_handled);
int dm_rh_flush(struct dm_region_hash *rh);
/* Inc/dec pending count on regions. */
+void dm_rh_inc(struct dm_region_hash *rh, region_t region);
void dm_rh_inc_pending(struct dm_region_hash *rh, struct bio_list *bios);
void dm_rh_dec(struct dm_region_hash *rh, region_t region);
/* Delay bios on regions. */
void dm_rh_delay(struct dm_region_hash *rh, struct bio *bio);
+void dm_rh_delay_by_region(struct dm_region_hash *rh, struct bio *bio,
+ region_t region);
void dm_rh_mark_nosync(struct dm_region_hash *rh,
struct bio *bio, unsigned done, int error);
.../md/{dm-region-hash.c.orig => dm-region-hash.c} | 21 +++++++++++++++++--
1 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/drivers/md/dm-region-hash.c.orig b/drivers/md/dm-region-hash.c
index 7b899be..47b088b 100644
--- a/drivers/md/dm-region-hash.c.orig
+++ b/drivers/md/dm-region-hash.c
@@ -107,10 +107,11 @@ struct dm_region {
/*
* Conversion fns
*/
-static region_t dm_rh_sector_to_region(struct dm_region_hash *rh, sector_t sector)
+region_t dm_rh_sector_to_region(struct dm_region_hash *rh, sector_t sector)
{
return sector >> rh->region_shift;
}
+EXPORT_SYMBOL_GPL(dm_rh_sector_to_region);
sector_t dm_rh_region_to_sector(struct dm_region_hash *rh, region_t region)
{
@@ -488,7 +489,7 @@ void dm_rh_update_states(struct dm_region_hash *rh, int errors_handled)
}
EXPORT_SYMBOL_GPL(dm_rh_update_states);
-static void rh_inc(struct dm_region_hash *rh, region_t region)
+void dm_rh_inc(struct dm_region_hash *rh, region_t region)
{
struct dm_region *reg;
@@ -510,13 +511,14 @@ static void rh_inc(struct dm_region_hash *rh, region_t region)
read_unlock(&rh->hash_lock);
}
+EXPORT_SYMBOL_GPL(dm_rh_inc);
void dm_rh_inc_pending(struct dm_region_hash *rh, struct bio_list *bios)
{
struct bio *bio;
for (bio = bios->head; bio; bio = bio->bi_next)
- rh_inc(rh, dm_rh_bio_to_region(rh, bio));
+ dm_rh_inc(rh, dm_rh_bio_to_region(rh, bio));
}
EXPORT_SYMBOL_GPL(dm_rh_inc_pending);
@@ -677,6 +679,19 @@ void dm_rh_delay(struct dm_region_hash *rh, struct bio *bio)
}
EXPORT_SYMBOL_GPL(dm_rh_delay);
+void dm_rh_delay_by_region(struct dm_region_hash *rh,
+ struct bio *bio, region_t region)
+{
+ struct dm_region *reg;
+
+ /* FIXME: locking. */
+ read_lock(&rh->hash_lock);
+ reg = __rh_find(rh, region);
+ bio_list_add(®->delayed_bios, bio);
+ read_unlock(&rh->hash_lock);
+}
+EXPORT_SYMBOL_GPL(dm_rh_delay_by_region);
+
void dm_rh_stop_recovery(struct dm_region_hash *rh)
{
int i;
More information about the dm-devel
mailing list