# 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
|