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

+25 -18
+18 -9
fs/nfs/direct.c
··· 537 537 538 538 if (put_dreq(dreq)) 539 539 nfs_direct_complete(dreq); 540 - return 0; 540 + return requested_bytes; 541 541 } 542 542 543 543 /** ··· 566 566 struct inode *inode = mapping->host; 567 567 struct nfs_direct_req *dreq; 568 568 struct nfs_lock_context *l_ctx; 569 - ssize_t result = -EINVAL; 569 + ssize_t result = -EINVAL, requested; 570 570 size_t count = iov_iter_count(iter); 571 571 nfs_add_stats(mapping->host, NFSIOS_DIRECTREADBYTES, count); 572 572 ··· 600 600 nfs_start_io_direct(inode); 601 601 602 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 605 nfs_end_io_direct(inode); 606 606 607 - if (!result) { 607 + if (requested > 0) { 608 608 result = nfs_direct_wait(dreq); 609 - if (result > 0) 609 + if (result > 0) { 610 + requested -= result; 610 611 iocb->ki_pos += result; 612 + } 613 + iov_iter_revert(iter, requested); 614 + } else { 615 + result = requested; 611 616 } 612 617 613 618 out_release: ··· 959 954 960 955 if (put_dreq(dreq)) 961 956 nfs_direct_write_complete(dreq); 962 - return 0; 957 + return requested_bytes; 963 958 } 964 959 965 960 /** ··· 984 979 */ 985 980 ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter) 986 981 { 987 - ssize_t result = -EINVAL; 982 + ssize_t result = -EINVAL, requested; 988 983 size_t count; 989 984 struct file *file = iocb->ki_filp; 990 985 struct address_space *mapping = file->f_mapping; ··· 1027 1022 1028 1023 nfs_start_io_direct(inode); 1029 1024 1030 - result = nfs_direct_write_schedule_iovec(dreq, iter, pos); 1025 + requested = nfs_direct_write_schedule_iovec(dreq, iter, pos); 1031 1026 1032 1027 if (mapping->nrpages) { 1033 1028 invalidate_inode_pages2_range(mapping, ··· 1036 1031 1037 1032 nfs_end_io_direct(inode); 1038 1033 1039 - if (!result) { 1034 + if (requested > 0) { 1040 1035 result = nfs_direct_wait(dreq); 1041 1036 if (result > 0) { 1037 + requested -= result; 1042 1038 iocb->ki_pos = pos + result; 1043 1039 /* XXX: should check the generic_write_sync retval */ 1044 1040 generic_write_sync(iocb, result); 1045 1041 } 1042 + iov_iter_revert(iter, requested); 1043 + } else { 1044 + result = requested; 1046 1045 } 1047 1046 out_release: 1048 1047 nfs_direct_req_release(dreq);
+1 -3
fs/orangefs/orangefs-bufmap.c
··· 521 521 size_t n = size; 522 522 if (n > PAGE_SIZE) 523 523 n = PAGE_SIZE; 524 - n = copy_page_from_iter(page, 0, n, iter); 525 - if (!n) 524 + if (copy_page_from_iter(page, 0, n, iter) != n) 526 525 return -EFAULT; 527 526 size -= n; 528 527 } 529 528 return 0; 530 - 531 529 } 532 530 533 531 /*
+2 -6
include/uapi/linux/stat.h
··· 48 48 * tv_sec holds the number of seconds before (negative) or after (positive) 49 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 is 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. 51 + * tv_nsec holds a number of nanoseconds (0..999,999,999) after the tv_sec time. 56 52 * 57 53 * __reserved is held in case we need a yet finer resolution. 58 54 */ 59 55 struct statx_timestamp { 60 56 __s64 tv_sec; 61 - __s32 tv_nsec; 57 + __u32 tv_nsec; 62 58 __s32 __reserved; 63 59 }; 64 60
+4
net/9p/client.c
··· 2101 2101 trace_9p_protocol_dump(clnt, req->rc); 2102 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 2109 p9_debug(P9_DEBUG_9P, "<<< RREADDIR count %d\n", count); 2106 2110