Skip to content

Commit

Permalink
md: Represent raid device size in sectors.
Browse files Browse the repository at this point in the history
This patch renames the "size" field of struct mdk_rdev_s to
"sectors" and changes this field to store sectors instead of
blocks.

All users of this field, linear.c, raid0.c and md.c, are fixed up
accordingly which gets rid of many multiplications and divisions.

Signed-off-by: Andre Noll <maan@systemlinux.org>
Signed-off-by: NeilBrown <neilb@suse.de>
  • Loading branch information
Andre Noll authored and NeilBrown committed Mar 31, 2009
1 parent 58c0fed commit dd8ac33
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 72 deletions.
4 changes: 2 additions & 2 deletions drivers/md/linear.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,8 +139,8 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
mddev->queue->max_sectors > (PAGE_SIZE>>9))
blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9);

disk->num_sectors = rdev->size * 2;
conf->array_sectors += rdev->size * 2;
disk->num_sectors = rdev->sectors;
conf->array_sectors += rdev->sectors;

cnt++;
}
Expand Down
96 changes: 48 additions & 48 deletions drivers/md/md.c
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ static void free_disk_sb(mdk_rdev_t * rdev)
rdev->sb_loaded = 0;
rdev->sb_page = NULL;
rdev->sb_start = 0;
rdev->size = 0;
rdev->sectors = 0;
}
}

Expand Down Expand Up @@ -779,9 +779,9 @@ static int super_90_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version
else
ret = 0;
}
rdev->size = calc_num_sectors(rdev, sb->chunk_size) / 2;
rdev->sectors = calc_num_sectors(rdev, sb->chunk_size);

if (rdev->size < sb->size && sb->level > 1)
if (rdev->sectors < sb->size * 2 && sb->level > 1)
/* "this cannot possibly happen" ... */
ret = -EINVAL;

Expand Down Expand Up @@ -1184,16 +1184,17 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version)
ret = 0;
}
if (minor_version)
rdev->size = ((rdev->bdev->bd_inode->i_size>>9) - le64_to_cpu(sb->data_offset)) / 2;
rdev->sectors = (rdev->bdev->bd_inode->i_size >> 9) -
le64_to_cpu(sb->data_offset);
else
rdev->size = rdev->sb_start / 2;
if (rdev->size < le64_to_cpu(sb->data_size)/2)
rdev->sectors = rdev->sb_start;
if (rdev->sectors < le64_to_cpu(sb->data_size))
return -EINVAL;
rdev->size = le64_to_cpu(sb->data_size)/2;
rdev->sectors = le64_to_cpu(sb->data_size);
if (le32_to_cpu(sb->chunksize))
rdev->size &= ~((sector_t)le32_to_cpu(sb->chunksize)/2 - 1);
rdev->sectors &= ~((sector_t)le32_to_cpu(sb->chunksize) - 1);

if (le64_to_cpu(sb->size) > rdev->size*2)
if (le64_to_cpu(sb->size) > rdev->sectors)
return -EINVAL;
return ret;
}
Expand Down Expand Up @@ -1390,7 +1391,7 @@ super_1_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors)
sector_t sb_start;
sb_start = (rdev->bdev->bd_inode->i_size >> 9) - 8*2;
sb_start &= ~(sector_t)(4*2 - 1);
max_sectors = rdev->size * 2 + sb_start - rdev->sb_start;
max_sectors = rdev->sectors + sb_start - rdev->sb_start;
if (!num_sectors || num_sectors > max_sectors)
num_sectors = max_sectors;
rdev->sb_start = sb_start;
Expand Down Expand Up @@ -1490,9 +1491,9 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev)
if (find_rdev(mddev, rdev->bdev->bd_dev))
return -EEXIST;

/* make sure rdev->size exceeds mddev->dev_sectors / 2 */
if (rdev->size && (mddev->dev_sectors == 0 ||
rdev->size < mddev->dev_sectors / 2)) {
/* make sure rdev->sectors exceeds mddev->dev_sectors */
if (rdev->sectors && (mddev->dev_sectors == 0 ||
rdev->sectors < mddev->dev_sectors)) {
if (mddev->pers) {
/* Cannot change size, so fail
* If mddev->level <= 0, then we don't care
Expand All @@ -1501,7 +1502,7 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev)
if (mddev->level > 0)
return -ENOSPC;
} else
mddev->dev_sectors = rdev->size * 2;
mddev->dev_sectors = rdev->sectors;
}

/* Verify rdev->desc_nr is unique.
Expand Down Expand Up @@ -1757,8 +1758,8 @@ static void print_sb_1(struct mdp_superblock_1 *sb)
static void print_rdev(mdk_rdev_t *rdev, int major_version)
{
char b[BDEVNAME_SIZE];
printk(KERN_INFO "md: rdev %s, SZ:%08llu F:%d S:%d DN:%u\n",
bdevname(rdev->bdev,b), (unsigned long long)rdev->size,
printk(KERN_INFO "md: rdev %s, Sect:%08llu F:%d S:%d DN:%u\n",
bdevname(rdev->bdev, b), (unsigned long long)rdev->sectors,
test_bit(Faulty, &rdev->flags), test_bit(In_sync, &rdev->flags),
rdev->desc_nr);
if (rdev->sb_loaded) {
Expand Down Expand Up @@ -2197,7 +2198,7 @@ offset_store(mdk_rdev_t *rdev, const char *buf, size_t len)
return -EINVAL;
if (rdev->mddev->pers && rdev->raid_disk >= 0)
return -EBUSY;
if (rdev->size && rdev->mddev->external)
if (rdev->sectors && rdev->mddev->external)
/* Must set offset before size, so overlap checks
* can be sane */
return -EBUSY;
Expand All @@ -2211,7 +2212,7 @@ __ATTR(offset, S_IRUGO|S_IWUSR, offset_show, offset_store);
static ssize_t
rdev_size_show(mdk_rdev_t *rdev, char *page)
{
return sprintf(page, "%llu\n", (unsigned long long)rdev->size);
return sprintf(page, "%llu\n", (unsigned long long)rdev->sectors / 2);
}

static int overlaps(sector_t s1, sector_t l1, sector_t s2, sector_t l2)
Expand All @@ -2227,31 +2228,31 @@ static int overlaps(sector_t s1, sector_t l1, sector_t s2, sector_t l2)
static ssize_t
rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
{
unsigned long long size;
unsigned long long oldsize = rdev->size;
mddev_t *my_mddev = rdev->mddev;
sector_t oldsectors = rdev->sectors;
unsigned long long sectors;

if (strict_strtoull(buf, 10, &size) < 0)
if (strict_strtoull(buf, 10, &sectors) < 0)
return -EINVAL;
sectors *= 2;
if (my_mddev->pers && rdev->raid_disk >= 0) {
if (my_mddev->persistent) {
size = super_types[my_mddev->major_version].
rdev_size_change(rdev, size * 2);
if (!size)
sectors = super_types[my_mddev->major_version].
rdev_size_change(rdev, sectors);
if (!sectors)
return -EBUSY;
} else if (!size) {
size = (rdev->bdev->bd_inode->i_size >> 10);
size -= rdev->data_offset/2;
}
} else if (!sectors)
sectors = (rdev->bdev->bd_inode->i_size >> 9) -
rdev->data_offset;
}
if (size < my_mddev->dev_sectors / 2)
if (sectors < my_mddev->dev_sectors)
return -EINVAL; /* component must fit device */

rdev->size = size;
if (size > oldsize && my_mddev->external) {
rdev->sectors = sectors;
if (sectors > oldsectors && my_mddev->external) {
/* need to check that all other rdevs with the same ->bdev
* do not overlap. We need to unlock the mddev to avoid
* a deadlock. We have already changed rdev->size, and if
* a deadlock. We have already changed rdev->sectors, and if
* we have to change it back, we will have the lock again.
*/
mddev_t *mddev;
Expand All @@ -2267,9 +2268,9 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
if (test_bit(AllReserved, &rdev2->flags) ||
(rdev->bdev == rdev2->bdev &&
rdev != rdev2 &&
overlaps(rdev->data_offset, rdev->size * 2,
overlaps(rdev->data_offset, rdev->sectors,
rdev2->data_offset,
rdev2->size * 2))) {
rdev2->sectors))) {
overlap = 1;
break;
}
Expand All @@ -2283,11 +2284,11 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
if (overlap) {
/* Someone else could have slipped in a size
* change here, but doing so is just silly.
* We put oldsize back because we *know* it is
* We put oldsectors back because we *know* it is
* safe, and trust userspace not to race with
* itself
*/
rdev->size = oldsize;
rdev->sectors = oldsectors;
return -EBUSY;
}
}
Expand Down Expand Up @@ -3760,13 +3761,13 @@ static int do_md_run(mddev_t * mddev)
list_for_each_entry(rdev, &mddev->disks, same_set) {
if (test_bit(Faulty, &rdev->flags))
continue;
if (rdev->size < chunk_size / 1024) {
if (rdev->sectors < chunk_size / 512) {
printk(KERN_WARNING
"md: Dev %s smaller than chunk_size:"
" %lluk < %dk\n",
" %llu < %d\n",
bdevname(rdev->bdev,b),
(unsigned long long)rdev->size,
chunk_size / 1024);
(unsigned long long)rdev->sectors,
chunk_size / 512);
return -EINVAL;
}
}
Expand Down Expand Up @@ -4585,7 +4586,7 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
rdev->sb_start = rdev->bdev->bd_inode->i_size / 512;
} else
rdev->sb_start = calc_dev_sboffset(rdev->bdev);
rdev->size = calc_num_sectors(rdev, mddev->chunk_size) / 2;
rdev->sectors = calc_num_sectors(rdev, mddev->chunk_size);

err = bind_rdev_to_array(rdev, mddev);
if (err) {
Expand Down Expand Up @@ -4655,7 +4656,7 @@ static int hot_add_disk(mddev_t * mddev, dev_t dev)
else
rdev->sb_start = rdev->bdev->bd_inode->i_size / 512;

rdev->size = calc_num_sectors(rdev, mddev->chunk_size) / 2;
rdev->sectors = calc_num_sectors(rdev, mddev->chunk_size);

if (test_bit(Faulty, &rdev->flags)) {
printk(KERN_WARNING
Expand Down Expand Up @@ -4856,8 +4857,7 @@ static int update_size(mddev_t *mddev, sector_t num_sectors)
*/
return -EBUSY;
list_for_each_entry(rdev, &mddev->disks, same_set) {
sector_t avail;
avail = rdev->size * 2;
sector_t avail = rdev->sectors;

if (fit && (num_sectors == 0 || num_sectors > avail))
num_sectors = avail;
Expand Down Expand Up @@ -5585,7 +5585,7 @@ struct mdstat_info {
static int md_seq_show(struct seq_file *seq, void *v)
{
mddev_t *mddev = v;
sector_t size;
sector_t sectors;
mdk_rdev_t *rdev;
struct mdstat_info *mi = seq->private;
struct bitmap *bitmap;
Expand Down Expand Up @@ -5621,7 +5621,7 @@ static int md_seq_show(struct seq_file *seq, void *v)
seq_printf(seq, " %s", mddev->pers->name);
}

size = 0;
sectors = 0;
list_for_each_entry(rdev, &mddev->disks, same_set) {
char b[BDEVNAME_SIZE];
seq_printf(seq, " %s[%d]",
Expand All @@ -5633,7 +5633,7 @@ static int md_seq_show(struct seq_file *seq, void *v)
continue;
} else if (rdev->raid_disk < 0)
seq_printf(seq, "(S)"); /* spare */
size += rdev->size;
sectors += rdev->sectors;
}

if (!list_empty(&mddev->disks)) {
Expand All @@ -5643,7 +5643,7 @@ static int md_seq_show(struct seq_file *seq, void *v)
mddev->array_sectors / 2);
else
seq_printf(seq, "\n %llu blocks",
(unsigned long long)size);
(unsigned long long)sectors / 2);
}
if (mddev->persistent) {
if (mddev->major_version != 0 ||
Expand Down
2 changes: 1 addition & 1 deletion drivers/md/md.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ struct mdk_rdev_s
{
struct list_head same_set; /* RAID devices within the same set */

sector_t size; /* Device size (in blocks) */
sector_t sectors; /* Device size (in 512bytes sectors) */
mddev_t *mddev; /* RAID array if running */
int last_events; /* IO event timestamp */

Expand Down
41 changes: 20 additions & 21 deletions drivers/md/raid0.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,16 +76,15 @@ static int create_strip_zones (mddev_t *mddev)
list_for_each_entry(rdev2, &mddev->disks, same_set) {
printk(KERN_INFO "raid0: comparing %s(%llu)",
bdevname(rdev1->bdev,b),
(unsigned long long)rdev1->size);
(unsigned long long)rdev1->sectors);
printk(KERN_INFO " with %s(%llu)\n",
bdevname(rdev2->bdev,b),
(unsigned long long)rdev2->size);
(unsigned long long)rdev2->sectors);
if (rdev2 == rdev1) {
printk(KERN_INFO "raid0: END\n");
break;
}
if (rdev2->size == rdev1->size)
{
if (rdev2->sectors == rdev1->sectors) {
/*
* Not unique, don't count it as a new
* group
Expand Down Expand Up @@ -148,7 +147,7 @@ static int create_strip_zones (mddev_t *mddev)
mddev->queue->max_sectors > (PAGE_SIZE>>9))
blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9);

if (!smallest || (rdev1->size <smallest->size))
if (!smallest || (rdev1->sectors < smallest->sectors))
smallest = rdev1;
cnt++;
}
Expand All @@ -158,10 +157,10 @@ static int create_strip_zones (mddev_t *mddev)
goto abort;
}
zone->nb_dev = cnt;
zone->sectors = smallest->size * cnt * 2;
zone->sectors = smallest->sectors * cnt;
zone->zone_start = 0;

current_start = smallest->size * 2;
current_start = smallest->sectors;
curr_zone_start = zone->sectors;

/* now do the other zones */
Expand All @@ -180,29 +179,29 @@ static int create_strip_zones (mddev_t *mddev)
rdev = conf->strip_zone[0].dev[j];
printk(KERN_INFO "raid0: checking %s ...",
bdevname(rdev->bdev, b));
if (rdev->size > current_start / 2) {
printk(KERN_INFO " contained as device %d\n",
c);
zone->dev[c] = rdev;
c++;
if (!smallest || (rdev->size <smallest->size)) {
smallest = rdev;
printk(KERN_INFO " (%llu) is smallest!.\n",
(unsigned long long)rdev->size);
}
} else
if (rdev->sectors <= current_start) {
printk(KERN_INFO " nope.\n");
continue;
}
printk(KERN_INFO " contained as device %d\n", c);
zone->dev[c] = rdev;
c++;
if (!smallest || rdev->sectors < smallest->sectors) {
smallest = rdev;
printk(KERN_INFO " (%llu) is smallest!.\n",
(unsigned long long)rdev->sectors);
}
}

zone->nb_dev = c;
zone->sectors = (smallest->size * 2 - current_start) * c;
zone->sectors = (smallest->sectors - current_start) * c;
printk(KERN_INFO "raid0: zone->nb_dev: %d, sectors: %llu\n",
zone->nb_dev, (unsigned long long)zone->sectors);

zone->zone_start = curr_zone_start;
curr_zone_start += zone->sectors;

current_start = smallest->size * 2;
current_start = smallest->sectors;
printk(KERN_INFO "raid0: current zone start: %llu\n",
(unsigned long long)current_start);
}
Expand Down Expand Up @@ -296,7 +295,7 @@ static int raid0_run (mddev_t *mddev)
/* calculate array device size */
mddev->array_sectors = 0;
list_for_each_entry(rdev, &mddev->disks, same_set)
mddev->array_sectors += rdev->size * 2;
mddev->array_sectors += rdev->sectors;

printk(KERN_INFO "raid0 : md_size is %llu sectors.\n",
(unsigned long long)mddev->array_sectors);
Expand Down

0 comments on commit dd8ac33

Please sign in to comment.