fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / kernel / vserver / sysctl.c
index 32fde9a..e586bbd 100644 (file)
@@ -1,21 +1,20 @@
 /*
- *  linux/kernel/sysctl.c
+ *  kernel/vserver/sysctl.c
  *
  *  Virtual Context Support
  *
- *  Copyright (C) 2004  Herbert Pötzl
+ *  Copyright (C) 2004-2007  Herbert Pötzl
  *
  *  V0.01  basic structure
  *
  */
 
-#include <linux/config.h>
 #include <linux/errno.h>
-#include <linux/vserver.h>
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/ctype.h>
 #include <linux/sysctl.h>
+#include <linux/parser.h>
 #include <linux/fs.h>
 
 #include <asm/uaccess.h>
 #define CTL_VSERVER    4242    /* unused? */
 
 enum {
-        CTL_DEBUG_SWITCH = 1,
-        CTL_DEBUG_LIMIT,
-        CTL_DEBUG_DLIMIT,
+       CTL_DEBUG_ERROR         = 0,
+       CTL_DEBUG_SWITCH        = 1,
+       CTL_DEBUG_XID,
+       CTL_DEBUG_NID,
+       CTL_DEBUG_TAG,
+       CTL_DEBUG_NET,
+       CTL_DEBUG_LIMIT,
+       CTL_DEBUG_CRES,
+       CTL_DEBUG_DLIM,
+       CTL_DEBUG_QUOTA,
+       CTL_DEBUG_CVIRT,
+       CTL_DEBUG_MISC,
 };
 
 
-unsigned int vx_debug_switch = 0;
-unsigned int vx_debug_limit = 0;
-unsigned int vx_debug_dlimit = 0;
+unsigned int vx_debug_switch   = 0;
+unsigned int vx_debug_xid      = 0;
+unsigned int vx_debug_nid      = 0;
+unsigned int vx_debug_tag      = 0;
+unsigned int vx_debug_net      = 0;
+unsigned int vx_debug_limit    = 0;
+unsigned int vx_debug_cres     = 0;
+unsigned int vx_debug_dlim     = 0;
+unsigned int vx_debug_quota    = 0;
+unsigned int vx_debug_cvirt    = 0;
+unsigned int vx_debug_misc     = 0;
 
 
 static struct ctl_table_header *vserver_table_header;
@@ -44,12 +60,8 @@ void vserver_register_sysctl(void)
 {
        if (!vserver_table_header) {
                vserver_table_header = register_sysctl_table(vserver_table, 1);
-#ifdef CONFIG_PROC_FS
-//             if (vserver_table[0].de)
-//                     vserver_table[0].de->owner = THIS_MODULE;
-#endif
        }
-                       
+
 }
 
 void vserver_unregister_sysctl(void)
