aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2017-05-27 04:16:48 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2017-06-29 17:49:22 -0400
commit19c735868dd018fd432d0df43aaf2d5ecb7c1256 (patch)
tree4af76a023d4a2ebb68fbb46081da2b915962188e
parent26c87fb7d10dadc59a475c7809adc05303bf951e (diff)
fs: remove __do_readv_writev
Split it into one helper each for reads vs writes. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/read_write.c60
1 files changed, 36 insertions, 24 deletions
diff --git a/fs/read_write.c b/fs/read_write.c
index 5cbdf23d924f..f453c9a485b9 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -916,8 +916,8 @@ out:
916} 916}
917#endif 917#endif
918 918
919static ssize_t __do_readv_writev(int type, struct file *file, 919static ssize_t do_iter_read(struct file *file, struct iov_iter *iter,
920 struct iov_iter *iter, loff_t *pos, int flags) 920 loff_t *pos, int flags)
921{ 921{
922 size_t tot_len; 922 size_t tot_len;
923 ssize_t ret = 0; 923 ssize_t ret = 0;
@@ -925,29 +925,41 @@ static ssize_t __do_readv_writev(int type, struct file *file,
925 tot_len = iov_iter_count(iter); 925 tot_len = iov_iter_count(iter);
926 if (!tot_len) 926 if (!tot_len)
927 goto out; 927 goto out;
928 ret = rw_verify_area(type, file, pos, tot_len); 928 ret = rw_verify_area(READ, file, pos, tot_len);
929 if (ret < 0) 929 if (ret < 0)
930 goto out; 930 return ret;
931
932 if (type != READ)
933 file_start_write(file);
934 931
935 if ((type == READ && file->f_op->read_iter) || 932 if (file->f_op->read_iter)
936 (type == WRITE && file->f_op->write_iter)) 933 ret = do_iter_readv_writev(file, iter, pos, READ, flags);
937 ret = do_iter_readv_writev(file, iter, pos, type, flags);
938 else 934 else
939 ret = do_loop_readv_writev(file, iter, pos, type, flags); 935 ret = do_loop_readv_writev(file, iter, pos, READ, flags);
936out:
937 if (ret >= 0)
938 fsnotify_access(file);
939 return ret;
940}
940 941
941 if (type != READ) 942static ssize_t do_iter_write(struct file *file, struct iov_iter *iter,
942 file_end_write(file); 943 loff_t *pos, int flags)
944{
945 size_t tot_len;
946 ssize_t ret = 0;
943 947
944out: 948 tot_len = iov_iter_count(iter);
945 if ((ret + (type == READ)) > 0) { 949 if (!tot_len)
946 if (type == READ) 950 return 0;
947 fsnotify_access(file); 951 ret = rw_verify_area(WRITE, file, pos, tot_len);
948 else 952 if (ret < 0)
949 fsnotify_modify(file); 953 return ret;
950 } 954
955 file_start_write(file);
956 if (file->f_op->write_iter)
957 ret = do_iter_readv_writev(file, iter, pos, WRITE, flags);
958 else
959 ret = do_loop_readv_writev(file, iter, pos, WRITE, flags);
960 file_end_write(file);
961 if (ret > 0)
962 fsnotify_modify(file);
951 return ret; 963 return ret;
952} 964}
953 965
@@ -968,7 +980,7 @@ ssize_t vfs_readv(struct file *file, const struct iovec __user *vec,
968 if (ret < 0) 980 if (ret < 0)
969 return ret; 981 return ret;
970 982
971 ret = __do_readv_writev(READ, file, &iter, pos, flags); 983 ret = do_iter_read(file, &iter, pos, flags);
972 kfree(iov); 984 kfree(iov);
973 return ret; 985 return ret;
974} 986}
@@ -991,7 +1003,7 @@ ssize_t vfs_writev(struct file *file, const struct iovec __user *vec,
991 if (ret < 0) 1003 if (ret < 0)
992 return ret; 1004 return ret;
993 1005
994 ret = __do_readv_writev(WRITE, file, &iter, pos, flags); 1006 ret = do_iter_write(file, &iter, pos, flags);
995 kfree(iov); 1007 kfree(iov);
996 return ret; 1008 return ret;
997} 1009}
@@ -1161,7 +1173,7 @@ static size_t compat_readv(struct file *file,
1161 ret = compat_import_iovec(READ, vec, vlen, UIO_FASTIOV, &iov, &iter); 1173 ret = compat_import_iovec(READ, vec, vlen, UIO_FASTIOV, &iov, &iter);
1162 if (ret < 0) 1174 if (ret < 0)
1163 goto out; 1175 goto out;
1164 ret = __do_readv_writev(READ, file, &iter, pos, flags); 1176 ret = do_iter_read(file, &iter, pos, flags);
1165 kfree(iov); 1177 kfree(iov);
1166out: 1178out:
1167 if (ret > 0) 1179 if (ret > 0)
@@ -1274,7 +1286,7 @@ static size_t compat_writev(struct file *file,
1274 ret = compat_import_iovec(WRITE, vec, vlen, UIO_FASTIOV, &iov, &iter); 1286 ret = compat_import_iovec(WRITE, vec, vlen, UIO_FASTIOV, &iov, &iter);
1275 if (ret < 0) 1287 if (ret < 0)
1276 goto out; 1288 goto out;
1277 ret = __do_readv_writev(WRITE, file, &iter, pos, flags); 1289 ret = do_iter_write(file, &iter, pos, flags);
1278 kfree(iov); 1290 kfree(iov);
1279out: 1291out:
1280 if (ret > 0) 1292 if (ret > 0)