Hi Al,

Today's linux-next merge of the signal tree got conflicts in
fs/read_write.c and fs/read_write.h between commit 1fd193fd030a ("switch
compat readv/writev variants to COMPAT_SYSCALL_DEFINE") from the vfs tree
and commit 19f4fc3aee18 ("convert sendfile{,64} to
COMPAT_SYSCALL_DEFINE") from the signal tree.

I fixed it up (see below) and can carry the fix as necessary (no action
is required).

-- 
Cheers,
Stephen Rothwell                    [email protected]

diff --cc fs/read_write.c
index e7d7bde,f738e4d..0000000
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@@ -903,203 -853,8 +887,203 @@@ SYSCALL_DEFINE5(pwritev, unsigned long
        return ret;
  }
  
 +#ifdef CONFIG_COMPAT
 +
 +static ssize_t compat_do_readv_writev(int type, struct file *file,
 +                             const struct compat_iovec __user *uvector,
 +                             unsigned long nr_segs, loff_t *pos)
 +{
 +      compat_ssize_t tot_len;
 +      struct iovec iovstack[UIO_FASTIOV];
 +      struct iovec *iov = iovstack;
 +      ssize_t ret;
 +      io_fn_t fn;
 +      iov_fn_t fnv;
 +
 +      ret = -EINVAL;
 +      if (!file->f_op)
 +              goto out;
 +
 +      ret = -EFAULT;
 +      if (!access_ok(VERIFY_READ, uvector, nr_segs*sizeof(*uvector)))
 +              goto out;
 +
 +      ret = compat_rw_copy_check_uvector(type, uvector, nr_segs,
 +                                             UIO_FASTIOV, iovstack, &iov);
 +      if (ret <= 0)
 +              goto out;
 +
 +      tot_len = ret;
 +      ret = rw_verify_area(type, file, pos, tot_len);
 +      if (ret < 0)
 +              goto out;
 +
 +      fnv = NULL;
 +      if (type == READ) {
 +              fn = file->f_op->read;
 +              fnv = file->f_op->aio_read;
 +      } else {
 +              fn = (io_fn_t)file->f_op->write;
 +              fnv = file->f_op->aio_write;
 +              file_start_write(file);
 +      }
 +
 +      if (fnv)
 +              ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
 +                                              pos, fnv);
 +      else
 +              ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
 +
 +      if (type != READ)
 +              file_end_write(file);
 +
 +out:
 +      if (iov != iovstack)
 +              kfree(iov);
 +      if ((ret + (type == READ)) > 0) {
 +              if (type == READ)
 +                      fsnotify_access(file);
 +              else
 +                      fsnotify_modify(file);
 +      }
 +      return ret;
 +}
 +
 +static size_t compat_readv(struct file *file,
 +                         const struct compat_iovec __user *vec,
 +                         unsigned long vlen, loff_t *pos)
 +{
 +      ssize_t ret = -EBADF;
 +
 +      if (!(file->f_mode & FMODE_READ))
 +              goto out;
 +
 +      ret = -EINVAL;
 +      if (!file->f_op || (!file->f_op->aio_read && !file->f_op->read))
 +              goto out;
 +
 +      ret = compat_do_readv_writev(READ, file, vec, vlen, pos);
 +
 +out:
 +      if (ret > 0)
 +              add_rchar(current, ret);
 +      inc_syscr(current);
 +      return ret;
 +}
 +
 +COMPAT_SYSCALL_DEFINE3(readv, unsigned long, fd,
 +              const struct compat_iovec __user *,vec,
 +              unsigned long, vlen)
 +{
 +      struct fd f = fdget(fd);
 +      ssize_t ret;
 +      loff_t pos;
 +
 +      if (!f.file)
 +              return -EBADF;
 +      pos = f.file->f_pos;
 +      ret = compat_readv(f.file, vec, vlen, &pos);
 +      f.file->f_pos = pos;
 +      fdput(f);
 +      return ret;
 +}
 +
 +COMPAT_SYSCALL_DEFINE4(preadv64, unsigned long, fd,
 +              const struct compat_iovec __user *,vec,
 +              unsigned long, vlen, loff_t, pos)
 +{
 +      struct fd f;
 +      ssize_t ret;
 +
 +      if (pos < 0)
 +              return -EINVAL;
 +      f = fdget(fd);
 +      if (!f.file)
 +              return -EBADF;
 +      ret = -ESPIPE;
 +      if (f.file->f_mode & FMODE_PREAD)
 +              ret = compat_readv(f.file, vec, vlen, &pos);
 +      fdput(f);
 +      return ret;
 +}
 +
 +COMPAT_SYSCALL_DEFINE5(preadv, unsigned long, fd,
 +              const struct compat_iovec __user *,vec,
 +              unsigned long, vlen, u32, pos_low, u32, pos_high)
 +{
 +      loff_t pos = ((loff_t)pos_high << 32) | pos_low;
 +      return compat_sys_preadv64(fd, vec, vlen, pos);
 +}
 +
 +static size_t compat_writev(struct file *file,
 +                          const struct compat_iovec __user *vec,
 +                          unsigned long vlen, loff_t *pos)
 +{
 +      ssize_t ret = -EBADF;
 +
 +      if (!(file->f_mode & FMODE_WRITE))
 +              goto out;
 +
 +      ret = -EINVAL;
 +      if (!file->f_op || (!file->f_op->aio_write && !file->f_op->write))
 +              goto out;
 +
 +      ret = compat_do_readv_writev(WRITE, file, vec, vlen, pos);
 +
 +out:
 +      if (ret > 0)
 +              add_wchar(current, ret);
 +      inc_syscw(current);
 +      return ret;
 +}
 +
 +COMPAT_SYSCALL_DEFINE3(writev, unsigned long, fd,
 +              const struct compat_iovec __user *, vec,
 +              unsigned long, vlen)
 +{
 +      struct fd f = fdget(fd);
 +      ssize_t ret;
 +      loff_t pos;
 +
 +      if (!f.file)
 +              return -EBADF;
 +      pos = f.file->f_pos;
 +      ret = compat_writev(f.file, vec, vlen, &pos);
 +      f.file->f_pos = pos;
 +      fdput(f);
 +      return ret;
 +}
 +
 +COMPAT_SYSCALL_DEFINE4(pwritev64, unsigned long, fd,
 +              const struct compat_iovec __user *,vec,
 +              unsigned long, vlen, loff_t, pos)
 +{
 +      struct fd f;
 +      ssize_t ret;
 +
 +      if (pos < 0)
 +              return -EINVAL;
 +      f = fdget(fd);
 +      if (!f.file)
 +              return -EBADF;
 +      ret = -ESPIPE;
 +      if (f.file->f_mode & FMODE_PWRITE)
 +              ret = compat_writev(f.file, vec, vlen, &pos);
 +      fdput(f);
 +      return ret;
 +}
 +
 +COMPAT_SYSCALL_DEFINE5(pwritev, unsigned long, fd,
 +              const struct compat_iovec __user *,vec,
 +              unsigned long, vlen, u32, pos_low, u32, pos_high)
 +{
 +      loff_t pos = ((loff_t)pos_high << 32) | pos_low;
 +      return compat_sys_pwritev64(fd, vec, vlen, pos);
 +}
 +#endif
 +
- ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, size_t count,
-                   loff_t max)
+ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
+                          size_t count, loff_t max)
  {
        struct fd in, out;
        struct inode *in_inode, *out_inode;
diff --cc fs/read_write.h
index b987806,d07b954..0000000
--- a/fs/read_write.h
+++ b/fs/read_write.h
@@@ -8,5 -8,7 +8,3 @@@ typedef ssize_t (*io_fn_t)(struct file 
  typedef ssize_t (*iov_fn_t)(struct kiocb *, const struct iovec *,
                unsigned long, loff_t);
  
- ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, size_t count,
-                   loff_t max);
 -ssize_t do_sync_readv_writev(struct file *filp, const struct iovec *iov,
 -              unsigned long nr_segs, size_t len, loff_t *ppos, iov_fn_t fn);
 -ssize_t do_loop_readv_writev(struct file *filp, struct iovec *iov,
 -              unsigned long nr_segs, loff_t *ppos, io_fn_t fn);

Attachment: pgpRqgYA_ZibN.pgp
Description: PGP signature

Reply via email to