aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/blkfront.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-05-12 11:01:21 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-05-12 11:01:21 +0100
commitc64bf46b1f0a75f057aeecef2b860d7d7fb9b8e6 (patch)
tree2e6a284b73486781b2822260bf4e3ea38e7c93cb /extras/mini-os/blkfront.c
parent8e3629845ce077e521067a2e1a243b0a681b6d24 (diff)
downloadxen-c64bf46b1f0a75f057aeecef2b860d7d7fb9b8e6.tar.gz
xen-c64bf46b1f0a75f057aeecef2b860d7d7fb9b8e6.tar.bz2
xen-c64bf46b1f0a75f057aeecef2b860d7d7fb9b8e6.zip
minios: free blkfront resources on error/shutdown
Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
Diffstat (limited to 'extras/mini-os/blkfront.c')
-rw-r--r--extras/mini-os/blkfront.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/extras/mini-os/blkfront.c b/extras/mini-os/blkfront.c
index 84914346f9..cb82228523 100644
--- a/extras/mini-os/blkfront.c
+++ b/extras/mini-os/blkfront.c
@@ -68,6 +68,21 @@ void blkfront_handler(evtchn_port_t port, struct pt_regs *regs, void *data)
wake_up(&blkfront_queue);
}
+static void free_blkfront(struct blkfront_dev *dev)
+{
+ mask_evtchn(dev->evtchn);
+
+ free(dev->backend);
+
+ gnttab_end_access(dev->ring_ref);
+ free_page(dev->ring.sring);
+
+ unbind_evtchn(dev->evtchn);
+
+ free(dev->nodename);
+ free(dev);
+}
+
struct blkfront_dev *init_blkfront(char *nodename, struct blkfront_info *info)
{
xenbus_transaction_t xbt;
@@ -88,6 +103,7 @@ struct blkfront_dev *init_blkfront(char *nodename, struct blkfront_info *info)
printk("******************* BLKFRONT for %s **********\n\n\n", nodename);
dev = malloc(sizeof(*dev));
+ memset(dev, 0, sizeof(*dev));
dev->nodename = strdup(nodename);
snprintf(path, sizeof(path), "%s/backend-id", nodename);
@@ -139,7 +155,7 @@ again:
abort_transaction:
xenbus_transaction_end(xbt, 1, &retry);
- return NULL;
+ goto error;
done:
@@ -147,7 +163,7 @@ done:
msg = xenbus_read(XBT_NIL, path, &dev->backend);
if (msg) {
printk("Error %s when reading the backend path %s\n", msg, path);
- return NULL;
+ goto error;
}
printk("backend at %s\n", dev->backend);
@@ -160,7 +176,7 @@ done:
msg = xenbus_read(XBT_NIL, path, &c);
if (msg) {
printk("Error %s when reading the mode\n", msg);
- return NULL;
+ goto error;
}
if (*c == 'w')
dev->info.mode = O_RDWR;
@@ -198,6 +214,10 @@ done:
printk("**************************\n");
return dev;
+
+error:
+ free_blkfront(dev);
+ return NULL;
}
void shutdown_blkfront(struct blkfront_dev *dev)
@@ -220,11 +240,7 @@ void shutdown_blkfront(struct blkfront_dev *dev)
xenbus_unwatch_path(XBT_NIL, path);
- unbind_evtchn(dev->evtchn);
-
- free(nodename);
- free(dev->backend);
- free(dev);
+ free_blkfront(dev);
}
static void blkfront_wait_slot(struct blkfront_dev *dev)