]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] md: Allow components of MD raid array to have data start at offset from start...
authorNeil Brown <neilb@cse.unsw.edu.au>
Fri, 14 Mar 2003 10:09:13 +0000 (02:09 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Fri, 14 Mar 2003 10:09:13 +0000 (02:09 -0800)
Normally the data stored on a component of a RAID array is stored
from the start of the device.  This patch allows a per-device
data_offset so the data can start elsewhere. This will allow
RAID arrays where the metadata is at the head of the device
rather than the tail.

drivers/md/linear.c
drivers/md/md.c
drivers/md/raid0.c
drivers/md/raid1.c
drivers/md/raid5.c
include/linux/raid/md_k.h

index 380b28ce026bb0174045a56970b352c0f2b58268..00e9abe0f01566384cd79bf295566c1e7d7f5e89 100644 (file)
@@ -203,7 +203,7 @@ static int linear_make_request (request_queue_t *q, struct bio *bio)
                return 0;
        }
        bio->bi_bdev = tmp_dev->rdev->bdev;
-       bio->bi_sector = bio->bi_sector - (tmp_dev->offset << 1);
+       bio->bi_sector = bio->bi_sector - (tmp_dev->offset << 1) + tmp_dev->rdev->data_offset;
 
        return 1;
 }
index 8a8dc92a527da038cf3c8a998753c0ea17c8a093..28c3a08eea769da6ac9e79f1c84118e55e34854b 100644 (file)
@@ -555,6 +555,7 @@ static int super_90_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev)
        }
 
        rdev->preferred_minor = sb->md_minor;
+       rdev->data_offset = 0;
 
        if (refdev == 0)
                ret = 1;
@@ -1137,6 +1138,7 @@ static mdk_rdev_t *md_import_device(dev_t newdev, int on_disk)
        rdev->desc_nr = -1;
        rdev->faulty = 0;
        rdev->in_sync = 0;
+       rdev->data_offset = 0;
        atomic_set(&rdev->nr_pending, 0);
 
        size = rdev->bdev->bd_inode->i_size >> BLOCK_SIZE_BITS;
index 00a79d9b364bd5d27ba638c3faf148a8b9a0b3f1..99de04b380a3b65a2da6790797a02ec31a722c66 100644 (file)
@@ -349,7 +349,7 @@ static int raid0_make_request (request_queue_t *q, struct bio *bio)
         * is the only IO operation happening on this bh.
         */
        bio->bi_bdev = tmp_dev->bdev;
-       bio->bi_sector = rsect;
+       bio->bi_sector = rsect + tmp_dev->data_offset;
 
        /*
         * Let the main block layer submit the IO and resolve recursion:
index 6d6afd4096671deb7b40ef9aa36b80792b9eb28e..0dd391e3d3b1f91a9a559058445f788d132cbe43 100644 (file)
@@ -493,7 +493,7 @@ static int make_request(request_queue_t *q, struct bio * bio)
                        BUG();
                r1_bio->read_bio = read_bio;
 
-               read_bio->bi_sector = r1_bio->sector;
+               read_bio->bi_sector = r1_bio->sector + mirror->rdev->data_offset;
                read_bio->bi_bdev = mirror->rdev->bdev;
                read_bio->bi_end_io = end_request;
                read_bio->bi_rw = r1_bio->cmd;
@@ -528,7 +528,7 @@ static int make_request(request_queue_t *q, struct bio * bio)
                mbio = bio_clone(bio, GFP_NOIO);
                r1_bio->write_bios[i] = mbio;
 
-               mbio->bi_sector = r1_bio->sector;
+               mbio->bi_sector = r1_bio->sector + conf->mirrors[i].rdev->data_offset;
                mbio->bi_bdev = conf->mirrors[i].rdev->bdev;
                mbio->bi_end_io = end_request;
                mbio->bi_rw = r1_bio->cmd;
@@ -856,7 +856,7 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
                mbio = bio_clone(bio, GFP_NOIO);
                r1_bio->write_bios[i] = mbio;
                mbio->bi_bdev = conf->mirrors[i].rdev->bdev;
-               mbio->bi_sector = r1_bio->sector;
+               mbio->bi_sector = r1_bio->sector | conf->mirrors[i].rdev->data_offset;
                mbio->bi_end_io = end_sync_write;
                mbio->bi_rw = WRITE;
                mbio->bi_private = r1_bio;
@@ -934,7 +934,7 @@ static void raid1d(mddev_t *mddev)
                        printk(REDIRECT_SECTOR,
                                bdev_partition_name(rdev->bdev), (unsigned long long)r1_bio->sector);
                        bio->bi_bdev = rdev->bdev;
-                       bio->bi_sector = r1_bio->sector;
+                       bio->bi_sector = r1_bio->sector + rdev->data_offset;
                        bio->bi_rw = r1_bio->cmd;
 
                        generic_make_request(bio);
@@ -1045,7 +1045,7 @@ static int sync_request(mddev_t *mddev, sector_t sector_nr, int go_faster)
 
        read_bio = bio_clone(r1_bio->master_bio, GFP_NOIO);
 
-       read_bio->bi_sector = sector_nr;
+       read_bio->bi_sector = sector_nr + mirror->rdev->data_offset;
        read_bio->bi_bdev = mirror->rdev->bdev;
        read_bio->bi_end_io = end_sync_read;
        read_bio->bi_rw = READ;
index 63d6e4bf843b62c35363ea62b4e9e5139687fd3c..51a8e2d721d6cc68805a69539fbcd7657b0dfbcb 100644 (file)
@@ -1206,7 +1206,7 @@ static void handle_stripe(struct stripe_head *sh)
                        bi->bi_bdev = rdev->bdev;
                        PRINTK("for %llu schedule op %ld on disc %d\n", (unsigned long long)sh->sector, bi->bi_rw, i);
                        atomic_inc(&sh->count);
-                       bi->bi_sector = sh->sector;
+                       bi->bi_sector = sh->sector + rdev->data_offset;
                        bi->bi_flags = 1 << BIO_UPTODATE;
                        bi->bi_vcnt = 1;        
                        bi->bi_idx = 0;
index 9f071d407f7bb2c641fc13782e3c9176ebb88dd2..02bdf9db2ae2d7307ea208ca641c6d82786d877b 100644 (file)
@@ -155,6 +155,7 @@ struct mdk_rdev_s
 
        struct page     *sb_page;
        int             sb_loaded;
+       sector_t        data_offset;    /* start of data in array */
        sector_t        sb_offset;
        int             preferred_minor;        /* autorun support */