Commit e6a7bcb4 authored by Al Viro's avatar Al Viro

cifs: switch to ->read_iter()

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 37c20f16
...@@ -907,9 +907,9 @@ const struct file_operations cifs_file_ops = { ...@@ -907,9 +907,9 @@ const struct file_operations cifs_file_ops = {
}; };
const struct file_operations cifs_file_strict_ops = { const struct file_operations cifs_file_strict_ops = {
.read = do_sync_read, .read = new_sync_read,
.write = do_sync_write, .write = do_sync_write,
.aio_read = cifs_strict_readv, .read_iter = cifs_strict_readv,
.aio_write = cifs_strict_writev, .aio_write = cifs_strict_writev,
.open = cifs_open, .open = cifs_open,
.release = cifs_close, .release = cifs_close,
...@@ -927,9 +927,9 @@ const struct file_operations cifs_file_strict_ops = { ...@@ -927,9 +927,9 @@ const struct file_operations cifs_file_strict_ops = {
const struct file_operations cifs_file_direct_ops = { const struct file_operations cifs_file_direct_ops = {
/* BB reevaluate whether they can be done with directio, no cache */ /* BB reevaluate whether they can be done with directio, no cache */
.read = do_sync_read, .read = new_sync_read,
.write = do_sync_write, .write = do_sync_write,
.aio_read = cifs_user_readv, .read_iter = cifs_user_readv,
.aio_write = cifs_user_writev, .aio_write = cifs_user_writev,
.open = cifs_open, .open = cifs_open,
.release = cifs_close, .release = cifs_close,
...@@ -964,9 +964,9 @@ const struct file_operations cifs_file_nobrl_ops = { ...@@ -964,9 +964,9 @@ const struct file_operations cifs_file_nobrl_ops = {
}; };
const struct file_operations cifs_file_strict_nobrl_ops = { const struct file_operations cifs_file_strict_nobrl_ops = {
.read = do_sync_read, .read = new_sync_read,
.write = do_sync_write, .write = do_sync_write,
.aio_read = cifs_strict_readv, .read_iter = cifs_strict_readv,
.aio_write = cifs_strict_writev, .aio_write = cifs_strict_writev,
.open = cifs_open, .open = cifs_open,
.release = cifs_close, .release = cifs_close,
...@@ -983,9 +983,9 @@ const struct file_operations cifs_file_strict_nobrl_ops = { ...@@ -983,9 +983,9 @@ const struct file_operations cifs_file_strict_nobrl_ops = {
const struct file_operations cifs_file_direct_nobrl_ops = { const struct file_operations cifs_file_direct_nobrl_ops = {
/* BB reevaluate whether they can be done with directio, no cache */ /* BB reevaluate whether they can be done with directio, no cache */
.read = do_sync_read, .read = new_sync_read,
.write = do_sync_write, .write = do_sync_write,
.aio_read = cifs_user_readv, .read_iter = cifs_user_readv,
.aio_write = cifs_user_writev, .aio_write = cifs_user_writev,
.open = cifs_open, .open = cifs_open,
.release = cifs_close, .release = cifs_close,
......
...@@ -85,10 +85,8 @@ extern const struct file_operations cifs_file_strict_nobrl_ops; ...@@ -85,10 +85,8 @@ extern const struct file_operations cifs_file_strict_nobrl_ops;
extern int cifs_open(struct inode *inode, struct file *file); extern int cifs_open(struct inode *inode, struct file *file);
extern int cifs_close(struct inode *inode, struct file *file); extern int cifs_close(struct inode *inode, struct file *file);
extern int cifs_closedir(struct inode *inode, struct file *file); extern int cifs_closedir(struct inode *inode, struct file *file);
extern ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, extern ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to);
unsigned long nr_segs, loff_t pos); extern ssize_t cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to);
extern ssize_t cifs_strict_readv(struct kiocb *iocb, const struct iovec *iov,
unsigned long nr_segs, loff_t pos);
extern ssize_t cifs_user_writev(struct kiocb *iocb, const struct iovec *iov, extern ssize_t cifs_user_writev(struct kiocb *iocb, const struct iovec *iov,
unsigned long nr_segs, loff_t pos); unsigned long nr_segs, loff_t pos);
extern ssize_t cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov, extern ssize_t cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov,
......
...@@ -2830,32 +2830,25 @@ cifs_uncached_read_into_pages(struct TCP_Server_Info *server, ...@@ -2830,32 +2830,25 @@ cifs_uncached_read_into_pages(struct TCP_Server_Info *server,
return total_read > 0 ? total_read : result; return total_read > 0 ? total_read : result;
} }
ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to)
unsigned long nr_segs, loff_t pos)
{ {
struct file *file = iocb->ki_filp; struct file *file = iocb->ki_filp;
ssize_t rc; ssize_t rc;
size_t len, cur_len; size_t len, cur_len;
ssize_t total_read = 0; ssize_t total_read = 0;
loff_t offset = pos; loff_t offset = iocb->ki_pos;
unsigned int npages; unsigned int npages;
struct cifs_sb_info *cifs_sb; struct cifs_sb_info *cifs_sb;
struct cifs_tcon *tcon; struct cifs_tcon *tcon;
struct cifsFileInfo *open_file; struct cifsFileInfo *open_file;
struct cifs_readdata *rdata, *tmp; struct cifs_readdata *rdata, *tmp;
struct list_head rdata_list; struct list_head rdata_list;
struct iov_iter to;
pid_t pid; pid_t pid;
if (!nr_segs) len = iov_iter_count(to);
return 0;
len = iov_length(iov, nr_segs);
if (!len) if (!len)
return 0; return 0;
iov_iter_init(&to, READ, iov, nr_segs, len);
INIT_LIST_HEAD(&rdata_list); INIT_LIST_HEAD(&rdata_list);
cifs_sb = CIFS_SB(file->f_path.dentry->d_sb); cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
open_file = file->private_data; open_file = file->private_data;
...@@ -2913,7 +2906,7 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, ...@@ -2913,7 +2906,7 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov,
if (!list_empty(&rdata_list)) if (!list_empty(&rdata_list))
rc = 0; rc = 0;
len = iov_iter_count(&to); len = iov_iter_count(to);
/* the loop below should proceed in the order of increasing offsets */ /* the loop below should proceed in the order of increasing offsets */
list_for_each_entry_safe(rdata, tmp, &rdata_list, list) { list_for_each_entry_safe(rdata, tmp, &rdata_list, list) {
again: again:
...@@ -2930,7 +2923,7 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, ...@@ -2930,7 +2923,7 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov,
goto again; goto again;
} }
} else { } else {
rc = cifs_readdata_to_iov(rdata, &to); rc = cifs_readdata_to_iov(rdata, to);
} }
} }
...@@ -2938,7 +2931,7 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, ...@@ -2938,7 +2931,7 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov,
kref_put(&rdata->refcount, cifs_uncached_readdata_release); kref_put(&rdata->refcount, cifs_uncached_readdata_release);
} }
total_read = len - iov_iter_count(&to); total_read = len - iov_iter_count(to);
cifs_stats_bytes_read(tcon, total_read); cifs_stats_bytes_read(tcon, total_read);
...@@ -2947,15 +2940,14 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, ...@@ -2947,15 +2940,14 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov,
rc = 0; rc = 0;
if (total_read) { if (total_read) {
iocb->ki_pos = pos + total_read; iocb->ki_pos += total_read;
return total_read; return total_read;
} }
return rc; return rc;
} }
ssize_t ssize_t
cifs_strict_readv(struct kiocb *iocb, const struct iovec *iov, cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to)
unsigned long nr_segs, loff_t pos)
{ {
struct inode *inode = file_inode(iocb->ki_filp); struct inode *inode = file_inode(iocb->ki_filp);
struct cifsInodeInfo *cinode = CIFS_I(inode); struct cifsInodeInfo *cinode = CIFS_I(inode);
...@@ -2974,22 +2966,22 @@ cifs_strict_readv(struct kiocb *iocb, const struct iovec *iov, ...@@ -2974,22 +2966,22 @@ cifs_strict_readv(struct kiocb *iocb, const struct iovec *iov,
* pos+len-1. * pos+len-1.
*/ */
if (!CIFS_CACHE_READ(cinode)) if (!CIFS_CACHE_READ(cinode))
return cifs_user_readv(iocb, iov, nr_segs, pos); return cifs_user_readv(iocb, to);
if (cap_unix(tcon->ses) && if (cap_unix(tcon->ses) &&
(CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) && (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0)) ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
return generic_file_aio_read(iocb, iov, nr_segs, pos); return generic_file_read_iter(iocb, to);
/* /*
* We need to hold the sem to be sure nobody modifies lock list * We need to hold the sem to be sure nobody modifies lock list
* with a brlock that prevents reading. * with a brlock that prevents reading.
*/ */
down_read(&cinode->lock_sem); down_read(&cinode->lock_sem);
if (!cifs_find_lock_conflict(cfile, pos, iov_length(iov, nr_segs), if (!cifs_find_lock_conflict(cfile, iocb->ki_pos, iov_iter_count(to),
tcon->ses->server->vals->shared_lock_type, tcon->ses->server->vals->shared_lock_type,
NULL, CIFS_READ_OP)) NULL, CIFS_READ_OP))
rc = generic_file_aio_read(iocb, iov, nr_segs, pos); rc = generic_file_read_iter(iocb, to);
up_read(&cinode->lock_sem); up_read(&cinode->lock_sem);
return rc; return rc;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment