]> Pileus Git - ~andy/linux/blobdiff - drivers/xen/evtchn.c
mac80211: disallow changing auto_open_plinks
[~andy/linux] / drivers / xen / evtchn.c
index b1f60a0c0bea3e00627293101fd3dd38bb1fd96e..45c8efaa6b3ea1035a1c560c403ad924f9d9e8ad 100644 (file)
@@ -269,6 +269,14 @@ static int evtchn_bind_to_user(struct per_user_data *u, int port)
                                       u->name, (void *)(unsigned long)port);
        if (rc >= 0)
                rc = evtchn_make_refcounted(port);
+       else {
+               /* bind failed, should close the port now */
+               struct evtchn_close close;
+               close.port = port;
+               if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0)
+                       BUG();
+               set_port_user(port, NULL);
+       }
 
        return rc;
 }
@@ -277,6 +285,8 @@ static void evtchn_unbind_from_user(struct per_user_data *u, int port)
 {
        int irq = irq_from_evtchn(port);
 
+       BUG_ON(irq < 0);
+
        unbind_from_irqhandler(irq, (void *)(unsigned long)port);
 
        set_port_user(port, NULL);
@@ -534,10 +544,10 @@ static int __init evtchn_init(void)
 
        spin_lock_init(&port_user_lock);
 
-       /* Create '/dev/misc/evtchn'. */
+       /* Create '/dev/xen/evtchn'. */
        err = misc_register(&evtchn_miscdev);
        if (err != 0) {
-               printk(KERN_ALERT "Could not register /dev/misc/evtchn\n");
+               printk(KERN_ERR "Could not register /dev/xen/evtchn\n");
                return err;
        }