diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2007-06-21 07:10:21 -0400 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2007-07-10 02:04:15 -0400 |
commit | 932cc6d4f7c35bbf70bce8cc865b6033ff49c9c0 (patch) | |
tree | 0f4f22ec4fc55f31460dc68a293efc18077a8c12 | |
parent | d6f517568f9f5c26e7404a336c7289d5b4b293ec (diff) |
splice: completely document external interface with kerneldoc
Also add fs/splice.c as a kerneldoc target with a smaller blurb that
should be expanded to better explain the overview of splice.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
-rw-r--r-- | Documentation/DocBook/kernel-api.tmpl | 11 | ||||
-rw-r--r-- | fs/splice.c | 109 |
2 files changed, 96 insertions, 24 deletions
diff --git a/Documentation/DocBook/kernel-api.tmpl b/Documentation/DocBook/kernel-api.tmpl index 38f88b6ae405..8c5698a8c2e1 100644 --- a/Documentation/DocBook/kernel-api.tmpl +++ b/Documentation/DocBook/kernel-api.tmpl | |||
@@ -643,4 +643,15 @@ X!Idrivers/video/console/fonts.c | |||
643 | !Edrivers/spi/spi.c | 643 | !Edrivers/spi/spi.c |
644 | </chapter> | 644 | </chapter> |
645 | 645 | ||
646 | <chapter id="splice"> | ||
647 | <title>splice API</title> | ||
648 | <para>) | ||
649 | splice is a method for moving blocks of data around inside the | ||
650 | kernel, without continually transferring it between the kernel | ||
651 | and user space. | ||
652 | </para> | ||
653 | !Iinclude/linux/splice.h | ||
654 | !Ffs/splice.c | ||
655 | </chapter> | ||
656 | |||
646 | </book> | 657 | </book> |
diff --git a/fs/splice.c b/fs/splice.c index 00850e56280d..d257d666358b 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -153,9 +153,16 @@ static const struct pipe_buf_operations user_page_pipe_buf_ops = { | |||
153 | .get = generic_pipe_buf_get, | 153 | .get = generic_pipe_buf_get, |
154 | }; | 154 | }; |
155 | 155 | ||
156 | /* | 156 | /** |
157 | * Pipe output worker. This fills a pipe with the information contained | 157 | * splice_to_pipe - fill passed data into a pipe |
158 | * from splice_pipe_desc(). | 158 | * @pipe: pipe to fill |
159 | * @spd: data to fill | ||
160 | * | ||
161 | * Description: | ||
162 | * @spd contains a map of pages and len/offset tupples, a long with | ||
163 | * the struct pipe_buf_operations associated with these pages. This | ||
164 | * function will link that data to the pipe. | ||
165 | * | ||
159 | */ | 166 | */ |
160 | ssize_t splice_to_pipe(struct pipe_inode_info *pipe, | 167 | ssize_t splice_to_pipe(struct pipe_inode_info *pipe, |
161 | struct splice_pipe_desc *spd) | 168 | struct splice_pipe_desc *spd) |
@@ -281,19 +288,15 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, | |||
281 | page_cache_readahead(mapping, &in->f_ra, in, index, nr_pages); | 288 | page_cache_readahead(mapping, &in->f_ra, in, index, nr_pages); |
282 | 289 | ||
283 | /* | 290 | /* |
284 | * Now fill in the holes: | ||
285 | */ | ||
286 | error = 0; | ||
287 | |||
288 | /* | ||
289 | * Lookup the (hopefully) full range of pages we need. | 291 | * Lookup the (hopefully) full range of pages we need. |
290 | */ | 292 | */ |
291 | spd.nr_pages = find_get_pages_contig(mapping, index, nr_pages, pages); | 293 | spd.nr_pages = find_get_pages_contig(mapping, index, nr_pages, pages); |
292 | 294 | ||
293 | /* | 295 | /* |
294 | * If find_get_pages_contig() returned fewer pages than we needed, | 296 | * If find_get_pages_contig() returned fewer pages than we needed, |
295 | * allocate the rest. | 297 | * allocate the rest and fill in the holes. |
296 | */ | 298 | */ |
299 | error = 0; | ||
297 | index += spd.nr_pages; | 300 | index += spd.nr_pages; |
298 | while (spd.nr_pages < nr_pages) { | 301 | while (spd.nr_pages < nr_pages) { |
299 | /* | 302 | /* |
@@ -455,11 +458,16 @@ fill_it: | |||
455 | /** | 458 | /** |
456 | * generic_file_splice_read - splice data from file to a pipe | 459 | * generic_file_splice_read - splice data from file to a pipe |
457 | * @in: file to splice from | 460 | * @in: file to splice from |
461 | * @ppos: position in @in | ||
458 | * @pipe: pipe to splice to | 462 | * @pipe: pipe to splice to |
459 | * @len: number of bytes to splice | 463 | * @len: number of bytes to splice |
460 | * @flags: splice modifier flags | 464 | * @flags: splice modifier flags |
461 | * | 465 | * |
462 | * Will read pages from given file and fill them into a pipe. | 466 | * Description: |
467 | * Will read pages from given file and fill them into a pipe. Can be | ||
468 | * used as long as the address_space operations for the source implements | ||
469 | * a readpage() hook. | ||
470 | * | ||
463 | */ | 471 | */ |
464 | ssize_t generic_file_splice_read(struct file *in, loff_t *ppos, | 472 | ssize_t generic_file_splice_read(struct file *in, loff_t *ppos, |
465 | struct pipe_inode_info *pipe, size_t len, | 473 | struct pipe_inode_info *pipe, size_t len, |
@@ -648,10 +656,18 @@ out_ret: | |||
648 | return ret; | 656 | return ret; |
649 | } | 657 | } |
650 | 658 | ||
651 | /* | 659 | /** |
652 | * Pipe input worker. Most of this logic works like a regular pipe, the | 660 | * __splice_from_pipe - splice data from a pipe to given actor |
653 | * key here is the 'actor' worker passed in that actually moves the data | 661 | * @pipe: pipe to splice from |
654 | * to the wanted destination. See pipe_to_file/pipe_to_sendpage above. | 662 | * @sd: information to @actor |
663 | * @actor: handler that splices the data | ||
664 | * | ||
665 | * Description: | ||
666 | * This function does little more than loop over the pipe and call | ||
667 | * @actor to do the actual moving of a single struct pipe_buffer to | ||
668 | * the desired destination. See pipe_to_file, pipe_to_sendpage, or | ||
669 | * pipe_to_user. | ||
670 | * | ||
655 | */ | 671 | */ |
656 | ssize_t __splice_from_pipe(struct pipe_inode_info *pipe, struct splice_desc *sd, | 672 | ssize_t __splice_from_pipe(struct pipe_inode_info *pipe, struct splice_desc *sd, |
657 | splice_actor *actor) | 673 | splice_actor *actor) |
@@ -744,6 +760,20 @@ ssize_t __splice_from_pipe(struct pipe_inode_info *pipe, struct splice_desc *sd, | |||
744 | } | 760 | } |
745 | EXPORT_SYMBOL(__splice_from_pipe); | 761 | EXPORT_SYMBOL(__splice_from_pipe); |
746 | 762 | ||
763 | /** | ||
764 | * splice_from_pipe - splice data from a pipe to a file | ||
765 | * @pipe: pipe to splice from | ||
766 | * @out: file to splice to | ||
767 | * @ppos: position in @out | ||
768 | * @len: how many bytes to splice | ||
769 | * @flags: splice modifier flags | ||
770 | * @actor: handler that splices the data | ||
771 | * | ||
772 | * Description: | ||
773 | * See __splice_from_pipe. This function locks the input and output inodes, | ||
774 | * otherwise it's identical to __splice_from_pipe(). | ||
775 | * | ||
776 | */ | ||
747 | ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, | 777 | ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, |
748 | loff_t *ppos, size_t len, unsigned int flags, | 778 | loff_t *ppos, size_t len, unsigned int flags, |
749 | splice_actor *actor) | 779 | splice_actor *actor) |
@@ -774,12 +804,14 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, | |||
774 | * generic_file_splice_write_nolock - generic_file_splice_write without mutexes | 804 | * generic_file_splice_write_nolock - generic_file_splice_write without mutexes |
775 | * @pipe: pipe info | 805 | * @pipe: pipe info |
776 | * @out: file to write to | 806 | * @out: file to write to |
807 | * @ppos: position in @out | ||
777 | * @len: number of bytes to splice | 808 | * @len: number of bytes to splice |
778 | * @flags: splice modifier flags | 809 | * @flags: splice modifier flags |
779 | * | 810 | * |
780 | * Will either move or copy pages (determined by @flags options) from | 811 | * Description: |
781 | * the given pipe inode to the given file. The caller is responsible | 812 | * Will either move or copy pages (determined by @flags options) from |
782 | * for acquiring i_mutex on both inodes. | 813 | * the given pipe inode to the given file. The caller is responsible |
814 | * for acquiring i_mutex on both inodes. | ||
783 | * | 815 | * |
784 | */ | 816 | */ |
785 | ssize_t | 817 | ssize_t |
@@ -831,11 +863,13 @@ EXPORT_SYMBOL(generic_file_splice_write_nolock); | |||
831 | * generic_file_splice_write - splice data from a pipe to a file | 863 | * generic_file_splice_write - splice data from a pipe to a file |
832 | * @pipe: pipe info | 864 | * @pipe: pipe info |
833 | * @out: file to write to | 865 | * @out: file to write to |
866 | * @ppos: position in @out | ||
834 | * @len: number of bytes to splice | 867 | * @len: number of bytes to splice |
835 | * @flags: splice modifier flags | 868 | * @flags: splice modifier flags |
836 | * | 869 | * |
837 | * Will either move or copy pages (determined by @flags options) from | 870 | * Description: |
838 | * the given pipe inode to the given file. | 871 | * Will either move or copy pages (determined by @flags options) from |
872 | * the given pipe inode to the given file. | ||
839 | * | 873 | * |
840 | */ | 874 | */ |
841 | ssize_t | 875 | ssize_t |
@@ -886,13 +920,15 @@ EXPORT_SYMBOL(generic_file_splice_write); | |||
886 | 920 | ||
887 | /** | 921 | /** |
888 | * generic_splice_sendpage - splice data from a pipe to a socket | 922 | * generic_splice_sendpage - splice data from a pipe to a socket |
889 | * @inode: pipe inode | 923 | * @pipe: pipe to splice from |
890 | * @out: socket to write to | 924 | * @out: socket to write to |
925 | * @ppos: position in @out | ||
891 | * @len: number of bytes to splice | 926 | * @len: number of bytes to splice |
892 | * @flags: splice modifier flags | 927 | * @flags: splice modifier flags |
893 | * | 928 | * |
894 | * Will send @len bytes from the pipe to a network socket. No data copying | 929 | * Description: |
895 | * is involved. | 930 | * Will send @len bytes from the pipe to a network socket. No data copying |
931 | * is involved. | ||
896 | * | 932 | * |
897 | */ | 933 | */ |
898 | ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, struct file *out, | 934 | ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, struct file *out, |
@@ -946,8 +982,18 @@ static long do_splice_to(struct file *in, loff_t *ppos, | |||
946 | return in->f_op->splice_read(in, ppos, pipe, len, flags); | 982 | return in->f_op->splice_read(in, ppos, pipe, len, flags); |
947 | } | 983 | } |
948 | 984 | ||
949 | /* | 985 | /** |
950 | * Splices from an input file to an actor, using a 'direct' pipe. | 986 | * splice_direct_to_actor - splices data directly between two non-pipes |
987 | * @in: file to splice from | ||
988 | * @sd: actor information on where to splice to | ||
989 | * @actor: handles the data splicing | ||
990 | * | ||
991 | * Description: | ||
992 | * This is a special case helper to splice directly between two | ||
993 | * points, without requiring an explicit pipe. Internally an allocated | ||
994 | * pipe is cached in the process, and reused during the life time of | ||
995 | * that process. | ||
996 | * | ||
951 | */ | 997 | */ |
952 | ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, | 998 | ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, |
953 | splice_direct_actor *actor) | 999 | splice_direct_actor *actor) |
@@ -1077,6 +1123,21 @@ static int direct_splice_actor(struct pipe_inode_info *pipe, | |||
1077 | return do_splice_from(pipe, file, &sd->pos, sd->total_len, sd->flags); | 1123 | return do_splice_from(pipe, file, &sd->pos, sd->total_len, sd->flags); |
1078 | } | 1124 | } |
1079 | 1125 | ||
1126 | /** | ||
1127 | * do_splice_direct - splices data directly between two files | ||
1128 | * @in: file to splice from | ||
1129 | * @ppos: input file offset | ||
1130 | * @out: file to splice to | ||
1131 | * @len: number of bytes to splice | ||
1132 | * @flags: splice modifier flags | ||
1133 | * | ||
1134 | * Description: | ||
1135 | * For use by do_sendfile(). splice can easily emulate sendfile, but | ||
1136 | * doing it in the application would incur an extra system call | ||
1137 | * (splice in + splice out, as compared to just sendfile()). So this helper | ||
1138 | * can splice directly through a process-private pipe. | ||
1139 | * | ||
1140 | */ | ||
1080 | long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, | 1141 | long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, |
1081 | size_t len, unsigned int flags) | 1142 | size_t len, unsigned int flags) |
1082 | { | 1143 | { |