android_kernel_oneplus_msm8998/drivers/ide
Maurizio Lombardi 5e699836c3 cdrom: do not call check_disk_change() inside cdrom_open()
[ Upstream commit 2bbea6e117357d17842114c65e9a9cf2d13ae8a3 ]

when mounting an ISO filesystem sometimes (very rarely)
the system hangs because of a race condition between two tasks.

PID: 6766   TASK: ffff88007b2a6dd0  CPU: 0   COMMAND: "mount"
 #0 [ffff880078447ae0] __schedule at ffffffff8168d605
 #1 [ffff880078447b48] schedule_preempt_disabled at ffffffff8168ed49
 #2 [ffff880078447b58] __mutex_lock_slowpath at ffffffff8168c995
 #3 [ffff880078447bb8] mutex_lock at ffffffff8168bdef
 #4 [ffff880078447bd0] sr_block_ioctl at ffffffffa00b6818 [sr_mod]
 #5 [ffff880078447c10] blkdev_ioctl at ffffffff812fea50
 #6 [ffff880078447c70] ioctl_by_bdev at ffffffff8123a8b3
 #7 [ffff880078447c90] isofs_fill_super at ffffffffa04fb1e1 [isofs]
 #8 [ffff880078447da8] mount_bdev at ffffffff81202570
 #9 [ffff880078447e18] isofs_mount at ffffffffa04f9828 [isofs]
#10 [ffff880078447e28] mount_fs at ffffffff81202d09
#11 [ffff880078447e70] vfs_kern_mount at ffffffff8121ea8f
#12 [ffff880078447ea8] do_mount at ffffffff81220fee
#13 [ffff880078447f28] sys_mount at ffffffff812218d6
#14 [ffff880078447f80] system_call_fastpath at ffffffff81698c49
    RIP: 00007fd9ea914e9a  RSP: 00007ffd5d9bf648  RFLAGS: 00010246
    RAX: 00000000000000a5  RBX: ffffffff81698c49  RCX: 0000000000000010
    RDX: 00007fd9ec2bc210  RSI: 00007fd9ec2bc290  RDI: 00007fd9ec2bcf30
    RBP: 0000000000000000   R8: 0000000000000000   R9: 0000000000000010
    R10: 00000000c0ed0001  R11: 0000000000000206  R12: 00007fd9ec2bc040
    R13: 00007fd9eb6b2380  R14: 00007fd9ec2bc210  R15: 00007fd9ec2bcf30
    ORIG_RAX: 00000000000000a5  CS: 0033  SS: 002b

This task was trying to mount the cdrom.  It allocated and configured a
super_block struct and owned the write-lock for the super_block->s_umount
rwsem. While exclusively owning the s_umount lock, it called
sr_block_ioctl and waited to acquire the global sr_mutex lock.

PID: 6785   TASK: ffff880078720fb0  CPU: 0   COMMAND: "systemd-udevd"
 #0 [ffff880078417898] __schedule at ffffffff8168d605
 #1 [ffff880078417900] schedule at ffffffff8168dc59
 #2 [ffff880078417910] rwsem_down_read_failed at ffffffff8168f605
 #3 [ffff880078417980] call_rwsem_down_read_failed at ffffffff81328838
 #4 [ffff8800784179d0] down_read at ffffffff8168cde0
 #5 [ffff8800784179e8] get_super at ffffffff81201cc7
 #6 [ffff880078417a10] __invalidate_device at ffffffff8123a8de
 #7 [ffff880078417a40] flush_disk at ffffffff8123a94b
 #8 [ffff880078417a88] check_disk_change at ffffffff8123ab50
 #9 [ffff880078417ab0] cdrom_open at ffffffffa00a29e1 [cdrom]
#10 [ffff880078417b68] sr_block_open at ffffffffa00b6f9b [sr_mod]
#11 [ffff880078417b98] __blkdev_get at ffffffff8123ba86
#12 [ffff880078417bf0] blkdev_get at ffffffff8123bd65
#13 [ffff880078417c78] blkdev_open at ffffffff8123bf9b
#14 [ffff880078417c90] do_dentry_open at ffffffff811fc7f7
#15 [ffff880078417cd8] vfs_open at ffffffff811fc9cf
#16 [ffff880078417d00] do_last at ffffffff8120d53d
#17 [ffff880078417db0] path_openat at ffffffff8120e6b2
#18 [ffff880078417e48] do_filp_open at ffffffff8121082b
#19 [ffff880078417f18] do_sys_open at ffffffff811fdd33
#20 [ffff880078417f70] sys_open at ffffffff811fde4e
#21 [ffff880078417f80] system_call_fastpath at ffffffff81698c49
    RIP: 00007f29438b0c20  RSP: 00007ffc76624b78  RFLAGS: 00010246
    RAX: 0000000000000002  RBX: ffffffff81698c49  RCX: 0000000000000000
    RDX: 00007f2944a5fa70  RSI: 00000000000a0800  RDI: 00007f2944a5fa70
    RBP: 00007f2944a5f540   R8: 0000000000000000   R9: 0000000000000020
    R10: 00007f2943614c40  R11: 0000000000000246  R12: ffffffff811fde4e
    R13: ffff880078417f78  R14: 000000000000000c  R15: 00007f2944a4b010
    ORIG_RAX: 0000000000000002  CS: 0033  SS: 002b

