diff options
Diffstat (limited to 'drivers/md/md.c')
| -rw-r--r-- | drivers/md/md.c | 16 | 
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 4d58e3496d16..3b653e68db0c 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -4500,6 +4500,17 @@ array_state_store(struct mddev *mddev, const char *buf, size_t len)  	case broken:		/* cannot be set */  	case bad_word:  		return -EINVAL; +	case clear: +	case readonly: +	case inactive: +	case read_auto: +		if (!mddev->pers || !md_is_rdwr(mddev)) +			break; +		/* write sysfs will not open mddev and opener should be 0 */ +		err = mddev_set_closing_and_sync_blockdev(mddev, 0); +		if (err) +			return err; +		break;  	default:  		break;  	} @@ -4599,6 +4610,11 @@ array_state_store(struct mddev *mddev, const char *buf, size_t len)  		sysfs_notify_dirent_safe(mddev->sysfs_state);  	}  	mddev_unlock(mddev); + +	if (st == readonly || st == read_auto || st == inactive || +	    (err && st == clear)) +		clear_bit(MD_CLOSING, &mddev->flags); +  	return err ?: len;  }  static struct md_sysfs_entry md_array_state =  | 
