Thread (5 messages) 5 messages, 3 authors, 2013-01-12

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

From: Ezequiel Garcia <hidden>
Date: 2012-12-21 18:23:16

Hi John,

On Thu, Dec 13, 2012 at 12:31 PM, John Beard [off-list ref] 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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help