aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2006-02-02 17:28:03 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-02-02 18:07:10 -0500
commit6d89332b776fc11bac0073209e44ec8f39831e4e (patch)
treee3e3b1917a08f2cdfa8ff9acc804a7b7ef1a6e3d
parentcf41f8ac386e8d62122e7e394b4c6b3e3ab30ede (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.c13
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