diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-09 14:11:08 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-15 15:04:27 -0400 |
commit | 65a4a1cad7c56e7056fb4b35ac2d93695612612c (patch) | |
tree | 4003fa611739da71f5ebdfe323f1f294743ebf35 /fs/nfs | |
parent | 7da839c475894ea872ec909a5d2e83dddccff5be (diff) |
nfs: generic_write_checks() shouldn't be done on swapout...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/direct.c | 12 | ||||
-rw-r--r-- | fs/nfs/file.c | 11 |
2 files changed, 10 insertions, 13 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 9634189b8545..682f65fe09b5 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
@@ -268,7 +268,7 @@ ssize_t nfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t pos) | |||
268 | 268 | ||
269 | if (iov_iter_rw(iter) == READ) | 269 | if (iov_iter_rw(iter) == READ) |
270 | return nfs_file_direct_read(iocb, iter, pos); | 270 | return nfs_file_direct_read(iocb, iter, pos); |
271 | return nfs_file_direct_write(iocb, iter, pos); | 271 | return nfs_file_direct_write(iocb, iter); |
272 | #endif /* CONFIG_NFS_SWAP */ | 272 | #endif /* CONFIG_NFS_SWAP */ |
273 | } | 273 | } |
274 | 274 | ||
@@ -959,8 +959,7 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq, | |||
959 | * Note that O_APPEND is not supported for NFS direct writes, as there | 959 | * Note that O_APPEND is not supported for NFS direct writes, as there |
960 | * is no atomic O_APPEND write facility in the NFS protocol. | 960 | * is no atomic O_APPEND write facility in the NFS protocol. |
961 | */ | 961 | */ |
962 | ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter, | 962 | ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter) |
963 | loff_t pos) | ||
964 | { | 963 | { |
965 | ssize_t result = -EINVAL; | 964 | ssize_t result = -EINVAL; |
966 | struct file *file = iocb->ki_filp; | 965 | struct file *file = iocb->ki_filp; |
@@ -968,15 +967,11 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter, | |||
968 | struct inode *inode = mapping->host; | 967 | struct inode *inode = mapping->host; |
969 | struct nfs_direct_req *dreq; | 968 | struct nfs_direct_req *dreq; |
970 | struct nfs_lock_context *l_ctx; | 969 | struct nfs_lock_context *l_ctx; |
971 | loff_t end; | 970 | loff_t pos, end; |
972 | 971 | ||
973 | dfprintk(FILE, "NFS: direct write(%pD2, %zd@%Ld)\n", | 972 | dfprintk(FILE, "NFS: direct write(%pD2, %zd@%Ld)\n", |
974 | file, iov_iter_count(iter), (long long) iocb->ki_pos); | 973 | file, iov_iter_count(iter), (long long) iocb->ki_pos); |
975 | 974 | ||
976 | result = generic_write_checks(iocb, iter); | ||
977 | if (result <= 0) | ||
978 | goto out; | ||
979 | |||
980 | nfs_add_stats(mapping->host, NFSIOS_DIRECTWRITTENBYTES, | 975 | nfs_add_stats(mapping->host, NFSIOS_DIRECTWRITTENBYTES, |
981 | iov_iter_count(iter)); | 976 | iov_iter_count(iter)); |
982 | 977 | ||
@@ -1044,7 +1039,6 @@ out_release: | |||
1044 | nfs_direct_req_release(dreq); | 1039 | nfs_direct_req_release(dreq); |
1045 | out_unlock: | 1040 | out_unlock: |
1046 | mutex_unlock(&inode->i_mutex); | 1041 | mutex_unlock(&inode->i_mutex); |
1047 | out: | ||
1048 | return result; | 1042 | return result; |
1049 | } | 1043 | } |
1050 | 1044 | ||
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 14364dc001f7..c40e4363e746 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
@@ -674,17 +674,20 @@ ssize_t nfs_file_write(struct kiocb *iocb, struct iov_iter *from) | |||
674 | unsigned long written = 0; | 674 | unsigned long written = 0; |
675 | ssize_t result; | 675 | ssize_t result; |
676 | size_t count = iov_iter_count(from); | 676 | size_t count = iov_iter_count(from); |
677 | loff_t pos = iocb->ki_pos; | ||
678 | 677 | ||
679 | result = nfs_key_timeout_notify(file, inode); | 678 | result = nfs_key_timeout_notify(file, inode); |
680 | if (result) | 679 | if (result) |
681 | return result; | 680 | return result; |
682 | 681 | ||
683 | if (iocb->ki_flags & IOCB_DIRECT) | 682 | if (iocb->ki_flags & IOCB_DIRECT) { |
684 | return nfs_file_direct_write(iocb, from, pos); | 683 | result = generic_write_checks(iocb, from); |
684 | if (result <= 0) | ||
685 | return result; | ||
686 | return nfs_file_direct_write(iocb, from); | ||
687 | } | ||
685 | 688 | ||
686 | dprintk("NFS: write(%pD2, %zu@%Ld)\n", | 689 | dprintk("NFS: write(%pD2, %zu@%Ld)\n", |
687 | file, count, (long long) pos); | 690 | file, count, (long long) iocb->ki_pos); |
688 | 691 | ||
689 | result = -EBUSY; | 692 | result = -EBUSY; |
690 | if (IS_SWAPFILE(inode)) | 693 | if (IS_SWAPFILE(inode)) |