Commit d3d32891 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Martin K. Petersen

scsi_dh: add 'rescan' callback

If a device needs to be rescanned the device_handler might need
to be rechecked, too.
So add a 'rescan' callback to the device handler and call it
upon scsi_rescan_device(). The rescan callback will be invoked
from the Unit Attention handling of ASC/ASCQ 3F 03
(INQUIRY DATA HAS CHANGED).
Reviewed-by: default avatarBart Van Assche <bart.vanassche@sandisk.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 9d2c3039
...@@ -1026,6 +1026,13 @@ static int alua_prep_fn(struct scsi_device *sdev, struct request *req) ...@@ -1026,6 +1026,13 @@ static int alua_prep_fn(struct scsi_device *sdev, struct request *req)
} }
static void alua_rescan(struct scsi_device *sdev)
{
struct alua_dh_data *h = sdev->handler_data;
alua_initialize(sdev, h);
}
/* /*
* alua_bus_attach - Attach device handler * alua_bus_attach - Attach device handler
* @sdev: device to be attached to * @sdev: device to be attached to
...@@ -1086,6 +1093,7 @@ static struct scsi_device_handler alua_dh = { ...@@ -1086,6 +1093,7 @@ static struct scsi_device_handler alua_dh = {
.prep_fn = alua_prep_fn, .prep_fn = alua_prep_fn,
.check_sense = alua_check_sense, .check_sense = alua_check_sense,
.activate = alua_activate, .activate = alua_activate,
.rescan = alua_rescan,
.set_params = alua_set_params, .set_params = alua_set_params,
}; };
......
...@@ -2699,6 +2699,7 @@ static void scsi_evt_emit(struct scsi_device *sdev, struct scsi_event *evt) ...@@ -2699,6 +2699,7 @@ static void scsi_evt_emit(struct scsi_device *sdev, struct scsi_event *evt)
envp[idx++] = "SDEV_MEDIA_CHANGE=1"; envp[idx++] = "SDEV_MEDIA_CHANGE=1";
break; break;
case SDEV_EVT_INQUIRY_CHANGE_REPORTED: case SDEV_EVT_INQUIRY_CHANGE_REPORTED:
scsi_rescan_device(&sdev->sdev_gendev);
envp[idx++] = "SDEV_UA=INQUIRY_DATA_HAS_CHANGED"; envp[idx++] = "SDEV_UA=INQUIRY_DATA_HAS_CHANGED";
break; break;
case SDEV_EVT_CAPACITY_CHANGE_REPORTED: case SDEV_EVT_CAPACITY_CHANGE_REPORTED:
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include <scsi/scsi_devinfo.h> #include <scsi/scsi_devinfo.h>
#include <scsi/scsi_host.h> #include <scsi/scsi_host.h>
#include <scsi/scsi_transport.h> #include <scsi/scsi_transport.h>
#include <scsi/scsi_dh.h>
#include <scsi/scsi_eh.h> #include <scsi/scsi_eh.h>
#include "scsi_priv.h" #include "scsi_priv.h"
...@@ -1524,9 +1525,14 @@ EXPORT_SYMBOL(scsi_add_device); ...@@ -1524,9 +1525,14 @@ EXPORT_SYMBOL(scsi_add_device);
void scsi_rescan_device(struct device *dev) void scsi_rescan_device(struct device *dev)
{ {
struct scsi_device *sdev = to_scsi_device(dev);
device_lock(dev); device_lock(dev);
scsi_attach_vpd(to_scsi_device(dev)); scsi_attach_vpd(sdev);
if (sdev->handler && sdev->handler->rescan)
sdev->handler->rescan(sdev);
if (dev->driver && try_module_get(dev->driver->owner)) { if (dev->driver && try_module_get(dev->driver->owner)) {
struct scsi_driver *drv = to_scsi_driver(dev->driver); struct scsi_driver *drv = to_scsi_driver(dev->driver);
......
...@@ -71,6 +71,7 @@ struct scsi_device_handler { ...@@ -71,6 +71,7 @@ struct scsi_device_handler {
int (*activate)(struct scsi_device *, activate_complete, void *); int (*activate)(struct scsi_device *, activate_complete, void *);
int (*prep_fn)(struct scsi_device *, struct request *); int (*prep_fn)(struct scsi_device *, struct request *);
int (*set_params)(struct scsi_device *, const char *); int (*set_params)(struct scsi_device *, const char *);
void (*rescan)(struct scsi_device *);
}; };
#ifdef CONFIG_SCSI_DH #ifdef CONFIG_SCSI_DH
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment