Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e6a7bcb4 authored by Al Viro's avatar Al Viro
Browse files

cifs: switch to ->read_iter()



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 37c20f16
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -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,
@@ -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,
@@ -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,
@@ -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,
+2 −4
Original line number Diff line number Diff line
@@ -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,
+12 −20
Original line number Diff line number Diff line
@@ -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;
@@ -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:
@@ -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);
			}

		}
@@ -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);

@@ -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);
@@ -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;
}