linux/drivers
Mikulas Patocka d58168763f dm table: rework reference counting
Rework table reference counting.

The existing code uses a reference counter. When the last reference is
dropped and the counter reaches zero, the table destructor is called.
Table reference counters are acquired/released from upcalls from other
kernel code (dm_any_congested, dm_merge_bvec, dm_unplug_all).
If the reference counter reaches zero in one of the upcalls, the table
destructor is called from almost random kernel code.

This leads to various problems:
* dm_any_congested being called under a spinlock, which calls the
  destructor, which calls some sleeping function.
* the destructor attempting to take a lock that is already taken by the
  same process.
* stale reference from some other kernel code keeps the table
  constructed, which keeps some devices open, even after successful
  return from "dmsetup remove". This can confuse lvm and prevent closing
  of underlying devices or reusing device minor numbers.

The patch changes reference counting so that the table destructor can be
called only at predetermined places.

The table has always exactly one reference from either mapped_device->map
or hash_cell->new_map. After this patch, this reference is not counted
in table->holders.  A pair of dm_create_table/dm_destroy_table functions
is used for table creation/destruction.

Temporary references from the other code increase table->holders. A pair
of dm_table_get/dm_table_put functions is used to manipulate it.

When the table is about to be destroyed, we wait for table->holders to
reach 0. Then, we call the table destructor.  We use active waiting with
msleep(1), because the situation happens rarely (to one user in 5 years)
and removing the device isn't performance-critical task: the user doesn't
care if it takes one tick more or not.

This way, the destructor is called only at specific points
(dm_table_destroy function) and the above problems associated with lazy
destruction can't happen.

