Skip to content

Commit 72ec351

Browse files
author
Al Viro
committed
switch compat readv/writev variants to COMPAT_SYSCALL_DEFINE
... and take to fs/read_write.c Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent bdaec33 commit 72ec351

File tree

5 files changed

+197
-210
lines changed

5 files changed

+197
-210
lines changed

arch/s390/kernel/compat_wrapper.S

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1387,22 +1387,6 @@ ENTRY(compat_sys_keyctl_wrapper)
13871387
llgfr %r6,%r6 # u32
13881388
jg compat_sys_keyctl # branch to system call
13891389

1390-
ENTRY(compat_sys_preadv_wrapper)
1391-
llgfr %r2,%r2 # unsigned long
1392-
llgtr %r3,%r3 # compat_iovec *
1393-
llgfr %r4,%r4 # unsigned long
1394-
llgfr %r5,%r5 # u32
1395-
llgfr %r6,%r6 # u32
1396-
jg compat_sys_preadv # branch to system call
1397-
1398-
ENTRY(compat_sys_pwritev_wrapper)
1399-
llgfr %r2,%r2 # unsigned long
1400-
llgtr %r3,%r3 # compat_iovec *
1401-
llgfr %r4,%r4 # unsigned long
1402-
llgfr %r5,%r5 # u32
1403-
llgfr %r6,%r6 # u32
1404-
jg compat_sys_pwritev # branch to system call
1405-
14061390
ENTRY(sys_perf_event_open_wrapper)
14071391
llgtr %r2,%r2 # const struct perf_event_attr *
14081392
lgfr %r3,%r3 # pid_t

arch/s390/kernel/syscalls.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -336,8 +336,8 @@ SYSCALL(sys_inotify_init1,sys_inotify_init1,sys_inotify_init1_wrapper)
336336
SYSCALL(sys_pipe2,sys_pipe2,sys_pipe2_wrapper) /* 325 */
337337
SYSCALL(sys_dup3,sys_dup3,sys_dup3_wrapper)
338338
SYSCALL(sys_epoll_create1,sys_epoll_create1,sys_epoll_create1_wrapper)
339-
SYSCALL(sys_preadv,sys_preadv,compat_sys_preadv_wrapper)
340-
SYSCALL(sys_pwritev,sys_pwritev,compat_sys_pwritev_wrapper)
339+
SYSCALL(sys_preadv,sys_preadv,compat_sys_preadv)
340+
SYSCALL(sys_pwritev,sys_pwritev,compat_sys_pwritev)
341341
SYSCALL(sys_rt_tgsigqueueinfo,sys_rt_tgsigqueueinfo,compat_sys_rt_tgsigqueueinfo) /* 330 */
342342
SYSCALL(sys_perf_event_open,sys_perf_event_open,sys_perf_event_open_wrapper)
343343
SYSCALL(sys_fanotify_init,sys_fanotify_init,sys_fanotify_init_wrapper)

fs/compat.c

Lines changed: 0 additions & 186 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,192 +1069,6 @@ asmlinkage long compat_sys_getdents64(unsigned int fd,
10691069
}
10701070
#endif /* ! __ARCH_OMIT_COMPAT_SYS_GETDENTS64 */
10711071

