aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-04-09 14:11:08 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-04-15 15:04:27 -0400
commit65a4a1cad7c56e7056fb4b35ac2d93695612612c (patch)
tree4003fa611739da71f5ebdfe323f1f294743ebf35 /fs/nfs
parent7da839c475894ea872ec909a5d2e83dddccff5be (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.c12
-rw-r--r--fs/nfs/file.c11
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 */
962ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter, 962ssize_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);
1045out_unlock: 1040out_unlock:
1046 mutex_unlock(&inode->i_mutex); 1041 mutex_unlock(&inode->i_mutex);
1047out:
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))