|
@@ -22,8 +22,6 @@
|
|
#include <asm/unistd.h>
|
|
#include <asm/unistd.h>
|
|
|
|
|
|
typedef ssize_t (*io_fn_t)(struct file *, char __user *, size_t, loff_t *);
|
|
typedef ssize_t (*io_fn_t)(struct file *, char __user *, size_t, loff_t *);
|
|
-typedef ssize_t (*iov_fn_t)(struct kiocb *, const struct iovec *,
|
|
|
|
- unsigned long, loff_t);
|
|
|
|
typedef ssize_t (*iter_fn_t)(struct kiocb *, struct iov_iter *);
|
|
typedef ssize_t (*iter_fn_t)(struct kiocb *, struct iov_iter *);
|
|
|
|
|
|
const struct file_operations generic_ro_fops = {
|
|
const struct file_operations generic_ro_fops = {
|
|
@@ -668,21 +666,6 @@ static ssize_t do_iter_readv_writev(struct file *filp, struct iov_iter *iter,
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-static ssize_t do_sync_readv_writev(struct file *filp, struct iov_iter *iter,
|
|
|
|
- loff_t *ppos, iov_fn_t fn)
|
|
|
|
-{
|
|
|
|
- struct kiocb kiocb;
|
|
|
|
- ssize_t ret;
|
|
|
|
-
|
|
|
|
- init_sync_kiocb(&kiocb, filp);
|
|
|
|
- kiocb.ki_pos = *ppos;
|
|
|
|
-
|
|
|
|
- ret = fn(&kiocb, iter->iov, iter->nr_segs, kiocb.ki_pos);
|
|
|
|
- BUG_ON(ret == -EIOCBQUEUED);
|
|
|
|
- *ppos = kiocb.ki_pos;
|
|
|
|
- return ret;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/* Do it by hand, with file-ops */
|
|
/* Do it by hand, with file-ops */
|
|
static ssize_t do_loop_readv_writev(struct file *filp, struct iov_iter *iter,
|
|
static ssize_t do_loop_readv_writev(struct file *filp, struct iov_iter *iter,
|
|
loff_t *ppos, io_fn_t fn)
|
|
loff_t *ppos, io_fn_t fn)
|
|
@@ -797,7 +780,6 @@ static ssize_t do_readv_writev(int type, struct file *file,
|
|
struct iov_iter iter;
|
|
struct iov_iter iter;
|
|
ssize_t ret;
|
|
ssize_t ret;
|
|
io_fn_t fn;
|
|
io_fn_t fn;
|
|
- iov_fn_t fnv;
|
|
|
|
iter_fn_t iter_fn;
|
|
iter_fn_t iter_fn;
|
|
|
|
|
|
ret = import_iovec(type, uvector, nr_segs,
|
|
ret = import_iovec(type, uvector, nr_segs,
|
|
@@ -812,22 +794,17 @@ static ssize_t do_readv_writev(int type, struct file *file,
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
- fnv = NULL;
|
|
|
|
if (type == READ) {
|
|
if (type == READ) {
|
|
fn = file->f_op->read;
|
|
fn = file->f_op->read;
|
|
- fnv = file->f_op->aio_read;
|
|
|
|
iter_fn = file->f_op->read_iter;
|
|
iter_fn = file->f_op->read_iter;
|
|
} else {
|
|
} else {
|
|
fn = (io_fn_t)file->f_op->write;
|
|
fn = (io_fn_t)file->f_op->write;
|
|
- fnv = file->f_op->aio_write;
|
|
|
|
iter_fn = file->f_op->write_iter;
|
|
iter_fn = file->f_op->write_iter;
|
|
file_start_write(file);
|
|
file_start_write(file);
|
|
}
|
|
}
|
|
|
|
|
|
if (iter_fn)
|
|
if (iter_fn)
|
|
ret = do_iter_readv_writev(file, &iter, pos, iter_fn);
|
|
ret = do_iter_readv_writev(file, &iter, pos, iter_fn);
|
|
- else if (fnv)
|
|
|
|
- ret = do_sync_readv_writev(file, &iter, pos, fnv);
|
|
|
|
else
|
|
else
|
|
ret = do_loop_readv_writev(file, &iter, pos, fn);
|
|
ret = do_loop_readv_writev(file, &iter, pos, fn);
|
|
|
|
|
|
@@ -977,7 +954,6 @@ static ssize_t compat_do_readv_writev(int type, struct file *file,
|
|
struct iov_iter iter;
|
|
struct iov_iter iter;
|
|
ssize_t ret;
|
|
ssize_t ret;
|
|
io_fn_t fn;
|
|
io_fn_t fn;
|
|
- iov_fn_t fnv;
|
|
|
|
iter_fn_t iter_fn;
|
|
iter_fn_t iter_fn;
|
|
|
|
|
|
ret = compat_import_iovec(type, uvector, nr_segs,
|
|
ret = compat_import_iovec(type, uvector, nr_segs,
|
|
@@ -992,22 +968,17 @@ static ssize_t compat_do_readv_writev(int type, struct file *file,
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
- fnv = NULL;
|
|
|
|
if (type == READ) {
|
|
if (type == READ) {
|
|
fn = file->f_op->read;
|
|
fn = file->f_op->read;
|
|
- fnv = file->f_op->aio_read;
|
|
|
|
iter_fn = file->f_op->read_iter;
|
|
iter_fn = file->f_op->read_iter;
|
|
} else {
|
|
} else {
|
|
fn = (io_fn_t)file->f_op->write;
|
|
fn = (io_fn_t)file->f_op->write;
|
|
- fnv = file->f_op->aio_write;
|
|
|
|
iter_fn = file->f_op->write_iter;
|
|
iter_fn = file->f_op->write_iter;
|
|
file_start_write(file);
|
|
file_start_write(file);
|
|
}
|
|
}
|
|
|
|
|
|
if (iter_fn)
|
|
if (iter_fn)
|
|
ret = do_iter_readv_writev(file, &iter, pos, iter_fn);
|
|
ret = do_iter_readv_writev(file, &iter, pos, iter_fn);
|
|
- else if (fnv)
|
|
|
|
- ret = do_sync_readv_writev(file, &iter, pos, fnv);
|
|
|
|
else
|
|
else
|
|
ret = do_loop_readv_writev(file, &iter, pos, fn);
|
|
ret = do_loop_readv_writev(file, &iter, pos, fn);
|
|
|
|
|