scsi: make 'state' device attribute pollable
authorHannes Reinecke <hare@suse.de>
Fri, 11 Aug 2017 06:53:47 +0000 (08:53 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 25 Aug 2017 02:28:53 +0000 (22:28 -0400)
While the 'state' attribute can (and will) change occasionally,
calling 'poll()' or 'select()' on it fails as sysfs is never
notified that the state has changed.
With this patch calling 'poll()' or 'select()' will work
properly.

Signed-off-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/scsi_lib.c
drivers/scsi/scsi_transport_srp.c

index 4a295a630848f49fcf7377cc101844ac645ba54a..2afca92445c9d7614fa6ff50d69960888206e435 100644 (file)
@@ -2654,6 +2654,7 @@ scsi_device_set_state(struct scsi_device *sdev, enum scsi_device_state state)
 
        }
        sdev->sdev_state = state;
+       sysfs_notify(&sdev->sdev_gendev.kobj, NULL, "state");
        return 0;
 
  illegal:
@@ -3077,6 +3078,7 @@ int scsi_internal_device_unblock_nowait(struct scsi_device *sdev,
        case SDEV_BLOCK:
        case SDEV_TRANSPORT_OFFLINE:
                sdev->sdev_state = new_state;
+               sysfs_notify(&sdev->sdev_gendev.kobj, NULL, "state");
                break;
        case SDEV_CREATED_BLOCK:
                if (new_state == SDEV_TRANSPORT_OFFLINE ||
@@ -3084,6 +3086,7 @@ int scsi_internal_device_unblock_nowait(struct scsi_device *sdev,
                        sdev->sdev_state = new_state;
                else
                        sdev->sdev_state = SDEV_CREATED;
+               sysfs_notify(&sdev->sdev_gendev.kobj, NULL, "state");
                break;
        case SDEV_CANCEL:
        case SDEV_OFFLINE:
index f617021c94f740e6dd8fe8ac2526405a4319c6d2..698cc4681706017e5454a9519706bdb4ea2d47af 100644 (file)
@@ -556,8 +556,11 @@ int srp_reconnect_rport(struct srp_rport *rport)
                 */
                shost_for_each_device(sdev, shost) {
                        mutex_lock(&sdev->state_mutex);
-                       if (sdev->sdev_state == SDEV_OFFLINE)
+                       if (sdev->sdev_state == SDEV_OFFLINE) {
                                sdev->sdev_state = SDEV_RUNNING;
+                               sysfs_notify(&sdev->sdev_gendev.kobj,
+                                            NULL, "state");
+                       }
                        mutex_unlock(&sdev->state_mutex);
                }
        } else if (rport->state == SRP_RPORT_RUNNING) {