<!DOCTYPE html>
<html lang="en" data-content_root="../">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>splice and pipes — The Linux Kernel documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=3918102e" />
<script src="../_static/documentation_options.js?v=5929fcd5"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Locking" href="locking.html" />
<link rel="prev" title="Linux Filesystems API summary" href="api-summary.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
</head><body>
<div class="document">
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../index.html">
<img class="logo" src="../_static/logo.svg" alt="Logo of The Linux Kernel"/>
</a></p>
<h1 class="logo"><a href="../index.html">The Linux Kernel</a></h1>
<p class="blurb">6.18.50</p>
<search id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script>
<p>
<h3 class="kernel-toc-contents">Contents</h3>
<input type="checkbox" class="kernel-toc-toggle" id = "kernel-toc-toggle" checked>
<label class="kernel-toc-title" for="kernel-toc-toggle"></label>
<div class="kerneltoc" id="kerneltoc">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../process/development-process.html">Development process</a></li>
<li class="toctree-l1"><a class="reference internal" href="../process/submitting-patches.html">Submitting patches</a></li>
<li class="toctree-l1"><a class="reference internal" href="../process/code-of-conduct.html">Code of conduct</a></li>
<li class="toctree-l1"><a class="reference internal" href="../maintainer/index.html">Maintainer handbook</a></li>
<li class="toctree-l1"><a class="reference internal" href="../process/index.html">All development-process docs</a></li>
</ul>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../core-api/index.html">Core API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../driver-api/index.html">Driver APIs</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../subsystem-apis.html">Subsystems</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../subsystem-apis.html#core-subsystems">Core subsystems</a></li>
<li class="toctree-l2"><a class="reference internal" href="../subsystem-apis.html#human-interfaces">Human interfaces</a></li>
<li class="toctree-l2"><a class="reference internal" href="../subsystem-apis.html#networking-interfaces">Networking interfaces</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="../subsystem-apis.html#storage-interfaces">Storage interfaces</a><ul class="current">
<li class="toctree-l3 current"><a class="reference internal" href="index.html">Filesystems in the Linux kernel</a></li>
<li class="toctree-l3"><a class="reference internal" href="../block/index.html">Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../cdrom/index.html">CD-ROM</a></li>
<li class="toctree-l3"><a class="reference internal" href="../scsi/index.html">SCSI Subsystem</a></li>
<li class="toctree-l3"><a class="reference internal" href="../target/index.html">TCM Virtual Device</a></li>
<li class="toctree-l3"><a class="reference internal" href="../nvme/index.html">NVMe Subsystem</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../subsystem-apis.html#other-subsystems">Other subsystems</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../locking/index.html">Locking</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../process/license-rules.html">Licensing rules</a></li>
<li class="toctree-l1"><a class="reference internal" href="../doc-guide/index.html">Writing documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../dev-tools/index.html">Development tools</a></li>
<li class="toctree-l1"><a class="reference internal" href="../dev-tools/testing-overview.html">Testing guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../kernel-hacking/index.html">Hacking guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../trace/index.html">Tracing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../fault-injection/index.html">Fault injection</a></li>
<li class="toctree-l1"><a class="reference internal" href="../livepatch/index.html">Livepatching</a></li>
<li class="toctree-l1"><a class="reference internal" href="../rust/index.html">Rust</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../admin-guide/index.html">Administration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../kbuild/index.html">Build system</a></li>
<li class="toctree-l1"><a class="reference internal" href="../admin-guide/reporting-issues.html">Reporting issues</a></li>
<li class="toctree-l1"><a class="reference internal" href="../tools/index.html">Userspace tools</a></li>
<li class="toctree-l1"><a class="reference internal" href="../userspace-api/index.html">Userspace API</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../firmware-guide/index.html">Firmware</a></li>
<li class="toctree-l1"><a class="reference internal" href="../devicetree/index.html">Firmware and Devicetree</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../arch/index.html">CPU architectures</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../staging/index.html">Unsorted documentation</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../translations/index.html">Translations</a></li>
</ul>
</div>
<script type="text/javascript"> <!--
var sbar = document.getElementsByClassName("sphinxsidebar")[0];
let currents = document.getElementsByClassName("current")
if (currents.length) {
sbar.scrollTop = currents[currents.length - 1].offsetTop;
}
--> </script>
<div role="note" aria-label="source link">
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="../_sources/filesystems/splice.rst.txt"
rel="nofollow">Show Source</a></li>
</ul>
</div>
</div>
</div>
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="splice-and-pipes">
<h1>splice and pipes<a class="headerlink" href="#splice-and-pipes" title="Link to this heading">¶</a></h1>
<section id="splice-api">
<h2>splice API<a class="headerlink" href="#splice-api" title="Link to this heading">¶</a></h2>
<p>splice is a method for moving blocks of data around inside the kernel,
without continually transferring them between the kernel and user space.</p>
<dl class="c function">
<dt class="sig sig-object c" id="c.splice_to_pipe">
<span class="n"><span class="pre">ssize_t</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">splice_to_pipe</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">splice_pipe_desc</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">spd</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.splice_to_pipe" title="Link to this definition">¶</a><br /></dt>
<dd><p>fill passed data into a pipe</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>pipe to fill</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">splice_pipe_desc</span> <span class="pre">*spd</span></code></dt><dd><p>data to fill</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<blockquote>
<div><p><strong>spd</strong> contains a map of pages and len/offset tuples, along with
the <code class="xref c c-struct broken_xref docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_buf_operations</span></code> associated with these pages. This
function will link that data to the pipe.</p>
</div></blockquote>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.copy_splice_read">
<span class="n"><span class="pre">ssize_t</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">copy_splice_read</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="api-summary.html#c.file" title="file"><span class="n"><span class="pre">file</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">in</span></span>, <span class="n"><span class="pre">loff_t</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">ppos</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="n"><span class="pre">size_t</span></span><span class="w"> </span><span class="n"><span class="pre">len</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">flags</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.copy_splice_read" title="Link to this definition">¶</a><br /></dt>
<dd><p>Copy data from a file and splice the copy into a pipe</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">file</span> <span class="pre">*in</span></code></dt><dd><p>The file to read from</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">loff_t</span> <span class="pre">*ppos</span></code></dt><dd><p>Pointer to the file position to read from</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>The pipe to splice into</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">size_t</span> <span class="pre">len</span></code></dt><dd><p>The amount to splice</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">unsigned</span> <span class="pre">int</span> <span class="pre">flags</span></code></dt><dd><p>The SPLICE_F_* flags</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<p>This function allocates a bunch of pages sufficient to hold the requested
amount of data (but limited by the remaining pipe capacity), passes it to
the file’s -><code class="xref c c-func broken_xref docutils literal notranslate"><span class="pre">read_iter()</span></code> to read into and then splices the used pages into
the pipe.</p>
<p><strong>Return</strong></p>
<p>On success, the number of bytes read will be returned and <strong>*ppos</strong>
will be updated if appropriate; 0 will be returned if there is no more data
to be read; -EAGAIN will be returned if the pipe had no space, and some
other negative error code will be returned on error. A short read may occur
if the pipe has insufficient space, we reach the end of the data or we hit a
hole.</p>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.splice_from_pipe_feed">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">splice_from_pipe_feed</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">splice_desc</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">sd</span></span>, <span class="n"><span class="pre">splice_actor</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">actor</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.splice_from_pipe_feed" title="Link to this definition">¶</a><br /></dt>
<dd><p>feed available data from a pipe to a file</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>pipe to splice from</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">splice_desc</span> <span class="pre">*sd</span></code></dt><dd><p>information to <strong>actor</strong></p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">splice_actor</span> <span class="pre">*actor</span></code></dt><dd><p>handler that splices the data</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<blockquote>
<div><p>This function loops over the pipe and calls <strong>actor</strong> to do the
actual moving of a single <a class="reference internal" href="#c.pipe_buffer" title="pipe_buffer"><code class="xref c c-struct docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_buffer</span></code></a> to the desired
destination. It returns when there’s no more buffers left in
the pipe or if the requested number of bytes (<strong>sd->total_len</strong>)
have been copied. It returns a positive number (one) if the
pipe needs to be filled with more data, zero if the required
number of bytes have been copied and -errno on error.</p>
<p>This, together with splice_from_pipe_{begin,end,next}, may be
used to implement the functionality of <a class="reference internal" href="#c.__splice_from_pipe" title="__splice_from_pipe"><code class="xref c c-func docutils literal notranslate"><span class="pre">__splice_from_pipe()</span></code></a> when
locking is required around copying the pipe buffers to the
destination.</p>
</div></blockquote>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.splice_from_pipe_next">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">splice_from_pipe_next</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">splice_desc</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">sd</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.splice_from_pipe_next" title="Link to this definition">¶</a><br /></dt>
<dd><p>wait for some data to splice from</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>pipe to splice from</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">splice_desc</span> <span class="pre">*sd</span></code></dt><dd><p>information about the splice operation</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<blockquote>
<div><p>This function will wait for some data and return a positive
value (one) if pipe buffers are available. It will return zero
or -errno if no more data needs to be spliced.</p>
</div></blockquote>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.splice_from_pipe_begin">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">splice_from_pipe_begin</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">splice_desc</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">sd</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.splice_from_pipe_begin" title="Link to this definition">¶</a><br /></dt>
<dd><p>start splicing from pipe</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">splice_desc</span> <span class="pre">*sd</span></code></dt><dd><p>information about the splice operation</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<blockquote>
<div><p>This function should be called before a loop containing
<a class="reference internal" href="#c.splice_from_pipe_next" title="splice_from_pipe_next"><code class="xref c c-func docutils literal notranslate"><span class="pre">splice_from_pipe_next()</span></code></a> and <a class="reference internal" href="#c.splice_from_pipe_feed" title="splice_from_pipe_feed"><code class="xref c c-func docutils literal notranslate"><span class="pre">splice_from_pipe_feed()</span></code></a> to
initialize the necessary fields of <strong>sd</strong>.</p>
</div></blockquote>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.splice_from_pipe_end">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">splice_from_pipe_end</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">splice_desc</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">sd</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.splice_from_pipe_end" title="Link to this definition">¶</a><br /></dt>
<dd><p>finish splicing from pipe</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>pipe to splice from</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">splice_desc</span> <span class="pre">*sd</span></code></dt><dd><p>information about the splice operation</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<blockquote>
<div><p>This function will wake up pipe writers if necessary. It should
be called after a loop containing <a class="reference internal" href="#c.splice_from_pipe_next" title="splice_from_pipe_next"><code class="xref c c-func docutils literal notranslate"><span class="pre">splice_from_pipe_next()</span></code></a> and
<a class="reference internal" href="#c.splice_from_pipe_feed" title="splice_from_pipe_feed"><code class="xref c c-func docutils literal notranslate"><span class="pre">splice_from_pipe_feed()</span></code></a>.</p>
</div></blockquote>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.__splice_from_pipe">
<span class="n"><span class="pre">ssize_t</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">__splice_from_pipe</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">splice_desc</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">sd</span></span>, <span class="n"><span class="pre">splice_actor</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">actor</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.__splice_from_pipe" title="Link to this definition">¶</a><br /></dt>
<dd><p>splice data from a pipe to given actor</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>pipe to splice from</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">splice_desc</span> <span class="pre">*sd</span></code></dt><dd><p>information to <strong>actor</strong></p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">splice_actor</span> <span class="pre">*actor</span></code></dt><dd><p>handler that splices the data</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<blockquote>
<div><p>This function does little more than loop over the pipe and call
<strong>actor</strong> to do the actual moving of a single <a class="reference internal" href="#c.pipe_buffer" title="pipe_buffer"><code class="xref c c-struct docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_buffer</span></code></a> to
the desired destination. See pipe_to_file, pipe_to_sendmsg, or
pipe_to_user.</p>
</div></blockquote>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.splice_from_pipe">
<span class="n"><span class="pre">ssize_t</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">splice_from_pipe</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="api-summary.html#c.file" title="file"><span class="n"><span class="pre">file</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">out</span></span>, <span class="n"><span class="pre">loff_t</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">ppos</span></span>, <span class="n"><span class="pre">size_t</span></span><span class="w"> </span><span class="n"><span class="pre">len</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">flags</span></span>, <span class="n"><span class="pre">splice_actor</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">actor</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.splice_from_pipe" title="Link to this definition">¶</a><br /></dt>
<dd><p>splice data from a pipe to a file</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>pipe to splice from</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">file</span> <span class="pre">*out</span></code></dt><dd><p>file to splice to</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">loff_t</span> <span class="pre">*ppos</span></code></dt><dd><p>position in <strong>out</strong></p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">size_t</span> <span class="pre">len</span></code></dt><dd><p>how many bytes to splice</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">unsigned</span> <span class="pre">int</span> <span class="pre">flags</span></code></dt><dd><p>splice modifier flags</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">splice_actor</span> <span class="pre">*actor</span></code></dt><dd><p>handler that splices the data</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<blockquote>
<div><p>See __splice_from_pipe. This function locks the pipe inode,
otherwise it’s identical to <a class="reference internal" href="#c.__splice_from_pipe" title="__splice_from_pipe"><code class="xref c c-func docutils literal notranslate"><span class="pre">__splice_from_pipe()</span></code></a>.</p>
</div></blockquote>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.iter_file_splice_write">
<span class="n"><span class="pre">ssize_t</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iter_file_splice_write</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="api-summary.html#c.file" title="file"><span class="n"><span class="pre">file</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">out</span></span>, <span class="n"><span class="pre">loff_t</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">ppos</span></span>, <span class="n"><span class="pre">size_t</span></span><span class="w"> </span><span class="n"><span class="pre">len</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">flags</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.iter_file_splice_write" title="Link to this definition">¶</a><br /></dt>
<dd><p>splice data from a pipe to a file</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>pipe info</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">file</span> <span class="pre">*out</span></code></dt><dd><p>file to write to</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">loff_t</span> <span class="pre">*ppos</span></code></dt><dd><p>position in <strong>out</strong></p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">size_t</span> <span class="pre">len</span></code></dt><dd><p>number of bytes to splice</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">unsigned</span> <span class="pre">int</span> <span class="pre">flags</span></code></dt><dd><p>splice modifier flags</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<blockquote>
<div><p>Will either move or copy pages (determined by <strong>flags</strong> options) from
the given pipe inode to the given file.
This one is ->write_iter-based.</p>
</div></blockquote>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.splice_to_socket">
<span class="n"><span class="pre">ssize_t</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">splice_to_socket</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="api-summary.html#c.file" title="file"><span class="n"><span class="pre">file</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">out</span></span>, <span class="n"><span class="pre">loff_t</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">ppos</span></span>, <span class="n"><span class="pre">size_t</span></span><span class="w"> </span><span class="n"><span class="pre">len</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">flags</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.splice_to_socket" title="Link to this definition">¶</a><br /></dt>
<dd><p>splice data from a pipe to a socket</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>pipe to splice from</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">file</span> <span class="pre">*out</span></code></dt><dd><p>socket to write to</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">loff_t</span> <span class="pre">*ppos</span></code></dt><dd><p>position in <strong>out</strong></p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">size_t</span> <span class="pre">len</span></code></dt><dd><p>number of bytes to splice</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">unsigned</span> <span class="pre">int</span> <span class="pre">flags</span></code></dt><dd><p>splice modifier flags</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<blockquote>
<div><p>Will send <strong>len</strong> bytes from the pipe to a network socket. No data copying
is involved.</p>
</div></blockquote>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.vfs_splice_read">
<span class="n"><span class="pre">ssize_t</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">vfs_splice_read</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="api-summary.html#c.file" title="file"><span class="n"><span class="pre">file</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">in</span></span>, <span class="n"><span class="pre">loff_t</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">ppos</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="n"><span class="pre">size_t</span></span><span class="w"> </span><span class="n"><span class="pre">len</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">flags</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.vfs_splice_read" title="Link to this definition">¶</a><br /></dt>
<dd><p>Read data from a file and splice it into a pipe</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">file</span> <span class="pre">*in</span></code></dt><dd><p>File to splice from</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">loff_t</span> <span class="pre">*ppos</span></code></dt><dd><p>Input file offset</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>Pipe to splice to</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">size_t</span> <span class="pre">len</span></code></dt><dd><p>Number of bytes to splice</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">unsigned</span> <span class="pre">int</span> <span class="pre">flags</span></code></dt><dd><p>Splice modifier flags (SPLICE_F_*)</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<p>Splice the requested amount of data from the input file to the pipe. This
is synchronous as the caller must hold the pipe lock across the entire
operation.</p>
<p>If successful, it returns the amount of data spliced, 0 if it hit the EOF or
a hole and a negative error code otherwise.</p>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.splice_direct_to_actor">
<span class="n"><span class="pre">ssize_t</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">splice_direct_to_actor</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="api-summary.html#c.file" title="file"><span class="n"><span class="pre">file</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">in</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">splice_desc</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">sd</span></span>, <span class="n"><span class="pre">splice_direct_actor</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">actor</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.splice_direct_to_actor" title="Link to this definition">¶</a><br /></dt>
<dd><p>splices data directly between two non-pipes</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">file</span> <span class="pre">*in</span></code></dt><dd><p>file to splice from</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">splice_desc</span> <span class="pre">*sd</span></code></dt><dd><p>actor information on where to splice to</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">splice_direct_actor</span> <span class="pre">*actor</span></code></dt><dd><p>handles the data splicing</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<blockquote>
<div><p>This is a special case helper to splice directly between two
points, without requiring an explicit pipe. Internally an allocated
pipe is cached in the process, and reused during the lifetime of
that process.</p>
</div></blockquote>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.do_splice_direct">
<span class="n"><span class="pre">ssize_t</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">do_splice_direct</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="api-summary.html#c.file" title="file"><span class="n"><span class="pre">file</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">in</span></span>, <span class="n"><span class="pre">loff_t</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">ppos</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="api-summary.html#c.file" title="file"><span class="n"><span class="pre">file</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">out</span></span>, <span class="n"><span class="pre">loff_t</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">opos</span></span>, <span class="n"><span class="pre">size_t</span></span><span class="w"> </span><span class="n"><span class="pre">len</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">flags</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.do_splice_direct" title="Link to this definition">¶</a><br /></dt>
<dd><p>splices data directly between two files</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">file</span> <span class="pre">*in</span></code></dt><dd><p>file to splice from</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">loff_t</span> <span class="pre">*ppos</span></code></dt><dd><p>input file offset</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">file</span> <span class="pre">*out</span></code></dt><dd><p>file to splice to</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">loff_t</span> <span class="pre">*opos</span></code></dt><dd><p>output file offset</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">size_t</span> <span class="pre">len</span></code></dt><dd><p>number of bytes to splice</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">unsigned</span> <span class="pre">int</span> <span class="pre">flags</span></code></dt><dd><p>splice modifier flags</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<blockquote>
<div><p>For use by <code class="xref c c-func broken_xref docutils literal notranslate"><span class="pre">do_sendfile()</span></code>. splice can easily emulate sendfile, but
doing it in the application would incur an extra system call
(splice in + splice out, as compared to just <code class="xref c c-func broken_xref docutils literal notranslate"><span class="pre">sendfile()</span></code>). So this helper
can splice directly through a process-private pipe.</p>
</div></blockquote>
<p>Callers already called <code class="xref c c-func broken_xref docutils literal notranslate"><span class="pre">rw_verify_area()</span></code> on the entire range.</p>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.splice_file_range">
<span class="n"><span class="pre">ssize_t</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">splice_file_range</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="api-summary.html#c.file" title="file"><span class="n"><span class="pre">file</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">in</span></span>, <span class="n"><span class="pre">loff_t</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">ppos</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="api-summary.html#c.file" title="file"><span class="n"><span class="pre">file</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">out</span></span>, <span class="n"><span class="pre">loff_t</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">opos</span></span>, <span class="n"><span class="pre">size_t</span></span><span class="w"> </span><span class="n"><span class="pre">len</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.splice_file_range" title="Link to this definition">¶</a><br /></dt>
<dd><p>splices data between two files for <code class="xref c c-func broken_xref docutils literal notranslate"><span class="pre">copy_file_range()</span></code></p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">file</span> <span class="pre">*in</span></code></dt><dd><p>file to splice from</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">loff_t</span> <span class="pre">*ppos</span></code></dt><dd><p>input file offset</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">file</span> <span class="pre">*out</span></code></dt><dd><p>file to splice to</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">loff_t</span> <span class="pre">*opos</span></code></dt><dd><p>output file offset</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">size_t</span> <span class="pre">len</span></code></dt><dd><p>number of bytes to splice</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<blockquote>
<div><p>For use by -><code class="xref c c-func broken_xref docutils literal notranslate"><span class="pre">copy_file_range()</span></code> methods.
Like <a class="reference internal" href="#c.do_splice_direct" title="do_splice_direct"><code class="xref c c-func docutils literal notranslate"><span class="pre">do_splice_direct()</span></code></a>, but <code class="xref c c-func broken_xref docutils literal notranslate"><span class="pre">vfs_copy_file_range()</span></code> already holds
<code class="xref c c-func broken_xref docutils literal notranslate"><span class="pre">start_file_write()</span></code> on <strong>out</strong> file.</p>
</div></blockquote>
<p>Callers already called <code class="xref c c-func broken_xref docutils literal notranslate"><span class="pre">rw_verify_area()</span></code> on the entire range.</p>
</div>
</section>
<section id="pipes-api">
<h2>pipes API<a class="headerlink" href="#pipes-api" title="Link to this heading">¶</a></h2>
<p>Pipe interfaces are all for in-kernel (builtin image) use. They are not
exported for use by modules.</p>
<dl class="c struct">
<dt class="sig sig-object c" id="c.pipe_buffer">
<span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">pipe_buffer</span></span></span><a class="headerlink" href="#c.pipe_buffer" title="Link to this definition">¶</a><br /></dt>
<dd><p>a linux kernel pipe buffer</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Definition</strong>:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>struct pipe_buffer {
struct page *page;
unsigned int offset, len;
const struct pipe_buf_operations *ops;
unsigned int flags;
unsigned long private;
};
</pre></div>
</div>
<p><strong>Members</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">page</span></code></dt><dd><p>the page containing the data for the pipe buffer</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">offset</span></code></dt><dd><p>offset of data inside the <strong>page</strong></p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">len</span></code></dt><dd><p>length of data inside the <strong>page</strong></p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">ops</span></code></dt><dd><p>operations associated with this buffer. See <strong>pipe_buf_operations</strong>.</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">flags</span></code></dt><dd><p>pipe buffer flags. See above.</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">private</span></code></dt><dd><p>private data owned by the ops.</p>
</dd>
</dl>
</div>
<dl class="c struct">
<dt class="sig sig-object c" id="c.pipe_inode_info">
<span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">pipe_inode_info</span></span></span><a class="headerlink" href="#c.pipe_inode_info" title="Link to this definition">¶</a><br /></dt>
<dd><p>a linux kernel pipe</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Definition</strong>:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>struct pipe_inode_info {
struct mutex mutex;
wait_queue_head_t rd_wait, wr_wait;
union {
unsigned long head_tail;
struct {
pipe_index_t head;
pipe_index_t tail;
};
};
unsigned int max_usage;
unsigned int ring_size;
unsigned int nr_accounted;
unsigned int readers;
unsigned int writers;
unsigned int files;
unsigned int r_counter;
unsigned int w_counter;
bool poll_usage;
#ifdef CONFIG_WATCH_QUEUE;
bool note_loss;
#endif;
struct page *tmp_page[2];
struct fasync_struct *fasync_readers;
struct fasync_struct *fasync_writers;
struct pipe_buffer *bufs;
struct user_struct *user;
#ifdef CONFIG_WATCH_QUEUE;
struct watch_queue *watch_queue;
#endif;
};
</pre></div>
</div>
<p><strong>Members</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">mutex</span></code></dt><dd><p>mutex protecting the whole thing</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">rd_wait</span></code></dt><dd><p>reader wait point in case of empty pipe</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">wr_wait</span></code></dt><dd><p>writer wait point in case of full pipe</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">{unnamed_union}</span></code></dt><dd><p>anonymous</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">head_tail</span></code></dt><dd><p>unsigned long <code class="xref c c-union broken_xref docutils literal notranslate"><span class="pre">union</span> <span class="pre">of</span></code> <strong>head</strong> and <strong>tail</strong></p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">{unnamed_struct}</span></code></dt><dd><p>anonymous</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">head</span></code></dt><dd><p>The point of buffer production</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">tail</span></code></dt><dd><p>The point of buffer consumption</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">max_usage</span></code></dt><dd><p>The maximum number of slots that may be used in the ring</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">ring_size</span></code></dt><dd><p>total number of buffers (should be a power of 2)</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">nr_accounted</span></code></dt><dd><p>The amount this pipe accounts for in user->pipe_bufs</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">readers</span></code></dt><dd><p>number of current readers of this pipe</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">writers</span></code></dt><dd><p>number of current writers of this pipe</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">files</span></code></dt><dd><p>number of <a class="reference internal" href="api-summary.html#c.file" title="file"><code class="xref c c-struct docutils literal notranslate"><span class="pre">struct</span> <span class="pre">file</span></code></a> referring this pipe (protected by ->i_lock)</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">r_counter</span></code></dt><dd><p>reader counter</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">w_counter</span></code></dt><dd><p>writer counter</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">poll_usage</span></code></dt><dd><p>is this pipe used for epoll, which has crazy wakeups?</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">note_loss</span></code></dt><dd><p>The next read() should insert a data-lost message</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">tmp_page</span></code></dt><dd><p>cached released page</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">fasync_readers</span></code></dt><dd><p>reader side fasync</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">fasync_writers</span></code></dt><dd><p>writer side fasync</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">bufs</span></code></dt><dd><p>the circular array of pipe buffers</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">user</span></code></dt><dd><p>the user who created this pipe</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">watch_queue</span></code></dt><dd><p>If this pipe is a watch_queue, this is the stuff for that</p>
</dd>
</dl>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.pipe_has_watch_queue">
<span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">pipe_has_watch_queue</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.pipe_has_watch_queue" title="Link to this definition">¶</a><br /></dt>
<dd><p>Check whether the pipe is a watch_queue, i.e. it was created with O_NOTIFICATION_PIPE</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">const</span> <span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>The pipe to check</p>
</dd>
</dl>
<p><strong>Return</strong></p>
<p>true if pipe is a watch queue, false otherwise.</p>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.pipe_occupancy">
<span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">pipe_occupancy</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">head</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">tail</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.pipe_occupancy" title="Link to this definition">¶</a><br /></dt>
<dd><p>Return number of slots used in the pipe</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">unsigned</span> <span class="pre">int</span> <span class="pre">head</span></code></dt><dd><p>The pipe ring head pointer</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">unsigned</span> <span class="pre">int</span> <span class="pre">tail</span></code></dt><dd><p>The pipe ring tail pointer</p>
</dd>
</dl>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.pipe_empty">
<span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">pipe_empty</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">head</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">tail</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.pipe_empty" title="Link to this definition">¶</a><br /></dt>
<dd><p>Return true if the pipe is empty</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">unsigned</span> <span class="pre">int</span> <span class="pre">head</span></code></dt><dd><p>The pipe ring head pointer</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">unsigned</span> <span class="pre">int</span> <span class="pre">tail</span></code></dt><dd><p>The pipe ring tail pointer</p>
</dd>
</dl>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.pipe_full">
<span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">pipe_full</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">head</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">tail</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">limit</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.pipe_full" title="Link to this definition">¶</a><br /></dt>
<dd><p>Return true if the pipe is full</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">unsigned</span> <span class="pre">int</span> <span class="pre">head</span></code></dt><dd><p>The pipe ring head pointer</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">unsigned</span> <span class="pre">int</span> <span class="pre">tail</span></code></dt><dd><p>The pipe ring tail pointer</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">unsigned</span> <span class="pre">int</span> <span class="pre">limit</span></code></dt><dd><p>The maximum amount of slots available.</p>
</dd>
</dl>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.pipe_is_full">
<span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">pipe_is_full</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.pipe_is_full" title="Link to this definition">¶</a><br /></dt>
<dd><p>Return true if the pipe is full</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">const</span> <span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>the pipe</p>
</dd>
</dl>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.pipe_is_empty">
<span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">pipe_is_empty</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.pipe_is_empty" title="Link to this definition">¶</a><br /></dt>
<dd><p>Return true if the pipe is empty</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">const</span> <span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>the pipe</p>
</dd>
</dl>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.pipe_buf_usage">
<span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">pipe_buf_usage</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.pipe_buf_usage" title="Link to this definition">¶</a><br /></dt>
<dd><p>Return how many pipe buffers are in use</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">const</span> <span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>the pipe</p>
</dd>
</dl>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.pipe_buf">
<span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_buffer" title="pipe_buffer"><span class="n"><span class="pre">pipe_buffer</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">pipe_buf</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">slot</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.pipe_buf" title="Link to this definition">¶</a><br /></dt>
<dd><p>Return the pipe buffer for the specified slot in the pipe ring</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">const</span> <span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>The pipe to access</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">unsigned</span> <span class="pre">int</span> <span class="pre">slot</span></code></dt><dd><p>The slot of interest</p>
</dd>
</dl>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.pipe_head_buf">
<span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_buffer" title="pipe_buffer"><span class="n"><span class="pre">pipe_buffer</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">pipe_head_buf</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.pipe_head_buf" title="Link to this definition">¶</a><br /></dt>
<dd><p>Return the pipe buffer at the head of the pipe ring</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">const</span> <span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>The pipe to access</p>
</dd>
</dl>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.pipe_buf_get">
<span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">pipe_buf_get</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_buffer" title="pipe_buffer"><span class="n"><span class="pre">pipe_buffer</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buf</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.pipe_buf_get" title="Link to this definition">¶</a><br /></dt>
<dd><p>get a reference to a pipe_buffer</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>the pipe that the buffer belongs to</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_buffer</span> <span class="pre">*buf</span></code></dt><dd><p>the buffer to get a reference to</p>
</dd>
</dl>
<p><strong>Return</strong></p>
<p><code class="docutils literal notranslate"><span class="pre">true</span></code> if the reference was successfully obtained.</p>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.pipe_buf_release">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">pipe_buf_release</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_buffer" title="pipe_buffer"><span class="n"><span class="pre">pipe_buffer</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buf</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.pipe_buf_release" title="Link to this definition">¶</a><br /></dt>
<dd><p>put a reference to a pipe_buffer</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>the pipe that the buffer belongs to</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_buffer</span> <span class="pre">*buf</span></code></dt><dd><p>the buffer to put a reference to</p>
</dd>
</dl>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.pipe_buf_confirm">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">pipe_buf_confirm</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_buffer" title="pipe_buffer"><span class="n"><span class="pre">pipe_buffer</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buf</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.pipe_buf_confirm" title="Link to this definition">¶</a><br /></dt>
<dd><p>verify contents of the pipe buffer</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>the pipe that the buffer belongs to</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_buffer</span> <span class="pre">*buf</span></code></dt><dd><p>the buffer to confirm</p>
</dd>
</dl>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.pipe_buf_try_steal">
<span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">pipe_buf_try_steal</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_buffer" title="pipe_buffer"><span class="n"><span class="pre">pipe_buffer</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buf</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.pipe_buf_try_steal" title="Link to this definition">¶</a><br /></dt>
<dd><p>attempt to take ownership of a pipe_buffer</p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>the pipe that the buffer belongs to</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_buffer</span> <span class="pre">*buf</span></code></dt><dd><p>the buffer to attempt to steal</p>
</dd>
</dl>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.generic_pipe_buf_try_steal">
<span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">generic_pipe_buf_try_steal</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_buffer" title="pipe_buffer"><span class="n"><span class="pre">pipe_buffer</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buf</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.generic_pipe_buf_try_steal" title="Link to this definition">¶</a><br /></dt>
<dd><p>attempt to take ownership of a <a class="reference internal" href="#c.pipe_buffer" title="pipe_buffer"><code class="xref c c-type docutils literal notranslate"><span class="pre">pipe_buffer</span></code></a></p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>the pipe that the buffer belongs to</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_buffer</span> <span class="pre">*buf</span></code></dt><dd><p>the buffer to attempt to steal</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<blockquote>
<div><p>This function attempts to steal the <code class="xref c c-type docutils literal notranslate"><span class="pre">struct</span> <span class="pre">page</span></code> attached to
<strong>buf</strong>. If successful, this function returns 0 and returns with
the page locked. The caller may then reuse the page for whatever
he wishes; the typical use is insertion into a different file
page cache.</p>
</div></blockquote>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.generic_pipe_buf_get">
<span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">generic_pipe_buf_get</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_buffer" title="pipe_buffer"><span class="n"><span class="pre">pipe_buffer</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buf</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.generic_pipe_buf_get" title="Link to this definition">¶</a><br /></dt>
<dd><p>get a reference to a <a class="reference internal" href="#c.pipe_buffer" title="pipe_buffer"><code class="xref c c-type docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_buffer</span></code></a></p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>the pipe that the buffer belongs to</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_buffer</span> <span class="pre">*buf</span></code></dt><dd><p>the buffer to get a reference to</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<blockquote>
<div><p>This function grabs an extra reference to <strong>buf</strong>. It’s used in
the <code class="xref c c-func broken_xref docutils literal notranslate"><span class="pre">tee()</span></code> system call, when we duplicate the buffers in one
pipe into another.</p>
</div></blockquote>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.generic_pipe_buf_release">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">generic_pipe_buf_release</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_inode_info" title="pipe_inode_info"><span class="n"><span class="pre">pipe_inode_info</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">pipe</span></span>, <span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.pipe_buffer" title="pipe_buffer"><span class="n"><span class="pre">pipe_buffer</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buf</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.generic_pipe_buf_release" title="Link to this definition">¶</a><br /></dt>
<dd><p>put a reference to a <a class="reference internal" href="#c.pipe_buffer" title="pipe_buffer"><code class="xref c c-type docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_buffer</span></code></a></p>
</dd></dl>
<div class="kernelindent docutils container">
<p><strong>Parameters</strong></p>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_inode_info</span> <span class="pre">*pipe</span></code></dt><dd><p>the pipe that the buffer belongs to</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">pipe_buffer</span> <span class="pre">*buf</span></code></dt><dd><p>the buffer to put a reference to</p>
</dd>
</dl>
<p><strong>Description</strong></p>
<blockquote>
<div><p>This function releases a reference to <strong>buf</strong>.</p>
</div></blockquote>
</div>
</section>
</section>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
©The kernel development community.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.1.3</a>
& <a href="https://alabaster.readthedocs.io">Alabaster 0.7.16</a>
|
<a href="../_sources/filesystems/splice.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>