Commit 7bb307e894d51308aa0582a8c4cc5875bbc645b9
1 parent
94e07a7590
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
export kernel_write(), convert open-coded instances
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Showing 5 changed files with 24 additions and 61 deletions Side-by-side Diff
drivers/mtd/nand/nandsim.c
... | ... | @@ -1408,40 +1408,32 @@ |
1408 | 1408 | current->flags &= ~PF_MEMALLOC; |
1409 | 1409 | } |
1410 | 1410 | |
1411 | -static ssize_t read_file(struct nandsim *ns, struct file *file, void *buf, size_t count, loff_t *pos) | |
1411 | +static ssize_t read_file(struct nandsim *ns, struct file *file, void *buf, size_t count, loff_t pos) | |
1412 | 1412 | { |
1413 | - mm_segment_t old_fs; | |
1414 | 1413 | ssize_t tx; |
1415 | 1414 | int err, memalloc; |
1416 | 1415 | |
1417 | - err = get_pages(ns, file, count, *pos); | |
1416 | + err = get_pages(ns, file, count, pos); | |
1418 | 1417 | if (err) |
1419 | 1418 | return err; |
1420 | - old_fs = get_fs(); | |
1421 | - set_fs(get_ds()); | |
1422 | 1419 | memalloc = set_memalloc(); |
1423 | - tx = vfs_read(file, (char __user *)buf, count, pos); | |
1420 | + tx = kernel_read(file, pos, buf, count); | |
1424 | 1421 | clear_memalloc(memalloc); |
1425 | - set_fs(old_fs); | |
1426 | 1422 | put_pages(ns); |
1427 | 1423 | return tx; |
1428 | 1424 | } |
1429 | 1425 | |
1430 | -static ssize_t write_file(struct nandsim *ns, struct file *file, void *buf, size_t count, loff_t *pos) | |
1426 | +static ssize_t write_file(struct nandsim *ns, struct file *file, void *buf, size_t count, loff_t pos) | |
1431 | 1427 | { |
1432 | - mm_segment_t old_fs; | |
1433 | 1428 | ssize_t tx; |
1434 | 1429 | int err, memalloc; |
1435 | 1430 | |
1436 | - err = get_pages(ns, file, count, *pos); | |
1431 | + err = get_pages(ns, file, count, pos); | |
1437 | 1432 | if (err) |
1438 | 1433 | return err; |
1439 | - old_fs = get_fs(); | |
1440 | - set_fs(get_ds()); | |
1441 | 1434 | memalloc = set_memalloc(); |
1442 | - tx = vfs_write(file, (char __user *)buf, count, pos); | |
1435 | + tx = kernel_write(file, buf, count, pos); | |
1443 | 1436 | clear_memalloc(memalloc); |
1444 | - set_fs(old_fs); | |
1445 | 1437 | put_pages(ns); |
1446 | 1438 | return tx; |
1447 | 1439 | } |
... | ... | @@ -1511,7 +1503,7 @@ |
1511 | 1503 | if (do_read_error(ns, num)) |
1512 | 1504 | return; |
1513 | 1505 | pos = (loff_t)ns->regs.row * ns->geom.pgszoob + ns->regs.column + ns->regs.off; |
1514 | - tx = read_file(ns, ns->cfile, ns->buf.byte, num, &pos); | |
1506 | + tx = read_file(ns, ns->cfile, ns->buf.byte, num, pos); | |
1515 | 1507 | if (tx != num) { |
1516 | 1508 | NS_ERR("read_page: read error for page %d ret %ld\n", ns->regs.row, (long)tx); |
1517 | 1509 | return; |
... | ... | @@ -1573,7 +1565,7 @@ |
1573 | 1565 | u_char *pg_off; |
1574 | 1566 | |
1575 | 1567 | if (ns->cfile) { |
1576 | - loff_t off, pos; | |
1568 | + loff_t off; | |
1577 | 1569 | ssize_t tx; |
1578 | 1570 | int all; |
1579 | 1571 | |
... | ... | @@ -1585,8 +1577,7 @@ |
1585 | 1577 | memset(ns->file_buf, 0xff, ns->geom.pgszoob); |
1586 | 1578 | } else { |
1587 | 1579 | all = 0; |
1588 | - pos = off; | |
1589 | - tx = read_file(ns, ns->cfile, pg_off, num, &pos); | |
1580 | + tx = read_file(ns, ns->cfile, pg_off, num, off); | |
1590 | 1581 | if (tx != num) { |
1591 | 1582 | NS_ERR("prog_page: read error for page %d ret %ld\n", ns->regs.row, (long)tx); |
1592 | 1583 | return -1; |
1593 | 1584 | |
... | ... | @@ -1595,16 +1586,15 @@ |
1595 | 1586 | for (i = 0; i < num; i++) |
1596 | 1587 | pg_off[i] &= ns->buf.byte[i]; |
1597 | 1588 | if (all) { |
1598 | - pos = (loff_t)ns->regs.row * ns->geom.pgszoob; | |
1599 | - tx = write_file(ns, ns->cfile, ns->file_buf, ns->geom.pgszoob, &pos); | |
1589 | + loff_t pos = (loff_t)ns->regs.row * ns->geom.pgszoob; | |
1590 | + tx = write_file(ns, ns->cfile, ns->file_buf, ns->geom.pgszoob, pos); | |
1600 | 1591 | if (tx != ns->geom.pgszoob) { |
1601 | 1592 | NS_ERR("prog_page: write error for page %d ret %ld\n", ns->regs.row, (long)tx); |
1602 | 1593 | return -1; |
1603 | 1594 | } |
1604 | 1595 | ns->pages_written[ns->regs.row] = 1; |
1605 | 1596 | } else { |
1606 | - pos = off; | |
1607 | - tx = write_file(ns, ns->cfile, pg_off, num, &pos); | |
1597 | + tx = write_file(ns, ns->cfile, pg_off, num, off); | |
1608 | 1598 | if (tx != num) { |
1609 | 1599 | NS_ERR("prog_page: write error for page %d ret %ld\n", ns->regs.row, (long)tx); |
1610 | 1600 | return -1; |
fs/ecryptfs/read_write.c
... | ... | @@ -40,16 +40,12 @@ |
40 | 40 | loff_t offset, size_t size) |
41 | 41 | { |
42 | 42 | struct file *lower_file; |
43 | - mm_segment_t fs_save; | |
44 | 43 | ssize_t rc; |
45 | 44 | |
46 | 45 | lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file; |
47 | 46 | if (!lower_file) |
48 | 47 | return -EIO; |
49 | - fs_save = get_fs(); | |
50 | - set_fs(get_ds()); | |
51 | - rc = vfs_write(lower_file, data, size, &offset); | |
52 | - set_fs(fs_save); | |
48 | + rc = kernel_write(lower_file, data, size, offset); | |
53 | 49 | mark_inode_dirty_sync(ecryptfs_inode); |
54 | 50 | return rc; |
55 | 51 | } |
fs/splice.c
... | ... | @@ -569,7 +569,7 @@ |
569 | 569 | return res; |
570 | 570 | } |
571 | 571 | |
572 | -static ssize_t kernel_write(struct file *file, const char *buf, size_t count, | |
572 | +ssize_t kernel_write(struct file *file, const char *buf, size_t count, | |
573 | 573 | loff_t pos) |
574 | 574 | { |
575 | 575 | mm_segment_t old_fs; |
576 | 576 | |
... | ... | @@ -578,11 +578,12 @@ |
578 | 578 | old_fs = get_fs(); |
579 | 579 | set_fs(get_ds()); |
580 | 580 | /* The cast to a user pointer is valid due to the set_fs() */ |
581 | - res = vfs_write(file, (const char __user *)buf, count, &pos); | |
581 | + res = vfs_write(file, (__force const char __user *)buf, count, &pos); | |
582 | 582 | set_fs(old_fs); |
583 | 583 | |
584 | 584 | return res; |
585 | 585 | } |
586 | +EXPORT_SYMBOL(kernel_write); | |
586 | 587 | |
587 | 588 | ssize_t default_file_splice_read(struct file *in, loff_t *ppos, |
588 | 589 | struct pipe_inode_info *pipe, size_t len, |
include/linux/fs.h
... | ... | @@ -2277,6 +2277,7 @@ |
2277 | 2277 | extern int do_pipe_flags(int *, int); |
2278 | 2278 | |
2279 | 2279 | extern int kernel_read(struct file *, loff_t, char *, unsigned long); |
2280 | +extern ssize_t kernel_write(struct file *, const char *, size_t, loff_t); | |
2280 | 2281 | extern struct file * open_exec(const char *); |
2281 | 2282 | |
2282 | 2283 | /* fs/dcache.c -- generic fs support functions */ |
kernel/sysctl_binary.c
... | ... | @@ -971,7 +971,6 @@ |
971 | 971 | static ssize_t bin_intvec(struct file *file, |
972 | 972 | void __user *oldval, size_t oldlen, void __user *newval, size_t newlen) |
973 | 973 | { |
974 | - mm_segment_t old_fs = get_fs(); | |
975 | 974 | ssize_t copied = 0; |
976 | 975 | char *buffer; |
977 | 976 | ssize_t result; |
978 | 977 | |
... | ... | @@ -984,13 +983,10 @@ |
984 | 983 | if (oldval && oldlen) { |
985 | 984 | unsigned __user *vec = oldval; |
986 | 985 | size_t length = oldlen / sizeof(*vec); |
987 | - loff_t pos = 0; | |
988 | 986 | char *str, *end; |
989 | 987 | int i; |
990 | 988 | |
991 | - set_fs(KERNEL_DS); | |
992 | - result = vfs_read(file, buffer, BUFSZ - 1, &pos); | |
993 | - set_fs(old_fs); | |
989 | + result = kernel_read(file, 0, buffer, BUFSZ - 1); | |
994 | 990 | if (result < 0) |
995 | 991 | goto out_kfree; |
996 | 992 | |
... | ... | @@ -1017,7 +1013,6 @@ |
1017 | 1013 | if (newval && newlen) { |
1018 | 1014 | unsigned __user *vec = newval; |
1019 | 1015 | size_t length = newlen / sizeof(*vec); |
1020 | - loff_t pos = 0; | |
1021 | 1016 | char *str, *end; |
1022 | 1017 | int i; |
1023 | 1018 | |
... | ... | @@ -1033,9 +1028,7 @@ |
1033 | 1028 | str += snprintf(str, end - str, "%lu\t", value); |
1034 | 1029 | } |
1035 | 1030 | |
1036 | - set_fs(KERNEL_DS); | |
1037 | - result = vfs_write(file, buffer, str - buffer, &pos); | |
1038 | - set_fs(old_fs); | |
1031 | + result = kernel_write(file, buffer, str - buffer, 0); | |
1039 | 1032 | if (result < 0) |
1040 | 1033 | goto out_kfree; |
1041 | 1034 | } |
... | ... | @@ -1049,7 +1042,6 @@ |
1049 | 1042 | static ssize_t bin_ulongvec(struct file *file, |
1050 | 1043 | void __user *oldval, size_t oldlen, void __user *newval, size_t newlen) |
1051 | 1044 | { |
1052 | - mm_segment_t old_fs = get_fs(); | |
1053 | 1045 | ssize_t copied = 0; |
1054 | 1046 | char *buffer; |
1055 | 1047 | ssize_t result; |
1056 | 1048 | |
... | ... | @@ -1062,13 +1054,10 @@ |
1062 | 1054 | if (oldval && oldlen) { |
1063 | 1055 | unsigned long __user *vec = oldval; |
1064 | 1056 | size_t length = oldlen / sizeof(*vec); |
1065 | - loff_t pos = 0; | |
1066 | 1057 | char *str, *end; |
1067 | 1058 | int i; |
1068 | 1059 | |
1069 | - set_fs(KERNEL_DS); | |
1070 | - result = vfs_read(file, buffer, BUFSZ - 1, &pos); | |
1071 | - set_fs(old_fs); | |
1060 | + result = kernel_read(file, 0, buffer, BUFSZ - 1); | |
1072 | 1061 | if (result < 0) |
1073 | 1062 | goto out_kfree; |
1074 | 1063 | |
... | ... | @@ -1095,7 +1084,6 @@ |
1095 | 1084 | if (newval && newlen) { |
1096 | 1085 | unsigned long __user *vec = newval; |
1097 | 1086 | size_t length = newlen / sizeof(*vec); |
1098 | - loff_t pos = 0; | |
1099 | 1087 | char *str, *end; |
1100 | 1088 | int i; |
1101 | 1089 | |
... | ... | @@ -1111,9 +1099,7 @@ |
1111 | 1099 | str += snprintf(str, end - str, "%lu\t", value); |
1112 | 1100 | } |
1113 | 1101 | |
1114 | - set_fs(KERNEL_DS); | |
1115 | - result = vfs_write(file, buffer, str - buffer, &pos); | |
1116 | - set_fs(old_fs); | |
1102 | + result = kernel_write(file, buffer, str - buffer, 0); | |
1117 | 1103 | if (result < 0) |
1118 | 1104 | goto out_kfree; |
1119 | 1105 | } |
1120 | 1106 | |
1121 | 1107 | |
... | ... | @@ -1127,19 +1113,15 @@ |
1127 | 1113 | static ssize_t bin_uuid(struct file *file, |
1128 | 1114 | void __user *oldval, size_t oldlen, void __user *newval, size_t newlen) |
1129 | 1115 | { |
1130 | - mm_segment_t old_fs = get_fs(); | |
1131 | 1116 | ssize_t result, copied = 0; |
1132 | 1117 | |
1133 | 1118 | /* Only supports reads */ |
1134 | 1119 | if (oldval && oldlen) { |
1135 | - loff_t pos = 0; | |
1136 | 1120 | char buf[40], *str = buf; |
1137 | 1121 | unsigned char uuid[16]; |
1138 | 1122 | int i; |
1139 | 1123 | |
1140 | - set_fs(KERNEL_DS); | |
1141 | - result = vfs_read(file, buf, sizeof(buf) - 1, &pos); | |
1142 | - set_fs(old_fs); | |
1124 | + result = kernel_read(file, 0, buf, sizeof(buf) - 1); | |
1143 | 1125 | if (result < 0) |
1144 | 1126 | goto out; |
1145 | 1127 | |
1146 | 1128 | |
1147 | 1129 | |
... | ... | @@ -1175,18 +1157,14 @@ |
1175 | 1157 | static ssize_t bin_dn_node_address(struct file *file, |
1176 | 1158 | void __user *oldval, size_t oldlen, void __user *newval, size_t newlen) |
1177 | 1159 | { |
1178 | - mm_segment_t old_fs = get_fs(); | |
1179 | 1160 | ssize_t result, copied = 0; |
1180 | 1161 | |
1181 | 1162 | if (oldval && oldlen) { |
1182 | - loff_t pos = 0; | |
1183 | 1163 | char buf[15], *nodep; |
1184 | 1164 | unsigned long area, node; |
1185 | 1165 | __le16 dnaddr; |
1186 | 1166 | |
1187 | - set_fs(KERNEL_DS); | |
1188 | - result = vfs_read(file, buf, sizeof(buf) - 1, &pos); | |
1189 | - set_fs(old_fs); | |
1167 | + result = kernel_read(file, 0, buf, sizeof(buf) - 1); | |
1190 | 1168 | if (result < 0) |
1191 | 1169 | goto out; |
1192 | 1170 | |
... | ... | @@ -1215,7 +1193,6 @@ |
1215 | 1193 | } |
1216 | 1194 | |
1217 | 1195 | if (newval && newlen) { |
1218 | - loff_t pos = 0; | |
1219 | 1196 | __le16 dnaddr; |
1220 | 1197 | char buf[15]; |
1221 | 1198 | int len; |
... | ... | @@ -1232,9 +1209,7 @@ |
1232 | 1209 | le16_to_cpu(dnaddr) >> 10, |
1233 | 1210 | le16_to_cpu(dnaddr) & 0x3ff); |
1234 | 1211 | |
1235 | - set_fs(KERNEL_DS); | |
1236 | - result = vfs_write(file, buf, len, &pos); | |
1237 | - set_fs(old_fs); | |
1212 | + result = kernel_write(file, buf, len, 0); | |
1238 | 1213 | if (result < 0) |
1239 | 1214 | goto out; |
1240 | 1215 | } |