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 */
 }
 
  * 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;
        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));
 
        nfs_direct_req_release(dreq);
 out_unlock:
        mutex_unlock(&inode->i_mutex);
-out:
        return result;
 }
 
 
        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))