@@ -62,13 +74,13 @@ void vserver_unregister_sysctl(void)
 
 
 static int proc_dodebug(ctl_table *table, int write,
-       struct file *file, void *buffer, size_t *lenp)
+       struct file *filp, void __user *buffer, size_t *lenp, loff_t *ppos)
 {
        char            tmpbuf[20], *p, c;
        unsigned int    value;
        size_t          left, len;
 
-       if ((file->f_pos && !write) || !*lenp) {
+       if ((*ppos && !write) || !*lenp) {
                *lenp = 0;
                return 0;
        }
@@ -114,47 +126,117 @@ static int proc_dodebug(ctl_table *table, int write,
 
 done:
        *lenp -= left;
-       file->f_pos += *lenp;
+       *ppos += *lenp;
        return 0;
 }
-       
 
 
+#define        CTL_ENTRY(ctl, name)                            \
+       {                                               \
+               .ctl_name       = ctl,                  \
+               .procname       = #name,                \
+               .data           = &vx_##name,           \
+               .maxlen         = sizeof(int),          \
+               .mode           = 0644,                 \
+               .proc_handler   = &proc_dodebug         \
+       }
+
 static ctl_table debug_table[] = {
-        {
-                .ctl_name       = CTL_DEBUG_SWITCH,
-                .procname       = "debug_switch",
-                .data           = &vx_debug_switch,
-                .maxlen         = sizeof(int),
-                .mode           = 0644,
-                .proc_handler   = &proc_dodebug
-        },
-        {
-                .ctl_name       = CTL_DEBUG_LIMIT,
-                .procname       = "debug_limit",
-                .data           = &vx_debug_limit,
-                .maxlen         = sizeof(int),
-                .mode           = 0644,
-                .proc_handler   = &proc_dodebug
-        },
-        {
-                .ctl_name       = CTL_DEBUG_DLIMIT,
-                .procname       = "debug_dlimit",
-                .data           = &vx_debug_dlimit,
-                .maxlen         = sizeof(int),
-                .mode           = 0644,
-                .proc_handler   = &proc_dodebug
-        },
-        { .ctl_name = 0 }
+       CTL_ENTRY (CTL_DEBUG_SWITCH,    debug_switch),
+       CTL_ENTRY (CTL_DEBUG_XID,       debug_xid),
+       CTL_ENTRY (CTL_DEBUG_NID,       debug_nid),
+       CTL_ENTRY (CTL_DEBUG_TAG,       debug_tag),
+       CTL_ENTRY (CTL_DEBUG_NET,       debug_net),
+       CTL_ENTRY (CTL_DEBUG_LIMIT,     debug_limit),
+       CTL_ENTRY (CTL_DEBUG_CRES,      debug_cres),
+       CTL_ENTRY (CTL_DEBUG_DLIM,      debug_dlim),
+       CTL_ENTRY (CTL_DEBUG_QUOTA,     debug_quota),
+       CTL_ENTRY (CTL_DEBUG_CVIRT,     debug_cvirt),
+       CTL_ENTRY (CTL_DEBUG_MISC,      debug_misc),
+       { .ctl_name = 0 }
 };
 
 static ctl_table vserver_table[] = {
-        {
-                .ctl_name       = CTL_VSERVER,
-                .procname       = "vserver",
-                .mode           = 0555,
-                .child          = debug_table
-        },
-        { .ctl_name = 0 }
+       {
+               .ctl_name       = CTL_VSERVER,
+               .procname       = "vserver",
+               .mode           = 0555,
+               .child          = debug_table
+       },
+       { .ctl_name = 0 }
 };
 
+
+static match_table_t tokens = {
+       { CTL_DEBUG_SWITCH,     "switch=%x"     },
+       { CTL_DEBUG_XID,        "xid=%x"        },
+       { CTL_DEBUG_NID,        "nid=%x"        },
+       { CTL_DEBUG_TAG,        "tag=%x"        },
+       { CTL_DEBUG_NET,        "net=%x"        },
+       { CTL_DEBUG_LIMIT,      "limit=%x"      },
+       { CTL_DEBUG_CRES,       "cres=%x"       },
+       { CTL_DEBUG_DLIM,       "dlim=%x"       },
+       { CTL_DEBUG_QUOTA,      "quota=%x"      },
+       { CTL_DEBUG_CVIRT,      "cvirt=%x"      },
+       { CTL_DEBUG_MISC,       "misc=%x"       },
+       { CTL_DEBUG_ERROR,      NULL            }
+};
+
+#define        HANDLE_CASE(id, name, val)                              \
+       case CTL_DEBUG_ ## id:                                  \
+               vx_debug_ ## name = val;                        \
+               printk("vs_debug_" #name "=0x%x\n", val);       \
+               break
+
+
+static int __init vs_debug_setup(char *str)
+{
+       char *p;
+       int token;
+
+       printk("vs_debug_setup(%s)\n", str);
+       while ((p = strsep(&str, ",")) != NULL) {
+               substring_t args[MAX_OPT_ARGS];
+               unsigned int value;
+
+               if (!*p)
+                       continue;
+
+               token = match_token(p, tokens, args);
+               value = (token>0)?simple_strtoul(args[0].from, NULL, 0):0;
+
+               switch (token) {
+               HANDLE_CASE(SWITCH, switch, value);
+               HANDLE_CASE(XID,    xid,    value);
+               HANDLE_CASE(NID,    nid,    value);
+               HANDLE_CASE(TAG,    tag,    value);
+               HANDLE_CASE(NET,    net,    value);
+               HANDLE_CASE(LIMIT,  limit,  value);
+               HANDLE_CASE(CRES,   cres,   value);
+               HANDLE_CASE(DLIM,   dlim,   value);
+               HANDLE_CASE(QUOTA,  quota,  value);
+               HANDLE_CASE(CVIRT,  cvirt,  value);
+               HANDLE_CASE(MISC,   misc,   value);
+               default:
+                       return -EINVAL;
+                       break;
+               }
+       }
+       return 1;
+}
+
+__setup("vsdebug=", vs_debug_setup);
+
+
+
+EXPORT_SYMBOL_GPL(vx_debug_switch);
+EXPORT_SYMBOL_GPL(vx_debug_xid);
+EXPORT_SYMBOL_GPL(vx_debug_nid);
+EXPORT_SYMBOL_GPL(vx_debug_net);
+EXPORT_SYMBOL_GPL(vx_debug_limit);
+EXPORT_SYMBOL_GPL(vx_debug_cres);
+EXPORT_SYMBOL_GPL(vx_debug_dlim);
+EXPORT_SYMBOL_GPL(vx_debug_quota);
+EXPORT_SYMBOL_GPL(vx_debug_cvirt);
+EXPORT_SYMBOL_GPL(vx_debug_misc);
+