From mboxrd@z Thu Jan 1 00:00:00 1970 From: Samuel Thibault Subject: Re: [PATCH] minios: free fbfront resources on error/shutdown Date: Mon, 12 May 2008 14:16:11 +0200 Message-ID: <20080512121611.GE6714@implementation.home> References: <20080512101146.GD5753@implementation.visiteurs.inrialpes.fr> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Return-path: Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Keir Fraser Cc: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org Keir Fraser, le Mon 12 May 2008 11:17:47 +0100, a =E9crit : > Doesn't apply to xen-unstable tip c/s 17616. Here is a fixed patch minios: free fbfront resources on error/shutdown Signed-off-by: Samuel Thibault diff -r 2d8d5b7ada6f extras/mini-os/fbfront.c --- a/extras/mini-os/fbfront.c Mon May 12 14:14:45 2008 +0200 +++ b/extras/mini-os/fbfront.c Mon May 12 14:15:31 2008 +0200 @@ -47,6 +47,20 @@ files[fd].read =3D 1; #endif wake_up(&kbdfront_queue); +} + +static void free_kbdfront(struct kbdfront_dev *dev) +{ + mask_evtchn(dev->evtchn); + + free(dev->backend); + + free_page(dev->page); + + unbind_evtchn(dev->evtchn); + + free(dev->nodename); + free(dev); } =20 struct kbdfront_dev *init_kbdfront(char *nodename, int abs_pointer) @@ -122,7 +136,7 @@ =20 abort_transaction: xenbus_transaction_end(xbt, 1, &retry); - return NULL; + goto error; =20 done: =20 @@ -130,7 +144,7 @@ msg =3D 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; } =20 printk("backend at %s\n", dev->backend); @@ -153,6 +167,9 @@ printk("************************** KBDFRONT\n"); =20 return dev; +error: + free_kbdfront(dev); + return NULL; } =20 int kbdfront_receive(struct kbdfront_dev *dev, union xenkbd_in_event *bu= f, int n) @@ -208,12 +225,7 @@ =20 xenbus_unwatch_path(XBT_NIL, path); =20 - unbind_evtchn(dev->evtchn); - - free_page(dev->page); - free(nodename); - free(dev->backend); - free(dev); + free_kbdfront(dev); } =20 #ifdef HAVE_LIBC @@ -270,6 +282,20 @@ files[fd].read =3D 1; #endif wake_up(&fbfront_queue); +} + +static void free_fbfront(struct fbfront_dev *dev) +{ + mask_evtchn(dev->evtchn); + + free(dev->backend); + + free_page(dev->page); + + unbind_evtchn(dev->evtchn); + + free(dev->nodename); + free(dev); } =20 int fbfront_receive(struct fbfront_dev *dev, union xenfb_in_event *buf, = int n) @@ -401,7 +427,7 @@ =20 abort_transaction: xenbus_transaction_end(xbt, 1, &retry); - return NULL; + goto error; =20 done: =20 @@ -409,7 +435,7 @@ msg =3D 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; } =20 printk("backend at %s\n", dev->backend); @@ -435,6 +461,10 @@ printk("************************** FBFRONT\n"); =20 return dev; + +error: + free_fbfront(dev); + return NULL; } =20 static void fbfront_out_event(struct fbfront_dev *dev, union xenfb_out_e= vent *event) @@ -521,10 +551,7 @@ =20 unbind_evtchn(dev->evtchn); =20 - free_page(dev->page); - free(nodename); - free(dev->backend); - free(dev); + free_fbfront(dev); } =20 #ifdef HAVE_LIBC