[SCSI] aacraid: add an ifdef'd device delete case instead of taking the device offline
authorRajashekhara, Mahesh <Mahesh_Rajashekhara@adaptec.com>
Mon, 10 May 2010 11:29:25 +0000 (04:29 -0700)
committerJames Bottomley <James.Bottomley@suse.de>
Mon, 17 May 2010 02:58:27 +0000 (22:58 -0400)
Problem description:
--------------------

The problem reported by one of the customer was when a logical array
is deleted(from the SDK, from the GUI, from arcconf) then the
corresponding physical device (/dev/sdb, for example) is not removed
from the Linux namespace. So you end up with a "dead" device
entry. And some of the linux tools go slightly wonky.

Solution:
---------

Based on the notification from FW, the driver calls
"scsi_remove_device" for the DELETED drive. This call not only informs
the scsi device status to the SCSI mid layer and also it will remove
corresponding scsi device entries from the Linux sysfs.

Signed-off-by: Mahesh Rajashekhara <aacraid@adaptec.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/commsup.c

index 9f985267c30fb3517a4da3513a9978bdda2340da..4dbcc055ac783bb4b8b3752def53a91dee759a7a 100644 (file)
@@ -12,7 +12,7 @@
  *----------------------------------------------------------------------------*/
 
 #ifndef AAC_DRIVER_BUILD
-# define AAC_DRIVER_BUILD 26000
+# define AAC_DRIVER_BUILD 26400
 # define AAC_DRIVER_BRANCH "-ms"
 #endif
 #define MAXIMUM_NUM_CONTAINERS 32
@@ -26,6 +26,8 @@
 #define AAC_MAX_HOSTPHYSMEMPAGES (0xfffff)
 #define AAC_MAX_32BIT_SGBCOUNT ((unsigned short)256)
 
+#define AAC_DEBUG_INSTRUMENT_AIF_DELETE
+
 /*
  * These macros convert from physical channels to virtual channels
  */
index 69692b050e3cf2d3e53d0c272f72d1dd423ccd3a..70079146e203631082e7c56e308d6c89679c2523 100644 (file)
@@ -1133,6 +1133,9 @@ retry_next:
        if (device) {
                switch (device_config_needed) {
                case DELETE:
+#if (defined(AAC_DEBUG_INSTRUMENT_AIF_DELETE))
+                       scsi_remove_device(device);
+#else
                        if (scsi_device_online(device)) {
                                scsi_device_set_state(device, SDEV_OFFLINE);
                                sdev_printk(KERN_INFO, device,
@@ -1141,6 +1144,7 @@ retry_next:
                                                "array deleted" :
                                                "enclosure services event");
                        }
+#endif
                        break;
                case ADD:
                        if (!scsi_device_online(device)) {
@@ -1155,12 +1159,16 @@ retry_next:
                case CHANGE:
                        if ((channel == CONTAINER_CHANNEL)
                         && (!dev->fsa_dev[container].valid)) {
+#if (defined(AAC_DEBUG_INSTRUMENT_AIF_DELETE))
+                               scsi_remove_device(device);
+#else
                                if (!scsi_device_online(device))
                                        break;
                                scsi_device_set_state(device, SDEV_OFFLINE);
                                sdev_printk(KERN_INFO, device,
                                        "Device offlined - %s\n",
                                        "array failed");
+#endif
                                break;
                        }
                        scsi_rescan_device(&device->sdev_gendev);