diff options
-rw-r--r-- | drivers/md/md.c | 40 |
1 files changed, 19 insertions, 21 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index a2813fa06b7c..df13a17a9627 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -655,7 +655,7 @@ struct super_type { | |||
655 | int (*validate_super)(mddev_t *mddev, mdk_rdev_t *rdev); | 655 | int (*validate_super)(mddev_t *mddev, mdk_rdev_t *rdev); |
656 | void (*sync_super)(mddev_t *mddev, mdk_rdev_t *rdev); | 656 | void (*sync_super)(mddev_t *mddev, mdk_rdev_t *rdev); |
657 | unsigned long long (*rdev_size_change)(mdk_rdev_t *rdev, | 657 | unsigned long long (*rdev_size_change)(mdk_rdev_t *rdev, |
658 | unsigned long long size); | 658 | sector_t num_sectors); |
659 | }; | 659 | }; |
660 | 660 | ||
661 | /* | 661 | /* |
@@ -998,20 +998,19 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev) | |||
998 | * rdev_size_change for 0.90.0 | 998 | * rdev_size_change for 0.90.0 |
999 | */ | 999 | */ |
1000 | static unsigned long long | 1000 | static unsigned long long |
1001 | super_90_rdev_size_change(mdk_rdev_t *rdev, unsigned long long size) | 1001 | super_90_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors) |
1002 | { | 1002 | { |
1003 | if (size && size < rdev->mddev->size) | 1003 | if (num_sectors && num_sectors < rdev->mddev->size * 2) |
1004 | return 0; /* component must fit device */ | 1004 | return 0; /* component must fit device */ |
1005 | size *= 2; /* convert to sectors */ | ||
1006 | if (rdev->mddev->bitmap_offset) | 1005 | if (rdev->mddev->bitmap_offset) |
1007 | return 0; /* can't move bitmap */ | 1006 | return 0; /* can't move bitmap */ |
1008 | rdev->sb_start = calc_dev_sboffset(rdev->bdev); | 1007 | rdev->sb_start = calc_dev_sboffset(rdev->bdev); |
1009 | if (!size || size > rdev->sb_start) | 1008 | if (!num_sectors || num_sectors > rdev->sb_start) |
1010 | size = rdev->sb_start; | 1009 | num_sectors = rdev->sb_start; |
1011 | md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, | 1010 | md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, |
1012 | rdev->sb_page); | 1011 | rdev->sb_page); |
1013 | md_super_wait(rdev->mddev); | 1012 | md_super_wait(rdev->mddev); |
1014 | return size/2; /* kB for sysfs */ | 1013 | return num_sectors / 2; /* kB for sysfs */ |
1015 | } | 1014 | } |
1016 | 1015 | ||
1017 | 1016 | ||
@@ -1339,19 +1338,18 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1339 | } | 1338 | } |
1340 | 1339 | ||
1341 | static unsigned long long | 1340 | static unsigned long long |
1342 | super_1_rdev_size_change(mdk_rdev_t *rdev, unsigned long long size) | 1341 | super_1_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors) |
1343 | { | 1342 | { |
1344 | struct mdp_superblock_1 *sb; | 1343 | struct mdp_superblock_1 *sb; |
1345 | unsigned long long max_size; | 1344 | sector_t max_sectors; |
1346 | if (size && size < rdev->mddev->size) | 1345 | if (num_sectors && num_sectors < rdev->mddev->size * 2) |
1347 | return 0; /* component must fit device */ | 1346 | return 0; /* component must fit device */ |
1348 | size *= 2; /* convert to sectors */ | ||
1349 | if (rdev->sb_start < rdev->data_offset) { | 1347 | if (rdev->sb_start < rdev->data_offset) { |
1350 | /* minor versions 1 and 2; superblock before data */ | 1348 | /* minor versions 1 and 2; superblock before data */ |
1351 | max_size = (rdev->bdev->bd_inode->i_size >> 9); | 1349 | max_sectors = rdev->bdev->bd_inode->i_size >> 9; |
1352 | max_size -= rdev->data_offset; | 1350 | max_sectors -= rdev->data_offset; |
1353 | if (!size || size > max_size) | 1351 | if (!num_sectors || num_sectors > max_sectors) |
1354 | size = max_size; | 1352 | num_sectors = max_sectors; |
1355 | } else if (rdev->mddev->bitmap_offset) { | 1353 | } else if (rdev->mddev->bitmap_offset) { |
1356 | /* minor version 0 with bitmap we can't move */ | 1354 | /* minor version 0 with bitmap we can't move */ |
1357 | return 0; | 1355 | return 0; |
@@ -1360,19 +1358,19 @@ super_1_rdev_size_change(mdk_rdev_t *rdev, unsigned long long size) | |||
1360 | sector_t sb_start; | 1358 | sector_t sb_start; |
1361 | sb_start = (rdev->bdev->bd_inode->i_size >> 9) - 8*2; | 1359 | sb_start = (rdev->bdev->bd_inode->i_size >> 9) - 8*2; |
1362 | sb_start &= ~(sector_t)(4*2 - 1); | 1360 | sb_start &= ~(sector_t)(4*2 - 1); |
1363 | max_size = rdev->size*2 + sb_start - rdev->sb_start; | 1361 | max_sectors = rdev->size * 2 + sb_start - rdev->sb_start; |
1364 | if (!size || size > max_size) | 1362 | if (!num_sectors || num_sectors > max_sectors) |
1365 | size = max_size; | 1363 | num_sectors = max_sectors; |
1366 | rdev->sb_start = sb_start; | 1364 | rdev->sb_start = sb_start; |
1367 | } | 1365 | } |
1368 | sb = (struct mdp_superblock_1 *) page_address(rdev->sb_page); | 1366 | sb = (struct mdp_superblock_1 *) page_address(rdev->sb_page); |
1369 | sb->data_size = cpu_to_le64(size); | 1367 | sb->data_size = cpu_to_le64(num_sectors); |
1370 | sb->super_offset = rdev->sb_start; | 1368 | sb->super_offset = rdev->sb_start; |
1371 | sb->sb_csum = calc_sb_1_csum(sb); | 1369 | sb->sb_csum = calc_sb_1_csum(sb); |
1372 | md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, | 1370 | md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, |
1373 | rdev->sb_page); | 1371 | rdev->sb_page); |
1374 | md_super_wait(rdev->mddev); | 1372 | md_super_wait(rdev->mddev); |
1375 | return size/2; /* kB for sysfs */ | 1373 | return num_sectors / 2; /* kB for sysfs */ |
1376 | } | 1374 | } |
1377 | 1375 | ||
1378 | static struct super_type super_types[] = { | 1376 | static struct super_type super_types[] = { |
@@ -2112,7 +2110,7 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
2112 | if (my_mddev->pers && rdev->raid_disk >= 0) { | 2110 | if (my_mddev->pers && rdev->raid_disk >= 0) { |
2113 | if (my_mddev->persistent) { | 2111 | if (my_mddev->persistent) { |
2114 | size = super_types[my_mddev->major_version]. | 2112 | size = super_types[my_mddev->major_version]. |
2115 | rdev_size_change(rdev, size); | 2113 | rdev_size_change(rdev, size * 2); |
2116 | if (!size) | 2114 | if (!size) |
2117 | return -EBUSY; | 2115 | return -EBUSY; |
2118 | } else if (!size) { | 2116 | } else if (!size) { |