[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [linux-2.6.18-xen] pvSCSI: Fix some aspects of attach/detach functionality



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1215505834 -3600
# Node ID 132bae41625ff2bb9f48c65bf643c462093d455d
# Parent  92247f7e5d8ab7f64c7e0ed9c1c8afe8a9abf46d
pvSCSI: Fix some aspects of attach/detach functionality

Signed-off-by: Tomonari Horikoshi <t.horikoshi@xxxxxxxxxxxxxx>
Signed-off-by: Jun Kamada <kama@xxxxxxxxxxxxxx>
---
 drivers/xen/scsiback/xenbus.c  |   97 ++++++++++++-----------------------------
 drivers/xen/scsifront/xenbus.c |   16 ++----
 2 files changed, 35 insertions(+), 78 deletions(-)

diff -r 92247f7e5d8a -r 132bae41625f drivers/xen/scsiback/xenbus.c
--- a/drivers/xen/scsiback/xenbus.c     Tue Jul 08 09:29:42 2008 +0100
+++ b/drivers/xen/scsiback/xenbus.c     Tue Jul 08 09:30:34 2008 +0100
@@ -104,51 +104,23 @@ struct scsi_device *scsiback_get_scsi_de
        if (IS_ERR(shost)) {
                printk(KERN_ERR "scsiback: host%d doesn't exist.\n",
                        phy->hst);
-               goto invald_value;
+               return NULL;
        }
        sdev   = scsi_device_lookup(shost, phy->chn, phy->tgt, phy->lun);
        if (!sdev) {
                printk(KERN_ERR "scsiback: %d:%d:%d:%d doesn't exist.\n",
                        phy->hst, phy->chn, phy->tgt, phy->lun);
-               goto invald_value;
+               scsi_host_put(shost);
+               return NULL;
        }
 
        scsi_host_put(shost);
-invald_value:
        return (sdev);
 }
 
 #define VSCSIBACK_OP_ADD_OR_DEL_LUN    1
 #define VSCSIBACK_OP_UPDATEDEV_STATE   2
 
