From b931e4595b0c1ba56decec4c85354b772675c58e Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Fri, 14 Mar 2003 02:09:13 -0800 Subject: [PATCH] [PATCH] md: Allow components of MD raid array to have data start at offset from start of device. 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 | 2 +- drivers/md/md.c | 2 ++ drivers/md/raid0.c | 2 +- drivers/md/raid1.c | 10 +++++----- drivers/md/raid5.c | 2 +- include/linux/raid/md_k.h | 1 + 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/drivers/md/linear.c b/drivers/md/linear.c index 380b28ce026bb..00e9abe0f0156 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c @@ -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; } diff --git a/drivers/md/md.c b/drivers/md/md.c index 8a8dc92a527da..28c3a08eea769 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -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; diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 00a79d9b364bd..99de04b380a3b 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -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: diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 6d6afd4096671..0dd391e3d3b1f 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -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; diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 63d6e4bf843b6..51a8e2d721d6c 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -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; diff --git a/include/linux/raid/md_k.h b/include/linux/raid/md_k.h index 9f071d407f7bb..02bdf9db2ae2d 100644 --- a/include/linux/raid/md_k.h +++ b/include/linux/raid/md_k.h @@ -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 */ -- 2.53.0