projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge remote-tracking branch 'lsk/v3.10/topic/big.LITTLE' into linux-linaro-lsk
[firefly-linux-kernel-4.4.55.git]
/
fs
/
splice.c
diff --git
a/fs/splice.c
b/fs/splice.c
index e6b25598c8c413d66026f96e6d6d1b351e28b62c..d37431dd60a1009f224d4c1bdc65b4fff505d2db 100644
(file)
--- a/
fs/splice.c
+++ b/
fs/splice.c
@@
-1274,7
+1274,7
@@
static int direct_splice_actor(struct pipe_inode_info *pipe,
{
struct file *file = sd->u.file;
{
struct file *file = sd->u.file;
- return do_splice_from(pipe, file,
&file->f_
pos, sd->total_len,
+ return do_splice_from(pipe, file,
sd->o
pos, sd->total_len,
sd->flags);
}
sd->flags);
}
@@
-1283,6
+1283,7
@@
static int direct_splice_actor(struct pipe_inode_info *pipe,
* @in: file to splice from
* @ppos: input file offset
* @out: file to splice to
* @in: file to splice from
* @ppos: input file offset
* @out: file to splice to
+ * @opos: output file offset
* @len: number of bytes to splice
* @flags: splice modifier flags
*
* @len: number of bytes to splice
* @flags: splice modifier flags
*
@@
-1294,7
+1295,7
@@
static int direct_splice_actor(struct pipe_inode_info *pipe,
*
*/
long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
*
*/
long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
- size_t len, unsigned int flags)
+
loff_t *opos,
size_t len, unsigned int flags)
{
struct splice_desc sd = {
.len = len,
{
struct splice_desc sd = {
.len = len,
@@
-1302,6
+1303,7
@@
long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
.flags = flags,
.pos = *ppos,
.u.file = out,
.flags = flags,
.pos = *ppos,
.u.file = out,
+ .opos = opos,
};
long ret;
};
long ret;
@@
-1325,7
+1327,7
@@
static long do_splice(struct file *in, loff_t __user *off_in,
{
struct pipe_inode_info *ipipe;
struct pipe_inode_info *opipe;
{
struct pipe_inode_info *ipipe;
struct pipe_inode_info *opipe;
- loff_t offset
, *off
;
+ loff_t offset;
long ret;
ipipe = get_pipe_info(in);
long ret;
ipipe = get_pipe_info(in);
@@
-1356,13
+1358,15
@@
static long do_splice(struct file *in, loff_t __user *off_in,
return -EINVAL;
if (copy_from_user(&offset, off_out, sizeof(loff_t)))
return -EFAULT;
return -EINVAL;
if (copy_from_user(&offset, off_out, sizeof(loff_t)))
return -EFAULT;
- off = &offset;
- } else
- off = &out->f_pos;
+ } else {
+ offset = out->f_pos;
+ }
- ret = do_splice_from(ipipe, out,
off
, len, flags);
+ ret = do_splice_from(ipipe, out,
&offset
, len, flags);
- if (off_out && copy_to_user(off_out, off, sizeof(loff_t)))
+ if (!off_out)
+ out->f_pos = offset;
+ else if (copy_to_user(off_out, &offset, sizeof(loff_t)))
ret = -EFAULT;
return ret;
ret = -EFAULT;
return ret;
@@
-1376,13
+1380,15
@@
static long do_splice(struct file *in, loff_t __user *off_in,
return -EINVAL;
if (copy_from_user(&offset, off_in, sizeof(loff_t)))
return -EFAULT;
return -EINVAL;
if (copy_from_user(&offset, off_in, sizeof(loff_t)))
return -EFAULT;
- off = &offset;
- } else
- off = &in->f_pos;
+ } else {
+ offset = in->f_pos;
+ }
- ret = do_splice_to(in,
off
, opipe, len, flags);
+ ret = do_splice_to(in,
&offset
, opipe, len, flags);
- if (off_in && copy_to_user(off_in, off, sizeof(loff_t)))
+ if (!off_in)
+ in->f_pos = offset;
+ else if (copy_to_user(off_in, &offset, sizeof(loff_t)))
ret = -EFAULT;
return ret;
ret = -EFAULT;
return ret;