libata: kill the infamous abnormal status message
[sfrench/cifs-2.6.git] / kernel / compat.c
index d4898aad6cfa72ff46d78a8728c5d005531a338a..3bae3742c2aa567e18f7b1558f7fa72b1c9155a0 100644 (file)
@@ -475,8 +475,8 @@ asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid, unsigned int len,
        return min_length;
 }
 
-static int get_compat_itimerspec(struct itimerspec *dst, 
-                                struct compat_itimerspec __user *src)
+int get_compat_itimerspec(struct itimerspec *dst,
+                         const struct compat_itimerspec __user *src)
 { 
        if (get_compat_timespec(&dst->it_interval, &src->it_interval) ||
            get_compat_timespec(&dst->it_value, &src->it_value))
@@ -484,8 +484,8 @@ static int get_compat_itimerspec(struct itimerspec *dst,
        return 0;
 } 
 
-static int put_compat_itimerspec(struct compat_itimerspec __user *dst, 
-                                struct itimerspec *src)
+int put_compat_itimerspec(struct compat_itimerspec __user *dst,
+                         const struct itimerspec *src)
 { 
        if (put_compat_timespec(&src->it_interval, &dst->it_interval) ||
            put_compat_timespec(&src->it_value, &dst->it_value))
@@ -982,4 +982,103 @@ asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_pages,
        }
        return sys_move_pages(pid, nr_pages, pages, nodes, status, flags);
 }
+
+asmlinkage long compat_sys_migrate_pages(compat_pid_t pid,
+                       compat_ulong_t maxnode,
+                       const compat_ulong_t __user *old_nodes,
+                       const compat_ulong_t __user *new_nodes)
+{
+       unsigned long __user *old = NULL;
+       unsigned long __user *new = NULL;
+       nodemask_t tmp_mask;
+       unsigned long nr_bits;
+       unsigned long size;
+
+       nr_bits = min_t(unsigned long, maxnode - 1, MAX_NUMNODES);
+       size = ALIGN(nr_bits, BITS_PER_LONG) / 8;
+       if (old_nodes) {
+               if (compat_get_bitmap(nodes_addr(tmp_mask), old_nodes, nr_bits))
+                       return -EFAULT;
+               old = compat_alloc_user_space(new_nodes ? size * 2 : size);
+               if (new_nodes)
+                       new = old + size / sizeof(unsigned long);
+               if (copy_to_user(old, nodes_addr(tmp_mask), size))
+                       return -EFAULT;
+       }
+       if (new_nodes) {
+               if (compat_get_bitmap(nodes_addr(tmp_mask), new_nodes, nr_bits))
+                       return -EFAULT;
+               if (new == NULL)
+                       new = compat_alloc_user_space(size);
+               if (copy_to_user(new, nodes_addr(tmp_mask), size))
+                       return -EFAULT;
+       }
+       return sys_migrate_pages(pid, nr_bits + 1, old, new);
+}
 #endif
+
+struct compat_sysinfo {
+       s32 uptime;
+       u32 loads[3];
+       u32 totalram;
+       u32 freeram;
+       u32 sharedram;
+       u32 bufferram;
+       u32 totalswap;
+       u32 freeswap;
+       u16 procs;
+       u16 pad;
+       u32 totalhigh;
+       u32 freehigh;
+       u32 mem_unit;
+       char _f[20-2*sizeof(u32)-sizeof(int)];
+};
+
+asmlinkage long
+compat_sys_sysinfo(struct compat_sysinfo __user *info)
+{
+       struct sysinfo s;
+
+       do_sysinfo(&s);
+
+       /* Check to see if any memory value is too large for 32-bit and scale
+        *  down if needed
+        */
+       if ((s.totalram >> 32) || (s.totalswap >> 32)) {
+               int bitcount = 0;
+
+               while (s.mem_unit < PAGE_SIZE) {
+                       s.mem_unit <<= 1;
+                       bitcount++;
+               }
+
+               s.totalram >>= bitcount;
+               s.freeram >>= bitcount;
+               s.sharedram >>= bitcount;
+               s.bufferram >>= bitcount;
+               s.totalswap >>= bitcount;
+               s.freeswap >>= bitcount;
+               s.totalhigh >>= bitcount;
+               s.freehigh >>= bitcount;
+       }
+
+       if (!access_ok(VERIFY_WRITE, info, sizeof(struct compat_sysinfo)) ||
+           __put_user (s.uptime, &info->uptime) ||
+           __put_user (s.loads[0], &info->loads[0]) ||
+           __put_user (s.loads[1], &info->loads[1]) ||
+           __put_user (s.loads[2], &info->loads[2]) ||
+           __put_user (s.totalram, &info->totalram) ||
+           __put_user (s.freeram, &info->freeram) ||
+           __put_user (s.sharedram, &info->sharedram) ||
+           __put_user (s.bufferram, &info->bufferram) ||
+           __put_user (s.totalswap, &info->totalswap) ||
+           __put_user (s.freeswap, &info->freeswap) ||
+           __put_user (s.procs, &info->procs) ||
+           __put_user (s.totalhigh, &info->totalhigh) ||
+           __put_user (s.freehigh, &info->freehigh) ||
+           __put_user (s.mem_unit, &info->mem_unit))
+               return -EFAULT;
+
+       return 0;
+}
+