Messages in this thread | | | Date | Tue, 14 Feb 2012 08:28:58 -0800 | From | Tejun Heo <> | Subject | Re: Kernel crashing on eject SD card |
| |
Hello,
On Tue, Feb 14, 2012 at 08:14:40PM +0900, Jun'ichi Nomura wrote: > The following commit has changed __blkdev_get() to end up calling > sd_revalidate_disk() without getting a refcount of scsi_device: > > commit 1196f8b814f32cd04df334abf47648c2a9fd8324 > Author: Tejun Heo <tj@kernel.org> > Date: Thu Apr 21 20:54:45 2011 +0200 > > block: rescan partitions on invalidated devices on -ENOMEDIA too > > that could lead to oops like this: > > process A process B > ---------------------------------------------- > sys_open > __blkdev_get > sd_open > returns -ENOMEDIUM > scsi_remove_device > <scsi_device torn down> > rescan_partitions > sd_revalidate_disk > <oops> > > Should "revalidate_disk" of block_device_operations work > without successful open()? > > If so, sd_revalidate_disk() (and possibly other drivers) needs to be > fixed. (e.g. use scsi_disk_get/put by itself) > > If not, __blkdev_get() or rescan_partision() should avoid calling > "revalidate_disk" for -ENOMEDIUM case.
Hmmm... right, that's a problem. Missed rescan_partitions() calling into driver. What we should probably do is separating out invalidation & partition shoot down into a separate function, say trucate_disk(), and call that on -ENOMEDIUM instead of rescan_partitions(). All that's necessary is killing the partition devices (and maybe zapping device size to zero). Any one interested in trying it?
Thanks.
-- tejun
| |