Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

splice: lift checks from do_splice_from() into callers

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro 18c67cb9 68d70d03

+20 -11
+20 -11
fs/splice.c
··· 1098 1098 { 1099 1099 ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, 1100 1100 loff_t *, size_t, unsigned int); 1101 - int ret; 1102 - 1103 - if (unlikely(!(out->f_mode & FMODE_WRITE))) 1104 - return -EBADF; 1105 - 1106 - if (unlikely(out->f_flags & O_APPEND)) 1107 - return -EINVAL; 1108 - 1109 - ret = rw_verify_area(WRITE, out, ppos, len); 1110 - if (unlikely(ret < 0)) 1111 - return ret; 1112 1101 1113 1102 if (out->f_op && out->f_op->splice_write) 1114 1103 splice_write = out->f_op->splice_write; ··· 1292 1303 }; 1293 1304 long ret; 1294 1305 1306 + if (unlikely(!(out->f_mode & FMODE_WRITE))) 1307 + return -EBADF; 1308 + 1309 + if (unlikely(out->f_flags & O_APPEND)) 1310 + return -EINVAL; 1311 + 1312 + ret = rw_verify_area(WRITE, out, opos, len); 1313 + if (unlikely(ret < 0)) 1314 + return ret; 1315 + 1295 1316 ret = splice_direct_to_actor(in, &sd, direct_splice_actor); 1296 1317 if (ret > 0) 1297 1318 *ppos = sd.pos; ··· 1356 1357 } else { 1357 1358 offset = out->f_pos; 1358 1359 } 1360 + 1361 + if (unlikely(!(out->f_mode & FMODE_WRITE))) 1362 + return -EBADF; 1363 + 1364 + if (unlikely(out->f_flags & O_APPEND)) 1365 + return -EINVAL; 1366 + 1367 + ret = rw_verify_area(WRITE, out, &offset, len); 1368 + if (unlikely(ret < 0)) 1369 + return ret; 1359 1370 1360 1371 file_start_write(out); 1361 1372 ret = do_splice_from(ipipe, out, &offset, len, flags);