History

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull vfs fixes from Al Viro: - fix orangefs handling of faults on write() - I'd missed that one back when orangefs was going through review. - readdir counterpart of "9p: cope with bogus responses from server in p9_client_{read,write}" - server might be lying or broken, and we'd better not overrun the kmalloc'ed buffer we are copying the results into. - NFS O_DIRECT read/write can leave iov_iter advanced by too much; that's what had been causing iov_iter_pipe() warnings davej had been seeing. - statx_timestamp.tv_nsec type fix (s32 -> u32). That one really should go in before 4.11. * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: uapi: change the type of struct statx_timestamp.tv_nsec to unsigned fix nfs O_DIRECT advancing iov_iter too much p9_client_readdir() fix orangefs_bufmap_copy_from_iovec(): fix EFAULT handling

Linus Torvalds committed 9 years ago

Commit f56fc7b2 parents 59372bb 17419374 files · +25 −18Browse files

Unified · Split

4 files
  1. fs/nfs/direct.c +18 −9
  2. fs/orangefs/orangefs-bufmap.c +1 −3
  3. include/uapi/linux/stat.h +2 −6
  4. net/9p/client.c +4 −0
fs/nfs/direct.c+18−9
@@ -537,7 +537,7 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq, · 536 unmodified lines
537 537
538 if (put_dreq(dreq))538 if (put_dreq(dreq))
539 nfs_direct_complete(dreq);539 nfs_direct_complete(dreq);
540 return 0;540 return requested_bytes;
541}541}
542 542
543/**543/**
@@ -566,7 +566,7 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter) · 22 unmodified lines
566 struct inode *inode = mapping->host;566 struct inode *inode = mapping->host;
567 struct nfs_direct_req *dreq;567 struct nfs_direct_req *dreq;
568 struct nfs_lock_context *l_ctx;568 struct nfs_lock_context *l_ctx;
569 ssize_t result = -EINVAL;569 ssize_t result = -EINVAL, requested;
570 size_t count = iov_iter_count(iter);570 size_t count = iov_iter_count(iter);
571 nfs_add_stats(mapping->host, NFSIOS_DIRECTREADBYTES, count);571 nfs_add_stats(mapping->host, NFSIOS_DIRECTREADBYTES, count);
572 572
@@ -600,14 +600,19 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter) · 27 unmodified lines
600 nfs_start_io_direct(inode);600 nfs_start_io_direct(inode);
601 601
602 NFS_I(inode)->read_io += count;602 NFS_I(inode)->read_io += count;
603 result = nfs_direct_read_schedule_iovec(dreq, iter, iocb->ki_pos);603 requested = nfs_direct_read_schedule_iovec(dreq, iter, iocb->ki_pos);
604 604
605 nfs_end_io_direct(inode);605 nfs_end_io_direct(inode);
606 606
607 if (!result) {607 if (requested > 0) {
608 result = nfs_direct_wait(dreq);608 result = nfs_direct_wait(dreq);
609 if (result > 0)609 if (result > 0) {
610 requested -= result;
610 iocb->ki_pos += result;611 iocb->ki_pos += result;
612 }
613 iov_iter_revert(iter, requested);
614 } else {
615 result = requested;
611 }616 }
612 617
613out_release:618out_release:
@@ -954,7 +959,7 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq, · 340 unmodified lines
954 959
955 if (put_dreq(dreq))960 if (put_dreq(dreq))
956 nfs_direct_write_complete(dreq);961 nfs_direct_write_complete(dreq);
957 return 0;962 return requested_bytes;
958}963}
959 964
960/**965/**
@@ -979,7 +984,7 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq, · 18 unmodified lines
979 */984 */
980ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)985ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)
981{986{
982 ssize_t result = -EINVAL;987 ssize_t result = -EINVAL, requested;
983 size_t count;988 size_t count;
984 struct file *file = iocb->ki_filp;989 struct file *file = iocb->ki_filp;
985 struct address_space *mapping = file->f_mapping;990 struct address_space *mapping = file->f_mapping;
@@ -1022,7 +1027,7 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter) · 36 unmodified lines
1022 1027
1023 nfs_start_io_direct(inode);1028 nfs_start_io_direct(inode);
1024 1029
1025 result = nfs_direct_write_schedule_iovec(dreq, iter, pos);1030 requested = nfs_direct_write_schedule_iovec(dreq, iter, pos);
1026 1031
1027 if (mapping->nrpages) {1032 if (mapping->nrpages) {
1028 invalidate_inode_pages2_range(mapping,1033 invalidate_inode_pages2_range(mapping,
@@ -1031,13 +1036,17 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter) · 2 unmodified lines
1031 1036
1032 nfs_end_io_direct(inode);1037 nfs_end_io_direct(inode);
1033 1038
1034 if (!result) {1039 if (requested > 0) {
1035 result = nfs_direct_wait(dreq);1040 result = nfs_direct_wait(dreq);
1036 if (result > 0) {1041 if (result > 0) {
1042 requested -= result;
1037 iocb->ki_pos = pos + result;1043 iocb->ki_pos = pos + result;
1038 /* XXX: should check the generic_write_sync retval */1044 /* XXX: should check the generic_write_sync retval */
1039 generic_write_sync(iocb, result);1045 generic_write_sync(iocb, result);
1040 }1046 }
1047 iov_iter_revert(iter, requested);
1048 } else {
1049 result = requested;
1041 }1050 }
1042out_release:1051out_release:
1043 nfs_direct_req_release(dreq);1052 nfs_direct_req_release(dreq);
fs/orangefs/orangefs-bufmap.c+1−3
@@ -521,13 +521,11 @@ int orangefs_bufmap_copy_from_iovec(struct iov_iter *iter, · 520 unmodified lines
521 size_t n = size;521 size_t n = size;
522 if (n > PAGE_SIZE)522 if (n > PAGE_SIZE)
523 n = PAGE_SIZE;523 n = PAGE_SIZE;
524 n = copy_page_from_iter(page, 0, n, iter);524 if (copy_page_from_iter(page, 0, n, iter) != n)
525 if (!n)
526 return -EFAULT;525 return -EFAULT;
527 size -= n;526 size -= n;
528 }527 }
529 return 0;528 return 0;
530
531}529}
532 530
533/*531/*
include/uapi/linux/stat.h+2−6
@@ -48,17 +48,13 @@ · 47 unmodified lines
48 * tv_sec holds the number of seconds before (negative) or after (positive)48 * tv_sec holds the number of seconds before (negative) or after (positive)
49 * 00:00:00 1st January 1970 UTC.49 * 00:00:00 1st January 1970 UTC.
50 *50 *
51 * tv_nsec holds a number of nanoseconds before (0..-999,999,999 if tv_sec is51 * tv_nsec holds a number of nanoseconds (0..999,999,999) after the tv_sec time.
52 * negative) or after (0..999,999,999 if tv_sec is positive) the tv_sec time.
53 *
54 * Note that if both tv_sec and tv_nsec are non-zero, then the two values must
55 * either be both positive or both negative.
56 *52 *
57 * __reserved is held in case we need a yet finer resolution.53 * __reserved is held in case we need a yet finer resolution.
58 */54 */
59struct statx_timestamp {55struct statx_timestamp {
60 __s64 tv_sec;56 __s64 tv_sec;
61 __s32 tv_nsec;57 __u32 tv_nsec;
62 __s32 __reserved;58 __s32 __reserved;
63};59};
64 60
net/9p/client.c+4−0
@@ -2101,6 +2101,10 @@ int p9_client_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset) · 2100 unmodified lines
2101 trace_9p_protocol_dump(clnt, req->rc);2101 trace_9p_protocol_dump(clnt, req->rc);
2102 goto free_and_error;2102 goto free_and_error;
2103 }2103 }
2104 if (rsize < count) {
2105 pr_err("bogus RREADDIR count (%d > %d)\n", count, rsize);
2106 count = rsize;
2107 }
2104 2108
2105 p9_debug(P9_DEBUG_9P, "<<< RREADDIR count %d\n", count);2109 p9_debug(P9_DEBUG_9P, "<<< RREADDIR count %d\n", count);
2106 2110