[PATCH] Remove readv/writev methods and use aio_read/aio_write instead
This patch removes readv() and writev() methods and replaces them with aio_read()/aio_write() methods. Signed-off-by: Badari Pulavarty <pbadari@us.ibm.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
027445c372
commit
ee0b3e671b
44
fs/compat.c
44
fs/compat.c
@@ -70,6 +70,8 @@ int compat_printk(const char *fmt, ...)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#include "read_write.h"
|
||||
|
||||
/*
|
||||
* Not all architectures have sys_utime, so implement this in terms
|
||||
* of sys_utimes.
|
||||
@@ -1149,9 +1151,6 @@ static ssize_t compat_do_readv_writev(int type, struct file *file,
|
||||
const struct compat_iovec __user *uvector,
|
||||
unsigned long nr_segs, loff_t *pos)
|
||||
{
|
||||
typedef ssize_t (*io_fn_t)(struct file *, char __user *, size_t, loff_t *);
|
||||
typedef ssize_t (*iov_fn_t)(struct file *, const struct iovec *, unsigned long, loff_t *);
|
||||
|
||||
compat_ssize_t tot_len;
|
||||
struct iovec iovstack[UIO_FASTIOV];
|
||||
struct iovec *iov=iovstack, *vector;
|
||||
@@ -1234,39 +1233,18 @@ static ssize_t compat_do_readv_writev(int type, struct file *file,
|
||||
fnv = NULL;
|
||||
if (type == READ) {
|
||||
fn = file->f_op->read;
|
||||
fnv = file->f_op->readv;
|
||||
fnv = file->f_op->aio_read;
|
||||
} else {
|
||||
fn = (io_fn_t)file->f_op->write;
|
||||
fnv = file->f_op->writev;
|
||||
}
|
||||
if (fnv) {
|
||||
ret = fnv(file, iov, nr_segs, pos);
|
||||
goto out;
|
||||
fnv = file->f_op->aio_write;
|
||||
}
|
||||
|
||||
/* Do it by hand, with file-ops */
|
||||
ret = 0;
|
||||
vector = iov;
|
||||
while (nr_segs > 0) {
|
||||
void __user * base;
|
||||
size_t len;
|
||||
ssize_t nr;
|
||||
if (fnv)
|
||||
ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
|
||||
pos, fnv);
|
||||
else
|
||||
ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
|
||||
|
||||
base = vector->iov_base;
|
||||
len = vector->iov_len;
|
||||
vector++;
|
||||
nr_segs--;
|
||||
|
||||
nr = fn(file, base, len, pos);
|
||||
|
||||
if (nr < 0) {
|
||||
if (!ret) ret = nr;
|
||||
break;
|
||||
}
|
||||
ret += nr;
|
||||
if (nr != len)
|
||||
break;
|
||||
}
|
||||
out:
|
||||
if (iov != iovstack)
|
||||
kfree(iov);
|
||||
@@ -1294,7 +1272,7 @@ compat_sys_readv(unsigned long fd, const struct compat_iovec __user *vec, unsign
|
||||
goto out;
|
||||
|
||||
ret = -EINVAL;
|
||||
if (!file->f_op || (!file->f_op->readv && !file->f_op->read))
|
||||
if (!file->f_op || (!file->f_op->aio_read && !file->f_op->read))
|
||||
goto out;
|
||||
|
||||
ret = compat_do_readv_writev(READ, file, vec, vlen, &file->f_pos);
|
||||
@@ -1317,7 +1295,7 @@ compat_sys_writev(unsigned long fd, const struct compat_iovec __user *vec, unsig
|
||||
goto out;
|
||||
|
||||
ret = -EINVAL;
|
||||
if (!file->f_op || (!file->f_op->writev && !file->f_op->write))
|
||||
if (!file->f_op || (!file->f_op->aio_write && !file->f_op->write))
|
||||
goto out;
|
||||
|
||||
ret = compat_do_readv_writev(WRITE, file, vec, vlen, &file->f_pos);
|
||||
|
Reference in New Issue
Block a user