--- 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. @@ -5983,6 +5986,7 @@ struct mddev *md_alloc(dev_t dev, char * goto out_put_disk; kobject_init(&mddev->kobj, &md_ktype); + kobject_get(&mddev->kobj); error = kobject_add(&mddev->kobj, &disk_to_dev(disk)->kobj, "%s", "md"); if (error) { /*