linux/drivers/md
Joe Thornber e2e74d617e dm cache: fix race in writethrough implementation
We have found a race in the optimisation used in the dm cache
writethrough implementation.  Currently, dm core sends the cache target
two bios, one for the origin device and one for the cache device and
these are processed in parallel.  This patch avoids the race by
changing the code back to a simpler (slower) implementation which
processes the two writes in series, one after the other, until we can
develop a complete fix for the problem.

When the cache is in writethrough mode it needs to send WRITE bios to
both the origin and cache devices.

Previously we've been implementing this by having dm core query the
cache target on every write to find out how many copies of the bio it
wants.  The cache will ask for two bios if the block is in the cache,
and one otherwise.

Then main problem with this is it's racey.  At the time this check is
made the bio hasn't yet been submitted and so isn't being taken into
account when quiescing a block for migration (promotion or demotion).
This means a single bio may be submitted when two were needed because
the block has since been promoted to the cache (catastrophic), or two
bios where only one is needed (harmless).

I really don't want to start entering bios into the quiescing system
(deferred_set) in the get_num_write_bios callback.  Instead this patch
simplifies things; only one bio is submitted by the core, this is
first written to the origin and then the cache device in series.
Obviously this will have a latency impact.

deferred_writethrough_bios is introduced to record bios that must be
later issued to the cache device from the worker thread.  This deferred
submission, after the origin bio completes, is required given that we're
in interrupt context (writethrough_endio).

Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
2013-03-20 17:21:27 +00:00
..
persistent-data dm thin: fix discard corruption 2013-03-20 17:21:24 +00:00
bitmap.c new helper: file_inode(file) 2013-02-22 23:31:31 -05:00
bitmap.h md/bitmap: record the space available for the bitmap in the superblock. 2012-05-22 13:55:34 +10:00
dm-bio-prison.c dm: add cache target 2013-03-01 22:45:51 +00:00
dm-bio-prison.h dm: add cache target 2013-03-01 22:45:51 +00:00
dm-bio-record.h
dm-bufio.c dm verity: avoid deadlock 2013-03-20 17:21:25 +00:00
dm-bufio.h dm bufio: prefetch 2012-03-28 18:41:29 +01:00
dm-cache-block-types.h dm: add cache target 2013-03-01 22:45:51 +00:00
dm-cache-metadata.c dm cache: metadata clear dirty bits on clean shutdown 2013-03-20 17:21:27 +00:00
dm-cache-metadata.h dm: add cache target 2013-03-01 22:45:51 +00:00
dm-cache-policy-cleaner.c dm cache: add cleaner policy 2013-03-01 22:45:52 +00:00
dm-cache-policy-internal.h dm: add cache target 2013-03-01 22:45:51 +00:00
dm-cache-policy-mq.c dm cache: add mq policy 2013-03-01 22:45:51 +00:00
dm-cache-policy.c dm: add cache target 2013-03-01 22:45:51 +00:00
dm-cache-policy.h dm: add cache target 2013-03-01 22:45:51 +00:00
dm-cache-target.c dm cache: fix race in writethrough implementation 2013-03-20 17:21:27 +00:00
dm-crypt.c dm: rename request variables to bios 2013-03-01 22:45:47 +00:00
dm-delay.c dm: rename request variables to bios 2013-03-01 22:45:47 +00:00
dm-exception-store.c dm: replace simple_strtoul 2012-07-27 15:07:59 +01:00
dm-exception-store.h dm snapshot: test chunk size against both origin and snapshot 2010-08-12 04:13:51 +01:00
dm-flakey.c dm: rename request variables to bios 2013-03-01 22:45:47 +00:00
dm-io.c dm kcopyd: add WRITE SAME support to dm_kcopyd_zero 2012-12-21 20:23:37 +00:00
dm-ioctl.c dm ioctl: allow message to return data 2013-03-01 22:45:49 +00:00
dm-kcopyd.c dm kcopyd: introduce configurable throttling 2013-03-01 22:45:49 +00:00
dm-linear.c dm: rename request variables to bios 2013-03-01 22:45:47 +00:00
dm-log-userspace-base.c Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux 2011-11-06 19:44:47 -08:00
dm-log-userspace-transfer.c connector/userns: replace netlink uses of cap_raised() with capable() 2012-05-10 23:21:39 -04:00
dm-log-userspace-transfer.h dm log: userspace add luid to distinguish between concurrent log instances 2009-09-04 20:40:34 +01:00
dm-log.c dm: use memweight() 2012-07-30 17:25:16 -07:00
dm-mpath.c dm: rename request variables to bios 2013-03-01 22:45:47 +00:00
dm-mpath.h
dm-path-selector.c md: Add module.h to all files using it implicitly 2011-10-31 19:31:18 -04:00
dm-path-selector.h
dm-queue-length.c dm: reject trailing characters in sccanf input 2012-03-28 18:41:26 +01:00
dm-raid1.c dm kcopyd: introduce configurable throttling 2013-03-01 22:45:49 +00:00
dm-raid.c md updates for 3.9 2013-03-05 17:22:08 -08:00
dm-region-hash.c dm raid1: fix crash with mirror recovery and discard 2012-07-20 14:25:03 +01:00
dm-round-robin.c dm: reject trailing characters in sccanf input 2012-03-28 18:41:26 +01:00
dm-service-time.c dm: reject trailing characters in sccanf input 2012-03-28 18:41:26 +01:00
dm-snap-persistent.c md: Add in export.h for files using EXPORT_SYMBOL 2011-10-31 19:31:19 -04:00
dm-snap-transient.c md: Add in export.h for files using EXPORT_SYMBOL 2011-10-31 19:31:19 -04:00
dm-snap.c dm kcopyd: introduce configurable throttling 2013-03-01 22:45:49 +00:00
dm-stripe.c dm: rename request variables to bios 2013-03-01 22:45:47 +00:00
dm-sysfs.c Driver core: Constify struct sysfs_ops in struct kobj_type 2010-03-07 17:04:49 -08:00
dm-table.c dm: rename request variables to bios 2013-03-01 22:45:47 +00:00
dm-target.c dm: rename request variables to bios 2013-03-01 22:45:47 +00:00
dm-thin-metadata.c dm persistent data: set some btree fn parms const 2013-03-01 22:45:47 +00:00
dm-thin-metadata.h dm thin metadata: introduce dm_pool_abort_metadata 2012-07-27 15:08:15 +01:00
dm-thin.c dm thin: fix non power of two discard granularity calc 2013-03-20 17:21:25 +00:00
dm-uevent.c md: Add in export.h for files using EXPORT_SYMBOL 2011-10-31 19:31:19 -04:00
dm-uevent.h
dm-verity.c dm verity: avoid deadlock 2013-03-20 17:21:25 +00:00
dm-zero.c dm: rename request variables to bios 2013-03-01 22:45:47 +00:00
dm.c dm: add target num_write_bios fn 2013-03-01 22:45:49 +00:00
dm.h dm: introduce per_bio_data 2012-12-21 20:23:38 +00:00
faulty.c md faulty: use disk_stack_limits() 2012-10-22 10:44:55 +11:00
Kconfig md updates for 3.9 2013-03-05 17:22:08 -08:00
linear.c md: linear supports TRIM 2012-10-11 13:08:44 +11:00
linear.h md/linear: typedef removal: linear_conf_t -> struct linear_conf 2011-10-11 16:48:54 +11:00
Makefile dm cache: add cleaner policy 2013-03-01 22:45:52 +00:00
md.c md: expedite metadata update when switching read-auto -> active 2013-02-28 11:59:03 +11:00
md.h md update for 3.8 2012-12-18 09:32:44 -08:00
multipath.c MD: change the parameter of md thread 2012-10-11 13:34:00 +11:00
multipath.h md/multipath: typedef removal: multipath_conf_t -> struct mpconf 2011-10-11 16:48:57 +11:00
raid0.c md/raid0: improve error message when converting RAID4-with-spares to RAID0 2013-02-26 11:58:44 +11:00
raid0.h md: add proper merge_bvec handling to RAID0 and Linear. 2012-03-19 12:46:39 +11:00
raid1.c md/raid1,raid10: fix deadlock with freeze_array() 2013-02-26 11:58:50 +11:00
raid1.h md/raid1: prevent merging too large request 2012-07-31 10:03:53 +10:00
raid5.c md updates for 3.9 2013-03-05 17:22:08 -08:00
raid5.h MD: raid5 trim support 2012-10-11 13:49:05 +11:00
raid10.c md/raid1,raid10: fix deadlock with freeze_array() 2013-02-26 11:58:50 +11:00
raid10.h MD RAID10: Improve redundancy for 'far' and 'offset' algorithms (part 1) 2013-02-26 11:55:30 +11:00