sh: convert /proc/cpu/aligmnent, /proc/cpu/kernel_alignment to seq_file
[safe/jmp/linux-2.6] / kernel / exec_domain.c
index a9e6bad..c35452c 100644 (file)
 #include <linux/kmod.h>
 #include <linux/module.h>
 #include <linux/personality.h>
+#include <linux/proc_fs.h>
 #include <linux/sched.h>
+#include <linux/seq_file.h>
 #include <linux/syscalls.h>
 #include <linux/sysctl.h>
 #include <linux/types.h>
+#include <linux/fs_struct.h>
 
 
 static void default_handler(int, struct pt_regs *);
@@ -65,7 +68,7 @@ lookup_exec_domain(u_long personality)
                                goto out;
        }
 
-#ifdef CONFIG_KMOD
+#ifdef CONFIG_MODULES
        read_unlock(&exec_domains_lock);
        request_module("personality-%ld", pers);
        read_lock(&exec_domains_lock);
@@ -143,54 +146,49 @@ __set_personality(u_long personality)
                return 0;
        }
 
-       if (atomic_read(&current->fs->count) != 1) {
-               struct fs_struct *fsp, *ofsp;
-
-               fsp = copy_fs_struct(current->fs);
-               if (fsp == NULL) {
-                       module_put(ep->module);
-                       return -ENOMEM;
-               }
-
-               task_lock(current);
-               ofsp = current->fs;
-               current->fs = fsp;
-               task_unlock(current);
-
-               put_fs_struct(ofsp);
-       }
-
-       /*
-        * At that point we are guaranteed to be the sole owner of
-        * current->fs.
-        */
-
        current->personality = personality;
        oep = current_thread_info()->exec_domain;
        current_thread_info()->exec_domain = ep;
-       set_fs_altroot();
 
        module_put(oep->module);
        return 0;
 }
 
-int
-get_exec_domain_list(char *page)
+#ifdef CONFIG_PROC_FS
+static int execdomains_proc_show(struct seq_file *m, void *v)
 {
        struct exec_domain      *ep;
-       int                     len = 0;
 
        read_lock(&exec_domains_lock);
-       for (ep = exec_domains; ep && len < PAGE_SIZE - 80; ep = ep->next)
-               len += sprintf(page + len, "%d-%d\t%-16s\t[%s]\n",
+       for (ep = exec_domains; ep; ep = ep->next)
+               seq_printf(m, "%d-%d\t%-16s\t[%s]\n",
                               ep->pers_low, ep->pers_high, ep->name,
                               module_name(ep->module));
        read_unlock(&exec_domains_lock);
-       return (len);
+       return 0;
+}
+
+static int execdomains_proc_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, execdomains_proc_show, NULL);
 }
 
-asmlinkage long
-sys_personality(u_long personality)
+static const struct file_operations execdomains_proc_fops = {
+       .open           = execdomains_proc_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
+static int __init proc_execdomains_init(void)
+{
+       proc_create("execdomains", 0, NULL, &execdomains_proc_fops);
+       return 0;
+}
+module_init(proc_execdomains_init);
+#endif
+
+SYSCALL_DEFINE1(personality, u_long, personality)
 {
        u_long old = current->personality;