linux/drivers/md
Chandra Seetharaman 7253a33434 dm mpath: add missing path switching locking
Moving the path activation to workqueue along with scsi_dh patches introduced
a race. It is due to the fact that the current_pgpath (in the multipath data
structure) can be modified if changes happen in any of the paths leading to
the lun. If the changes lead to current_pgpath being set to NULL, then it
leads to the invalid access which results in the panic below.

This patch fixes that by storing the pgpath to activate in the multipath data
structure and properly protecting it.

Note that if activate_path is called twice in succession with different pgpath,
with the second one being called before the first one is done, then activate
path will be called twice for the second pgpath, which is fine.

Unable to handle kernel paging request for data at address 0x00000020
Faulting instruction address: 0xd000000000aa1844
cpu 0x1: Vector: 300 (Data Access) at [c00000006b987a80]
    pc: d000000000aa1844: .activate_path+0x30/0x218 [dm_multipath]
    lr: c000000000087a2c: .run_workqueue+0x114/0x204
    sp: c00000006b987d00
   msr: 8000000000009032
   dar: 20
 dsisr: 40000000
  current = 0xc0000000676bb3f0
  paca    = 0xc0000000006f3680
    pid   = 2528, comm = kmpath_handlerd
enter ? for help
[c00000006b987da0] c000000000087a2c .run_workqueue+0x114/0x204
[c00000006b987e40] c000000000088b58 .worker_thread+0x120/0x144
[c00000006b987f00] c00000000008ca70 .kthread+0x78/0xc4
[c00000006b987f90] c000000000027cc8 .kernel_thread+0x4c/0x68

Signed-off-by: Chandra Seetharaman <sekharan@us.ibm.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
2008-10-01 14:39:27 +01:00
..
raid6test
.gitignore
bitmap.c Fix problem with waiting while holding rcu read lock in md/bitmap.c 2008-09-01 12:48:13 +10:00
dm-bio-list.h
dm-bio-record.h
dm-crypt.c dm crypt: add merge 2008-07-21 12:00:40 +01:00
dm-delay.c
dm-exception-store.c
dm-io.c
dm-ioctl.c
dm-kcopyd.c
dm-linear.c dm: linear add merge 2008-07-21 12:00:38 +01:00
dm-log.c dm log: make dm_dirty_log init and exit static 2008-07-21 12:00:27 +01:00
dm-mpath.c dm mpath: add missing path switching locking 2008-10-01 14:39:27 +01:00
dm-mpath.h
dm-path-selector.c
dm-path-selector.h
dm-raid1.c
dm-round-robin.c
dm-snap.c dm snapshot: use per device mempools 2008-07-21 12:00:35 +01:00
dm-snap.h dm snapshot: use per device mempools 2008-07-21 12:00:35 +01:00
dm-stripe.c
dm-table.c [PATCH] switch mtd and dm-table to lookup_bdev() 2008-08-01 11:25:31 -04:00
dm-target.c
dm-uevent.c
dm-uevent.h
dm-zero.c
dm.c dm: cope with access beyond end of device in dm_merge_bvec 2008-10-01 14:39:24 +01:00
dm.h dm log: make dm_dirty_log init and exit static 2008-07-21 12:00:27 +01:00
faulty.c md: Make mddev->array_size sector-based. 2008-07-21 17:05:22 +10:00
Kconfig
linear.c Merge branch 'for-linus' of git://neil.brown.name/md 2008-07-21 10:29:12 -07:00
Makefile
md.c md: Don't wait UNINTERRUPTIBLE for other resync to finish 2008-09-19 11:49:54 +10:00
mktables.c
multipath.c md: Make mddev->array_size sector-based. 2008-07-21 17:05:22 +10:00
raid0.c Merge branch 'for-linus' of git://neil.brown.name/md 2008-07-21 10:29:12 -07:00
raid1.c md: Make mddev->array_size sector-based. 2008-07-21 17:05:22 +10:00
raid5.c Don't let a blocked_rdev interfere with read request in raid5/6 2008-08-05 15:56:32 +10:00
raid6.h
raid6algos.c
raid6altivec.uc
raid6int.uc
raid6mmx.c
raid6recov.c
raid6sse1.c
raid6sse2.c
raid6x86.h
raid10.c Allow raid10 resync to happening in larger chunks. 2008-08-05 15:56:32 +10:00
unroll.pl