diff options
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r-- | drivers/md/md.c | 19 |
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 | ||