Merge tag 'ext4_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git...
[cascardo/linux.git] / kernel / sysctl_binary.c
index b669ca1..aea4a9e 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/netdevice.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
+#include <linux/compat.h>
 
 #ifdef CONFIG_SYSCTL_SYSCALL
 
@@ -970,7 +971,6 @@ out:
 static ssize_t bin_intvec(struct file *file,
        void __user *oldval, size_t oldlen, void __user *newval, size_t newlen)
 {
-       mm_segment_t old_fs = get_fs();
        ssize_t copied = 0;
        char *buffer;
        ssize_t result;
@@ -983,13 +983,10 @@ static ssize_t bin_intvec(struct file *file,
        if (oldval && oldlen) {
                unsigned __user *vec = oldval;
                size_t length = oldlen / sizeof(*vec);
-               loff_t pos = 0;
                char *str, *end;
                int i;
 
-               set_fs(KERNEL_DS);
-               result = vfs_read(file, buffer, BUFSZ - 1, &pos);
-               set_fs(old_fs);
+               result = kernel_read(file, 0, buffer, BUFSZ - 1);
                if (result < 0)
                        goto out_kfree;
 
@@ -1016,7 +1013,6 @@ static ssize_t bin_intvec(struct file *file,
        if (newval && newlen) {
                unsigned __user *vec = newval;
                size_t length = newlen / sizeof(*vec);
-               loff_t pos = 0;
                char *str, *end;
                int i;
 
@@ -1032,9 +1028,7 @@ static ssize_t bin_intvec(struct file *file,
                        str += snprintf(str, end - str, "%lu\t", value);
                }
 
-               set_fs(KERNEL_DS);
-               result = vfs_write(file, buffer, str - buffer, &pos);
-               set_fs(old_fs);
+               result = kernel_write(file, buffer, str - buffer, 0);
                if (result < 0)
                        goto out_kfree;
        }
@@ -1048,7 +1042,6 @@ out:
 static ssize_t bin_ulongvec(struct file *file,
        void __user *oldval, size_t oldlen, void __user *newval, size_t newlen)
 {
-       mm_segment_t old_fs = get_fs();
        ssize_t copied = 0;
        char *buffer;
        ssize_t result;
@@ -1061,13 +1054,10 @@ static ssize_t bin_ulongvec(struct file *file,
        if (oldval && oldlen) {
                unsigned long __user *vec = oldval;
                size_t length = oldlen / sizeof(*vec);
-               loff_t pos = 0;
                char *str, *end;
                int i;
 
-               set_fs(KERNEL_DS);
-               result = vfs_read(file, buffer, BUFSZ - 1, &pos);
-               set_fs(old_fs);
+               result = kernel_read(file, 0, buffer, BUFSZ - 1);
                if (result < 0)
                        goto out_kfree;
 
@@ -1094,7 +1084,6 @@ static ssize_t bin_ulongvec(struct file *file,
        if (newval && newlen) {
                unsigned long __user *vec = newval;
                size_t length = newlen / sizeof(*vec);
-               loff_t pos = 0;
                char *str, *end;
                int i;
 
@@ -1110,9 +1099,7 @@ static ssize_t bin_ulongvec(struct file *file,
                        str += snprintf(str, end - str, "%lu\t", value);
                }
 
-               set_fs(KERNEL_DS);
-               result = vfs_write(file, buffer, str - buffer, &pos);
-               set_fs(old_fs);
+               result = kernel_write(file, buffer, str - buffer, 0);
                if (result < 0)
                        goto out_kfree;
        }
@@ -1126,19 +1113,15 @@ out:
 static ssize_t bin_uuid(struct file *file,
        void __user *oldval, size_t oldlen, void __user *newval, size_t newlen)
 {
-       mm_segment_t old_fs = get_fs();
        ssize_t result, copied = 0;
 
        /* Only supports reads */
        if (oldval && oldlen) {
-               loff_t pos = 0;
                char buf[40], *str = buf;
                unsigned char uuid[16];
                int i;
 
-               set_fs(KERNEL_DS);
-               result = vfs_read(file, buf, sizeof(buf) - 1, &pos);
-               set_fs(old_fs);
+               result = kernel_read(file, 0, buf, sizeof(buf) - 1);
                if (result < 0)
                        goto out;
 
@@ -1174,18 +1157,14 @@ out:
 static ssize_t bin_dn_node_address(struct file *file,
        void __user *oldval, size_t oldlen, void __user *newval, size_t newlen)
 {
-       mm_segment_t old_fs = get_fs();
        ssize_t result, copied = 0;
 
        if (oldval && oldlen) {
-               loff_t pos = 0;
                char buf[15], *nodep;
                unsigned long area, node;
                __le16 dnaddr;
 
-               set_fs(KERNEL_DS);
-               result = vfs_read(file, buf, sizeof(buf) - 1, &pos);
-               set_fs(old_fs);
+               result = kernel_read(file, 0, buf, sizeof(buf) - 1);
                if (result < 0)
                        goto out;
 
@@ -1193,9 +1172,10 @@ static ssize_t bin_dn_node_address(struct file *file,
 
                /* Convert the decnet address to binary */
                result = -EIO;
-               nodep = strchr(buf, '.') + 1;
+               nodep = strchr(buf, '.');
                if (!nodep)
                        goto out;
+               ++nodep;
 
                area = simple_strtoul(buf, NULL, 10);
                node = simple_strtoul(nodep, NULL, 10);
@@ -1214,7 +1194,6 @@ static ssize_t bin_dn_node_address(struct file *file,
        }
 
        if (newval && newlen) {
-               loff_t pos = 0;
                __le16 dnaddr;
                char buf[15];
                int len;
@@ -1231,9 +1210,7 @@ static ssize_t bin_dn_node_address(struct file *file,
                                le16_to_cpu(dnaddr) >> 10,
                                le16_to_cpu(dnaddr) & 0x3ff);
 
-               set_fs(KERNEL_DS);
-               result = vfs_write(file, buf, len, &pos);
-               set_fs(old_fs);
+               result = kernel_write(file, buf, len, 0);
                if (result < 0)
                        goto out;
        }
@@ -1471,7 +1448,6 @@ SYSCALL_DEFINE1(sysctl, struct __sysctl_args __user *, args)
 
 
 #ifdef CONFIG_COMPAT
-#include <asm/compat.h>
 
 struct compat_sysctl_args {
        compat_uptr_t   name;
@@ -1483,7 +1459,7 @@ struct compat_sysctl_args {
        compat_ulong_t  __unused[4];
 };
 
-asmlinkage long compat_sys_sysctl(struct compat_sysctl_args __user *args)
+COMPAT_SYSCALL_DEFINE1(sysctl, struct compat_sysctl_args __user *, args)
 {
        struct compat_sysctl_args tmp;
        compat_size_t __user *compat_oldlenp;