lkml.org 
[lkml]   [2012]   [Feb]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: 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


\
 
 \ /
  Last update: 2012-02-14 17:31    [W:0.070 / U:1.220 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site