]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/alpha/kernel/osf_sys.c
Merge branch 'v28-range-hrtimers-for-linus-v2' of git://git.kernel.org/pub/scm/linux...
[linux-2.6-omap-h63xx.git] / arch / alpha / kernel / osf_sys.c
index 9fee37e2596f34fe8d3c22558b87d248396b4dca..18a3ea1aac51376882d0bd8cb50503b2d0442ee3 100644 (file)
@@ -121,24 +121,29 @@ osf_filldir(void *__buf, const char *name, int namlen, loff_t offset,
        if (reclen > buf->count)
                return -EINVAL;
        d_ino = ino;
-       if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
+       if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) {
+               buf->error = -EOVERFLOW;
                return -EOVERFLOW;
+       }
        if (buf->basep) {
                if (put_user(offset, buf->basep))
-                       return -EFAULT;
+                       goto Efault;
                buf->basep = NULL;
        }
        dirent = buf->dirent;
-       put_user(d_ino, &dirent->d_ino);
-       put_user(namlen, &dirent->d_namlen);
-       put_user(reclen, &dirent->d_reclen);
-       if (copy_to_user(dirent->d_name, name, namlen) ||
+       if (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) ||
            put_user(0, dirent->d_name + namlen))
-               return -EFAULT;
+               goto Efault;
        dirent = (void __user *)dirent + reclen;
        buf->dirent = dirent;
        buf->count -= reclen;
        return 0;
+Efault:
+       buf->error = -EFAULT;
+       return -EFAULT;
 }
 
 asmlinkage int
@@ -160,14 +165,11 @@ osf_getdirentries(unsigned int fd, struct osf_dirent __user *dirent,
        buf.error = 0;
 
        error = vfs_readdir(file, osf_filldir, &buf);
-       if (error < 0)
-               goto out_putf;
-
-       error = buf.error;
+       if (error >= 0)
+               error = buf.error;
        if (count != buf.count)
                error = count - buf.count;
 
- out_putf:
        fput(file);
  out:
        return error;
@@ -253,15 +255,15 @@ do_osf_statfs(struct dentry * dentry, struct osf_statfs __user *buffer,
 }
 
 asmlinkage int
-osf_statfs(char __user *path, struct osf_statfs __user *buffer, unsigned long bufsiz)
+osf_statfs(char __user *pathname, struct osf_statfs __user *buffer, unsigned long bufsiz)
 {
-       struct nameidata nd;
+       struct path path;
        int retval;
 
-       retval = user_path_walk(path, &nd);
+       retval = user_path(pathname, &path);
        if (!retval) {
-               retval = do_osf_statfs(nd.path.dentry, buffer, bufsiz);
-               path_put(&nd.path);
+               retval = do_osf_statfs(path.dentry, buffer, bufsiz);
+               path_put(&path);
        }
        return retval;
 }
@@ -981,88 +983,28 @@ asmlinkage int
 osf_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp,
           struct timeval32 __user *tvp)
 {
-       fd_set_bits fds;
-       char *bits;
-       size_t size;
-       long timeout;
-       int ret = -EINVAL;
-       struct fdtable *fdt;
-       int max_fds;
-
-       timeout = MAX_SCHEDULE_TIMEOUT;
+       struct timespec end_time, *to = NULL;
        if (tvp) {
                time_t sec, usec;
 
+               to = &end_time;
+
                if (!access_ok(VERIFY_READ, tvp, sizeof(*tvp))
                    || __get_user(sec, &tvp->tv_sec)
                    || __get_user(usec, &tvp->tv_usec)) {
-                       ret = -EFAULT;
-                       goto out_nofds;
+                       return -EFAULT;
                }
 
                if (sec < 0 || usec < 0)
-                       goto out_nofds;
-
-               if ((unsigned long) sec < MAX_SELECT_SECONDS) {
-                       timeout = (usec + 1000000/HZ - 1) / (1000000/HZ);
-                       timeout += sec * (unsigned long) HZ;
-               }
-       }
-
-       rcu_read_lock();
-       fdt = files_fdtable(current->files);
-       max_fds = fdt->max_fds;
-       rcu_read_unlock();
-       if (n < 0 || n > max_fds)
-               goto out_nofds;
-
-       /*
-        * We need 6 bitmaps (in/out/ex for both incoming and outgoing),
-        * since we used fdset we need to allocate memory in units of
-        * long-words. 
-        */
-       ret = -ENOMEM;
-       size = FDS_BYTES(n);
-       bits = kmalloc(6 * size, GFP_KERNEL);
-       if (!bits)
-               goto out_nofds;
-       fds.in      = (unsigned long *)  bits;
-       fds.out     = (unsigned long *) (bits +   size);
-       fds.ex      = (unsigned long *) (bits + 2*size);
-       fds.res_in  = (unsigned long *) (bits + 3*size);
-       fds.res_out = (unsigned long *) (bits + 4*size);
-       fds.res_ex  = (unsigned long *) (bits + 5*size);
-
-       if ((ret = get_fd_set(n, inp->fds_bits, fds.in)) ||
-           (ret = get_fd_set(n, outp->fds_bits, fds.out)) ||
-           (ret = get_fd_set(n, exp->fds_bits, fds.ex)))
-               goto out;
-       zero_fd_set(n, fds.res_in);
-       zero_fd_set(n, fds.res_out);
-       zero_fd_set(n, fds.res_ex);
-
-       ret = do_select(n, &fds, &timeout);
+                       return -EINVAL;
 
-       /* OSF does not copy back the remaining time.  */
+               if (poll_select_set_timeout(to, sec, usec * NSEC_PER_USEC))
+                       return -EINVAL;         
 
-       if (ret < 0)
-               goto out;
-       if (!ret) {
-               ret = -ERESTARTNOHAND;
-               if (signal_pending(current))
-                       goto out;
-               ret = 0;
        }
 
-       if (set_fd_set(n, inp->fds_bits, fds.res_in) ||
-           set_fd_set(n, outp->fds_bits, fds.res_out) ||
-           set_fd_set(n, exp->fds_bits, fds.res_ex))
-               ret = -EFAULT;
-
- out:
-       kfree(bits);
- out_nofds:
-       return ret;
+       /* OSF does not copy back the remaining time.  */
+       return core_sys_select(n, inp, outp, exp, to);
 }
 
 struct rusage32 {