1
linux/drivers/md
Mikulas Patocka 340cd44451 dm kcopyd: fix callback race
If the thread calling dm_kcopyd_copy is delayed due to scheduling inside
split_job/segment_complete and the subjobs complete before the loop in
split_job completes, the kcopyd callback could be invoked from the
thread that called dm_kcopyd_copy instead of the kcopyd workqueue.

dm_kcopyd_copy -> split_job -> segment_complete -> job->fn()

Snapshots depend on the fact that callbacks are called from the singlethreaded
kcopyd workqueue and expect that there is no racing between individual
callbacks. The racing between callbacks can lead to corruption of exception
store and it can also mean that exception store callbacks are called twice
for the same exception - a likely reason for crashes reported inside
pending_complete() / remove_exception().

This patch fixes two problems:

1. job->fn being called from the thread that submitted the job (see above).

- Fix: hand over the completion callback to the kcopyd thread.

2. job->fn(read_err, write_err, job->context); in segment_complete
reports the error of the last subjob, not the union of all errors.

- Fix: pass job->write_err to the callback to report all error bits
  (it is done already in run_complete_job)

Cc: stable@kernel.org
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
2009-04-09 00:27:17 +01:00
..
raid6test md/raid6: move raid6 data processing to raid6_pq.ko 2009-03-31 15:09:39 +11:00
.gitignore
bitmap.c md: Make mddev->size sector-based. 2009-03-31 14:33:13 +11:00
bitmap.h md: move headers out of include/linux/raid/ 2009-03-31 14:27:03 +11:00
dm-bio-list.h dm: bio list add bio_list_add_head 2009-04-02 19:55:36 +01:00
dm-bio-record.h dm: preserve bi_io_vec when resubmitting bios 2009-04-02 19:55:23 +01:00
dm-crypt.c dm crypt: use kzfree 2009-04-02 19:55:28 +01:00
dm-delay.c dm: consolidate target deregistration error handling 2009-01-06 03:04:58 +00:00
dm-exception-store.c dm snapshot: move ctr parsing to exception store 2009-04-02 19:55:34 +01:00
dm-exception-store.h dm snapshot: move status to exception store 2009-04-02 19:55:35 +01:00
dm-io.c dm io: make sync_io uninterruptible 2009-04-02 19:55:24 +01:00
dm-ioctl.c dm: add integrity support 2009-04-09 00:27:12 +01:00
dm-kcopyd.c dm kcopyd: fix callback race 2009-04-09 00:27:17 +01:00
dm-linear.c dm: remove limited barrier support 2009-04-09 00:27:13 +01:00
dm-log.c dm log: remove struct dm_dirty_log_internal 2009-04-02 19:55:30 +01:00
dm-mpath.c dm mpath: move trigger_event to system workqueue 2009-01-06 03:05:13 +00:00
dm-mpath.h dm mpath: remove is_active from struct dm_path 2008-10-10 13:36:58 +01:00
dm-path-selector.c dm: path selector use module refcount directly 2009-04-02 19:55:27 +01:00
dm-path-selector.h
dm-raid1.c dm raid1: add is_remote_recovering hook for clusters 2009-04-02 19:55:30 +01:00
dm-region-hash.c dm raid1: separate region_hash interface part1 2008-10-21 17:45:06 +01:00
dm-round-robin.c dm: remove dm header from targets 2008-10-21 17:44:59 +01:00
dm-snap-persistent.c dm snapshot: persistent fix dtr cleanup 2009-04-02 19:55:35 +01:00
dm-snap-transient.c dm snapshot: move status to exception store 2009-04-02 19:55:35 +01:00
dm-snap.c dm snapshot: move status to exception store 2009-04-02 19:55:35 +01:00
dm-stripe.c dm: consolidate target deregistration error handling 2009-01-06 03:04:58 +00:00
dm-sysfs.c dm: add name and uuid to sysfs 2009-01-06 03:05:12 +00:00
dm-table.c dm: remove limited barrier support 2009-04-09 00:27:13 +01:00
dm-target.c dm target: remove struct tt_internal 2009-04-02 19:55:28 +01:00
dm-uevent.c
dm-uevent.h
dm-zero.c dm: consolidate target deregistration error handling 2009-01-06 03:04:58 +00:00
dm.c dm: implement basic barrier support 2009-04-09 00:27:16 +01:00
dm.h dm: remove limited barrier support 2009-04-09 00:27:13 +01:00
faulty.c md: centralize ->array_sectors modifications 2009-03-31 14:59:03 +11:00
Kconfig md: remove CONFIG_MD_RAID_RESHAPE config option. 2009-03-31 15:27:05 +11:00
linear.c md: centralize ->array_sectors modifications 2009-03-31 14:59:03 +11:00
linear.h md: move lots of #include lines out of .h files and into .c 2009-03-31 14:33:13 +11:00
Makefile md/raid6: move raid6 data processing to raid6_pq.ko 2009-03-31 15:09:39 +11:00
md.c Merge branch 'for-linus' of git://neil.brown.name/md 2009-04-03 09:08:19 -07:00
md.h md: add explicit method to signal the end of a reshape. 2009-03-31 15:15:05 +11:00
mktables.c md/raid6: move raid6 data processing to raid6_pq.ko 2009-03-31 15:09:39 +11:00
multipath.c md: centralize ->array_sectors modifications 2009-03-31 14:59:03 +11:00
multipath.h md: move lots of #include lines out of .h files and into .c 2009-03-31 14:33:13 +11:00
raid0.c md: 'array_size' sysfs attribute 2009-03-31 15:00:31 +11:00
raid0.h md: move lots of #include lines out of .h files and into .c 2009-03-31 14:33:13 +11:00
raid1.c md/raid1: fix build breakage 2009-04-06 14:40:07 -07:00
raid1.h md: move lots of #include lines out of .h files and into .c 2009-03-31 14:33:13 +11:00
raid5.c md/raid5 revise rules for when to update metadata during reshape 2009-03-31 15:28:40 +11:00
raid5.h md/raid5 revise rules for when to update metadata during reshape 2009-03-31 15:28:40 +11:00
raid6algos.c md/raid6: move raid6 data processing to raid6_pq.ko 2009-03-31 15:09:39 +11:00
raid6altivec.uc md/raid6: move raid6 data processing to raid6_pq.ko 2009-03-31 15:09:39 +11:00
raid6int.uc md/raid6: move raid6 data processing to raid6_pq.ko 2009-03-31 15:09:39 +11:00
raid6mmx.c md/raid6: move raid6 data processing to raid6_pq.ko 2009-03-31 15:09:39 +11:00
raid6recov.c md/raid6: move raid6 data processing to raid6_pq.ko 2009-03-31 15:09:39 +11:00
raid6sse1.c md/raid6: move raid6 data processing to raid6_pq.ko 2009-03-31 15:09:39 +11:00
raid6sse2.c md/raid6: move raid6 data processing to raid6_pq.ko 2009-03-31 15:09:39 +11:00
raid6x86.h md: fix typo in FSF address 2009-03-31 14:57:37 +11:00
raid10.c md: 'array_size' sysfs attribute 2009-03-31 15:00:31 +11:00
raid10.h md: move lots of #include lines out of .h files and into .c 2009-03-31 14:33:13 +11:00
unroll.pl