]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
DDF: add_to_super_ddf: RAID10 changes
authormwilck@arcor.de <mwilck@arcor.de>
Wed, 3 Jul 2013 20:28:00 +0000 (22:28 +0200)
committerNeilBrown <neilb@suse.de>
Mon, 8 Jul 2013 06:49:32 +0000 (16:49 +1000)
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>
super-ddf.c

index 285b3d440065a5306560a412e2ea69fd4812f412..5ac9a04c357d27591d532eb4ed080d521752995e 100644 (file)
@@ -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)