aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir@xen.org>2010-12-03 06:37:48 +0000
committerKeir Fraser <keir@xen.org>2010-12-03 06:37:48 +0000
commitd5c277ab26f7fbb64b8b1d09b9dc328212cd2988 (patch)
treea929a95e433cc1dc1b3f56043c95684421879331
parentbc20e3f30fbfc5cdebc0cd47d31abb77ad63c298 (diff)
downloadxen-d5c277ab26f7fbb64b8b1d09b9dc328212cd2988.tar.gz
xen-d5c277ab26f7fbb64b8b1d09b9dc328212cd2988.tar.bz2
xen-d5c277ab26f7fbb64b8b1d09b9dc328212cd2988.zip
minios: reverse layering of xc vs minios fd close
Having minios close() call back into the libxc core close routines is backwards and unexpected. On every other OS the libxc core close routine calls close(). Export minios specific functions from the minios libxc code to implement fd closing for each type of xc file handle and simply call close() in the core close routine. Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
-rw-r--r--extras/mini-os/lib/sys.c13
-rw-r--r--tools/libxc/xc_minios.c32
2 files changed, 30 insertions, 15 deletions
diff --git a/extras/mini-os/lib/sys.c b/extras/mini-os/lib/sys.c
index 42681742b8..b127996df5 100644
--- a/extras/mini-os/lib/sys.c
+++ b/extras/mini-os/lib/sys.c
@@ -83,10 +83,9 @@
}
#define NOFILE 32
-extern int xc_evtchn_close(int fd);
-struct xc_interface;
-extern int xc_interface_close_core(struct xc_interface*, int fd);
-extern int xc_gnttab_close(int fd);
+extern void minios_interface_close_fd(int fd);
+extern void minios_evtchn_close_fd(int fd);
+extern void minios_gnttab_close_fd(int fd);
pthread_mutex_t fd_lock = PTHREAD_MUTEX_INITIALIZER;
struct file files[NOFILE] = {
@@ -414,13 +413,13 @@ int close(int fd)
}
#endif
case FTYPE_XC:
- xc_interface_close_core(0,fd);
+ minios_interface_close_fd(fd);
return 0;
case FTYPE_EVTCHN:
- xc_evtchn_close(fd);
+ minios_evtchn_close_fd(fd);
return 0;
case FTYPE_GNTMAP:
- xc_gnttab_close(fd);
+ minios_gnttab_close_fd(fd);
return 0;
case FTYPE_TAP:
shutdown_netfront(files[fd].tap.dev);
diff --git a/tools/libxc/xc_minios.c b/tools/libxc/xc_minios.c
index 60f28d36fc..774e1debc6 100644
--- a/tools/libxc/xc_minios.c
+++ b/tools/libxc/xc_minios.c
@@ -40,6 +40,10 @@
#include "xc_private.h"
+void minios_interface_close_fd(int fd);
+void minios_evtchn_close_fd(int fd);
+void minios_gnttab_close_fd(int fd);
+
extern struct wait_queue_head event_queue;
int xc_interface_open_core(xc_interface *xch)
@@ -49,8 +53,12 @@ int xc_interface_open_core(xc_interface *xch)
int xc_interface_close_core(xc_interface *xch, int fd)
{
+ return close(fd);
+}
+
+void minios_interface_close_fd(int fd)
+{
files[fd].type = FTYPE_NONE;
- return 0;
}
void *xc_map_foreign_bulk(xc_interface *xch, uint32_t dom, int prot,
@@ -174,12 +182,16 @@ int xc_evtchn_open(void)
int xc_evtchn_close(int xce_handle)
{
+ return close(xce_handle);
+}
+
+void minios_evtchn_close_fd(int fd)
+{
int i;
for (i = 0; i < MAX_EVTCHN_PORTS; i++)
- if (files[xce_handle].evtchn.ports[i].bound)
- unbind_evtchn(files[xce_handle].evtchn.ports[i].port);
- files[xce_handle].type = FTYPE_NONE;
- return 0;
+ if (files[fd].evtchn.ports[i].bound)
+ unbind_evtchn(files[fd].evtchn.ports[i].port);
+ files[fd].type = FTYPE_NONE;
}
int xc_evtchn_fd(int xce_handle)
@@ -370,9 +382,13 @@ int xc_gnttab_open(xc_interface *xch)
int xc_gnttab_close(xc_interface *xch, int xcg_handle)
{
- gntmap_fini(&files[xcg_handle].gntmap);
- files[xcg_handle].type = FTYPE_NONE;
- return 0;
+ return close(xcg_handle);
+}
+
+void minios_gnttab_close_fd(int fd)
+{
+ gntmap_fini(&files[fd].gntmap);
+ files[fd].type = FTYPE_NONE;
}
void *xc_gnttab_map_grant_ref(xc_interface *xch, int xcg_handle,