aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r--drivers/md/md.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 93b0da13350..f97c3b2f2f8 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -570,7 +570,7 @@ static void mddev_put(struct mddev *mddev)
570 mddev->ctime == 0 && !mddev->hold_active) { 570 mddev->ctime == 0 && !mddev->hold_active) {
571 /* Array is not configured at all, and not held active, 571 /* Array is not configured at all, and not held active,
572 * so destroy it */ 572 * so destroy it */
573 list_del(&mddev->all_mddevs); 573 list_del_init(&mddev->all_mddevs);
574 bs = mddev->bio_set; 574 bs = mddev->bio_set;
575 mddev->bio_set = NULL; 575 mddev->bio_set = NULL;
576 if (mddev->gendisk) { 576 if (mddev->gendisk) {
@@ -4489,11 +4489,20 @@ md_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
4489 4489
4490 if (!entry->show) 4490 if (!entry->show)
4491 return -EIO; 4491 return -EIO;
4492 spin_lock(&all_mddevs_lock);
4493 if (list_empty(&mddev->all_mddevs)) {
4494 spin_unlock(&all_mddevs_lock);
4495 return -EBUSY;
4496 }
4497 mddev_get(mddev);
4498 spin_unlock(&all_mddevs_lock);
4499
4492 rv = mddev_lock(mddev); 4500 rv = mddev_lock(mddev);
4493 if (!rv) { 4501 if (!rv) {
4494 rv = entry->show(mddev, page); 4502 rv = entry->show(mddev, page);
4495 mddev_unlock(mddev); 4503 mddev_unlock(mddev);
4496 } 4504 }
4505 mddev_put(mddev);
4497 return rv; 4506 return rv;
4498} 4507}
4499 4508
@@ -4509,11 +4518,19 @@ md_attr_store(struct kobject *kobj, struct attribute *attr,
4509 return -EIO; 4518 return -EIO;
4510 if (!capable(CAP_SYS_ADMIN)) 4519 if (!capable(CAP_SYS_ADMIN))
4511 return -EACCES; 4520 return -EACCES;
4521 spin_lock(&all_mddevs_lock);
4522 if (list_empty(&mddev->all_mddevs)) {
4523 spin_unlock(&all_mddevs_lock);
4524 return -EBUSY;
4525 }
4526 mddev_get(mddev);
4527 spin_unlock(&all_mddevs_lock);
4512 rv = mddev_lock(mddev); 4528 rv = mddev_lock(mddev);
4513 if (!rv) { 4529 if (!rv) {
4514 rv = entry->store(mddev, page, length); 4530 rv = entry->store(mddev, page, length);
4515 mddev_unlock(mddev); 4531 mddev_unlock(mddev);
4516 } 4532 }
4533 mddev_put(mddev);
4517 return rv; 4534 return rv;
4518} 4535}
4519 4536