nfs: generic_write_checks() shouldn't be done on swapout...
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 9 Apr 2015 18:11:08 +0000 (14:11 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 15 Apr 2015 19:04:27 +0000 (15:04 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/nfs/direct.c
fs/nfs/file.c
include/linux/nfs_fs.h

index 9634189b85454f9b27928a460f15e2c607924f71..682f65fe09b5177dcd64bcd2970bbfcef9824ac3 100644 (file)
@@ -268,7 +268,7 @@ ssize_t nfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t pos)
 
        if (iov_iter_rw(iter) == READ)
                return nfs_file_direct_read(iocb, iter, pos);
-       return nfs_file_direct_write(iocb, iter, pos);
+       return nfs_file_direct_write(iocb, iter);
 #endif /* CONFIG_NFS_SWAP */
 }
 
@@ -959,8 +959,7 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
  * Note that O_APPEND is not supported for NFS direct writes, as there
  * is no atomic O_APPEND write facility in the NFS protocol.
  */
-ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter,
-                               loff_t pos)
+ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)
 {
        ssize_t result = -EINVAL;
        struct file *file = iocb->ki_filp;
@@ -968,15 +967,11 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter,
        struct inode *inode = mapping->host;
        struct nfs_direct_req *dreq;
        struct nfs_lock_context *l_ctx;
-       loff_t end;
+       loff_t pos, end;
 
        dfprintk(FILE, "NFS: direct write(%pD2, %zd@%Ld)\n",
                file, iov_iter_count(iter), (long long) iocb->ki_pos);
 
-       result = generic_write_checks(iocb, iter);
-       if (result <= 0)
-               goto out;
-
        nfs_add_stats(mapping->host, NFSIOS_DIRECTWRITTENBYTES,
                      iov_iter_count(iter));
 
@@ -1044,7 +1039,6 @@ out_release:
        nfs_direct_req_release(dreq);
 out_unlock:
        mutex_unlock(&inode->i_mutex);
-out:
        return result;
 }
 
index 14364dc001f7cb19ac69b464b0b974ef06a8af54..c40e4363e746eab4014991f326005aa27721b460 100644 (file)
@@ -674,17 +674,20 @@ ssize_t nfs_file_write(struct kiocb *iocb, struct iov_iter *from)
        unsigned long written = 0;
        ssize_t result;
        size_t count = iov_iter_count(from);
-       loff_t pos = iocb->ki_pos;
 
        result = nfs_key_timeout_notify(file, inode);
        if (result)
                return result;
 
-       if (iocb->ki_flags & IOCB_DIRECT)
-               return nfs_file_direct_write(iocb, from, pos);
+       if (iocb->ki_flags & IOCB_DIRECT) {
+               result = generic_write_checks(iocb, from);
+               if (result <= 0)
+                       return result;
+               return nfs_file_direct_write(iocb, from);
+       }
 
        dprintk("NFS: write(%pD2, %zu@%Ld)\n",
-               file, count, (long long) pos);
+               file, count, (long long) iocb->ki_pos);
 
        result = -EBUSY;
        if (IS_SWAPFILE(inode))
index 3d1b0d2fe55e8d2725759b6a23913c3266713d39..410abd172febee648d8f63cab2e00592773ddaed 100644 (file)
@@ -452,8 +452,7 @@ extern ssize_t nfs_file_direct_read(struct kiocb *iocb,
                        struct iov_iter *iter,
                        loff_t pos);
 extern ssize_t nfs_file_direct_write(struct kiocb *iocb,
-                       struct iov_iter *iter,
-                       loff_t pos);
+                       struct iov_iter *iter);
 
 /*
  * linux/fs/nfs/dir.c