block/rnbd-clt: Generate kobject_uevent when the rnbd device state changes
authorMd Haris Iqbal <haris.iqbal@cloud.ionos.com>
Mon, 19 Apr 2021 07:37:19 +0000 (09:37 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 20 Apr 2021 14:59:04 +0000 (08:59 -0600)
When an RTRS session state changes, the transport layer generates an event
to RNBD. Then RNBD will change the state of the RNBD client device
accordingly.

This commit add kobject_uevent when the RNBD device state changes. With
this udev rules can be configured to react accordingly.

Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
Link: https://lore.kernel.org/r/20210419073722.15351-17-gi-oh.kim@ionos.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/rnbd/rnbd-clt-sysfs.c
drivers/block/rnbd/rnbd-clt.c

index 2b6305e..f3a5a62 100644 (file)
@@ -490,6 +490,7 @@ static int rnbd_clt_add_dev_kobj(struct rnbd_clt_dev *dev)
                              ret);
                kobject_put(&dev->kobj);
        }
+       kobject_uevent(gd_kobj, KOBJ_ONLINE);
 
        return ret;
 }
index ea98124..01f67e0 100644 (file)
@@ -110,6 +110,7 @@ static int rnbd_clt_change_capacity(struct rnbd_clt_dev *dev,
 static int process_msg_open_rsp(struct rnbd_clt_dev *dev,
                                struct rnbd_msg_open_rsp *rsp)
 {
+       struct kobject *gd_kobj;
        int err = 0;
 
        mutex_lock(&dev->lock);
@@ -128,6 +129,8 @@ static int process_msg_open_rsp(struct rnbd_clt_dev *dev,
                 */
                if (dev->nsectors != nsectors)
                        rnbd_clt_change_capacity(dev, nsectors);
+               gd_kobj = &disk_to_dev(dev->gd)->kobj;
+               kobject_uevent(gd_kobj, KOBJ_ONLINE);
                rnbd_clt_info(dev, "Device online, device remapped successfully\n");
        }
        err = rnbd_clt_set_dev_attr(dev, rsp);
@@ -649,14 +652,18 @@ put_iu:
 static void set_dev_states_to_disconnected(struct rnbd_clt_session *sess)
 {
        struct rnbd_clt_dev *dev;
+       struct kobject *gd_kobj;
 
        mutex_lock(&sess->lock);
        list_for_each_entry(dev, &sess->devs_list, list) {
                rnbd_clt_err(dev, "Device disconnected.\n");
 
                mutex_lock(&dev->lock);
-               if (dev->dev_state == DEV_STATE_MAPPED)
+               if (dev->dev_state == DEV_STATE_MAPPED) {
                        dev->dev_state = DEV_STATE_MAPPED_DISCONNECTED;
+                       gd_kobj = &disk_to_dev(dev->gd)->kobj;
+                       kobject_uevent(gd_kobj, KOBJ_OFFLINE);
+               }
                mutex_unlock(&dev->lock);
        }
        mutex_unlock(&sess->lock);