Block device driver: how to terminate the block device if media disappears?

Ezequiel Garcia elezegarcia at gmail.com
Fri Dec 21 13:23:16 EST 2012


Hi John,

On Thu, Dec 13, 2012 at 12:31 PM, John Beard <johnb at codexdigital.com> wrote:
> Hi,
>
> I have block driver for a hot-pluggable device PCIe storage device on
> kernel version 2.6.43 (which I know isn't a mainline kernel version, but
> it's what I am required to build against). The driver itself is
> relatively simple and implements the following block operations:
>
>         static struct block_device_operations mydev_ops = {
>                 .owner = THIS_MODULE,
>                 .open = mydev_open,
>                 .release = mydev_release,
>                 .getgeo = mydev_getgeo,
>                 .ioctl = mydev_ioctl
>         };
>
> and the following PCI driver structure:
>
>         static struct pci_driver mydev_driver = {
>                 .name = DRIVER_NAME,
>                 .probe = mydev_pci_init_one,
>                 .remove = mydev_pci_remove_one,
>                 .id_table = mydev_pci_tbl,
>         };
>
> As well as a request_fn with the following signature:
>
>         static void mydev_submit_req(struct request_queue *q);
>
> Whenever I get IO requests, there is the expected pattern of "open, IO,
> release", and everything works OK.
>
> However, if the device is physically removed during IO, I never seem to
> get a "release", just "open, IO, hang". I believe (but I don't know),
> that this is preventing del_gendisk() from completing, thus hanging the
> cleanup of the driver, which is triggered by mydev_pci_remove_one() upon
> the removal of the device.
>
> I am ending all requests on the queue once an eject happens, but it
> still doesn't seem to cause a release.
>
> What is the right way to terminate requests and delete the gendisk in
> the case of physically vanished PCI devices (or even devices in general)?
>

There are several block driver examples in drivers/block.
Or you might want to take a loot at mtdblock.c, or perhaps
this simple ubiblock implementation:

http://lwn.net/Articles/525957/

If you send a PATCH with your driver perhaps
someone can take a look at it and tell you what's going on.

    Ezequiel



More information about the Kernelnewbies mailing list