-static int scsiback_change_device_state(struct xenbus_device *dev,
-                       char *state_path, enum xenbus_state set_state)
-{
-       struct xenbus_transaction tr;
-       int err;
-       
-       do {
-               err = xenbus_transaction_start(&tr);
-               if (err != 0) { 
-                       printk(KERN_ERR "scsiback: transaction start failed\n");
-                       return err;
-               }
-               err = xenbus_printf(tr, dev->nodename, state_path, 
-                                   "%d", set_state);
-               if (err != 0) {
-                       printk(KERN_ERR "scsiback: xenbus_printf failed\n");
-                       xenbus_transaction_end(tr, 1);
-                       return err;
-               }
-               err = xenbus_transaction_end(tr, 0);
-       } while (err == -EAGAIN);
-       
-       if (err != 0) {
-               printk(KERN_ERR "scsiback: failed to end %s.\n", __FUNCTION__);
-               return err;
-       }
-       return 0;       
-}
 
 static void scsiback_do_lun_hotplug(struct backend_info *be, int op)
 {
@@ -160,8 +132,6 @@ static void scsiback_do_lun_hotplug(stru
        unsigned int dir_n = 0;
        struct xenbus_device *dev = be->dev;
        struct scsi_device *sdev;
-       struct xenbus_transaction xbt;
-
 
        dir = xenbus_directory(XBT_NIL, dev->nodename, "vscsi-devs", &dir_n);
        if (IS_ERR(dir))
@@ -181,8 +151,8 @@ static void scsiback_do_lun_hotplug(stru
                err = xenbus_scanf(XBT_NIL, dev->nodename, str,
                        "%u:%u:%u:%u", &phy.hst, &phy.chn, &phy.tgt, &phy.lun);
                if (XENBUS_EXIST_ERR(err)) {
-                       xenbus_printf(xbt, dev->nodename, state_str,
-                                       "%d", XenbusStateClosing);
+                       xenbus_printf(XBT_NIL, dev->nodename, state_str,
+                                       "%d", XenbusStateClosed);
                        continue;
                }
 
@@ -191,8 +161,8 @@ static void scsiback_do_lun_hotplug(stru
                err = xenbus_scanf(XBT_NIL, dev->nodename, str,
                        "%u:%u:%u:%u", &vir.hst, &vir.chn, &vir.tgt, &vir.lun);
                if (XENBUS_EXIST_ERR(err)) {
-                       xenbus_printf(xbt, dev->nodename, state_str,
-                                       "%d", XenbusStateClosing);
+                       xenbus_printf(XBT_NIL, dev->nodename, state_str,
+                                       "%d", XenbusStateClosed);
                        continue;
                }
 
@@ -200,36 +170,30 @@ static void scsiback_do_lun_hotplug(stru
                case VSCSIBACK_OP_ADD_OR_DEL_LUN:
                        if (device_state == XenbusStateInitialising) {
                                sdev = scsiback_get_scsi_device(&phy);
-                               if (!sdev) {
-                                       err = scsiback_change_device_state(dev,
-                                               state_str, XenbusStateClosing);
-                                       if (err)
-                                               goto fail;
-                               } else {
+                               if (!sdev)
+                                       xenbus_printf(XBT_NIL, dev->nodename, 
state_str, 
+                                                           "%d", 
XenbusStateClosed);
+                               else {
                                        err = 
scsiback_add_translation_entry(be->info, sdev, &vir);
                                        if (!err) {
-                                               err = 
scsiback_change_device_state(dev,
-                                                       state_str, 
XenbusStateInitialised);
-                                               if (err)
-                                                       goto fail;
+                                               if (xenbus_printf(XBT_NIL, 
dev->nodename, state_str, 
+                                                                   "%d", 
XenbusStateInitialised)) {
+                                                       printk(KERN_ERR 
"scsiback: xenbus_printf error %s\n", state_str);
+                                                       
scsiback_del_translation_entry(be->info, &vir);
+                                               }
                                        } else {
-                                               err = 
scsiback_change_device_state(dev,
-                                                       state_str, 
XenbusStateClosing);
-                                               if (err)
-                                                       goto fail;
+                                               scsi_device_put(sdev);
+                                               xenbus_printf(XBT_NIL, 
dev->nodename, state_str, 
+                                                                   "%d", 
XenbusStateClosed);
                                        }
                                }
                        }
 
                        if (device_state == XenbusStateClosing) {
-                               err = scsiback_del_translation_entry(be->info, 
&vir);
-                               if (err)
-                                       goto fail;
-                               else {
-                                       err = scsiback_change_device_state(dev,
-                                               state_str, XenbusStateClosed);
-                                       if (err)
-                                               goto fail;
+                               if (!scsiback_del_translation_entry(be->info, 
&vir)) {
+                                       if (xenbus_printf(XBT_NIL, 
dev->nodename, state_str, 
+                                                           "%d", 
XenbusStateClosed))
+                                               printk(KERN_ERR "scsiback: 
xenbus_printf error %s\n", state_str);
                                }
                        }
                        break;
@@ -237,10 +201,13 @@ static void scsiback_do_lun_hotplug(stru
                case VSCSIBACK_OP_UPDATEDEV_STATE:
                        if (device_state == XenbusStateInitialised) {
                                /* modify vscsi-devs/dev-x/state */
-                               err = scsiback_change_device_state(dev,
-                                       state_str, XenbusStateConnected);
-                               if (err)
-                                       goto fail;
+                               if (xenbus_printf(XBT_NIL, dev->nodename, 
state_str, 
+                                                   "%d", 
XenbusStateConnected)) {
+                                       printk(KERN_ERR "scsiback: 
xenbus_printf error %s\n", state_str);
+                                       
scsiback_del_translation_entry(be->info, &vir);
+                                       xenbus_printf(XBT_NIL, dev->nodename, 
state_str, 
+                                                           "%d", 
XenbusStateClosed);
+                               }
                        }
                        break;
                /*When it is necessary, processing is added here.*/
@@ -251,10 +218,6 @@ static void scsiback_do_lun_hotplug(stru
 
        kfree(dir);
        return ;
-fail :
-       kfree(dir);
-       xenbus_dev_fatal(dev, err, "read or write %s ", str);
-       return;
 }
 
 
diff -r 92247f7e5d8a -r 132bae41625f drivers/xen/scsifront/xenbus.c
--- a/drivers/xen/scsifront/xenbus.c    Tue Jul 08 09:29:42 2008 +0100
+++ b/drivers/xen/scsifront/xenbus.c    Tue Jul 08 09:30:34 2008 +0100
@@ -100,13 +100,13 @@ static int scsifront_alloc_ring(struct v
 
        if (err <= 0) {
                xenbus_dev_fatal(dev, err, "bind_listening_port_to_irqhandler");
-               goto fail;
+               goto free_sring;
        }
        info->irq = err;
 
        return 0;
-fail:
-       /* free resource */
+
+/* free resource */
 free_sring:
        scsifront_free(info);
 
@@ -298,14 +298,14 @@ static void scsifront_do_lun_hotplug(str
                err = xenbus_scanf(XBT_NIL, dev->otherend, str, "%u",
                        &device_state);
                if (XENBUS_EXIST_ERR(err))
-                       goto fail;
+                       continue;
                
                /* virtual SCSI device */
                snprintf(str, sizeof(str), "vscsi-devs/%s/v-dev", dir[i]);
                err = xenbus_scanf(XBT_NIL, dev->otherend, str,
                        "%u:%u:%u:%u", &hst, &chn, &tgt, &lun);
                if (XENBUS_EXIST_ERR(err))
-                       goto fail;
+                       continue;
 
                /* front device state path */
                snprintf(state_str, sizeof(state_str), "vscsi-devs/%s/state", 
dir[i]);
@@ -338,17 +338,11 @@ static void scsifront_do_lun_hotplug(str
                        }
                        break;
                default:
-                       goto fail;
                        break;
                }
        }
        
        kfree(dir);
-       return;
-
-fail:
-       kfree(dir);
-       xenbus_dev_fatal(dev, err, "read or write %s ", str);
        return;
 }
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.