<!doctype html public "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title>Linux/fs/read_write.c</title>
<base href="http://lxr.linux.no/">
</head>

<body bgcolor=white text=black>
<table width="100%" cellpadding=0 border=0>
  <tr valign=top>
    <td align=left valign=top>
      <img src="/pengmini.gif"
        alt="Penguin" border=0 width=67 height=92 align=middle>
    </td>
    <td>
      <table width="100%" cellpadding=0 border=0>
        <tr valign=top>
          <td align=center>  
            <h1>
              <a href="blurb.html">
                Cross-Referencing Linux</a><br>
              <a href="source/">Linux</a>/<a href="source/fs/">fs</a>/<a href="source/fs/read_write.c">read_write.c</a>
            </h1>
          </td>
          <td align=right nowrap>
            
            [&nbsp;<b><i>source navigation</i></b>&nbsp;]<br>
            [&nbsp;<a href="diff/fs/read_write.c">diff markup</a>&nbsp;]<br>
            [&nbsp;<a href="ident">identifier search</a>&nbsp;]<br>
            [&nbsp;<a href="search">freetext search</a>&nbsp;]<br>
            [&nbsp;<a href="find">file search</a>&nbsp;]<br>
          </td>
        </tr>
      </table>
      <table width="100%" cellpadding=0 border=0>
        
        <tr>
          <td align=left>
            Version:
          </td>
          <td align=right>
            
            [&nbsp;<a href="source/fs/read_write.c?v=1.0.9">1.0.9</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?v=1.2.13">1.2.13</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?v=2.0.40">2.0.40</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?v=2.2.26">2.2.26</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?v=2.4.18">2.4.18</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?v=2.4.20">2.4.20</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?v=2.4.28">2.4.28</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?v=2.6.10">2.6.10</a>&nbsp;]
            [&nbsp;<b><i>2.6.11</i></b>&nbsp;]
            <br>
          </td>
        </tr>
        <tr>
          <td align=left>
            Architecture:
          </td>
          <td align=right>
            
            [&nbsp;<b><i>i386</i></b>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?a=alpha">alpha</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?a=arm">arm</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?a=ia64">ia64</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?a=m68k">m68k</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?a=mips">mips</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?a=mips64">mips64</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?a=ppc">ppc</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?a=s390">s390</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?a=sh">sh</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?a=sparc">sparc</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?a=sparc64">sparc64</a>&nbsp;]
            [&nbsp;<a href="source/fs/read_write.c?a=x86_64">x86_64</a>&nbsp;]
            <br>
          </td>
        </tr>
      </table>
    </td>
  </tr>
</table>
<hr>
<pre><a name=L1 href="source/fs/read_write.c#L1">1</a> <b><i>/*</i></b>
<a name=L2 href="source/fs/read_write.c#L2">2</a> <b><i> *  linux/fs/read_write.c</i></b>
<a name=L3 href="source/fs/read_write.c#L3">3</a> <b><i> *</i></b>
<a name=L4 href="source/fs/read_write.c#L4">4</a> <b><i> *  Copyright (C) 1991, 1992  Linus Torvalds</i></b>
<a name=L5 href="source/fs/read_write.c#L5">5</a> <b><i> */</i></b>
<a name=L6 href="source/fs/read_write.c#L6">6</a> 
<a name=L7 href="source/fs/read_write.c#L7">7</a> #include &lt;<a href="source/include/linux/slab.h">linux/slab.h</a>&gt; 
<a name=L8 href="source/fs/read_write.c#L8">8</a> #include &lt;<a href="source/include/linux/stat.h">linux/stat.h</a>&gt;
<a name=L9 href="source/fs/read_write.c#L9">9</a> #include &lt;<a href="source/include/linux/fcntl.h">linux/fcntl.h</a>&gt;
<a name=L10 href="source/fs/read_write.c#L10">10</a> #include &lt;<a href="source/include/linux/file.h">linux/file.h</a>&gt;
<a name=L11 href="source/fs/read_write.c#L11">11</a> #include &lt;<a href="source/include/linux/uio.h">linux/uio.h</a>&gt;
<a name=L12 href="source/fs/read_write.c#L12">12</a> #include &lt;<a href="source/include/linux/smp_lock.h">linux/smp_lock.h</a>&gt;
<a name=L13 href="source/fs/read_write.c#L13">13</a> #include &lt;<a href="source/include/linux/dnotify.h">linux/dnotify.h</a>&gt;
<a name=L14 href="source/fs/read_write.c#L14">14</a> #include &lt;<a href="source/include/linux/security.h">linux/security.h</a>&gt;
<a name=L15 href="source/fs/read_write.c#L15">15</a> #include &lt;<a href="source/include/linux/module.h">linux/module.h</a>&gt;
<a name=L16 href="source/fs/read_write.c#L16">16</a> #include &lt;<a href="source/include/linux/syscalls.h">linux/syscalls.h</a>&gt;
<a name=L17 href="source/fs/read_write.c#L17">17</a> 
<a name=L18 href="source/fs/read_write.c#L18">18</a> #include &lt;<a href="source/include/asm-i386/uaccess.h">asm/uaccess.h</a>&gt;
<a name=L19 href="source/fs/read_write.c#L19">19</a> #include &lt;<a href="source/include/asm-i386/unistd.h">asm/unistd.h</a>&gt;
<a name=L20 href="source/fs/read_write.c#L20">20</a> 
<a name=L21 href="source/fs/read_write.c#L21">21</a> struct <a href="ident?i=file_operations">file_operations</a> <a href="ident?i=generic_ro_fops">generic_ro_fops</a> = {
<a name=L22 href="source/fs/read_write.c#L22">22</a>         .<a href="ident?i=llseek">llseek</a>         = <a href="ident?i=generic_file_llseek">generic_file_llseek</a>,
<a name=L23 href="source/fs/read_write.c#L23">23</a>         .<a href="ident?i=read">read</a>           = <a href="ident?i=generic_file_read">generic_file_read</a>,
<a name=L24 href="source/fs/read_write.c#L24">24</a>         .<a href="ident?i=mmap">mmap</a>           = <a href="ident?i=generic_file_readonly_mmap">generic_file_readonly_mmap</a>,
<a name=L25 href="source/fs/read_write.c#L25">25</a>         .sendfile       = <a href="ident?i=generic_file_sendfile">generic_file_sendfile</a>,
<a name=L26 href="source/fs/read_write.c#L26">26</a> };
<a name=L27 href="source/fs/read_write.c#L27">27</a> 
<a name=L28 href="source/fs/read_write.c#L28">28</a> <a href="ident?i=EXPORT_SYMBOL">EXPORT_SYMBOL</a>(<a href="ident?i=generic_ro_fops">generic_ro_fops</a>);
<a name=L29 href="source/fs/read_write.c#L29">29</a> 
<a name=L30 href="source/fs/read_write.c#L30">30</a> <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=generic_file_llseek">generic_file_llseek</a>(struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>, <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=offset">offset</a>, int <a href="ident?i=origin">origin</a>)
<a name=L31 href="source/fs/read_write.c#L31">31</a> {
<a name=L32 href="source/fs/read_write.c#L32">32</a>         long long retval;
<a name=L33 href="source/fs/read_write.c#L33">33</a>         struct <a href="ident?i=inode">inode</a> *<a href="ident?i=inode">inode</a> = <a href="ident?i=file">file</a>-&gt;f_mapping-&gt;<a href="ident?i=host">host</a>;
<a name=L34 href="source/fs/read_write.c#L34">34</a> 
<a name=L35 href="source/fs/read_write.c#L35">35</a>         <a href="ident?i=down">down</a>(&amp;<a href="ident?i=inode">inode</a>-&gt;i_sem);
<a name=L36 href="source/fs/read_write.c#L36">36</a>         switch (<a href="ident?i=origin">origin</a>) {
<a name=L37 href="source/fs/read_write.c#L37">37</a>                 case 2:
<a name=L38 href="source/fs/read_write.c#L38">38</a>                         <a href="ident?i=offset">offset</a> += <a href="ident?i=inode">inode</a>-&gt;i_size;
<a name=L39 href="source/fs/read_write.c#L39">39</a>                         break;
<a name=L40 href="source/fs/read_write.c#L40">40</a>                 case 1:
<a name=L41 href="source/fs/read_write.c#L41">41</a>                         <a href="ident?i=offset">offset</a> += <a href="ident?i=file">file</a>-&gt;f_pos;
<a name=L42 href="source/fs/read_write.c#L42">42</a>         }
<a name=L43 href="source/fs/read_write.c#L43">43</a>         retval = -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L44 href="source/fs/read_write.c#L44">44</a>         if (<a href="ident?i=offset">offset</a>&gt;=0 &amp;&amp; <a href="ident?i=offset">offset</a>&lt;=<a href="ident?i=inode">inode</a>-&gt;i_sb-&gt;s_maxbytes) {
<a name=L45 href="source/fs/read_write.c#L45">45</a>                 if (<a href="ident?i=offset">offset</a> != <a href="ident?i=file">file</a>-&gt;f_pos) {
<a name=L46 href="source/fs/read_write.c#L46">46</a>                         <a href="ident?i=file">file</a>-&gt;f_pos = <a href="ident?i=offset">offset</a>;
<a name=L47 href="source/fs/read_write.c#L47">47</a>                         <a href="ident?i=file">file</a>-&gt;f_version = 0;
<a name=L48 href="source/fs/read_write.c#L48">48</a>                 }
<a name=L49 href="source/fs/read_write.c#L49">49</a>                 retval = <a href="ident?i=offset">offset</a>;
<a name=L50 href="source/fs/read_write.c#L50">50</a>         }
<a name=L51 href="source/fs/read_write.c#L51">51</a>         <a href="ident?i=up">up</a>(&amp;<a href="ident?i=inode">inode</a>-&gt;i_sem);
<a name=L52 href="source/fs/read_write.c#L52">52</a>         return retval;
<a name=L53 href="source/fs/read_write.c#L53">53</a> }
<a name=L54 href="source/fs/read_write.c#L54">54</a> 
<a name=L55 href="source/fs/read_write.c#L55">55</a> <a href="ident?i=EXPORT_SYMBOL">EXPORT_SYMBOL</a>(<a href="ident?i=generic_file_llseek">generic_file_llseek</a>);
<a name=L56 href="source/fs/read_write.c#L56">56</a> 
<a name=L57 href="source/fs/read_write.c#L57">57</a> <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=remote_llseek">remote_llseek</a>(struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>, <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=offset">offset</a>, int <a href="ident?i=origin">origin</a>)
<a name=L58 href="source/fs/read_write.c#L58">58</a> {
<a name=L59 href="source/fs/read_write.c#L59">59</a>         long long retval;
<a name=L60 href="source/fs/read_write.c#L60">60</a> 
<a name=L61 href="source/fs/read_write.c#L61">61</a>         <a href="ident?i=lock_kernel">lock_kernel</a>();
<a name=L62 href="source/fs/read_write.c#L62">62</a>         switch (<a href="ident?i=origin">origin</a>) {
<a name=L63 href="source/fs/read_write.c#L63">63</a>                 case 2:
<a name=L64 href="source/fs/read_write.c#L64">64</a>                         <a href="ident?i=offset">offset</a> += <a href="ident?i=i_size_read">i_size_read</a>(<a href="ident?i=file">file</a>-&gt;f_dentry-&gt;d_inode);
<a name=L65 href="source/fs/read_write.c#L65">65</a>                         break;
<a name=L66 href="source/fs/read_write.c#L66">66</a>                 case 1:
<a name=L67 href="source/fs/read_write.c#L67">67</a>                         <a href="ident?i=offset">offset</a> += <a href="ident?i=file">file</a>-&gt;f_pos;
<a name=L68 href="source/fs/read_write.c#L68">68</a>         }
<a name=L69 href="source/fs/read_write.c#L69">69</a>         retval = -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L70 href="source/fs/read_write.c#L70">70</a>         if (<a href="ident?i=offset">offset</a>&gt;=0 &amp;&amp; <a href="ident?i=offset">offset</a>&lt;=<a href="ident?i=file">file</a>-&gt;f_dentry-&gt;d_inode-&gt;i_sb-&gt;s_maxbytes) {
<a name=L71 href="source/fs/read_write.c#L71">71</a>                 if (<a href="ident?i=offset">offset</a> != <a href="ident?i=file">file</a>-&gt;f_pos) {
<a name=L72 href="source/fs/read_write.c#L72">72</a>                         <a href="ident?i=file">file</a>-&gt;f_pos = <a href="ident?i=offset">offset</a>;
<a name=L73 href="source/fs/read_write.c#L73">73</a>                         <a href="ident?i=file">file</a>-&gt;f_version = 0;
<a name=L74 href="source/fs/read_write.c#L74">74</a>                 }
<a name=L75 href="source/fs/read_write.c#L75">75</a>                 retval = <a href="ident?i=offset">offset</a>;
<a name=L76 href="source/fs/read_write.c#L76">76</a>         }
<a name=L77 href="source/fs/read_write.c#L77">77</a>         <a href="ident?i=unlock_kernel">unlock_kernel</a>();
<a name=L78 href="source/fs/read_write.c#L78">78</a>         return retval;
<a name=L79 href="source/fs/read_write.c#L79">79</a> }
<a name=L80 href="source/fs/read_write.c#L80">80</a> <a href="ident?i=EXPORT_SYMBOL">EXPORT_SYMBOL</a>(<a href="ident?i=remote_llseek">remote_llseek</a>);
<a name=L81 href="source/fs/read_write.c#L81">81</a> 
<a name=L82 href="source/fs/read_write.c#L82">82</a> <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=no_llseek">no_llseek</a>(struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>, <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=offset">offset</a>, int <a href="ident?i=origin">origin</a>)
<a name=L83 href="source/fs/read_write.c#L83">83</a> {
<a name=L84 href="source/fs/read_write.c#L84">84</a>         return -<a href="ident?i=ESPIPE">ESPIPE</a>;
<a name=L85 href="source/fs/read_write.c#L85">85</a> }
<a name=L86 href="source/fs/read_write.c#L86">86</a> <a href="ident?i=EXPORT_SYMBOL">EXPORT_SYMBOL</a>(<a href="ident?i=no_llseek">no_llseek</a>);
<a name=L87 href="source/fs/read_write.c#L87">87</a> 
<a name=L88 href="source/fs/read_write.c#L88">88</a> <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=default_llseek">default_llseek</a>(struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>, <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=offset">offset</a>, int <a href="ident?i=origin">origin</a>)
<a name=L89 href="source/fs/read_write.c#L89">89</a> {
<a name=L90 href="source/fs/read_write.c#L90">90</a>         long long retval;
<a name=L91 href="source/fs/read_write.c#L91">91</a> 
<a name=L92 href="source/fs/read_write.c#L92">92</a>         <a href="ident?i=lock_kernel">lock_kernel</a>();
<a name=L93 href="source/fs/read_write.c#L93">93</a>         switch (<a href="ident?i=origin">origin</a>) {
<a name=L94 href="source/fs/read_write.c#L94">94</a>                 case 2:
<a name=L95 href="source/fs/read_write.c#L95">95</a>                         <a href="ident?i=offset">offset</a> += <a href="ident?i=i_size_read">i_size_read</a>(<a href="ident?i=file">file</a>-&gt;f_dentry-&gt;d_inode);
<a name=L96 href="source/fs/read_write.c#L96">96</a>                         break;
<a name=L97 href="source/fs/read_write.c#L97">97</a>                 case 1:
<a name=L98 href="source/fs/read_write.c#L98">98</a>                         <a href="ident?i=offset">offset</a> += <a href="ident?i=file">file</a>-&gt;f_pos;
<a name=L99 href="source/fs/read_write.c#L99">99</a>         }
<a name=L100 href="source/fs/read_write.c#L100">100</a>         retval = -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L101 href="source/fs/read_write.c#L101">101</a>         if (<a href="ident?i=offset">offset</a> &gt;= 0) {
<a name=L102 href="source/fs/read_write.c#L102">102</a>                 if (<a href="ident?i=offset">offset</a> != <a href="ident?i=file">file</a>-&gt;f_pos) {
<a name=L103 href="source/fs/read_write.c#L103">103</a>                         <a href="ident?i=file">file</a>-&gt;f_pos = <a href="ident?i=offset">offset</a>;
<a name=L104 href="source/fs/read_write.c#L104">104</a>                         <a href="ident?i=file">file</a>-&gt;f_version = 0;
<a name=L105 href="source/fs/read_write.c#L105">105</a>                 }
<a name=L106 href="source/fs/read_write.c#L106">106</a>                 retval = <a href="ident?i=offset">offset</a>;
<a name=L107 href="source/fs/read_write.c#L107">107</a>         }
<a name=L108 href="source/fs/read_write.c#L108">108</a>         <a href="ident?i=unlock_kernel">unlock_kernel</a>();
<a name=L109 href="source/fs/read_write.c#L109">109</a>         return retval;
<a name=L110 href="source/fs/read_write.c#L110">110</a> }
<a name=L111 href="source/fs/read_write.c#L111">111</a> <a href="ident?i=EXPORT_SYMBOL">EXPORT_SYMBOL</a>(<a href="ident?i=default_llseek">default_llseek</a>);
<a name=L112 href="source/fs/read_write.c#L112">112</a> 
<a name=L113 href="source/fs/read_write.c#L113">113</a> <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=vfs_llseek">vfs_llseek</a>(struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>, <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=offset">offset</a>, int <a href="ident?i=origin">origin</a>)
<a name=L114 href="source/fs/read_write.c#L114">114</a> {
<a name=L115 href="source/fs/read_write.c#L115">115</a>         <a href="ident?i=loff_t">loff_t</a> (*fn)(struct <a href="ident?i=file">file</a> *, <a href="ident?i=loff_t">loff_t</a>, int);
<a name=L116 href="source/fs/read_write.c#L116">116</a> 
<a name=L117 href="source/fs/read_write.c#L117">117</a>         fn = <a href="ident?i=no_llseek">no_llseek</a>;
<a name=L118 href="source/fs/read_write.c#L118">118</a>         if (<a href="ident?i=file">file</a>-&gt;f_mode &amp; <a href="ident?i=FMODE_LSEEK">FMODE_LSEEK</a>) {
<a name=L119 href="source/fs/read_write.c#L119">119</a>                 fn = <a href="ident?i=default_llseek">default_llseek</a>;
<a name=L120 href="source/fs/read_write.c#L120">120</a>                 if (<a href="ident?i=file">file</a>-&gt;f_op &amp;&amp; <a href="ident?i=file">file</a>-&gt;f_op-&gt;<a href="ident?i=llseek">llseek</a>)
<a name=L121 href="source/fs/read_write.c#L121">121</a>                         fn = <a href="ident?i=file">file</a>-&gt;f_op-&gt;<a href="ident?i=llseek">llseek</a>;
<a name=L122 href="source/fs/read_write.c#L122">122</a>         }
<a name=L123 href="source/fs/read_write.c#L123">123</a>         return fn(<a href="ident?i=file">file</a>, <a href="ident?i=offset">offset</a>, <a href="ident?i=origin">origin</a>);
<a name=L124 href="source/fs/read_write.c#L124">124</a> }
<a name=L125 href="source/fs/read_write.c#L125">125</a> <a href="ident?i=EXPORT_SYMBOL">EXPORT_SYMBOL</a>(<a href="ident?i=vfs_llseek">vfs_llseek</a>);
<a name=L126 href="source/fs/read_write.c#L126">126</a> 
<a name=L127 href="source/fs/read_write.c#L127">127</a> <a href="ident?i=asmlinkage">asmlinkage</a> <a href="ident?i=off_t">off_t</a> <a href="ident?i=sys_lseek">sys_lseek</a>(unsigned int <a href="ident?i=fd">fd</a>, <a href="ident?i=off_t">off_t</a> <a href="ident?i=offset">offset</a>, unsigned int <a href="ident?i=origin">origin</a>)
<a name=L128 href="source/fs/read_write.c#L128">128</a> {
<a name=L129 href="source/fs/read_write.c#L129">129</a>         <a href="ident?i=off_t">off_t</a> retval;
<a name=L130 href="source/fs/read_write.c#L130">130</a>         struct <a href="ident?i=file">file</a> * <a href="ident?i=file">file</a>;
<a name=L131 href="source/fs/read_write.c#L131">131</a>         int fput_needed;
<a name=L132 href="source/fs/read_write.c#L132">132</a> 
<a name=L133 href="source/fs/read_write.c#L133">133</a>         retval = -<a href="ident?i=EBADF">EBADF</a>;
<a name=L134 href="source/fs/read_write.c#L134">134</a>         <a href="ident?i=file">file</a> = <a href="ident?i=fget_light">fget_light</a>(<a href="ident?i=fd">fd</a>, &amp;fput_needed);
<a name=L135 href="source/fs/read_write.c#L135">135</a>         if (!<a href="ident?i=file">file</a>)
<a name=L136 href="source/fs/read_write.c#L136">136</a>                 goto <a href="ident?i=bad">bad</a>;
<a name=L137 href="source/fs/read_write.c#L137">137</a> 
<a name=L138 href="source/fs/read_write.c#L138">138</a>         retval = -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L139 href="source/fs/read_write.c#L139">139</a>         if (<a href="ident?i=origin">origin</a> &lt;= 2) {
<a name=L140 href="source/fs/read_write.c#L140">140</a>                 <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=res">res</a> = <a href="ident?i=vfs_llseek">vfs_llseek</a>(<a href="ident?i=file">file</a>, <a href="ident?i=offset">offset</a>, <a href="ident?i=origin">origin</a>);
<a name=L141 href="source/fs/read_write.c#L141">141</a>                 retval = <a href="ident?i=res">res</a>;
<a name=L142 href="source/fs/read_write.c#L142">142</a>                 if (<a href="ident?i=res">res</a> != (<a href="ident?i=loff_t">loff_t</a>)retval)
<a name=L143 href="source/fs/read_write.c#L143">143</a>                         retval = -<a href="ident?i=EOVERFLOW">EOVERFLOW</a>;    <b><i>/* LFS: should only happen on 32 bit platforms */</i></b>
<a name=L144 href="source/fs/read_write.c#L144">144</a>         }
<a name=L145 href="source/fs/read_write.c#L145">145</a>         <a href="ident?i=fput_light">fput_light</a>(<a href="ident?i=file">file</a>, fput_needed);
<a name=L146 href="source/fs/read_write.c#L146">146</a> <a href="ident?i=bad">bad</a>:
<a name=L147 href="source/fs/read_write.c#L147">147</a>         return retval;
<a name=L148 href="source/fs/read_write.c#L148">148</a> }
<a name=L149 href="source/fs/read_write.c#L149">149</a> 
<a name=L150 href="source/fs/read_write.c#L150">150</a> #ifdef <a href="ident?i=__ARCH_WANT_SYS_LLSEEK">__ARCH_WANT_SYS_LLSEEK</a>
<a name=L151 href="source/fs/read_write.c#L151">151</a> <a href="ident?i=asmlinkage">asmlinkage</a> long <a href="ident?i=sys_llseek">sys_llseek</a>(unsigned int <a href="ident?i=fd">fd</a>, unsigned long offset_high,
<a name=L152 href="source/fs/read_write.c#L152">152</a>                            unsigned long offset_low, <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=__user">__user</a> * <a href="ident?i=result">result</a>,
<a name=L153 href="source/fs/read_write.c#L153">153</a>                            unsigned int <a href="ident?i=origin">origin</a>)
<a name=L154 href="source/fs/read_write.c#L154">154</a> {
<a name=L155 href="source/fs/read_write.c#L155">155</a>         int retval;
<a name=L156 href="source/fs/read_write.c#L156">156</a>         struct <a href="ident?i=file">file</a> * <a href="ident?i=file">file</a>;
<a name=L157 href="source/fs/read_write.c#L157">157</a>         <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=offset">offset</a>;
<a name=L158 href="source/fs/read_write.c#L158">158</a>         int fput_needed;
<a name=L159 href="source/fs/read_write.c#L159">159</a> 
<a name=L160 href="source/fs/read_write.c#L160">160</a>         retval = -<a href="ident?i=EBADF">EBADF</a>;
<a name=L161 href="source/fs/read_write.c#L161">161</a>         <a href="ident?i=file">file</a> = <a href="ident?i=fget_light">fget_light</a>(<a href="ident?i=fd">fd</a>, &amp;fput_needed);
<a name=L162 href="source/fs/read_write.c#L162">162</a>         if (!<a href="ident?i=file">file</a>)
<a name=L163 href="source/fs/read_write.c#L163">163</a>                 goto <a href="ident?i=bad">bad</a>;
<a name=L164 href="source/fs/read_write.c#L164">164</a> 
<a name=L165 href="source/fs/read_write.c#L165">165</a>         retval = -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L166 href="source/fs/read_write.c#L166">166</a>         if (<a href="ident?i=origin">origin</a> &gt; 2)
<a name=L167 href="source/fs/read_write.c#L167">167</a>                 goto out_putf;
<a name=L168 href="source/fs/read_write.c#L168">168</a> 
<a name=L169 href="source/fs/read_write.c#L169">169</a>         <a href="ident?i=offset">offset</a> = <a href="ident?i=vfs_llseek">vfs_llseek</a>(<a href="ident?i=file">file</a>, ((<a href="ident?i=loff_t">loff_t</a>) offset_high &lt;&lt; 32) | offset_low,
<a name=L170 href="source/fs/read_write.c#L170">170</a>                         <a href="ident?i=origin">origin</a>);
<a name=L171 href="source/fs/read_write.c#L171">171</a> 
<a name=L172 href="source/fs/read_write.c#L172">172</a>         retval = (int)<a href="ident?i=offset">offset</a>;
<a name=L173 href="source/fs/read_write.c#L173">173</a>         if (<a href="ident?i=offset">offset</a> &gt;= 0) {
<a name=L174 href="source/fs/read_write.c#L174">174</a>                 retval = -<a href="ident?i=EFAULT">EFAULT</a>;
<a name=L175 href="source/fs/read_write.c#L175">175</a>                 if (!<a href="ident?i=copy_to_user">copy_to_user</a>(<a href="ident?i=result">result</a>, &amp;<a href="ident?i=offset">offset</a>, sizeof(<a href="ident?i=offset">offset</a>)))
<a name=L176 href="source/fs/read_write.c#L176">176</a>                         retval = 0;
<a name=L177 href="source/fs/read_write.c#L177">177</a>         }
<a name=L178 href="source/fs/read_write.c#L178">178</a> out_putf:
<a name=L179 href="source/fs/read_write.c#L179">179</a>         <a href="ident?i=fput_light">fput_light</a>(<a href="ident?i=file">file</a>, fput_needed);
<a name=L180 href="source/fs/read_write.c#L180">180</a> <a href="ident?i=bad">bad</a>:
<a name=L181 href="source/fs/read_write.c#L181">181</a>         return retval;
<a name=L182 href="source/fs/read_write.c#L182">182</a> }
<a name=L183 href="source/fs/read_write.c#L183">183</a> #endif
<a name=L184 href="source/fs/read_write.c#L184">184</a> 
<a name=L185 href="source/fs/read_write.c#L185">185</a> 
<a name=L186 href="source/fs/read_write.c#L186">186</a> int <a href="ident?i=rw_verify_area">rw_verify_area</a>(int read_write, struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>, <a href="ident?i=loff_t">loff_t</a> *<a href="ident?i=ppos">ppos</a>, <a href="ident?i=size_t">size_t</a> <a href="ident?i=count">count</a>)
<a name=L187 href="source/fs/read_write.c#L187">187</a> {
<a name=L188 href="source/fs/read_write.c#L188">188</a>         struct <a href="ident?i=inode">inode</a> *<a href="ident?i=inode">inode</a>;
<a name=L189 href="source/fs/read_write.c#L189">189</a>         <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=pos">pos</a>;
<a name=L190 href="source/fs/read_write.c#L190">190</a> 
<a name=L191 href="source/fs/read_write.c#L191">191</a>         if (<a href="ident?i=unlikely">unlikely</a>(<a href="ident?i=count">count</a> &gt; <a href="ident?i=file">file</a>-&gt;f_maxcount))
<a name=L192 href="source/fs/read_write.c#L192">192</a>                 goto Einval;
<a name=L193 href="source/fs/read_write.c#L193">193</a>         <a href="ident?i=pos">pos</a> = *<a href="ident?i=ppos">ppos</a>;
<a name=L194 href="source/fs/read_write.c#L194">194</a>         if (<a href="ident?i=unlikely">unlikely</a>((<a href="ident?i=pos">pos</a> &lt; 0) || (<a href="ident?i=loff_t">loff_t</a>) (<a href="ident?i=pos">pos</a> + <a href="ident?i=count">count</a>) &lt; 0))
<a name=L195 href="source/fs/read_write.c#L195">195</a>                 goto Einval;
<a name=L196 href="source/fs/read_write.c#L196">196</a> 
<a name=L197 href="source/fs/read_write.c#L197">197</a>         <a href="ident?i=inode">inode</a> = <a href="ident?i=file">file</a>-&gt;f_dentry-&gt;d_inode;
<a name=L198 href="source/fs/read_write.c#L198">198</a>         if (<a href="ident?i=inode">inode</a>-&gt;i_flock &amp;&amp; <a href="ident?i=MANDATORY_LOCK">MANDATORY_LOCK</a>(<a href="ident?i=inode">inode</a>))
<a name=L199 href="source/fs/read_write.c#L199">199</a>                 return <a href="ident?i=locks_mandatory_area">locks_mandatory_area</a>(read_write == <a href="ident?i=READ">READ</a> ? <a href="ident?i=FLOCK_VERIFY_READ">FLOCK_VERIFY_READ</a> : <a href="ident?i=FLOCK_VERIFY_WRITE">FLOCK_VERIFY_WRITE</a>, <a href="ident?i=inode">inode</a>, <a href="ident?i=file">file</a>, <a href="ident?i=pos">pos</a>, <a href="ident?i=count">count</a>);
<a name=L200 href="source/fs/read_write.c#L200">200</a>         return 0;
<a name=L201 href="source/fs/read_write.c#L201">201</a> 
<a name=L202 href="source/fs/read_write.c#L202">202</a> Einval:
<a name=L203 href="source/fs/read_write.c#L203">203</a>         return -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L204 href="source/fs/read_write.c#L204">204</a> }
<a name=L205 href="source/fs/read_write.c#L205">205</a> 
<a name=L206 href="source/fs/read_write.c#L206">206</a> <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=do_sync_read">do_sync_read</a>(struct <a href="ident?i=file">file</a> *<a href="ident?i=filp">filp</a>, char <a href="ident?i=__user">__user</a> *<a href="ident?i=buf">buf</a>, <a href="ident?i=size_t">size_t</a> <a href="ident?i=len">len</a>, <a href="ident?i=loff_t">loff_t</a> *<a href="ident?i=ppos">ppos</a>)
<a name=L207 href="source/fs/read_write.c#L207">207</a> {
<a name=L208 href="source/fs/read_write.c#L208">208</a>         struct <a href="ident?i=kiocb">kiocb</a> <a href="ident?i=kiocb">kiocb</a>;
<a name=L209 href="source/fs/read_write.c#L209">209</a>         <a href="ident?i=ssize_t">ssize_t</a> ret;
<a name=L210 href="source/fs/read_write.c#L210">210</a> 
<a name=L211 href="source/fs/read_write.c#L211">211</a>         <a href="ident?i=init_sync_kiocb">init_sync_kiocb</a>(&amp;<a href="ident?i=kiocb">kiocb</a>, <a href="ident?i=filp">filp</a>);
<a name=L212 href="source/fs/read_write.c#L212">212</a>         <a href="ident?i=kiocb">kiocb</a>.ki_pos = *<a href="ident?i=ppos">ppos</a>;
<a name=L213 href="source/fs/read_write.c#L213">213</a>         ret = <a href="ident?i=filp">filp</a>-&gt;f_op-&gt;aio_read(&amp;<a href="ident?i=kiocb">kiocb</a>, <a href="ident?i=buf">buf</a>, <a href="ident?i=len">len</a>, <a href="ident?i=kiocb">kiocb</a>.ki_pos);
<a name=L214 href="source/fs/read_write.c#L214">214</a>         if (-<a href="ident?i=EIOCBQUEUED">EIOCBQUEUED</a> == ret)
<a name=L215 href="source/fs/read_write.c#L215">215</a>                 ret = <a href="ident?i=wait_on_sync_kiocb">wait_on_sync_kiocb</a>(&amp;<a href="ident?i=kiocb">kiocb</a>);
<a name=L216 href="source/fs/read_write.c#L216">216</a>         *<a href="ident?i=ppos">ppos</a> = <a href="ident?i=kiocb">kiocb</a>.ki_pos;
<a name=L217 href="source/fs/read_write.c#L217">217</a>         return ret;
<a name=L218 href="source/fs/read_write.c#L218">218</a> }
<a name=L219 href="source/fs/read_write.c#L219">219</a> 
<a name=L220 href="source/fs/read_write.c#L220">220</a> <a href="ident?i=EXPORT_SYMBOL">EXPORT_SYMBOL</a>(<a href="ident?i=do_sync_read">do_sync_read</a>);
<a name=L221 href="source/fs/read_write.c#L221">221</a> 
<a name=L222 href="source/fs/read_write.c#L222">222</a> <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=vfs_read">vfs_read</a>(struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>, char <a href="ident?i=__user">__user</a> *<a href="ident?i=buf">buf</a>, <a href="ident?i=size_t">size_t</a> <a href="ident?i=count">count</a>, <a href="ident?i=loff_t">loff_t</a> *<a href="ident?i=pos">pos</a>)
<a name=L223 href="source/fs/read_write.c#L223">223</a> {
<a name=L224 href="source/fs/read_write.c#L224">224</a>         <a href="ident?i=ssize_t">ssize_t</a> ret;
<a name=L225 href="source/fs/read_write.c#L225">225</a> 
<a name=L226 href="source/fs/read_write.c#L226">226</a>         if (!(<a href="ident?i=file">file</a>-&gt;f_mode &amp; <a href="ident?i=FMODE_READ">FMODE_READ</a>))
<a name=L227 href="source/fs/read_write.c#L227">227</a>                 return -<a href="ident?i=EBADF">EBADF</a>;
<a name=L228 href="source/fs/read_write.c#L228">228</a>         if (!<a href="ident?i=file">file</a>-&gt;f_op || (!<a href="ident?i=file">file</a>-&gt;f_op-&gt;<a href="ident?i=read">read</a> &amp;&amp; !<a href="ident?i=file">file</a>-&gt;f_op-&gt;aio_read))
<a name=L229 href="source/fs/read_write.c#L229">229</a>                 return -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L230 href="source/fs/read_write.c#L230">230</a>         if (<a href="ident?i=unlikely">unlikely</a>(!<a href="ident?i=access_ok">access_ok</a>(<a href="ident?i=VERIFY_WRITE">VERIFY_WRITE</a>, <a href="ident?i=buf">buf</a>, <a href="ident?i=count">count</a>)))
<a name=L231 href="source/fs/read_write.c#L231">231</a>                 return -<a href="ident?i=EFAULT">EFAULT</a>;
<a name=L232 href="source/fs/read_write.c#L232">232</a> 
<a name=L233 href="source/fs/read_write.c#L233">233</a>         ret = <a href="ident?i=rw_verify_area">rw_verify_area</a>(<a href="ident?i=READ">READ</a>, <a href="ident?i=file">file</a>, <a href="ident?i=pos">pos</a>, <a href="ident?i=count">count</a>);
<a name=L234 href="source/fs/read_write.c#L234">234</a>         if (!ret) {
<a name=L235 href="source/fs/read_write.c#L235">235</a>                 ret = <a href="ident?i=security_file_permission">security_file_permission</a> (<a href="ident?i=file">file</a>, <a href="ident?i=MAY_READ">MAY_READ</a>);
<a name=L236 href="source/fs/read_write.c#L236">236</a>                 if (!ret) {
<a name=L237 href="source/fs/read_write.c#L237">237</a>                         if (<a href="ident?i=file">file</a>-&gt;f_op-&gt;<a href="ident?i=read">read</a>)
<a name=L238 href="source/fs/read_write.c#L238">238</a>                                 ret = <a href="ident?i=file">file</a>-&gt;f_op-&gt;<a href="ident?i=read">read</a>(<a href="ident?i=file">file</a>, <a href="ident?i=buf">buf</a>, <a href="ident?i=count">count</a>, <a href="ident?i=pos">pos</a>);
<a name=L239 href="source/fs/read_write.c#L239">239</a>                         else
<a name=L240 href="source/fs/read_write.c#L240">240</a>                                 ret = <a href="ident?i=do_sync_read">do_sync_read</a>(<a href="ident?i=file">file</a>, <a href="ident?i=buf">buf</a>, <a href="ident?i=count">count</a>, <a href="ident?i=pos">pos</a>);
<a name=L241 href="source/fs/read_write.c#L241">241</a>                         if (ret &gt; 0) {
<a name=L242 href="source/fs/read_write.c#L242">242</a>                                 <a href="ident?i=dnotify_parent">dnotify_parent</a>(<a href="ident?i=file">file</a>-&gt;f_dentry, <a href="ident?i=DN_ACCESS">DN_ACCESS</a>);
<a name=L243 href="source/fs/read_write.c#L243">243</a>                                 <a href="ident?i=current">current</a>-&gt;rchar += ret;
<a name=L244 href="source/fs/read_write.c#L244">244</a>                         }
<a name=L245 href="source/fs/read_write.c#L245">245</a>                         <a href="ident?i=current">current</a>-&gt;syscr++;
<a name=L246 href="source/fs/read_write.c#L246">246</a>                 }
<a name=L247 href="source/fs/read_write.c#L247">247</a>         }
<a name=L248 href="source/fs/read_write.c#L248">248</a> 
<a name=L249 href="source/fs/read_write.c#L249">249</a>         return ret;
<a name=L250 href="source/fs/read_write.c#L250">250</a> }
<a name=L251 href="source/fs/read_write.c#L251">251</a> 
<a name=L252 href="source/fs/read_write.c#L252">252</a> <a href="ident?i=EXPORT_SYMBOL">EXPORT_SYMBOL</a>(<a href="ident?i=vfs_read">vfs_read</a>);
<a name=L253 href="source/fs/read_write.c#L253">253</a> 
<a name=L254 href="source/fs/read_write.c#L254">254</a> <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=do_sync_write">do_sync_write</a>(struct <a href="ident?i=file">file</a> *<a href="ident?i=filp">filp</a>, const char <a href="ident?i=__user">__user</a> *<a href="ident?i=buf">buf</a>, <a href="ident?i=size_t">size_t</a> <a href="ident?i=len">len</a>, <a href="ident?i=loff_t">loff_t</a> *<a href="ident?i=ppos">ppos</a>)
<a name=L255 href="source/fs/read_write.c#L255">255</a> {
<a name=L256 href="source/fs/read_write.c#L256">256</a>         struct <a href="ident?i=kiocb">kiocb</a> <a href="ident?i=kiocb">kiocb</a>;
<a name=L257 href="source/fs/read_write.c#L257">257</a>         <a href="ident?i=ssize_t">ssize_t</a> ret;
<a name=L258 href="source/fs/read_write.c#L258">258</a> 
<a name=L259 href="source/fs/read_write.c#L259">259</a>         <a href="ident?i=init_sync_kiocb">init_sync_kiocb</a>(&amp;<a href="ident?i=kiocb">kiocb</a>, <a href="ident?i=filp">filp</a>);
<a name=L260 href="source/fs/read_write.c#L260">260</a>         <a href="ident?i=kiocb">kiocb</a>.ki_pos = *<a href="ident?i=ppos">ppos</a>;
<a name=L261 href="source/fs/read_write.c#L261">261</a>         ret = <a href="ident?i=filp">filp</a>-&gt;f_op-&gt;aio_write(&amp;<a href="ident?i=kiocb">kiocb</a>, <a href="ident?i=buf">buf</a>, <a href="ident?i=len">len</a>, <a href="ident?i=kiocb">kiocb</a>.ki_pos);
<a name=L262 href="source/fs/read_write.c#L262">262</a>         if (-<a href="ident?i=EIOCBQUEUED">EIOCBQUEUED</a> == ret)
<a name=L263 href="source/fs/read_write.c#L263">263</a>                 ret = <a href="ident?i=wait_on_sync_kiocb">wait_on_sync_kiocb</a>(&amp;<a href="ident?i=kiocb">kiocb</a>);
<a name=L264 href="source/fs/read_write.c#L264">264</a>         *<a href="ident?i=ppos">ppos</a> = <a href="ident?i=kiocb">kiocb</a>.ki_pos;
<a name=L265 href="source/fs/read_write.c#L265">265</a>         return ret;
<a name=L266 href="source/fs/read_write.c#L266">266</a> }
<a name=L267 href="source/fs/read_write.c#L267">267</a> 
<a name=L268 href="source/fs/read_write.c#L268">268</a> <a href="ident?i=EXPORT_SYMBOL">EXPORT_SYMBOL</a>(<a href="ident?i=do_sync_write">do_sync_write</a>);
<a name=L269 href="source/fs/read_write.c#L269">269</a> 
<a name=L270 href="source/fs/read_write.c#L270">270</a> <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=vfs_write">vfs_write</a>(struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>, const char <a href="ident?i=__user">__user</a> *<a href="ident?i=buf">buf</a>, <a href="ident?i=size_t">size_t</a> <a href="ident?i=count">count</a>, <a href="ident?i=loff_t">loff_t</a> *<a href="ident?i=pos">pos</a>)
<a name=L271 href="source/fs/read_write.c#L271">271</a> {
<a name=L272 href="source/fs/read_write.c#L272">272</a>         <a href="ident?i=ssize_t">ssize_t</a> ret;
<a name=L273 href="source/fs/read_write.c#L273">273</a> 
<a name=L274 href="source/fs/read_write.c#L274">274</a>         if (!(<a href="ident?i=file">file</a>-&gt;f_mode &amp; <a href="ident?i=FMODE_WRITE">FMODE_WRITE</a>))
<a name=L275 href="source/fs/read_write.c#L275">275</a>                 return -<a href="ident?i=EBADF">EBADF</a>;
<a name=L276 href="source/fs/read_write.c#L276">276</a>         if (!<a href="ident?i=file">file</a>-&gt;f_op || (!<a href="ident?i=file">file</a>-&gt;f_op-&gt;<a href="ident?i=write">write</a> &amp;&amp; !<a href="ident?i=file">file</a>-&gt;f_op-&gt;aio_write))
<a name=L277 href="source/fs/read_write.c#L277">277</a>                 return -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L278 href="source/fs/read_write.c#L278">278</a>         if (<a href="ident?i=unlikely">unlikely</a>(!<a href="ident?i=access_ok">access_ok</a>(<a href="ident?i=VERIFY_READ">VERIFY_READ</a>, <a href="ident?i=buf">buf</a>, <a href="ident?i=count">count</a>)))
<a name=L279 href="source/fs/read_write.c#L279">279</a>                 return -<a href="ident?i=EFAULT">EFAULT</a>;
<a name=L280 href="source/fs/read_write.c#L280">280</a> 
<a name=L281 href="source/fs/read_write.c#L281">281</a>         ret = <a href="ident?i=rw_verify_area">rw_verify_area</a>(<a href="ident?i=WRITE">WRITE</a>, <a href="ident?i=file">file</a>, <a href="ident?i=pos">pos</a>, <a href="ident?i=count">count</a>);
<a name=L282 href="source/fs/read_write.c#L282">282</a>         if (!ret) {
<a name=L283 href="source/fs/read_write.c#L283">283</a>                 ret = <a href="ident?i=security_file_permission">security_file_permission</a> (<a href="ident?i=file">file</a>, <a href="ident?i=MAY_WRITE">MAY_WRITE</a>);
<a name=L284 href="source/fs/read_write.c#L284">284</a>                 if (!ret) {
<a name=L285 href="source/fs/read_write.c#L285">285</a>                         if (<a href="ident?i=file">file</a>-&gt;f_op-&gt;<a href="ident?i=write">write</a>)
<a name=L286 href="source/fs/read_write.c#L286">286</a>                                 ret = <a href="ident?i=file">file</a>-&gt;f_op-&gt;<a href="ident?i=write">write</a>(<a href="ident?i=file">file</a>, <a href="ident?i=buf">buf</a>, <a href="ident?i=count">count</a>, <a href="ident?i=pos">pos</a>);
<a name=L287 href="source/fs/read_write.c#L287">287</a>                         else
<a name=L288 href="source/fs/read_write.c#L288">288</a>                                 ret = <a href="ident?i=do_sync_write">do_sync_write</a>(<a href="ident?i=file">file</a>, <a href="ident?i=buf">buf</a>, <a href="ident?i=count">count</a>, <a href="ident?i=pos">pos</a>);
<a name=L289 href="source/fs/read_write.c#L289">289</a>                         if (ret &gt; 0) {
<a name=L290 href="source/fs/read_write.c#L290">290</a>                                 <a href="ident?i=dnotify_parent">dnotify_parent</a>(<a href="ident?i=file">file</a>-&gt;f_dentry, <a href="ident?i=DN_MODIFY">DN_MODIFY</a>);
<a name=L291 href="source/fs/read_write.c#L291">291</a>                                 <a href="ident?i=current">current</a>-&gt;wchar += ret;
<a name=L292 href="source/fs/read_write.c#L292">292</a>                         }
<a name=L293 href="source/fs/read_write.c#L293">293</a>                         <a href="ident?i=current">current</a>-&gt;syscw++;
<a name=L294 href="source/fs/read_write.c#L294">294</a>                 }
<a name=L295 href="source/fs/read_write.c#L295">295</a>         }
<a name=L296 href="source/fs/read_write.c#L296">296</a> 
<a name=L297 href="source/fs/read_write.c#L297">297</a>         return ret;
<a name=L298 href="source/fs/read_write.c#L298">298</a> }
<a name=L299 href="source/fs/read_write.c#L299">299</a> 
<a name=L300 href="source/fs/read_write.c#L300">300</a> <a href="ident?i=EXPORT_SYMBOL">EXPORT_SYMBOL</a>(<a href="ident?i=vfs_write">vfs_write</a>);
<a name=L301 href="source/fs/read_write.c#L301">301</a> 
<a name=L302 href="source/fs/read_write.c#L302">302</a> static inline <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=file_pos_read">file_pos_read</a>(struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>)
<a name=L303 href="source/fs/read_write.c#L303">303</a> {
<a name=L304 href="source/fs/read_write.c#L304">304</a>         return <a href="ident?i=file">file</a>-&gt;f_pos;
<a name=L305 href="source/fs/read_write.c#L305">305</a> }
<a name=L306 href="source/fs/read_write.c#L306">306</a> 
<a name=L307 href="source/fs/read_write.c#L307">307</a> static inline void <a href="ident?i=file_pos_write">file_pos_write</a>(struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>, <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=pos">pos</a>)
<a name=L308 href="source/fs/read_write.c#L308">308</a> {
<a name=L309 href="source/fs/read_write.c#L309">309</a>         <a href="ident?i=file">file</a>-&gt;f_pos = <a href="ident?i=pos">pos</a>;
<a name=L310 href="source/fs/read_write.c#L310">310</a> }
<a name=L311 href="source/fs/read_write.c#L311">311</a> 
<a name=L312 href="source/fs/read_write.c#L312">312</a> <a href="ident?i=asmlinkage">asmlinkage</a> <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=sys_read">sys_read</a>(unsigned int <a href="ident?i=fd">fd</a>, char <a href="ident?i=__user">__user</a> * <a href="ident?i=buf">buf</a>, <a href="ident?i=size_t">size_t</a> <a href="ident?i=count">count</a>)
<a name=L313 href="source/fs/read_write.c#L313">313</a> {
<a name=L314 href="source/fs/read_write.c#L314">314</a>         struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>;
<a name=L315 href="source/fs/read_write.c#L315">315</a>         <a href="ident?i=ssize_t">ssize_t</a> ret = -<a href="ident?i=EBADF">EBADF</a>;
<a name=L316 href="source/fs/read_write.c#L316">316</a>         int fput_needed;
<a name=L317 href="source/fs/read_write.c#L317">317</a> 
<a name=L318 href="source/fs/read_write.c#L318">318</a>         <a href="ident?i=file">file</a> = <a href="ident?i=fget_light">fget_light</a>(<a href="ident?i=fd">fd</a>, &amp;fput_needed);
<a name=L319 href="source/fs/read_write.c#L319">319</a>         if (<a href="ident?i=file">file</a>) {
<a name=L320 href="source/fs/read_write.c#L320">320</a>                 <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=pos">pos</a> = <a href="ident?i=file_pos_read">file_pos_read</a>(<a href="ident?i=file">file</a>);
<a name=L321 href="source/fs/read_write.c#L321">321</a>                 ret = <a href="ident?i=vfs_read">vfs_read</a>(<a href="ident?i=file">file</a>, <a href="ident?i=buf">buf</a>, <a href="ident?i=count">count</a>, &amp;<a href="ident?i=pos">pos</a>);
<a name=L322 href="source/fs/read_write.c#L322">322</a>                 <a href="ident?i=file_pos_write">file_pos_write</a>(<a href="ident?i=file">file</a>, <a href="ident?i=pos">pos</a>);
<a name=L323 href="source/fs/read_write.c#L323">323</a>                 <a href="ident?i=fput_light">fput_light</a>(<a href="ident?i=file">file</a>, fput_needed);
<a name=L324 href="source/fs/read_write.c#L324">324</a>         }
<a name=L325 href="source/fs/read_write.c#L325">325</a> 
<a name=L326 href="source/fs/read_write.c#L326">326</a>         return ret;
<a name=L327 href="source/fs/read_write.c#L327">327</a> }
<a name=L328 href="source/fs/read_write.c#L328">328</a> <a href="ident?i=EXPORT_SYMBOL_GPL">EXPORT_SYMBOL_GPL</a>(<a href="ident?i=sys_read">sys_read</a>);
<a name=L329 href="source/fs/read_write.c#L329">329</a> 
<a name=L330 href="source/fs/read_write.c#L330">330</a> <a href="ident?i=asmlinkage">asmlinkage</a> <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=sys_write">sys_write</a>(unsigned int <a href="ident?i=fd">fd</a>, const char <a href="ident?i=__user">__user</a> * <a href="ident?i=buf">buf</a>, <a href="ident?i=size_t">size_t</a> <a href="ident?i=count">count</a>)
<a name=L331 href="source/fs/read_write.c#L331">331</a> {
<a name=L332 href="source/fs/read_write.c#L332">332</a>         struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>;
<a name=L333 href="source/fs/read_write.c#L333">333</a>         <a href="ident?i=ssize_t">ssize_t</a> ret = -<a href="ident?i=EBADF">EBADF</a>;
<a name=L334 href="source/fs/read_write.c#L334">334</a>         int fput_needed;
<a name=L335 href="source/fs/read_write.c#L335">335</a> 
<a name=L336 href="source/fs/read_write.c#L336">336</a>         <a href="ident?i=file">file</a> = <a href="ident?i=fget_light">fget_light</a>(<a href="ident?i=fd">fd</a>, &amp;fput_needed);
<a name=L337 href="source/fs/read_write.c#L337">337</a>         if (<a href="ident?i=file">file</a>) {
<a name=L338 href="source/fs/read_write.c#L338">338</a>                 <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=pos">pos</a> = <a href="ident?i=file_pos_read">file_pos_read</a>(<a href="ident?i=file">file</a>);
<a name=L339 href="source/fs/read_write.c#L339">339</a>                 ret = <a href="ident?i=vfs_write">vfs_write</a>(<a href="ident?i=file">file</a>, <a href="ident?i=buf">buf</a>, <a href="ident?i=count">count</a>, &amp;<a href="ident?i=pos">pos</a>);
<a name=L340 href="source/fs/read_write.c#L340">340</a>                 <a href="ident?i=file_pos_write">file_pos_write</a>(<a href="ident?i=file">file</a>, <a href="ident?i=pos">pos</a>);
<a name=L341 href="source/fs/read_write.c#L341">341</a>                 <a href="ident?i=fput_light">fput_light</a>(<a href="ident?i=file">file</a>, fput_needed);
<a name=L342 href="source/fs/read_write.c#L342">342</a>         }
<a name=L343 href="source/fs/read_write.c#L343">343</a> 
<a name=L344 href="source/fs/read_write.c#L344">344</a>         return ret;
<a name=L345 href="source/fs/read_write.c#L345">345</a> }
<a name=L346 href="source/fs/read_write.c#L346">346</a> 
<a name=L347 href="source/fs/read_write.c#L347">347</a> <a href="ident?i=asmlinkage">asmlinkage</a> <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=sys_pread64">sys_pread64</a>(unsigned int <a href="ident?i=fd">fd</a>, char <a href="ident?i=__user">__user</a> *<a href="ident?i=buf">buf</a>,
<a name=L348 href="source/fs/read_write.c#L348">348</a>                              <a href="ident?i=size_t">size_t</a> <a href="ident?i=count">count</a>, <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=pos">pos</a>)
<a name=L349 href="source/fs/read_write.c#L349">349</a> {
<a name=L350 href="source/fs/read_write.c#L350">350</a>         struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>;
<a name=L351 href="source/fs/read_write.c#L351">351</a>         <a href="ident?i=ssize_t">ssize_t</a> ret = -<a href="ident?i=EBADF">EBADF</a>;
<a name=L352 href="source/fs/read_write.c#L352">352</a>         int fput_needed;
<a name=L353 href="source/fs/read_write.c#L353">353</a> 
<a name=L354 href="source/fs/read_write.c#L354">354</a>         if (<a href="ident?i=pos">pos</a> &lt; 0)
<a name=L355 href="source/fs/read_write.c#L355">355</a>                 return -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L356 href="source/fs/read_write.c#L356">356</a> 
<a name=L357 href="source/fs/read_write.c#L357">357</a>         <a href="ident?i=file">file</a> = <a href="ident?i=fget_light">fget_light</a>(<a href="ident?i=fd">fd</a>, &amp;fput_needed);
<a name=L358 href="source/fs/read_write.c#L358">358</a>         if (<a href="ident?i=file">file</a>) {
<a name=L359 href="source/fs/read_write.c#L359">359</a>                 ret = -<a href="ident?i=ESPIPE">ESPIPE</a>;
<a name=L360 href="source/fs/read_write.c#L360">360</a>                 if (<a href="ident?i=file">file</a>-&gt;f_mode &amp; <a href="ident?i=FMODE_PREAD">FMODE_PREAD</a>)
<a name=L361 href="source/fs/read_write.c#L361">361</a>                         ret = <a href="ident?i=vfs_read">vfs_read</a>(<a href="ident?i=file">file</a>, <a href="ident?i=buf">buf</a>, <a href="ident?i=count">count</a>, &amp;<a href="ident?i=pos">pos</a>);
<a name=L362 href="source/fs/read_write.c#L362">362</a>                 <a href="ident?i=fput_light">fput_light</a>(<a href="ident?i=file">file</a>, fput_needed);
<a name=L363 href="source/fs/read_write.c#L363">363</a>         }
<a name=L364 href="source/fs/read_write.c#L364">364</a> 
<a name=L365 href="source/fs/read_write.c#L365">365</a>         return ret;
<a name=L366 href="source/fs/read_write.c#L366">366</a> }
<a name=L367 href="source/fs/read_write.c#L367">367</a> 
<a name=L368 href="source/fs/read_write.c#L368">368</a> <a href="ident?i=asmlinkage">asmlinkage</a> <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=sys_pwrite64">sys_pwrite64</a>(unsigned int <a href="ident?i=fd">fd</a>, const char <a href="ident?i=__user">__user</a> *<a href="ident?i=buf">buf</a>,
<a name=L369 href="source/fs/read_write.c#L369">369</a>                               <a href="ident?i=size_t">size_t</a> <a href="ident?i=count">count</a>, <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=pos">pos</a>)
<a name=L370 href="source/fs/read_write.c#L370">370</a> {
<a name=L371 href="source/fs/read_write.c#L371">371</a>         struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>;
<a name=L372 href="source/fs/read_write.c#L372">372</a>         <a href="ident?i=ssize_t">ssize_t</a> ret = -<a href="ident?i=EBADF">EBADF</a>;
<a name=L373 href="source/fs/read_write.c#L373">373</a>         int fput_needed;
<a name=L374 href="source/fs/read_write.c#L374">374</a> 
<a name=L375 href="source/fs/read_write.c#L375">375</a>         if (<a href="ident?i=pos">pos</a> &lt; 0)
<a name=L376 href="source/fs/read_write.c#L376">376</a>                 return -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L377 href="source/fs/read_write.c#L377">377</a> 
<a name=L378 href="source/fs/read_write.c#L378">378</a>         <a href="ident?i=file">file</a> = <a href="ident?i=fget_light">fget_light</a>(<a href="ident?i=fd">fd</a>, &amp;fput_needed);
<a name=L379 href="source/fs/read_write.c#L379">379</a>         if (<a href="ident?i=file">file</a>) {
<a name=L380 href="source/fs/read_write.c#L380">380</a>                 ret = -<a href="ident?i=ESPIPE">ESPIPE</a>;
<a name=L381 href="source/fs/read_write.c#L381">381</a>                 if (<a href="ident?i=file">file</a>-&gt;f_mode &amp; <a href="ident?i=FMODE_PWRITE">FMODE_PWRITE</a>)  
<a name=L382 href="source/fs/read_write.c#L382">382</a>                         ret = <a href="ident?i=vfs_write">vfs_write</a>(<a href="ident?i=file">file</a>, <a href="ident?i=buf">buf</a>, <a href="ident?i=count">count</a>, &amp;<a href="ident?i=pos">pos</a>);
<a name=L383 href="source/fs/read_write.c#L383">383</a>                 <a href="ident?i=fput_light">fput_light</a>(<a href="ident?i=file">file</a>, fput_needed);
<a name=L384 href="source/fs/read_write.c#L384">384</a>         }
<a name=L385 href="source/fs/read_write.c#L385">385</a> 
<a name=L386 href="source/fs/read_write.c#L386">386</a>         return ret;
<a name=L387 href="source/fs/read_write.c#L387">387</a> }
<a name=L388 href="source/fs/read_write.c#L388">388</a> 
<a name=L389 href="source/fs/read_write.c#L389">389</a> <b><i>/*</i></b>
<a name=L390 href="source/fs/read_write.c#L390">390</a> <b><i> * Reduce an iovec's length in-place.  Return the resulting number of segments</i></b>
<a name=L391 href="source/fs/read_write.c#L391">391</a> <b><i> */</i></b>
<a name=L392 href="source/fs/read_write.c#L392">392</a> unsigned long <a href="ident?i=iov_shorten">iov_shorten</a>(struct <a href="ident?i=iovec">iovec</a> *iov, unsigned long nr_segs, <a href="ident?i=size_t">size_t</a> to)
<a name=L393 href="source/fs/read_write.c#L393">393</a> {
<a name=L394 href="source/fs/read_write.c#L394">394</a>         unsigned long seg = 0;
<a name=L395 href="source/fs/read_write.c#L395">395</a>         <a href="ident?i=size_t">size_t</a> <a href="ident?i=len">len</a> = 0;
<a name=L396 href="source/fs/read_write.c#L396">396</a> 
<a name=L397 href="source/fs/read_write.c#L397">397</a>         while (seg &lt; nr_segs) {
<a name=L398 href="source/fs/read_write.c#L398">398</a>                 seg++;
<a name=L399 href="source/fs/read_write.c#L399">399</a>                 if (<a href="ident?i=len">len</a> + iov-&gt;iov_len &gt;= to) {
<a name=L400 href="source/fs/read_write.c#L400">400</a>                         iov-&gt;iov_len = to - <a href="ident?i=len">len</a>;
<a name=L401 href="source/fs/read_write.c#L401">401</a>                         break;
<a name=L402 href="source/fs/read_write.c#L402">402</a>                 }
<a name=L403 href="source/fs/read_write.c#L403">403</a>                 <a href="ident?i=len">len</a> += iov-&gt;iov_len;
<a name=L404 href="source/fs/read_write.c#L404">404</a>                 iov++;
<a name=L405 href="source/fs/read_write.c#L405">405</a>         }
<a name=L406 href="source/fs/read_write.c#L406">406</a>         return seg;
<a name=L407 href="source/fs/read_write.c#L407">407</a> }
<a name=L408 href="source/fs/read_write.c#L408">408</a> 
<a name=L409 href="source/fs/read_write.c#L409">409</a> <a href="ident?i=EXPORT_SYMBOL">EXPORT_SYMBOL</a>(<a href="ident?i=iov_shorten">iov_shorten</a>);
<a name=L410 href="source/fs/read_write.c#L410">410</a> 
<a name=L411 href="source/fs/read_write.c#L411">411</a> <b><i>/* A write operation does a read from user space and vice versa */</i></b>
<a name=L412 href="source/fs/read_write.c#L412">412</a> #define <a href="ident?i=vrfy_dir">vrfy_dir</a>(<a href="ident?i=type">type</a>) ((<a href="ident?i=type">type</a>) == <a href="ident?i=READ">READ</a> ? <a href="ident?i=VERIFY_WRITE">VERIFY_WRITE</a> : <a href="ident?i=VERIFY_READ">VERIFY_READ</a>)
<a name=L413 href="source/fs/read_write.c#L413">413</a> 
<a name=L414 href="source/fs/read_write.c#L414">414</a> static <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=do_readv_writev">do_readv_writev</a>(int <a href="ident?i=type">type</a>, struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>,
<a name=L415 href="source/fs/read_write.c#L415">415</a>                                const struct <a href="ident?i=iovec">iovec</a> <a href="ident?i=__user">__user</a> * uvector,
<a name=L416 href="source/fs/read_write.c#L416">416</a>                                unsigned long nr_segs, <a href="ident?i=loff_t">loff_t</a> *<a href="ident?i=pos">pos</a>)
<a name=L417 href="source/fs/read_write.c#L417">417</a> {
<a name=L418 href="source/fs/read_write.c#L418">418</a>         typedef <a href="ident?i=ssize_t">ssize_t</a> (*io_fn_t)(struct <a href="ident?i=file">file</a> *, char <a href="ident?i=__user">__user</a> *, <a href="ident?i=size_t">size_t</a>, <a href="ident?i=loff_t">loff_t</a> *);
<a name=L419 href="source/fs/read_write.c#L419">419</a>         typedef <a href="ident?i=ssize_t">ssize_t</a> (*iov_fn_t)(struct <a href="ident?i=file">file</a> *, const struct <a href="ident?i=iovec">iovec</a> *, unsigned long, <a href="ident?i=loff_t">loff_t</a> *);
<a name=L420 href="source/fs/read_write.c#L420">420</a> 
<a name=L421 href="source/fs/read_write.c#L421">421</a>         <a href="ident?i=size_t">size_t</a> tot_len;
<a name=L422 href="source/fs/read_write.c#L422">422</a>         struct <a href="ident?i=iovec">iovec</a> iovstack[<a href="ident?i=UIO_FASTIOV">UIO_FASTIOV</a>];
<a name=L423 href="source/fs/read_write.c#L423">423</a>         struct <a href="ident?i=iovec">iovec</a> *iov=iovstack, *<a href="ident?i=vector">vector</a>;
<a name=L424 href="source/fs/read_write.c#L424">424</a>         <a href="ident?i=ssize_t">ssize_t</a> ret;
<a name=L425 href="source/fs/read_write.c#L425">425</a>         int seg;
<a name=L426 href="source/fs/read_write.c#L426">426</a>         io_fn_t fn;
<a name=L427 href="source/fs/read_write.c#L427">427</a>         iov_fn_t fnv;
<a name=L428 href="source/fs/read_write.c#L428">428</a> 
<a name=L429 href="source/fs/read_write.c#L429">429</a>         <b><i>/*</i></b>
<a name=L430 href="source/fs/read_write.c#L430">430</a> <b><i>         * SuS says "The readv() function *may* fail if the iovcnt argument</i></b>
<a name=L431 href="source/fs/read_write.c#L431">431</a> <b><i>         * was less than or equal to 0, or greater than {IOV_MAX}.  Linux has</i></b>
<a name=L432 href="source/fs/read_write.c#L432">432</a> <b><i>         * traditionally returned zero for zero segments, so...</i></b>
<a name=L433 href="source/fs/read_write.c#L433">433</a> <b><i>         */</i></b>
<a name=L434 href="source/fs/read_write.c#L434">434</a>         ret = 0;
<a name=L435 href="source/fs/read_write.c#L435">435</a>         if (nr_segs == 0)
<a name=L436 href="source/fs/read_write.c#L436">436</a>                 goto <a href="ident?i=out">out</a>;
<a name=L437 href="source/fs/read_write.c#L437">437</a> 
<a name=L438 href="source/fs/read_write.c#L438">438</a>         <b><i>/*</i></b>
<a name=L439 href="source/fs/read_write.c#L439">439</a> <b><i>         * First get the "struct iovec" from user memory and</i></b>
<a name=L440 href="source/fs/read_write.c#L440">440</a> <b><i>         * verify all the pointers</i></b>
<a name=L441 href="source/fs/read_write.c#L441">441</a> <b><i>         */</i></b>
<a name=L442 href="source/fs/read_write.c#L442">442</a>         ret = -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L443 href="source/fs/read_write.c#L443">443</a>         if ((nr_segs &gt; <a href="ident?i=UIO_MAXIOV">UIO_MAXIOV</a>) || (nr_segs &lt;= 0))
<a name=L444 href="source/fs/read_write.c#L444">444</a>                 goto <a href="ident?i=out">out</a>;
<a name=L445 href="source/fs/read_write.c#L445">445</a>         if (!<a href="ident?i=file">file</a>-&gt;f_op)
<a name=L446 href="source/fs/read_write.c#L446">446</a>                 goto <a href="ident?i=out">out</a>;
<a name=L447 href="source/fs/read_write.c#L447">447</a>         if (nr_segs &gt; <a href="ident?i=UIO_FASTIOV">UIO_FASTIOV</a>) {
<a name=L448 href="source/fs/read_write.c#L448">448</a>                 ret = -<a href="ident?i=ENOMEM">ENOMEM</a>;
<a name=L449 href="source/fs/read_write.c#L449">449</a>                 iov = <a href="ident?i=kmalloc">kmalloc</a>(nr_segs*sizeof(struct <a href="ident?i=iovec">iovec</a>), <a href="ident?i=GFP_KERNEL">GFP_KERNEL</a>);
<a name=L450 href="source/fs/read_write.c#L450">450</a>                 if (!iov)
<a name=L451 href="source/fs/read_write.c#L451">451</a>                         goto <a href="ident?i=out">out</a>;
<a name=L452 href="source/fs/read_write.c#L452">452</a>         }
<a name=L453 href="source/fs/read_write.c#L453">453</a>         ret = -<a href="ident?i=EFAULT">EFAULT</a>;
<a name=L454 href="source/fs/read_write.c#L454">454</a>         if (<a href="ident?i=copy_from_user">copy_from_user</a>(iov, uvector, nr_segs*sizeof(*uvector)))
<a name=L455 href="source/fs/read_write.c#L455">455</a>                 goto <a href="ident?i=out">out</a>;
<a name=L456 href="source/fs/read_write.c#L456">456</a> 
<a name=L457 href="source/fs/read_write.c#L457">457</a>         <b><i>/*</i></b>
<a name=L458 href="source/fs/read_write.c#L458">458</a> <b><i>         * Single unix specification:</i></b>
<a name=L459 href="source/fs/read_write.c#L459">459</a> <b><i>         * We should -EINVAL if an element length is not &gt;= 0 and fitting an</i></b>
<a name=L460 href="source/fs/read_write.c#L460">460</a> <b><i>         * ssize_t.  The total length is fitting an ssize_t</i></b>
<a name=L461 href="source/fs/read_write.c#L461">461</a> <b><i>         *</i></b>
<a name=L462 href="source/fs/read_write.c#L462">462</a> <b><i>         * Be careful here because iov_len is a size_t not an ssize_t</i></b>
<a name=L463 href="source/fs/read_write.c#L463">463</a> <b><i>         */</i></b>
<a name=L464 href="source/fs/read_write.c#L464">464</a>         tot_len = 0;
<a name=L465 href="source/fs/read_write.c#L465">465</a>         ret = -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L466 href="source/fs/read_write.c#L466">466</a>         for (seg = 0; seg &lt; nr_segs; seg++) {
<a name=L467 href="source/fs/read_write.c#L467">467</a>                 void <a href="ident?i=__user">__user</a> *<a href="ident?i=buf">buf</a> = iov[seg].iov_base;
<a name=L468 href="source/fs/read_write.c#L468">468</a>                 <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=len">len</a> = (<a href="ident?i=ssize_t">ssize_t</a>)iov[seg].iov_len;
<a name=L469 href="source/fs/read_write.c#L469">469</a> 
<a name=L470 href="source/fs/read_write.c#L470">470</a>                 if (<a href="ident?i=unlikely">unlikely</a>(!<a href="ident?i=access_ok">access_ok</a>(<a href="ident?i=vrfy_dir">vrfy_dir</a>(<a href="ident?i=type">type</a>), <a href="ident?i=buf">buf</a>, <a href="ident?i=len">len</a>)))
<a name=L471 href="source/fs/read_write.c#L471">471</a>                         goto Efault;
<a name=L472 href="source/fs/read_write.c#L472">472</a>                 if (<a href="ident?i=len">len</a> &lt; 0)    <b><i>/* size_t not fitting an ssize_t .. */</i></b>
<a name=L473 href="source/fs/read_write.c#L473">473</a>                         goto <a href="ident?i=out">out</a>;
<a name=L474 href="source/fs/read_write.c#L474">474</a>                 tot_len += <a href="ident?i=len">len</a>;
<a name=L475 href="source/fs/read_write.c#L475">475</a>                 if ((<a href="ident?i=ssize_t">ssize_t</a>)tot_len &lt; 0) <b><i>/* maths overflow on the ssize_t */</i></b>
<a name=L476 href="source/fs/read_write.c#L476">476</a>                         goto <a href="ident?i=out">out</a>;
<a name=L477 href="source/fs/read_write.c#L477">477</a>         }
<a name=L478 href="source/fs/read_write.c#L478">478</a>         if (tot_len == 0) {
<a name=L479 href="source/fs/read_write.c#L479">479</a>                 ret = 0;
<a name=L480 href="source/fs/read_write.c#L480">480</a>                 goto <a href="ident?i=out">out</a>;
<a name=L481 href="source/fs/read_write.c#L481">481</a>         }
<a name=L482 href="source/fs/read_write.c#L482">482</a> 
<a name=L483 href="source/fs/read_write.c#L483">483</a>         ret = <a href="ident?i=rw_verify_area">rw_verify_area</a>(<a href="ident?i=type">type</a>, <a href="ident?i=file">file</a>, <a href="ident?i=pos">pos</a>, tot_len);
<a name=L484 href="source/fs/read_write.c#L484">484</a>         if (ret)
<a name=L485 href="source/fs/read_write.c#L485">485</a>                 goto <a href="ident?i=out">out</a>;
<a name=L486 href="source/fs/read_write.c#L486">486</a> 
<a name=L487 href="source/fs/read_write.c#L487">487</a>         fnv = <a href="ident?i=NULL">NULL</a>;
<a name=L488 href="source/fs/read_write.c#L488">488</a>         if (<a href="ident?i=type">type</a> == <a href="ident?i=READ">READ</a>) {
<a name=L489 href="source/fs/read_write.c#L489">489</a>                 fn = <a href="ident?i=file">file</a>-&gt;f_op-&gt;<a href="ident?i=read">read</a>;
<a name=L490 href="source/fs/read_write.c#L490">490</a>                 fnv = <a href="ident?i=file">file</a>-&gt;f_op-&gt;readv;
<a name=L491 href="source/fs/read_write.c#L491">491</a>         } else {
<a name=L492 href="source/fs/read_write.c#L492">492</a>                 fn = (io_fn_t)<a href="ident?i=file">file</a>-&gt;f_op-&gt;<a href="ident?i=write">write</a>;
<a name=L493 href="source/fs/read_write.c#L493">493</a>                 fnv = <a href="ident?i=file">file</a>-&gt;f_op-&gt;writev;
<a name=L494 href="source/fs/read_write.c#L494">494</a>         }
<a name=L495 href="source/fs/read_write.c#L495">495</a>         if (fnv) {
<a name=L496 href="source/fs/read_write.c#L496">496</a>                 ret = fnv(<a href="ident?i=file">file</a>, iov, nr_segs, <a href="ident?i=pos">pos</a>);
<a name=L497 href="source/fs/read_write.c#L497">497</a>                 goto <a href="ident?i=out">out</a>;
<a name=L498 href="source/fs/read_write.c#L498">498</a>         }
<a name=L499 href="source/fs/read_write.c#L499">499</a> 
<a name=L500 href="source/fs/read_write.c#L500">500</a>         <b><i>/* Do it by hand, with file-ops */</i></b>
<a name=L501 href="source/fs/read_write.c#L501">501</a>         ret = 0;
<a name=L502 href="source/fs/read_write.c#L502">502</a>         <a href="ident?i=vector">vector</a> = iov;
<a name=L503 href="source/fs/read_write.c#L503">503</a>         while (nr_segs &gt; 0) {
<a name=L504 href="source/fs/read_write.c#L504">504</a>                 void <a href="ident?i=__user">__user</a> * <a href="ident?i=base">base</a>;
<a name=L505 href="source/fs/read_write.c#L505">505</a>                 <a href="ident?i=size_t">size_t</a> <a href="ident?i=len">len</a>;
<a name=L506 href="source/fs/read_write.c#L506">506</a>                 <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=nr">nr</a>;
<a name=L507 href="source/fs/read_write.c#L507">507</a> 
<a name=L508 href="source/fs/read_write.c#L508">508</a>                 <a href="ident?i=base">base</a> = <a href="ident?i=vector">vector</a>-&gt;iov_base;
<a name=L509 href="source/fs/read_write.c#L509">509</a>                 <a href="ident?i=len">len</a> = <a href="ident?i=vector">vector</a>-&gt;iov_len;
<a name=L510 href="source/fs/read_write.c#L510">510</a>                 <a href="ident?i=vector">vector</a>++;
<a name=L511 href="source/fs/read_write.c#L511">511</a>                 nr_segs--;
<a name=L512 href="source/fs/read_write.c#L512">512</a> 
<a name=L513 href="source/fs/read_write.c#L513">513</a>                 <a href="ident?i=nr">nr</a> = fn(<a href="ident?i=file">file</a>, <a href="ident?i=base">base</a>, <a href="ident?i=len">len</a>, <a href="ident?i=pos">pos</a>);
<a name=L514 href="source/fs/read_write.c#L514">514</a> 
<a name=L515 href="source/fs/read_write.c#L515">515</a>                 if (<a href="ident?i=nr">nr</a> &lt; 0) {
<a name=L516 href="source/fs/read_write.c#L516">516</a>                         if (!ret) ret = <a href="ident?i=nr">nr</a>;
<a name=L517 href="source/fs/read_write.c#L517">517</a>                         break;
<a name=L518 href="source/fs/read_write.c#L518">518</a>                 }
<a name=L519 href="source/fs/read_write.c#L519">519</a>                 ret += <a href="ident?i=nr">nr</a>;
<a name=L520 href="source/fs/read_write.c#L520">520</a>                 if (<a href="ident?i=nr">nr</a> != <a href="ident?i=len">len</a>)
<a name=L521 href="source/fs/read_write.c#L521">521</a>                         break;
<a name=L522 href="source/fs/read_write.c#L522">522</a>         }
<a name=L523 href="source/fs/read_write.c#L523">523</a> <a href="ident?i=out">out</a>:
<a name=L524 href="source/fs/read_write.c#L524">524</a>         if (iov != iovstack)
<a name=L525 href="source/fs/read_write.c#L525">525</a>                 <a href="ident?i=kfree">kfree</a>(iov);
<a name=L526 href="source/fs/read_write.c#L526">526</a>         if ((ret + (<a href="ident?i=type">type</a> == <a href="ident?i=READ">READ</a>)) &gt; 0)
<a name=L527 href="source/fs/read_write.c#L527">527</a>                 <a href="ident?i=dnotify_parent">dnotify_parent</a>(<a href="ident?i=file">file</a>-&gt;f_dentry,
<a name=L528 href="source/fs/read_write.c#L528">528</a>                                 (<a href="ident?i=type">type</a> == <a href="ident?i=READ">READ</a>) ? <a href="ident?i=DN_ACCESS">DN_ACCESS</a> : <a href="ident?i=DN_MODIFY">DN_MODIFY</a>);
<a name=L529 href="source/fs/read_write.c#L529">529</a>         return ret;
<a name=L530 href="source/fs/read_write.c#L530">530</a> Efault:
<a name=L531 href="source/fs/read_write.c#L531">531</a>         ret = -<a href="ident?i=EFAULT">EFAULT</a>;
<a name=L532 href="source/fs/read_write.c#L532">532</a>         goto <a href="ident?i=out">out</a>;
<a name=L533 href="source/fs/read_write.c#L533">533</a> }
<a name=L534 href="source/fs/read_write.c#L534">534</a> 
<a name=L535 href="source/fs/read_write.c#L535">535</a> <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=vfs_readv">vfs_readv</a>(struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>, const struct <a href="ident?i=iovec">iovec</a> <a href="ident?i=__user">__user</a> *vec,
<a name=L536 href="source/fs/read_write.c#L536">536</a>                   unsigned long vlen, <a href="ident?i=loff_t">loff_t</a> *<a href="ident?i=pos">pos</a>)
<a name=L537 href="source/fs/read_write.c#L537">537</a> {
<a name=L538 href="source/fs/read_write.c#L538">538</a>         if (!(<a href="ident?i=file">file</a>-&gt;f_mode &amp; <a href="ident?i=FMODE_READ">FMODE_READ</a>))
<a name=L539 href="source/fs/read_write.c#L539">539</a>                 return -<a href="ident?i=EBADF">EBADF</a>;
<a name=L540 href="source/fs/read_write.c#L540">540</a>         if (!<a href="ident?i=file">file</a>-&gt;f_op || (!<a href="ident?i=file">file</a>-&gt;f_op-&gt;readv &amp;&amp; !<a href="ident?i=file">file</a>-&gt;f_op-&gt;<a href="ident?i=read">read</a>))
<a name=L541 href="source/fs/read_write.c#L541">541</a>                 return -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L542 href="source/fs/read_write.c#L542">542</a> 
<a name=L543 href="source/fs/read_write.c#L543">543</a>         return <a href="ident?i=do_readv_writev">do_readv_writev</a>(<a href="ident?i=READ">READ</a>, <a href="ident?i=file">file</a>, vec, vlen, <a href="ident?i=pos">pos</a>);
<a name=L544 href="source/fs/read_write.c#L544">544</a> }
<a name=L545 href="source/fs/read_write.c#L545">545</a> 
<a name=L546 href="source/fs/read_write.c#L546">546</a> <a href="ident?i=EXPORT_SYMBOL">EXPORT_SYMBOL</a>(<a href="ident?i=vfs_readv">vfs_readv</a>);
<a name=L547 href="source/fs/read_write.c#L547">547</a> 
<a name=L548 href="source/fs/read_write.c#L548">548</a> <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=vfs_writev">vfs_writev</a>(struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>, const struct <a href="ident?i=iovec">iovec</a> <a href="ident?i=__user">__user</a> *vec,
<a name=L549 href="source/fs/read_write.c#L549">549</a>                    unsigned long vlen, <a href="ident?i=loff_t">loff_t</a> *<a href="ident?i=pos">pos</a>)
<a name=L550 href="source/fs/read_write.c#L550">550</a> {
<a name=L551 href="source/fs/read_write.c#L551">551</a>         if (!(<a href="ident?i=file">file</a>-&gt;f_mode &amp; <a href="ident?i=FMODE_WRITE">FMODE_WRITE</a>))
<a name=L552 href="source/fs/read_write.c#L552">552</a>                 return -<a href="ident?i=EBADF">EBADF</a>;
<a name=L553 href="source/fs/read_write.c#L553">553</a>         if (!<a href="ident?i=file">file</a>-&gt;f_op || (!<a href="ident?i=file">file</a>-&gt;f_op-&gt;writev &amp;&amp; !<a href="ident?i=file">file</a>-&gt;f_op-&gt;<a href="ident?i=write">write</a>))
<a name=L554 href="source/fs/read_write.c#L554">554</a>                 return -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L555 href="source/fs/read_write.c#L555">555</a> 
<a name=L556 href="source/fs/read_write.c#L556">556</a>         return <a href="ident?i=do_readv_writev">do_readv_writev</a>(<a href="ident?i=WRITE">WRITE</a>, <a href="ident?i=file">file</a>, vec, vlen, <a href="ident?i=pos">pos</a>);
<a name=L557 href="source/fs/read_write.c#L557">557</a> }
<a name=L558 href="source/fs/read_write.c#L558">558</a> 
<a name=L559 href="source/fs/read_write.c#L559">559</a> <a href="ident?i=EXPORT_SYMBOL">EXPORT_SYMBOL</a>(<a href="ident?i=vfs_writev">vfs_writev</a>);
<a name=L560 href="source/fs/read_write.c#L560">560</a> 
<a name=L561 href="source/fs/read_write.c#L561">561</a> <a href="ident?i=asmlinkage">asmlinkage</a> <a href="ident?i=ssize_t">ssize_t</a>
<a name=L562 href="source/fs/read_write.c#L562">562</a> <a href="ident?i=sys_readv">sys_readv</a>(unsigned long <a href="ident?i=fd">fd</a>, const struct <a href="ident?i=iovec">iovec</a> <a href="ident?i=__user">__user</a> *vec, unsigned long vlen)
<a name=L563 href="source/fs/read_write.c#L563">563</a> {
<a name=L564 href="source/fs/read_write.c#L564">564</a>         struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>;
<a name=L565 href="source/fs/read_write.c#L565">565</a>         <a href="ident?i=ssize_t">ssize_t</a> ret = -<a href="ident?i=EBADF">EBADF</a>;
<a name=L566 href="source/fs/read_write.c#L566">566</a>         int fput_needed;
<a name=L567 href="source/fs/read_write.c#L567">567</a> 
<a name=L568 href="source/fs/read_write.c#L568">568</a>         <a href="ident?i=file">file</a> = <a href="ident?i=fget_light">fget_light</a>(<a href="ident?i=fd">fd</a>, &amp;fput_needed);
<a name=L569 href="source/fs/read_write.c#L569">569</a>         if (<a href="ident?i=file">file</a>) {
<a name=L570 href="source/fs/read_write.c#L570">570</a>                 <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=pos">pos</a> = <a href="ident?i=file_pos_read">file_pos_read</a>(<a href="ident?i=file">file</a>);
<a name=L571 href="source/fs/read_write.c#L571">571</a>                 ret = <a href="ident?i=vfs_readv">vfs_readv</a>(<a href="ident?i=file">file</a>, vec, vlen, &amp;<a href="ident?i=pos">pos</a>);
<a name=L572 href="source/fs/read_write.c#L572">572</a>                 <a href="ident?i=file_pos_write">file_pos_write</a>(<a href="ident?i=file">file</a>, <a href="ident?i=pos">pos</a>);
<a name=L573 href="source/fs/read_write.c#L573">573</a>                 <a href="ident?i=fput_light">fput_light</a>(<a href="ident?i=file">file</a>, fput_needed);
<a name=L574 href="source/fs/read_write.c#L574">574</a>         }
<a name=L575 href="source/fs/read_write.c#L575">575</a> 
<a name=L576 href="source/fs/read_write.c#L576">576</a>         if (ret &gt; 0)
<a name=L577 href="source/fs/read_write.c#L577">577</a>                 <a href="ident?i=current">current</a>-&gt;rchar += ret;
<a name=L578 href="source/fs/read_write.c#L578">578</a>         <a href="ident?i=current">current</a>-&gt;syscr++;
<a name=L579 href="source/fs/read_write.c#L579">579</a>         return ret;
<a name=L580 href="source/fs/read_write.c#L580">580</a> }
<a name=L581 href="source/fs/read_write.c#L581">581</a> 
<a name=L582 href="source/fs/read_write.c#L582">582</a> <a href="ident?i=asmlinkage">asmlinkage</a> <a href="ident?i=ssize_t">ssize_t</a>
<a name=L583 href="source/fs/read_write.c#L583">583</a> <a href="ident?i=sys_writev">sys_writev</a>(unsigned long <a href="ident?i=fd">fd</a>, const struct <a href="ident?i=iovec">iovec</a> <a href="ident?i=__user">__user</a> *vec, unsigned long vlen)
<a name=L584 href="source/fs/read_write.c#L584">584</a> {
<a name=L585 href="source/fs/read_write.c#L585">585</a>         struct <a href="ident?i=file">file</a> *<a href="ident?i=file">file</a>;
<a name=L586 href="source/fs/read_write.c#L586">586</a>         <a href="ident?i=ssize_t">ssize_t</a> ret = -<a href="ident?i=EBADF">EBADF</a>;
<a name=L587 href="source/fs/read_write.c#L587">587</a>         int fput_needed;
<a name=L588 href="source/fs/read_write.c#L588">588</a> 
<a name=L589 href="source/fs/read_write.c#L589">589</a>         <a href="ident?i=file">file</a> = <a href="ident?i=fget_light">fget_light</a>(<a href="ident?i=fd">fd</a>, &amp;fput_needed);
<a name=L590 href="source/fs/read_write.c#L590">590</a>         if (<a href="ident?i=file">file</a>) {
<a name=L591 href="source/fs/read_write.c#L591">591</a>                 <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=pos">pos</a> = <a href="ident?i=file_pos_read">file_pos_read</a>(<a href="ident?i=file">file</a>);
<a name=L592 href="source/fs/read_write.c#L592">592</a>                 ret = <a href="ident?i=vfs_writev">vfs_writev</a>(<a href="ident?i=file">file</a>, vec, vlen, &amp;<a href="ident?i=pos">pos</a>);
<a name=L593 href="source/fs/read_write.c#L593">593</a>                 <a href="ident?i=file_pos_write">file_pos_write</a>(<a href="ident?i=file">file</a>, <a href="ident?i=pos">pos</a>);
<a name=L594 href="source/fs/read_write.c#L594">594</a>                 <a href="ident?i=fput_light">fput_light</a>(<a href="ident?i=file">file</a>, fput_needed);
<a name=L595 href="source/fs/read_write.c#L595">595</a>         }
<a name=L596 href="source/fs/read_write.c#L596">596</a> 
<a name=L597 href="source/fs/read_write.c#L597">597</a>         if (ret &gt; 0)
<a name=L598 href="source/fs/read_write.c#L598">598</a>                 <a href="ident?i=current">current</a>-&gt;wchar += ret;
<a name=L599 href="source/fs/read_write.c#L599">599</a>         <a href="ident?i=current">current</a>-&gt;syscw++;
<a name=L600 href="source/fs/read_write.c#L600">600</a>         return ret;
<a name=L601 href="source/fs/read_write.c#L601">601</a> }
<a name=L602 href="source/fs/read_write.c#L602">602</a> 
<a name=L603 href="source/fs/read_write.c#L603">603</a> static <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=do_sendfile">do_sendfile</a>(int out_fd, int in_fd, <a href="ident?i=loff_t">loff_t</a> *<a href="ident?i=ppos">ppos</a>,
<a name=L604 href="source/fs/read_write.c#L604">604</a>                            <a href="ident?i=size_t">size_t</a> <a href="ident?i=count">count</a>, <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=max">max</a>)
<a name=L605 href="source/fs/read_write.c#L605">605</a> {
<a name=L606 href="source/fs/read_write.c#L606">606</a>         struct <a href="ident?i=file">file</a> * in_file, * out_file;
<a name=L607 href="source/fs/read_write.c#L607">607</a>         struct <a href="ident?i=inode">inode</a> * in_inode, * out_inode;
<a name=L608 href="source/fs/read_write.c#L608">608</a>         <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=pos">pos</a>;
<a name=L609 href="source/fs/read_write.c#L609">609</a>         <a href="ident?i=ssize_t">ssize_t</a> retval;
<a name=L610 href="source/fs/read_write.c#L610">610</a>         int fput_needed_in, fput_needed_out;
<a name=L611 href="source/fs/read_write.c#L611">611</a> 
<a name=L612 href="source/fs/read_write.c#L612">612</a>         <b><i>/*</i></b>
<a name=L613 href="source/fs/read_write.c#L613">613</a> <b><i>         * Get input file, and verify that it is ok..</i></b>
<a name=L614 href="source/fs/read_write.c#L614">614</a> <b><i>         */</i></b>
<a name=L615 href="source/fs/read_write.c#L615">615</a>         retval = -<a href="ident?i=EBADF">EBADF</a>;
<a name=L616 href="source/fs/read_write.c#L616">616</a>         in_file = <a href="ident?i=fget_light">fget_light</a>(in_fd, &amp;fput_needed_in);
<a name=L617 href="source/fs/read_write.c#L617">617</a>         if (!in_file)
<a name=L618 href="source/fs/read_write.c#L618">618</a>                 goto <a href="ident?i=out">out</a>;
<a name=L619 href="source/fs/read_write.c#L619">619</a>         if (!(in_file-&gt;f_mode &amp; <a href="ident?i=FMODE_READ">FMODE_READ</a>))
<a name=L620 href="source/fs/read_write.c#L620">620</a>                 goto fput_in;
<a name=L621 href="source/fs/read_write.c#L621">621</a>         retval = -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L622 href="source/fs/read_write.c#L622">622</a>         in_inode = in_file-&gt;f_dentry-&gt;d_inode;
<a name=L623 href="source/fs/read_write.c#L623">623</a>         if (!in_inode)
<a name=L624 href="source/fs/read_write.c#L624">624</a>                 goto fput_in;
<a name=L625 href="source/fs/read_write.c#L625">625</a>         if (!in_file-&gt;f_op || !in_file-&gt;f_op-&gt;sendfile)
<a name=L626 href="source/fs/read_write.c#L626">626</a>                 goto fput_in;
<a name=L627 href="source/fs/read_write.c#L627">627</a>         retval = -<a href="ident?i=ESPIPE">ESPIPE</a>;
<a name=L628 href="source/fs/read_write.c#L628">628</a>         if (!<a href="ident?i=ppos">ppos</a>)
<a name=L629 href="source/fs/read_write.c#L629">629</a>                 <a href="ident?i=ppos">ppos</a> = &amp;in_file-&gt;f_pos;
<a name=L630 href="source/fs/read_write.c#L630">630</a>         else
<a name=L631 href="source/fs/read_write.c#L631">631</a>                 if (!(in_file-&gt;f_mode &amp; <a href="ident?i=FMODE_PREAD">FMODE_PREAD</a>))
<a name=L632 href="source/fs/read_write.c#L632">632</a>                         goto fput_in;
<a name=L633 href="source/fs/read_write.c#L633">633</a>         retval = <a href="ident?i=rw_verify_area">rw_verify_area</a>(<a href="ident?i=READ">READ</a>, in_file, <a href="ident?i=ppos">ppos</a>, <a href="ident?i=count">count</a>);
<a name=L634 href="source/fs/read_write.c#L634">634</a>         if (retval)
<a name=L635 href="source/fs/read_write.c#L635">635</a>                 goto fput_in;
<a name=L636 href="source/fs/read_write.c#L636">636</a> 
<a name=L637 href="source/fs/read_write.c#L637">637</a>         retval = <a href="ident?i=security_file_permission">security_file_permission</a> (in_file, <a href="ident?i=MAY_READ">MAY_READ</a>);
<a name=L638 href="source/fs/read_write.c#L638">638</a>         if (retval)
<a name=L639 href="source/fs/read_write.c#L639">639</a>                 goto fput_in;
<a name=L640 href="source/fs/read_write.c#L640">640</a> 
<a name=L641 href="source/fs/read_write.c#L641">641</a>         <b><i>/*</i></b>
<a name=L642 href="source/fs/read_write.c#L642">642</a> <b><i>         * Get output file, and verify that it is ok..</i></b>
<a name=L643 href="source/fs/read_write.c#L643">643</a> <b><i>         */</i></b>
<a name=L644 href="source/fs/read_write.c#L644">644</a>         retval = -<a href="ident?i=EBADF">EBADF</a>;
<a name=L645 href="source/fs/read_write.c#L645">645</a>         out_file = <a href="ident?i=fget_light">fget_light</a>(out_fd, &amp;fput_needed_out);
<a name=L646 href="source/fs/read_write.c#L646">646</a>         if (!out_file)
<a name=L647 href="source/fs/read_write.c#L647">647</a>                 goto fput_in;
<a name=L648 href="source/fs/read_write.c#L648">648</a>         if (!(out_file-&gt;f_mode &amp; <a href="ident?i=FMODE_WRITE">FMODE_WRITE</a>))
<a name=L649 href="source/fs/read_write.c#L649">649</a>                 goto fput_out;
<a name=L650 href="source/fs/read_write.c#L650">650</a>         retval = -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L651 href="source/fs/read_write.c#L651">651</a>         if (!out_file-&gt;f_op || !out_file-&gt;f_op-&gt;sendpage)
<a name=L652 href="source/fs/read_write.c#L652">652</a>                 goto fput_out;
<a name=L653 href="source/fs/read_write.c#L653">653</a>         out_inode = out_file-&gt;f_dentry-&gt;d_inode;
<a name=L654 href="source/fs/read_write.c#L654">654</a>         retval = <a href="ident?i=rw_verify_area">rw_verify_area</a>(<a href="ident?i=WRITE">WRITE</a>, out_file, &amp;out_file-&gt;f_pos, <a href="ident?i=count">count</a>);
<a name=L655 href="source/fs/read_write.c#L655">655</a>         if (retval)
<a name=L656 href="source/fs/read_write.c#L656">656</a>                 goto fput_out;
<a name=L657 href="source/fs/read_write.c#L657">657</a> 
<a name=L658 href="source/fs/read_write.c#L658">658</a>         retval = <a href="ident?i=security_file_permission">security_file_permission</a> (out_file, <a href="ident?i=MAY_WRITE">MAY_WRITE</a>);
<a name=L659 href="source/fs/read_write.c#L659">659</a>         if (retval)
<a name=L660 href="source/fs/read_write.c#L660">660</a>                 goto fput_out;
<a name=L661 href="source/fs/read_write.c#L661">661</a> 
<a name=L662 href="source/fs/read_write.c#L662">662</a>         if (!<a href="ident?i=max">max</a>)
<a name=L663 href="source/fs/read_write.c#L663">663</a>                 <a href="ident?i=max">max</a> = <a href="ident?i=min">min</a>(in_inode-&gt;i_sb-&gt;s_maxbytes, out_inode-&gt;i_sb-&gt;s_maxbytes);
<a name=L664 href="source/fs/read_write.c#L664">664</a> 
<a name=L665 href="source/fs/read_write.c#L665">665</a>         <a href="ident?i=pos">pos</a> = *<a href="ident?i=ppos">ppos</a>;
<a name=L666 href="source/fs/read_write.c#L666">666</a>         retval = -<a href="ident?i=EINVAL">EINVAL</a>;
<a name=L667 href="source/fs/read_write.c#L667">667</a>         if (<a href="ident?i=unlikely">unlikely</a>(<a href="ident?i=pos">pos</a> &lt; 0))
<a name=L668 href="source/fs/read_write.c#L668">668</a>                 goto fput_out;
<a name=L669 href="source/fs/read_write.c#L669">669</a>         if (<a href="ident?i=unlikely">unlikely</a>(<a href="ident?i=pos">pos</a> + <a href="ident?i=count">count</a> &gt; <a href="ident?i=max">max</a>)) {
<a name=L670 href="source/fs/read_write.c#L670">670</a>                 retval = -<a href="ident?i=EOVERFLOW">EOVERFLOW</a>;
<a name=L671 href="source/fs/read_write.c#L671">671</a>                 if (<a href="ident?i=pos">pos</a> &gt;= <a href="ident?i=max">max</a>)
<a name=L672 href="source/fs/read_write.c#L672">672</a>                         goto fput_out;
<a name=L673 href="source/fs/read_write.c#L673">673</a>                 <a href="ident?i=count">count</a> = <a href="ident?i=max">max</a> - <a href="ident?i=pos">pos</a>;
<a name=L674 href="source/fs/read_write.c#L674">674</a>         }
<a name=L675 href="source/fs/read_write.c#L675">675</a> 
<a name=L676 href="source/fs/read_write.c#L676">676</a>         retval = in_file-&gt;f_op-&gt;sendfile(in_file, <a href="ident?i=ppos">ppos</a>, <a href="ident?i=count">count</a>, <a href="ident?i=file_send_actor">file_send_actor</a>, out_file);
<a name=L677 href="source/fs/read_write.c#L677">677</a> 
<a name=L678 href="source/fs/read_write.c#L678">678</a>         if (retval &gt; 0) {
<a name=L679 href="source/fs/read_write.c#L679">679</a>                 <a href="ident?i=current">current</a>-&gt;rchar += retval;
<a name=L680 href="source/fs/read_write.c#L680">680</a>                 <a href="ident?i=current">current</a>-&gt;wchar += retval;
<a name=L681 href="source/fs/read_write.c#L681">681</a>         }
<a name=L682 href="source/fs/read_write.c#L682">682</a>         <a href="ident?i=current">current</a>-&gt;syscr++;
<a name=L683 href="source/fs/read_write.c#L683">683</a>         <a href="ident?i=current">current</a>-&gt;syscw++;
<a name=L684 href="source/fs/read_write.c#L684">684</a> 
<a name=L685 href="source/fs/read_write.c#L685">685</a>         if (*<a href="ident?i=ppos">ppos</a> &gt; <a href="ident?i=max">max</a>)
<a name=L686 href="source/fs/read_write.c#L686">686</a>                 retval = -<a href="ident?i=EOVERFLOW">EOVERFLOW</a>;
<a name=L687 href="source/fs/read_write.c#L687">687</a> 
<a name=L688 href="source/fs/read_write.c#L688">688</a> fput_out:
<a name=L689 href="source/fs/read_write.c#L689">689</a>         <a href="ident?i=fput_light">fput_light</a>(out_file, fput_needed_out);
<a name=L690 href="source/fs/read_write.c#L690">690</a> fput_in:
<a name=L691 href="source/fs/read_write.c#L691">691</a>         <a href="ident?i=fput_light">fput_light</a>(in_file, fput_needed_in);
<a name=L692 href="source/fs/read_write.c#L692">692</a> <a href="ident?i=out">out</a>:
<a name=L693 href="source/fs/read_write.c#L693">693</a>         return retval;
<a name=L694 href="source/fs/read_write.c#L694">694</a> }
<a name=L695 href="source/fs/read_write.c#L695">695</a> 
<a name=L696 href="source/fs/read_write.c#L696">696</a> <a href="ident?i=asmlinkage">asmlinkage</a> <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=sys_sendfile">sys_sendfile</a>(int out_fd, int in_fd, <a href="ident?i=off_t">off_t</a> <a href="ident?i=__user">__user</a> *<a href="ident?i=offset">offset</a>, <a href="ident?i=size_t">size_t</a> <a href="ident?i=count">count</a>)
<a name=L697 href="source/fs/read_write.c#L697">697</a> {
<a name=L698 href="source/fs/read_write.c#L698">698</a>         <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=pos">pos</a>;
<a name=L699 href="source/fs/read_write.c#L699">699</a>         <a href="ident?i=off_t">off_t</a> <a href="ident?i=off">off</a>;
<a name=L700 href="source/fs/read_write.c#L700">700</a>         <a href="ident?i=ssize_t">ssize_t</a> ret;
<a name=L701 href="source/fs/read_write.c#L701">701</a> 
<a name=L702 href="source/fs/read_write.c#L702">702</a>         if (<a href="ident?i=offset">offset</a>) {
<a name=L703 href="source/fs/read_write.c#L703">703</a>                 if (<a href="ident?i=unlikely">unlikely</a>(<a href="ident?i=get_user">get_user</a>(<a href="ident?i=off">off</a>, <a href="ident?i=offset">offset</a>)))
<a name=L704 href="source/fs/read_write.c#L704">704</a>                         return -<a href="ident?i=EFAULT">EFAULT</a>;
<a name=L705 href="source/fs/read_write.c#L705">705</a>                 <a href="ident?i=pos">pos</a> = <a href="ident?i=off">off</a>;
<a name=L706 href="source/fs/read_write.c#L706">706</a>                 ret = <a href="ident?i=do_sendfile">do_sendfile</a>(out_fd, in_fd, &amp;<a href="ident?i=pos">pos</a>, <a href="ident?i=count">count</a>, <a href="ident?i=MAX_NON_LFS">MAX_NON_LFS</a>);
<a name=L707 href="source/fs/read_write.c#L707">707</a>                 if (<a href="ident?i=unlikely">unlikely</a>(<a href="ident?i=put_user">put_user</a>(<a href="ident?i=pos">pos</a>, <a href="ident?i=offset">offset</a>)))
<a name=L708 href="source/fs/read_write.c#L708">708</a>                         return -<a href="ident?i=EFAULT">EFAULT</a>;
<a name=L709 href="source/fs/read_write.c#L709">709</a>                 return ret;
<a name=L710 href="source/fs/read_write.c#L710">710</a>         }
<a name=L711 href="source/fs/read_write.c#L711">711</a> 
<a name=L712 href="source/fs/read_write.c#L712">712</a>         return <a href="ident?i=do_sendfile">do_sendfile</a>(out_fd, in_fd, <a href="ident?i=NULL">NULL</a>, <a href="ident?i=count">count</a>, 0);
<a name=L713 href="source/fs/read_write.c#L713">713</a> }
<a name=L714 href="source/fs/read_write.c#L714">714</a> 
<a name=L715 href="source/fs/read_write.c#L715">715</a> <a href="ident?i=asmlinkage">asmlinkage</a> <a href="ident?i=ssize_t">ssize_t</a> <a href="ident?i=sys_sendfile64">sys_sendfile64</a>(int out_fd, int in_fd, <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=__user">__user</a> *<a href="ident?i=offset">offset</a>, <a href="ident?i=size_t">size_t</a> <a href="ident?i=count">count</a>)
<a name=L716 href="source/fs/read_write.c#L716">716</a> {
<a name=L717 href="source/fs/read_write.c#L717">717</a>         <a href="ident?i=loff_t">loff_t</a> <a href="ident?i=pos">pos</a>;
<a name=L718 href="source/fs/read_write.c#L718">718</a>         <a href="ident?i=ssize_t">ssize_t</a> ret;
<a name=L719 href="source/fs/read_write.c#L719">719</a> 
<a name=L720 href="source/fs/read_write.c#L720">720</a>         if (<a href="ident?i=offset">offset</a>) {
<a name=L721 href="source/fs/read_write.c#L721">721</a>                 if (<a href="ident?i=unlikely">unlikely</a>(<a href="ident?i=copy_from_user">copy_from_user</a>(&amp;<a href="ident?i=pos">pos</a>, <a href="ident?i=offset">offset</a>, sizeof(<a href="ident?i=loff_t">loff_t</a>))))
<a name=L722 href="source/fs/read_write.c#L722">722</a>                         return -<a href="ident?i=EFAULT">EFAULT</a>;
<a name=L723 href="source/fs/read_write.c#L723">723</a>                 ret = <a href="ident?i=do_sendfile">do_sendfile</a>(out_fd, in_fd, &amp;<a href="ident?i=pos">pos</a>, <a href="ident?i=count">count</a>, 0);
<a name=L724 href="source/fs/read_write.c#L724">724</a>                 if (<a href="ident?i=unlikely">unlikely</a>(<a href="ident?i=put_user">put_user</a>(<a href="ident?i=pos">pos</a>, <a href="ident?i=offset">offset</a>)))
<a name=L725 href="source/fs/read_write.c#L725">725</a>                         return -<a href="ident?i=EFAULT">EFAULT</a>;
<a name=L726 href="source/fs/read_write.c#L726">726</a>                 return ret;
<a name=L727 href="source/fs/read_write.c#L727">727</a>         }
<a name=L728 href="source/fs/read_write.c#L728">728</a> 
<a name=L729 href="source/fs/read_write.c#L729">729</a>         return <a href="ident?i=do_sendfile">do_sendfile</a>(out_fd, in_fd, <a href="ident?i=NULL">NULL</a>, <a href="ident?i=count">count</a>, 0);
<a name=L730 href="source/fs/read_write.c#L730">730</a> }
<a name=L731 href="source/fs/read_write.c#L731">731</a> </pre><hr>
<table width="100%" cellpadding=0 border=0>
  <tr valign=middle>
    
    <td align=center nowrap>
      [&nbsp;<b><i>source navigation</i></b>&nbsp;]</td>
    <td align=center nowrap>
      [&nbsp;<a href="diff/fs/read_write.c">diff markup</a>&nbsp;]</td>
    <td align=center nowrap>
      [&nbsp;<a href="ident">identifier search</a>&nbsp;]</td>
    <td align=center nowrap>
      [&nbsp;<a href="search">freetext search</a>&nbsp;]</td>
    <td align=center nowrap>
      [&nbsp;<a href="find">file search</a>&nbsp;]</td>
  </tr>
</table>
<hr>
<table width="100%" cellpadding=0 border=0>
  <tr>
    <td align=left>
      This page was automatically generated by the 
      <a href="/blurb.html">LXR engine</a>.
      <address>
        <a href="mailto:lxr@linux.no">
          Arne Georg Gleditsch and Per Kristian Gjermshus
	  &lt;lxr@linux.no&gt;</a>
      </address>
    </td>
    <td align=right>
      <a href="http://ugweb.cs.ualberta.ca/~gerald/validate/?url=http://lxr.linux.no:80/source/fs/read_write.c%3f">
        <img src="/valid_html3.2.gif" border=0
           alt="HTML 3.2 Checked!">
      </a>
    </td>
  </tr>
</table>
</body>
</html>
