Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / arch / alpha / kernel / osf_sys.c
index 167fd89..a693bd2 100644 (file)
@@ -37,6 +37,8 @@
 #include <linux/namei.h>
 #include <linux/uio.h>
 #include <linux/vfs.h>
+#include <linux/rcupdate.h>
+#include <linux/vs_cvirt.h>
 
 #include <asm/fpu.h>
 #include <asm/io.h>
@@ -398,18 +400,20 @@ asmlinkage int
 osf_utsname(char __user *name)
 {
        int error;
+       struct new_utsname *ptr;
 
        down_read(&uts_sem);
+       ptr = vx_new_utsname();
        error = -EFAULT;
-       if (copy_to_user(name + 0, system_utsname.sysname, 32))
+       if (copy_to_user(name + 0, ptr->sysname, 32))
                goto out;
-       if (copy_to_user(name + 32, system_utsname.nodename, 32))
+       if (copy_to_user(name + 32, ptr->nodename, 32))
                goto out;
-       if (copy_to_user(name + 64, system_utsname.release, 32))
+       if (copy_to_user(name + 64, ptr->release, 32))
                goto out;
-       if (copy_to_user(name + 96, system_utsname.version, 32))
+       if (copy_to_user(name + 96, ptr->version, 32))
                goto out;
-       if (copy_to_user(name + 128, system_utsname.machine, 32))
+       if (copy_to_user(name + 128, ptr->machine, 32))
                goto out;
 
        error = 0;
@@ -438,6 +442,7 @@ osf_getdomainname(char __user *name, int namelen)
 {
        unsigned len;
        int i;
+       char *domainname;
 
        if (!access_ok(VERIFY_WRITE, name, namelen))
                return -EFAULT;
@@ -447,9 +452,10 @@ osf_getdomainname(char __user *name, int namelen)
                len = 32;
 
        down_read(&uts_sem);
+       domainname = vx_new_uts(domainname);
        for (i = 0; i < len; ++i) {
-               __put_user(system_utsname.domainname[i], name + i);
-               if (system_utsname.domainname[i] == '\0')
+               __put_user(domainname[i], name + i);
+               if (domainname[i] == '\0')
                        break;
        }
        up_read(&uts_sem);
@@ -606,30 +612,30 @@ osf_sigstack(struct sigstack __user *uss, struct sigstack __user *uoss)
 asmlinkage long
 osf_sysinfo(int command, char __user *buf, long count)
 {
-       static char * sysinfo_table[] = {
-               system_utsname.sysname,
-               system_utsname.nodename,
-               system_utsname.release,
-               system_utsname.version,
-               system_utsname.machine,
-               "alpha",        /* instruction set architecture */
-               "dummy",        /* hardware serial number */
-               "dummy",        /* hardware manufacturer */
-               "dummy",        /* secure RPC domain */
-       };
        unsigned long offset;
        char *res;
        long len, err = -EINVAL;
 
        offset = command-1;
-       if (offset >= sizeof(sysinfo_table)/sizeof(char *)) {
+       if (offset >= 9) {
                /* Digital UNIX has a few unpublished interfaces here */
                printk("sysinfo(%d)", command);
                goto out;
        }
        
        down_read(&uts_sem);
-       res = sysinfo_table[offset];
+       switch (offset)
+       {
+       case 0: res = vx_new_uts(sysname);  break;
+       case 1: res = vx_new_uts(nodename); break;
+       case 2: res = vx_new_uts(release);  break;
+       case 3: res = vx_new_uts(version);  break;
+       case 4: res = vx_new_uts(machine);  break;
+       case 5: res = "alpha";              break;
+       default:
+               res = "dummy";
+               break;
+       }
        len = strlen(res)+1;
        if (len > count)
                len = count;
@@ -820,7 +826,6 @@ osf_setsysinfo(unsigned long op, void __user *buffer, unsigned long nbytes,
    affects all sorts of things, like timeval and itimerval.  */
 
 extern struct timezone sys_tz;
-extern int do_adjtimex(struct timex *);
 
 struct timeval32
 {
@@ -959,7 +964,7 @@ osf_utimes(char __user *filename, struct timeval32 __user *tvs)
                        return -EFAULT;
        }
 
-       return do_utimes(filename, tvs ? ktvs : NULL);
+       return do_utimes(AT_FDCWD, filename, tvs ? ktvs : NULL);
 }
 
 #define MAX_SELECT_SECONDS \
@@ -974,6 +979,8 @@ osf_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp,
        size_t size;
        long timeout;
        int ret = -EINVAL;
+       struct fdtable *fdt;
+       int max_fdset;
 
        timeout = MAX_SCHEDULE_TIMEOUT;
        if (tvp) {
@@ -995,7 +1002,11 @@ osf_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp,
                }
        }
 
-       if (n < 0 || n > current->files->max_fdset)
+       rcu_read_lock();
+       fdt = files_fdtable(current->files);
+       max_fdset = fdt->max_fdset;
+       rcu_read_unlock();
+       if (n < 0 || n > max_fdset)
                goto out_nofds;
 
        /*
@@ -1152,8 +1163,7 @@ osf_usleep_thread(struct timeval32 __user *sleep, struct timeval32 __user *remai
 
        ticks = timeval_to_jiffies(&tmp);
 
-       current->state = TASK_INTERRUPTIBLE;
-       ticks = schedule_timeout(ticks);
+       ticks = schedule_timeout_interruptible(ticks);
 
        if (remain) {
                jiffies_to_timeval(ticks, &tmp);