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

switch generic_write_checks() to iocb and iter

... returning -E... upon error and amount of data left in iter after
(possible) truncation upon success. Note, that normal case gives
a non-zero (positive) return value, so any tests for != 0 _must_ be
updated.

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

Conflicts:
fs/ext4/file.c

Al Viro 3309dd04 90320251

+100 -167
+10 -16
fs/9p/vfs_file.c
··· 404 404 v9fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) 405 405 { 406 406 struct file *file = iocb->ki_filp; 407 - ssize_t retval = 0; 408 - loff_t origin = iocb->ki_pos; 409 - size_t count = iov_iter_count(from); 407 + ssize_t retval; 408 + loff_t origin; 410 409 int err = 0; 411 410 412 - retval = generic_write_checks(file, &origin, &count); 413 - if (retval) 411 + retval = generic_write_checks(iocb, from); 412 + if (retval <= 0) 414 413 return retval; 415 414 416 - iov_iter_truncate(from, count); 417 - 418 - if (!count) 419 - return 0; 420 - 421 - retval = p9_client_write(file->private_data, origin, from, &err); 415 + origin = iocb->ki_pos; 416 + retval = p9_client_write(file->private_data, iocb->ki_pos, from, &err); 422 417 if (retval > 0) { 423 418 struct inode *inode = file_inode(file); 424 419 loff_t i_size; ··· 423 428 if (inode->i_mapping && inode->i_mapping->nrpages) 424 429 invalidate_inode_pages2_range(inode->i_mapping, 425 430 pg_start, pg_end); 426 - origin += retval; 431 + iocb->ki_pos += retval; 427 432 i_size = i_size_read(inode); 428 - iocb->ki_pos = origin; 429 - if (origin > i_size) { 430 - inode_add_bytes(inode, origin - i_size); 431 - i_size_write(inode, origin); 433 + if (iocb->ki_pos > i_size) { 434 + inode_add_bytes(inode, iocb->ki_pos - i_size); 435 + i_size_write(inode, iocb->ki_pos); 432 436 } 433 437 return retval; 434 438 }
+10 -16
fs/btrfs/file.c
··· 1739 1739 u64 start_pos; 1740 1740 u64 end_pos; 1741 1741 ssize_t num_written = 0; 1742 - ssize_t err = 0; 1743 - size_t count = iov_iter_count(from); 1744 1742 bool sync = (file->f_flags & O_DSYNC) || IS_SYNC(file->f_mapping->host); 1745 - loff_t pos = iocb->ki_pos; 1743 + ssize_t err; 1744 + loff_t pos; 1745 + size_t count; 1746 1746 1747 1747 mutex_lock(&inode->i_mutex); 1748 + err = generic_write_checks(iocb, from); 1749 + if (err <= 0) { 1750 + mutex_unlock(&inode->i_mutex); 1751 + return err; 1752 + } 1748 1753 1749 1754 current->backing_dev_info = inode_to_bdi(inode); 1750 - err = generic_write_checks(file, &pos, &count); 1751 - if (err) { 1752 - mutex_unlock(&inode->i_mutex); 1753 - goto out; 1754 - } 1755 - 1756 - if (count == 0) { 1757 - mutex_unlock(&inode->i_mutex); 1758 - goto out; 1759 - } 1760 - 1761 - iov_iter_truncate(from, count); 1762 - 1763 1755 err = file_remove_suid(file); 1764 1756 if (err) { 1765 1757 mutex_unlock(&inode->i_mutex); ··· 1778 1786 */ 1779 1787 update_time_for_write(inode); 1780 1788 1789 + pos = iocb->ki_pos; 1790 + count = iov_iter_count(from); 1781 1791 start_pos = round_down(pos, root->sectorsize); 1782 1792 if (start_pos > i_size_read(inode)) { 1783 1793 /* Expand hole size to cover write data, preventing empty gap */
+6 -8
fs/ceph/file.c
··· 941 941 struct ceph_inode_info *ci = ceph_inode(inode); 942 942 struct ceph_osd_client *osdc = 943 943 &ceph_sb_to_client(inode->i_sb)->client->osdc; 944 - ssize_t count = iov_iter_count(from), written = 0; 944 + ssize_t count, written = 0; 945 945 int err, want, got; 946 - loff_t pos = iocb->ki_pos; 946 + loff_t pos; 947 947 948 948 if (ceph_snap(inode) != CEPH_NOSNAP) 949 949 return -EROFS; ··· 953 953 /* We can write back this queue in page reclaim */ 954 954 current->backing_dev_info = inode_to_bdi(inode); 955 955 956 - err = generic_write_checks(file, &pos, &count); 957 - if (err) 956 + err = generic_write_checks(iocb, from); 957 + if (err <= 0) 958 958 goto out; 959 959 960 - if (count == 0) 961 - goto out; 962 - iov_iter_truncate(from, count); 963 - 960 + pos = iocb->ki_pos; 961 + count = iov_iter_count(from); 964 962 err = file_remove_suid(file); 965 963 if (err) 966 964 goto out;
+6 -20
fs/cifs/file.c
··· 2563 2563 ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from) 2564 2564 { 2565 2565 struct file *file = iocb->ki_filp; 2566 - size_t len; 2567 2566 ssize_t total_written = 0; 2568 2567 struct cifsFileInfo *open_file; 2569 2568 struct cifs_tcon *tcon; ··· 2578 2579 * write request. 2579 2580 */ 2580 2581 2581 - len = iov_iter_count(from); 2582 - rc = generic_write_checks(file, &iocb->ki_pos, &len); 2583 - if (rc) 2582 + rc = generic_write_checks(iocb, from); 2583 + if (rc <= 0) 2584 2584 return rc; 2585 - 2586 - if (!len) 2587 - return 0; 2588 - 2589 - iov_iter_truncate(from, len); 2590 2585 2591 2586 INIT_LIST_HEAD(&wdata_list); 2592 2587 cifs_sb = CIFS_FILE_SB(file); ··· 2592 2599 2593 2600 memcpy(&saved_from, from, sizeof(struct iov_iter)); 2594 2601 2595 - rc = cifs_write_from_iter(iocb->ki_pos, len, from, open_file, cifs_sb, 2596 - &wdata_list); 2602 + rc = cifs_write_from_iter(iocb->ki_pos, iov_iter_count(from), from, 2603 + open_file, cifs_sb, &wdata_list); 2597 2604 2598 2605 /* 2599 2606 * If at least one write was successfully sent, then discard any rc ··· 2667 2674 struct cifsInodeInfo *cinode = CIFS_I(inode); 2668 2675 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server; 2669 2676 ssize_t rc; 2670 - size_t count; 2671 2677 2672 2678 /* 2673 2679 * We need to hold the sem to be sure nobody modifies lock list ··· 2675 2683 down_read(&cinode->lock_sem); 2676 2684 mutex_lock(&inode->i_mutex); 2677 2685 2678 - count = iov_iter_count(from); 2679 - rc = generic_write_checks(file, &iocb->ki_pos, &count); 2680 - if (rc) 2686 + rc = generic_write_checks(iocb, from); 2687 + if (rc <= 0) 2681 2688 goto out; 2682 - 2683 - if (count == 0) 2684 - goto out; 2685 - 2686 - iov_iter_truncate(from, count); 2687 2689 2688 2690 if (!cifs_find_lock_conflict(cfile, iocb->ki_pos, iov_iter_count(from), 2689 2691 server->vals->exclusive_lock_type, NULL,
+6 -14
fs/ext4/file.c
··· 97 97 struct blk_plug plug; 98 98 int o_direct = io_is_direct(file); 99 99 int overwrite = 0; 100 - size_t length = iov_iter_count(from); 101 100 ssize_t ret; 102 - loff_t pos; 103 101 104 102 /* 105 103 * Unaligned direct AIO must be serialized; see comment above ··· 114 116 } 115 117 116 118 mutex_lock(&inode->i_mutex); 117 - ret = generic_write_checks(file, &iocb->ki_pos, &length); 118 - if (ret) 119 + ret = generic_write_checks(iocb, from); 120 + if (ret <= 0) 119 121 goto out; 120 - 121 - if (length == 0) 122 - goto out; 123 - 124 - iov_iter_truncate(from, length); 125 - pos = iocb->ki_pos; 126 122 127 123 /* 128 124 * If we have encountered a bitmap-format file, the size limit ··· 125 133 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { 126 134 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); 127 135 128 - if (pos >= sbi->s_bitmap_maxbytes) { 136 + if (iocb->ki_pos >= sbi->s_bitmap_maxbytes) { 129 137 ret = -EFBIG; 130 138 goto out; 131 139 } 132 - iov_iter_truncate(from, sbi->s_bitmap_maxbytes - pos); 140 + iov_iter_truncate(from, sbi->s_bitmap_maxbytes - iocb->ki_pos); 133 141 } 134 142 135 143 iocb->private = &overwrite; 136 144 if (o_direct) { 137 - length = iov_iter_count(from); 145 + size_t length = iov_iter_count(from); 146 + loff_t pos = iocb->ki_pos; 138 147 blk_start_plug(&plug); 139 - 140 148 141 149 /* check whether we do a DIO overwrite or not */ 142 150 if (ext4_should_dioread_nolock(inode) && !aio_mutex &&
+7 -15
fs/fuse/file.c
··· 1145 1145 { 1146 1146 struct file *file = iocb->ki_filp; 1147 1147 struct address_space *mapping = file->f_mapping; 1148 - size_t count = iov_iter_count(from); 1149 1148 ssize_t written = 0; 1150 1149 ssize_t written_buffered = 0; 1151 1150 struct inode *inode = mapping->host; 1152 1151 ssize_t err; 1153 1152 loff_t endbyte = 0; 1154 - loff_t pos = iocb->ki_pos; 1155 1153 1156 1154 if (get_fuse_conn(inode)->writeback_cache) { 1157 1155 /* Update size (EOF optimization) and mode (SUID clearing) */ ··· 1165 1167 /* We can write back this queue in page reclaim */ 1166 1168 current->backing_dev_info = inode_to_bdi(inode); 1167 1169 1168 - err = generic_write_checks(file, &pos, &count); 1169 - if (err) 1170 + err = generic_write_checks(iocb, from); 1171 + if (err <= 0) 1170 1172 goto out; 1171 1173 1172 - if (count == 0) 1173 - goto out; 1174 - 1175 - iov_iter_truncate(from, count); 1176 1174 err = file_remove_suid(file); 1177 1175 if (err) 1178 1176 goto out; ··· 1178 1184 goto out; 1179 1185 1180 1186 if (file->f_flags & O_DIRECT) { 1187 + loff_t pos = iocb->ki_pos; 1181 1188 written = generic_file_direct_write(iocb, from, pos); 1182 1189 if (written < 0 || !iov_iter_count(from)) 1183 1190 goto out; ··· 1204 1209 written += written_buffered; 1205 1210 iocb->ki_pos = pos + written_buffered; 1206 1211 } else { 1207 - written = fuse_perform_write(file, mapping, from, pos); 1212 + written = fuse_perform_write(file, mapping, from, iocb->ki_pos); 1208 1213 if (written >= 0) 1209 - iocb->ki_pos = pos + written; 1214 + iocb->ki_pos += written; 1210 1215 } 1211 1216 out: 1212 1217 current->backing_dev_info = NULL; ··· 1407 1412 struct file *file = iocb->ki_filp; 1408 1413 struct inode *inode = file_inode(file); 1409 1414 struct fuse_io_priv io = { .async = 0, .file = file }; 1410 - size_t count = iov_iter_count(from); 1411 1415 ssize_t res; 1412 1416 1413 1417 if (is_bad_inode(inode)) ··· 1414 1420 1415 1421 /* Don't allow parallel writes to the same file */ 1416 1422 mutex_lock(&inode->i_mutex); 1417 - res = generic_write_checks(file, &iocb->ki_pos, &count); 1418 - if (!res) { 1419 - iov_iter_truncate(from, count); 1423 + res = generic_write_checks(iocb, from); 1424 + if (res > 0) 1420 1425 res = fuse_direct_io(&io, from, &iocb->ki_pos, FUSE_DIO_WRITE); 1421 - } 1422 1426 fuse_invalidate_attr(inode); 1423 1427 if (res > 0) 1424 1428 fuse_write_update_size(inode, iocb->ki_pos);
+5 -9
fs/ncpfs/file.c
··· 170 170 struct file *file = iocb->ki_filp; 171 171 struct inode *inode = file_inode(file); 172 172 size_t already_written = 0; 173 - loff_t pos = iocb->ki_pos; 174 - size_t count = iov_iter_count(from); 175 173 size_t bufsize; 176 174 int errno; 177 175 void *bouncebuffer; 176 + off_t pos; 178 177 179 178 ncp_dbg(1, "enter %pD2\n", file); 180 - errno = generic_write_checks(file, &pos, &count); 181 - if (errno) 179 + errno = generic_write_checks(iocb, from); 180 + if (errno <= 0) 182 181 return errno; 183 - iov_iter_truncate(from, count); 184 - 185 - if (!count) 186 - return 0; 187 182 188 183 errno = ncp_make_open(inode, O_WRONLY); 189 184 if (errno) { ··· 196 201 errno = -EIO; /* -ENOMEM */ 197 202 goto outrel; 198 203 } 204 + pos = iocb->ki_pos; 199 205 while (iov_iter_count(from)) { 200 206 int written_this_time; 201 207 size_t to_write = min_t(size_t, 202 - bufsize - ((off_t)pos % bufsize), 208 + bufsize - (pos % bufsize), 203 209 iov_iter_count(from)); 204 210 205 211 if (copy_from_iter(bouncebuffer, to_write, from) != to_write) {
+10 -15
fs/nfs/direct.c
··· 969 969 struct nfs_direct_req *dreq; 970 970 struct nfs_lock_context *l_ctx; 971 971 loff_t end; 972 - size_t count = iov_iter_count(iter); 973 - end = (pos + count - 1) >> PAGE_CACHE_SHIFT; 974 - 975 - nfs_add_stats(mapping->host, NFSIOS_DIRECTWRITTENBYTES, count); 976 972 977 973 dfprintk(FILE, "NFS: direct write(%pD2, %zd@%Ld)\n", 978 - file, count, (long long) pos); 974 + file, iov_iter_count(iter), (long long) iocb->ki_pos); 979 975 980 - result = generic_write_checks(file, &pos, &count); 981 - if (result) 976 + result = generic_write_checks(iocb, iter); 977 + if (result <= 0) 982 978 goto out; 983 979 984 - result = -EINVAL; 985 - if ((ssize_t) count < 0) 986 - goto out; 987 - result = 0; 988 - if (!count) 989 - goto out; 980 + nfs_add_stats(mapping->host, NFSIOS_DIRECTWRITTENBYTES, 981 + iov_iter_count(iter)); 982 + 983 + pos = iocb->ki_pos; 984 + end = (pos + iov_iter_count(iter) - 1) >> PAGE_CACHE_SHIFT; 990 985 991 986 mutex_lock(&inode->i_mutex); 992 987 ··· 996 1001 goto out_unlock; 997 1002 } 998 1003 999 - task_io_account_write(count); 1004 + task_io_account_write(iov_iter_count(iter)); 1000 1005 1001 1006 result = -ENOMEM; 1002 1007 dreq = nfs_direct_req_alloc(); ··· 1004 1009 goto out_unlock; 1005 1010 1006 1011 dreq->inode = inode; 1007 - dreq->bytes_left = count; 1012 + dreq->bytes_left = iov_iter_count(iter); 1008 1013 dreq->io_start = pos; 1009 1014 dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp)); 1010 1015 l_ctx = nfs_get_lock_context(dreq->ctx);
+4 -7
fs/ntfs/file.c
··· 339 339 struct inode *vi = file_inode(file); 340 340 ntfs_inode *base_ni, *ni = NTFS_I(vi); 341 341 ntfs_volume *vol = ni->vol; 342 - size_t count = iov_iter_count(from); 343 342 344 343 ntfs_debug("Entering for i_ino 0x%lx, attribute type 0x%x, pos " 345 344 "0x%llx, count 0x%zx.", vi->i_ino, 346 345 (unsigned)le32_to_cpu(ni->type), 347 - (unsigned long long)iocb->ki_pos, count); 348 - err = generic_write_checks(file, &iocb->ki_pos, &count); 349 - if (unlikely(err)) 350 - goto out; 351 - iov_iter_truncate(from, count); 352 - if (count == 0) 346 + (unsigned long long)iocb->ki_pos, 347 + iov_iter_count(from)); 348 + err = generic_write_checks(iocb, from); 349 + if (unlikely(err <= 0)) 353 350 goto out; 354 351 /* 355 352 * All checks have passed. Before we start doing any writing we want
+10 -9
fs/ocfs2/file.c
··· 2250 2250 static ssize_t ocfs2_file_write_iter(struct kiocb *iocb, 2251 2251 struct iov_iter *from) 2252 2252 { 2253 - int ret, direct_io, appending, rw_level, have_alloc_sem = 0; 2253 + int direct_io, appending, rw_level, have_alloc_sem = 0; 2254 2254 int can_do_direct, has_refcount = 0; 2255 2255 ssize_t written = 0; 2256 + ssize_t ret; 2256 2257 size_t count = iov_iter_count(from), orig_count; 2257 2258 loff_t old_size; 2258 2259 u32 old_clusters; ··· 2320 2319 ocfs2_inode_unlock(inode, 1); 2321 2320 } 2322 2321 2323 - orig_count = count; 2324 - ret = generic_write_checks(file, &iocb->ki_pos, &count); 2325 - if (ret < 0) { 2326 - mlog_errno(ret); 2322 + orig_count = iov_iter_count(from); 2323 + ret = generic_write_checks(iocb, from); 2324 + if (ret <= 0) { 2325 + if (ret) 2326 + mlog_errno(ret); 2327 2327 goto out; 2328 2328 } 2329 - iov_iter_truncate(from, count); 2329 + count = ret; 2330 2330 2331 2331 can_do_direct = direct_io; 2332 2332 ret = ocfs2_prepare_inode_for_write(file, iocb->ki_pos, count, appending, ··· 2351 2349 rw_level = -1; 2352 2350 2353 2351 direct_io = 0; 2354 - iov_iter_reexpand(from, count = orig_count); 2352 + iov_iter_reexpand(from, orig_count); 2355 2353 goto relock; 2356 2354 } 2357 2355 ··· 2379 2377 loff_t endbyte; 2380 2378 ssize_t written_buffered; 2381 2379 written = generic_file_direct_write(iocb, from, iocb->ki_pos); 2382 - if (written < 0 || written == count) { 2380 + if (written < 0 || !iov_iter_count(from)) { 2383 2381 ret = written; 2384 2382 goto out_dio; 2385 2383 } ··· 2387 2385 /* 2388 2386 * for completing the rest of the request. 2389 2387 */ 2390 - count -= written; 2391 2388 written_buffered = generic_perform_write(file, from, iocb->ki_pos); 2392 2389 /* 2393 2390 * If generic_file_buffered_write() returned a synchronous error
+2 -8
fs/udf/file.c
··· 120 120 ssize_t retval; 121 121 struct file *file = iocb->ki_filp; 122 122 struct inode *inode = file_inode(file); 123 - size_t count = iov_iter_count(from); 124 123 struct udf_inode_info *iinfo = UDF_I(inode); 125 124 int err; 126 125 127 126 mutex_lock(&inode->i_mutex); 128 127 129 - retval = generic_write_checks(file, &iocb->ki_pos, &count); 130 - if (retval) 128 + retval = generic_write_checks(iocb, from); 129 + if (retval <= 0) 131 130 goto out; 132 - 133 - if (count == 0) 134 - goto out; 135 - 136 - iov_iter_truncate(from, count); 137 131 138 132 down_write(&iinfo->i_data_sem); 139 133 if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
+4 -4
fs/xfs/xfs_file.c
··· 551 551 struct file *file = iocb->ki_filp; 552 552 struct inode *inode = file->f_mapping->host; 553 553 struct xfs_inode *ip = XFS_I(inode); 554 - int error = 0; 554 + ssize_t error = 0; 555 555 size_t count = iov_iter_count(from); 556 556 557 557 restart: 558 - error = generic_write_checks(file, &iocb->ki_pos, &count); 559 - if (error) 558 + error = generic_write_checks(iocb, from); 559 + if (error <= 0) 560 560 return error; 561 561 562 562 error = xfs_break_layouts(inode, iolock); ··· 577 577 xfs_rw_iunlock(ip, *iolock); 578 578 *iolock = XFS_IOLOCK_EXCL; 579 579 xfs_rw_ilock(ip, *iolock); 580 + iov_iter_reexpand(from, count); 580 581 goto restart; 581 582 } 582 583 error = xfs_zero_eof(ip, iocb->ki_pos, i_size_read(inode), &zero); 583 584 if (error) 584 585 return error; 585 586 } 586 - iov_iter_truncate(from, count); 587 587 588 588 /* 589 589 * Updating the timestamps will grab the ilock again from
+1 -1
include/linux/fs.h
··· 2566 2566 2567 2567 extern int generic_file_mmap(struct file *, struct vm_area_struct *); 2568 2568 extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *); 2569 - int generic_write_checks(struct file *file, loff_t *pos, size_t *count); 2569 + extern ssize_t generic_write_checks(struct kiocb *, struct iov_iter *); 2570 2570 extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *); 2571 2571 extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *); 2572 2572 extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *);
+19 -25
mm/filemap.c
··· 2260 2260 * Returns appropriate error code that caller should return or 2261 2261 * zero in case that write should be allowed. 2262 2262 */ 2263 - inline int generic_write_checks(struct file *file, loff_t *pos, size_t *count) 2263 + inline ssize_t generic_write_checks(struct kiocb *iocb, struct iov_iter *from) 2264 2264 { 2265 + struct file *file = iocb->ki_filp; 2265 2266 struct inode *inode = file->f_mapping->host; 2266 2267 unsigned long limit = rlimit(RLIMIT_FSIZE); 2268 + loff_t pos; 2267 2269 2268 - if (unlikely(*pos < 0)) 2269 - return -EINVAL; 2270 + if (!iov_iter_count(from)) 2271 + return 0; 2270 2272 2271 2273 /* FIXME: this is for backwards compatibility with 2.4 */ 2272 2274 if (file->f_flags & O_APPEND) 2273 - *pos = i_size_read(inode); 2275 + iocb->ki_pos = i_size_read(inode); 2276 + 2277 + pos = iocb->ki_pos; 2274 2278 2275 2279 if (limit != RLIM_INFINITY) { 2276 - if (*pos >= limit) { 2280 + if (iocb->ki_pos >= limit) { 2277 2281 send_sig(SIGXFSZ, current, 0); 2278 2282 return -EFBIG; 2279 2283 } 2280 - if (*count > limit - (typeof(limit))*pos) 2281 - *count = limit - (typeof(limit))*pos; 2284 + iov_iter_truncate(from, limit - (unsigned long)pos); 2282 2285 } 2283 2286 2284 2287 /* 2285 2288 * LFS rule 2286 2289 */ 2287 - if (unlikely(*pos + *count > MAX_NON_LFS && 2290 + if (unlikely(pos + iov_iter_count(from) > MAX_NON_LFS && 2288 2291 !(file->f_flags & O_LARGEFILE))) { 2289 - if (*pos >= MAX_NON_LFS) 2292 + if (pos >= MAX_NON_LFS) 2290 2293 return -EFBIG; 2291 - if (*count > MAX_NON_LFS - (unsigned long)*pos) 2292 - *count = MAX_NON_LFS - (unsigned long)*pos; 2294 + iov_iter_truncate(from, MAX_NON_LFS - (unsigned long)pos); 2293 2295 } 2294 2296 2295 2297 /* ··· 2301 2299 * exceeded without writing data we send a signal and return EFBIG. 2302 2300 * Linus frestrict idea will clean these up nicely.. 2303 2301 */ 2304 - if (unlikely(*pos >= inode->i_sb->s_maxbytes)) { 2305 - if (*count || *pos > inode->i_sb->s_maxbytes) { 2306 - return -EFBIG; 2307 - } 2308 - /* zero-length writes at ->s_maxbytes are OK */ 2309 - } 2302 + if (unlikely(pos >= inode->i_sb->s_maxbytes)) 2303 + return -EFBIG; 2310 2304 2311 - if (unlikely(*pos + *count > inode->i_sb->s_maxbytes)) 2312 - *count = inode->i_sb->s_maxbytes - *pos; 2313 - return 0; 2305 + iov_iter_truncate(from, inode->i_sb->s_maxbytes - pos); 2306 + return iov_iter_count(from); 2314 2307 } 2315 2308 EXPORT_SYMBOL(generic_write_checks); 2316 2309 ··· 2615 2618 struct file *file = iocb->ki_filp; 2616 2619 struct inode *inode = file->f_mapping->host; 2617 2620 ssize_t ret; 2618 - size_t count = iov_iter_count(from); 2619 2621 2620 2622 mutex_lock(&inode->i_mutex); 2621 - ret = generic_write_checks(file, &iocb->ki_pos, &count); 2622 - if (!ret && count) { 2623 - iov_iter_truncate(from, count); 2623 + ret = generic_write_checks(iocb, from); 2624 + if (ret > 0) 2624 2625 ret = __generic_file_write_iter(iocb, from); 2625 - } 2626 2626 mutex_unlock(&inode->i_mutex); 2627 2627 2628 2628 if (ret > 0) {