dm: wait until embedded kobject is released before destroying a device
authorMikulas Patocka <mpatocka@redhat.com>
Tue, 7 Jan 2014 04:01:22 +0000 (23:01 -0500)
committerMike Snitzer <snitzer@redhat.com>
Wed, 8 Jan 2014 02:01:43 +0000 (21:01 -0500)
commitbe35f486108227e10fe5d96fd42fb2b344c59983
tree9cfaef139722da4118b4fcd906eb1196d9577b23
parent1ddd641ddcfa46d719189468b6856e9b17381a61
dm: wait until embedded kobject is released before destroying a device

There may be other parts of the kernel holding a reference on the dm
kobject.  We must wait until all references are dropped before
deallocating the mapped_device structure.

The dm_kobject_release method signals that all references are dropped
via completion.  But dm_kobject_release doesn't free the kobject (which
is embedded in the mapped_device structure).

This is the sequence of operations:
* when destroying a DM device, call kobject_put from dm_sysfs_exit
* wait until all users stop using the kobject, when it happens the
  release method is called
* the release method signals the completion and should return without
  delay
* the dm device removal code that waits on the completion continues
* the dm device removal code drops the dm_mod reference the device had
* the dm device removal code frees the mapped_device structure that
  contains the kobject

Using kobject this way should avoid the module unload race that was
mentioned at the beginning of this thread:
https://lkml.org/lkml/2014/1/4/83

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Cc: stable@vger.kernel.org
drivers/md/dm-sysfs.c
drivers/md/dm.c
drivers/md/dm.h