|
@@ -810,65 +810,6 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * generic_file_splice_write_nolock - generic_file_splice_write without mutexes
|
|
|
- * @pipe: pipe info
|
|
|
- * @out: file to write to
|
|
|
- * @ppos: position in @out
|
|
|
- * @len: number of bytes to splice
|
|
|
- * @flags: splice modifier flags
|
|
|
- *
|
|
|
- * Description:
|
|
|
- * Will either move or copy pages (determined by @flags options) from
|
|
|
- * the given pipe inode to the given file. The caller is responsible
|
|
|
- * for acquiring i_mutex on both inodes.
|
|
|
- *
|
|
|
- */
|
|
|
-ssize_t
|
|
|
-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;
|
|
|
- struct splice_desc sd = {
|
|
|
- .total_len = len,
|
|
|
- .flags = flags,
|
|
|
- .pos = *ppos,
|
|
|
- .u.file = out,
|
|
|
- };
|
|
|
- ssize_t ret;
|
|
|
- int err;
|
|
|
-
|
|
|
- err = file_remove_suid(out);
|
|
|
- if (unlikely(err))
|
|
|
- return err;
|
|
|
-
|
|
|
- ret = __splice_from_pipe(pipe, &sd, pipe_to_file);
|
|
|
- if (ret > 0) {
|
|
|
- unsigned long nr_pages;
|
|
|
-
|
|
|
- *ppos += ret;
|
|
|
- nr_pages = (ret + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
|
|
|
-
|
|
|
- /*
|
|
|
- * If file or inode is SYNC and we actually wrote some data,
|
|
|
- * sync it.
|
|
|
- */
|
|
|
- if (unlikely((out->f_flags & O_SYNC) || IS_SYNC(inode))) {
|
|
|
- err = generic_osync_inode(inode, mapping,
|
|
|
- OSYNC_METADATA|OSYNC_DATA);
|
|
|
-
|
|
|
- if (err)
|
|
|
- ret = err;
|
|
|
- }
|
|
|
- balance_dirty_pages_ratelimited_nr(mapping, nr_pages);
|
|
|
- }
|
|
|
-
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-EXPORT_SYMBOL(generic_file_splice_write_nolock);
|
|
|
-
|
|
|
/**
|
|
|
* generic_file_splice_write - splice data from a pipe to a file
|
|
|
* @pipe: pipe info
|