📄 namei.c
字号:
<a name=L378 href="source/fs/namei.c#L378">378</a> bh = <a href="ident?i=add_entry">add_entry</a>(dir,basename,namelen,&de);<a name=L379 href="source/fs/namei.c#L379">379</a> if (!bh) {<a name=L380 href="source/fs/namei.c#L380">380</a> inode->i_nlinks--;<a name=L381 href="source/fs/namei.c#L381">381</a> <a href="ident?i=iput">iput</a>(inode);<a name=L382 href="source/fs/namei.c#L382">382</a> <a href="ident?i=iput">iput</a>(dir);<a name=L383 href="source/fs/namei.c#L383">383</a> return -<a href="ident?i=ENOSPC">ENOSPC</a>;<a name=L384 href="source/fs/namei.c#L384">384</a> }<a name=L385 href="source/fs/namei.c#L385">385</a> de->inode = inode->i_num;<a name=L386 href="source/fs/namei.c#L386">386</a> bh->b_dirt = 1;<a name=L387 href="source/fs/namei.c#L387">387</a> <a href="ident?i=brelse">brelse</a>(bh);<a name=L388 href="source/fs/namei.c#L388">388</a> <a href="ident?i=iput">iput</a>(dir);<a name=L389 href="source/fs/namei.c#L389">389</a> *res_inode = inode;<a name=L390 href="source/fs/namei.c#L390">390</a> return 0;<a name=L391 href="source/fs/namei.c#L391">391</a> }<a name=L392 href="source/fs/namei.c#L392">392</a> inr = de->inode;<a name=L393 href="source/fs/namei.c#L393">393</a> dev = dir->i_dev;<a name=L394 href="source/fs/namei.c#L394">394</a> <a href="ident?i=brelse">brelse</a>(bh);<a name=L395 href="source/fs/namei.c#L395">395</a> <a href="ident?i=iput">iput</a>(dir);<a name=L396 href="source/fs/namei.c#L396">396</a> if (flag & <a href="ident?i=O_EXCL">O_EXCL</a>)<a name=L397 href="source/fs/namei.c#L397">397</a> return -<a href="ident?i=EEXIST">EEXIST</a>;<a name=L398 href="source/fs/namei.c#L398">398</a> if (!(inode=<a href="ident?i=iget">iget</a>(dev,inr)))<a name=L399 href="source/fs/namei.c#L399">399</a> return -<a href="ident?i=EACCES">EACCES</a>;<a name=L400 href="source/fs/namei.c#L400">400</a> if ((<a href="ident?i=S_ISDIR">S_ISDIR</a>(inode->i_mode) && (flag & <a href="ident?i=O_ACCMODE">O_ACCMODE</a>)) ||<a name=L401 href="source/fs/namei.c#L401">401</a> !<a href="ident?i=permission">permission</a>(inode,<a href="ident?i=ACC_MODE">ACC_MODE</a>(flag))) {<a name=L402 href="source/fs/namei.c#L402">402</a> <a href="ident?i=iput">iput</a>(inode);<a name=L403 href="source/fs/namei.c#L403">403</a> return -<a href="ident?i=EPERM">EPERM</a>;<a name=L404 href="source/fs/namei.c#L404">404</a> }<a name=L405 href="source/fs/namei.c#L405">405</a> inode->i_atime = <a href="ident?i=CURRENT_TIME">CURRENT_TIME</a>;<a name=L406 href="source/fs/namei.c#L406">406</a> if (flag & <a href="ident?i=O_TRUNC">O_TRUNC</a>)<a name=L407 href="source/fs/namei.c#L407">407</a> <a href="ident?i=truncate">truncate</a>(inode);<a name=L408 href="source/fs/namei.c#L408">408</a> *res_inode = inode;<a name=L409 href="source/fs/namei.c#L409">409</a> return 0;<a name=L410 href="source/fs/namei.c#L410">410</a> }<a name=L411 href="source/fs/namei.c#L411">411</a> <a name=L412 href="source/fs/namei.c#L412">412</a> int <a href="ident?i=sys_mknod">sys_mknod</a>(const char * filename, int mode, int dev)<a name=L413 href="source/fs/namei.c#L413">413</a> {<a name=L414 href="source/fs/namei.c#L414">414</a> const char * basename;<a name=L415 href="source/fs/namei.c#L415">415</a> int namelen;<a name=L416 href="source/fs/namei.c#L416">416</a> struct <a href="ident?i=m_inode">m_inode</a> * dir, * inode;<a name=L417 href="source/fs/namei.c#L417">417</a> struct <a href="ident?i=buffer_head">buffer_head</a> * bh;<a name=L418 href="source/fs/namei.c#L418">418</a> struct <a href="ident?i=dir_entry">dir_entry</a> * de;<a name=L419 href="source/fs/namei.c#L419">419</a> <a name=L420 href="source/fs/namei.c#L420">420</a> if (!<a href="ident?i=suser">suser</a>())<a name=L421 href="source/fs/namei.c#L421">421</a> return -<a href="ident?i=EPERM">EPERM</a>;<a name=L422 href="source/fs/namei.c#L422">422</a> if (!(dir = <a href="ident?i=dir_namei">dir_namei</a>(filename,&namelen,&basename)))<a name=L423 href="source/fs/namei.c#L423">423</a> return -<a href="ident?i=ENOENT">ENOENT</a>;<a name=L424 href="source/fs/namei.c#L424">424</a> if (!namelen) {<a name=L425 href="source/fs/namei.c#L425">425</a> <a href="ident?i=iput">iput</a>(dir);<a name=L426 href="source/fs/namei.c#L426">426</a> return -<a href="ident?i=ENOENT">ENOENT</a>;<a name=L427 href="source/fs/namei.c#L427">427</a> }<a name=L428 href="source/fs/namei.c#L428">428</a> if (!<a href="ident?i=permission">permission</a>(dir,<a href="ident?i=MAY_WRITE">MAY_WRITE</a>)) {<a name=L429 href="source/fs/namei.c#L429">429</a> <a href="ident?i=iput">iput</a>(dir);<a name=L430 href="source/fs/namei.c#L430">430</a> return -<a href="ident?i=EPERM">EPERM</a>;<a name=L431 href="source/fs/namei.c#L431">431</a> }<a name=L432 href="source/fs/namei.c#L432">432</a> bh = <a href="ident?i=find_entry">find_entry</a>(&dir,basename,namelen,&de);<a name=L433 href="source/fs/namei.c#L433">433</a> if (bh) {<a name=L434 href="source/fs/namei.c#L434">434</a> <a href="ident?i=brelse">brelse</a>(bh);<a name=L435 href="source/fs/namei.c#L435">435</a> <a href="ident?i=iput">iput</a>(dir);<a name=L436 href="source/fs/namei.c#L436">436</a> return -<a href="ident?i=EEXIST">EEXIST</a>;<a name=L437 href="source/fs/namei.c#L437">437</a> }<a name=L438 href="source/fs/namei.c#L438">438</a> inode = <a href="ident?i=new_inode">new_inode</a>(dir->i_dev);<a name=L439 href="source/fs/namei.c#L439">439</a> if (!inode) {<a name=L440 href="source/fs/namei.c#L440">440</a> <a href="ident?i=iput">iput</a>(dir);<a name=L441 href="source/fs/namei.c#L441">441</a> return -<a href="ident?i=ENOSPC">ENOSPC</a>;<a name=L442 href="source/fs/namei.c#L442">442</a> }<a name=L443 href="source/fs/namei.c#L443">443</a> inode->i_mode = mode;<a name=L444 href="source/fs/namei.c#L444">444</a> if (<a href="ident?i=S_ISBLK">S_ISBLK</a>(mode) || <a href="ident?i=S_ISCHR">S_ISCHR</a>(mode))<a name=L445 href="source/fs/namei.c#L445">445</a> inode->i_zone[0] = dev;<a name=L446 href="source/fs/namei.c#L446">446</a> inode->i_mtime = inode->i_atime = <a href="ident?i=CURRENT_TIME">CURRENT_TIME</a>;<a name=L447 href="source/fs/namei.c#L447">447</a> inode->i_dirt = 1;<a name=L448 href="source/fs/namei.c#L448">448</a> bh = <a href="ident?i=add_entry">add_entry</a>(dir,basename,namelen,&de);<a name=L449 href="source/fs/namei.c#L449">449</a> if (!bh) {<a name=L450 href="source/fs/namei.c#L450">450</a> <a href="ident?i=iput">iput</a>(dir);<a name=L451 href="source/fs/namei.c#L451">451</a> inode->i_nlinks=0;<a name=L452 href="source/fs/namei.c#L452">452</a> <a href="ident?i=iput">iput</a>(inode);<a name=L453 href="source/fs/namei.c#L453">453</a> return -<a href="ident?i=ENOSPC">ENOSPC</a>;<a name=L454 href="source/fs/namei.c#L454">454</a> }<a name=L455 href="source/fs/namei.c#L455">455</a> de->inode = inode->i_num;<a name=L456 href="source/fs/namei.c#L456">456</a> bh->b_dirt = 1;<a name=L457 href="source/fs/namei.c#L457">457</a> <a href="ident?i=iput">iput</a>(dir);<a name=L458 href="source/fs/namei.c#L458">458</a> <a href="ident?i=iput">iput</a>(inode);<a name=L459 href="source/fs/namei.c#L459">459</a> <a href="ident?i=brelse">brelse</a>(bh);<a name=L460 href="source/fs/namei.c#L460">460</a> return 0;<a name=L461 href="source/fs/namei.c#L461">461</a> }<a name=L462 href="source/fs/namei.c#L462">462</a> <a name=L463 href="source/fs/namei.c#L463">463</a> int <a href="ident?i=sys_mkdir">sys_mkdir</a>(const char * pathname, int mode)<a name=L464 href="source/fs/namei.c#L464">464</a> {<a name=L465 href="source/fs/namei.c#L465">465</a> const char * basename;<a name=L466 href="source/fs/namei.c#L466">466</a> int namelen;<a name=L467 href="source/fs/namei.c#L467">467</a> struct <a href="ident?i=m_inode">m_inode</a> * dir, * inode;<a name=L468 href="source/fs/namei.c#L468">468</a> struct <a href="ident?i=buffer_head">buffer_head</a> * bh, *dir_block;<a name=L469 href="source/fs/namei.c#L469">469</a> struct <a href="ident?i=dir_entry">dir_entry</a> * de;<a name=L470 href="source/fs/namei.c#L470">470</a> <a name=L471 href="source/fs/namei.c#L471">471</a> if (!<a href="ident?i=suser">suser</a>())<a name=L472 href="source/fs/namei.c#L472">472</a> return -<a href="ident?i=EPERM">EPERM</a>;<a name=L473 href="source/fs/namei.c#L473">473</a> if (!(dir = <a href="ident?i=dir_namei">dir_namei</a>(pathname,&namelen,&basename)))<a name=L474 href="source/fs/namei.c#L474">474</a> return -<a href="ident?i=ENOENT">ENOENT</a>;<a name=L475 href="source/fs/namei.c#L475">475</a> if (!namelen) {<a name=L476 href="source/fs/namei.c#L476">476</a> <a href="ident?i=iput">iput</a>(dir);<a name=L477 href="source/fs/namei.c#L477">477</a> return -<a href="ident?i=ENOENT">ENOENT</a>;<a name=L478 href="source/fs/namei.c#L478">478</a> }<a name=L479 href="source/fs/namei.c#L479">479</a> if (!<a href="ident?i=permission">permission</a>(dir,<a href="ident?i=MAY_WRITE">MAY_WRITE</a>)) {<a name=L480 href="source/fs/namei.c#L480">480</a> <a href="ident?i=iput">iput</a>(dir);<a name=L481 href="source/fs/namei.c#L481">481</a> return -<a href="ident?i=EPERM">EPERM</a>;<a name=L482 href="source/fs/namei.c#L482">482</a> }<a name=L483 href="source/fs/namei.c#L483">483</a> bh = <a href="ident?i=find_entry">find_entry</a>(&dir,basename,namelen,&de);<a name=L484 href="source/fs/namei.c#L484">484</a> if (bh) {<a name=L485 href="source/fs/namei.c#L485">485</a> <a href="ident?i=brelse">brelse</a>(bh);<a name=L486 href="source/fs/namei.c#L486">486</a> <a href="ident?i=iput">iput</a>(dir);<a name=L487 href="source/fs/namei.c#L487">487</a> return -<a href="ident?i=EEXIST">EEXIST</a>;<a name=L488 href="source/fs/namei.c#L488">488</a> }<a name=L489 href="source/fs/namei.c#L489">489</a> inode = <a href="ident?i=new_inode">new_inode</a>(dir->i_dev);<a name=L490 href="source/fs/namei.c#L490">490</a> if (!inode) {<a name=L491 href="source/fs/namei.c#L491">491</a> <a href="ident?i=iput">iput</a>(dir);<a name=L492 href="source/fs/namei.c#L492">492</a> return -<a href="ident?i=ENOSPC">ENOSPC</a>;<a name=L493 href="source/fs/namei.c#L493">493</a> }<a name=L494 href="source/fs/namei.c#L494">494</a> inode->i_size = 32;<a name=L495 href="source/fs/namei.c#L495">495</a> inode->i_dirt = 1;<a name=L496 href="source/fs/namei.c#L496">496</a> inode->i_mtime = inode->i_atime = <a href="ident?i=CURRENT_TIME">CURRENT_TIME</a>;<a name=L497 href="source/fs/namei.c#L497">497</a> if (!(inode->i_zone[0]=<a href="ident?i=new_block">new_block</a>(inode->i_dev))) {<a name=L498 href="source/fs/namei.c#L498">498</a> <a href="ident?i=iput">iput</a>(dir);<a name=L499 href="source/fs/namei.c#L499">499</a> inode->i_nlinks--;<a name=L500 href="source/fs/namei.c#L500">500</a> <a href="ident?i=iput">iput</a>(inode);<a name=L501 href="source/fs/namei.c#L501">501</a> return -<a href="ident?i=ENOSPC">ENOSPC</a>;<a name=L502 href="source/fs/namei.c#L502">502</a> }<a name=L503 href="source/fs/namei.c#L503">503</a> inode->i_dirt = 1;<a name=L504 href="source/fs/namei.c#L504">504</a> if (!(dir_block=<a href="ident?i=bread">bread</a>(inode->i_dev,inode->i_zone[0]))) {<a name=L505 href="source/fs/namei.c#L505">505</a> <a href="ident?i=iput">iput</a>(dir);<a name=L506 href="source/fs/namei.c#L506">506</a> <a href="ident?i=free_block">free_block</a>(inode->i_dev,inode->i_zone[0]);<a name=L507 href="source/fs/namei.c#L507">507</a> inode->i_nlinks--;<a name=L508 href="source/fs/namei.c#L508">508</a> <a href="ident?i=iput">iput</a>(inode);<a name=L509 href="source/fs/namei.c#L509">509</a> return -<a href="ident?i=ERROR">ERROR</a>;<a name=L510 href="source/fs/namei.c#L510">510</a> }<a name=L511 href="source/fs/namei.c#L511">511</a> de = (struct <a href="ident?i=dir_entry">dir_entry</a> *) dir_block->b_data;<a name=L512 href="source/fs/namei.c#L512">512</a> de->inode=inode->i_num;<a name=L513 href="source/fs/namei.c#L513">513</a> <a href="ident?i=strcpy">strcpy</a>(de->name,<i>"."</i>);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -