Merge branch 'uaccess.__copy_to_user' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 1 Jun 2020 23:19:59 +0000 (16:19 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 1 Jun 2020 23:19:59 +0000 (16:19 -0700)
Pull uaccess/__copy_to_user updates from Al Viro:
 "Getting rid of __copy_to_user() callers - stuff that doesn't fit into
  other series"

* 'uaccess.__copy_to_user' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  dlmfs: convert dlmfs_file_read() to copy_to_user()
  esas2r: don't bother with __copy_to_user()

drivers/scsi/esas2r/esas2r_ioctl.c
fs/ocfs2/dlmfs/dlmfs.c

index 442c5e7..cc620f1 100644 (file)
@@ -1510,7 +1510,7 @@ ioctl_done:
        }
 
        /* Always copy the buffer back, if only to pick up the status */
-       err = __copy_to_user(arg, ioctl, sizeof(struct atto_express_ioctl));
+       err = copy_to_user(arg, ioctl, sizeof(struct atto_express_ioctl));
        if (err != 0) {
                esas2r_log(ESAS2R_LOG_WARN,
                           "ioctl_handler copy_to_user didn't copy everything (err %d, cmd %u)",
index a06f19b..ea868c6 100644 (file)
@@ -227,7 +227,7 @@ static ssize_t dlmfs_file_read(struct file *filp,
                               loff_t *ppos)
 {
        int bytes_left;
-       ssize_t readlen, got;
+       ssize_t got;
        char *lvb_buf;
        struct inode *inode = file_inode(filp);
 
@@ -237,36 +237,31 @@ static ssize_t dlmfs_file_read(struct file *filp,
        if (*ppos >= i_size_read(inode))
                return 0;
 
+       /* don't read past the lvb */
+       if (count > i_size_read(inode) - *ppos)
+               count = i_size_read(inode) - *ppos;
+
        if (!count)
                return 0;
 
-       if (!access_ok(buf, count))
-               return -EFAULT;
-
-       /* don't read past the lvb */
-       if ((count + *ppos) > i_size_read(inode))
-               readlen = i_size_read(inode) - *ppos;
-       else
-               readlen = count;
-
-       lvb_buf = kmalloc(readlen, GFP_NOFS);
+       lvb_buf = kmalloc(count, GFP_NOFS);
        if (!lvb_buf)
                return -ENOMEM;
 
-       got = user_dlm_read_lvb(inode, lvb_buf, readlen);
+       got = user_dlm_read_lvb(inode, lvb_buf, count);
        if (got) {
-               BUG_ON(got != readlen);
-               bytes_left = __copy_to_user(buf, lvb_buf, readlen);
-               readlen -= bytes_left;
+               BUG_ON(got != count);
+               bytes_left = copy_to_user(buf, lvb_buf, count);
+               count -= bytes_left;
        } else
-               readlen = 0;
+               count = 0;
 
        kfree(lvb_buf);
 
-       *ppos = *ppos + readlen;
+       *ppos = *ppos + count;
 
-       mlog(0, "read %zd bytes\n", readlen);
-       return readlen;
+       mlog(0, "read %zu bytes\n", count);
+       return count;
 }
 
 static ssize_t dlmfs_file_write(struct file *filp,