On 05/21/2012 10:32 AM, Mike Christie wrote: > On 05/21/2012 06:45 AM, Hannes Reinecke wrote: >> On 05/18/2012 06:56 AM, michaelc@xxxxxxxxxxx wrote: >>> From: Mike Christie <michaelc@xxxxxxxxxxx> >>> >>> If a device goes offline while the device is opened then closed >>> while it is still offline, udev will remove the /dev/disk/by-id >>> link. If the device comes back and is set to running, userspace >>> is not notified, and the by-id link will not get remade. >>> >>> This patch has scsi-ml send a KOBJ_CHANGE event so tools like udev >>> will know that it can being to use the device again. With this patch >>> udev see the KOBJ_CHANGE event and will reprobe the device and recreate >>> a /dev/disk/by-id link. >>> >>> v2 >>> - Added SDEV_EVT_STATE_RUNNING evt type. >>> >>> Signed-off-by: Mike Christie <michaelc@xxxxxxxxxxx> >>> --- >>> drivers/scsi/scsi_lib.c | 9 +++++++++ >>> include/scsi/scsi_device.h | 2 ++ >>> 2 files changed, 11 insertions(+), 0 deletions(-) >>> >>> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c >>> index d15b243..b54030d 100644 >>> --- a/drivers/scsi/scsi_lib.c >>> +++ b/drivers/scsi/scsi_lib.c >>> @@ -2061,6 +2061,7 @@ int >>> scsi_device_set_state(struct scsi_device *sdev, enum scsi_device_state state) >>> { >>> enum scsi_device_state oldstate = sdev->sdev_state; >>> + int change_evt = 0; >>> >>> if (state == oldstate) >>> return 0; >>> @@ -2079,6 +2080,11 @@ scsi_device_set_state(struct scsi_device *sdev, enum scsi_device_state state) >>> switch (oldstate) { >>> case SDEV_OFFLINE: >>> case SDEV_TRANSPORT_OFFLINE: >>> + /* >>> + * Notify userspace we can accept IO by sending >>> + * change event. >>> + */ >>> + change_evt = 1; >>> case SDEV_QUIESCE: >>> case SDEV_BLOCK: >>> case SDEV_CREATED: >>> @@ -2160,6 +2166,8 @@ scsi_device_set_state(struct scsi_device *sdev, enum scsi_device_state state) >>> >>> } >>> sdev->sdev_state = state; >>> + if (change_evt) >>> + sdev_evt_send_simple(sdev, SDEV_EVT_STATE_RUNNING, GFP_ATOMIC); >>> return 0; >>> >>> illegal: >>> @@ -2283,6 +2291,7 @@ struct scsi_event *sdev_evt_alloc(enum scsi_device_event evt_type, >>> /* evt_type-specific initialization, if any */ >>> switch (evt_type) { >>> case SDEV_EVT_MEDIA_CHANGE: >>> + case SDEV_EVT_STATE_RUNNING: >>> default: >>> /* do nothing */ >>> break; >> Hmm. So we're only getting notified if the device switched to OFFLINE? > > No from one of the offlines to running. > I think I know what happened. Maybe you did not reivew all the patches at the same time. With all patches in the set applied we have this: scsi_device_set_state() ...... case SDEV_RUNNING: <- so we are going into running switch (oldstate) { case SDEV_OFFLINE: <- we were in one of the offlines case SDEV_TRANSPORT_OFFLINE: /* * Notify userspace we can accept IO by sending * change event. */ change_evt = 1; <- so we send evt for *offline to running transistions -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html