diff options
author | NeilBrown <neilb@suse.de> | 2006-02-02 17:28:03 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-02-02 18:07:10 -0500 |
commit | 6d89332b776fc11bac0073209e44ec8f39831e4e (patch) | |
tree | e3e3b1917a08f2cdfa8ff9acc804a7b7ef1a6e3d | |
parent | cf41f8ac386e8d62122e7e394b4c6b3e3ab30ede (diff) |
[PATCH] md: Fix device-size updates in md
As 'array_size' is a 'sector_t', it may overflow inappropriately when shifted
10 bits. So We should cast it to a loff_t first.
There are two places with this problem, but the second (in update_raid_disks)
isn't needed so just remove it:
The only personality that handles ->reshape currently is raid1,
and it doesn't change the size of the array.
When added for raid5/6, reshape again won't change the size of the array,
at least not straight away.
This code might be need for reshaping 'linear' but linear->shape,
if implemented, should probably do the i_size_write itself.
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | drivers/md/md.c | 13 |
1 files changed, 1 insertions, 12 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 7145cd150f7b..9fac8ac496c5 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -3465,7 +3465,7 @@ static int update_size(mddev_t *mddev, unsigned long size) | |||
3465 | bdev = bdget_disk(mddev->gendisk, 0); | 3465 | bdev = bdget_disk(mddev->gendisk, 0); |
3466 | if (bdev) { | 3466 | if (bdev) { |
3467 | mutex_lock(&bdev->bd_inode->i_mutex); | 3467 | mutex_lock(&bdev->bd_inode->i_mutex); |
3468 | i_size_write(bdev->bd_inode, mddev->array_size << 10); | 3468 | i_size_write(bdev->bd_inode, (loff_t)mddev->array_size << 10); |
3469 | mutex_unlock(&bdev->bd_inode->i_mutex); | 3469 | mutex_unlock(&bdev->bd_inode->i_mutex); |
3470 | bdput(bdev); | 3470 | bdput(bdev); |
3471 | } | 3471 | } |
@@ -3485,17 +3485,6 @@ static int update_raid_disks(mddev_t *mddev, int raid_disks) | |||
3485 | if (mddev->sync_thread) | 3485 | if (mddev->sync_thread) |
3486 | return -EBUSY; | 3486 | return -EBUSY; |
3487 | rv = mddev->pers->reshape(mddev, raid_disks); | 3487 | rv = mddev->pers->reshape(mddev, raid_disks); |
3488 | if (!rv) { | ||
3489 | struct block_device *bdev; | ||
3490 | |||
3491 | bdev = bdget_disk(mddev->gendisk, 0); | ||
3492 | if (bdev) { | ||
3493 | mutex_lock(&bdev->bd_inode->i_mutex); | ||
3494 | i_size_write(bdev->bd_inode, mddev->array_size << 10); | ||
3495 | mutex_unlock(&bdev->bd_inode->i_mutex); | ||
3496 | bdput(bdev); | ||
3497 | } | ||
3498 | } | ||
3499 | return rv; | 3488 | return rv; |
3500 | } | 3489 | } |
3501 | 3490 | ||