|
@@ -42,6 +42,7 @@
|
|
|
#include <linux/io.h>
|
|
|
#include <linux/jiffies.h>
|
|
|
#include <linux/cpu.h>
|
|
|
+#include <linux/uio.h>
|
|
|
#include <asm/pgtable.h>
|
|
|
|
|
|
#include "ipath_kernel.h"
|
|
@@ -52,15 +53,19 @@ static int ipath_open(struct inode *, struct file *);
|
|
|
static int ipath_close(struct inode *, struct file *);
|
|
|
static ssize_t ipath_write(struct file *, const char __user *, size_t,
|
|
|
loff_t *);
|
|
|
-static ssize_t ipath_writev(struct kiocb *, const struct iovec *,
|
|
|
- unsigned long , loff_t);
|
|
|
+static ssize_t ipath_write_iter(struct kiocb *, struct iov_iter *from);
|
|
|
static unsigned int ipath_poll(struct file *, struct poll_table_struct *);
|
|
|
static int ipath_mmap(struct file *, struct vm_area_struct *);
|
|
|
|
|
|
+/*
|
|
|
+ * This is really, really weird shit - write() and writev() here
|
|
|
+ * have completely unrelated semantics. Sucky userland ABI,
|
|
|
+ * film at 11.
|
|
|
+ */
|
|
|
static const struct file_operations ipath_file_ops = {
|
|
|
.owner = THIS_MODULE,
|
|
|
.write = ipath_write,
|
|
|
- .aio_write = ipath_writev,
|
|
|
+ .write_iter = ipath_write_iter,
|
|
|
.open = ipath_open,
|
|
|
.release = ipath_close,
|
|
|
.poll = ipath_poll,
|
|
@@ -2413,18 +2418,17 @@ bail:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static ssize_t ipath_writev(struct kiocb *iocb, const struct iovec *iov,
|
|
|
- unsigned long dim, loff_t off)
|
|
|
+static ssize_t ipath_write_iter(struct kiocb *iocb, struct iov_iter *from)
|
|
|
{
|
|
|
struct file *filp = iocb->ki_filp;
|
|
|
struct ipath_filedata *fp = filp->private_data;
|
|
|
struct ipath_portdata *pd = port_fp(filp);
|
|
|
struct ipath_user_sdma_queue *pq = fp->pq;
|
|
|
|
|
|
- if (!dim)
|
|
|
+ if (!iter_is_iovec(from) || !from->nr_segs)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- return ipath_user_sdma_writev(pd->port_dd, pq, iov, dim);
|
|
|
+ return ipath_user_sdma_writev(pd->port_dd, pq, from->iov, from->nr_segs);
|
|
|
}
|
|
|
|
|
|
static struct class *ipath_class;
|