Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3f9d7b0d authored by NeilBrown's avatar NeilBrown Committed by Linus Torvalds
Browse files

[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: default avatarNeil Brown <neilb@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent fe0e5c4d
Loading
Loading
Loading
Loading
+8 −5
Original line number Original line Diff line number Diff line
@@ -1792,6 +1792,7 @@ 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);
			if (mddev->pers)
				md_update_sb(mddev, 1);
				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;
	}
	}