Pull asus into release branch
[pandora-kernel.git] / arch / sparc / kernel / sys_sunos.c
index aa0fb2e..f807172 100644 (file)
@@ -94,8 +94,8 @@ asmlinkage unsigned long sunos_mmap(unsigned long addr, unsigned long len,
         * SunOS is so stupid some times... hmph!
         */
        if (file) {
-               if (imajor(file->f_dentry->d_inode) == MEM_MAJOR &&
-                   iminor(file->f_dentry->d_inode) == 5) {
+               if (imajor(file->f_path.dentry->d_inode) == MEM_MAJOR &&
+                   iminor(file->f_path.dentry->d_inode) == 5) {
                        flags |= MAP_ANONYMOUS;
                        fput(file);
                        file = NULL;
@@ -325,21 +325,25 @@ struct sunos_dirent_callback {
 #define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1))
 
 static int sunos_filldir(void * __buf, const char * name, int namlen,
-                        loff_t offset, ino_t ino, unsigned int d_type)
+                        loff_t offset, u64 ino, unsigned int d_type)
 {
        struct sunos_dirent __user *dirent;
        struct sunos_dirent_callback * buf = __buf;
+       unsigned long d_ino;
        int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1);
 
        buf->error = -EINVAL;   /* only used if we fail.. */
        if (reclen > buf->count)
                return -EINVAL;
+       d_ino = ino;
+       if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
+               return -EOVERFLOW;
        dirent = buf->previous;
        if (dirent)
                put_user(offset, &dirent->d_off);
        dirent = buf->curr;
        buf->previous = dirent;
-       put_user(ino, &dirent->d_ino);
+       put_user(d_ino, &dirent->d_ino);
        put_user(namlen, &dirent->d_namlen);
        put_user(reclen, &dirent->d_reclen);
        copy_to_user(dirent->d_name, name, namlen);
@@ -406,19 +410,23 @@ struct sunos_direntry_callback {
 };
 
 static int sunos_filldirentry(void * __buf, const char * name, int namlen,
-                             loff_t offset, ino_t ino, unsigned int d_type)
+                             loff_t offset, u64 ino, unsigned int d_type)
 {
        struct sunos_direntry __user *dirent;
        struct sunos_direntry_callback *buf = __buf;
+       unsigned long d_ino;
        int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1);
 
        buf->error = -EINVAL;   /* only used if we fail.. */
        if (reclen > buf->count)
                return -EINVAL;
+       d_ino = ino;
+       if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
+               return -EOVERFLOW;
        dirent = buf->previous;
        dirent = buf->curr;
        buf->previous = dirent;
-       put_user(ino, &dirent->d_ino);
+       put_user(d_ino, &dirent->d_ino);
        put_user(namlen, &dirent->d_namlen);
        put_user(reclen, &dirent->d_reclen);
        copy_to_user(dirent->d_name, name, namlen);
@@ -483,13 +491,18 @@ asmlinkage int sunos_uname(struct sunos_utsname __user *name)
 {
        int ret;
        down_read(&uts_sem);
-       ret = copy_to_user(&name->sname[0], &system_utsname.sysname[0], sizeof(name->sname) - 1);
+       ret = copy_to_user(&name->sname[0], &utsname()->sysname[0],
+                          sizeof(name->sname) - 1);
        if (!ret) {
-               ret |= __copy_to_user(&name->nname[0], &system_utsname.nodename[0], sizeof(name->nname) - 1);
+               ret |= __copy_to_user(&name->nname[0], &utsname()->nodename[0],
+                                     sizeof(name->nname) - 1);
                ret |= __put_user('\0', &name->nname[8]);
-               ret |= __copy_to_user(&name->rel[0], &system_utsname.release[0], sizeof(name->rel) - 1);
-               ret |= __copy_to_user(&name->ver[0], &system_utsname.version[0], sizeof(name->ver) - 1);
-               ret |= __copy_to_user(&name->mach[0], &system_utsname.machine[0], sizeof(name->mach) - 1);
+               ret |= __copy_to_user(&name->rel[0], &utsname()->release[0],
+                                     sizeof(name->rel) - 1);
+               ret |= __copy_to_user(&name->ver[0], &utsname()->version[0],
+                                     sizeof(name->ver) - 1);
+               ret |= __copy_to_user(&name->mach[0], &utsname()->machine[0],
+                                     sizeof(name->mach) - 1);
        }
        up_read(&uts_sem);
        return ret ? -EFAULT : 0;
@@ -642,7 +655,7 @@ sunos_nfs_get_server_fd (int fd, struct sockaddr_in *addr)
        if (!file)
                goto out;
 
-       inode = file->f_dentry->d_inode;
+       inode = file->f_path.dentry->d_inode;
 
        socket = SOCKET_I(inode);
        local.sin_family = AF_INET;
@@ -846,14 +859,16 @@ asmlinkage int sunos_wait4(pid_t pid, unsigned int __user *stat_addr,
        return ret;
 }
 
-extern int kill_pg(int, int, int);
 asmlinkage int sunos_killpg(int pgrp, int sig)
 {
        int ret;
 
-       lock_kernel();
-       ret = kill_pg(pgrp, sig, 0);
-       unlock_kernel();
+       rcu_read_lock();
+       ret = -EINVAL;
+       if (pgrp > 0)
+               ret = kill_pgrp(find_pid(pgrp), sig, 0);
+       rcu_read_unlock();
+
        return ret;
 }
 
@@ -895,7 +910,7 @@ asmlinkage long sunos_sysconf (int name)
                ret = ARG_MAX;
                break;
        case _SC_CHILD_MAX:
-               ret = -1; /* no limit */
+               ret = current->signal->rlim[RLIMIT_NPROC].rlim_cur;
                break;
        case _SC_CLK_TCK:
                ret = HZ;
@@ -904,7 +919,7 @@ asmlinkage long sunos_sysconf (int name)
                ret = NGROUPS_MAX;
                break;
        case _SC_OPEN_MAX:
-               ret = OPEN_MAX;
+               ret = current->signal->rlim[RLIMIT_NOFILE].rlim_cur;
                break;
        case _SC_JOB_CONTROL:
                ret = 1;        /* yes, we do support job control */