mirror of https://gitee.com/openkylin/linux.git
[PATCH] md: fix a few problems with the interface (sysfs and ioctl) to md
While developing more functionality in mdadm I found some bugs in md... - When we remove a device from an inactive array (write 'remove' to the 'state' sysfs file - see 'state_store') would should not update the superblock information - as we may not have read and processed it all properly yet. - initialise all raid_disk entries to '-1' else the 'slot sysfs file will claim '0' for all devices in an array before the array is started. - all '\n' not to be present at the end of words written to sysfs files - when we use SET_ARRAY_INFO to set the md metadata version, set the flag to say that there is persistant metadata. - allow GET_BITMAP_FILE to be called on an array that hasn't been started yet. Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
fe0e5c4d94
commit
3f9d7b0d81
|
@ -1792,7 +1792,8 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
|
||||||
else {
|
else {
|
||||||
mddev_t *mddev = rdev->mddev;
|
mddev_t *mddev = rdev->mddev;
|
||||||
kick_rdev_from_array(rdev);
|
kick_rdev_from_array(rdev);
|
||||||
md_update_sb(mddev, 1);
|
if (mddev->pers)
|
||||||
|
md_update_sb(mddev, 1);
|
||||||
md_new_event(mddev);
|
md_new_event(mddev);
|
||||||
err = 0;
|
err = 0;
|
||||||
}
|
}
|
||||||
|
@ -2004,6 +2005,7 @@ static mdk_rdev_t *md_import_device(dev_t newdev, int super_format, int super_mi
|
||||||
|
|
||||||
rdev->desc_nr = -1;
|
rdev->desc_nr = -1;
|
||||||
rdev->saved_raid_disk = -1;
|
rdev->saved_raid_disk = -1;
|
||||||
|
rdev->raid_disk = -1;
|
||||||
rdev->flags = 0;
|
rdev->flags = 0;
|
||||||
rdev->data_offset = 0;
|
rdev->data_offset = 0;
|
||||||
rdev->sb_events = 0;
|
rdev->sb_events = 0;
|
||||||
|
@ -2233,7 +2235,6 @@ static int update_raid_disks(mddev_t *mddev, int raid_disks);
|
||||||
static ssize_t
|
static ssize_t
|
||||||
raid_disks_store(mddev_t *mddev, const char *buf, size_t len)
|
raid_disks_store(mddev_t *mddev, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
/* can only set raid_disks if array is not yet active */
|
|
||||||
char *e;
|
char *e;
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
unsigned long n = simple_strtoul(buf, &e, 10);
|
unsigned long n = simple_strtoul(buf, &e, 10);
|
||||||
|
@ -2631,7 +2632,7 @@ metadata_store(mddev_t *mddev, const char *buf, size_t len)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
buf = e+1;
|
buf = e+1;
|
||||||
minor = simple_strtoul(buf, &e, 10);
|
minor = simple_strtoul(buf, &e, 10);
|
||||||
if (e==buf || *e != '\n')
|
if (e==buf || (*e && *e != '\n') )
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (major >= sizeof(super_types)/sizeof(super_types[0]) ||
|
if (major >= sizeof(super_types)/sizeof(super_types[0]) ||
|
||||||
super_types[major].name == NULL)
|
super_types[major].name == NULL)
|
||||||
|
@ -3980,6 +3981,7 @@ static int set_array_info(mddev_t * mddev, mdu_array_info_t *info)
|
||||||
mddev->major_version = info->major_version;
|
mddev->major_version = info->major_version;
|
||||||
mddev->minor_version = info->minor_version;
|
mddev->minor_version = info->minor_version;
|
||||||
mddev->patch_version = info->patch_version;
|
mddev->patch_version = info->patch_version;
|
||||||
|
mddev->persistent = !info->not_persistent;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
mddev->major_version = MD_MAJOR_VERSION;
|
mddev->major_version = MD_MAJOR_VERSION;
|
||||||
|
@ -4304,9 +4306,10 @@ static int md_ioctl(struct inode *inode, struct file *file,
|
||||||
* Commands querying/configuring an existing array:
|
* Commands querying/configuring an existing array:
|
||||||
*/
|
*/
|
||||||
/* if we are not initialised yet, only ADD_NEW_DISK, STOP_ARRAY,
|
/* if we are not initialised yet, only ADD_NEW_DISK, STOP_ARRAY,
|
||||||
* RUN_ARRAY, and SET_BITMAP_FILE are allowed */
|
* RUN_ARRAY, and GET_ and SET_BITMAP_FILE are allowed */
|
||||||
if (!mddev->raid_disks && cmd != ADD_NEW_DISK && cmd != STOP_ARRAY
|
if (!mddev->raid_disks && cmd != ADD_NEW_DISK && cmd != STOP_ARRAY
|
||||||
&& cmd != RUN_ARRAY && cmd != SET_BITMAP_FILE) {
|
&& cmd != RUN_ARRAY && cmd != SET_BITMAP_FILE
|
||||||
|
&& cmd != GET_BITMAP_FILE) {
|
||||||
err = -ENODEV;
|
err = -ENODEV;
|
||||||
goto abort_unlock;
|
goto abort_unlock;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue