xen: scsiback: add LUN of restored domain
authorJuergen Gross <jgross@suse.com>
Tue, 17 Feb 2015 07:02:48 +0000 (08:02 +0100)
committerDavid Vrabel <david.vrabel@citrix.com>
Mon, 16 Mar 2015 14:49:15 +0000 (14:49 +0000)
When a xen domain is being restored the LUN state of a pvscsi device
is "Connected" and not "Initialising" as in case of attaching a new
pvscsi LUN.

This must be taken into account when adding a new pvscsi device for
a domain as otherwise the pvscsi LUN won't be connected to the
SCSI target associated with it.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
drivers/xen/xen-scsiback.c

index d0b0bc5493559ef6051fe8b2511bfc3ba24c721a..2eab75892c23b704ba5808ae9efe9cb4d7c75a29 100644 (file)
@@ -990,7 +990,7 @@ found:
 }
 
 static void scsiback_do_add_lun(struct vscsibk_info *info, const char *state,
-                               char *phy, struct ids_tuple *vir)
+                               char *phy, struct ids_tuple *vir, int try)
 {
        if (!scsiback_add_translation_entry(info, phy, vir)) {
                if (xenbus_printf(XBT_NIL, info->dev->nodename, state,
@@ -998,7 +998,7 @@ static void scsiback_do_add_lun(struct vscsibk_info *info, const char *state,
                        pr_err("xenbus_printf error %s\n", state);
                        scsiback_del_translation_entry(info, vir);
                }
-       } else {
+       } else if (!try) {
                xenbus_printf(XBT_NIL, info->dev->nodename, state,
                              "%d", XenbusStateClosed);
        }
@@ -1058,10 +1058,19 @@ static void scsiback_do_1lun_hotplug(struct vscsibk_info *info, int op,
 
        switch (op) {
        case VSCSIBACK_OP_ADD_OR_DEL_LUN:
-               if (device_state == XenbusStateInitialising)
-                       scsiback_do_add_lun(info, state, phy, &vir);
-               if (device_state == XenbusStateClosing)
+               switch (device_state) {
+               case XenbusStateInitialising:
+                       scsiback_do_add_lun(info, state, phy, &vir, 0);
+                       break;
+               case XenbusStateConnected:
+                       scsiback_do_add_lun(info, state, phy, &vir, 1);
+                       break;
+               case XenbusStateClosing:
                        scsiback_do_del_lun(info, state, &vir);
+                       break;
+               default:
+                       break;
+               }
                break;
 
        case VSCSIBACK_OP_UPDATEDEV_STATE: