dm: wait until embedded kobject is released before destroying a device
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / md / dm.c
index b3d9372..e290e72 100644 (file)
@@ -203,6 +203,9 @@ struct mapped_device {
        /* sysfs handle */
        struct kobject kobj;
 
+       /* wait until the kobject is released */
+       struct completion kobj_completion;
+
        /* zero-length flush that will be cloned and submitted to targets */
        struct bio flush_bio;
 
@@ -2041,6 +2044,7 @@ static struct mapped_device *alloc_dev(int minor)
        init_waitqueue_head(&md->wait);
        INIT_WORK(&md->work, dm_wq_work);
        init_waitqueue_head(&md->eventq);
+       init_completion(&md->kobj_completion);
 
        md->disk->major = _major;
        md->disk->first_minor = minor;
@@ -2919,6 +2923,13 @@ struct mapped_device *dm_get_from_kobject(struct kobject *kobj)
        return md;
 }
 
+struct completion *dm_get_completion_from_kobject(struct kobject *kobj)
+{
+       struct mapped_device *md = container_of(kobj, struct mapped_device, kobj);
+
+       return &md->kobj_completion;
+}
+
 int dm_suspended_md(struct mapped_device *md)
 {
        return test_bit(DMF_SUSPENDED, &md->flags);