Merge branch 'for-linus' of git://neil.brown.name/md
* 'for-linus' of git://neil.brown.name/md: (52 commits) md: Protect access to mddev->disks list using RCU md: only count actual openers as access which prevent a 'stop' md: linear: Make array_size sector-based and rename it to array_sectors. md: Make mddev->array_size sector-based. md: Make super_type->rdev_size_change() take sector-based sizes. md: Fix check for overlapping devices. md: Tidy up rdev_size_store a bit: md: Remove some unused macros. md: Turn rdev->sb_offset into a sector-based quantity. md: Make calc_dev_sboffset() return a sector count. md: Replace calc_dev_size() by calc_num_sectors(). md: Make update_size() take the number of sectors. md: Better control of when do_md_stop is allowed to stop the array. md: get_disk_info(): Don't convert between signed and unsigned and back. md: Simplify restart_array(). md: alloc_disk_sb(): Return proper error value. md: Simplify sb_equal(). md: Simplify uuid_equal(). md: sb_equal(): Fix misleading printk. md: Fix a typo in the comment to cmd_match(). ...
此提交包含在:
@@ -1114,24 +1114,30 @@ static int raid10_spare_active(mddev_t *mddev)
|
||||
static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
|
||||
{
|
||||
conf_t *conf = mddev->private;
|
||||
int found = 0;
|
||||
int err = -EEXIST;
|
||||
int mirror;
|
||||
mirror_info_t *p;
|
||||
int first = 0;
|
||||
int last = mddev->raid_disks - 1;
|
||||
|
||||
if (mddev->recovery_cp < MaxSector)
|
||||
/* only hot-add to in-sync arrays, as recovery is
|
||||
* very different from resync
|
||||
*/
|
||||
return 0;
|
||||
return -EBUSY;
|
||||
if (!enough(conf))
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
|
||||
if (rdev->raid_disk)
|
||||
first = last = rdev->raid_disk;
|
||||
|
||||
if (rdev->saved_raid_disk >= 0 &&
|
||||
rdev->saved_raid_disk >= first &&
|
||||
conf->mirrors[rdev->saved_raid_disk].rdev == NULL)
|
||||
mirror = rdev->saved_raid_disk;
|
||||
else
|
||||
mirror = 0;
|
||||
for ( ; mirror < mddev->raid_disks; mirror++)
|
||||
mirror = first;
|
||||
for ( ; mirror <= last ; mirror++)
|
||||
if ( !(p=conf->mirrors+mirror)->rdev) {
|
||||
|
||||
blk_queue_stack_limits(mddev->queue,
|
||||
@@ -1146,7 +1152,7 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
|
||||
|
||||
p->head_position = 0;
|
||||
rdev->raid_disk = mirror;
|
||||
found = 1;
|
||||
err = 0;
|
||||
if (rdev->saved_raid_disk != mirror)
|
||||
conf->fullsync = 1;
|
||||
rcu_assign_pointer(p->rdev, rdev);
|
||||
@@ -1154,7 +1160,7 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
|
||||
}
|
||||
|
||||
print_conf(conf);
|
||||
return found;
|
||||
return err;
|
||||
}
|
||||
|
||||
static int raid10_remove_disk(mddev_t *mddev, int number)
|
||||
@@ -2159,7 +2165,7 @@ static int run(mddev_t *mddev)
|
||||
/*
|
||||
* Ok, everything is just fine now
|
||||
*/
|
||||
mddev->array_size = size << (conf->chunk_shift-1);
|
||||
mddev->array_sectors = size << conf->chunk_shift;
|
||||
mddev->resync_max_sectors = size << conf->chunk_shift;
|
||||
|
||||
mddev->queue->unplug_fn = raid10_unplug;
|
||||
|
新增問題並參考
封鎖使用者