aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2014-03-04 15:24:06 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2014-05-06 17:32:43 -0400
commitcb66a7a1f149ff705fa37cad6d1252b046e0ad4f (patch)
tree32dd17f294e9ef96bfea727bba313a33590917ab
parent0ae5e4d370599592eab845527b31708a4f3411be (diff)
kill generic_segment_checks()
all callers of ->aio_read() and ->aio_write() have iov/nr_segs already checked - generic_segment_checks() done after that is just an odd way to spell iov_length(). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--drivers/staging/lustre/lustre/llite/file.c10
-rw-r--r--fs/btrfs/file.c7
-rw-r--r--fs/ceph/file.c13
-rw-r--r--fs/fuse/file.c7
-rw-r--r--fs/ntfs/file.c5
-rw-r--r--fs/ocfs2/file.c7
-rw-r--r--fs/xfs/xfs_file.c9
-rw-r--r--include/linux/fs.h2
-rw-r--r--mm/filemap.c53
-rw-r--r--mm/shmem.c7
10 files changed, 16 insertions, 104 deletions
diff --git a/drivers/staging/lustre/lustre/llite/file.c b/drivers/staging/lustre/lustre/llite/file.c
index 8e844a6371e0..220bd8390a84 100644
--- a/drivers/staging/lustre/lustre/llite/file.c
+++ b/drivers/staging/lustre/lustre/llite/file.c
@@ -1180,9 +1180,7 @@ static ssize_t ll_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
1180 ssize_t result; 1180 ssize_t result;
1181 int refcheck; 1181 int refcheck;
1182 1182
1183 result = generic_segment_checks(iov, &nr_segs, &count, VERIFY_WRITE); 1183 count = iov_length(iov, nr_segs);
1184 if (result)
1185 return result;
1186 1184
1187 env = cl_env_get(&refcheck); 1185 env = cl_env_get(&refcheck);
1188 if (IS_ERR(env)) 1186 if (IS_ERR(env))
@@ -1235,14 +1233,10 @@ static ssize_t ll_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
1235{ 1233{
1236 struct lu_env *env; 1234 struct lu_env *env;
1237 struct vvp_io_args *args; 1235 struct vvp_io_args *args;
1238 size_t count = 0; 1236 size_t count = iov_length(iov, nr_segs);
1239 ssize_t result; 1237 ssize_t result;
1240 int refcheck; 1238 int refcheck;
1241 1239
1242 result = generic_segment_checks(iov, &nr_segs, &count, VERIFY_READ);
1243 if (result)
1244 return result;
1245
1246 env = cl_env_get(&refcheck); 1240 env = cl_env_get(&refcheck);
1247 if (IS_ERR(env)) 1241 if (IS_ERR(env))
1248 return PTR_ERR(env); 1242 return PTR_ERR(env);
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 1dafe0701daf..a0a94a30d85a 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -1726,12 +1726,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
1726 1726
1727 mutex_lock(&inode->i_mutex); 1727 mutex_lock(&inode->i_mutex);
1728 1728
1729 err = generic_segment_checks(iov, &nr_segs, &ocount, VERIFY_READ); 1729 count = ocount = iov_length(iov, nr_segs);
1730 if (err) {
1731 mutex_unlock(&inode->i_mutex);
1732 goto out;
1733 }
1734 count = ocount;
1735 1730
1736 current->backing_dev_info = inode->i_mapping->backing_dev_info; 1731 current->backing_dev_info = inode->i_mapping->backing_dev_info;
1737 err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); 1732 err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index ef9115e4a6fa..21a56c27b74c 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -828,12 +828,8 @@ again:
828 inode, ceph_vinop(inode), iocb->ki_pos, (unsigned)len, 828 inode, ceph_vinop(inode), iocb->ki_pos, (unsigned)len,
829 ceph_cap_string(got)); 829 ceph_cap_string(got));
830 830
831 if (!read) { 831 if (!read)
832 ret = generic_segment_checks(iov, &nr_segs, 832 len = iov_length(iov, nr_segs);
833 &len, VERIFY_WRITE);
834 if (ret)
835 goto out;
836 }
837 833
838 iov_iter_init(&i, iov, nr_segs, len, read); 834 iov_iter_init(&i, iov, nr_segs, len, read);
839 835
@@ -855,7 +851,6 @@ again:
855 851
856 ret = generic_file_aio_read(iocb, iov, nr_segs, pos); 852 ret = generic_file_aio_read(iocb, iov, nr_segs, pos);
857 } 853 }
858out:
859 dout("aio_read %p %llx.%llx dropping cap refs on %s = %d\n", 854 dout("aio_read %p %llx.%llx dropping cap refs on %s = %d\n",
860 inode, ceph_vinop(inode), ceph_cap_string(got), (int)ret); 855 inode, ceph_vinop(inode), ceph_cap_string(got), (int)ret);
861 ceph_put_cap_refs(ci, got); 856 ceph_put_cap_refs(ci, got);
@@ -911,9 +906,7 @@ static ssize_t ceph_aio_write(struct kiocb *iocb, const struct iovec *iov,
911 906
912 mutex_lock(&inode->i_mutex); 907 mutex_lock(&inode->i_mutex);
913 908
914 err = generic_segment_checks(iov, &nr_segs, &count, VERIFY_READ); 909 count = iov_length(iov, nr_segs);
915 if (err)
916 goto out;
917 910
918 /* We can write back this queue in page reclaim */ 911 /* We can write back this queue in page reclaim */
919 current->backing_dev_info = file->f_mapping->backing_dev_info; 912 current->backing_dev_info = file->f_mapping->backing_dev_info;
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 126deb5d0a9c..9c7f346879e7 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -1208,12 +1208,7 @@ static ssize_t fuse_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
1208 1208
1209 WARN_ON(iocb->ki_pos != pos); 1209 WARN_ON(iocb->ki_pos != pos);
1210 1210
1211 ocount = 0; 1211 count = ocount = iov_length(iov, nr_segs);
1212 err = generic_segment_checks(iov, &nr_segs, &ocount, VERIFY_READ);
1213 if (err)
1214 return err;
1215
1216 count = ocount;
1217 mutex_lock(&inode->i_mutex); 1212 mutex_lock(&inode->i_mutex);
1218 1213
1219 /* We can write back this queue in page reclaim */ 1214 /* We can write back this queue in page reclaim */
diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c
index db9bd8a31725..b6fa457d8d01 100644
--- a/fs/ntfs/file.c
+++ b/fs/ntfs/file.c
@@ -2091,10 +2091,7 @@ static ssize_t ntfs_file_aio_write_nolock(struct kiocb *iocb,
2091 size_t count; /* after file limit checks */ 2091 size_t count; /* after file limit checks */
2092 ssize_t written, err; 2092 ssize_t written, err;
2093 2093
2094 count = 0; 2094 count = iov_length(iov, nr_segs);
2095 err = generic_segment_checks(iov, &nr_segs, &count, VERIFY_READ);
2096 if (err)
2097 return err;
2098 pos = *ppos; 2095 pos = *ppos;
2099 /* We can write back this queue in page reclaim. */ 2096 /* We can write back this queue in page reclaim. */
2100 current->backing_dev_info = mapping->backing_dev_info; 2097 current->backing_dev_info = mapping->backing_dev_info;
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index d6d78c2aa96e..d33c4ced0baf 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -2355,12 +2355,7 @@ relock:
2355 /* communicate with ocfs2_dio_end_io */ 2355 /* communicate with ocfs2_dio_end_io */
2356 ocfs2_iocb_set_rw_locked(iocb, rw_level); 2356 ocfs2_iocb_set_rw_locked(iocb, rw_level);
2357 2357
2358 ret = generic_segment_checks(iov, &nr_segs, &ocount, 2358 count = ocount = iov_length(iov, nr_segs);
2359 VERIFY_READ);
2360 if (ret)
2361 goto out_dio;
2362
2363 count = ocount;
2364 ret = generic_write_checks(file, ppos, &count, 2359 ret = generic_write_checks(file, ppos, &count,
2365 S_ISBLK(inode->i_mode)); 2360 S_ISBLK(inode->i_mode));
2366 if (ret) 2361 if (ret)
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 8617497867c7..f0f8084a67be 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -253,9 +253,7 @@ xfs_file_aio_read(
253 if (file->f_mode & FMODE_NOCMTIME) 253 if (file->f_mode & FMODE_NOCMTIME)
254 ioflags |= IO_INVIS; 254 ioflags |= IO_INVIS;
255 255
256 ret = generic_segment_checks(iovp, &nr_segs, &size, VERIFY_WRITE); 256 size = iov_length(iovp, nr_segs);
257 if (ret < 0)
258 return ret;
259 257
260 if (unlikely(ioflags & IO_ISDIRECT)) { 258 if (unlikely(ioflags & IO_ISDIRECT)) {
261 xfs_buftarg_t *target = 259 xfs_buftarg_t *target =
@@ -777,10 +775,7 @@ xfs_file_aio_write(
777 775
778 BUG_ON(iocb->ki_pos != pos); 776 BUG_ON(iocb->ki_pos != pos);
779 777
780 ret = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); 778 ocount = iov_length(iovp, nr_segs);
781 if (ret)
782 return ret;
783
784 if (ocount == 0) 779 if (ocount == 0)
785 return 0; 780 return 0;
786 781
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 262f96e579b8..796de742fe4a 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2412,8 +2412,6 @@ extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *,
2412extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t); 2412extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t);
2413extern ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos); 2413extern ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos);
2414extern ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos); 2414extern ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos);
2415extern int generic_segment_checks(const struct iovec *iov,
2416 unsigned long *nr_segs, size_t *count, int access_flags);
2417 2415
2418/* fs/block_dev.c */ 2416/* fs/block_dev.c */
2419extern ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov, 2417extern ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov,
diff --git a/mm/filemap.c b/mm/filemap.c
index a840890ed39f..7c1417b0bd7b 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -1663,45 +1663,6 @@ out:
1663 return written ? written : error; 1663 return written ? written : error;
1664} 1664}
1665 1665
1666/*
1667 * Performs necessary checks before doing a write
1668 * @iov: io vector request
1669 * @nr_segs: number of segments in the iovec
1670 * @count: number of bytes to write
1671 * @access_flags: type of access: %VERIFY_READ or %VERIFY_WRITE
1672 *
1673 * Adjust number of segments and amount of bytes to write (nr_segs should be
1674 * properly initialized first). Returns appropriate error code that caller
1675 * should return or zero in case that write should be allowed.
1676 */
1677int generic_segment_checks(const struct iovec *iov,
1678 unsigned long *nr_segs, size_t *count, int access_flags)
1679{
1680 unsigned long seg;
1681 size_t cnt = 0;
1682 for (seg = 0; seg < *nr_segs; seg++) {
1683 const struct iovec *iv = &iov[seg];
1684
1685 /*
1686 * If any segment has a negative length, or the cumulative
1687 * length ever wraps negative then return -EINVAL.
1688 */
1689 cnt += iv->iov_len;
1690 if (unlikely((ssize_t)(cnt|iv->iov_len) < 0))
1691 return -EINVAL;
1692 if (access_ok(access_flags, iv->iov_base, iv->iov_len))
1693 continue;
1694 if (seg == 0)
1695 return -EFAULT;
1696 *nr_segs = seg;
1697 cnt -= iv->iov_len; /* This segment is no good */
1698 break;
1699 }
1700 *count = cnt;
1701 return 0;
1702}
1703EXPORT_SYMBOL(generic_segment_checks);
1704
1705/** 1666/**
1706 * generic_file_aio_read - generic filesystem read routine 1667 * generic_file_aio_read - generic filesystem read routine
1707 * @iocb: kernel I/O control block 1668 * @iocb: kernel I/O control block
@@ -1717,15 +1678,12 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
1717 unsigned long nr_segs, loff_t pos) 1678 unsigned long nr_segs, loff_t pos)
1718{ 1679{
1719 struct file *filp = iocb->ki_filp; 1680 struct file *filp = iocb->ki_filp;
1720 ssize_t retval; 1681 ssize_t retval = 0;
1721 size_t count; 1682 size_t count;
1722 loff_t *ppos = &iocb->ki_pos; 1683 loff_t *ppos = &iocb->ki_pos;
1723 struct iov_iter i; 1684 struct iov_iter i;
1724 1685
1725 count = 0; 1686 count = iov_length(iov, nr_segs);
1726 retval = generic_segment_checks(iov, &nr_segs, &count, VERIFY_WRITE);
1727 if (retval)
1728 return retval;
1729 iov_iter_init(&i, iov, nr_segs, count, 0); 1687 iov_iter_init(&i, iov, nr_segs, count, 0);
1730 1688
1731 /* coalesce the iovecs and go direct-to-BIO for O_DIRECT */ 1689 /* coalesce the iovecs and go direct-to-BIO for O_DIRECT */
@@ -2615,12 +2573,7 @@ ssize_t __generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
2615 ssize_t status; 2573 ssize_t status;
2616 struct iov_iter from; 2574 struct iov_iter from;
2617 2575
2618 ocount = 0; 2576 count = ocount = iov_length(iov, nr_segs);
2619 err = generic_segment_checks(iov, &nr_segs, &ocount, VERIFY_READ);
2620 if (err)
2621 return err;
2622
2623 count = ocount;
2624 2577
2625 /* We can write back this queue in page reclaim */ 2578 /* We can write back this queue in page reclaim */
2626 current->backing_dev_info = mapping->backing_dev_info; 2579 current->backing_dev_info = mapping->backing_dev_info;
diff --git a/mm/shmem.c b/mm/shmem.c
index 9f70e02111c6..2a93e625adaf 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -1412,14 +1412,11 @@ static ssize_t shmem_file_aio_read(struct kiocb *iocb,
1412 unsigned long offset; 1412 unsigned long offset;
1413 enum sgp_type sgp = SGP_READ; 1413 enum sgp_type sgp = SGP_READ;
1414 int error = 0; 1414 int error = 0;
1415 ssize_t retval; 1415 ssize_t retval = 0;
1416 size_t count; 1416 size_t count = iov_length(iov, nr_segs);
1417 loff_t *ppos = &iocb->ki_pos; 1417 loff_t *ppos = &iocb->ki_pos;
1418 struct iov_iter iter; 1418 struct iov_iter iter;
1419 1419
1420 retval = generic_segment_checks(iov, &nr_segs, &count, VERIFY_WRITE);
1421 if (retval)
1422 return retval;
1423 iov_iter_init(&iter, iov, nr_segs, count, 0); 1420 iov_iter_init(&iter, iov, nr_segs, count, 0);
1424 1421
1425 /* 1422 /*