aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2006-12-22 04:11:41 -0500
committerLinus Torvalds <torvalds@woody.osdl.org>2006-12-22 11:55:51 -0500
commit3f9d7b0d810f9fe3dc670901b694a9632b8d62b3 (patch)
treefd130bc302aa1f982deecaa3e602872c44a4d2e7 /drivers/md/md.c
parentfe0e5c4d947d34f10002b4cf272f0ebf110305b7 (diff)
[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>
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r--drivers/md/md.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 21e2a7b0884..d1cb45f6d6a 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -1792,7 +1792,8 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
1792 else { 1792 else {
1793 mddev_t *mddev = rdev->mddev; 1793 mddev_t *mddev = rdev->mddev;
1794 kick_rdev_from_array(rdev); 1794 kick_rdev_from_array(rdev);
1795 md_update_sb(mddev, 1); 1795 if (mddev->pers)
1796 md_update_sb(mddev, 1);
1796 md_new_event(mddev); 1797 md_new_event(mddev);
1797 err = 0; 1798 err = 0;
1798 } 1799 }
@@ -2004,6 +2005,7 @@ static mdk_rdev_t *md_import_device(dev_t newdev, int super_format, int super_mi
2004 2005
2005 rdev->desc_nr = -1; 2006 rdev->desc_nr = -1;
2006 rdev->saved_raid_disk = -1; 2007 rdev->saved_raid_disk = -1;
2008 rdev->raid_disk = -1;
2007 rdev->flags = 0; 2009 rdev->flags = 0;
2008 rdev->data_offset = 0; 2010 rdev->data_offset = 0;
2009 rdev->sb_events = 0; 2011 rdev->sb_events = 0;
@@ -2233,7 +2235,6 @@ static int update_raid_disks(mddev_t *mddev, int raid_disks);
2233static ssize_t 2235static ssize_t
2234raid_disks_store(mddev_t *mddev, const char *buf, size_t len) 2236raid_disks_store(mddev_t *mddev, const char *buf, size_t len)
2235{ 2237{
2236 /* can only set raid_disks if array is not yet active */
2237 char *e; 2238 char *e;
2238 int rv = 0; 2239 int rv = 0;
2239 unsigned long n = simple_strtoul(buf, &e, 10); 2240 unsigned long n = simple_strtoul(buf, &e, 10);
@@ -2631,7 +2632,7 @@ metadata_store(mddev_t *mddev, const char *buf, size_t len)
2631 return -EINVAL; 2632 return -EINVAL;
2632 buf = e+1; 2633 buf = e+1;
2633 minor = simple_strtoul(buf, &e, 10); 2634 minor = simple_strtoul(buf, &e, 10);
2634 if (e==buf || *e != '\n') 2635 if (e==buf || (*e && *e != '\n') )
2635 return -EINVAL; 2636 return -EINVAL;
2636 if (major >= sizeof(super_types)/sizeof(super_types[0]) || 2637 if (major >= sizeof(super_types)/sizeof(super_types[0]) ||
2637 super_types[major].name == NULL) 2638 super_types[major].name == NULL)
@@ -3980,6 +3981,7 @@ static int set_array_info(mddev_t * mddev, mdu_array_info_t *info)
3980 mddev->major_version = info->major_version; 3981 mddev->major_version = info->major_version;
3981 mddev->minor_version = info->minor_version; 3982 mddev->minor_version = info->minor_version;
3982 mddev->patch_version = info->patch_version; 3983 mddev->patch_version = info->patch_version;
3984 mddev->persistent = !info->not_persistent;
3983 return 0; 3985 return 0;
3984 } 3986 }
3985 mddev->major_version = MD_MAJOR_VERSION; 3987 mddev->major_version = MD_MAJOR_VERSION;
@@ -4304,9 +4306,10 @@ static int md_ioctl(struct inode *inode, struct file *file,
4304 * Commands querying/configuring an existing array: 4306 * Commands querying/configuring an existing array:
4305 */ 4307 */
4306 /* if we are not initialised yet, only ADD_NEW_DISK, STOP_ARRAY, 4308 /* if we are not initialised yet, only ADD_NEW_DISK, STOP_ARRAY,
4307 * RUN_ARRAY, and SET_BITMAP_FILE are allowed */ 4309 * RUN_ARRAY, and GET_ and SET_BITMAP_FILE are allowed */
4308 if (!mddev->raid_disks && cmd != ADD_NEW_DISK && cmd != STOP_ARRAY 4310 if (!mddev->raid_disks && cmd != ADD_NEW_DISK && cmd != STOP_ARRAY
4309 && cmd != RUN_ARRAY && cmd != SET_BITMAP_FILE) { 4311 && cmd != RUN_ARRAY && cmd != SET_BITMAP_FILE
4312 && cmd != GET_BITMAP_FILE) {
4310 err = -ENODEV; 4313 err = -ENODEV;
4311 goto abort_unlock; 4314 goto abort_unlock;
4312 } 4315 }