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? Weird. We'll get notified about this eventually anyway (aborting I/Os etc). I'd be more interested to get notified if the device becomes _available_ again, ie when entering RUNNING state. That's really hard to figure out without polling. Care to add the 'change_evt' thing to the SDEV_RUNNING case statement, too? Or am I missing something? Cheers, Hannes -- Dr. Hannes Reinecke zSeries & Storage hare@xxxxxxx +49 911 74053 688 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg) -- 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