]> xenbits.xensource.com Git - legacy/linux-2.6.18-xen.git/commitdiff
xenbus: allow any xenbus command over /proc/xen/xenbus.
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 19 May 2009 13:28:48 +0000 (14:28 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 19 May 2009 13:28:48 +0000 (14:28 +0100)
Signed-off-by: Diego Ongaro <diego.ongaro@citrix.com>
Signed-off-by: Alex Zeffertt <alex.zeffertt@eu.citrix.com>
Signed-off-by: Keir Fraser <keir.fraser@eu.citrix.com>
drivers/xen/xenbus/xenbus_dev.c

index b72c537f9e02b46937ea24f458ef62fee76e7448..ba2cacfdc6c32b9838024790ebf944f08eeae928 100644 (file)
@@ -224,50 +224,6 @@ static ssize_t xenbus_dev_write(struct file *filp,
        msg_type = u->u.msg.type;
 
        switch (msg_type) {
-       case XS_TRANSACTION_START:
-       case XS_TRANSACTION_END:
-       case XS_DIRECTORY:
-       case XS_READ:
-       case XS_GET_PERMS:
-       case XS_RELEASE:
-       case XS_GET_DOMAIN_PATH:
-       case XS_WRITE:
-       case XS_MKDIR:
-       case XS_RM:
-       case XS_SET_PERMS:
-               if (msg_type == XS_TRANSACTION_START) {
-                       trans = kmalloc(sizeof(*trans), GFP_KERNEL);
-                       if (!trans) {
-                               rc = -ENOMEM;
-                               goto out;
-                       }
-               }
-
-               reply = xenbus_dev_request_and_reply(&u->u.msg);
-               if (IS_ERR(reply)) {
-                       kfree(trans);
-                       rc = PTR_ERR(reply);
-                       goto out;
-               }
-
-               if (msg_type == XS_TRANSACTION_START) {
-                       trans->handle.id = simple_strtoul(reply, NULL, 0);
-                       list_add(&trans->list, &u->transactions);
-               } else if (msg_type == XS_TRANSACTION_END) {
-                       list_for_each_entry(trans, &u->transactions, list)
-                               if (trans->handle.id == u->u.msg.tx_id)
-                                       break;
-                       BUG_ON(&trans->list == &u->transactions);
-                       list_del(&trans->list);
-                       kfree(trans);
-               }
-               mutex_lock(&u->reply_mutex);
-               queue_reply(u, (char *)&u->u.msg, sizeof(u->u.msg));
-               queue_reply(u, (char *)reply, u->u.msg.len);
-               mutex_unlock(&u->reply_mutex);
-               kfree(reply);
-               break;
-
        case XS_WATCH:
        case XS_UNWATCH: {
                static const char *XS_RESP = "OK";
@@ -323,7 +279,37 @@ static ssize_t xenbus_dev_write(struct file *filp,
        }
 
        default:
-               rc = -EINVAL;
+               if (msg_type == XS_TRANSACTION_START) {
+                       trans = kmalloc(sizeof(*trans), GFP_KERNEL);
+                       if (!trans) {
+                               rc = -ENOMEM;
+                               goto out;
+                       }
+               }
+
+               reply = xenbus_dev_request_and_reply(&u->u.msg);
+               if (IS_ERR(reply)) {
+                       kfree(trans);
+                       rc = PTR_ERR(reply);
+                       goto out;
+               }
+
+               if (msg_type == XS_TRANSACTION_START) {
+                       trans->handle.id = simple_strtoul(reply, NULL, 0);
+                       list_add(&trans->list, &u->transactions);
+               } else if (msg_type == XS_TRANSACTION_END) {
+                       list_for_each_entry(trans, &u->transactions, list)
+                               if (trans->handle.id == u->u.msg.tx_id)
+                                       break;
+                       BUG_ON(&trans->list == &u->transactions);
+                       list_del(&trans->list);
+                       kfree(trans);
+               }
+               mutex_lock(&u->reply_mutex);
+               queue_reply(u, (char *)&u->u.msg, sizeof(u->u.msg));
+               queue_reply(u, (char *)reply, u->u.msg.len);
+               mutex_unlock(&u->reply_mutex);
+               kfree(reply);
                break;
        }