ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)
 {
        ssize_t result = -EINVAL;
+       size_t count;
        struct file *file = iocb->ki_filp;
        struct address_space *mapping = file->f_mapping;
        struct inode *inode = mapping->host;
        dfprintk(FILE, "NFS: direct write(%pD2, %zd@%Ld)\n",
                file, iov_iter_count(iter), (long long) iocb->ki_pos);
 
-       nfs_add_stats(mapping->host, NFSIOS_DIRECTWRITTENBYTES,
-                     iov_iter_count(iter));
+       result = generic_write_checks(iocb, iter);
+       if (result <= 0)
+               return result;
+       count = result;
+       nfs_add_stats(mapping->host, NFSIOS_DIRECTWRITTENBYTES, count);
 
        pos = iocb->ki_pos;
        end = (pos + iov_iter_count(iter) - 1) >> PAGE_SHIFT;
                        goto out_unlock;
        }
 
-       task_io_account_write(iov_iter_count(iter));
+       task_io_account_write(count);
 
        result = -ENOMEM;
        dreq = nfs_direct_req_alloc();
                goto out_unlock;
 
        dreq->inode = inode;
-       dreq->bytes_left = dreq->max_count = iov_iter_count(iter);
+       dreq->bytes_left = dreq->max_count = count;
        dreq->io_start = pos;
        dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp));
        l_ctx = nfs_get_lock_context(dreq->ctx);
 
        if (result)
                return result;
 
-       if (iocb->ki_flags & IOCB_DIRECT) {
-               result = generic_write_checks(iocb, from);
-               if (result <= 0)
-                       return result;
+       if (iocb->ki_flags & IOCB_DIRECT)
                return nfs_file_direct_write(iocb, from);
-       }
 
        dprintk("NFS: write(%pD2, %zu@%Ld)\n",
                file, count, (long long) iocb->ki_pos);