1072-
static ssize_t compat_do_readv_writev(int type, struct file *file,
1073-
const struct compat_iovec __user *uvector,
1074-
unsigned long nr_segs, loff_t *pos)
1075-
{
1076-
compat_ssize_t tot_len;
1077-
struct iovec iovstack[UIO_FASTIOV];
1078-
struct iovec *iov = iovstack;
1079-
ssize_t ret;
1080-
io_fn_t fn;
1081-
iov_fn_t fnv;
1082-
1083-
ret = -EINVAL;
1084-
if (!file->f_op)
1085-
goto out;
1086-
1087-
ret = compat_rw_copy_check_uvector(type, uvector, nr_segs,
1088-
UIO_FASTIOV, iovstack, &iov);
1089-
if (ret <= 0)
1090-
goto out;
1091-
1092-
tot_len = ret;
1093-
ret = rw_verify_area(type, file, pos, tot_len);
1094-
if (ret < 0)
1095-
goto out;
1096-
1097-
fnv = NULL;
1098-
if (type == READ) {
1099-
fn = file->f_op->read;
1100-
fnv = file->f_op->aio_read;
1101-
} else {
1102-
fn = (io_fn_t)file->f_op->write;
1103-
fnv = file->f_op->aio_write;
1104-
}
1105-
1106-
if (fnv) {
1107-
file_start_write(file);
1108-
ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
1109-
pos, fnv);
1110-
file_end_write(file);
1111-
} else
1112-
ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
1113-
1114-
out:
1115-
if (iov != iovstack)
1116-
kfree(iov);
1117-
if ((ret + (type == READ)) > 0) {
1118-
if (type == READ)
1119-
fsnotify_access(file);
1120-
else
1121-
fsnotify_modify(file);
1122-
}
1123-
return ret;
1124-
}
1125-
1126-
static size_t compat_readv(struct file *file,
1127-
const struct compat_iovec __user *vec,
1128-
unsigned long vlen, loff_t *pos)
1129-
{
1130-
ssize_t ret = -EBADF;
1131-
1132-
if (!(file->f_mode & FMODE_READ))
1133-
goto out;
1134-
1135-
ret = -EINVAL;
1136-
if (!file->f_op || (!file->f_op->aio_read && !file->f_op->read))
1137-
goto out;
1138-
1139-
ret = compat_do_readv_writev(READ, file, vec, vlen, pos);
1140-
1141-
out:
1142-
if (ret > 0)
1143-
add_rchar(current, ret);
1144-
inc_syscr(current);
1145-
return ret;
1146-
}
1147-
1148-
asmlinkage ssize_t
1149-
compat_sys_readv(unsigned long fd, const struct compat_iovec __user *vec,
1150-
unsigned long vlen)
1151-
{
1152-
struct fd f = fdget(fd);
1153-
ssize_t ret;
1154-
loff_t pos;
1155-
1156-
if (!f.file)
1157-
return -EBADF;
1158-
pos = f.file->f_pos;
1159-
ret = compat_readv(f.file, vec, vlen, &pos);
1160-
f.file->f_pos = pos;
1161-
fdput(f);
1162-
return ret;
1163-
}
1164-
1165-
asmlinkage ssize_t
1166-
compat_sys_preadv64(unsigned long fd, const struct compat_iovec __user *vec,
1167-
unsigned long vlen, loff_t pos)
1168-
{
1169-
struct fd f;
1170-
ssize_t ret;
1171-
1172-
if (pos < 0)
1173-
return -EINVAL;
1174-
f = fdget(fd);
1175-
if (!f.file)
1176-
return -EBADF;
1177-
ret = -ESPIPE;
1178-
if (f.file->f_mode & FMODE_PREAD)
1179-
ret = compat_readv(f.file, vec, vlen, &pos);
1180-
fdput(f);
1181-
return ret;
1182-
}
1183-
1184-
asmlinkage ssize_t
1185-
compat_sys_preadv(unsigned long fd, const struct compat_iovec __user *vec,
1186-
unsigned long vlen, u32 pos_low, u32 pos_high)
1187-
{
1188-
loff_t pos = ((loff_t)pos_high << 32) | pos_low;
1189-
return compat_sys_preadv64(fd, vec, vlen, pos);
1190-
}
1191-
1192-
static size_t compat_writev(struct file *file,
1193-
const struct compat_iovec __user *vec,
1194-
unsigned long vlen, loff_t *pos)
1195-
{
1196-
ssize_t ret = -EBADF;
1197-
1198-
if (!(file->f_mode & FMODE_WRITE))
1199-
goto out;
1200-
1201-
ret = -EINVAL;
1202-
if (!file->f_op || (!file->f_op->aio_write && !file->f_op->write))
1203-
goto out;
1204-
1205-
ret = compat_do_readv_writev(WRITE, file, vec, vlen, pos);
1206-
1207-
out:
1208-
if (ret > 0)
1209-
add_wchar(current, ret);
1210-
inc_syscw(current);
1211-
return ret;
1212-
}
1213-
1214-
asmlinkage ssize_t
1215-
compat_sys_writev(unsigned long fd, const struct compat_iovec __user *vec,
1216-
unsigned long vlen)
1217-
{
1218-
struct fd f = fdget(fd);
1219-
ssize_t ret;
1220-
loff_t pos;
1221-
1222-
if (!f.file)
1223-
return -EBADF;
1224-
pos = f.file->f_pos;
1225-
ret = compat_writev(f.file, vec, vlen, &pos);
1226-
f.file->f_pos = pos;
1227-
fdput(f);
1228-
return ret;
1229-
}
1230-
1231-
asmlinkage ssize_t
1232-
compat_sys_pwritev64(unsigned long fd, const struct compat_iovec __user *vec,
1233-
unsigned long vlen, loff_t pos)
1234-
{
1235-
struct fd f;
1236-
ssize_t ret;
1237-
1238-
if (pos < 0)
1239-
return -EINVAL;
1240-
f = fdget(fd);
1241-
if (!f.file)
1242-
return -EBADF;
1243-
ret = -ESPIPE;
1244-
if (f.file->f_mode & FMODE_PWRITE)
1245-
ret = compat_writev(f.file, vec, vlen, &pos);
1246-
fdput(f);
1247-
return ret;
1248-
}
1249-
1250-
asmlinkage ssize_t
1251-
compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec,
1252-
unsigned long vlen, u32 pos_low, u32 pos_high)
1253-
{
1254-
loff_t pos = ((loff_t)pos_high << 32) | pos_low;
1255-
return compat_sys_pwritev64(fd, vec, vlen, pos);
1256-
}
1257-
12581072
asmlinkage long
12591073
compat_sys_vmsplice(int fd, const struct compat_iovec __user *iov32,
12601074
unsigned int nr_segs, unsigned int flags)

0 commit comments

Comments
 (0)