--- x/drivers/md/md.c +++ y/drivers/md/md.c @@ -632,10 +632,13 @@ static void mddev_delayed_delete(struct static void __mddev_put(struct mddev *mddev) { + struct kobject *kobj = &mddev->kobj; + if (mddev->raid_disks || !list_empty(&mddev->disks) || mddev->ctime || mddev->hold_active) return; + BUG_ON(kref_read(&kobj->kref) < 1); /* * Call queue_work inside the spinlock so that flush_workqueue() after * mddev_find will succeed in waiting for the work to be done. @@ -710,6 +713,7 @@ int mddev_init(struct mddev *mddev) INIT_WORK(&mddev->sync_work, md_start_sync); INIT_WORK(&mddev->del_work, mddev_delayed_delete); + kobject_init(&mddev->kobj, &md_ktype); return 0; } @@ -5982,7 +5986,6 @@ struct mddev *md_alloc(dev_t dev, char * if (error) goto out_put_disk; - kobject_init(&mddev->kobj, &md_ktype); error = kobject_add(&mddev->kobj, &disk_to_dev(disk)->kobj, "%s", "md"); if (error) { /*