Finally remove the temporary protection added to dm_any_congested().

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
History 2009-01-06 03:05:10 +00:00
..
accessibility braille_console: only register notifiers when the braille console is used 2008-10-02 15:53:13 -07:00
acpi cpumask: convert shared_cpu_map in acpi_processor* structs to cpumask_var_t 2009-01-03 19:15:40 +01:00
amba Driver core: change add_uevent_var to use a struct 2007-10-12 14:51:01 -07:00
ata Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6 2008-12-30 17:43:10 -08:00
atm atm: Driver for Solos PCI ADSL2+ card. 2008-12-26 01:26:11 -08:00
auxdisplay auxdisplay: small cleanups 2008-07-24 10:47:41 -07:00
base Merge branch 'cpus4096-for-linus-3' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-01-03 12:04:39 -08:00
block Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus 2008-12-30 17:37:25 -08:00
bluetooth Bluetooth: Enable per-module dynamic debug messages 2008-11-30 12:17:28 +01:00
cdrom cdrom: reduce stack usage of mmc_ioctl_dvd_read_struct 2008-12-29 08:28:43 +01:00
char sparseirq: move set/get_timer_rand_state back to .c 2009-01-03 12:01:23 -08:00
clocksource Merge branch 'cpus4096-for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-01-02 11:44:09 -08:00
connector CRED: Use RCU to access another task's creds and to release a task's own creds 2008-11-14 10:39:19 +11:00
cpufreq [CPUFREQ] Fix BUG: using smp_processor_id() in preemptible code 2008-10-09 13:52:44 -04:00
cpuidle regression: disable timer peek-ahead for 2.6.28 2008-11-09 16:28:42 -08:00
crypto crypto: talitos - Ack done interrupt in isr instead of tasklet 2008-12-25 11:02:33 +11:00
dca [4/4] dca: fixup initialization dependency 2008-11-10 15:01:03 -08:00
dio dio: use dio_match_device() in dio_bus_match() 2008-07-20 17:24:40 -07:00
dma async_xor: dma_map destination DMA_BIDIRECTIONAL 2008-12-08 13:46:00 -07:00
edac Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc 2008-12-28 16:54:33 -08:00
eisa driver core: remove DEVICE_NAME_SIZE define 2008-07-21 21:54:53 -07:00
firewire firewire: fw-ohci: fix IOMMU resource exhaustion 2008-12-10 12:45:34 +01:00
firmware DMI: add dmi_match 2008-12-29 07:39:34 -05:00
gpio gpiolib: extend gpio label column width in debugfs file 2008-11-19 18:49:57 -08:00
gpu drm/i915: fix modeset devname allocation + agp init return check. 2008-12-29 18:18:19 +10:00
hid HID: Apple ALU wireless keyboards are bluetooth devices 2008-11-28 15:09:26 +01:00
hwmon hwmon: applesmc: make applesmc load automatically on startup 2008-12-01 19:55:24 -08:00
i2c Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm 2008-12-30 17:36:49 -08:00
ide ide-atapi: start dma in a drive-specific way 2009-01-02 16:12:56 +01:00
idle i7300_idle: Kconfig, show menu only on x86_64 2008-10-28 00:14:47 -04:00
ieee1394 ieee1394: add quirk fix for Freecom HDD 2008-12-14 01:13:13 +01:00
infiniband Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 2008-12-31 23:05:57 +10:30
input Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm 2008-12-30 17:36:49 -08:00
isdn Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6 2008-12-28 12:49:40 -08:00
leds remove unused #include <version.h>'s 2008-11-01 09:50:12 -07:00
lguest Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-cpumask into merge-rr-cpumask 2009-01-03 18:53:31 +01:00
macintosh Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc 2008-12-28 16:54:33 -08:00
mca driver core: remove DEVICE_NAME_SIZE define 2008-07-21 21:54:53 -07:00
md dm table: rework reference counting 2009-01-06 03:05:10 +00:00
media V4L/DVB (10173): Missing v4l2_prio_close in radio_release 2009-01-03 10:50:38 -02:00
memstick [PATCH] switch memstick 2008-10-21 07:48:33 -04:00
message [SCSI] fusion: use ARRAY_SIZE 2008-12-29 11:24:17 -06:00
mfd [ARM] Hide ISA DMA API when ISA_DMA_API is unset 2008-11-29 18:42:40 +00:00
misc Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6 2008-12-28 12:49:40 -08:00
mmc Merge branch 'master' of ../mmc 2008-12-31 19:56:05 +01:00
mtd Merge branch 'linux-next' of git://git.infradead.org/~dedekind/ubi-2.6 2009-01-02 15:57:26 -08:00
net hso maintainers update patch 2009-01-02 10:19:43 -08:00
nubus nubus: fix mis-indented statement 2008-10-16 11:21:30 -07:00
of of/gpio: Implement of_gpio_count() 2008-12-21 14:21:14 +11:00
oprofile shrink struct dentry 2008-12-31 18:07:38 -05:00
parisc Merge branch 'cpus4096-for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-01-02 11:44:09 -08:00
parport parport_serial: fix array overflow 2008-12-01 19:55:24 -08:00
pci Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu 2009-01-03 12:03:52 -08:00
pcmcia Merge branch 'mxc-pu-imxfb' of git://pasiphae.extern.pengutronix.de/git/imx/linux-2.6 into devel 2008-12-17 20:04:45 +00:00
pnp percpu: fix percpu accessors to potentially !cpu_possible() cpus: pnpbios 2009-01-01 10:12:14 +10:30
power Merge git://git.infradead.org/battery-2.6 2008-10-20 09:44:30 -07:00
ps3 powerpc/ps3: Replace the flip_ctl logic in ps3av and ps3fb by a mutex 2008-11-19 16:03:54 +11:00
rapidio rapidio: struct device - replace bus_id with dev_name(), dev_set_name() 2008-12-16 15:53:41 +11:00
regulator regulator: Use menuconfig in Kconfig 2008-11-09 14:49:23 +00:00
rtc rtc: add alarm/update irq interfaces 2009-01-04 13:33:20 -08:00
s390 [PATCH] improve idle cputime accounting 2008-12-31 15:11:48 +01:00
sbus Revert "of_platform_driver noise on sparce" 2008-12-01 07:55:14 -08:00
scsi remove ide-scsi 2009-01-02 16:12:51 +01:00
serial serial_8250: support for Sealevel Systems Model 7803 COMM+8 2009-01-02 10:19:44 -08:00
sh sh: maple: Do not pass SLAB_POISON to kmem_cache_create() 2008-12-16 16:40:32 +09:00
sn ioc3.c: replace remaining __FUNCTION__ occurrences 2008-03-17 08:11:48 -04:00
spi Merge git://git.marvell.com/orion into devel 2008-12-13 09:12:51 +00:00
ssb ssb: struct device - replace bus_id with dev_name(), dev_set_name() 2008-11-21 11:06:03 -05:00
staging Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6 2008-12-28 12:49:40 -08:00
tc lk201: remove obsolete driver 2007-10-17 08:42:57 -07:00
telephony telephony: trivial: fix up email address 2008-11-11 09:30:23 -08:00
thermal thermal: Create CONFIG_THERMAL_HWMON=n 2008-06-25 19:25:42 -04:00
uio saner FASYNC handling on file close 2008-11-01 09:49:46 -07:00
usb Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/dvrabel/uwb 2009-01-02 10:31:04 -08:00
uwb Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 into for-upstream 2009-01-02 13:17:13 +00:00
video viafb: fix crashes due to 4k stack overflow 2009-01-04 13:33:20 -08:00
virtio virtio: add PCI device release() function 2008-12-30 09:26:10 +10:30
w1 w1: fix slave selection on big-endian systems 2008-12-23 15:58:21 -08:00
watchdog [WATCHDOG] Add support for the WM8350 watchdog 2008-12-31 16:12:54 +00:00
xen Merge branch 'cpus4096-for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-01-02 11:44:09 -08:00
zorro move memory_read_from_buffer() from fs.h to string.h 2008-07-24 10:47:13 -07:00
Kconfig regulator: Build on non-ARM platforms 2008-10-28 21:47:17 +00:00
Makefile Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/dvrabel/uwb 2008-10-26 16:35:46 -07:00