summaryrefslogtreecommitdiff
path: root/super-ddf.c
diff options
context:
space:
mode:
authormwilck@arcor.de <mwilck@arcor.de>2013-07-03 22:28:00 +0200
committerNeilBrown <neilb@suse.de>2013-07-08 16:49:32 +1000
commit475ccbdbf69bd00bdcdf965fe6914c4e22743370 (patch)
tree7bd15deeba85accf52f7d4881c07b108c67c9ad0 /super-ddf.c
parent4ee8cca90e07af70d0a12129ed7f817ae3f0dfd7 (diff)
DDF: add_to_super_ddf: RAID10 changes
The index in the BVD may be different in the RAID10 case. Signed-off-by: Martin Wilck <mwilck@arcor.de> Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'super-ddf.c')
-rw-r--r--super-ddf.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/super-ddf.c b/super-ddf.c
index 285b3d44..5ac9a04c 100644
--- a/super-ddf.c
+++ b/super-ddf.c
@@ -2457,11 +2457,11 @@ static void add_to_super_ddf_bvd(struct supertype *st,
struct dl *dl;
struct ddf_super *ddf = st->sb;
struct vd_config *vc;
- __u64 *lba_offset;
unsigned int working;
unsigned int i;
unsigned long long blocks, pos, esize;
struct extent *ex;
+ unsigned int raid_disk = dk->raid_disk;
if (fd == -1) {
for (dl = ddf->dlist; dl ; dl = dl->next)
@@ -2477,7 +2477,12 @@ static void add_to_super_ddf_bvd(struct supertype *st,
return;
vc = &ddf->currentconf->conf;
- lba_offset = LBA_OFFSET(ddf, &ddf->currentconf->conf);
+ if (vc->sec_elmnt_count > 1) {
+ unsigned int n = __be16_to_cpu(vc->prim_elmnt_count);
+ if (raid_disk >= n)
+ vc = ddf->currentconf->other_bvds[raid_disk / n - 1];
+ raid_disk %= n;
+ }
ex = get_extents(ddf, dl);
if (!ex)
@@ -2501,8 +2506,8 @@ static void add_to_super_ddf_bvd(struct supertype *st,
return;
ddf->currentdev = dk->raid_disk;
- vc->phys_refnum[dk->raid_disk] = dl->disk.refnum;
- lba_offset[dk->raid_disk] = __cpu_to_be64(pos);
+ vc->phys_refnum[raid_disk] = dl->disk.refnum;
+ LBA_OFFSET(ddf, vc)[raid_disk] = __cpu_to_be64(pos);
for (i = 0; i < ddf->max_part ; i++)
if (dl->vlist[i] == NULL)