⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compat_splice.c

📁 ocfs1.4.1 oracle分布式文件系统
💻 C
字号:
/* * compat_splice.c * * This code has been copied from mainline linux kernel git commit * 40bee44eaef91b6030037c8bb47f909181fb1edc to allow ocfs2 to build * against older kernels. For license, refer to fs/splice.c in mainline * linux kernel. * */void pipe_wait(struct pipe_inode_info *pipe){	DEFINE_WAIT(wait);	/*	 * Pipes are system-local resources, so sleeping on them	 * is considered a noninteractive wait:	 */	prepare_to_wait(&pipe->wait, &wait, TASK_INTERRUPTIBLE);	if (pipe->inode)		mutex_unlock(&pipe->inode->i_mutex);	schedule();	finish_wait(&pipe->wait, &wait);	if (pipe->inode)		mutex_lock(&pipe->inode->i_mutex);}/** * __splice_from_pipe - splice data from a pipe to given actor * @pipe:	pipe to splice from * @sd:		information to @actor * @actor:	handler that splices the data * * Description: *    This function does little more than loop over the pipe and call *    @actor to do the actual moving of a single struct pipe_buffer to *    the desired destination. See pipe_to_file, pipe_to_sendpage, or *    pipe_to_user. * */ssize_t __splice_from_pipe(struct pipe_inode_info *pipe, struct splice_desc *sd,			   splice_actor *actor){	int ret, do_wakeup, err;	ret = 0;	do_wakeup = 0;	for (;;) {		if (pipe->nrbufs) {			struct pipe_buffer *buf = pipe->bufs + pipe->curbuf;			const struct pipe_buf_operations *ops = buf->ops;			sd->len = buf->len;			if (sd->len > sd->total_len)				sd->len = sd->total_len;			err = actor(pipe, buf, sd);			if (err <= 0) {				if (!ret && err != -ENODATA)					ret = err;				break;			}			ret += err;			buf->offset += err;			buf->len -= err;			sd->len -= err;			sd->pos += err;			sd->total_len -= err;			if (sd->len)				continue;			if (!buf->len) {				buf->ops = NULL;				ops->release(pipe, buf);				pipe->curbuf = (pipe->curbuf + 1) & (PIPE_BUFFERS - 1);				pipe->nrbufs--;				if (pipe->inode)					do_wakeup = 1;			}			if (!sd->total_len)				break;		}		if (pipe->nrbufs)			continue;		if (!pipe->writers)			break;		if (!pipe->waiting_writers) {			if (ret)				break;		}		if (sd->flags & SPLICE_F_NONBLOCK) {			if (!ret)				ret = -EAGAIN;			break;		}		if (signal_pending(current)) {			if (!ret)				ret = -ERESTARTSYS;			break;		}		if (do_wakeup) {			smp_mb();			if (waitqueue_active(&pipe->wait))				wake_up_interruptible_sync(&pipe->wait);			kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);			do_wakeup = 0;		}		pipe_wait(pipe);	}	if (do_wakeup) {		smp_mb();		if (waitqueue_active(&pipe->wait))			wake_up_interruptible(&pipe->wait);		kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);	}	return ret;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -