projects
/
platform
/
adaptation
/
renesas_rcar
/
renesas_kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
dm: wait until embedded kobject is released before destroying a device
[platform/adaptation/renesas_rcar/renesas_kernel.git]
/
drivers
/
md
/
dm.c
diff --git
a/drivers/md/dm.c
b/drivers/md/dm.c
index
0704c52
..
e290e72
100644
(file)
--- a/
drivers/md/dm.c
+++ b/
drivers/md/dm.c
@@
-203,6
+203,9
@@
struct mapped_device {
/* sysfs handle */
struct kobject kobj;
/* 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;
/* 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_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;
md->disk->major = _major;
md->disk->first_minor = minor;
@@
-2905,17
+2909,11
@@
struct kobject *dm_kobject(struct mapped_device *md)
return &md->kobj;
}
return &md->kobj;
}
-/*
- * struct mapped_device should not be exported outside of dm.c
- * so use this check to verify that kobj is part of md structure
- */
struct mapped_device *dm_get_from_kobject(struct kobject *kobj)
{
struct mapped_device *md;
md = container_of(kobj, struct mapped_device, kobj);
struct mapped_device *dm_get_from_kobject(struct kobject *kobj)
{
struct mapped_device *md;
md = container_of(kobj, struct mapped_device, kobj);
- if (&md->kobj != kobj)
- return NULL;
if (test_bit(DMF_FREEING, &md->flags) ||
dm_deleting_md(md))
if (test_bit(DMF_FREEING, &md->flags) ||
dm_deleting_md(md))
@@
-2925,6
+2923,13
@@
struct mapped_device *dm_get_from_kobject(struct kobject *kobj)
return md;
}
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);
int dm_suspended_md(struct mapped_device *md)
{
return test_bit(DMF_SUSPENDED, &md->flags);