diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2012-10-09 10:03:21 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2012-10-09 10:04:25 -0400 |
commit | ffe315012510165ce82e4dd4767f0a5dba9edbf7 (patch) | |
tree | f601cd980af9d0ced5ca9aedecef4fa0d2ca0e15 /fs/splice.c | |
parent | e2d3a35ee427aaba99b6c68a56609ce276c51270 (diff) | |
parent | 4a8e43feeac7996b8de2d5b2823e316917493df4 (diff) |
Merge tag 'disintegrate-mtd-20121009' of git://git.infradead.org/users/dhowells/linux-headers
UAPI Disintegration 2012-10-09
Conflicts:
MAINTAINERS
arch/arm/configs/bcmring_defconfig
arch/arm/mach-imx/clk-imx51-imx53.c
drivers/mtd/nand/Kconfig
drivers/mtd/nand/bcm_umi_nand.c
drivers/mtd/nand/nand_bcm_umi.h
drivers/mtd/nand/orion_nand.c
Diffstat (limited to 'fs/splice.c')
-rw-r--r-- | fs/splice.c | 69 |
1 files changed, 32 insertions, 37 deletions
diff --git a/fs/splice.c b/fs/splice.c index 41514dd89462..13e5b4776e7a 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -1666,9 +1666,8 @@ static long vmsplice_to_pipe(struct file *file, const struct iovec __user *iov, | |||
1666 | SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, iov, | 1666 | SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, iov, |
1667 | unsigned long, nr_segs, unsigned int, flags) | 1667 | unsigned long, nr_segs, unsigned int, flags) |
1668 | { | 1668 | { |
1669 | struct file *file; | 1669 | struct fd f; |
1670 | long error; | 1670 | long error; |
1671 | int fput; | ||
1672 | 1671 | ||
1673 | if (unlikely(nr_segs > UIO_MAXIOV)) | 1672 | if (unlikely(nr_segs > UIO_MAXIOV)) |
1674 | return -EINVAL; | 1673 | return -EINVAL; |
@@ -1676,14 +1675,14 @@ SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, iov, | |||
1676 | return 0; | 1675 | return 0; |
1677 | 1676 | ||
1678 | error = -EBADF; | 1677 | error = -EBADF; |
1679 | file = fget_light(fd, &fput); | 1678 | f = fdget(fd); |
1680 | if (file) { | 1679 | if (f.file) { |
1681 | if (file->f_mode & FMODE_WRITE) | 1680 | if (f.file->f_mode & FMODE_WRITE) |
1682 | error = vmsplice_to_pipe(file, iov, nr_segs, flags); | 1681 | error = vmsplice_to_pipe(f.file, iov, nr_segs, flags); |
1683 | else if (file->f_mode & FMODE_READ) | 1682 | else if (f.file->f_mode & FMODE_READ) |
1684 | error = vmsplice_to_user(file, iov, nr_segs, flags); | 1683 | error = vmsplice_to_user(f.file, iov, nr_segs, flags); |
1685 | 1684 | ||
1686 | fput_light(file, fput); | 1685 | fdput(f); |
1687 | } | 1686 | } |
1688 | 1687 | ||
1689 | return error; | 1688 | return error; |
@@ -1693,30 +1692,27 @@ SYSCALL_DEFINE6(splice, int, fd_in, loff_t __user *, off_in, | |||
1693 | int, fd_out, loff_t __user *, off_out, | 1692 | int, fd_out, loff_t __user *, off_out, |
1694 | size_t, len, unsigned int, flags) | 1693 | size_t, len, unsigned int, flags) |
1695 | { | 1694 | { |
1695 | struct fd in, out; | ||
1696 | long error; | 1696 | long error; |
1697 | struct file *in, *out; | ||
1698 | int fput_in, fput_out; | ||
1699 | 1697 | ||
1700 | if (unlikely(!len)) | 1698 | if (unlikely(!len)) |
1701 | return 0; | 1699 | return 0; |
1702 | 1700 | ||
1703 | error = -EBADF; | 1701 | error = -EBADF; |
1704 | in = fget_light(fd_in, &fput_in); | 1702 | in = fdget(fd_in); |
1705 | if (in) { | 1703 | if (in.file) { |
1706 | if (in->f_mode & FMODE_READ) { | 1704 | if (in.file->f_mode & FMODE_READ) { |
1707 | out = fget_light(fd_out, &fput_out); | 1705 | out = fdget(fd_out); |
1708 | if (out) { | 1706 | if (out.file) { |
1709 | if (out->f_mode & FMODE_WRITE) | 1707 | if (out.file->f_mode & FMODE_WRITE) |
1710 | error = do_splice(in, off_in, | 1708 | error = do_splice(in.file, off_in, |
1711 | out, off_out, | 1709 | out.file, off_out, |
1712 | len, flags); | 1710 | len, flags); |
1713 | fput_light(out, fput_out); | 1711 | fdput(out); |
1714 | } | 1712 | } |
1715 | } | 1713 | } |
1716 | 1714 | fdput(in); | |
1717 | fput_light(in, fput_in); | ||
1718 | } | 1715 | } |
1719 | |||
1720 | return error; | 1716 | return error; |
1721 | } | 1717 | } |
1722 | 1718 | ||
@@ -2027,26 +2023,25 @@ static long do_tee(struct file *in, struct file *out, size_t len, | |||
2027 | 2023 | ||
2028 | SYSCALL_DEFINE4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags) | 2024 | SYSCALL_DEFINE4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags) |
2029 | { | 2025 | { |
2030 | struct file *in; | 2026 | struct fd in; |
2031 | int error, fput_in; | 2027 | int error; |
2032 | 2028 | ||
2033 | if (unlikely(!len)) | 2029 | if (unlikely(!len)) |
2034 | return 0; | 2030 | return 0; |
2035 | 2031 | ||
2036 | error = -EBADF; | 2032 | error = -EBADF; |
2037 | in = fget_light(fdin, &fput_in); | 2033 | in = fdget(fdin); |
2038 | if (in) { | 2034 | if (in.file) { |
2039 | if (in->f_mode & FMODE_READ) { | 2035 | if (in.file->f_mode & FMODE_READ) { |
2040 | int fput_out; | 2036 | struct fd out = fdget(fdout); |
2041 | struct file *out = fget_light(fdout, &fput_out); | 2037 | if (out.file) { |
2042 | 2038 | if (out.file->f_mode & FMODE_WRITE) | |
2043 | if (out) { | 2039 | error = do_tee(in.file, out.file, |
2044 | if (out->f_mode & FMODE_WRITE) | 2040 | len, flags); |
2045 | error = do_tee(in, out, len, flags); | 2041 | fdput(out); |
2046 | fput_light(out, fput_out); | ||
2047 | } | 2042 | } |
2048 | } | 2043 | } |
2049 | fput_light(in, fput_in); | 2044 | fdput(in); |
2050 | } | 2045 | } |
2051 | 2046 | ||
2052 | return error; | 2047 | return error; |