Loading fs/cifs/cifsfs.c +8 −8 Original line number Diff line number Diff line Loading @@ -907,9 +907,9 @@ const struct file_operations cifs_file_ops = { }; const struct file_operations cifs_file_strict_ops = { .read = do_sync_read, .read = new_sync_read, .write = do_sync_write, .aio_read = cifs_strict_readv, .read_iter = cifs_strict_readv, .aio_write = cifs_strict_writev, .open = cifs_open, .release = cifs_close, Loading @@ -927,9 +927,9 @@ const struct file_operations cifs_file_strict_ops = { const struct file_operations cifs_file_direct_ops = { /* BB reevaluate whether they can be done with directio, no cache */ .read = do_sync_read, .read = new_sync_read, .write = do_sync_write, .aio_read = cifs_user_readv, .read_iter = cifs_user_readv, .aio_write = cifs_user_writev, .open = cifs_open, .release = cifs_close, Loading Loading @@ -964,9 +964,9 @@ const struct file_operations cifs_file_nobrl_ops = { }; const struct file_operations cifs_file_strict_nobrl_ops = { .read = do_sync_read, .read = new_sync_read, .write = do_sync_write, .aio_read = cifs_strict_readv, .read_iter = cifs_strict_readv, .aio_write = cifs_strict_writev, .open = cifs_open, .release = cifs_close, Loading @@ -983,9 +983,9 @@ const struct file_operations cifs_file_strict_nobrl_ops = { const struct file_operations cifs_file_direct_nobrl_ops = { /* BB reevaluate whether they can be done with directio, no cache */ .read = do_sync_read, .read = new_sync_read, .write = do_sync_write, .aio_read = cifs_user_readv, .read_iter = cifs_user_readv, .aio_write = cifs_user_writev, .open = cifs_open, .release = cifs_close, Loading fs/cifs/cifsfs.h +2 −4 Original line number Diff line number Diff line Loading @@ -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_close(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, unsigned long nr_segs, loff_t pos); 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_readv(struct kiocb *iocb, struct iov_iter *to); extern ssize_t cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to); extern ssize_t cifs_user_writev(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos); extern ssize_t cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov, Loading fs/cifs/file.c +12 −20 Original line number Diff line number Diff line Loading @@ -2830,32 +2830,25 @@ cifs_uncached_read_into_pages(struct TCP_Server_Info *server, return total_read > 0 ? total_read : result; } ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos) ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to) { struct file *file = iocb->ki_filp; ssize_t rc; size_t len, cur_len; ssize_t total_read = 0; loff_t offset = pos; loff_t offset = iocb->ki_pos; unsigned int npages; struct cifs_sb_info *cifs_sb; struct cifs_tcon *tcon; struct cifsFileInfo *open_file; struct cifs_readdata *rdata, *tmp; struct list_head rdata_list; struct iov_iter to; pid_t pid; if (!nr_segs) return 0; len = iov_length(iov, nr_segs); len = iov_iter_count(to); if (!len) return 0; iov_iter_init(&to, READ, iov, nr_segs, len); INIT_LIST_HEAD(&rdata_list); cifs_sb = CIFS_SB(file->f_path.dentry->d_sb); open_file = file->private_data; Loading Loading @@ -2913,7 +2906,7 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, if (!list_empty(&rdata_list)) rc = 0; len = iov_iter_count(&to); len = iov_iter_count(to); /* the loop below should proceed in the order of increasing offsets */ list_for_each_entry_safe(rdata, tmp, &rdata_list, list) { again: Loading @@ -2930,7 +2923,7 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, goto again; } } else { rc = cifs_readdata_to_iov(rdata, &to); rc = cifs_readdata_to_iov(rdata, to); } } Loading @@ -2938,7 +2931,7 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, 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); Loading @@ -2947,15 +2940,14 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, rc = 0; if (total_read) { iocb->ki_pos = pos + total_read; iocb->ki_pos += total_read; return total_read; } return rc; } ssize_t cifs_strict_readv(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos) cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to) { struct inode *inode = file_inode(iocb->ki_filp); struct cifsInodeInfo *cinode = CIFS_I(inode); Loading @@ -2974,22 +2966,22 @@ cifs_strict_readv(struct kiocb *iocb, const struct iovec *iov, * pos+len-1. */ 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) && (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) && ((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 * with a brlock that prevents reading. */ 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, 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); return rc; } Loading Loading
fs/cifs/cifsfs.c +8 −8 Original line number Diff line number Diff line Loading @@ -907,9 +907,9 @@ const struct file_operations cifs_file_ops = { }; const struct file_operations cifs_file_strict_ops = { .read = do_sync_read, .read = new_sync_read, .write = do_sync_write, .aio_read = cifs_strict_readv, .read_iter = cifs_strict_readv, .aio_write = cifs_strict_writev, .open = cifs_open, .release = cifs_close, Loading @@ -927,9 +927,9 @@ const struct file_operations cifs_file_strict_ops = { const struct file_operations cifs_file_direct_ops = { /* BB reevaluate whether they can be done with directio, no cache */ .read = do_sync_read, .read = new_sync_read, .write = do_sync_write, .aio_read = cifs_user_readv, .read_iter = cifs_user_readv, .aio_write = cifs_user_writev, .open = cifs_open, .release = cifs_close, Loading Loading @@ -964,9 +964,9 @@ const struct file_operations cifs_file_nobrl_ops = { }; const struct file_operations cifs_file_strict_nobrl_ops = { .read = do_sync_read, .read = new_sync_read, .write = do_sync_write, .aio_read = cifs_strict_readv, .read_iter = cifs_strict_readv, .aio_write = cifs_strict_writev, .open = cifs_open, .release = cifs_close, Loading @@ -983,9 +983,9 @@ const struct file_operations cifs_file_strict_nobrl_ops = { const struct file_operations cifs_file_direct_nobrl_ops = { /* BB reevaluate whether they can be done with directio, no cache */ .read = do_sync_read, .read = new_sync_read, .write = do_sync_write, .aio_read = cifs_user_readv, .read_iter = cifs_user_readv, .aio_write = cifs_user_writev, .open = cifs_open, .release = cifs_close, Loading
fs/cifs/cifsfs.h +2 −4 Original line number Diff line number Diff line Loading @@ -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_close(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, unsigned long nr_segs, loff_t pos); 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_readv(struct kiocb *iocb, struct iov_iter *to); extern ssize_t cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to); extern ssize_t cifs_user_writev(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos); extern ssize_t cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov, Loading
fs/cifs/file.c +12 −20 Original line number Diff line number Diff line Loading @@ -2830,32 +2830,25 @@ cifs_uncached_read_into_pages(struct TCP_Server_Info *server, return total_read > 0 ? total_read : result; } ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos) ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to) { struct file *file = iocb->ki_filp; ssize_t rc; size_t len, cur_len; ssize_t total_read = 0; loff_t offset = pos; loff_t offset = iocb->ki_pos; unsigned int npages; struct cifs_sb_info *cifs_sb; struct cifs_tcon *tcon; struct cifsFileInfo *open_file; struct cifs_readdata *rdata, *tmp; struct list_head rdata_list; struct iov_iter to; pid_t pid; if (!nr_segs) return 0; len = iov_length(iov, nr_segs); len = iov_iter_count(to); if (!len) return 0; iov_iter_init(&to, READ, iov, nr_segs, len); INIT_LIST_HEAD(&rdata_list); cifs_sb = CIFS_SB(file->f_path.dentry->d_sb); open_file = file->private_data; Loading Loading @@ -2913,7 +2906,7 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, if (!list_empty(&rdata_list)) rc = 0; len = iov_iter_count(&to); len = iov_iter_count(to); /* the loop below should proceed in the order of increasing offsets */ list_for_each_entry_safe(rdata, tmp, &rdata_list, list) { again: Loading @@ -2930,7 +2923,7 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, goto again; } } else { rc = cifs_readdata_to_iov(rdata, &to); rc = cifs_readdata_to_iov(rdata, to); } } Loading @@ -2938,7 +2931,7 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, 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); Loading @@ -2947,15 +2940,14 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, rc = 0; if (total_read) { iocb->ki_pos = pos + total_read; iocb->ki_pos += total_read; return total_read; } return rc; } ssize_t cifs_strict_readv(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos) cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to) { struct inode *inode = file_inode(iocb->ki_filp); struct cifsInodeInfo *cinode = CIFS_I(inode); Loading @@ -2974,22 +2966,22 @@ cifs_strict_readv(struct kiocb *iocb, const struct iovec *iov, * pos+len-1. */ 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) && (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) && ((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 * with a brlock that prevents reading. */ 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, 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); return rc; } Loading