]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commit
libata: fix attach error handling
authorTejun Heo <tj@kernel.org>
Sat, 9 May 2009 16:06:54 +0000 (01:06 +0900)
committerJeff Garzik <jgarzik@redhat.com>
Mon, 11 May 2009 18:26:01 +0000 (14:26 -0400)
commit842faa6c1a1d6faddf3377948e5cf214812c6c90
tree345341d280d5ada012ab775f94f8cc1e92d6bad3
parenta4d7749be5de4a7261bcbe3c7d96c748792ec455
libata: fix attach error handling

New device attach path in ata_eh_revalidate_and_attach() is divided
into two separate loops because ATA requires IDENTIFY to be issued to
slave first while the user expects to see device probe messages from
the master device.  new_mask is used to track which devices are the
new ones between the first loop and the second.

This usually works well but if an error occurs during configuration
stage, ata_dev_revalidate_and_attach() returns with error code and
forgets new_mask.  On the retry run, dev->class is set and new_mask
for the device is clear, so the device just gets revalidated and thus
ends up skipping post-configuration procedure including scheduling of
SCSI_HOTPLUG for the device.  When this occurs, ATA part of probing
works fine but SCSI probing usually doesn't happen and makes the
device unreachable.

The behavior has been around for a very long time but it has been
uncovered with the recent addition of 1_5_GBPS horkage which uses
-EAGAIN return value from ata_dev_configure() to restart the probing
sequence after forcing cable speed.

This can be fixed by making sure dev->class is permanently set only
after all configurations are successfully complete.  Fix it.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Tim Connors <tconnors+linuxkml@astro.swin.edu.au>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
drivers/ata/libata-eh.c