kernel-ark/drivers/md
Alasdair G Kergon eccf081799 [PATCH] device-mapper snapshot: fix origin_write pending_exception submission
Say you have several snapshots of the same origin and then you issue a write
to some place in the origin for the first time.

Before the device-mapper snapshot target lets the write go through to the
underlying device, it needs to make a copy of the data that is about to be
overwritten.  Each snapshot is independent, so it makes one copy for each
snapshot.

__origin_write() loops through each snapshot and checks to see whether a copy
is needed for that snapshot.  (A copy is only needed the first time that data
changes.)

If a copy is needed, the code allocates a 'pending_exception' structure
holding the details.  It links these together for all the snapshots, then
works its way through this list and submits the copying requests to the kcopyd
thread by calling start_copy().  When each request is completed, the original
pending_exception structure gets freed in pending_complete().

If you're very unlucky, this structure can get freed *before* the submission
process has finished walking the list.

This patch:

  1) Creates a new temporary list pe_queue to hold the pending exception
     structures;

  2) Does all the bookkeeping up-front, then walks through the new list
     safely and calls start_copy() for each pending_exception that needed it;

  3) Avoids attempting to add pe->siblings to the list if it's already
     connected.

[NB This does not fix all the races in this code.  More patches will follow.]

Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-03-27 08:44:58 -08:00
..
raid6test
.gitignore
bitmap.c [PATCH] mempool: use common mempool kmalloc allocator 2006-03-26 08:56:59 -08:00
dm-bio-list.h
dm-bio-record.h
dm-crypt.c [PATCH] mempool: use mempool_create_slab_pool() 2006-03-26 08:57:00 -08:00
dm-emc.c
dm-exception-store.c
dm-hw-handler.c BUG_ON() Conversion in md/dm-hw-handler.c 2006-03-24 18:36:27 +01:00
dm-hw-handler.h
dm-io.c [PATCH] mempool: use common mempool kmalloc allocator 2006-03-26 08:56:59 -08:00
dm-io.h
dm-ioctl.c
dm-linear.c
dm-log.c
dm-log.h
dm-mpath.c [PATCH] mempool: use mempool_create_slab_pool() 2006-03-26 08:57:00 -08:00
dm-mpath.h
dm-path-selector.c BUG_ON() Conversion in md/dm-path-selector.c 2006-03-26 18:21:58 +02:00
dm-path-selector.h
dm-raid1.c [PATCH] mempool: use common mempool kmalloc allocator 2006-03-26 08:56:59 -08:00
dm-round-robin.c
dm-snap.c [PATCH] device-mapper snapshot: fix origin_write pending_exception submission 2006-03-27 08:44:58 -08:00
dm-snap.h
dm-stripe.c [PATCH] dm stripe: Fix bounds 2006-03-17 07:51:25 -08:00
dm-table.c BUG_ON() Conversion in md/dm-table.c 2006-03-26 18:22:50 +02:00
dm-target.c
dm-zero.c
dm.c [PATCH] mempool: use mempool_create_slab_pool() 2006-03-26 08:57:00 -08:00
dm.h
faulty.c
Kconfig
kcopyd.c [PATCH] mempool: use mempool_create_slab_pool() 2006-03-26 08:57:00 -08:00
kcopyd.h
linear.c
Makefile
md.c [PATCH] regularize blk_cleanup_queue() use 2006-03-18 18:34:20 -05:00
mktables.c
multipath.c [PATCH] mempool: use common mempool kzalloc allocator 2006-03-26 08:56:59 -08:00
raid0.c
raid1.c [PATCH] md: Fix several raid1 bugs which cause a memory leak 2006-03-09 19:47:37 -08:00
raid5.c
raid6.h
raid6algos.c
raid6altivec.uc
raid6int.uc
raid6main.c
raid6mmx.c
raid6recov.c
raid6sse1.c
raid6sse2.c
raid6x86.h
raid10.c
unroll.pl
xor.c