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

Commit 82c156f8 authored by Al Viro's avatar Al Viro
Browse files

switch generic_file_splice_read() to use of ->read_iter()



... and kill the ->splice_read() instances that can be switched to it

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 241699cd
Loading
Loading
Loading
Loading
+15 −55
Original line number Diff line number Diff line
@@ -1153,35 +1153,20 @@ ll_file_io_generic(const struct lu_env *env, struct vvp_io_args *args,
		int write_mutex_locked = 0;

		vio->vui_fd  = LUSTRE_FPRIVATE(file);
		vio->vui_io_subtype = args->via_io_subtype;

		switch (vio->vui_io_subtype) {
		case IO_NORMAL:
		vio->vui_iter = args->u.normal.via_iter;
		vio->vui_iocb = args->u.normal.via_iocb;
		if ((iot == CIT_WRITE) &&
		    !(vio->vui_fd->fd_flags & LL_FILE_GROUP_LOCKED)) {
				if (mutex_lock_interruptible(&lli->
							       lli_write_mutex)) {
			if (mutex_lock_interruptible(&lli->lli_write_mutex)) {
				result = -ERESTARTSYS;
				goto out;
			}
			write_mutex_locked = 1;
		}
		down_read(&lli->lli_trunc_sem);
			break;
		case IO_SPLICE:
			vio->u.splice.vui_pipe = args->u.splice.via_pipe;
			vio->u.splice.vui_flags = args->u.splice.via_flags;
			break;
		default:
			CERROR("Unknown IO type - %u\n", vio->vui_io_subtype);
			LBUG();
		}
		ll_cl_add(file, env, io);
		result = cl_io_loop(env, io);
		ll_cl_remove(file, env);
		if (args->via_io_subtype == IO_NORMAL)
		up_read(&lli->lli_trunc_sem);
		if (write_mutex_locked)
			mutex_unlock(&lli->lli_write_mutex);
@@ -1237,7 +1222,7 @@ static ssize_t ll_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
	if (IS_ERR(env))
		return PTR_ERR(env);

	args = ll_env_args(env, IO_NORMAL);
	args = ll_env_args(env);
	args->u.normal.via_iter = to;
	args->u.normal.via_iocb = iocb;

@@ -1261,7 +1246,7 @@ static ssize_t ll_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
	if (IS_ERR(env))
		return PTR_ERR(env);

	args = ll_env_args(env, IO_NORMAL);
	args = ll_env_args(env);
	args->u.normal.via_iter = from;
	args->u.normal.via_iocb = iocb;

@@ -1271,31 +1256,6 @@ static ssize_t ll_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
	return result;
}

/*
 * Send file content (through pagecache) somewhere with helper
 */
static ssize_t ll_file_splice_read(struct file *in_file, loff_t *ppos,
				   struct pipe_inode_info *pipe, size_t count,
				   unsigned int flags)
{
	struct lu_env      *env;
	struct vvp_io_args *args;
	ssize_t	     result;
	int		 refcheck;

	env = cl_env_get(&refcheck);
	if (IS_ERR(env))
		return PTR_ERR(env);

	args = ll_env_args(env, IO_SPLICE);
	args->u.splice.via_pipe = pipe;
	args->u.splice.via_flags = flags;

	result = ll_file_io_generic(env, args, in_file, CIT_READ, ppos, count);
	cl_env_put(env, &refcheck);
	return result;
}

static int ll_lov_recreate(struct inode *inode, struct ost_id *oi, u32 ost_idx)
{
	struct obd_export *exp = ll_i2dtexp(inode);
@@ -3173,7 +3133,7 @@ struct file_operations ll_file_operations = {
	.release	= ll_file_release,
	.mmap	   = ll_file_mmap,
	.llseek	 = ll_file_seek,
	.splice_read    = ll_file_splice_read,
	.splice_read    = generic_file_splice_read,
	.fsync	  = ll_fsync,
	.flush	  = ll_flush
};
@@ -3186,7 +3146,7 @@ struct file_operations ll_file_operations_flock = {
	.release	= ll_file_release,
	.mmap	   = ll_file_mmap,
	.llseek	 = ll_file_seek,
	.splice_read    = ll_file_splice_read,
	.splice_read    = generic_file_splice_read,
	.fsync	  = ll_fsync,
	.flush	  = ll_flush,
	.flock	  = ll_file_flock,
@@ -3202,7 +3162,7 @@ struct file_operations ll_file_operations_noflock = {
	.release	= ll_file_release,
	.mmap	   = ll_file_mmap,
	.llseek	 = ll_file_seek,
	.splice_read    = ll_file_splice_read,
	.splice_read    = generic_file_splice_read,
	.fsync	  = ll_fsync,
	.flush	  = ll_flush,
	.flock	  = ll_file_noflock,
+2 −13
Original line number Diff line number Diff line
@@ -800,17 +800,11 @@ void vvp_write_complete(struct vvp_object *club, struct vvp_page *page);
 */
struct vvp_io_args {
	/** normal/splice */
	enum vvp_io_subtype via_io_subtype;

	union {
		struct {
			struct kiocb      *via_iocb;
			struct iov_iter   *via_iter;
		} normal;
		struct {
			struct pipe_inode_info  *via_pipe;
			unsigned int       via_flags;
		} splice;
	} u;
};

@@ -838,14 +832,9 @@ static inline struct ll_thread_info *ll_env_info(const struct lu_env *env)
	return lti;
}

static inline struct vvp_io_args *ll_env_args(const struct lu_env *env,
					      enum vvp_io_subtype type)
static inline struct vvp_io_args *ll_env_args(const struct lu_env *env)
{
	struct vvp_io_args *via = &ll_env_info(env)->lti_args;

	via->via_io_subtype = type;

	return via;
	return &ll_env_info(env)->lti_args;
}

void ll_queue_done_writing(struct inode *inode, unsigned long flags);
+0 −14
Original line number Diff line number Diff line
@@ -49,14 +49,6 @@ struct obd_device;
struct obd_export;
struct page;

/* specific architecture can implement only part of this list */
enum vvp_io_subtype {
	/** normal IO */
	IO_NORMAL,
	/** io started from splice_{read|write} */
	IO_SPLICE
};

/**
 * IO state private to IO state private to VVP layer.
 */
@@ -98,10 +90,6 @@ struct vvp_io {
			 */
			bool		ft_flags_valid;
		} fault;
		struct {
			struct pipe_inode_info	*vui_pipe;
			unsigned int		 vui_flags;
		} splice;
		struct {
			struct cl_page_list vui_queue;
			unsigned long vui_written;
@@ -110,8 +98,6 @@ struct vvp_io {
		} write;
	} u;

	enum vvp_io_subtype	vui_io_subtype;

	/**
	 * Layout version when this IO is initialized
	 */
+4 −41
Original line number Diff line number Diff line
@@ -54,18 +54,6 @@ static struct vvp_io *cl2vvp_io(const struct lu_env *env,
	return vio;
}

/**
 * True, if \a io is a normal io, False for splice_{read,write}
 */
static int cl_is_normalio(const struct lu_env *env, const struct cl_io *io)
{
	struct vvp_io *vio = vvp_env_io(env);

	LASSERT(io->ci_type == CIT_READ || io->ci_type == CIT_WRITE);

	return vio->vui_io_subtype == IO_NORMAL;
}

/**
 * For swapping layout. The file's layout may have changed.
 * To avoid populating pages to a wrong stripe, we have to verify the
@@ -391,9 +379,6 @@ static int vvp_mmap_locks(const struct lu_env *env,

	LASSERT(io->ci_type == CIT_READ || io->ci_type == CIT_WRITE);

	if (!cl_is_normalio(env, io))
		return 0;

	if (!vio->vui_iter) /* nfs or loop back device write */
		return 0;

@@ -462,15 +447,10 @@ static void vvp_io_advance(const struct lu_env *env,
			   const struct cl_io_slice *ios,
			   size_t nob)
{
	struct vvp_io    *vio = cl2vvp_io(env, ios);
	struct cl_io     *io  = ios->cis_io;
	struct cl_object *obj = ios->cis_io->ci_obj;

	struct vvp_io	 *vio = cl2vvp_io(env, ios);
	CLOBINVRNT(env, obj, vvp_object_invariant(obj));

	if (!cl_is_normalio(env, io))
		return;

	iov_iter_reexpand(vio->vui_iter, vio->vui_tot_count  -= nob);
}

@@ -479,7 +459,7 @@ static void vvp_io_update_iov(const struct lu_env *env,
{
	size_t size = io->u.ci_rw.crw_count;

	if (!cl_is_normalio(env, io) || !vio->vui_iter)
	if (!vio->vui_iter)
		return;

	iov_iter_truncate(vio->vui_iter, size);
@@ -716,25 +696,8 @@ static int vvp_io_read_start(const struct lu_env *env,

	/* BUG: 5972 */
	file_accessed(file);
	switch (vio->vui_io_subtype) {
	case IO_NORMAL:
	LASSERT(vio->vui_iocb->ki_pos == pos);
	result = generic_file_read_iter(vio->vui_iocb, vio->vui_iter);
		break;
	case IO_SPLICE:
		result = generic_file_splice_read(file, &pos,
						  vio->u.splice.vui_pipe, cnt,
						  vio->u.splice.vui_flags);
		/* LU-1109: do splice read stripe by stripe otherwise if it
		 * may make nfsd stuck if this read occupied all internal pipe
		 * buffers.
		 */
		io->ci_continue = 0;
		break;
	default:
		CERROR("Wrong IO type %u\n", vio->vui_io_subtype);
		LBUG();
	}

out:
	if (result >= 0) {
+1 −22
Original line number Diff line number Diff line
@@ -37,27 +37,6 @@ coda_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
	return vfs_iter_read(cfi->cfi_container, to, &iocb->ki_pos);
}

static ssize_t
coda_file_splice_read(struct file *coda_file, loff_t *ppos,
		      struct pipe_inode_info *pipe, size_t count,
		      unsigned int flags)
{
	ssize_t (*splice_read)(struct file *, loff_t *,
			       struct pipe_inode_info *, size_t, unsigned int);
	struct coda_file_info *cfi;
	struct file *host_file;

	cfi = CODA_FTOC(coda_file);
	BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
	host_file = cfi->cfi_container;

	splice_read = host_file->f_op->splice_read;
	if (!splice_read)
		splice_read = default_file_splice_read;

	return splice_read(host_file, ppos, pipe, count, flags);
}

static ssize_t
coda_file_write_iter(struct kiocb *iocb, struct iov_iter *to)
{
@@ -225,6 +204,6 @@ const struct file_operations coda_file_operations = {
	.open		= coda_open,
	.release	= coda_release,
	.fsync		= coda_fsync,
	.splice_read	= coda_file_splice_read,
	.splice_read	= generic_file_splice_read,
};
Loading