From nobody Mon Sep 17 00:00:00 2001 From: Mark Fasheh Date: Thu, 28 Sep 2006 16:41:03 -0700 Subject: [PATCH] Add generic_file_splice_write_nolock() Ocfs2 wants this so that it can order i_mutex with the appropriate cluster locks and still use the generic splice code. Signed-off-by: Mark Fasheh --- fs/splice.c | 33 ++++++++++++++++++++++++++++----- include/linux/fs.h | 2 ++ 2 files changed, 30 insertions(+), 5 deletions(-) 00525952b8461651c419e4b6ff85d06e9048728e diff --git a/fs/splice.c b/fs/splice.c index a1296c2..d6571b4 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -813,8 +813,8 @@ ssize_t splice_from_pipe(struct pipe_ino return ret; } -/** - * generic_file_splice_write - splice data from a pipe to a file + /** + * generic_file_splice_write_nolock - generic_file_splice_write without i_mutex * @pipe: pipe info * @out: file to write to * @len: number of bytes to splice @@ -825,15 +825,13 @@ ssize_t splice_from_pipe(struct pipe_ino * */ ssize_t -generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out, +generic_file_splice_write_nolock(struct pipe_inode_info *pipe, struct file *out, loff_t *ppos, size_t len, unsigned int flags) { struct address_space *mapping = out->f_mapping; struct inode *inode = mapping->host; ssize_t ret; - mutex_lock(&inode->i_mutex); - ret = splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_file); if (ret > 0) { *ppos += ret; @@ -852,6 +850,31 @@ generic_file_splice_write(struct pipe_in } } + return ret; +} + +EXPORT_SYMBOL(generic_file_splice_write_nolock); + +/** + * generic_file_splice_write - splice data from a pipe to a file + * @pipe: pipe info + * @out: file to write to + * @len: number of bytes to splice + * @flags: splice modifier flags + * + * Will either move or copy pages (determined by @flags options) from + * the given pipe inode to the given file. + * + */ +ssize_t +generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out, + loff_t *ppos, size_t len, unsigned int flags) +{ + struct inode *inode = out->f_mapping->host; + ssize_t ret; + + mutex_lock(&inode->i_mutex); + ret = generic_file_splice_write_nolock(pipe, out, ppos, len, flags); mutex_unlock(&inode->i_mutex); return ret; diff --git a/include/linux/fs.h b/include/linux/fs.h index 8f74dfb..774a1d4 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1665,6 +1665,8 @@ extern ssize_t generic_file_splice_read( struct pipe_inode_info *, size_t, unsigned int); extern ssize_t generic_file_splice_write(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); +extern ssize_t generic_file_splice_write_nolock(struct pipe_inode_info *, + struct file *, loff_t *, size_t, unsigned int); extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, struct file *out, loff_t *, size_t len, unsigned int flags); extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, -- 1.3.3