This task tried to open the cdrom device, the sr_block_open function
acquired the global sr_mutex lock. The call to check_disk_change()
then saw an event flag indicating a possible media change and tried
to flush any cached data for the device.
As part of the flush, it tried to acquire the super_block->s_umount
lock associated with the cdrom device.
This was the same super_block as created and locked by the previous task.

The first task acquires the s_umount lock and then the sr_mutex_lock;
the second task acquires the sr_mutex_lock and then the s_umount lock.

This patch fixes the issue by moving check_disk_change() out of
cdrom_open() and let the caller take care of it.

Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2018-05-30 07:49:13 +02:00
..
aec62xx.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
ali14xx.c sections: fix section conflicts in drivers/ide 2012-10-06 03:04:41 +09:00
alim15x3.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
amd74xx.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
atiixp.c Drivers: ide: Remove typedef atiixp_ide_timing 2014-10-15 14:27:38 -04:00
au1xxx-ide.c ide: drop owner assignment from platform_drivers 2014-10-20 16:20:38 +02:00
buddha.c zorro: ZTWO_VADDR() should return "void __iomem *" 2013-11-26 11:09:07 +01:00
cmd64x.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
cmd640.c sections: fix section conflicts in drivers/ide 2012-10-06 03:04:41 +09:00
cs5520.c ide: remove deprecated use of pci api 2015-04-17 15:32:07 -04:00
cs5530.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
cs5535.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
cs5536.c ide: cs5536: use module_pci_driver() 2013-11-14 18:21:25 -05:00
cy82c693.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
delkin_cb.c drivers/ide/delkin_cb: Convert to module_pci_driver 2013-07-10 12:09:10 -07:00
dtc2278.c sections: fix section conflicts in drivers/ide 2012-10-06 03:04:41 +09:00
falconide.c ide: move ack_intr() method into 'struct ide_port_ops' (take 2) 2009-06-15 18:52:58 +02:00
gayle.c ide: drop owner assignment from platform_drivers 2014-10-20 16:20:38 +02:00
hpt366.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
ht6560b.c sections: fix section conflicts in drivers/ide 2012-10-06 03:04:41 +09:00
icside.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
ide-4drives.c module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
ide-acpi.c ACPI / bind: Move acpi_get_child() to drivers/ide/ide-acpi.c 2013-12-07 01:05:50 +01:00
ide-atapi.c mm, page_alloc: rename __GFP_WAIT to __GFP_RECLAIM 2015-11-06 17:50:42 -08:00
ide-cd.c cdrom: do not call check_disk_change() inside cdrom_open() 2018-05-30 07:49:13 +02:00
ide-cd.h ide: Convert to bdops->check_events() 2011-03-09 19:54:27 +01:00
ide-cd_ioctl.c mm, page_alloc: rename __GFP_WAIT to __GFP_RECLAIM 2015-11-06 17:50:42 -08:00
ide-cd_verbose.c drivers: ide: Include appropriate header file in ide-cd_verbose.c 2014-01-28 23:35:09 -08:00
ide-cs.c drivers/ide/ide-cs.c: adjust suspicious bit operation 2012-06-12 15:51:41 -07:00
ide-devsets.c mm, page_alloc: rename __GFP_WAIT to __GFP_RECLAIM 2015-11-06 17:50:42 -08:00
ide-disk.c mm, page_alloc: rename __GFP_WAIT to __GFP_RECLAIM 2015-11-06 17:50:42 -08:00
ide-disk.h [PATCH] switch ide_disk_ops ->ioctl() to sane prototype 2008-10-21 07:47:30 -04:00
ide-disk_ioctl.c block: autoconvert trivial BKL users to private mutex 2010-10-05 15:01:10 +02:00
ide-disk_proc.c procfs: new helper - PDE_DATA(inode) 2013-04-09 14:13:32 -04:00
ide-dma-sff.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide-dma.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide-eh.c block: move PM request support to IDE 2015-05-05 13:40:42 -06:00
ide-floppy.c block: move REQ_TYPE_SENSE to the ide driver 2015-05-05 13:40:07 -06:00
ide-floppy.h [PATCH] switch ide_disk_ops ->ioctl() to sane prototype 2008-10-21 07:47:30 -04:00
ide-floppy_ioctl.c block: add and use scsi_blk_cmd_ioctl 2012-01-14 15:07:24 -08:00
ide-floppy_proc.c procfs: new helper - PDE_DATA(inode) 2013-04-09 14:13:32 -04:00
ide-gd.c drivers: avoid format string in dev_set_name 2013-07-03 16:07:41 -07:00
ide-gd.h ide: move ->failed_pc to ide_drive_t 2009-03-27 12:46:34 +01:00
ide-generic.c ide: remove hw_regs_t typedef 2009-05-17 19:12:25 +02:00
ide-io-std.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide-io.c block: move PM request support to IDE 2015-05-05 13:40:42 -06:00
ide-ioctls.c mm, page_alloc: rename __GFP_WAIT to __GFP_RECLAIM 2015-11-06 17:50:42 -08:00
ide-iops.c ide: add SATA cable detection support 2010-01-19 01:41:57 -08:00
ide-legacy.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide-lib.c ide,ata: Rename ATA_IDX to ATA_SENSE 2015-03-27 11:59:22 -04:00
ide-park.c mm, page_alloc: rename __GFP_WAIT to __GFP_RECLAIM 2015-11-06 17:50:42 -08:00
ide-pci-generic.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
ide-pio-blacklist.c drivers: ide: Include appropriate header file in ide-pio-blacklist.c 2014-01-28 23:35:09 -08:00
ide-pm.c mm, page_alloc: rename __GFP_WAIT to __GFP_RECLAIM 2015-11-06 17:50:42 -08:00
ide-pnp.c PNP: ide/ide-pnp: Use module_pnp_driver to register driver 2015-03-18 22:39:17 +01:00
ide-probe.c ide,ata: Rename ATA_IDX to ATA_SENSE 2015-03-27 11:59:22 -04:00
ide-proc.c procfs: new helper - PDE_DATA(inode) 2013-04-09 14:13:32 -04:00
ide-scan-pci.c ide/ide-scan-pci.c: Use for_each_pci_dev(). 2011-05-16 14:24:46 -07:00
ide-sysfs.c ide: convert bus code to use dev_groups 2013-10-16 18:40:57 -07:00
ide-tape.c mm, page_alloc: rename __GFP_WAIT to __GFP_RECLAIM 2015-11-06 17:50:42 -08:00
ide-taskfile.c mm, page_alloc: rename __GFP_WAIT to __GFP_RECLAIM 2015-11-06 17:50:42 -08:00
ide-timings.c ide: ide_timing_compute() fixup 2010-01-19 11:30:09 -08:00
ide-xfer-mode.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide.c kernel/params: constify struct kernel_param_ops uses 2015-05-28 11:32:10 +09:30
ide_platform.c ide: drop owner assignment from platform_drivers 2014-10-20 16:20:38 +02:00
it821x.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
it8172.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
it8213.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
jmicron.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
Kconfig Remove celleb-only SCC PATA drivers 2015-04-14 13:07:17 -04:00
macide.c ide/ata: Add module.h to the implicit modular users 2011-10-31 19:31:37 -04:00
Makefile Remove celleb-only SCC PATA drivers 2015-04-14 13:07:17 -04:00
ns87415.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
opti621.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
palm_bk3710.c ide: drop owner assignment from platform_drivers 2014-10-20 16:20:38 +02:00
pdc202xx_new.c ide: pdc202xx_new: Replace timeval with ktime_t 2015-11-03 11:51:08 -05:00
pdc202xx_old.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
piix.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
pmac.c ide: remove deprecated use of pci api 2015-04-17 15:32:07 -04:00
q40ide.c ide/ata: Add module.h to the implicit modular users 2011-10-31 19:31:37 -04:00
qd65xx.c sections: fix section conflicts in drivers/ide 2012-10-06 03:04:41 +09:00
qd65xx.h ide: do not access ide_drive_t 'drive_data' field directly 2009-06-15 22:13:44 +02:00
rapide.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
rz1000.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
sc1200.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
serverworks.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
setup-pci.c ide: remove deprecated use of pci api 2015-04-17 15:32:07 -04:00
sgiioc4.c ide: remove deprecated use of pci api 2015-04-17 15:32:07 -04:00
siimage.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
sis5513.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
sl82c105.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
slc90e66.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
tc86c001.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
triflex.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
trm290.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00
tx4938ide.c ide: drop owner assignment from platform_drivers 2014-10-20 16:20:38 +02:00
tx4939ide.c ide: drop owner assignment from platform_drivers 2014-10-20 16:20:38 +02:00
umc8672.c sections: fix section conflicts in drivers/ide 2012-10-06 03:04:41 +09:00
via82cxxx.c Drivers: ide: remove __dev* attributes. 2013-01-03 15:57:03 -08:00