⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buffer.c

📁 这是一个Linux内核。是0.11版本的
💻 C
📖 第 1 页 / 共 3 页
字号:
<a name=L252 href="source/fs/buffer.c#L252">252</a> <a name=L253 href="source/fs/buffer.c#L253">253</a> void <a href="ident?i=brelse">brelse</a>(struct <a href="ident?i=buffer_head">buffer_head</a> * <a href="ident?i=buf">buf</a>)<a name=L254 href="source/fs/buffer.c#L254">254</a> {<a name=L255 href="source/fs/buffer.c#L255">255</a>         if (!<a href="ident?i=buf">buf</a>)<a name=L256 href="source/fs/buffer.c#L256">256</a>                 return;<a name=L257 href="source/fs/buffer.c#L257">257</a>         <a href="ident?i=wait_on_buffer">wait_on_buffer</a>(<a href="ident?i=buf">buf</a>);<a name=L258 href="source/fs/buffer.c#L258">258</a>         if (!(<a href="ident?i=buf">buf</a>-&gt;b_count--))<a name=L259 href="source/fs/buffer.c#L259">259</a>                 <a href="ident?i=panic">panic</a>(<i>"Trying to free free buffer"</i>);<a name=L260 href="source/fs/buffer.c#L260">260</a>         <a href="ident?i=wake_up">wake_up</a>(&amp;<a href="ident?i=buffer_wait">buffer_wait</a>);<a name=L261 href="source/fs/buffer.c#L261">261</a> }<a name=L262 href="source/fs/buffer.c#L262">262</a> <a name=L263 href="source/fs/buffer.c#L263">263</a> <b><i>/*</i></b><a name=L264 href="source/fs/buffer.c#L264">264</a> <b><i> * bread() reads a specified block and returns the buffer that contains</i></b><a name=L265 href="source/fs/buffer.c#L265">265</a> <b><i> * it. It returns NULL if the block was unreadable.</i></b><a name=L266 href="source/fs/buffer.c#L266">266</a> <b><i> */</i></b><a name=L267 href="source/fs/buffer.c#L267">267</a> struct <a href="ident?i=buffer_head">buffer_head</a> * <a href="ident?i=bread">bread</a>(int dev,int block)<a name=L268 href="source/fs/buffer.c#L268">268</a> {<a name=L269 href="source/fs/buffer.c#L269">269</a>         struct <a href="ident?i=buffer_head">buffer_head</a> * bh;<a name=L270 href="source/fs/buffer.c#L270">270</a> <a name=L271 href="source/fs/buffer.c#L271">271</a>         if (!(bh=<a href="ident?i=getblk">getblk</a>(dev,block)))<a name=L272 href="source/fs/buffer.c#L272">272</a>                 <a href="ident?i=panic">panic</a>(<i>"bread: getblk returned NULL\n"</i>);<a name=L273 href="source/fs/buffer.c#L273">273</a>         if (bh-&gt;b_uptodate)<a name=L274 href="source/fs/buffer.c#L274">274</a>                 return bh;<a name=L275 href="source/fs/buffer.c#L275">275</a>         <a href="ident?i=ll_rw_block">ll_rw_block</a>(<a href="ident?i=READ">READ</a>,bh);<a name=L276 href="source/fs/buffer.c#L276">276</a>         <a href="ident?i=wait_on_buffer">wait_on_buffer</a>(bh);<a name=L277 href="source/fs/buffer.c#L277">277</a>         if (bh-&gt;b_uptodate)<a name=L278 href="source/fs/buffer.c#L278">278</a>                 return bh;<a name=L279 href="source/fs/buffer.c#L279">279</a>         <a href="ident?i=brelse">brelse</a>(bh);<a name=L280 href="source/fs/buffer.c#L280">280</a>         return <a href="ident?i=NULL">NULL</a>;<a name=L281 href="source/fs/buffer.c#L281">281</a> }<a name=L282 href="source/fs/buffer.c#L282">282</a> <a name=L283 href="source/fs/buffer.c#L283">283</a> #define <a href="ident?i=COPYBLK">COPYBLK</a>(from,to) \<a name=L284 href="source/fs/buffer.c#L284">284</a> __asm__(<i>"cld\n\t"</i> \<a name=L285 href="source/fs/buffer.c#L285">285</a>         <i>"rep\n\t"</i> \<a name=L286 href="source/fs/buffer.c#L286">286</a>         <i>"movsl\n\t"</i> \<a name=L287 href="source/fs/buffer.c#L287">287</a>         ::<i>"c"</i> (<a href="ident?i=BLOCK_SIZE">BLOCK_SIZE</a>/4),<i>"S"</i> (from),<i>"D"</i> (to) \<a name=L288 href="source/fs/buffer.c#L288">288</a>         :<i>"cx"</i>,<i>"di"</i>,<i>"si"</i>)<a name=L289 href="source/fs/buffer.c#L289">289</a> <a name=L290 href="source/fs/buffer.c#L290">290</a> <b><i>/*</i></b><a name=L291 href="source/fs/buffer.c#L291">291</a> <b><i> * bread_page reads four buffers into memory at the desired address. It's</i></b><a name=L292 href="source/fs/buffer.c#L292">292</a> <b><i> * a function of its own, as there is some speed to be got by reading them</i></b><a name=L293 href="source/fs/buffer.c#L293">293</a> <b><i> * all at the same time, not waiting for one to be read, and then another</i></b><a name=L294 href="source/fs/buffer.c#L294">294</a> <b><i> * etc.</i></b><a name=L295 href="source/fs/buffer.c#L295">295</a> <b><i> */</i></b><a name=L296 href="source/fs/buffer.c#L296">296</a> void <a href="ident?i=bread_page">bread_page</a>(unsigned long address,int dev,int b[4])<a name=L297 href="source/fs/buffer.c#L297">297</a> {<a name=L298 href="source/fs/buffer.c#L298">298</a>         struct <a href="ident?i=buffer_head">buffer_head</a> * bh[4];<a name=L299 href="source/fs/buffer.c#L299">299</a>         int i;<a name=L300 href="source/fs/buffer.c#L300">300</a> <a name=L301 href="source/fs/buffer.c#L301">301</a>         for (i=0 ; i&lt;4 ; i++)<a name=L302 href="source/fs/buffer.c#L302">302</a>                 if (b[i]) {<a name=L303 href="source/fs/buffer.c#L303">303</a>                         if (bh[i] = <a href="ident?i=getblk">getblk</a>(dev,b[i]))<a name=L304 href="source/fs/buffer.c#L304">304</a>                                 if (!bh[i]-&gt;b_uptodate)<a name=L305 href="source/fs/buffer.c#L305">305</a>                                         <a href="ident?i=ll_rw_block">ll_rw_block</a>(<a href="ident?i=READ">READ</a>,bh[i]);<a name=L306 href="source/fs/buffer.c#L306">306</a>                 } else<a name=L307 href="source/fs/buffer.c#L307">307</a>                         bh[i] = <a href="ident?i=NULL">NULL</a>;<a name=L308 href="source/fs/buffer.c#L308">308</a>         for (i=0 ; i&lt;4 ; i++,address += <a href="ident?i=BLOCK_SIZE">BLOCK_SIZE</a>)<a name=L309 href="source/fs/buffer.c#L309">309</a>                 if (bh[i]) {<a name=L310 href="source/fs/buffer.c#L310">310</a>                         <a href="ident?i=wait_on_buffer">wait_on_buffer</a>(bh[i]);<a name=L311 href="source/fs/buffer.c#L311">311</a>                         if (bh[i]-&gt;b_uptodate)<a name=L312 href="source/fs/buffer.c#L312">312</a>                                 <a href="ident?i=COPYBLK">COPYBLK</a>((unsigned long) bh[i]-&gt;b_data,address);<a name=L313 href="source/fs/buffer.c#L313">313</a>                         <a href="ident?i=brelse">brelse</a>(bh[i]);<a name=L314 href="source/fs/buffer.c#L314">314</a>                 }<a name=L315 href="source/fs/buffer.c#L315">315</a> }<a name=L316 href="source/fs/buffer.c#L316">316</a> <a name=L317 href="source/fs/buffer.c#L317">317</a> <b><i>/*</i></b><a name=L318 href="source/fs/buffer.c#L318">318</a> <b><i> * Ok, breada can be used as bread, but additionally to mark other</i></b><a name=L319 href="source/fs/buffer.c#L319">319</a> <b><i> * blocks for reading as well. End the argument list with a negative</i></b><a name=L320 href="source/fs/buffer.c#L320">320</a> <b><i> * number.</i></b><a name=L321 href="source/fs/buffer.c#L321">321</a> <b><i> */</i></b><a name=L322 href="source/fs/buffer.c#L322">322</a> struct <a href="ident?i=buffer_head">buffer_head</a> * <a href="ident?i=breada">breada</a>(int dev,int first, ...)<a name=L323 href="source/fs/buffer.c#L323">323</a> {<a name=L324 href="source/fs/buffer.c#L324">324</a>         <a href="ident?i=va_list">va_list</a> args;<a name=L325 href="source/fs/buffer.c#L325">325</a>         struct <a href="ident?i=buffer_head">buffer_head</a> * bh, *tmp;<a name=L326 href="source/fs/buffer.c#L326">326</a> <a name=L327 href="source/fs/buffer.c#L327">327</a>         <a href="ident?i=va_start">va_start</a>(args,first);<a name=L328 href="source/fs/buffer.c#L328">328</a>         if (!(bh=<a href="ident?i=getblk">getblk</a>(dev,first)))<a name=L329 href="source/fs/buffer.c#L329">329</a>                 <a href="ident?i=panic">panic</a>(<i>"bread: getblk returned NULL\n"</i>);<a name=L330 href="source/fs/buffer.c#L330">330</a>         if (!bh-&gt;b_uptodate)<a name=L331 href="source/fs/buffer.c#L331">331</a>                 <a href="ident?i=ll_rw_block">ll_rw_block</a>(<a href="ident?i=READ">READ</a>,bh);<a name=L332 href="source/fs/buffer.c#L332">332</a>         while ((first=<a href="ident?i=va_arg">va_arg</a>(args,int))&gt;=0) {<a name=L333 href="source/fs/buffer.c#L333">333</a>                 tmp=<a href="ident?i=getblk">getblk</a>(dev,first);<a name=L334 href="source/fs/buffer.c#L334">334</a>                 if (tmp) {<a name=L335 href="source/fs/buffer.c#L335">335</a>                         if (!tmp-&gt;b_uptodate)<a name=L336 href="source/fs/buffer.c#L336">336</a>                                 <a href="ident?i=ll_rw_block">ll_rw_block</a>(<a href="ident?i=READA">READA</a>,bh);<a name=L337 href="source/fs/buffer.c#L337">337</a>                         tmp-&gt;b_count--;<a name=L338 href="source/fs/buffer.c#L338">338</a>                 }<a name=L339 href="source/fs/buffer.c#L339">339</a>         }<a name=L340 href="source/fs/buffer.c#L340">340</a>         <a href="ident?i=va_end">va_end</a>(args);<a name=L341 href="source/fs/buffer.c#L341">341</a>         <a href="ident?i=wait_on_buffer">wait_on_buffer</a>(bh);<a name=L342 href="source/fs/buffer.c#L342">342</a>         if (bh-&gt;b_uptodate)<a name=L343 href="source/fs/buffer.c#L343">343</a>                 return bh;<a name=L344 href="source/fs/buffer.c#L344">344</a>         <a href="ident?i=brelse">brelse</a>(bh);<a name=L345 href="source/fs/buffer.c#L345">345</a>         return (<a href="ident?i=NULL">NULL</a>);<a name=L346 href="source/fs/buffer.c#L346">346</a> }<a name=L347 href="source/fs/buffer.c#L347">347</a> <a name=L348 href="source/fs/buffer.c#L348">348</a> void <a href="ident?i=buffer_init">buffer_init</a>(long buffer_end)<a name=L349 href="source/fs/buffer.c#L349">349</a> {<a name=L350 href="source/fs/buffer.c#L350">350</a>         struct <a href="ident?i=buffer_head">buffer_head</a> * h = <a href="ident?i=start_buffer">start_buffer</a>;<a name=L351 href="source/fs/buffer.c#L351">351</a>         void * b;<a name=L352 href="source/fs/buffer.c#L352">352</a>         int i;<a name=L353 href="source/fs/buffer.c#L353">353</a> <a name=L354 href="source/fs/buffer.c#L354">354</a>         if (buffer_end == 1&lt;&lt;20)<a name=L355 href="source/fs/buffer.c#L355">355</a>                 b = (void *) (640*1024);<a name=L356 href="source/fs/buffer.c#L356">356</a>         else<a name=L357 href="source/fs/buffer.c#L357">357</a>                 b = (void *) buffer_end;<a name=L358 href="source/fs/buffer.c#L358">358</a>         while ( (b -= <a href="ident?i=BLOCK_SIZE">BLOCK_SIZE</a>) &gt;= ((void *) (h+1)) ) {<a name=L359 href="source/fs/buffer.c#L359">359</a>                 h-&gt;b_dev = 0;<a name=L360 href="source/fs/buffer.c#L360">360</a>                 h-&gt;b_dirt = 0;<a name=L361 href="source/fs/buffer.c#L361">361</a>                 h-&gt;b_count = 0;<a name=L362 href="source/fs/buffer.c#L362">362</a>                 h-&gt;b_lock = 0;<a name=L363 href="source/fs/buffer.c#L363">363</a>                 h-&gt;b_uptodate = 0;<a name=L364 href="source/fs/buffer.c#L364">364</a>                 h-&gt;b_wait = <a href="ident?i=NULL">NULL</a>;<a name=L365 href="source/fs/buffer.c#L365">365</a>                 h-&gt;b_next = <a href="ident?i=NULL">NULL</a>;<a name=L366 href="source/fs/buffer.c#L366">366</a>                 h-&gt;b_prev = <a href="ident?i=NULL">NULL</a>;<a name=L367 href="source/fs/buffer.c#L367">367</a>                 h-&gt;b_data = (char *) b;<a name=L368 href="source/fs/buffer.c#L368">368</a>                 h-&gt;b_prev_free = h-1;<a name=L369 href="source/fs/buffer.c#L369">369</a>                 h-&gt;b_next_free = h+1;<a name=L370 href="source/fs/buffer.c#L370">370</a>                 h++;<a name=L371 href="source/fs/buffer.c#L371">371</a>                 <a href="ident?i=NR_BUFFERS">NR_BUFFERS</a>++;<a name=L372 href="source/fs/buffer.c#L372">372</a>                 if (b == (void *) 0x100000)<a name=L373 href="source/fs/buffer.c#L373">373</a>                         b = (void *) 0xA0000;<a name=L374 href="source/fs/buffer.c#L374">374</a>         }<a name=L375 href="source/fs/buffer.c#L375">375</a>         h--;<a name=L376 href="source/fs/buffer.c#L376">376</a>         <a href="ident?i=free_list">free_list</a> = <a href="ident?i=start_buffer">start_buffer</a>;<a name=L377 href="source/fs/buffer.c#L377">377</a>         <a href="ident?i=free_list">free_list</a>-&gt;b_prev_free = h;<a name=L378 href="source/fs/buffer.c#L378">378</a>         h-&gt;b_next_free = <a href="ident?i=free_list">free_list</a>;<a name=L379 href="source/fs/buffer.c#L379">379</a>         for (i=0;i&lt;<a href="ident?i=NR_HASH">NR_HASH</a>;i++)<a name=L380 href="source/fs/buffer.c#L380">380</a>                 <a href="ident?i=hash_table">hash_table</a>[i]=<a href="ident?i=NULL">NULL</a>;<a name=L381 href="source/fs/buffer.c#L381">381</a> }       <a name=L382 href="source/fs/buffer.c#L382">382</a> </pre><hr><div align=center>   [<b><i>源代码浏览</i></b>] [<a href="diff/fs/buffer.c">区别标定</a>] [<a href="ident">标识符搜索</a>] [<a href="search">文本搜索</a>] [<a href="find">文件搜索</a>] </div><hr>本网页由 <a href="http:blurb.html">LXR引擎</a> 自动生成.<br></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -