linux-next: manual merge of the signal tree with the vfs tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Al,

Today's linux-next merge of the signal tree got a conflict in fs/compat.c
between commit 1fd193fd030a ("switch compat readv/writev variants to
COMPAT_SYSCALL_DEFINE") from the vfs tree and commit 76b021d053ed
("convert vmsplice 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                    sfr@xxxxxxxxxxxxxxxx

diff --cc fs/compat.c
index 5058345,b7a89b9..0000000
--- a/fs/compat.c
+++ b/fs/compat.c
@@@ -1069,26 -1064,195 +1068,6 @@@ asmlinkage long compat_sys_getdents64(u
  }
  #endif /* ! __ARCH_OMIT_COMPAT_SYS_GETDENTS64 */
  
- asmlinkage long
- compat_sys_vmsplice(int fd, const struct compat_iovec __user *iov32,
- 		    unsigned int nr_segs, unsigned int flags)
- {
- 	unsigned i;
- 	struct iovec __user *iov;
- 	if (nr_segs > UIO_MAXIOV)
- 		return -EINVAL;
- 	iov = compat_alloc_user_space(nr_segs * sizeof(struct iovec));
- 	for (i = 0; i < nr_segs; i++) {
- 		struct compat_iovec v;
- 		if (get_user(v.iov_base, &iov32[i].iov_base) ||
- 		    get_user(v.iov_len, &iov32[i].iov_len) ||
- 		    put_user(compat_ptr(v.iov_base), &iov[i].iov_base) ||
- 		    put_user(v.iov_len, &iov[i].iov_len))
- 			return -EFAULT;
- 	}
- 	return sys_vmsplice(fd, iov, nr_segs, flags);
- }
- 
 -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;
 -
 -	tot_len = compat_rw_copy_check_uvector(type, uvector, nr_segs,
 -					       UIO_FASTIOV, iovstack, &iov);
 -	if (tot_len == 0) {
 -		ret = 0;
 -		goto out;
 -	}
 -
 -	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;
 -	}
 -
 -	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);
 -
 -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;
 -}
 -
 -asmlinkage ssize_t
 -compat_sys_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;
 -}
 -
 -asmlinkage ssize_t
 -compat_sys_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;
 -}
 -
 -asmlinkage ssize_t
 -compat_sys_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;
 -}
 -
 -asmlinkage ssize_t
 -compat_sys_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;
 -}
 -
 -asmlinkage ssize_t
 -compat_sys_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;
 -}
 -
 -asmlinkage ssize_t
 -compat_sys_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);
 -}
 -
  /*
   * Exactly like fs/open.c:sys_open(), except that it doesn't set the
   * O_LARGEFILE flag.

Attachment: pgpgDVIR1dF_W.pgp
Description: PGP signature


[Index of Archives]     [Linux Kernel]     [Linux USB Development]     [Yosemite News]     [Linux SCSI]

  Powered by Linux