diff options
| -rw-r--r-- | fs/nfs/direct.c | 27 | ||||
| -rw-r--r-- | fs/orangefs/orangefs-bufmap.c | 4 | ||||
| -rw-r--r-- | include/uapi/linux/stat.h | 8 | ||||
| -rw-r--r-- | net/9p/client.c | 4 |
4 files changed, 25 insertions, 18 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index aab32fc3d6a8..c1b5fed7c863 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
| @@ -537,7 +537,7 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq, | |||
| 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) | |||
| 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) | |||
| 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 | ||
| 613 | out_release: | 618 | out_release: |
| @@ -954,7 +959,7 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq, | |||
| 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, | |||
| 979 | */ | 984 | */ |
| 980 | ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter) | 985 | ssize_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) | |||
| 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) | |||
| 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 | } |
| 1042 | out_release: | 1051 | out_release: |
| 1043 | nfs_direct_req_release(dreq); | 1052 | nfs_direct_req_release(dreq); |
diff --git a/fs/orangefs/orangefs-bufmap.c b/fs/orangefs/orangefs-bufmap.c index 6333cbbdfef7..83b506020718 100644 --- a/fs/orangefs/orangefs-bufmap.c +++ b/fs/orangefs/orangefs-bufmap.c | |||
| @@ -521,13 +521,11 @@ int orangefs_bufmap_copy_from_iovec(struct iov_iter *iter, | |||
| 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 | /* |
diff --git a/include/uapi/linux/stat.h b/include/uapi/linux/stat.h index d538897b8e08..17b10304c393 100644 --- a/include/uapi/linux/stat.h +++ b/include/uapi/linux/stat.h | |||
| @@ -48,17 +48,13 @@ | |||
| 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 is | 51 | * 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 | */ |
| 59 | struct statx_timestamp { | 55 | struct 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 | ||
diff --git a/net/9p/client.c b/net/9p/client.c index 3ce672af1596..8e5c6a8d0a37 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
| @@ -2101,6 +2101,10 @@ int p9_client_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset) | |||
| 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 | ||
