[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] Add an ioctl interface for simple xenstore access


  • To: Xen Developers <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • From: Dan Smith <danms@xxxxxxxxxx>
  • Date: Fri, 17 Mar 2006 14:33:36 -0800
  • Delivery-date: Fri, 17 Mar 2006 22:34:35 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

This patch adds an ioctl interface to /proc/xen/xenbus to allow simple
access to xenstore from domU.  This patch introduces only
xenbus_read() support, but write, remove, etc could be easily added.
Also, this interface can be easily moved to /dev/xen/xenbus (or
something similar) later.

The following snippet of a C program provides easy access to xenstore
nodes from inside a domU:

  #include <xen/io/xenbus.h>
  
  int main(int argc, char **argv)
  {
          int fd;
          int ret;
          struct xenbus_ioctl param;
  
          fd = open("/proc/xen/xenbus", O_RDWR);
  
          strcpy(param.path, argv[1]);
          ret = ioctl(fd, 0, &param);
  
          printf("%s\n", param.value);
  }

Comments welcome, of course ;)

# HG changeset patch
# User Dan Smith <danms@xxxxxxxxxx>
# Node ID c01070e1dbed9f19098431fd82120960695f5240
# Parent  96ba0a2bc9de7da1c70a2528481f7448f3a9524d
Add a preliminary ioctl interface to xenbus.
This patch adds an ioctl interface to /proc/xen/xenbus to allow simple
access to xenstore from domU.  This patch introduces only xenbus_read()
support, but write, remove, etc could be easily added.  Also, this
interface can be easily moved to /dev/xen/xenbus (or something similar)
later.

Signed-off-by: Dan Smith <danms@xxxxxxxxxx>

diff -r 96ba0a2bc9de -r c01070e1dbed 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c      Wed Mar 15 
13:35:43 2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c      Fri Mar 17 
14:27:23 2006 -0800
@@ -208,11 +208,63 @@ static int xenbus_dev_release(struct ino
        return 0;
 }
 
+static int xenbus_dev_ioctl(struct inode *inode, struct file *filp,
+                           unsigned int cmd, unsigned long arg)
+{
+       void *output;
+       struct xenbus_ioctl *param;
+       unsigned int len;
+       int ret = 0;
+
+       if (!access_ok(VERIFY_WRITE, (void __user *)arg, sizeof(param))) 
+               return -EACCES;
+       
+       param = kmalloc(sizeof(*param), GFP_KERNEL);
+       if (param == NULL)
+               return -ENOMEM;
+
+       if (copy_from_user(param, (void *)arg, sizeof(*param))) {
+               ret = -EACCES;
+               goto out;
+       }
+       
+       param->path[XENBUS_IOCTL_ARG_LEN - 1] = '\0';
+
+       switch (cmd) {
+       case XEN_XENBUS_IOCTL_READ:
+               
+               output = (char *)xenbus_read(XBT_NULL, param->path, "", &len);
+               
+               if (IS_ERR(output)) {
+                       ret = -EINVAL;
+                       goto out;
+               }
+               
+               strncpy(param->value, output, XENBUS_IOCTL_ARG_LEN);
+               param->value_len = len;
+               break;
+
+       default:
+               ret = -EINVAL;
+               goto out;
+       }
+
+       if (copy_to_user((void*)arg, param, sizeof(*param))) {
+               ret = -EACCES;
+               goto out;
+       }
+
+ out:
+       kfree(param);
+       return ret;
+}
+
 static struct file_operations xenbus_dev_file_ops = {
        .read = xenbus_dev_read,
        .write = xenbus_dev_write,
        .open = xenbus_dev_open,
        .release = xenbus_dev_release,
+       .ioctl = xenbus_dev_ioctl,
 };
 
 static int __init
diff -r 96ba0a2bc9de -r c01070e1dbed xen/include/public/io/xenbus.h
--- a/xen/include/public/io/xenbus.h    Wed Mar 15 13:35:43 2006 +0100
+++ b/xen/include/public/io/xenbus.h    Fri Mar 17 14:27:23 2006 -0800
@@ -29,6 +29,18 @@ typedef enum
 
 } XenbusState;
 
+/*
+ * XenBus ioctl support
+ */
+#define XENBUS_IOCTL_ARG_LEN 256
+struct xenbus_ioctl {
+       char path[XENBUS_IOCTL_ARG_LEN];
+       char value[XENBUS_IOCTL_ARG_LEN];
+       uint32_t value_len;
+};
+
+#define XEN_XENBUS_IOCTL_READ 0
+
 #endif /* _XEN_PUBLIC_IO_XENBUS_H */
 
 /*
-- 
Dan Smith
IBM Linux Technology Center
Open Hypervisor Team
email: danms@xxxxxxxxxx

Attachment: pgpEpWcmLE_Bt.pgp
Description: PGP signature

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.