Commit b931e459 authored by Neil Brown's avatar Neil Brown Committed by Linus Torvalds

[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.
parent 264b2f7c
......@@ -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;
}
......
......@@ -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;
......
......@@ -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:
......
......@@ -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;
......
......@@ -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;
......
......@@ -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 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment