6697 lines
307 KiB
HTML
6697 lines
307 KiB
HTML
<html>
|
||
|
||
<head>
|
||
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
|
||
<meta name=Generator content="Microsoft Word 14 (filtered)">
|
||
|
||
<style>
|
||
<!--
|
||
/* Font Definitions */
|
||
@font-face
|
||
{font-family:Helvetica;
|
||
panose-1:2 11 6 4 2 2 2 2 2 4;}
|
||
@font-face
|
||
{font-family:Courier;
|
||
panose-1:2 7 4 9 2 2 5 2 4 4;}
|
||
@font-face
|
||
{font-family:"Tms Rmn";
|
||
panose-1:2 2 6 3 4 5 5 2 3 4;}
|
||
@font-face
|
||
{font-family:Helv;
|
||
panose-1:2 11 6 4 2 2 2 3 2 4;}
|
||
@font-face
|
||
{font-family:"New York";
|
||
panose-1:2 4 5 3 6 5 6 2 3 4;}
|
||
@font-face
|
||
{font-family:System;
|
||
panose-1:0 0 0 0 0 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:Wingdings;
|
||
panose-1:5 0 0 0 0 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:"MS Mincho";
|
||
panose-1:2 2 6 9 4 2 5 8 3 4;}
|
||
@font-face
|
||
{font-family:Batang;
|
||
panose-1:2 3 6 0 0 1 1 1 1 1;}
|
||
@font-face
|
||
{font-family:ËÎÌå;
|
||
panose-1:2 1 6 0 3 1 1 1 1 1;}
|
||
@font-face
|
||
{font-family:PMingLiU;
|
||
panose-1:2 2 5 0 0 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:"MS Gothic";
|
||
panose-1:2 11 6 9 7 2 5 8 2 4;}
|
||
@font-face
|
||
{font-family:Dotum;
|
||
panose-1:2 11 6 0 0 1 1 1 1 1;}
|
||
@font-face
|
||
{font-family:ºÚÌå;
|
||
panose-1:2 1 6 9 6 1 1 1 1 1;}
|
||
@font-face
|
||
{font-family:MingLiU;
|
||
panose-1:2 2 5 9 0 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:Mincho;
|
||
panose-1:2 2 6 9 4 3 5 8 3 5;}
|
||
@font-face
|
||
{font-family:Gulim;
|
||
panose-1:2 11 6 0 0 1 1 1 1 1;}
|
||
@font-face
|
||
{font-family:Century;
|
||
panose-1:2 4 6 4 5 5 5 2 3 4;}
|
||
@font-face
|
||
{font-family:"Angsana New";
|
||
panose-1:2 2 6 3 5 4 5 2 3 4;}
|
||
@font-face
|
||
{font-family:"Cordia New";
|
||
panose-1:2 11 3 4 2 2 2 2 2 4;}
|
||
@font-face
|
||
{font-family:Mangal;
|
||
panose-1:2 4 5 3 5 2 3 3 2 2;}
|
||
@font-face
|
||
{font-family:Latha;
|
||
panose-1:2 11 6 4 2 2 2 2 2 4;}
|
||
@font-face
|
||
{font-family:Sylfaen;
|
||
panose-1:1 10 5 2 5 3 6 3 3 3;}
|
||
@font-face
|
||
{font-family:Vrinda;
|
||
panose-1:2 11 5 2 4 2 4 2 2 3;}
|
||
@font-face
|
||
{font-family:Raavi;
|
||
panose-1:2 11 5 2 4 2 4 2 2 3;}
|
||
@font-face
|
||
{font-family:Shruti;
|
||
panose-1:2 11 5 2 4 2 4 2 2 3;}
|
||
@font-face
|
||
{font-family:Sendnya;
|
||
panose-1:0 0 4 0 0 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:Gautami;
|
||
panose-1:2 11 5 2 4 2 4 2 2 3;}
|
||
@font-face
|
||
{font-family:Tunga;
|
||
panose-1:2 11 5 2 4 2 4 2 2 3;}
|
||
@font-face
|
||
{font-family:"Estrangelo Edessa";
|
||
panose-1:3 8 6 0 0 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:"Cambria Math";
|
||
panose-1:2 4 5 3 5 4 6 3 2 4;}
|
||
@font-face
|
||
{font-family:"Arial Unicode MS";
|
||
panose-1:2 11 6 4 2 2 2 2 2 4;}
|
||
@font-face
|
||
{font-family:Cambria;
|
||
panose-1:2 4 5 3 5 4 6 3 2 4;}
|
||
@font-face
|
||
{font-family:Calibri;
|
||
panose-1:2 15 5 2 2 2 4 3 2 4;}
|
||
@font-face
|
||
{font-family:·½ÕýС±êËμòÌå;}
|
||
@font-face
|
||
{font-family:"\@ºÚÌå";
|
||
panose-1:2 1 6 9 6 1 1 1 1 1;}
|
||
@font-face
|
||
{font-family:"\@ËÎÌå";
|
||
panose-1:2 1 6 0 3 1 1 1 1 1;}
|
||
@font-face
|
||
{font-family:"\@·½ÕýС±êËμòÌå";}
|
||
/* Style Definitions */
|
||
p.MsoNormal, li.MsoNormal, div.MsoNormal
|
||
{margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
h1
|
||
{mso-style-link:"±êÌâ 1 Char";
|
||
margin-top:17.0pt;
|
||
margin-right:0cm;
|
||
margin-bottom:16.5pt;
|
||
margin-left:7.2pt;
|
||
text-align:center;
|
||
text-indent:-7.2pt;
|
||
page-break-after:avoid;
|
||
font-size:22.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
h2
|
||
{mso-style-link:"±êÌâ 2 Char";
|
||
margin-top:13.0pt;
|
||
margin-right:0cm;
|
||
margin-bottom:13.0pt;
|
||
margin-left:0cm;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:0cm;
|
||
page-break-after:avoid;
|
||
font-size:16.0pt;
|
||
font-family:"Arial","sans-serif";
|
||
font-weight:bold;}
|
||
h3
|
||
{mso-style-link:"±êÌâ 3 Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:0cm;
|
||
page-break-after:avoid;
|
||
font-size:14.0pt;
|
||
font-family:"Arial","sans-serif";
|
||
font-weight:bold;}
|
||
h4
|
||
{mso-style-link:"±êÌâ 4 Char";
|
||
margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:28.8pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-28.8pt;
|
||
page-break-after:avoid;
|
||
font-size:12.0pt;
|
||
font-family:"Arial","sans-serif";
|
||
font-weight:bold;}
|
||
h5
|
||
{mso-style-link:"±êÌâ 5 Char";
|
||
margin-top:14.0pt;
|
||
margin-right:0cm;
|
||
margin-bottom:14.5pt;
|
||
margin-left:36.0pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-36.0pt;
|
||
line-height:156%;
|
||
page-break-after:avoid;
|
||
font-size:14.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
h6
|
||
{mso-style-link:"±êÌâ 6 Char";
|
||
margin-top:12.0pt;
|
||
margin-right:0cm;
|
||
margin-bottom:3.2pt;
|
||
margin-left:43.2pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-43.2pt;
|
||
line-height:133%;
|
||
page-break-after:avoid;
|
||
font-size:12.0pt;
|
||
font-family:"Arial","sans-serif";
|
||
font-weight:bold;}
|
||
p.MsoHeading7, li.MsoHeading7, div.MsoHeading7
|
||
{mso-style-link:"±êÌâ 7 Char";
|
||
margin-top:12.0pt;
|
||
margin-right:0cm;
|
||
margin-bottom:3.2pt;
|
||
margin-left:50.4pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-50.4pt;
|
||
line-height:133%;
|
||
page-break-after:avoid;
|
||
font-size:12.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.MsoHeading8, li.MsoHeading8, div.MsoHeading8
|
||
{mso-style-link:"±êÌâ 8 Char";
|
||
margin-top:12.0pt;
|
||
margin-right:0cm;
|
||
margin-bottom:3.2pt;
|
||
margin-left:57.6pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-72.0pt;
|
||
line-height:133%;
|
||
page-break-after:avoid;
|
||
font-size:12.0pt;
|
||
font-family:"Arial","sans-serif";}
|
||
p.MsoHeading9, li.MsoHeading9, div.MsoHeading9
|
||
{mso-style-link:"±êÌâ 9 Char";
|
||
margin-top:12.0pt;
|
||
margin-right:0cm;
|
||
margin-bottom:3.2pt;
|
||
margin-left:64.8pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-79.2pt;
|
||
line-height:133%;
|
||
page-break-after:avoid;
|
||
font-size:10.5pt;
|
||
font-family:"Arial","sans-serif";}
|
||
p.MsoIndex1, li.MsoIndex1, div.MsoIndex1
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:10.5pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-10.5pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoIndex2, li.MsoIndex2, div.MsoIndex2
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:21.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-10.5pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoIndex3, li.MsoIndex3, div.MsoIndex3
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:31.5pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-10.5pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoIndex4, li.MsoIndex4, div.MsoIndex4
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:42.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-10.5pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoIndex5, li.MsoIndex5, div.MsoIndex5
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:52.5pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-10.5pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoIndex6, li.MsoIndex6, div.MsoIndex6
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:63.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-10.5pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoIndex7, li.MsoIndex7, div.MsoIndex7
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:73.5pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-10.5pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoIndex8, li.MsoIndex8, div.MsoIndex8
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:84.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-10.5pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoIndex9, li.MsoIndex9, div.MsoIndex9
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:94.5pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-10.5pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoToc1, li.MsoToc1, div.MsoToc1
|
||
{margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.MsoToc2, li.MsoToc2, div.MsoToc2
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:21.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoToc3, li.MsoToc3, div.MsoToc3
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:42.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoToc4, li.MsoToc4, div.MsoToc4
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:31.5pt;
|
||
margin-bottom:.0001pt;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoToc5, li.MsoToc5, div.MsoToc5
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:42.0pt;
|
||
margin-bottom:.0001pt;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoToc6, li.MsoToc6, div.MsoToc6
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:52.5pt;
|
||
margin-bottom:.0001pt;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoToc7, li.MsoToc7, div.MsoToc7
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:63.0pt;
|
||
margin-bottom:.0001pt;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoToc8, li.MsoToc8, div.MsoToc8
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:73.5pt;
|
||
margin-bottom:.0001pt;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoToc9, li.MsoToc9, div.MsoToc9
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:84.0pt;
|
||
margin-bottom:.0001pt;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText
|
||
{mso-style-link:"½Å×¢Îı¾ Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
layout-grid-mode:char;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoCommentText, li.MsoCommentText, div.MsoCommentText
|
||
{mso-style-link:"Åú×¢ÎÄ×Ö Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoHeader, li.MsoHeader, div.MsoHeader
|
||
{mso-style-link:"ҳü Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
layout-grid-mode:char;
|
||
border:none;
|
||
padding:0cm;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoFooter, li.MsoFooter, div.MsoFooter
|
||
{mso-style-link:"Ò³½Å Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
layout-grid-mode:char;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoIndexHeading, li.MsoIndexHeading, div.MsoIndexHeading
|
||
{mso-style-name:"Ë÷Òý±êÌâ\,Ë÷ÒýÀàÄ¿\,Ë÷ÒýÀàÄ¿1\,Ë÷ÒýÀàÄ¿2";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoCaption, li.MsoCaption, div.MsoCaption
|
||
{margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:"Arial","sans-serif";}
|
||
p.MsoTof, li.MsoTof, div.MsoTof
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:42.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-21.0pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.MsoFootnoteReference
|
||
{vertical-align:super;}
|
||
p.MsoList, li.MsoList, div.MsoList
|
||
{margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:21.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
text-indent:-21.0pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoList2, li.MsoList2, div.MsoList2
|
||
{margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoList4, li.MsoList4, div.MsoList4
|
||
{margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.MsoDate, li.MsoDate, div.MsoDate
|
||
{mso-style-link:"ÈÕÆÚ Char";
|
||
margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:5.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
a:link, span.MsoHyperlink
|
||
{mso-style-name:"³¬Á´½Ó\,³¬¼¶Á´½Ó";
|
||
color:blue;
|
||
text-decoration:underline;}
|
||
a:visited, span.MsoHyperlinkFollowed
|
||
{color:purple;
|
||
text-decoration:underline;}
|
||
p
|
||
{mso-style-name:"ÆÕͨ\(ÍøÕ¾\)\,ÆÕͨ \(Web\)\,ÆÕͨ \(Web\)1\,ÆÕͨ \(Web\)2\,ÆÕͨ \(Web\)3";
|
||
margin-right:0cm;
|
||
margin-left:0cm;
|
||
font-size:12.0pt;
|
||
font-family:ËÎÌå;}
|
||
pre
|
||
{mso-style-name:"HTML Ô¤Éè¸ñʽ\,HTML Ô¤Ïȸñʽ»¯\,HTML Ô¤Ïȸñʽ»¯1\,HTML Ô¤Ïȸñʽ»¯2\,HTML Ô¤Ïȸñʽ»¯3";
|
||
mso-style-link:"HTML Ô¤Éè¸ñʽ Char\,HTML Ô¤Ïȸñʽ»¯ Char\,HTML Ô¤Ïȸñʽ»¯1 Char\,HTML Ô¤Ïȸñʽ»¯2 Char\,HTML Ô¤Ïȸñʽ»¯3 Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
font-size:12.0pt;
|
||
font-family:ËÎÌå;}
|
||
tt
|
||
{font-family:ºÚÌå;}
|
||
p.MsoCommentSubject, li.MsoCommentSubject, div.MsoCommentSubject
|
||
{mso-style-link:"Åú×¢Ö÷Ìâ Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
|
||
{mso-style-link:"Åú×¢¿òÎı¾ Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.1, li.1, div.1
|
||
{mso-style-name:Ñùʽ1;
|
||
margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:21.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
text-indent:-21.0pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.a, li.a, div.a
|
||
{mso-style-name:´úÂë³ÌÐò;
|
||
mso-style-link:"´úÂë³ÌÐò Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
font-size:10.0pt;
|
||
font-family:ËÎÌå;}
|
||
span.Char
|
||
{mso-style-name:"´úÂë³ÌÐò Char";
|
||
mso-style-link:´úÂë³ÌÐò;
|
||
font-family:ËÎÌå;}
|
||
p.a0, li.a0, div.a0
|
||
{mso-style-name:ͼ˵Ã÷;
|
||
mso-style-link:"ͼ˵Ã÷ Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.Char0
|
||
{mso-style-name:"ͼ˵Ã÷ Char";
|
||
mso-style-link:ͼ˵Ã÷;
|
||
font-family:ËÎÌå;}
|
||
p.0, li.0, div.0
|
||
{mso-style-name:·âÃæ0;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:36.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.10, li.10, div.10
|
||
{mso-style-name:·âÃæ1;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:18.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.11, li.11, div.11
|
||
{mso-style-name:·Ç±êÌâ1;
|
||
margin-top:7.8pt;
|
||
margin-right:0cm;
|
||
margin-bottom:7.8pt;
|
||
margin-left:0cm;
|
||
text-align:center;
|
||
font-size:22.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.a1, li.a1, div.a1
|
||
{mso-style-name:Îı¾¾ÓÖÐ;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.3CharChar, li.3CharChar, div.3CharChar
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö3 Char Char";
|
||
mso-style-link:"ͼÖÐÎÄ×Ö3 Char Char Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
line-height:9.0pt;
|
||
font-size:8.0pt;
|
||
font-family:ËÎÌå;}
|
||
span.3CharCharChar
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö3 Char Char Char";
|
||
mso-style-link:"ͼÖÐÎÄ×Ö3 Char Char";
|
||
font-family:ËÎÌå;}
|
||
p.post, li.post, div.post
|
||
{mso-style-name:Óʼþpost;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:right;
|
||
line-height:11.0pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.3, li.3, div.3
|
||
{mso-style-name:ͼÖÐ×ÖÌå3;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.3CharChar1CharCharChar
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö3 Char Char1 Char Char Char";
|
||
font-family:ËÎÌå;}
|
||
span.3CharChar1CharChar
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö3 Char Char1 Char Char";
|
||
font-family:ËÎÌå;}
|
||
p.5Char, li.5Char, div.5Char
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö5ºÅ Char";
|
||
mso-style-link:"ͼÖÐÎÄ×Ö5ºÅ Char Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.5CharChar
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö5ºÅ Char Char";
|
||
mso-style-link:"ͼÖÐÎÄ×Ö5ºÅ Char";
|
||
font-family:ËÎÌå;}
|
||
p.5CharChar0, li.5CharChar0, div.5CharChar0
|
||
{mso-style-name:"ͼÖÐÎÄ×ÖС5ºÅ Char Char";
|
||
mso-style-link:"ͼÖÐÎÄ×ÖС5ºÅ Char Char Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
span.5CharCharChar
|
||
{mso-style-name:"ͼÖÐÎÄ×ÖС5ºÅ Char Char Char";
|
||
mso-style-link:"ͼÖÐÎÄ×ÖС5ºÅ Char Char";
|
||
font-family:ËÎÌå;}
|
||
p.5Char0, li.5Char0, div.5Char0
|
||
{mso-style-name:"ͼÖÐÎÄ×ÖС5ºÅ Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.5, li.5, div.5
|
||
{mso-style-name:ͼÖÐÎÄ×ÖС5ºÅ;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
layout-grid-mode:char;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.2, li.2, div.2
|
||
{mso-style-name:´úÂë³ÌÐò2;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
font-size:10.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.20, li.20, div.20
|
||
{mso-style-name:ͼ˵Ã÷2;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.21, li.21, div.21
|
||
{mso-style-name:Îı¾¾ÓÖÐ2;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.3CharCharCharCharChar, li.3CharCharCharCharChar, div.3CharCharCharCharChar
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö3 Char Char Char Char Char";
|
||
mso-style-link:"ͼÖÐÎÄ×Ö3 Char Char Char Char Char Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
line-height:9.0pt;
|
||
font-size:8.0pt;
|
||
font-family:ËÎÌå;}
|
||
span.3CharCharCharCharCharChar
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö3 Char Char Char Char Char Char";
|
||
mso-style-link:"ͼÖÐÎÄ×Ö3 Char Char Char Char Char";
|
||
font-family:ËÎÌå;}
|
||
p.a2, li.a2, div.a2
|
||
{mso-style-name:ͼ¾ÓÖÐ;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.110, li.110, div.110
|
||
{mso-style-name:"Ñùʽ ±êÌâ 1 + ¾ÓÖÐ1";
|
||
margin-right:0cm;
|
||
margin-left:0cm;
|
||
text-align:center;
|
||
page-break-after:avoid;
|
||
font-size:22.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
span.1Char
|
||
{mso-style-name:"±êÌâ 1 Char";
|
||
mso-style-link:"±êÌâ 1";
|
||
font-weight:bold;}
|
||
p.22, li.22, div.22
|
||
{mso-style-name:"Ñùʽ Áбí 2 + ¾ÓÖÐ";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.23, li.23, div.23
|
||
{mso-style-name:Áбí2;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.50, li.50, div.50
|
||
{mso-style-name:ͼÖÐÎÄ×Ö5ºÅ;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.111, li.111, div.111
|
||
{mso-style-name:Ñùʽ11;
|
||
margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:21.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
text-indent:-21.0pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.12, li.12, div.12
|
||
{mso-style-name:´úÂë³ÌÐò1;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
font-size:10.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.13, li.13, div.13
|
||
{mso-style-name:ͼ˵Ã÷1;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.01, li.01, div.01
|
||
{mso-style-name:·âÃæ01;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:36.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.112, li.112, div.112
|
||
{mso-style-name:·âÃæ11;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:18.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.113, li.113, div.113
|
||
{mso-style-name:·Ç±êÌâ11;
|
||
margin-top:7.8pt;
|
||
margin-right:0cm;
|
||
margin-bottom:7.8pt;
|
||
margin-left:0cm;
|
||
text-align:center;
|
||
font-size:22.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.14, li.14, div.14
|
||
{mso-style-name:Îı¾¾ÓÖÐ1;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.3Char1, li.3Char1, div.3Char1
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö3 Char1";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
line-height:9.0pt;
|
||
font-size:8.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.post1, li.post1, div.post1
|
||
{mso-style-name:Óʼþpost1;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:right;
|
||
line-height:11.0pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.31, li.31, div.31
|
||
{mso-style-name:ͼÖÐ×ÖÌå31;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.5Char1, li.5Char1, div.5Char1
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö5ºÅ Char1";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.5CharChar1, li.5CharChar1, div.5CharChar1
|
||
{mso-style-name:"ͼÖÐÎÄ×ÖС5ºÅ Char Char1";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.5Char10, li.5Char10, div.5Char10
|
||
{mso-style-name:"ͼÖÐÎÄ×ÖС5ºÅ Char1";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.51, li.51, div.51
|
||
{mso-style-name:ͼÖÐÎÄ×ÖС5ºÅ1;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.120, li.120, div.120
|
||
{mso-style-name:Ñùʽ12;
|
||
margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:21.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
text-indent:-21.0pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.02, li.02, div.02
|
||
{mso-style-name:·âÃæ02;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:36.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.121, li.121, div.121
|
||
{mso-style-name:·âÃæ12;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:18.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.122, li.122, div.122
|
||
{mso-style-name:·Ç±êÌâ12;
|
||
margin-top:7.8pt;
|
||
margin-right:0cm;
|
||
margin-bottom:7.8pt;
|
||
margin-left:0cm;
|
||
text-align:center;
|
||
font-size:22.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.3Char2, li.3Char2, div.3Char2
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö3 Char2";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
line-height:9.0pt;
|
||
font-size:8.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.post2, li.post2, div.post2
|
||
{mso-style-name:Óʼþpost2;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:right;
|
||
line-height:11.0pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.32, li.32, div.32
|
||
{mso-style-name:ͼÖÐ×ÖÌå32;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.5Char2, li.5Char2, div.5Char2
|
||
{mso-style-name:"ͼÖÐÎÄ×ÖС5ºÅ Char2";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.52, li.52, div.52
|
||
{mso-style-name:ͼÖÐÎÄ×ÖС5ºÅ2;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.3CharCharCharChar, li.3CharCharCharChar, div.3CharCharCharChar
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö3 Char Char Char Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
line-height:9.0pt;
|
||
font-size:8.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.130, li.130, div.130
|
||
{mso-style-name:Ñùʽ13;
|
||
margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:21.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
text-indent:-21.0pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.30, li.30, div.30
|
||
{mso-style-name:´úÂë³ÌÐò3;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
font-size:10.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.03, li.03, div.03
|
||
{mso-style-name:·âÃæ03;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:36.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.131, li.131, div.131
|
||
{mso-style-name:·âÃæ13;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:18.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.132, li.132, div.132
|
||
{mso-style-name:·Ç±êÌâ13;
|
||
margin-top:7.8pt;
|
||
margin-right:0cm;
|
||
margin-bottom:7.8pt;
|
||
margin-left:0cm;
|
||
text-align:center;
|
||
font-size:22.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.33, li.33, div.33
|
||
{mso-style-name:Îı¾¾ÓÖÐ3;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.3Char3, li.3Char3, div.3Char3
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö3 Char3";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
line-height:9.0pt;
|
||
font-size:8.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.post3, li.post3, div.post3
|
||
{mso-style-name:Óʼþpost3;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:right;
|
||
line-height:11.0pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.330, li.330, div.330
|
||
{mso-style-name:ͼÖÐ×ÖÌå33;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.5Char20, li.5Char20, div.5Char20
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö5ºÅ Char2";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.5CharChar2, li.5CharChar2, div.5CharChar2
|
||
{mso-style-name:"ͼÖÐÎÄ×ÖС5ºÅ Char Char2";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.5Char3, li.5Char3, div.5Char3
|
||
{mso-style-name:"ͼÖÐÎÄ×ÖС5ºÅ Char3";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.53, li.53, div.53
|
||
{mso-style-name:ͼÖÐÎÄ×ÖС5ºÅ3;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.3Char, li.3Char, div.3Char
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö3 Char";
|
||
mso-style-link:"ͼÖÐÎÄ×Ö3 Char Char5";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
line-height:9.0pt;
|
||
font-size:8.0pt;
|
||
font-family:ËÎÌå;}
|
||
span.3CharChar5
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö3 Char Char5";
|
||
mso-style-link:"ͼÖÐÎÄ×Ö3 Char";
|
||
font-family:ËÎÌå;}
|
||
p.54, li.54, div.54
|
||
{mso-style-name:ͼÖÐÎÄ×ÖС5½ôÃÜ;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
line-height:9.0pt;
|
||
text-autospace:ideograph-numeric;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.24, li.24, div.24
|
||
{mso-style-name:¾ÓÖÐ2ºÅ´ÖËÎÌå;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:22.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.15, li.15, div.15
|
||
{mso-style-name:"Ñùʽ ±êÌâ 1 + ¾ÓÖÐ";
|
||
margin-top:17.0pt;
|
||
margin-right:0cm;
|
||
margin-bottom:16.5pt;
|
||
margin-left:0cm;
|
||
text-align:center;
|
||
page-break-after:avoid;
|
||
font-size:22.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.25, li.25, div.25
|
||
{mso-style-name:"Ñùʽ ±êÌâ 2 + Ðоà\: µ¥±¶Ðоà";
|
||
margin-top:13.0pt;
|
||
margin-right:0cm;
|
||
margin-bottom:13.0pt;
|
||
margin-left:28.9pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-28.9pt;
|
||
page-break-after:avoid;
|
||
font-size:16.0pt;
|
||
font-family:"Arial","sans-serif";
|
||
font-weight:bold;}
|
||
span.2Char
|
||
{mso-style-name:"±êÌâ 2 Char";
|
||
mso-style-link:"±êÌâ 2";
|
||
font-family:"Arial","sans-serif";
|
||
font-weight:bold;}
|
||
p.34, li.34, div.34
|
||
{mso-style-name:Áбí3;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.35, li.35, div.35
|
||
{mso-style-name:±í3;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.4, li.4, div.4
|
||
{mso-style-name:ͼ˵Ã÷4;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.40, li.40, div.40
|
||
{mso-style-name:Áбí4;
|
||
margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:21.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
text-indent:-21.0pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.41, li.41, div.41
|
||
{mso-style-name:±í4;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.55, li.55, div.55
|
||
{mso-style-name:ͼ˵Ã÷5;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.56, li.56, div.56
|
||
{mso-style-name:Áбí5;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.57, li.57, div.57
|
||
{mso-style-name:±í5;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.6, li.6, div.6
|
||
{mso-style-name:Áбí6;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.60, li.60, div.60
|
||
{mso-style-name:±í6;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.61, li.61, div.61
|
||
{mso-style-name:ͼ˵Ã÷6;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.7, li.7, div.7
|
||
{mso-style-name:Áбí7;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.70, li.70, div.70
|
||
{mso-style-name:ͼ˵Ã÷7;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.71, li.71, div.71
|
||
{mso-style-name:±í7;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.8, li.8, div.8
|
||
{mso-style-name:Áбí8;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.9, li.9, div.9
|
||
{mso-style-name:Áбí9;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.90, li.90, div.90
|
||
{mso-style-name:ͼ˵Ã÷9;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.100, li.100, div.100
|
||
{mso-style-name:Áбí10;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.101, li.101, div.101
|
||
{mso-style-name:ͼ˵Ã÷10;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.114, li.114, div.114
|
||
{mso-style-name:Áбí11;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.115, li.115, div.115
|
||
{mso-style-name:ͼ˵Ã÷11;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.116, li.116, div.116
|
||
{mso-style-name:±í11;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.123, li.123, div.123
|
||
{mso-style-name:Áбí12;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.124, li.124, div.124
|
||
{mso-style-name:ͼ˵Ã÷12;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.133, li.133, div.133
|
||
{mso-style-name:ͼ˵Ã÷13;
|
||
mso-style-link:"ͼ˵Ã÷13 Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.13Char
|
||
{mso-style-name:"ͼ˵Ã÷13 Char";
|
||
mso-style-link:ͼ˵Ã÷13;
|
||
font-family:ËÎÌå;}
|
||
p.134, li.134, div.134
|
||
{mso-style-name:Áбí13;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.26, li.26, div.26
|
||
{mso-style-name:¸½Â¼2;
|
||
margin-top:13.0pt;
|
||
margin-right:0cm;
|
||
margin-bottom:13.0pt;
|
||
margin-left:0cm;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
page-break-after:avoid;
|
||
font-size:16.0pt;
|
||
font-family:"Arial","sans-serif";
|
||
font-weight:bold;}
|
||
p.36, li.36, div.36
|
||
{mso-style-name:¸½Â¼3;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
page-break-after:avoid;
|
||
font-size:14.0pt;
|
||
font-family:"Arial","sans-serif";
|
||
font-weight:bold;}
|
||
span.3Char0
|
||
{mso-style-name:"±êÌâ 3 Char";
|
||
mso-style-link:"±êÌâ 3";
|
||
font-family:"Arial","sans-serif";
|
||
font-weight:bold;}
|
||
p.16, li.16, div.16
|
||
{mso-style-name:¸½Â¼1;
|
||
margin-top:17.0pt;
|
||
margin-right:0cm;
|
||
margin-bottom:16.5pt;
|
||
margin-left:0cm;
|
||
text-align:center;
|
||
page-break-after:avoid;
|
||
font-size:22.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.17, li.17, div.17
|
||
{mso-style-name:¸½Â¼±í1;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.42, li.42, div.42
|
||
{mso-style-name:¸½Â¼4;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
page-break-after:avoid;
|
||
font-size:12.0pt;
|
||
font-family:"Arial","sans-serif";
|
||
font-weight:bold;}
|
||
span.4Char
|
||
{mso-style-name:"±êÌâ 4 Char";
|
||
mso-style-link:"±êÌâ 4";
|
||
font-family:"Arial","sans-serif";
|
||
font-weight:bold;}
|
||
p.a3, li.a3, div.a3
|
||
{mso-style-name:¸½Â¼Í¼ËµÃ÷;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.27, li.27, div.27
|
||
{mso-style-name:Ðò±êÌâ2;
|
||
margin-top:13.0pt;
|
||
margin-right:0cm;
|
||
margin-bottom:13.0pt;
|
||
margin-left:28.8pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
text-indent:-28.8pt;
|
||
page-break-after:avoid;
|
||
font-size:16.0pt;
|
||
font-family:"Arial","sans-serif";
|
||
font-weight:bold;}
|
||
p.a4, li.a4, div.a4
|
||
{mso-style-name:²Î¿¼±êÌâ;
|
||
margin-top:7.8pt;
|
||
margin-right:0cm;
|
||
margin-bottom:7.8pt;
|
||
margin-left:0cm;
|
||
text-align:center;
|
||
page-break-after:avoid;
|
||
font-size:22.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.18, li.18, div.18
|
||
{mso-style-name:Ë÷Òý±êÌâ1;
|
||
margin-top:7.8pt;
|
||
margin-right:0cm;
|
||
margin-bottom:7.8pt;
|
||
margin-left:0cm;
|
||
text-align:center;
|
||
page-break-after:avoid;
|
||
font-size:22.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.19, li.19, div.19
|
||
{mso-style-name:Áбí1;
|
||
margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:21.25pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
text-indent:-21.25pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.1a, li.1a, div.1a
|
||
{mso-style-name:±í1;
|
||
margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:21.25pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
text-indent:-21.25pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.37, li.37, div.37
|
||
{mso-style-name:ͼ˵Ã÷3;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.62, li.62, div.62
|
||
{mso-style-name:±íÖÐ×ÖÌå6ºÅ;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
layout-grid-mode:char;
|
||
font-size:7.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.a5, li.a5, div.a5
|
||
{mso-style-name:ÕýÎÄ´úÂë;
|
||
mso-style-link:"ÕýÎÄ´úÂë Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.Char1
|
||
{mso-style-name:"ÕýÎÄ´úÂë Char";
|
||
mso-style-link:ÕýÎÄ´úÂë;
|
||
font-family:ËÎÌå;}
|
||
p.43, li.43, div.43
|
||
{mso-style-name:"Ñùʽ ±êÌâ 4 +";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
page-break-after:avoid;
|
||
font-size:12.0pt;
|
||
font-family:"Arial","sans-serif";
|
||
font-weight:bold;}
|
||
p.140, li.140, div.140
|
||
{mso-style-name:±í14;
|
||
margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:21.25pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
text-indent:-21.25pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.141, li.141, div.141
|
||
{mso-style-name:ͼ˵Ã÷14;
|
||
mso-style-link:"ͼ˵Ã÷14 Char";
|
||
margin-top:0cm;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:21.25pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
text-indent:-21.25pt;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.14Char
|
||
{mso-style-name:"ͼ˵Ã÷14 Char";
|
||
mso-style-link:ͼ˵Ã÷14;
|
||
font-family:ËÎÌå;}
|
||
p.a6, li.a6, div.a6
|
||
{mso-style-name:ÎļþĿ¼±í;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.a7, li.a7, div.a7
|
||
{mso-style-name:"Ñùʽ ÕýÎÄ +";
|
||
mso-style-link:"Ñùʽ ÕýÎÄ + Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.Char2
|
||
{mso-style-name:"Ñùʽ ÕýÎÄ + Char";
|
||
mso-style-link:"Ñùʽ ÕýÎÄ +";
|
||
font-family:"Times New Roman","serif";}
|
||
p.a8, li.a8, div.a8
|
||
{mso-style-name:±í¸ñÌâ×¢;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.a9, li.a9, div.a9
|
||
{mso-style-name:ÁбíÌâ×¢;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:"Arial","sans-serif";}
|
||
p.aa, li.aa, div.aa
|
||
{mso-style-name:ͼÌâ×¢;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:"Arial","sans-serif";}
|
||
p.ab, li.ab, div.ab
|
||
{mso-style-name:³ÌÐòÌâ×¢;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:"Arial","sans-serif";}
|
||
p.ac, li.ac, div.ac
|
||
{mso-style-name:¿òÖÐÎÄ×Ö;
|
||
margin-top:0cm;
|
||
margin-right:21.0pt;
|
||
margin-bottom:0cm;
|
||
margin-left:21.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
border:none;
|
||
padding:0cm;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.125, li.125, div.125
|
||
{mso-style-name:"Ñùʽ ±êÌâ 1 + ¾ÓÖÐ2";
|
||
margin-top:17.0pt;
|
||
margin-right:0cm;
|
||
margin-bottom:16.5pt;
|
||
margin-left:0cm;
|
||
text-align:center;
|
||
page-break-after:avoid;
|
||
font-size:22.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.ad, li.ad, div.ad
|
||
{mso-style-name:"Ñùʽ Ìâ×¢ + ËÎÌå ÎåºÅ ¾ÓÖÐ";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ºÚÌå;}
|
||
p.1b, li.1b, div.1b
|
||
{mso-style-name:Ðò±êÌâ1;
|
||
margin-top:17.0pt;
|
||
margin-right:0cm;
|
||
margin-bottom:16.5pt;
|
||
margin-left:0cm;
|
||
line-height:240%;
|
||
page-break-after:avoid;
|
||
font-size:16.0pt;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
p.38, li.38, div.38
|
||
{mso-style-name:Ðò±êÌâ3;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
page-break-after:avoid;
|
||
font-size:12.0pt;
|
||
font-family:·½ÕýС±êËμòÌå;}
|
||
p.63, li.63, div.63
|
||
{mso-style-name:±íÖÐÎÄ×Ö6ºÅ;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:7.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.64, li.64, div.64
|
||
{mso-style-name:ͼÖÐÎÄ×Ö6ºÅ×ó¶ÔÆë;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
line-height:10.0pt;
|
||
layout-grid-mode:char;
|
||
font-size:7.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.65, li.65, div.65
|
||
{mso-style-name:ͼÖÐÎÄ×Ö6ºÅ;
|
||
mso-style-link:"ͼÖÐÎÄ×Ö6ºÅ Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
line-height:10.0pt;
|
||
layout-grid-mode:char;
|
||
font-size:7.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.6Char
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö6ºÅ Char";
|
||
mso-style-link:ͼÖÐÎÄ×Ö6ºÅ;
|
||
font-family:ËÎÌå;}
|
||
p.ae, li.ae, div.ae
|
||
{mso-style-name:ͼ±ê;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.28, li.28, div.28
|
||
{mso-style-name:ͼ±ê2;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.af, li.af, div.af
|
||
{mso-style-name:ϰÌâ±êÌâ;
|
||
margin-top:6.0pt;
|
||
margin-right:0cm;
|
||
margin-bottom:0cm;
|
||
margin-left:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
page-break-after:avoid;
|
||
font-size:14.0pt;
|
||
font-family:ºÚÌå;}
|
||
p.1c, li.1c, div.1c
|
||
{mso-style-name:²¿·Ö±àºÅ1;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:16.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.af0, li.af0, div.af0
|
||
{mso-style-name:±í±êÌâ;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:"Arial","sans-serif";}
|
||
p.af1, li.af1, div.af1
|
||
{mso-style-name:"Ñùʽ Ìâ×¢ + ¾ÓÖÐ";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
p.ListTitle, li.ListTitle, div.ListTitle
|
||
{mso-style-name:ListTitle;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:"Arial","sans-serif";}
|
||
p.FigureTitle, li.FigureTitle, div.FigureTitle
|
||
{mso-style-name:FigureTitle;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:"Arial","sans-serif";}
|
||
p.TableTitle, li.TableTitle, div.TableTitle
|
||
{mso-style-name:TableTitle;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:"Arial","sans-serif";}
|
||
p.ProgramTitle, li.ProgramTitle, div.ProgramTitle
|
||
{mso-style-name:ProgramTitle;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:center;
|
||
font-size:10.5pt;
|
||
font-family:"Arial","sans-serif";}
|
||
p.RightText, li.RightText, div.RightText
|
||
{mso-style-name:RightText;
|
||
margin-top:0cm;
|
||
margin-right:21.0pt;
|
||
margin-bottom:0cm;
|
||
margin-left:42.0pt;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
border:none;
|
||
padding:0cm;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.af2, li.af2, div.af2
|
||
{mso-style-name:±íÖÐÎÄ×ÖСÎå;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.af3, li.af3, div.af3
|
||
{mso-style-name:¹Ø¼ü´Ê;
|
||
mso-style-link:"¹Ø¼ü´Ê Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.Char3
|
||
{mso-style-name:"¹Ø¼ü´Ê Char";
|
||
mso-style-link:¹Ø¼ü´Ê;
|
||
font-family:ËÎÌå;}
|
||
p.af4, li.af4, div.af4
|
||
{mso-style-name:ÎļþÃû;
|
||
mso-style-link:"ÎļþÃû Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.Char4
|
||
{mso-style-name:"ÎļþÃû Char";
|
||
mso-style-link:ÎļþÃû;
|
||
font-family:ËÎÌå;}
|
||
p.af5, li.af5, div.af5
|
||
{mso-style-name:Ñ¡Ïî;
|
||
mso-style-link:"Ñ¡Ïî Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.Char5
|
||
{mso-style-name:"Ñ¡Ïî Char";
|
||
mso-style-link:Ñ¡Ïî;
|
||
font-family:ËÎÌå;}
|
||
p.af6, li.af6, div.af6
|
||
{mso-style-name:ÃüÁîÐÐ;
|
||
mso-style-link:"ÃüÁîÐÐ Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.Char6
|
||
{mso-style-name:"ÃüÁîÐÐ Char";
|
||
mso-style-link:ÃüÁîÐÐ;
|
||
font-family:ËÎÌå;}
|
||
p.af7, li.af7, div.af7
|
||
{mso-style-name:º¯ÊýÃû;
|
||
mso-style-link:"º¯ÊýÃû Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.Char7
|
||
{mso-style-name:"º¯ÊýÃû Char";
|
||
mso-style-link:º¯ÊýÃû;
|
||
font-family:ËÎÌå;}
|
||
p.af8, li.af8, div.af8
|
||
{mso-style-name:¼Ä´æÆ÷Ãû;
|
||
mso-style-link:"¼Ä´æÆ÷Ãû Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.Char8
|
||
{mso-style-name:"¼Ä´æÆ÷Ãû Char";
|
||
mso-style-link:¼Ä´æÆ÷Ãû;
|
||
font-family:"Times New Roman","serif";}
|
||
p.af9, li.af9, div.af9
|
||
{mso-style-name:±äÁ¿Ãû;
|
||
mso-style-link:"±äÁ¿Ãû Char";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
text-align:justify;
|
||
text-justify:inter-ideograph;
|
||
font-size:10.5pt;
|
||
font-family:ËÎÌå;}
|
||
span.Char9
|
||
{mso-style-name:"±äÁ¿Ãû Char";
|
||
mso-style-link:±äÁ¿Ãû;
|
||
font-family:ËÎÌå;}
|
||
p.58, li.58, div.58
|
||
{mso-style-name:ͼÖÐÎÄ×ÖС5ºÅ×ó;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.59, li.59, div.59
|
||
{mso-style-name:ͼÖÐÎÄ×ÖС5ºÅ¿¿×ó;
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
layout-grid-mode:char;
|
||
font-size:9.0pt;
|
||
font-family:ËÎÌå;}
|
||
p.926, li.926, div.926
|
||
{mso-style-name:"Ñùʽ ´úÂë³ÌÐò + ×ó²à\: 9\.26 ÀåÃ×";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
layout-grid-mode:char;
|
||
font-size:10.0pt;
|
||
font-family:ËÎÌå;}
|
||
span.5Char4
|
||
{mso-style-name:"±êÌâ 5 Char";
|
||
mso-style-link:"±êÌâ 5";
|
||
font-weight:bold;}
|
||
span.6Char0
|
||
{mso-style-name:"±êÌâ 6 Char";
|
||
mso-style-link:"±êÌâ 6";
|
||
font-family:"Arial","sans-serif";
|
||
font-weight:bold;}
|
||
span.7Char
|
||
{mso-style-name:"±êÌâ 7 Char";
|
||
mso-style-link:"±êÌâ 7";
|
||
font-weight:bold;}
|
||
span.8Char
|
||
{mso-style-name:"±êÌâ 8 Char";
|
||
mso-style-link:"±êÌâ 8";
|
||
font-family:"Arial","sans-serif";}
|
||
span.9Char
|
||
{mso-style-name:"±êÌâ 9 Char";
|
||
mso-style-link:"±êÌâ 9";
|
||
font-family:"Arial","sans-serif";}
|
||
span.Chara
|
||
{mso-style-name:"½Å×¢Îı¾ Char";
|
||
mso-style-link:½Å×¢Îı¾;
|
||
font-family:ËÎÌå;}
|
||
span.Charb
|
||
{mso-style-name:"Åú×¢ÎÄ×Ö Char";
|
||
mso-style-link:Åú×¢ÎÄ×Ö;
|
||
font-family:ËÎÌå;}
|
||
span.Charc
|
||
{mso-style-name:"ҳü Char";
|
||
mso-style-link:ҳü;
|
||
font-family:ËÎÌå;}
|
||
span.Chard
|
||
{mso-style-name:"Ò³½Å Char";
|
||
mso-style-link:Ò³½Å;
|
||
font-family:ËÎÌå;}
|
||
span.Chare
|
||
{mso-style-name:"ÈÕÆÚ Char";
|
||
mso-style-link:ÈÕÆÚ;
|
||
font-family:ËÎÌå;}
|
||
span.HTMLChar
|
||
{mso-style-name:"HTML Ô¤Éè¸ñʽ Char\,HTML Ô¤Ïȸñʽ»¯ Char\,HTML Ô¤Ïȸñʽ»¯1 Char\,HTML Ô¤Ïȸñʽ»¯2 Char\,HTML Ô¤Ïȸñʽ»¯3 Char";
|
||
mso-style-link:"HTML Ô¤Éè¸ñʽ\,HTML Ô¤Ïȸñʽ»¯\,HTML Ô¤Ïȸñʽ»¯1\,HTML Ô¤Ïȸñʽ»¯2\,HTML Ô¤Ïȸñʽ»¯3";
|
||
font-family:ËÎÌå;}
|
||
span.Charf
|
||
{mso-style-name:"Åú×¢Ö÷Ìâ Char";
|
||
mso-style-link:Åú×¢Ö÷Ìâ;
|
||
font-family:ËÎÌå;
|
||
font-weight:bold;}
|
||
span.Charf0
|
||
{mso-style-name:"Åú×¢¿òÎı¾ Char";
|
||
mso-style-link:Åú×¢¿òÎı¾;
|
||
font-family:ËÎÌå;}
|
||
span.3CharChar1
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö3 Char Char1";
|
||
font-family:ËÎÌå;}
|
||
span.3CharChar3
|
||
{mso-style-name:"ͼÖÐÎÄ×Ö3 Char Char3";
|
||
font-family:ËÎÌå;}
|
||
span.msoIns
|
||
{mso-style-name:"";
|
||
text-decoration:underline;
|
||
color:teal;}
|
||
span.msoDel
|
||
{mso-style-name:"";
|
||
text-decoration:line-through;
|
||
color:red;}
|
||
.MsoChpDefault
|
||
{font-size:10.0pt;}
|
||
/* Page Definitions */
|
||
@page WordSection1
|
||
{size:595.3pt 841.9pt;
|
||
margin:72.0pt 54.0pt 72.0pt 54.0pt;
|
||
layout-grid:15.6pt;}
|
||
div.WordSection1
|
||
{page:WordSection1;}
|
||
/* List Definitions */
|
||
ol
|
||
{margin-bottom:0cm;}
|
||
ul
|
||
{margin-bottom:0cm;}
|
||
-->
|
||
</style>
|
||
|
||
</head>
|
||
|
||
<body lang=ZH-CN link=blue vlink=purple style='text-justify-trim:punctuation'>
|
||
|
||
<div class=WordSection1 style='layout-grid:15.6pt'>
|
||
|
||
<p class=ab><a name="_Toc53320648"><span style='font-family:ºÚÌå'>³ÌÐò</span><span
|
||
lang=EN-US>12-6 linux/fs/namei.c</span></a></p>
|
||
|
||
<div class=a align=center style='text-align:center'><span lang=EN-US>
|
||
|
||
<hr size=4 width="100%" align=center>
|
||
|
||
</span></div>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>1</span></u> <b><i>/*</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>2</span></u> <b><i> *
|
||
linux/fs/namei.c</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>3</span></u> <b><i> *</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>4</span></u> <b><i> *
|
||
(C) 1991 Linus Torvalds</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>5</span></u> <b><i> */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>6</span></u> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>7</span></u> <b><i>/*</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>8</span></u> <b><i> *
|
||
Some corrections by tytso.</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>9</span></u> <b><i> */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>10</span></u> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>11</span></u>
|
||
#include <linux/sched.h> // </span>µ÷¶È³ÌÐòÍ·Îļþ£¬¶¨ÒåÁËÈÎÎñ½á¹¹<span lang=EN-US>task_struct</span>¡¢ÈÎÎñ<span
|
||
lang=EN-US>0</span>µÄÊý¾ÝµÈ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>12</span></u>
|
||
#include <linux/kernel.h> // </span>ÄÚºËÍ·Îļþ¡£º¬ÓÐһЩÄں˳£Óú¯ÊýµÄÔÐζ¨Òå¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>13</span></u>
|
||
#include <asm/segment.h> // </span>¶Î²Ù×÷Í·Îļþ¡£¶¨ÒåÁËÓйضμĴæÆ÷²Ù×÷µÄǶÈëʽ»ã±àº¯Êý¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>14</span></u> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>15</span></u>
|
||
#include <string.h> // </span>×Ö·û´®Í·Îļþ¡£Ö÷Òª¶¨ÒåÁËһЩÓйØ×Ö·û´®²Ù×÷µÄǶÈ뺯Êý¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>16</span></u>
|
||
#include <fcntl.h> // </span>Îļþ¿ØÖÆÍ·Îļþ¡£Îļþ¼°ÆäÃèÊö·ûµÄ²Ù×÷¿ØÖƳ£Êý·ûºÅµÄ¶¨Òå¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>17</span></u>
|
||
#include <errno.h> // </span>´íÎóºÅÍ·Îļþ¡£°üº¬ÏµÍ³Öи÷ÖÖ³ö´íºÅ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>18</span></u>
|
||
#include <const.h> // </span>³£Êý·ûºÅÍ·Îļþ¡£Ä¿Ç°½ö¶¨Òå<span
|
||
lang=EN-US>i</span>½ÚµãÖÐ<span lang=EN-US>i_mode</span>×ֶεĸ÷±ê־λ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>19</span></u>
|
||
#include <sys/stat.h> // </span>Îļþ״̬ͷÎļþ¡£º¬ÓÐÎļþ»òÎļþϵͳ״̬½á¹¹<span
|
||
lang=EN-US>stat{}</span>ºÍ³£Á¿¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>20</span></u> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÓÉÎļþÃû²éÕÒ¶ÔÓ¦<span
|
||
lang=EN-US>i</span>½ÚµãµÄÄÚ²¿º¯Êý¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>21</span></u>
|
||
static struct <u><span style='color:blue'>m_inode</span></u> * <u><span
|
||
style='color:blue'>_namei</span></u>(const char * filename, struct <u><span
|
||
style='color:blue'>m_inode</span></u> * base,</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>22</span></u>
|
||
int follow_links);</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>23</span></u> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÏÂÃæºêÖÐÓÒ²à±í´ïʽÊÇ·ÃÎÊÊý×éµÄÒ»ÖÖÌØÊâʹÓ÷½·¨¡£Ëü»ùÓÚÕâÑùµÄÒ»¸öÊÂʵ£¬¼´ÓÃÊý×éÃûºÍ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Êý×éϱêËù±íʾµÄÊý×éÏÀýÈç<span
|
||
lang=EN-US>a[b]</span>£©µÄÖµµÈͬÓÚʹÓÃÊý×éÊ×Ö¸Õ루µØÖ·£©¼ÓÉϸÃÏîÆ«ÒÆµØÖ·</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÄÐÎʽµÄÖµ <span
|
||
lang=EN-US>*(a + b)</span>£¬Í¬Ê±¿ÉÖªÏî<span lang=EN-US>a[b]</span>Ò²¿ÉÒÔ±íʾ³É<span
|
||
lang=EN-US>b[a]</span>µÄÐÎʽ¡£Òò´Ë¶ÔÓÚ×Ö·ûÊý×éÏîÐÎʽ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ϊ <span lang=EN-US>"LoveYou"[2]</span>£¨»òÕß<span
|
||
lang=EN-US>2["LoveYou"]</span>£©¾ÍµÈͬÓÚ<span lang=EN-US>*("LoveYou"
|
||
+ 2)</span>¡£ÁíÍ⣬×Ö·û´®<span lang=EN-US>"LoveYou"</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÔÚÄÚ´æÖб»´æ´¢µÄλÖþÍÊÇÆäµØÖ·£¬Òò´ËÊý×éÏî<span
|
||
lang=EN-US>"LoveYou"[2]</span>µÄÖµ¾ÍÊǸÃ×Ö·û´®ÖÐË÷ÒýֵΪ<span lang=EN-US>2</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÄ×Ö·û<span lang=EN-US>"v"</span>Ëù¶ÔÓ¦µÄ<span
|
||
lang=EN-US>ASCII</span>ÂëÖµ<span lang=EN-US>0x76</span>£¬»òÓð˽øÖƱíʾ¾ÍÊÇ<span
|
||
lang=EN-US>0166</span>¡£ÔÚ<span lang=EN-US>C</span>ÓïÑÔÖУ¬×Ö·ûÒ²¿ÉÒÔÓÃ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Æä<span lang=EN-US>ASCII</span>ÂëÖµÀ´±íʾ£¬·½·¨ÊÇÔÚ×Ö·ûµÄ<span
|
||
lang=EN-US>ASCII</span>ÂëÖµÇ°Ãæ¼ÓÒ»¸ö·´Ð±¸Ü¡£ÀýÈç×Ö·û <span lang=EN-US>"v"</span>¿ÉÒÔ±íʾ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>³É<span lang=EN-US>"\x76"</span>»òÕß<span
|
||
lang=EN-US>"\166"</span>¡£Òò´Ë¶ÔÓÚ²»¿ÉÏÔʾµÄ×Ö·û£¨ÀýÈç<span lang=EN-US>ASCII</span>ÂëֵΪ<span
|
||
lang=EN-US>0x00--0x1f</span>µÄ¿ØÖÆ×Ö·û£©</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¾Í¿ÉÓÃÆä<span lang=EN-US>ASCII</span>ÂëÖµÀ´±íʾ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÏÂÃæÊÇ·ÃÎÊģʽºê¡£<span
|
||
lang=EN-US>x</span>ÊÇÍ·Îļþ<span lang=EN-US>include/fcntl.h</span>ÖеÚ<span
|
||
lang=EN-US>7</span>ÐпªÊ¼¶¨ÒåµÄÎļþ·ÃÎÊ£¨´ò¿ª£©±êÖ¾¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Õâ¸öºê¸ù¾ÝÎļþ·ÃÎʱêÖ¾<span
|
||
lang=EN-US>x</span>µÄÖµÀ´Ë÷ÒýË«ÒýºÅÖжÔÓ¦µÄÊýÖµ¡£Ë«ÒýºÅÖÐÓÐ<span lang=EN-US>4</span>¸ö°Ë½øÖÆÊýÖµ£¨Êµ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼Ê±íʾ<span lang=EN-US>4</span>¸ö¿ØÖÆ×Ö·û£©£º<span
|
||
lang=EN-US>"\004\002\006\377"</span>£¬·Ö±ð±íʾ¶Á¡¢Ð´ºÍÖ´ÐеÄȨÏÞΪ<span lang=EN-US>:
|
||
r</span>¡¢<span lang=EN-US>w</span>¡¢<span lang=EN-US>rw</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ºÍ<span lang=EN-US>wxrwxrwx</span>£¬²¢ÇÒ·Ö±ð¶ÔÓ¦<span
|
||
lang=EN-US>x</span>µÄË÷ÒýÖµ<span lang=EN-US>0--3</span>¡£ ÀýÈ磬Èç¹û<span lang=EN-US>x</span>Ϊ<span
|
||
lang=EN-US>2</span>£¬Ôò¸Ãºê·µ»Ø°Ë½øÖÆÖµ<span lang=EN-US>006</span>£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>±íʾ¿É¶Á¿Éд£¨<span
|
||
lang=EN-US>rw</span>£©¡£ÁíÍ⣬ÆäÖÐ<span lang=EN-US>O_ACCMODE = 00003</span>£¬ÊÇË÷ÒýÖµ<span
|
||
lang=EN-US>x</span>µÄÆÁ±ÎÂë¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>24</span></u>
|
||
#define <u><span style='color:blue'>ACC_MODE</span></u>(<u><span
|
||
style='color:blue'>x</span></u>) (<i>"\004\002\006\377"</i>[(<u><span
|
||
style='color:blue'>x</span></u>)&<u><span style='color:blue'>O_ACCMODE</span></u>])</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>25</span></u> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>26</span></u> <b><i>/*</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>27</span></u> <b><i> *
|
||
comment out this line if you want names > NAME_LEN chars to be</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>28</span></u> <b><i> *
|
||
truncated. Else they will be disallowed.</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>29</span></u> <b><i> */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> /*</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>Èç¹ûÏëÈÃÎļþÃû³¤¶È<span
|
||
lang=EN-US> > NAME_LEN</span>¸öµÄ×Ö·û±»½Øµô£¬¾Í½«ÏÂÃæ¶¨Òå×¢Ê͵ô¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> */</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>30</span></u> <b><i>/*
|
||
#define NO_TRUNCATE */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>31</span></u> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>32</span></u>
|
||
#define <u><span style='color:blue'>MAY_EXEC</span></u> 1
|
||
// </span>¿ÉÖ´ÐÐ<span lang=EN-US>(</span>¿É½øÈë<span lang=EN-US>)</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>33</span></u>
|
||
#define <u><span style='color:blue'>MAY_WRITE</span></u> 2
|
||
// </span>¿Éд¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>34</span></u>
|
||
#define <u><span style='color:blue'>MAY_READ</span></u> 4
|
||
// </span>¿É¶Á¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>35</span></u> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>36</span></u> <b><i>/*</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>37</span></u> <b><i> *
|
||
permission()</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>38</span></u> <b><i> *</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>39</span></u> <b><i> *
|
||
is used to check for read/write/execute permissions on a file.</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>40</span></u> <b><i> *
|
||
I don't know if we should look at just the euid or both euid and</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>41</span></u> <b><i> *
|
||
uid, but that should be easily changed.</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>42</span></u> <b><i> */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> /*</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * permission()</span></p>
|
||
|
||
<p class=a><span lang=EN-US> *</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>¸Ãº¯ÊýÓÃÓÚ¼ì²âÒ»¸öÎļþµÄ¶Á<span
|
||
lang=EN-US>/</span>д<span lang=EN-US>/</span>Ö´ÐÐȨÏÞ¡£ÎÒ²»ÖªµÀÊÇ·ñÖ»Ðè¼ì²é<span lang=EN-US>euid</span>£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>»¹ÊÇÐèÒª¼ì²é<span
|
||
lang=EN-US>euid</span>ºÍ<span lang=EN-US>uid</span>Á½Õߣ¬²»¹ýÕâºÜÈÝÒ×Ð޸ġ£</p>
|
||
|
||
<p class=a><span lang=EN-US> */</span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>¼ì²âÎļþ·ÃÎÊÐí¿ÉȨÏÞ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>inode
|
||
- </span>ÎļþµÄ<span lang=EN-US>i</span>½ÚµãÖ¸Õ룻<span lang=EN-US>mask - </span>·ÃÎÊÊôÐÔÆÁ±ÎÂë¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£º·ÃÎÊÐí¿É·µ»Ø<span
|
||
lang=EN-US>1</span>£¬·ñÔò·µ»Ø<span lang=EN-US>0</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>43</span></u>
|
||
static int <u><span style='color:blue'>permission</span></u>(struct <u><span
|
||
style='color:blue'>m_inode</span></u> * inode,int mask)</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>44</span></u> {</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>45</span></u>
|
||
int mode = inode->i_mode; //
|
||
</span>Îļþ·ÃÎÊÊôÐÔ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>46</span></u> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>47</span></u> <b><i>/*
|
||
special case: not even root can read/write a deleted file */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> /* </span>ÌØÊâÇé¿ö£º¼´Ê¹Êdz¬¼¶Óû§£¨<span
|
||
lang=EN-US>root</span>£©Ò²²»ÄܶÁ<span lang=EN-US>/</span>дһ¸öÒѱ»É¾³ýµÄÎļþ<span lang=EN-US>
|
||
*/</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹û<span lang=EN-US>i</span>½ÚµãÓжÔÓ¦µÄÉ豸£¬µ«¸Ã<span
|
||
lang=EN-US>i</span>½ÚµãµÄÁ´½Ó¼ÆÊýÖµµÈÓÚ<span lang=EN-US>0</span>£¬±íʾ¸ÃÎļþÒѱ»É¾³ý£¬Ôò·µ»Ø¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·ñÔò£¬Èç¹û½ø³ÌµÄÓÐЧÓû§<span
|
||
lang=EN-US>id</span>£¨<span lang=EN-US>euid</span>£©Óë<span lang=EN-US>i</span>½ÚµãµÄÓû§<span
|
||
lang=EN-US>id</span>Ïàͬ£¬ÔòÈ¡ÎļþËÞÖ÷µÄ·ÃÎÊȨÏÞ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·ñÔò£¬Èç¹û½ø³ÌµÄÓÐЧ×é<span
|
||
lang=EN-US>id</span>£¨<span lang=EN-US>egid</span>£©Óë<span lang=EN-US>i</span>½ÚµãµÄ×é<span
|
||
lang=EN-US>id</span>Ïàͬ£¬ÔòÈ¡×éÓû§µÄ·ÃÎÊȨÏÞ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>48</span></u>
|
||
if (inode->i_dev && !inode->i_nlinks)</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>49</span></u>
|
||
return 0;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>50</span></u>
|
||
else if (<u><span style='color:blue'>current</span></u>->euid==inode->i_uid)</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>51</span></u>
|
||
mode >>= 6;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>52</span></u>
|
||
else if (<u><span style='color:blue'>in_group_p</span></u>(inode->i_gid))</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>53</span></u>
|
||
mode >>= 3;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>×îºóÅжÏÈç¹ûËùÈ¡µÄµÄ·ÃÎÊȨÏÞÓëÆÁ±ÎÂëÏàͬ£¬»òÕßÊdz¬¼¶Óû§£¬Ôò·µ»Ø<span
|
||
lang=EN-US>1</span>£¬·ñÔò·µ»Ø<span lang=EN-US>0</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>54</span></u>
|
||
if (((mode & mask & 0007) == mask) || <u><span style='color:blue'>suser</span></u>())</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>55</span></u>
|
||
return 1;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>56</span></u>
|
||
return 0;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>57</span></u> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>58</span></u> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>59</span></u> <b><i>/*</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>60</span></u> <b><i> *
|
||
ok, we cannot use strncmp, as the name is not in our data space.</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>61</span></u> <b><i> *
|
||
Thus we'll have to use match. No big problem. Match also makes</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>62</span></u> <b><i> *
|
||
some sanity tests.</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>63</span></u> <b><i> *</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>64</span></u> <b><i> *
|
||
NOTE! unlike strncmp, match returns 1 for success, 0 for failure.</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>65</span></u> <b><i> */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> /*</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * ok</span>£¬ÎÒÃDz»ÄÜʹÓÃ<span
|
||
lang=EN-US>strncmp</span>×Ö·û´®±È½Ïº¯Êý£¬ÒòΪÃû³Æ²»ÔÚÎÒÃǵÄÊý¾Ý¿Õ¼ä</p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>£¨²»ÔÚÄں˿ռ䣩¡£ Òò¶øÎÒÃÇÖ»ÄÜʹÓÃ
|
||
<span lang=EN-US>match()</span>¡£ÎÊÌâ²»´ó£¬<span lang=EN-US>match()</span>ͬÑù</p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>Ò²´¦ÀíһЩÍêÕûµÄ²âÊÔ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> *</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>×¢Ò⣡Óë<span
|
||
lang=EN-US>strncmp</span>²»Í¬µÄÊÇ<span lang=EN-US>match()</span>³É¹¦Ê±·µ»Ø<span
|
||
lang=EN-US>1</span>£¬Ê§°Üʱ·µ»Ø<span lang=EN-US>0</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> */</span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>Ö¸¶¨³¤¶È×Ö·û´®±È½Ïº¯Êý¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>len
|
||
- </span>±È½ÏµÄ×Ö·û´®³¤¶È£»<span lang=EN-US>name - </span>ÎļþÃûÖ¸Õ룻<span lang=EN-US>de - </span>Ŀ¼Ïî½á¹¹¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£ºÏàͬ·µ»Ø<span
|
||
lang=EN-US>1</span>£¬²»Í¬·µ»Ø<span lang=EN-US>0</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÚ<span lang=EN-US>68</span>ÐÐÉ϶¨ÒåÁËÒ»¸ö¾Ö²¿¼Ä´æÆ÷±äÁ¿<span
|
||
lang=EN-US>same</span>¡£¸Ã±äÁ¿½«±»±£´æÔÚ<span lang=EN-US>eax</span>¼Ä´æÆ÷ÖУ¬ÒÔ±ãÓÚ¸ßЧ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·ÃÎÊ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>66</span></u>
|
||
static int <u><span style='color:blue'>match</span></u>(int len,const char *
|
||
name,struct <u><span style='color:blue'>dir_entry</span></u> * de)</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>67</span></u> {</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>68</span></u>
|
||
register int same __asm__(<i>"ax"</i>);</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>69</span></u> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ê×ÏÈÅжϺ¯Êý²ÎÊýµÄÓÐЧÐÔ¡£Èç¹ûĿ¼ÏîÖ¸Õë¿Õ£¬»òÕßĿ¼Ïî<span
|
||
lang=EN-US>i</span>½ÚµãµÈÓÚ<span lang=EN-US>0</span>£¬»òÕßÒª±È½ÏµÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>×Ö·û´®³¤¶È³¬¹ýÎļþÃû³¤¶È£¬Ôò·µ»Ø<span
|
||
lang=EN-US>0</span>£¨²»Æ¥Å䣩¡£Èç¹û±È½ÏµÄ³¤¶È<span lang=EN-US>len</span>µÈÓÚ<span lang=EN-US>0</span>²¢ÇÒĿ¼Ïî</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÖÐÎļþÃûµÄµÚ<span
|
||
lang=EN-US>1</span>¸ö×Ö·ûÊÇ <span lang=EN-US>'.'</span>£¬²¢ÇÒÖ»ÓÐÕâôһ¸ö×Ö·û£¬ÄÇôÎÒÃǾÍÈÏΪÊÇÏàͬµÄ£¬Òò´Ë·µ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>»Ø<span lang=EN-US>1</span>£¨Æ¥Å䣩¡£Èç¹ûÒª±È½ÏµÄ³¤¶È<span
|
||
lang=EN-US>len</span>СÓÚ<span lang=EN-US>NAME_LEN</span>£¬µ«ÊÇĿ¼ÏîÖÐÎļþÃû³¤¶È³¬¹ý<span
|
||
lang=EN-US>len</span>£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÔòÒ²·µ»Ø<span lang=EN-US>0</span>£¨²»Æ¥Å䣩¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÚ<span lang=EN-US>75</span>ÐÐÉ϶ÔĿ¼ÏîÖÐÎļþÃû³¤¶ÈÊÇ·ñ³¬¹ý
|
||
<span lang=EN-US>len </span>µÄÅжϷ½·¨ÊǼì²â <span lang=EN-US>name[len] </span>ÊÇ·ñΪ<span
|
||
lang=EN-US>NULL</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èô³¤¶È³¬¹ý<span lang=EN-US>len</span>£¬Ôò<span
|
||
lang=EN-US>name[len]</span>´¦¾ÍÊÇÒ»¸ö²»ÊÇ<span lang=EN-US>NULL</span>µÄÆÕͨ×Ö·û¡£¶ø¶ÔÓÚ³¤¶ÈΪ<span
|
||
lang=EN-US>len</span>µÄ×Ö·û</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>´®<span lang=EN-US>name</span>£¬×Ö·û<span
|
||
lang=EN-US>name[len]</span>¾ÍÓ¦¸ÃÊÇ<span lang=EN-US>NULL</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>70</span></u>
|
||
if (!de || !de->inode || len > <u><span style='color:blue'>NAME_LEN</span></u>)</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>71</span></u>
|
||
return 0;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>72</span></u>
|
||
<b><i>/* "" means "." ---> so paths like
|
||
"/usr/lib//libc.a" work */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US>
|
||
/* "" </span>µ±×÷ <span lang=EN-US>"." </span>À´¿´´ý <span
|
||
lang=EN-US>---> </span>ÕâÑù¾ÍÄÜ´¦ÀíÏó <span lang=EN-US>"/usr/lib//libc.a"
|
||
</span>ÄÇÑùµÄ·¾¶Ãû<span lang=EN-US> */</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>73</span></u>
|
||
if (!len && (de->name[0]==<i>'.'</i>) && (de->name[1]==<i>'\0'</i>))</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>74</span></u>
|
||
return 1;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>75</span></u>
|
||
if (len < <u><span style='color:blue'>NAME_LEN</span></u> &&
|
||
de->name[len])</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>76</span></u>
|
||
return 0;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºóʹÓÃǶÈë»ã±àÓï¾ä½øÐпìËٱȽϲÙ×÷¡£Ëü»áÔÚÓû§Êý¾Ý¿Õ¼ä£¨<span
|
||
lang=EN-US>fs</span>¶Î£©Ö´ÐÐ×Ö·û´®µÄ±È½Ï</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²Ù×÷¡£<span lang=EN-US>%0
|
||
- eax</span>£¨±È½Ï½á¹û<span lang=EN-US>same</span>£©£»<span lang=EN-US>%1 - eax</span>£¨<span
|
||
lang=EN-US>eax</span>³õÖµ<span lang=EN-US>0</span>£©£»<span lang=EN-US>%2 - esi</span>£¨Ãû×ÖÖ¸Õ룩£»</p>
|
||
|
||
<p class=a><span lang=EN-US> // %3 - edi</span>£¨Ä¿Â¼ÏîÃûÖ¸Õ룩£»<span
|
||
lang=EN-US>%4 - ecx(</span>±È½ÏµÄ×Ö½Ú³¤¶ÈÖµ<span lang=EN-US>len)</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>77</span></u>
|
||
__asm__(<i>"cld\n\t"</i>
|
||
// </span>Çå·½Ïò±ê־λ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>78</span></u>
|
||
<i>"fs ; repe ; cmpsb\n\t"</i> // </span>Óû§¿Õ¼äÖ´ÐÐÑ»·±È½Ï<span
|
||
lang=EN-US>[esi++]</span>ºÍ<span lang=EN-US>[edi++]</span>²Ù×÷£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>79</span></u>
|
||
<i>"setz %%al"</i>
|
||
// </span>Èô±È½Ï½á¹ûÒ»Ñù£¨<span lang=EN-US>zf=0</span>£©ÔòÖÃ<span lang=EN-US>al=1</span>£¨<span
|
||
lang=EN-US>same=eax</span>£©¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>80</span></u>
|
||
:<i>"=a"</i> (same)</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>81</span></u>
|
||
:<i>""</i> (0),<i>"S"</i> ((long) name),<i>"D"</i>
|
||
((long) de->name),<i>"c"</i> (len)</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>82</span></u>
|
||
:<i>"cx"</i>,<i>"di"</i>,<i>"si"</i>);</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>83</span></u>
|
||
return same;
|
||
// </span>·µ»Ø±È½Ï½á¹û¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>84</span></u> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>85</span></u> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>86</span></u> <b><i>/*</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>87</span></u> <b><i> *
|
||
find_entry()</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>88</span></u> <b><i> *</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>89</span></u> <b><i> *
|
||
finds an entry in the specified directory with the wanted name. It</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>90</span></u> <b><i> *
|
||
returns the cache buffer in which the entry was found, and the entry</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>91</span></u> <b><i> *
|
||
itself (as a parameter - res_dir). It does NOT read the inode of the</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>92</span></u> <b><i> *
|
||
entry - you'll have to do that yourself if you want to.</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>93</span></u> <b><i> *</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>94</span></u> <b><i> *
|
||
This also takes care of the few special cases due to '..'-traversal</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>95</span></u> <b><i> *
|
||
over a pseudo-root and a mount point.</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>96</span></u> <b><i> */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> /*</span></p>
|
||
|
||
<p class=a><span lang=EN-US> *
|
||
find_entry()</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * </span></p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>ÔÚÖ¸¶¨Ä¿Â¼ÖÐѰÕÒÒ»¸öÓëÃû×ÖÆ¥ÅäµÄĿ¼Ïî¡£·µ»ØÒ»¸öº¬ÓÐÕÒµ½Ä¿Â¼ÏîµÄ¸ßËÙ</p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>»º³å¿éÒÔ¼°Ä¿Â¼Ïî±¾Éí£¨×÷Ϊһ¸ö²ÎÊý<span
|
||
lang=EN-US> - res_dir</span>£©¡£¸Ãº¯Êý²¢²»¶ÁȡĿ¼Ïî</p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>µÄ<span
|
||
lang=EN-US>i</span>½Úµã<span lang=EN-US> - </span>Èç¹ûÐèÒªµÄ»°Ôò×Ô¼º²Ù×÷¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> *</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>ÓÉÓÚÓÐ<span
|
||
lang=EN-US>'..'</span>Ŀ¼ÏÒò´ËÔÚ²Ù×÷ÆÚ¼äÒ²»á¶Ô¼¸ÖÖÌØÊâÇé¿ö·Ö±ð´¦Àí<span lang=EN-US> - </span>±ÈÈçºáÔ½</p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>Ò»¸öα¸ùĿ¼ÒÔ¼°°²×°µã¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> */</span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>²éÕÒÖ¸¶¨Ä¿Â¼ºÍÎļþÃûµÄĿ¼Ïî¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>*dir
|
||
- </span>Ö¸¶¨Ä¿Â¼<span lang=EN-US>i</span>½ÚµãµÄÖ¸Õ룻<span lang=EN-US>name - </span>ÎļþÃû£»<span
|
||
lang=EN-US>namelen - </span>ÎļþÃû³¤¶È£»</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¸Ãº¯ÊýÔÚÖ¸¶¨Ä¿Â¼µÄÊý¾Ý£¨Îļþ£©ÖÐËÑË÷Ö¸¶¨ÎļþÃûµÄĿ¼Ïî¡£²¢¶ÔÖ¸¶¨ÎļþÃûÊÇ<span
|
||
lang=EN-US>'..'</span>µÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Çé¿ö¸ù¾Ýµ±Ç°½øÐеÄÏà¹ØÉèÖýøÐÐÌØÊâ´¦Àí¡£¹ØÓÚº¯Êý²ÎÊý´«µÝÖ¸ÕëµÄÖ¸ÕëµÄ×÷Óã¬Çë²Î</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼û<span lang=EN-US>linux/sched.c</span>µÚ<span
|
||
lang=EN-US>151</span>ÐÐǰµÄ×¢ÊÍ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£º³É¹¦Ôòº¯Êý¸ßËÙ»º³åÇøÖ¸Õ룬²¢ÔÚ<span
|
||
lang=EN-US>*res_dir</span>´¦·µ»ØµÄĿ¼Ïî½á¹¹Ö¸Õ롣ʧ°ÜÔò·µ»Ø</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¿ÕÖ¸Õë<span lang=EN-US>NULL</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>97</span></u>
|
||
static struct <u><span style='color:blue'>buffer_head</span></u> * <u><span
|
||
style='color:blue'>find_entry</span></u>(struct <u><span style='color:blue'>m_inode</span></u>
|
||
** dir,</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>98</span></u>
|
||
const char * name, int namelen, struct <u><span style='color:blue'>dir_entry</span></u>
|
||
** res_dir)</span></p>
|
||
|
||
<p class=a><span lang=EN-US> <u><span style='color:blue'>99</span></u> {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>100</span></u><span
|
||
lang=EN-US> int entries;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>101</span></u><span
|
||
lang=EN-US> int block,i;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>102</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>buffer_head</span></u> * bh;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>103</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>dir_entry</span></u> * de;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>104</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>super_block</span></u> * sb;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>105</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ͬÑù£¬±¾º¯ÊýÒ»ÉÏÀ´Ò²ÐèÒª¶Ôº¯Êý²ÎÊýµÄÓÐЧÐÔ½øÐÐÅжϺÍÑéÖ¤¡£Èç¹ûÎÒÃÇÔÚÇ°ÃæµÚ<span
|
||
lang=EN-US>30</span>ÐÐ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¶¨ÒåÁË·ûºÅ³£Êý<span
|
||
lang=EN-US>NO_TRUNCATE</span>£¬ÄÇôÈç¹ûÎļþÃû³¤¶È³¬¹ý×î´ó³¤¶È<span lang=EN-US>NAME_LEN</span>£¬Ôò²»Óè´¦Àí¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹ûûÓж¨Òå¹ý<span
|
||
lang=EN-US>NO_TRUNCATE</span>£¬ÄÇôÔÚÎļþÃû³¤¶È³¬¹ý×î´ó³¤¶È<span lang=EN-US>NAME_LEN</span>ʱ½Ø¶ÌÖ®¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>106</span></u><span
|
||
lang=EN-US> #ifdef NO_TRUNCATE</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>107</span></u><span
|
||
lang=EN-US> if (namelen > <u><span
|
||
style='color:blue'>NAME_LEN</span></u>)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>108</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>109</span></u><span
|
||
lang=EN-US> #else</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>110</span></u><span
|
||
lang=EN-US> if (namelen > <u><span
|
||
style='color:blue'>NAME_LEN</span></u>)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>111</span></u><span
|
||
lang=EN-US>
|
||
namelen = <u><span style='color:blue'>NAME_LEN</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>112</span></u><span
|
||
lang=EN-US> #endif</span></p>
|
||
|
||
<p class=a><span lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ê×ÏȼÆË㱾Ŀ¼ÖÐĿ¼ÏîÏîÊý<span
|
||
lang=EN-US>entries</span>¡£ Ŀ¼<span lang=EN-US>i</span>½Úµã <span lang=EN-US>i_size</span>×Ö¶ÎÖк¬Óб¾Ä¿Â¼°üº¬µÄÊý¾Ý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>³¤¶È£¬Òò´ËÆä³ýÒÔÒ»¸öĿ¼ÏîµÄ³¤¶È£¨<span
|
||
lang=EN-US>16</span>×Ö½Ú£©¼´¿ÉµÃµ½¸ÃĿ¼ÖÐĿ¼ÏîÊý¡£È»ºóÖÿշµ»Ø</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼Ïî½á¹¹Ö¸Õë¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>113</span></u><span
|
||
lang=EN-US> entries =
|
||
(*dir)->i_size / (sizeof (struct <u><span style='color:blue'>dir_entry</span></u>));</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>114</span></u><span
|
||
lang=EN-US> *res_dir = <u><span
|
||
style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>½ÓÏÂÀ´ÎÒÃǶÔĿ¼ÏîÎļþÃûÊÇ<span
|
||
lang=EN-US>'..'</span>µÄÇé¿ö½øÐÐÌØÊâ´¦Àí¡£Èç¹ûµ±Ç°½ø³ÌÖ¸¶¨µÄ¸ù<span lang=EN-US>i</span>½Úµã¾ÍÊÇ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>º¯Êý²ÎÊýÖ¸¶¨µÄĿ¼£¬Ôò˵Ã÷¶ÔÓÚ±¾½ø³ÌÀ´Ëµ£¬Õâ¸öĿ¼¾ÍÊÇËüµÄα¸ùĿ¼£¬¼´½ø³ÌÖ»ÄÜ·Ã</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÎʸÃĿ¼ÖеÄÏî¶ø²»ÄܺóÍ˵½Æä¸¸Ä¿Â¼ÖÐÈ¥¡£Ò²¼´¶ÔÓڸýø³Ì±¾Ä¿Â¼¾ÍÈçͬÊÇÎļþϵͳµÄ¸ù</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼¡£Òò´ËÎÒÃÇÐèÒª½«ÎļþÃûÐÞ¸ÄΪ<span
|
||
lang=EN-US>'.'</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·ñÔò£¬Èç¹û¸ÃĿ¼µÄ<span
|
||
lang=EN-US>i</span>½ÚµãºÅµÈÓÚ<span lang=EN-US>ROOT_INO</span>£¨<span lang=EN-US>1</span>ºÅ£©µÄ»°£¬ËµÃ÷ȷʵÊÇÎļþϵͳµÄ¸ù<span
|
||
lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÔòÈ¡ÎļþϵͳµÄ³¬¼¶¿é¡£Èç¹û±»°²×°µ½µÄ<span
|
||
lang=EN-US>i</span>½Úµã´æÔÚ£¬ÔòÏÈ·Å»ØÔ<span lang=EN-US>i</span>½Úµã£¬È»ºó¶Ô±»°²×°µ½</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÄ<span lang=EN-US>i</span>½Úµã½øÐд¦Àí¡£ÓÚÊÇÎÒÃÇÈÃ<span
|
||
lang=EN-US>*dir</span>Ö¸Ïò¸Ã±»°²×°µ½µÄ<span lang=EN-US>i</span>½Úµã£»²¢ÇÒ¸Ã<span lang=EN-US>i</span>½ÚµãµÄÒýÓÃÊý¼Ó<span
|
||
lang=EN-US>1</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼´Õë¶ÔÕâÖÖÇé¿ö£¬ÎÒÃÇÇÄÇĵؽøÐÐÁË¡°ÍµÁº»»Öù¡±¹¤³Ì<span
|
||
lang=EN-US>:)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>115</span></u><span
|
||
lang=EN-US> <b><i>/* check for '..', as we might have to do some
|
||
"magic" for it */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> /* </span>¼ì²éĿ¼Ïî <span
|
||
lang=EN-US>'..'</span>£¬ÒòΪÎÒÃÇ¿ÉÄÜÐèÒª¶ÔÆä½øÐÐÌØÊâ´¦Àí<span lang=EN-US> */</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>116</span></u><span
|
||
lang=EN-US> if (namelen==2
|
||
&& <u><span style='color:blue'>get_fs_byte</span></u>(name)==<i>'.'</i>
|
||
&& <u><span style='color:blue'>get_fs_byte</span></u>(name+1)==<i>'.'</i>)
|
||
{</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>117</span></u><span
|
||
lang=EN-US> <b><i>/* '..' in a pseudo-root results in a faked '.' (just change
|
||
namelen) */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> /* </span>α¸ùÖÐµÄ <span lang=EN-US>'..'
|
||
</span>Èçͬһ¸ö¼Ù<span lang=EN-US> '.'</span>£¨Ö»Ðè¸Ä±äÃû×Ö³¤¶È£©<span lang=EN-US> */</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>118</span></u><span
|
||
lang=EN-US>
|
||
if ((*dir) == <u><span style='color:blue'>current</span></u>->root)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>119</span></u><span
|
||
lang=EN-US>
|
||
namelen=1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>120</span></u><span
|
||
lang=EN-US>
|
||
else if ((*dir)->i_num == <u><span style='color:blue'>ROOT_INO</span></u>) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>121</span></u><span
|
||
lang=EN-US> <b><i>/* '..' over a mount-point results in 'dir' being exchanged
|
||
for the mounted</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>122</span></u><span
|
||
lang=EN-US> <b><i> directory-inode. NOTE! We set mounted, so
|
||
that we can iput the new dir */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> /* </span>ÔÚÒ»¸ö°²×°µãÉ쵀 <span
|
||
lang=EN-US>'..' </span>½«µ¼ÖÂĿ¼½»»»µ½±»°²×°ÎļþϵͳµÄĿ¼<span lang=EN-US>i</span>½ÚµãÉÏ¡£×¢Ò⣡</p>
|
||
|
||
<p class=a><span lang=EN-US> </span>ÓÉÓÚÎÒÃÇÉèÖÃÁË<span
|
||
lang=EN-US>mounted</span>±êÖ¾£¬Òò¶øÎÒÃÇÄܹ»·Å»Ø¸ÃÐÂĿ¼<span lang=EN-US> */</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>123</span></u><span
|
||
lang=EN-US> sb=<u><span
|
||
style='color:blue'>get_super</span></u>((*dir)->i_dev);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>124</span></u><span
|
||
lang=EN-US>
|
||
if (sb->s_imount) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>125</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(*dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>126</span></u><span
|
||
lang=EN-US>
|
||
(*dir)=sb->s_imount;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>127</span></u><span
|
||
lang=EN-US>
|
||
(*dir)->i_count++;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>128</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>129</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>130</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÏÖÔÚÎÒÃÇ¿ªÊ¼Õý³£²Ù×÷£¬²éÕÒÖ¸¶¨ÎļþÃûµÄĿ¼ÏîÔÚʲôµØ·½¡£Òò´ËÎÒÃÇÐèÒª¶ÁȡĿ¼µÄÊý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¾Ý£¬¼´È¡³öĿ¼<span
|
||
lang=EN-US>i</span>½Úµã¶ÔÓ¦¿éÉ豸Êý¾ÝÇøÖеÄÊý¾Ý¿é£¨Âß¼¿é£©ÐÅÏ¢¡£ÕâЩÂß¼¿éµÄ¿éºÅ±£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>´æÔÚ<span lang=EN-US>i</span>½Úµã½á¹¹µÄ
|
||
<span lang=EN-US>i_zone[9]</span>Êý×éÖС£ÎÒÃÇÏÈÈ¡ÆäÖеÚ<span lang=EN-US>1</span>¸ö¿éºÅ¡£Èç¹ûĿ¼<span
|
||
lang=EN-US>i</span>½ÚµãÖ¸ÏòµÄµÚ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ò»¸öÖ±½Ó´ÅÅÌ¿éºÅΪ<span
|
||
lang=EN-US>0</span>£¬Ôò˵Ã÷¸ÃĿ¼¾¹È»²»º¬Êý¾Ý£¬Õâ²»Õý³£¡£ÓÚÊÇ·µ»Ø<span lang=EN-US>NULL</span>Í˳ö¡£·ñÔò</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÎÒÃǾʹӽڵãËùÔÚÉ豸¶Áȡָ¶¨µÄĿ¼ÏîÊý¾Ý¿é¡£µ±È»£¬Èç¹û²»³É¹¦£¬ÔòÒ²·µ»Ø<span
|
||
lang=EN-US>NULL</span>Í˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>131</span></u><span
|
||
lang=EN-US> if (!(block =
|
||
(*dir)->i_zone[0]))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>132</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>133</span></u><span
|
||
lang=EN-US> if (!(bh = <u><span
|
||
style='color:blue'>bread</span></u>((*dir)->i_dev,block)))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>134</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>´ËʱÎÒÃǾÍÔÚÕâ¸ö¶ÁÈ¡µÄĿ¼<span
|
||
lang=EN-US>i</span>½ÚµãÊý¾Ý¿éÖÐËÑË÷Æ¥ÅäÖ¸¶¨ÎļþÃûµÄĿ¼Ïî¡£Ê×ÏÈÈÃ<span lang=EN-US>de</span>Ö¸</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ïò»º³å¿éÖеÄÊý¾Ý¿é²¿·Ö£¬²¢ÔÚ²»³¬¹ýĿ¼ÖÐĿ¼ÏîÊýµÄÌõ¼þÏ£¬Ñ»·Ö´ÐÐËÑË÷¡£ÆäÖÐ<span
|
||
lang=EN-US>i</span>ÊÇ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼ÖеÄĿ¼ÏîË÷ÒýºÅ£¬ÔÚÑ»·¿ªÊ¼Ê±³õʼ»¯Îª<span
|
||
lang=EN-US>0</span>¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>135</span></u><span
|
||
lang=EN-US> i = 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>136</span></u><span
|
||
lang=EN-US> de = (struct <u><span
|
||
style='color:blue'>dir_entry</span></u> *) bh->b_data;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>137</span></u><span
|
||
lang=EN-US> while (i <
|
||
entries) {</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹ûµ±Ç°Ä¿Â¼ÏîÊý¾Ý¿éÒѾËÑË÷Í꣬»¹Ã»ÓÐÕÒµ½Æ¥ÅäµÄĿ¼ÏÔòÊͷŵ±Ç°Ä¿Â¼ÏîÊý¾Ý¿é¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÔÙ¶ÁÈëĿ¼µÄÏÂÒ»¸öÂß¼¿é¡£ÈôÕâ¿éΪ¿Õ£¬ÔòÖ»Òª»¹Ã»ÓÐËÑË÷ÍêĿ¼ÖеÄËùÓÐĿ¼Ï¾Í</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ìø¹ý¸Ã¿é£¬¼ÌÐø¶ÁĿ¼µÄÏÂÒ»Âß¼¿é¡£Èô¸Ã¿é²»¿Õ£¬¾ÍÈÃ
|
||
<span lang=EN-US>de </span>Ö¸Ïò¸ÃÊý¾Ý¿é£¬È»ºóÔÚÆäÖÐ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼ÌÐøËÑË÷¡£ÆäÖÐ<span
|
||
lang=EN-US>141</span>ÐÐÉÏ<span lang=EN-US>i/DIR_ENTRIES_PER_BLOCK</span>¿ÉµÃµ½µ±Ç°ËÑË÷µÄĿ¼ÏîËùÔÚĿ¼ÎÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼þÖеĿéºÅ£¬¶ø<span
|
||
lang=EN-US>bmap()</span>º¯Êý£¨<span lang=EN-US>inode.c</span>£¬µÚ<span lang=EN-US>142</span>ÐУ©Ôò¿É¼ÆËã³öÔÚÉ豸É϶ÔÓ¦µÄÂß¼¿éºÅ¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>138</span></u><span
|
||
lang=EN-US>
|
||
if ((char *)de >= <u><span style='color:blue'>BLOCK_SIZE</span></u>+bh->b_data)
|
||
{</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>139</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>140</span></u><span
|
||
lang=EN-US>
|
||
bh = <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>141</span></u><span
|
||
lang=EN-US>
|
||
if (!(block = <u><span style='color:blue'>bmap</span></u>(*dir,i/<u><span
|
||
style='color:blue'>DIR_ENTRIES_PER_BLOCK</span></u>)) ||</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>142</span></u><span
|
||
lang=EN-US>
|
||
!(bh = <u><span style='color:blue'>bread</span></u>((*dir)->i_dev,block))) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>143</span></u><span
|
||
lang=EN-US>
|
||
i += <u><span style='color:blue'>DIR_ENTRIES_PER_BLOCK</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>144</span></u><span
|
||
lang=EN-US>
|
||
continue;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>145</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>146</span></u><span
|
||
lang=EN-US>
|
||
de = (struct <u><span style='color:blue'>dir_entry</span></u> *) bh->b_data;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>147</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹ûÕÒµ½Æ¥ÅäµÄĿ¼ÏîµÄ»°£¬Ôò·µ»Ø¸ÃĿ¼Ïî½á¹¹Ö¸Õë<span
|
||
lang=EN-US>de</span>ºÍ¸ÃĿ¼Ïî<span lang=EN-US>i</span>½ÚµãÖ¸Õë<span lang=EN-US>*dir</span>ÒÔ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼°¸ÃĿ¼ÏîÊý¾Ý¿éÖ¸Õë<span
|
||
lang=EN-US>bh</span>£¬²¢Í˳öº¯Êý¡£·ñÔò¼ÌÐøÔÚĿ¼ÏîÊý¾Ý¿éÖбȽÏÏÂÒ»¸öĿ¼Ïî¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>148</span></u><span
|
||
lang=EN-US>
|
||
if (<u><span style='color:blue'>match</span></u>(namelen,name,de)) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>149</span></u><span
|
||
lang=EN-US>
|
||
*res_dir = de;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>150</span></u><span
|
||
lang=EN-US>
|
||
return bh;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>151</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>152</span></u><span
|
||
lang=EN-US>
|
||
de++;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>153</span></u><span
|
||
lang=EN-US>
|
||
i++;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>154</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹ûÖ¸¶¨Ä¿Â¼ÖеÄËùÓÐĿ¼Ïî¶¼ËÑË÷Íêºó£¬»¹Ã»ÓÐÕÒµ½ÏàÓ¦µÄĿ¼ÏÔòÊÍ·ÅĿ¼µÄÊý¾Ý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¿é£¬×îºó·µ»Ø<span
|
||
lang=EN-US>NULL</span>£¨Ê§°Ü£©¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>155</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>156</span></u><span
|
||
lang=EN-US> return <u><span
|
||
style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>157</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>158</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>159</span></u><span
|
||
lang=EN-US> <b><i>/*</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>160</span></u><span
|
||
lang=EN-US> <b><i> * add_entry()</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>161</span></u><span
|
||
lang=EN-US> <b><i> *</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>162</span></u><span
|
||
lang=EN-US> <b><i> * adds a file entry to the specified directory, using
|
||
the same</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>163</span></u><span
|
||
lang=EN-US> <b><i> * semantics as find_entry(). It returns NULL if it
|
||
failed.</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>164</span></u><span
|
||
lang=EN-US> <b><i> *</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>165</span></u><span
|
||
lang=EN-US> <b><i> * NOTE!! The inode part of 'de' is left at 0 - which
|
||
means you</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>166</span></u><span
|
||
lang=EN-US> <b><i> * may not sleep between calling this and putting something
|
||
into</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>167</span></u><span
|
||
lang=EN-US> <b><i> * the entry, as someone else might have used it while
|
||
you slept.</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>168</span></u><span
|
||
lang=EN-US> <b><i> */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> /*</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * add_entry()</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>ʹÓÃÓë<span
|
||
lang=EN-US>find_entry()</span>ͬÑùµÄ·½·¨£¬ÍùÖ¸¶¨Ä¿Â¼ÖÐÌí¼ÓÒ»Ö¸¶¨ÎļþÃûµÄÄ¿</p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>¼Ïî¡£Èç¹ûʧ°ÜÔò·µ»Ø<span
|
||
lang=EN-US>NULL</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> *</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>×¢Ò⣡£¡<span
|
||
lang=EN-US>'de'</span>£¨Ö¸¶¨Ä¿Â¼Ïî½á¹¹Ö¸Õ룩µÄ<span lang=EN-US>i</span>½Úµã²¿·Ö±»ÉèÖÃΪ<span
|
||
lang=EN-US>0 - </span>Õâ±í</p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>ʾÔÚµ÷Óøú¯ÊýºÍÍùĿ¼ÏîÖÐÌí¼ÓÐÅÏ¢Ö®¼ä²»ÄÜȥ˯Ãß¡£
|
||
ÒòΪÈç¹û˯Ãߣ¬</p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>ÄÇôÆäËûÈË<span
|
||
lang=EN-US>(</span>½ø³Ì<span lang=EN-US>)</span>¿ÉÄÜ»áʹÓÃÁ˸ÃĿ¼Ïî¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> */</span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>¸ù¾ÝÖ¸¶¨µÄĿ¼ºÍÎļþÃûÌí¼ÓĿ¼Ïî¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>dir
|
||
- </span>Ö¸¶¨Ä¿Â¼µÄ<span lang=EN-US>i</span>½Úµã£»<span lang=EN-US>name - </span>ÎļþÃû£»<span
|
||
lang=EN-US>namelen - </span>ÎļþÃû³¤¶È£»</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£º¸ßËÙ»º³åÇøÖ¸Õ룻<span
|
||
lang=EN-US>res_dir - </span>·µ»ØµÄĿ¼Ïî½á¹¹Ö¸Õ룻</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>169</span></u><span
|
||
lang=EN-US> static struct <u><span style='color:blue'>buffer_head</span></u> * <u><span
|
||
style='color:blue'>add_entry</span></u>(struct <u><span style='color:blue'>m_inode</span></u>
|
||
* dir,</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>170</span></u><span
|
||
lang=EN-US> const char * name,
|
||
int namelen, struct <u><span style='color:blue'>dir_entry</span></u> **
|
||
res_dir)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>171</span></u><span
|
||
lang=EN-US> {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>172</span></u><span
|
||
lang=EN-US> int block,i;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>173</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>buffer_head</span></u> * bh;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>174</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>dir_entry</span></u> * de;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>175</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ͬÑù£¬±¾º¯ÊýÒ»ÉÏÀ´Ò²ÐèÒª¶Ôº¯Êý²ÎÊýµÄÓÐЧÐÔ½øÐÐÅжϺÍÑéÖ¤¡£Èç¹ûÎÒÃÇÔÚÇ°ÃæµÚ<span
|
||
lang=EN-US>30</span>ÐÐ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¶¨ÒåÁË·ûºÅ³£Êý<span
|
||
lang=EN-US>NO_TRUNCATE</span>£¬ÄÇôÈç¹ûÎļþÃû³¤¶È³¬¹ý×î´ó³¤¶È<span lang=EN-US>NAME_LEN</span>£¬Ôò²»Óè´¦Àí¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹ûûÓж¨Òå¹ý<span
|
||
lang=EN-US>NO_TRUNCATE</span>£¬ÄÇôÔÚÎļþÃû³¤¶È³¬¹ý×î´ó³¤¶È<span lang=EN-US>NAME_LEN</span>ʱ½Ø¶ÌÖ®¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>176</span></u><span
|
||
lang=EN-US> *res_dir = <u><span
|
||
style='color:blue'>NULL</span></u>;
|
||
// </span>ÓÃÓÚ·µ»ØÄ¿Â¼Ïî½á¹¹Ö¸Õë¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>177</span></u><span
|
||
lang=EN-US> #ifdef NO_TRUNCATE</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>178</span></u><span
|
||
lang=EN-US> if (namelen > <u><span
|
||
style='color:blue'>NAME_LEN</span></u>)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>179</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>180</span></u><span
|
||
lang=EN-US> #else</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>181</span></u><span
|
||
lang=EN-US> if (namelen > <u><span
|
||
style='color:blue'>NAME_LEN</span></u>)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>182</span></u><span
|
||
lang=EN-US>
|
||
namelen = <u><span style='color:blue'>NAME_LEN</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>183</span></u><span
|
||
lang=EN-US> #endif</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÏÖÔÚÎÒÃÇ¿ªÊ¼²Ù×÷£¬ÏòÖ¸¶¨Ä¿Â¼ÖÐÌí¼ÓÒ»¸öÖ¸¶¨ÎļþÃûµÄĿ¼Ïî¡£Òò´ËÎÒÃÇÐèÒªÏȶÁȡĿ¼</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÄÊý¾Ý£¬¼´È¡³öĿ¼<span
|
||
lang=EN-US>i</span>½Úµã¶ÔÓ¦¿éÉ豸Êý¾ÝÇøÖеÄÊý¾Ý¿é£¨Âß¼¿é£©ÐÅÏ¢¡£ÕâЩÂß¼¿éµÄ¿é</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ºÅ±£´æÔÚ<span lang=EN-US>i</span>½Úµã½á¹¹µÄ
|
||
<span lang=EN-US>i_zone[9]</span>Êý×éÖС£ÎÒÃÇÏÈÈ¡ÆäÖеÚ<span lang=EN-US>1</span>¸ö¿éºÅ¡£Èç¹ûĿ¼<span
|
||
lang=EN-US>i</span>½ÚµãÖ¸Ïò</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÄµÚÒ»¸öÖ±½Ó´ÅÅÌ¿éºÅΪ<span
|
||
lang=EN-US>0</span>£¬Ôò˵Ã÷¸ÃĿ¼¾¹È»²»º¬Êý¾Ý£¬Õâ²»Õý³£¡£ÓÚÊÇ·µ»Ø<span lang=EN-US>NULL</span>Í˳ö¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·ñÔòÎÒÃǾʹӽڵãËùÔÚÉ豸¶Áȡָ¶¨µÄĿ¼ÏîÊý¾Ý¿é¡£µ±È»£¬Èç¹û²»³É¹¦£¬ÔòÒ²·µ»Ø<span
|
||
lang=EN-US>NULL</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Í˳ö¡£ÁíÍ⣬Èç¹û²ÎÊýÌṩµÄÎļþÃû³¤¶ÈµÈÓÚ<span
|
||
lang=EN-US>0</span>£¬ÔòÒ²·µ»Ø<span lang=EN-US>NULL</span>Í˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>184</span></u><span
|
||
lang=EN-US> if (!namelen)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>185</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>186</span></u><span
|
||
lang=EN-US> if (!(block =
|
||
dir->i_zone[0]))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>187</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>188</span></u><span
|
||
lang=EN-US> if (!(bh = <u><span
|
||
style='color:blue'>bread</span></u>(dir->i_dev,block)))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>189</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>´ËʱÎÒÃǾÍÔÚÕâ¸öĿ¼<span
|
||
lang=EN-US>i</span>½ÚµãÊý¾Ý¿éÖÐÑ»·²éÕÒ×îºóδʹÓõĿÕĿ¼Ïî¡£Ê×ÏÈÈÃĿ¼Ïî½á¹¹</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ö¸Õë<span lang=EN-US>de</span>Ö¸Ïò»º³å¿éÖеÄÊý¾Ý¿é²¿·Ö£¬¼´µÚÒ»¸öĿ¼Ïî´¦¡£ÆäÖÐ<span
|
||
lang=EN-US>i</span>ÊÇĿ¼ÖеÄĿ¼ÏîË÷ÒýºÅ£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÔÚÑ»·¿ªÊ¼Ê±³õʼ»¯Îª<span
|
||
lang=EN-US>0</span>¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>190</span></u><span
|
||
lang=EN-US> i = 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>191</span></u><span
|
||
lang=EN-US> de = (struct <u><span
|
||
style='color:blue'>dir_entry</span></u> *) bh->b_data;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>192</span></u><span
|
||
lang=EN-US> while (1) {</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹ûµ±Ç°Ä¿Â¼ÏîÊý¾Ý¿éÒѾËÑË÷Íê±Ï£¬µ«»¹Ã»ÓÐÕÒµ½ÐèÒªµÄ¿ÕĿ¼ÏÔòÊͷŵ±Ç°Ä¿Â¼ÏîÊý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¾Ý¿é£¬ÔÙ¶ÁÈëĿ¼µÄÏÂÒ»¸öÂß¼¿é¡£Èç¹û¶ÔÓ¦µÄÂß¼¿é²»´æÔھʹ´½¨Ò»¿é¡£Èô¶ÁÈ¡»ò´´½¨²Ù</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>×÷ʧ°ÜÔò·µ»Ø¿Õ¡£Èç¹û´Ë´Î¶ÁÈ¡µÄ´ÅÅÌÂß¼¿éÊý¾Ý·µ»ØµÄ»º³å¿éÖ¸ÕëΪ¿Õ£¬ËµÃ÷Õâ¿éÂß¼¿é</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¿ÉÄÜÊÇÒòΪ²»´æÔÚ¶øÐ´´½¨µÄ¿Õ¿é£¬Ôò°ÑĿ¼ÏîË÷ÒýÖµ¼ÓÉÏÒ»¿éÂß¼¿éËùÄÜÈÝÄɵÄĿ¼ÏîÊý</p>
|
||
|
||
<p class=a><span lang=EN-US> // DIR_ENTRIES_PER_BLOCK</span>£¬ÓÃÒÔÌø¹ý¸Ã¿é²¢¼ÌÐøËÑË÷¡£·ñÔò˵Ã÷жÁÈëµÄ¿éÉÏÓÐĿ¼ÏîÊý¾Ý£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÓÚÊÇÈÃĿ¼Ïî½á¹¹Ö¸Õë<span
|
||
lang=EN-US>de</span>Ö¸Ïò¸Ã¿éµÄ»º³å¿éÊý¾Ý²¿·Ö£¬È»ºóÔÚÆäÖмÌÐøËÑË÷¡£ÆäÖÐ<span lang=EN-US>196</span>ÐÐ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>É쵀 <span lang=EN-US>i/DIR_ENTRIES_PER_BLOCK
|
||
</span>¿É¼ÆËãµÃµ½µ±Ç°ËÑË÷µÄĿ¼Ïî<span lang=EN-US>i </span>ËùÔÚĿ¼ÎļþÖеĿéºÅ£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¶ø<span lang=EN-US>create_block()</span>º¯Êý£¨<span
|
||
lang=EN-US>inode.c</span>£¬µÚ<span lang=EN-US>147</span>ÐУ©Ôò¿É¶ÁÈ¡»ò´´½¨³öÔÚÉ豸É϶ÔÓ¦µÄÂß¼¿é¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>193</span></u><span
|
||
lang=EN-US>
|
||
if ((char *)de >= <u><span style='color:blue'>BLOCK_SIZE</span></u>+bh->b_data)
|
||
{</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>194</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>195</span></u><span
|
||
lang=EN-US>
|
||
bh = <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>196</span></u><span
|
||
lang=EN-US>
|
||
block = <u><span style='color:blue'>create_block</span></u>(dir,i/<u><span
|
||
style='color:blue'>DIR_ENTRIES_PER_BLOCK</span></u>);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>197</span></u><span
|
||
lang=EN-US>
|
||
if (!block)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>198</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>199</span></u><span
|
||
lang=EN-US>
|
||
if (!(bh = <u><span style='color:blue'>bread</span></u>(dir->i_dev,block)))
|
||
{ // </span>Èô¿ÕÔòÌø¹ý¸Ã¿é¼ÌÐø¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>200</span></u><span
|
||
lang=EN-US>
|
||
i += <u><span style='color:blue'>DIR_ENTRIES_PER_BLOCK</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>201</span></u><span
|
||
lang=EN-US>
|
||
continue;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>202</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>203</span></u><span
|
||
lang=EN-US>
|
||
de = (struct <u><span style='color:blue'>dir_entry</span></u> *) bh->b_data;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>204</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹ûµ±Ç°Ëù²Ù×÷µÄĿ¼ÏîÐòºÅ<span
|
||
lang=EN-US>i</span>³ËÉÏĿ¼½á¹¹´óСËùµÄ³¤¶ÈÖµÒѾ³¬¹ýÁ˸ÃĿ¼<span lang=EN-US>i</span>½ÚµãÐÅÏ¢</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ËùÖ¸³öµÄĿ¼Êý¾Ý³¤¶ÈÖµ <span
|
||
lang=EN-US>i_size </span>£¬Ôò˵Ã÷Õû¸öĿ¼ÎļþÊý¾ÝÖÐûÓÐÓÉÓÚɾ³ýÎļþÁôϵĿÕ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼ÏÒò´ËÎÒÃÇÖ»ÄܰÑÐèÒªÌí¼ÓµÄÐÂĿ¼Ï¼Óµ½Ä¿Â¼ÎļþÊý¾ÝµÄÄ©¶Ë´¦¡£ÓÚÊǶԸô¦Ä¿</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼Ïî½øÐÐÉèÖã¨ÖøÃĿ¼ÏîµÄ<span
|
||
lang=EN-US>i</span>½ÚµãÖ¸ÕëΪ¿Õ£©£¬²¢¸üиÃĿ¼ÎļþµÄ³¤¶ÈÖµ£¨¼ÓÉÏÒ»¸öÄ¿</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼ÏîµÄ³¤¶È£©£¬È»ºóÉèÖÃĿ¼µÄ<span
|
||
lang=EN-US>i</span>½ÚµãÒÑÐ޸ıêÖ¾£¬ÔÙ¸üиÃĿ¼µÄ¸Ä±äʱ¼äΪµ±Ç°Ê±¼ä¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>205</span></u><span
|
||
lang=EN-US>
|
||
if (i*sizeof(struct <u><span style='color:blue'>dir_entry</span></u>) >=
|
||
dir->i_size) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>206</span></u><span
|
||
lang=EN-US>
|
||
de->inode=0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>207</span></u><span
|
||
lang=EN-US>
|
||
dir->i_size = (i+1)*sizeof(struct <u><span style='color:blue'>dir_entry</span></u>);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>208</span></u><span
|
||
lang=EN-US>
|
||
dir->i_dirt = 1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>209</span></u><span
|
||
lang=EN-US>
|
||
dir->i_ctime = <u><span style='color:blue'>CURRENT_TIME</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>210</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èôµ±Ç°ËÑË÷µÄĿ¼Ïî <span
|
||
lang=EN-US>de </span>µÄ<span lang=EN-US>i</span>½ÚµãΪ¿Õ£¬Ôò±íʾÕÒµ½Ò»¸ö»¹Î´Ê¹ÓõĿÕÏÐĿ¼Ïî»òÊÇÌí¼ÓµÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÐÂĿ¼Ïî¡£ÓÚÊǸüÐÂĿ¼µÄÐÞ¸Äʱ¼äΪµ±Ç°Ê±¼ä£¬²¢´ÓÓû§Êý¾ÝÇø¸´ÖÆÎļþÃûµ½¸ÃĿ¼ÏîµÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÎļþÃû×ֶΣ¬Öú¬Óб¾Ä¿Â¼ÏîµÄÏàÓ¦¸ßËÙ»º³å¿éÒÑÐ޸ıêÖ¾¡£·µ»Ø¸ÃĿ¼ÏîµÄÖ¸ÕëÒÔ¼°¸Ã¸ß</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ËÙ»º³å¿éµÄÖ¸Õ룬Í˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>211</span></u><span
|
||
lang=EN-US>
|
||
if (!de->inode) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>212</span></u><span
|
||
lang=EN-US>
|
||
dir->i_mtime = <u><span style='color:blue'>CURRENT_TIME</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>213</span></u><span
|
||
lang=EN-US>
|
||
for (i=0; i < <u><span style='color:blue'>NAME_LEN</span></u> ; i++)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>214</span></u><span
|
||
lang=EN-US>
|
||
de->name[i]=(i<namelen)?<u><span style='color:blue'>get_fs_byte</span></u>(name+i):0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>215</span></u><span
|
||
lang=EN-US>
|
||
bh->b_dirt = 1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>216</span></u><span
|
||
lang=EN-US>
|
||
*res_dir = de;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>217</span></u><span
|
||
lang=EN-US>
|
||
return bh;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>218</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>219</span></u><span
|
||
lang=EN-US>
|
||
de++; // </span>Èç¹û¸ÃĿ¼ÏîÒѾ±»Ê¹Óã¬Ôò¼ÌÐø¼ì²âÏÂÒ»¸öĿ¼Ïî¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>220</span></u><span
|
||
lang=EN-US>
|
||
i++;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>221</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>±¾º¯ÊýÖ´Ðв»µ½ÕâÀï¡£ÕâÒ²ÐíÊÇ<span
|
||
lang=EN-US>Linus</span>ÔÚдÕâ¶Î´úÂëʱ£¬Ïȸ´ÖÆÁËÉÏÃæ<span lang=EN-US>find_entry()</span>º¯Êý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÄ´úÂ룬¶øºóÐ޸ijɱ¾º¯ÊýµÄ<span
|
||
lang=EN-US style='font-family:Wingdings'>J</span>¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>222</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>223</span></u><span
|
||
lang=EN-US> return <u><span
|
||
style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>224</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>225</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>²éÕÒ·ûºÅÁ´½ÓµÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>dir
|
||
- </span>Ŀ¼<span lang=EN-US>i</span>½Úµã£»<span lang=EN-US>inode - </span>Ŀ¼Ïî<span
|
||
lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£º·µ»Ø·ûºÅÁ´½Óµ½ÎļþµÄ<span
|
||
lang=EN-US>i</span>½ÚµãÖ¸Õë¡£³ö´í·µ»Ø<span lang=EN-US>NULL</span>¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>226</span></u><span
|
||
lang=EN-US> static struct <u><span style='color:blue'>m_inode</span></u> * <u><span
|
||
style='color:blue'>follow_link</span></u>(struct <u><span style='color:blue'>m_inode</span></u>
|
||
* dir, struct <u><span style='color:blue'>m_inode</span></u> * inode)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>227</span></u><span
|
||
lang=EN-US> {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>228</span></u><span
|
||
lang=EN-US> unsigned short fs;
|
||
// </span>ÓÃÓÚÁÙʱ±£´æ<span lang=EN-US>fs</span>¶Î¼Ä´æÆ÷Öµ¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>229</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>buffer_head</span></u> * bh;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>230</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ê×ÏÈÅжϺ¯Êý²ÎÊýµÄÓÐЧÐÔ¡£Èç¹ûûÓиø³öĿ¼<span
|
||
lang=EN-US>i</span>½Úµã£¬ÎÒÃǾÍʹÓýø³ÌÈÎÎñ½á¹¹ÖÐÉèÖõÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¸ù<span lang=EN-US>i</span>½Úµã£¬²¢°ÑÁ´½ÓÊýÔö<span
|
||
lang=EN-US>1</span>¡£Èç¹ûûÓиø³öĿ¼Ïî<span lang=EN-US>i</span>½Úµã£¬Ôò·Å»ØÄ¿Â¼<span lang=EN-US>i</span>½Úµãºó·µ»Ø<span
|
||
lang=EN-US>NULL</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹ûÖ¸¶¨Ä¿Â¼Ïî²»ÊÇÒ»¸ö·ûºÅÁ´½Ó£¬¾ÍÖ±½Ó·µ»ØÄ¿Â¼Ïî¶ÔÓ¦µÄ<span
|
||
lang=EN-US>i</span>½Úµã<span lang=EN-US>inode</span>¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>231</span></u><span
|
||
lang=EN-US> if (!dir) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>232</span></u><span
|
||
lang=EN-US>
|
||
dir = <u><span style='color:blue'>current</span></u>->root;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>233</span></u><span
|
||
lang=EN-US>
|
||
dir->i_count++;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>234</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>235</span></u><span
|
||
lang=EN-US> if (!inode) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>236</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>237</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>238</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>239</span></u><span
|
||
lang=EN-US> if (!<u><span
|
||
style='color:blue'>S_ISLNK</span></u>(inode->i_mode)) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>240</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>241</span></u><span
|
||
lang=EN-US>
|
||
return inode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>242</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºóÈ¡<span lang=EN-US>fs</span>¶Î¼Ä´æÆ÷Öµ¡£<span
|
||
lang=EN-US>fs</span>ͨ³£±£´æ×ÅÖ¸ÏòÈÎÎñÊý¾Ý¶ÎµÄÑ¡Ôñ·û<span lang=EN-US>0x17</span>¡£Èç¹û<span
|
||
lang=EN-US>fs</span>ûÓÐÖ¸ÏòÓû§</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Êý¾Ý¶Î£¬»òÕ߸ø³öµÄĿ¼Ïî<span
|
||
lang=EN-US>i</span>½ÚµãµÚ<span lang=EN-US>1</span>¸öÖ±½Ó¿é¿éºÅµÈÓÚ<span lang=EN-US>0</span>£¬»òÕßÊǶÁÈ¡µÚ<span
|
||
lang=EN-US>1</span>¸öÖ±½Ó¿é³ö´í£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ôò·Å»Ø<span lang=EN-US>dir</span>ºÍ<span
|
||
lang=EN-US>inode</span>Á½¸ö<span lang=EN-US>i</span>½Úµã²¢·µ»Ø<span lang=EN-US>NULL</span>Í˳ö¡£·ñÔò˵Ã÷ÏÖÔÚ<span
|
||
lang=EN-US>fs</span>ÕýÖ¸ÏòÓû§Êý¾Ý¶Î¡¢²¢ÇÒ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÎÒÃÇÒѾ³É¹¦µØ¶ÁÈ¡ÁËÕâ¸ö·ûºÅÁ´½ÓĿ¼ÏîµÄÎļþÄÚÈÝ£¬²¢ÇÒÎļþÄÚÈÝÒѾÔÚ
|
||
<span lang=EN-US>bh </span>Ö¸ÏòµÄ»º³å</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¿éÊý¾ÝÇøÖС£Êµ¼ÊÉÏ£¬Õâ¸ö»º³å¿éÊý¾ÝÇøÖнö°üº¬Ò»¸öÁ´½ÓÖ¸ÏòµÄÎļþ·¾¶Ãû×Ö·û´®¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>243</span></u><span
|
||
lang=EN-US> __asm__(<i>"mov
|
||
%%fs,%0"</i>:<i>"=r"</i> (fs));</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>244</span></u><span
|
||
lang=EN-US> if (fs != 0x17 ||
|
||
!inode->i_zone[0] ||</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>245</span></u><span
|
||
lang=EN-US>
|
||
!(bh = <u><span style='color:blue'>bread</span></u>(inode->i_dev,
|
||
inode->i_zone[0]))) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>246</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>247</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>248</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>249</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>´ËʱÎÒÃÇÒѾ²»ÐèÒª·ûºÅÁ´½ÓĿ¼ÏîµÄ<span
|
||
lang=EN-US>i</span>½ÚµãÁË£¬ÓÚÊǰÑËü·Å»Ø¡£ÏÖÔÚÅöµ½Ò»¸öÎÊÌ⣬ÄǾÍ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÊÇÄں˺¯Êý´¦ÀíµÄÓû§Êý¾Ý¶¼ÊÇ´æ·ÅÔÚÓû§Êý¾Ý¿Õ¼äÖе쬲¢Ê¹ÓÃÁË
|
||
<span lang=EN-US>fs </span>¶Î¼Ä´æÆ÷À´´ÓÓû§</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¿Õ¼ä´«µÝÊý¾Ýµ½Äں˿ռäÖС£¶øÕâÀïÐèÒª´¦ÀíµÄÊý¾ÝÈ´ÔÚÄں˿ռäÖС£Òò´ËΪÁËÕýÈ·µØ´¦Àí</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>λÓÚÄÚºËÖеÄÓû§Êý¾Ý£¬ÎÒÃÇÐèÒªÈÃ<span
|
||
lang=EN-US>fs</span>¶Î¼Ä´æÆ÷ÁÙʱָÏòÄں˿ռ䣬¼´ÈÃ<span lang=EN-US>fs =0x10</span>¡£²¢ÔÚ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µ÷Óú¯Êý´¦ÀíÍêºóÔÙ»Ö¸´Ô<span
|
||
lang=EN-US>fs</span>µÄÖµ¡£×îºóÊÍ·ÅÏàÓ¦»º³å¿é£¬²¢·µ»Ø <span lang=EN-US>_namei()</span>½âÎöµÃµ½µÄ·û</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ºÅÁ´½ÓÖ¸ÏòµÄÎļþ<span
|
||
lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>250</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>251</span></u><span
|
||
lang=EN-US> __asm__(<i>"mov
|
||
%0,%%fs"</i>::<i>"r"</i> ((unsigned short) 0x10));</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>252</span></u><span
|
||
lang=EN-US> inode = <u><span
|
||
style='color:blue'>_namei</span></u>(bh->b_data,dir,0);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>253</span></u><span
|
||
lang=EN-US> __asm__(<i>"mov
|
||
%0,%%fs"</i>::<i>"r"</i> (fs));</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>254</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>255</span></u><span
|
||
lang=EN-US> return inode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>256</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>257</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>258</span></u><span
|
||
lang=EN-US> <b><i>/*</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>259</span></u><span
|
||
lang=EN-US> <b><i> * get_dir()</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>260</span></u><span
|
||
lang=EN-US> <b><i> *</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>261</span></u><span
|
||
lang=EN-US> <b><i> * Getdir traverses the pathname until it hits the
|
||
topmost directory.</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>262</span></u><span
|
||
lang=EN-US> <b><i> * It returns NULL on failure.</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>263</span></u><span
|
||
lang=EN-US> <b><i> */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> /*</span></p>
|
||
|
||
<p class=a><span lang=EN-US> *
|
||
get_dir()</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * </span></p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>¸Ãº¯Êý¸ù¾Ý¸ø³öµÄ·¾¶Ãû½øÐÐËÑË÷£¬Ö±µ½´ïµ½×î¶¥¶ËµÄĿ¼¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>Èç¹ûʧ°ÜÔò·µ»Ø<span
|
||
lang=EN-US>NULL</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> */</span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>´ÓÖ¸¶¨Ä¿Â¼¿ªÊ¼ËÑѰָ¶¨Â·¾¶ÃûµÄĿ¼£¨»òÎļþÃû£©µÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>pathname
|
||
- </span>·¾¶Ãû£»<span lang=EN-US>inode - </span>Ö¸¶¨ÆðʼĿ¼µÄ<span lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£ºÄ¿Â¼»òÎļþµÄ<span
|
||
lang=EN-US>i</span>½ÚµãÖ¸Õ롣ʧ°Üʱ·µ»Ø<span lang=EN-US>NULL</span>¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>264</span></u><span
|
||
lang=EN-US> static struct <u><span style='color:blue'>m_inode</span></u> * <u><span
|
||
style='color:blue'>get_dir</span></u>(const char * pathname, struct <u><span
|
||
style='color:blue'>m_inode</span></u> * inode)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>265</span></u><span
|
||
lang=EN-US> {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>266</span></u><span
|
||
lang=EN-US> char c;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>267</span></u><span
|
||
lang=EN-US> const char * <u><span
|
||
style='color:blue'>thisname</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>268</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>buffer_head</span></u> * bh;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>269</span></u><span
|
||
lang=EN-US> int namelen,inr;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>270</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>dir_entry</span></u> * de;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>271</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>m_inode</span></u> * dir;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>272</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ê×ÏÈÅжϲÎÊýÓÐЧÐÔ¡£Èç¹û¸ø³öµÄÖ¸¶¨Ä¿Â¼µÄ<span
|
||
lang=EN-US>i</span>½ÚµãÖ¸Õë<span lang=EN-US>inode</span>Ϊ¿Õ£¬ÔòʹÓõ±Ç°½ø³ÌµÄµ±</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ǰ¹¤×÷Ŀ¼<span lang=EN-US>i</span>½Úµã¡£Èç¹ûÓû§Ö¸¶¨Â·¾¶ÃûµÄµÚ<span
|
||
lang=EN-US>1</span>¸ö×Ö·ûÊÇ<span lang=EN-US>'/'</span>£¬Ôò˵Ã÷·¾¶ÃûÊǾø¶Ô·¾¶Ãû¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÔòÓ¦¸Ã´Óµ±Ç°½ø³ÌÈÎÎñ½á¹¹ÖÐÉèÖõĸù£¨»òα¸ù£©<span
|
||
lang=EN-US>i</span>½Úµã¿ªÊ¼²Ù×÷¡£ÓÚÊÇÎÒÃÇÐèÒªÏȷŻزÎ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÊýÖ¸¶¨µÄ»òÕßÉ趨µÄĿ¼<span
|
||
lang=EN-US>i</span>½Úµã£¬²¢È¡µÃ½ø³ÌʹÓõĸù<span lang=EN-US>i</span>½Úµã¡£È»ºó°Ñ¸Ã<span
|
||
lang=EN-US>i</span>½ÚµãµÄÒýÓüÆÊý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼Ó<span lang=EN-US>1</span>£¬²¢É¾³ý·¾¶ÃûµÄµÚ<span
|
||
lang=EN-US>1</span>¸ö×Ö·û <span lang=EN-US>'/'</span>¡£ÕâÑù¾Í¿ÉÒÔ±£Ö¤µ±Ç°½ø³ÌÖ»ÄÜÒÔÆäÉ趨µÄ¸ù<span
|
||
lang=EN-US>i</span>½Úµã</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>×÷ΪËÑË÷µÄÆðµã¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>273</span></u><span
|
||
lang=EN-US> if (!inode) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>274</span></u><span
|
||
lang=EN-US>
|
||
inode = <u><span style='color:blue'>current</span></u>->pwd;
|
||
// </span>½ø³ÌµÄµ±Ç°¹¤×÷Ŀ¼<span lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>275</span></u><span
|
||
lang=EN-US>
|
||
inode->i_count++;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>276</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>277</span></u><span
|
||
lang=EN-US> if ((c=<u><span
|
||
style='color:blue'>get_fs_byte</span></u>(pathname))==<i>'/'</i>) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>278</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);
|
||
// </span>·Å»ØÔ<span lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>279</span></u><span
|
||
lang=EN-US>
|
||
inode = <u><span style='color:blue'>current</span></u>->root;
|
||
// </span>Ϊ½ø³ÌÖ¸¶¨µÄ¸ù<span lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>280</span></u><span
|
||
lang=EN-US>
|
||
pathname++;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>281</span></u><span
|
||
lang=EN-US>
|
||
inode->i_count++;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>282</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºóÕë¶Ô·¾¶ÃûÖеĸ÷¸öĿ¼Ãû²¿·ÖºÍÎļþÃû½øÐÐÑ»·´¦Àí¡£ÔÚÑ»·´¦Àí¹ý³ÌÖУ¬ÎÒÃÇÏÈÒª</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¶Ôµ±Ç°ÕýÔÚ´¦ÀíµÄĿ¼Ãû²¿·ÖµÄ <span
|
||
lang=EN-US>i</span>½Úµã½øÐÐÓÐЧÐÔÅжϣ¬²¢ÇҰѱäÁ¿<span lang=EN-US>thisname </span>Ö¸Ïòµ±Ç°Õý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÔÚ´¦ÀíµÄĿ¼Ãû²¿·Ö¡£Èç¹û¸Ã<span
|
||
lang=EN-US>i</span>½Úµã±íÃ÷µ±Ç°´¦ÀíµÄĿ¼Ãû²¿·Ö²»ÊÇĿ¼ÀàÐÍ£¬»òÕßûÓпÉ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>½øÈë¸ÃĿ¼µÄ·ÃÎÊÐí¿É£¬Ôò·Å»Ø¸Ã<span
|
||
lang=EN-US>i</span>½Úµã£¬²¢·µ»Ø<span lang=EN-US>NULL</span>Í˳ö¡£ µ±È»ÔÚ¸Õ½øÈëÑ»·Ê±£¬µ±Ç°</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼µÄ<span lang=EN-US>i</span>½Úµã<span
|
||
lang=EN-US>inode</span>¾ÍÊǽø³Ì¸ù<span lang=EN-US>i</span>½Úµã»òÕßÊǵ±Ç°¹¤×÷Ŀ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬»òÕßÊDzÎÊýÖ¸¶¨µÄij</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¸öËÑË÷ÆðʼĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>283</span></u><span
|
||
lang=EN-US> while (1) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>284</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>thisname</span></u> = pathname;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>285</span></u><span
|
||
lang=EN-US>
|
||
if (!<u><span style='color:blue'>S_ISDIR</span></u>(inode->i_mode) || !<u><span
|
||
style='color:blue'>permission</span></u>(inode,<u><span style='color:blue'>MAY_EXEC</span></u>))
|
||
{</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>286</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>287</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>288</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÿ´ÎÑ»·ÎÒÃÇ´¦Àí·¾¶ÃûÖÐÒ»¸öĿ¼Ãû£¨»òÎļþÃû£©²¿·Ö¡£Òò´ËÔÚÿ´ÎÑ»·ÖÐÎÒÃǶ¼Òª´Ó·</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¾¶Ãû×Ö·û´®ÖзÖÀë³öÒ»¸öĿ¼Ãû£¨»òÎļþÃû£©¡£·½·¨ÊÇ´Óµ±Ç°Â·¾¶ÃûÖ¸Õë
|
||
<span lang=EN-US>pathname </span>¿ªÊ¼´¦</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ËÑË÷¼ì²â×Ö·û£¬Ö±µ½×Ö·ûÊÇÒ»¸ö½áβ·û£¨<span
|
||
lang=EN-US>NULL</span>£©»òÕßÊÇÒ»¸ö<span lang=EN-US>'/'</span>×Ö·û¡£´Ëʱ±äÁ¿ <span
|
||
lang=EN-US>namelen </span>Õý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ºÃÊǵ±Ç°´¦ÀíĿ¼Ãû²¿·ÖµÄ³¤¶È£¬¶ø±äÁ¿ <span
|
||
lang=EN-US>thisname </span>ÕýÖ¸Ïò¸ÃĿ¼Ãû²¿·ÖµÄ¿ªÊ¼´¦¡£´ËʱÈç</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¹û×Ö·ûÊǽáβ·û<span
|
||
lang=EN-US>NULL</span>£¬Ôò±íÃ÷ÒѾËÑË÷µ½Â·¾¶Ãûĩ⣬²¢Òѵ½´ï×îºóÖ¸¶¨Ä¿Â¼Ãû»òÎļþÃû£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ôò·µ»Ø¸Ã<span lang=EN-US>i</span>½ÚµãÖ¸ÕëÍ˳ö¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>×¢Ò⣡Èç¹û·¾¶ÃûÖÐ×îºóÒ»¸öÃû³ÆÒ²ÊÇÒ»¸öĿ¼Ãû£¬µ«ÆäºóÃæÃ»ÓмÓÉÏ
|
||
<span lang=EN-US>'/'</span>×Ö·û£¬Ôòº¯Êý²»</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>»á·µ»Ø¸Ã×îºóĿ¼ÃûµÄ<span
|
||
lang=EN-US>i</span>½Úµã£¡ÀýÈ磺¶ÔÓÚ·¾¶Ãû<span lang=EN-US>/usr/src/linux</span>£¬¸Ãº¯Êý½«Ö»·µ»Ø<span
|
||
lang=EN-US>src/</span>Ä¿</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼ÃûµÄ<span lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>289</span></u><span
|
||
lang=EN-US>
|
||
for(namelen=0;(c=<u><span style='color:blue'>get_fs_byte</span></u>(pathname++))&&(c!=<i>'/'</i>);namelen++)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>290</span></u><span
|
||
lang=EN-US>
|
||
<b><i>/* nothing */</i></b> ;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>291</span></u><span
|
||
lang=EN-US>
|
||
if (!c)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>292</span></u><span
|
||
lang=EN-US>
|
||
return inode;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ôڵõ½µ±Ç°Ä¿Â¼Ãû²¿·Ö£¨»òÎļþÃû£©ºó£¬ÎÒÃǵ÷ÓòéÕÒĿ¼ÏÊý<span
|
||
lang=EN-US>find_entry()</span>ÔÚµ±Ç°´¦</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÀíµÄĿ¼ÖÐѰÕÒÖ¸¶¨Ãû³ÆµÄĿ¼Ïî¡£Èç¹ûûÓÐÕÒµ½£¬Ôò·Å»Ø¸Ã<span
|
||
lang=EN-US>i</span>½Úµã£¬²¢·µ»Ø<span lang=EN-US>NULL</span>Í˳ö¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºóÔÚÕÒµ½µÄĿ¼ÏîÖÐÈ¡³öÆä<span
|
||
lang=EN-US>i</span>½ÚµãºÅ<span lang=EN-US>inr</span>ºÍÉ豸ºÅ<span lang=EN-US>idev</span>£¬ÊͷŰüº¬¸ÃĿ¼ÏîµÄ¸ßËÙ»º³å</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¿é²¢·Å»Ø¸Ã<span lang=EN-US>i</span>½Úµã¡£
|
||
È»ºóÈ¡½ÚµãºÅ<span lang=EN-US>inr</span>µÄ<span lang=EN-US>i</span>½Úµã<span lang=EN-US>inode</span>£¬²¢ÒÔ¸ÃĿ¼ÏîΪµ±Ç°Ä¿Â¼¼ÌÐøÑ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>»·´¦Àí·¾¶ÃûÖеÄÏÂһĿ¼Ãû²¿·Ö£¨»òÎļþÃû£©¡£Èç¹ûµ±Ç°´¦ÀíµÄĿ¼ÏîÊÇÒ»¸ö·ûºÅÁ´½Ó</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ãû£¬ÔòʹÓÃ<span lang=EN-US>follow_link()</span>¾Í¿ÉÒԵõ½ÆäÖ¸ÏòµÄĿ¼ÏîÃûµÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>293</span></u><span
|
||
lang=EN-US>
|
||
if (!(bh = <u><span style='color:blue'>find_entry</span></u>(&inode,<u><span
|
||
style='color:blue'>thisname</span></u>,namelen,&de))) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>294</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>295</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>296</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>297</span></u><span
|
||
lang=EN-US>
|
||
inr = de->inode;
|
||
// </span>µ±Ç°Ä¿Â¼Ãû²¿·ÖµÄ<span lang=EN-US>i</span>½ÚµãºÅ¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>298</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>299</span></u><span
|
||
lang=EN-US>
|
||
dir = inode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>300</span></u><span
|
||
lang=EN-US>
|
||
if (!(inode = <u><span style='color:blue'>iget</span></u>(dir->i_dev,inr)))
|
||
{ // </span>È¡<span lang=EN-US>i</span>½ÚµãÄÚÈÝ¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>301</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>302</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>303</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>304</span></u><span
|
||
lang=EN-US>
|
||
if (!(inode = <u><span style='color:blue'>follow_link</span></u>(dir,inode)))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>305</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>306</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>307</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>308</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>309</span></u><span
|
||
lang=EN-US> <b><i>/*</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>310</span></u><span
|
||
lang=EN-US> <b><i> * dir_namei()</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>311</span></u><span
|
||
lang=EN-US> <b><i> *</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>312</span></u><span
|
||
lang=EN-US> <b><i> * dir_namei() returns the inode of the directory of the</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>313</span></u><span
|
||
lang=EN-US> <b><i> * specified name, and the name within that directory.</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>314</span></u><span
|
||
lang=EN-US> <b><i> */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> /*</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * dir_namei()</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * </span></p>
|
||
|
||
<p class=a><span lang=EN-US> * dir_namei()</span>º¯Êý·µ»ØÖ¸¶¨Ä¿Â¼ÃûµÄ<span
|
||
lang=EN-US>i</span>½ÚµãÖ¸Õ룬ÒÔ¼°ÔÚ×î¶¥²ã</p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>Ŀ¼µÄÃû³Æ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> */</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>pathname
|
||
- </span>Ŀ¼·¾¶Ãû£»<span lang=EN-US>namelen - </span>·¾¶Ãû³¤¶È£»<span lang=EN-US>name - </span>·µ»ØµÄ×î¶¥²ãĿ¼Ãû¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // base - </span>ËÑË÷ÆðʼĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£ºÖ¸¶¨Ä¿Â¼Ãû×î¶¥²ãĿ¼µÄ<span
|
||
lang=EN-US>i</span>½ÚµãÖ¸ÕëºÍ×î¶¥²ãĿ¼Ãû³Æ¼°³¤¶È¡£³ö´íʱ·µ»Ø<span lang=EN-US>NULL</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>×¢Ò⣡£¡ÕâÀï¡°×î¶¥²ãĿ¼¡±ÊÇָ·¾¶ÃûÖÐ×î¿¿½üÄ©¶ËµÄĿ¼¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>315</span></u><span
|
||
lang=EN-US> static struct <u><span style='color:blue'>m_inode</span></u> * <u><span
|
||
style='color:blue'>dir_namei</span></u>(const char * pathname,</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>316</span></u><span
|
||
lang=EN-US> int * namelen,
|
||
const char ** name, struct <u><span style='color:blue'>m_inode</span></u> *
|
||
base)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>317</span></u><span
|
||
lang=EN-US> {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>318</span></u><span
|
||
lang=EN-US> char c;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>319</span></u><span
|
||
lang=EN-US> const char *
|
||
basename;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>320</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>m_inode</span></u> * dir;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>321</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ê×ÏÈÈ¡µÃÖ¸¶¨Â·¾¶Ãû×î¶¥²ãĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£È»ºó¶Ô·¾¶Ãû<span lang=EN-US>pathname</span>½øÐÐËÑË÷¼ì²â£¬²é³ö×îºó</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ò»¸ö<span lang=EN-US>'/'</span>×Ö·ûºóÃæµÄÃû×Ö×Ö·û´®£¬¼ÆËãÆä³¤¶È£¬²¢ÇÒ·µ»Ø×î¶¥²ãĿ¼µÄ<span
|
||
lang=EN-US>i</span>½ÚµãÖ¸Õë¡£×¢Ò⣡Èç</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¹û·¾¶Ãû×îºóÒ»¸ö×Ö·ûÊÇб¸Ü×Ö·û<span
|
||
lang=EN-US>'/'</span>£¬ÄÇô·µ»ØµÄĿ¼ÃûΪ¿Õ£¬²¢ÇÒ³¤¶ÈΪ<span lang=EN-US>0</span>¡£µ«·µ»ØµÄ<span
|
||
lang=EN-US>i</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>½ÚµãÖ¸ÕëÈÔȻָÏò×îºóÒ»¸ö<span
|
||
lang=EN-US>'/'</span>×Ö·ûǰĿ¼ÃûµÄ<span lang=EN-US>i</span>½Úµã¡£²Î¼ûµÚ<span lang=EN-US>289</span>ÐÐÉϵġ°×¢Ò⡱˵Ã÷¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>322</span></u><span
|
||
lang=EN-US> if (!(dir = <u><span
|
||
style='color:blue'>get_dir</span></u>(pathname,base)))
|
||
// base</span>ÊÇÖ¸¶¨µÄÆðʼĿ¼<span lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>323</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>324</span></u><span
|
||
lang=EN-US> basename =
|
||
pathname;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>325</span></u><span
|
||
lang=EN-US> while (c=<u><span
|
||
style='color:blue'>get_fs_byte</span></u>(pathname++))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>326</span></u><span
|
||
lang=EN-US>
|
||
if (c==<i>'/'</i>)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>327</span></u><span
|
||
lang=EN-US>
|
||
basename=pathname;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>328</span></u><span
|
||
lang=EN-US> *namelen =
|
||
pathname-basename-1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>329</span></u><span
|
||
lang=EN-US> *name = basename;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>330</span></u><span
|
||
lang=EN-US> return dir;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>331</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>332</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>ȡָ¶¨Â·¾¶ÃûµÄ<span
|
||
lang=EN-US>i</span>½ÚµãÄÚ²¿º¯Êý¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>pathname
|
||
- </span>·¾¶Ãû£»<span lang=EN-US>base - </span>ËÑË÷ÆðµãĿ¼<span lang=EN-US>i</span>½Úµã£»<span
|
||
lang=EN-US>follow_links - </span>ÊÇ·ñ¸úËæ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·ûºÅÁ´½ÓµÄ±êÖ¾£¬<span
|
||
lang=EN-US>1 - </span>ÐèÒª£¬<span lang=EN-US>0</span>²»ÐèÒª¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£º¶ÔÓ¦µÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>333</span></u><span
|
||
lang=EN-US> struct <u><span style='color:blue'>m_inode</span></u> * <u><span
|
||
style='color:blue'>_namei</span></u>(const char * pathname, struct <u><span
|
||
style='color:blue'>m_inode</span></u> * base,</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>334</span></u><span
|
||
lang=EN-US> int follow_links)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>335</span></u><span
|
||
lang=EN-US> {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>336</span></u><span
|
||
lang=EN-US> const char *
|
||
basename;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>337</span></u><span
|
||
lang=EN-US> int inr,namelen;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>338</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>m_inode</span></u> * inode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>339</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>buffer_head</span></u> * bh;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>340</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>dir_entry</span></u> * de;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>341</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ê×ÏȲéÕÒÖ¸¶¨Â·¾¶ÃûÖÐ×î¶¥²ãĿ¼µÄĿ¼Ãû²¢µÃµ½Æä<span
|
||
lang=EN-US>i</span>½Úµã¡£Èô²»´æÔÚ£¬Ôò·µ»Ø<span lang=EN-US>NULL</span>Í˳ö¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹û·µ»ØµÄ×î¶¥²ãÃû×ֵij¤¶ÈÊÇ<span
|
||
lang=EN-US>0</span>£¬Ôò±íʾ¸Ã·¾¶ÃûÒÔÒ»¸öĿ¼ÃûΪ×îºóÒ»Ïî¡£Òò´Ë˵Ã÷ÎÒ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÃÇÒѾÕÒµ½¶ÔӦĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬¿ÉÒÔÖ±½Ó·µ»Ø¸Ã<span lang=EN-US>i</span>½ÚµãÍ˳ö¡£Èç¹û·µ»ØµÄÃû×Ö³¤¶È²»ÊÇ<span
|
||
lang=EN-US>0</span>£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÔòÎÒÃÇÒÔÖ¸¶¨µÄÆðʼĿ¼<span
|
||
lang=EN-US>base</span>£¬Ôٴε÷ÓÃ<span lang=EN-US>dir_namei()</span>º¯ÊýÀ´ËÑË÷¶¥²ãĿ¼Ãû£¬²¢¸ù¾Ý·µ»Ø</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÄÐÅÏ¢×÷ÀàËÆÅжϡ£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>311</span></u><span
|
||
lang=EN-US> if (!(dir = <u><span
|
||
style='color:blue'>dir_namei</span></u>(pathname,&namelen,&basename)))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>312</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>313</span></u><span
|
||
lang=EN-US> if
|
||
(!namelen)
|
||
<b><i>/* special case: '/usr/' etc */</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>314</span></u><span
|
||
lang=EN-US>
|
||
return dir;
|
||
/* </span>¶ÔÓ¦ÓÚ<span lang=EN-US>'/usr/'</span>µÈÇé¿ö<span lang=EN-US> */</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>342</span></u><span
|
||
lang=EN-US> if (!(base = <u><span
|
||
style='color:blue'>dir_namei</span></u>(pathname,&namelen,&basename,base)))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>343</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>344</span></u><span
|
||
lang=EN-US> if
|
||
(!namelen)
|
||
<b><i>/* special case: '/usr/' etc */</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>345</span></u><span
|
||
lang=EN-US>
|
||
return base;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºóÔÚ·µ»ØµÄ¶¥²ãĿ¼ÖÐѰÕÒÖ¸¶¨ÎļþÃûĿ¼ÏîµÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£×¢Ò⣡ÒòΪÈç¹û×îºóÒ²ÊÇÒ»¸öÄ¿</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼Ãû£¬µ«ÆäºóûÓмÓ<span
|
||
lang=EN-US>'/'</span>£¬Ôò²»»á·µ»Ø¸Ã×îºóĿ¼µÄ<span lang=EN-US>i</span>½Úµã£¡ ÀýÈ磺<span
|
||
lang=EN-US>/usr/src/linux</span>£¬½«Ö»</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø <span lang=EN-US>src/</span>Ŀ¼ÃûµÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£ÒòΪº¯Êý<span lang=EN-US>dir_namei() </span>½«²»ÒÔ<span
|
||
lang=EN-US>'/'</span>½áÊøµÄ×îºóÒ»¸öÃû×Öµ±×÷Ò»¸ö</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÎļþÃûÀ´¿´´ý£¬Òò´ËÕâÀïÐèÒªµ¥¶À¶ÔÕâÖÖÇé¿öʹÓÃѰÕÒĿ¼Ïî<span
|
||
lang=EN-US>i</span>½Úµãº¯Êý<span lang=EN-US>find_entry()</span>½øÐÐ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>´¦Àí¡£´Ëʱ<span lang=EN-US>de</span>Öк¬ÓÐѰÕÒµ½µÄĿ¼ÏîÖ¸Õ룬¶ø<span
|
||
lang=EN-US>dir</span>Êǰüº¬¸ÃĿ¼ÏîµÄĿ¼µÄ<span lang=EN-US>i</span>½ÚµãÖ¸Õë¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>346</span></u><span
|
||
lang=EN-US> bh = <u><span
|
||
style='color:blue'>find_entry</span></u>(&base,basename,namelen,&de);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>347</span></u><span
|
||
lang=EN-US> if (!bh) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>348</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(base);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>349</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>350</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>½Ó×ÅÈ¡¸ÃĿ¼ÏîµÄ<span
|
||
lang=EN-US>i</span>½ÚµãºÅ£¬²¢ÊͷŰüº¬¸ÃĿ¼ÏîµÄ¸ßËÙ»º³å¿é²¢·Å»ØÄ¿Â¼<span lang=EN-US>i</span>½Úµã¡£È»ºóÈ¡</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¶ÔÓ¦½ÚµãºÅµÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬ÐÞ¸ÄÆä±»·ÃÎÊʱ¼äΪµ±Ç°Ê±¼ä£¬²¢ÖÃÒÑÐ޸ıêÖ¾¡£×îºó·µ»Ø¸Ã<span lang=EN-US>i</span>½Úµã</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ö¸Õë<span lang=EN-US>inode</span>¡£Èç¹ûµ±Ç°´¦ÀíµÄĿ¼ÏîÊÇÒ»¸ö·ûºÅÁ´½ÓÃû£¬ÔòʹÓÃ<span
|
||
lang=EN-US>follow_link()</span>µÃµ½ÆäÖ¸ÏòµÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼ÏîÃûµÄ<span lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>351</span></u><span
|
||
lang=EN-US> inr = de->inode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>352</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>353</span></u><span
|
||
lang=EN-US> if (!(inode = <u><span
|
||
style='color:blue'>iget</span></u>(base->i_dev,inr))) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>354</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(base);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>355</span></u><span
|
||
lang=EN-US>
|
||
return <u><span style='color:blue'>NULL</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>356</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>357</span></u><span
|
||
lang=EN-US> if (follow_links)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>358</span></u><span
|
||
lang=EN-US>
|
||
inode = <u><span style='color:blue'>follow_link</span></u>(base,inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>359</span></u><span
|
||
lang=EN-US> else</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>360</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(base);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>361</span></u><span
|
||
lang=EN-US> inode->i_atime=<u><span
|
||
style='color:blue'>CURRENT_TIME</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>362</span></u><span
|
||
lang=EN-US> inode->i_dirt=1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>363</span></u><span
|
||
lang=EN-US> return inode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>364</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>365</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>ȡָ¶¨Â·¾¶ÃûµÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬²»¸úËæ·ûºÅÁ´½Ó¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>pathname
|
||
- </span>·¾¶Ãû¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£º¶ÔÓ¦µÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>366</span></u><span
|
||
lang=EN-US> struct <u><span style='color:blue'>m_inode</span></u> * <u><span
|
||
style='color:blue'>lnamei</span></u>(const char * pathname)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>367</span></u><span
|
||
lang=EN-US> {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>368</span></u><span
|
||
lang=EN-US> return <u><span
|
||
style='color:blue'>_namei</span></u>(pathname, <u><span style='color:blue'>NULL</span></u>,
|
||
0);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>369</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>370</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>371</span></u><span
|
||
lang=EN-US> <b><i>/*</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>372</span></u><span
|
||
lang=EN-US> <b><i> * namei()</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>373</span></u><span
|
||
lang=EN-US> <b><i> *</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>374</span></u><span
|
||
lang=EN-US> <b><i> * is used by most simple commands to get the inode of a
|
||
specified name.</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>375</span></u><span
|
||
lang=EN-US> <b><i> * Open, link etc use their own routines, but this is
|
||
enough for things</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>376</span></u><span
|
||
lang=EN-US> <b><i> * like 'chmod' etc.</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>377</span></u><span
|
||
lang=EN-US> <b><i> */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> /*</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * namei()</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * </span></p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>¸Ãº¯Êý±»Ðí¶à¼òµ¥ÃüÁîÓÃÓÚÈ¡µÃÖ¸¶¨Â·¾¶Ãû³ÆµÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£<span lang=EN-US>open</span>¡¢<span lang=EN-US>link</span>µÈÔòʹÓÃËüÃÇ</p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>×Ô¼ºµÄÏàÓ¦º¯Êý¡£µ«¶ÔÓÚÏóÐÞ¸Äģʽ<span
|
||
lang=EN-US>'chmod'</span>µÈÕâÑùµÄÃüÁ¸Ãº¯ÊýÒÑ×ã¹»ÓÃÁË¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> */</span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>ȡָ¶¨Â·¾¶ÃûµÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬¸úËæ·ûºÅÁ´½Ó¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>pathname
|
||
- </span>·¾¶Ãû¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£º¶ÔÓ¦µÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>378</span></u><span
|
||
lang=EN-US> struct <u><span style='color:blue'>m_inode</span></u> * <u><span
|
||
style='color:blue'>namei</span></u>(const char * pathname)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>379</span></u><span
|
||
lang=EN-US> {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>380</span></u><span
|
||
lang=EN-US> return <u><span
|
||
style='color:blue'>_namei</span></u>(pathname,<u><span style='color:blue'>NULL</span></u>,1);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>381</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>382</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>383</span></u><span
|
||
lang=EN-US> <b><i>/*</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>384</span></u><span
|
||
lang=EN-US> <b><i> * open_namei()</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>385</span></u><span
|
||
lang=EN-US> <b><i> *</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>386</span></u><span
|
||
lang=EN-US> <b><i> * namei for open - this is in fact almost the whole
|
||
open-routine.</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>387</span></u><span
|
||
lang=EN-US> <b><i> */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> /*</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * open_namei()</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * </span></p>
|
||
|
||
<p class=a><span lang=EN-US> * open()</span>º¯ÊýʹÓõÄ<span
|
||
lang=EN-US>namei</span>º¯Êý<span lang=EN-US> - </span>ÕâÆäʵ¼¸ºõÊÇÍêÕûµÄ´ò¿ªÎļþ³ÌÐò¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> */</span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>Îļþ´ò¿ª<span
|
||
lang=EN-US>namei</span>º¯Êý¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý<span lang=EN-US>filename</span>ÊÇÎļþ·¾¶Ãû£¬<span
|
||
lang=EN-US>flag</span>ÊÇ´ò¿ªÎļþ±êÖ¾£¬¿Éȡֵ<span lang=EN-US>O_RDONLY</span>£¨Ö»¶Á£©¡¢<span
|
||
lang=EN-US>O_WRONLY</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>£¨Ö»Ð´£©»ò<span lang=EN-US>O_RDWR</span>£¨¶Áд£©£¬ÒÔ¼°<span
|
||
lang=EN-US>O_CREAT</span>£¨´´½¨£©¡¢<span lang=EN-US>O_EXCL</span>£¨±»´´½¨Îļþ±ØÐë²»´æÔÚ£©¡¢</p>
|
||
|
||
<p class=a><span lang=EN-US> // O_APPEND</span>£¨ÔÚÎļþβÌí¼ÓÊý¾Ý£©µÈÆäËûһЩ±êÖ¾µÄ×éºÏ¡£Èç¹û±¾µ÷Óô´½¨ÁËÒ»¸öÐÂÎļþ£¬Ôò</p>
|
||
|
||
<p class=a><span lang=EN-US> // mode</span>¾ÍÓÃÓÚÖ¸¶¨ÎļþµÄÐí¿ÉÊôÐÔ¡£ÕâЩÊôÐÔÓÐ<span
|
||
lang=EN-US>S_IRWXU</span>£¨ÎļþËÞÖ÷¾ßÓжÁ¡¢Ð´ºÍÖ´ÐÐȨÏÞ£©¡¢</p>
|
||
|
||
<p class=a><span lang=EN-US> // S_IRUSR</span>£¨Óû§¾ßÓжÁÎļþȨÏÞ£©¡¢<span
|
||
lang=EN-US>S_IRWXG</span>£¨×é³ÉÔ±¾ßÓжÁ¡¢Ð´ºÍÖ´ÐÐȨÏÞ£©µÈµÈ¡£¶ÔÓÚÐÂ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>´´½¨µÄÎļþ£¬ÕâЩÊôÐÔÖ»Ó¦ÓÃÓÚ½«À´¶ÔÎļþµÄ·ÃÎÊ£¬´´½¨ÁËÖ»¶ÁÎļþµÄ´ò¿ªµ÷ÓÃÒ²½«·µ»ØÒ»</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¸ö¿É¶ÁдµÄÎļþ¾ä±ú¡£²Î¼û°üº¬Îļþ<span
|
||
lang=EN-US>sys/stat.h</span>¡¢<span lang=EN-US>fcntl.h</span>¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£º³É¹¦·µ»Ø<span
|
||
lang=EN-US>0</span>£¬·ñÔò·µ»Ø³ö´íÂ룻<span lang=EN-US>res_inode - </span>·µ»Ø¶ÔÓ¦Îļþ·¾¶ÃûµÄ<span
|
||
lang=EN-US>i</span>½ÚµãÖ¸Õë¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>388</span></u><span
|
||
lang=EN-US> int <u><span style='color:blue'>open_namei</span></u>(const char *
|
||
pathname, int flag, int mode,</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>389</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>m_inode</span></u> ** res_inode)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>390</span></u><span
|
||
lang=EN-US> {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>391</span></u><span
|
||
lang=EN-US> const char *
|
||
basename;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>392</span></u><span
|
||
lang=EN-US> int
|
||
inr,dev,namelen;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>393</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>m_inode</span></u> * dir, *inode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>394</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>buffer_head</span></u> * bh;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>395</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>dir_entry</span></u> * de;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>396</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ê×ÏȶԺ¯Êý²ÎÊý½øÐкÏÀíµÄ´¦Àí¡£Èç¹ûÎļþ·ÃÎÊģʽ±êÖ¾ÊÇÖ»¶Á£¨<span
|
||
lang=EN-US>0</span>£©£¬µ«ÊÇÎļþ½ØÁã±êÖ¾</p>
|
||
|
||
<p class=a><span lang=EN-US> // O_TRUNC</span>È´ÖÃλÁË£¬ÔòÔÚÎļþ´ò¿ª±êÖ¾ÖÐÌí¼Óֻд±êÖ¾<span
|
||
lang=EN-US>O_WRONLY</span>¡£ÕâÑù×öµÄÔÒòÊÇÓÉÓÚ½ØÁã</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>±êÖ¾<span lang=EN-US>O_TRUNC</span>±ØÐëÔÚÎļþ¿ÉдÇé¿öϲÅÓÐЧ¡£È»ºóʹÓõ±Ç°½ø³ÌµÄÎļþ·ÃÎÊÐí¿ÉÆÁ±ÎÂ룬ÆÁ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>±Îµô¸ø¶¨Ä£Ê½ÖеÄÏàӦ룬²¢ÌíÉÏÆÕͨÎļþ±êÖ¾<span
|
||
lang=EN-US>I_REGULAR</span>¡£¸Ã±êÖ¾½«ÓÃÓÚ´ò¿ªµÄÎļþ²»´æ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÔÚ¶øÐèÒª´´½¨Îļþʱ£¬×÷ΪÐÂÎļþµÄĬÈÏÊôÐÔ¡£²Î¼ûÏÂÃæ<span
|
||
lang=EN-US>411</span>ÐÐÉϵÄ×¢ÊÍ¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>397</span></u><span
|
||
lang=EN-US> if ((flag & <u><span
|
||
style='color:blue'>O_TRUNC</span></u>) && !(flag & <u><span
|
||
style='color:blue'>O_ACCMODE</span></u>))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>398</span></u><span
|
||
lang=EN-US>
|
||
flag |= <u><span style='color:blue'>O_WRONLY</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>399</span></u><span
|
||
lang=EN-US> mode &= 0777
|
||
& ~current-><u><span style='color:blue'>umask</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>400</span></u><span
|
||
lang=EN-US> mode |= <u><span
|
||
style='color:blue'>I_REGULAR</span></u>;
|
||
// </span>³£¹æÎļþ±êÖ¾¡£¼û²Î¼û<span lang=EN-US>include/const.h</span>Îļþ£©¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºó¸ù¾ÝÖ¸¶¨µÄ·¾¶ÃûѰÕÒµ½¶ÔÓ¦µÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬ÒÔ¼°×î¶¥¶ËĿ¼Ãû¼°Æä³¤¶È¡£´ËʱÈç¹û×î¶¥¶Ë</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼Ãû³¤¶ÈΪ<span
|
||
lang=EN-US>0</span>£¨ ÀýÈç<span lang=EN-US>'</span><span lang=EN-US>/usr/' </span>ÕâÖÖ·¾¶ÃûµÄÇé¿ö£©£¬ÄÇôÈô²Ù×÷²»ÊǶÁд¡¢´´½¨ºÍÎļþ³¤</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¶È½Ø<span lang=EN-US>0</span>£¬Ôò±íʾÊÇÔÚ´ò¿ªÒ»¸öĿ¼ÃûÎļþ²Ù×÷¡£ÓÚÊÇÖ±½Ó·µ»Ø¸ÃĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã²¢·µ»Ø<span lang=EN-US>0</span>Í˳ö¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·ñÔò˵Ã÷½ø³Ì²Ù×÷·Ç·¨£¬ÓÚÊǷŻظÃ<span
|
||
lang=EN-US>i</span>½Úµã£¬·µ»Ø³ö´íÂë¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>401</span></u><span
|
||
lang=EN-US> if (!(dir = <u><span
|
||
style='color:blue'>dir_namei</span></u>(pathname,&namelen,&basename,<u><span
|
||
style='color:blue'>NULL</span></u>)))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>402</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOENT</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>403</span></u><span
|
||
lang=EN-US> if (!namelen)
|
||
{
|
||
<b><i>/* special case: '/usr/' etc */</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>404</span></u><span
|
||
lang=EN-US>
|
||
if (!(flag & (<u><span style='color:blue'>O_ACCMODE</span></u>|<u><span
|
||
style='color:blue'>O_CREAT</span></u>|<u><span style='color:blue'>O_TRUNC</span></u>)))
|
||
{</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>405</span></u><span
|
||
lang=EN-US>
|
||
*res_inode=dir;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>406</span></u><span
|
||
lang=EN-US>
|
||
return 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>407</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>408</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>409</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EISDIR</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>410</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>½Óןù¾ÝÉÏÃæµÃµ½µÄ×î¶¥²ãĿ¼ÃûµÄ<span
|
||
lang=EN-US>i</span>½Úµã<span lang=EN-US>dir</span>£¬ÔÚÆäÖвéÕÒÈ¡µÃ·¾¶Ãû×Ö·û´®ÖÐ×îºóµÄÎÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼þÃû¶ÔÓ¦µÄĿ¼Ïî½á¹¹<span
|
||
lang=EN-US>de</span>£¬²¢Í¬Ê±µÃµ½¸ÃĿ¼ÏîËùÔڵĸßËÙ»º³åÇøÖ¸Õë¡£ Èç¹û¸Ã¸ßËÙ»º³å</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ö¸ÕëΪ<span lang=EN-US>NULL</span>£¬Ôò±íʾûÓÐÕÒµ½¶ÔÓ¦ÎļþÃûµÄĿ¼ÏÒò´ËÖ»¿ÉÄÜÊÇ´´½¨Îļþ²Ù×÷¡£
|
||
´ËʱÈç</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¹û²»ÊÇ´´½¨Îļþ£¬Ôò·Å»Ø¸ÃĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬·µ»Ø³ö´íºÅÍ˳ö¡£Èç¹ûÓû§ÔÚ¸ÃĿ¼ûÓÐдµÄȨ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Á¦£¬Ôò·Å»Ø¸ÃĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬·µ»Ø³ö´íºÅÍ˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>411</span></u><span
|
||
lang=EN-US> bh = <u><span
|
||
style='color:blue'>find_entry</span></u>(&dir,basename,namelen,&de);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>412</span></u><span
|
||
lang=EN-US> if (!bh) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>413</span></u><span
|
||
lang=EN-US>
|
||
if (!(flag & <u><span style='color:blue'>O_CREAT</span></u>)) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>414</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>415</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOENT</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>416</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>417</span></u><span
|
||
lang=EN-US>
|
||
if (!<u><span style='color:blue'>permission</span></u>(dir,<u><span
|
||
style='color:blue'>MAY_WRITE</span></u>)) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>418</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>419</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EACCES</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>420</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÏÖÔÚÎÒÃÇÈ·¶¨ÁËÊÇ´´½¨²Ù×÷²¢ÇÒÓÐд²Ù×÷Ðí¿É¡£ Òò´ËÎÒÃǾÍÔÚĿ¼<span
|
||
lang=EN-US>i</span>½Úµã¶ÔÓ¦É豸ÉÏÉêÇë</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ò»¸öеÄ<span lang=EN-US>i</span>½Úµã¸øÂ·¾¶ÃûÉÏÖ¸¶¨µÄÎļþʹÓá£
|
||
Èôʧ°ÜÔò·Å»ØÄ¿Â¼µÄ<span lang=EN-US>i</span>½Úµã£¬²¢·µ»ØÃ»ÓпÕ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼ä³ö´íÂë¡£·ñÔòʹÓøÃР<span
|
||
lang=EN-US>i</span>½Úµã£¬¶ÔÆä½øÐгõʼÉèÖãºÖýڵãµÄÓû§<span lang=EN-US>id</span>£»¶ÔÓ¦½Úµã·ÃÎÊÄ£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ʽ£»ÖÃÒÑÐ޸ıêÖ¾¡£È»ºó²¢ÔÚÖ¸¶¨Ä¿Â¼<span
|
||
lang=EN-US>dir</span>ÖÐÌí¼ÓÒ»¸öÐÂĿ¼Ïî¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>421</span></u><span
|
||
lang=EN-US>
|
||
inode = <u><span style='color:blue'>new_inode</span></u>(dir->i_dev);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>422</span></u><span
|
||
lang=EN-US>
|
||
if (!inode) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>423</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>424</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOSPC</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>425</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>426</span></u><span
|
||
lang=EN-US>
|
||
inode->i_uid = <u><span style='color:blue'>current</span></u>->euid;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>427</span></u><span
|
||
lang=EN-US>
|
||
inode->i_mode = mode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>428</span></u><span
|
||
lang=EN-US>
|
||
inode->i_dirt = 1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>429</span></u><span
|
||
lang=EN-US>
|
||
bh = <u><span style='color:blue'>add_entry</span></u>(dir,basename,namelen,&de);</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹û·µ»ØµÄÓ¦¸Ãº¬ÓÐÐÂĿ¼ÏîµÄ¸ßËÙ»º³åÇøÖ¸ÕëΪ<span
|
||
lang=EN-US>NULL</span>£¬Ôò±íʾÌí¼ÓĿ¼Ïî²Ù×÷ʧ°Ü¡£ÓÚÊÇ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>½«¸ÃÐÂ<span lang=EN-US>i</span>½ÚµãµÄÒýÓÃÁ¬½Ó¼ÆÊý¼õ<span
|
||
lang=EN-US>1</span>£¬·Å»Ø¸Ã<span lang=EN-US>i</span>½ÚµãÓëĿ¼µÄ<span lang=EN-US>i</span>½Úµã²¢·µ»Ø³ö´íÂëÍ˳ö¡£
|
||
·ñÔò</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>˵Ã÷Ìí¼ÓĿ¼Ïî²Ù×÷³É¹¦¡£ ÓÚÊÇÎÒÃÇÀ´ÉèÖøÃÐÂĿ¼ÏîµÄһЩ³õʼֵ£ºÖÃ<span
|
||
lang=EN-US>i</span>½ÚµãºÅΪÐÂÉêÇë</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µ½µÄ<span lang=EN-US>i</span>½ÚµãµÄºÅÂ룻²¢ÖøßËÙ»º³åÇøÒÑÐ޸ıêÖ¾¡£
|
||
È»ºóÊͷŸøßËÙ»º³åÇø£¬·Å»ØÄ¿Â¼µÄ<span lang=EN-US>i</span>½Ú</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µã¡£·µ»ØÐÂĿ¼ÏîµÄ<span
|
||
lang=EN-US>i</span>½ÚµãÖ¸Õ룬²¢³É¹¦Í˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>430</span></u><span
|
||
lang=EN-US>
|
||
if (!bh) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>431</span></u><span
|
||
lang=EN-US>
|
||
inode->i_nlinks--;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>432</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>433</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>434</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOSPC</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>435</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>436</span></u><span
|
||
lang=EN-US>
|
||
de->inode = inode->i_num;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>437</span></u><span
|
||
lang=EN-US>
|
||
bh->b_dirt = 1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>438</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>439</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>440</span></u><span
|
||
lang=EN-US>
|
||
*res_inode = inode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>441</span></u><span
|
||
lang=EN-US>
|
||
return 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>442</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÈôÉÏÃæ£¨<span lang=EN-US>411</span>ÐУ©ÔÚĿ¼ÖÐÈ¡ÎļþÃû¶ÔӦĿ¼Ïî½á¹¹µÄ²Ù×÷³É¹¦£¨¼´<span
|
||
lang=EN-US>bh</span>²»Îª<span lang=EN-US>NULL</span>£©£¬Ôò˵</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ã÷Ö¸¶¨´ò¿ªµÄÎļþÒѾ´æÔÚ¡£ÓÚÊÇÈ¡³ö¸ÃĿ¼ÏîµÄ<span
|
||
lang=EN-US>i</span>½ÚµãºÅºÍÆäËùÔÚÉ豸ºÅ£¬²¢ÊͷŸøßËÙ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>»º³åÇøÒÔ¼°·Å»ØÄ¿Â¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£Èç¹û´Ëʱ¶ÀÕ¼²Ù×÷±êÖ¾<span lang=EN-US>O_EXCL</span>ÖÃ룬µ«ÏÖÔÚÎļþÒѾ´æÔÚ£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ôò·µ»ØÎļþÒÑ´æÔÚ³ö´íÂëÍ˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>443</span></u><span
|
||
lang=EN-US> inr = de->inode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>444</span></u><span
|
||
lang=EN-US> dev =
|
||
dir->i_dev;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>445</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>446</span></u><span
|
||
lang=EN-US> if (flag & <u><span
|
||
style='color:blue'>O_EXCL</span></u>) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>447</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>448</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EEXIST</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>449</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºóÎÒÃǶÁÈ¡¸ÃĿ¼ÏîµÄ<span
|
||
lang=EN-US>i</span>½ÚµãÄÚÈÝ¡£Èô¸Ã<span lang=EN-US>i</span>½ÚµãÊÇÒ»¸öĿ¼µÄ<span lang=EN-US>i</span>½Úµã²¢ÇÒ·ÃÎÊģʽÊÇÖ»</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>д»ò¶Áд£¬»òÕßûÓзÃÎʵÄÐí¿ÉȨÏÞ£¬Ôò·Å»Ø¸Ã<span
|
||
lang=EN-US>i</span>½Úµã£¬·µ»Ø·ÃÎÊȨÏÞ³ö´íÂëÍ˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>450</span></u><span
|
||
lang=EN-US> if (!(inode = <u><span
|
||
style='color:blue'>follow_link</span></u>(dir,<u><span style='color:blue'>iget</span></u>(dev,inr))))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>451</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EACCES</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>452</span></u><span
|
||
lang=EN-US> if ((<u><span
|
||
style='color:blue'>S_ISDIR</span></u>(inode->i_mode) && (flag & <u><span
|
||
style='color:blue'>O_ACCMODE</span></u>)) ||</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>453</span></u><span
|
||
lang=EN-US>
|
||
!<u><span style='color:blue'>permission</span></u>(inode,<u><span
|
||
style='color:blue'>ACC_MODE</span></u>(flag))) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>454</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>455</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EPERM</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>456</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>½Ó×ÅÎÒÃǸüиÃ<span
|
||
lang=EN-US>i</span>½ÚµãµÄ·ÃÎÊʱ¼ä×Ö¶ÎֵΪµ±Ç°Ê±¼ä¡£Èç¹ûÉèÁ¢Á˽Ø<span lang=EN-US>0</span>±êÖ¾£¬Ôò½«¸Ã<span
|
||
lang=EN-US>i</span>½Ú</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µãµÄÎļþ³¤¶È½ØÎª<span
|
||
lang=EN-US>0</span>¡£×îºó·µ»Ø¸ÃĿ¼Ïî<span lang=EN-US>i</span>½ÚµãµÄÖ¸Õ룬²¢·µ»Ø<span lang=EN-US>0</span>£¨³É¹¦£©¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>457</span></u><span
|
||
lang=EN-US> inode->i_atime =
|
||
<u><span style='color:blue'>CURRENT_TIME</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>458</span></u><span
|
||
lang=EN-US> if (flag & <u><span
|
||
style='color:blue'>O_TRUNC</span></u>)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>459</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>truncate</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>460</span></u><span
|
||
lang=EN-US> *res_inode = inode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>461</span></u><span
|
||
lang=EN-US> return 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>462</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>463</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>´´½¨Ò»¸öÉè±¸ÌØÊâÎļþ»òÆÕͨÎļþ½Úµã£¨<span
|
||
lang=EN-US>node</span>£©¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¸Ãº¯Êý´´½¨Ãû³ÆÎª<span
|
||
lang=EN-US>filename</span>£¬ÓÉ<span lang=EN-US>mode</span>ºÍ<span lang=EN-US>dev</span>Ö¸¶¨µÄÎļþϵͳ½Úµã£¨ÆÕͨÎļþ¡¢Éè±¸ÌØÊâÎÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼þ»òÃüÃû¹ÜµÀ£©¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>filename
|
||
- </span>·¾¶Ãû£»<span lang=EN-US>mode - </span>Ö¸¶¨Ê¹ÓÃÐí¿ÉÒÔ¼°Ëù´´½¨½ÚµãµÄÀàÐÍ£»<span lang=EN-US>dev
|
||
- </span>É豸ºÅ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£º³É¹¦Ôò·µ»Ø<span
|
||
lang=EN-US>0</span>£¬·ñÔò·µ»Ø³ö´íÂë¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>464</span></u><span
|
||
lang=EN-US> int <u><span style='color:blue'>sys_mknod</span></u>(const char *
|
||
filename, int mode, int dev)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>465</span></u><span
|
||
lang=EN-US> {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>466</span></u><span
|
||
lang=EN-US> const char *
|
||
basename;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>467</span></u><span
|
||
lang=EN-US> int namelen;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>468</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>m_inode</span></u> * dir, * inode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>469</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>buffer_head</span></u> * bh;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>470</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>dir_entry</span></u> * de;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>471</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ê×Ïȼì²é²Ù×÷Ðí¿ÉºÍ²ÎÊýµÄÓÐЧÐÔ²¢È¡Â·¾¶ÃûÖж¥²ãĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£Èç¹û²»Êdz¬¼¶Óû§£¬Ôò</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø·ÃÎÊÐí¿É³ö´íÂë¡£Èç¹ûÕÒ²»µ½¶ÔӦ·¾¶ÃûÖж¥²ãĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬Ôò·µ»Ø³ö´íÂë¡£Èç¹û×î</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¶¥¶ËµÄÎļþÃû³¤¶ÈΪ<span
|
||
lang=EN-US>0</span>£¬Ôò˵Ã÷¸ø³öµÄ·¾¶Ãû×îºóûÓÐÖ¸¶¨ÎļþÃû£¬·Å»Ø¸ÃĿ¼<span lang=EN-US>i</span>½Úµã£¬·µ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>»Ø³ö´íÂëÍ˳ö¡£Èç¹ûÔÚ¸ÃĿ¼ÖÐûÓÐдµÄȨÏÞ£¬Ôò·Å»Ø¸ÃĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬·µ»Ø·ÃÎÊÐí¿É³ö´í</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÂëÍ˳ö¡£Èç¹û²»Êdz¬¼¶Óû§£¬Ôò·µ»Ø·ÃÎÊÐí¿É³ö´íÂë¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>472</span></u><span
|
||
lang=EN-US> if (!<u><span
|
||
style='color:blue'>suser</span></u>())</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>473</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EPERM</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>474</span></u><span
|
||
lang=EN-US> if (!(dir = <u><span
|
||
style='color:blue'>dir_namei</span></u>(filename,&namelen,&basename, <u><span
|
||
style='color:blue'>NULL</span></u>)))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>475</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOENT</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>476</span></u><span
|
||
lang=EN-US> if (!namelen) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>477</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>478</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOENT</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>479</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>480</span></u><span
|
||
lang=EN-US> if (!<u><span
|
||
style='color:blue'>permission</span></u>(dir,<u><span style='color:blue'>MAY_WRITE</span></u>))
|
||
{</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>481</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>482</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EPERM</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>483</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºóÎÒÃÇËÑË÷һϷ¾¶ÃûÖ¸¶¨µÄÎļþÊÇ·ñÒѾ´æÔÚ¡£ÈôÒѾ´æÔÚÔò²»ÄÜ´´½¨Í¬ÃûÎļþ½Úµã¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹û¶ÔӦ·¾¶ÃûÉÏ×îºóµÄÎļþÃûµÄĿ¼ÏîÒѾ´æÔÚ£¬ÔòÊͷŰüº¬¸ÃĿ¼ÏîµÄ»º³åÇø¿é²¢·Å»Ø</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼µÄ<span lang=EN-US>i</span>½Úµã£¬·µ»ØÎļþÒѾ´æÔڵijö´íÂëÍ˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>484</span></u><span
|
||
lang=EN-US> bh = <u><span
|
||
style='color:blue'>find_entry</span></u>(&dir,basename,namelen,&de);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>485</span></u><span
|
||
lang=EN-US> if (bh) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>486</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>487</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>488</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EEXIST</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>489</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·ñÔòÎÒÃǾÍÉêÇëÒ»¸öеÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬²¢ÉèÖøÃ<span lang=EN-US>i</span>½ÚµãµÄÊôÐÔģʽ¡£Èç¹ûÒª´´½¨µÄÊÇ¿éÉ豸Îļþ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>»òÕßÊÇ×Ö·ûÉ豸Îļþ£¬ÔòÁî<span
|
||
lang=EN-US>i</span>½ÚµãµÄÖ±½ÓÂß¼¿éÖ¸Õë<span lang=EN-US>0</span>µÈÓÚÉ豸ºÅ¡£¼´¶ÔÓÚÉ豸ÎļþÀ´Ëµ£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Æä<span lang=EN-US>i</span>½ÚµãµÄ<span
|
||
lang=EN-US>i_zone[0]</span>Öдæ·ÅµÄÊǸÃÉ豸ÎļþËù¶¨ÒåÉ豸µÄÉ豸ºÅ¡£È»ºóÉèÖøÃ<span lang=EN-US>i</span>½ÚµãµÄÐÞ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¸Äʱ¼ä¡¢·ÃÎÊʱ¼äΪµ±Ç°Ê±¼ä£¬²¢ÉèÖÃ<span
|
||
lang=EN-US>i</span>½ÚµãÒÑÐ޸ıêÖ¾¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>490</span></u><span
|
||
lang=EN-US> inode = <u><span
|
||
style='color:blue'>new_inode</span></u>(dir->i_dev);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>491</span></u><span
|
||
lang=EN-US> if (!inode) {
|
||
// </span>Èô²»³É¹¦Ôò·Å»ØÄ¿Â¼<span lang=EN-US>i</span>½Úµã£¬·µ»ØÎÞ¿Õ¼ä³ö´íÂëÍ˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>492</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>493</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOSPC</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>494</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>495</span></u><span
|
||
lang=EN-US> inode->i_mode =
|
||
mode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>496</span></u><span
|
||
lang=EN-US> if (<u><span
|
||
style='color:blue'>S_ISBLK</span></u>(mode) || <u><span style='color:blue'>S_ISCHR</span></u>(mode))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>497</span></u><span
|
||
lang=EN-US>
|
||
inode->i_zone[0] = dev;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>498</span></u><span
|
||
lang=EN-US> inode->i_mtime =
|
||
inode->i_atime = <u><span style='color:blue'>CURRENT_TIME</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>499</span></u><span
|
||
lang=EN-US> inode->i_dirt =
|
||
1;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>½Ó×ÅΪÕâ¸öеÄ<span
|
||
lang=EN-US>i</span>½ÚµãÔÚĿ¼ÖÐÐÂÌí¼ÓÒ»¸öĿ¼Ïî¡£Èç¹ûʧ°Ü£¨°üº¬¸ÃĿ¼ÏîµÄ¸ßËÙ»º³å</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¿éÖ¸ÕëΪ<span lang=EN-US>NULL</span>£©£¬Ôò·Å»ØÄ¿Â¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã£»°ÑËùÉêÇëµÄ<span lang=EN-US>i</span>½ÚµãÒýÓÃÁ¬½Ó¼ÆÊý¸´Î»£¬²¢·Å»Ø¸Ã</p>
|
||
|
||
<p class=a><span lang=EN-US> // i</span>½Úµã£¬·µ»Ø³ö´íÂëÍ˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>500</span></u><span
|
||
lang=EN-US> bh = <u><span
|
||
style='color:blue'>add_entry</span></u>(dir,basename,namelen,&de);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>501</span></u><span
|
||
lang=EN-US> if (!bh) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>502</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>503</span></u><span
|
||
lang=EN-US>
|
||
inode->i_nlinks=0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>504</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>505</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOSPC</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>506</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÏÖÔÚÌí¼ÓĿ¼Ïî²Ù×÷Ò²³É¹¦ÁË£¬ÓÚÊÇÎÒÃÇÀ´ÉèÖÃÕâ¸öĿ¼ÏîÄÚÈÝ¡£Áî¸ÃĿ¼ÏîµÄ<span
|
||
lang=EN-US>i</span>½Úµã×Ö</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¶ÎµÈÓÚÐÂ<span lang=EN-US>i</span>½ÚµãºÅ£¬²¢ÖøßËÙ»º³åÇøÒÑÐ޸ıêÖ¾£¬·Å»ØÄ¿Â¼ºÍеÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬ÊͷŸßËÙ»º³å</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Çø£¬×îºó·µ»Ø<span
|
||
lang=EN-US>0(</span>³É¹¦<span lang=EN-US>)</span>¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>507</span></u><span
|
||
lang=EN-US> de->inode =
|
||
inode->i_num;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>508</span></u><span
|
||
lang=EN-US> bh->b_dirt = 1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>509</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>510</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>511</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>512</span></u><span
|
||
lang=EN-US> return 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>513</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>514</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>´´½¨Ò»¸öĿ¼¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>pathname
|
||
- </span>·¾¶Ãû£»<span lang=EN-US>mode - </span>Ŀ¼ʹÓõÄȨÏÞÊôÐÔ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£º³É¹¦Ôò·µ»Ø<span
|
||
lang=EN-US>0</span>£¬·ñÔò·µ»Ø³ö´íÂë¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>515</span></u><span
|
||
lang=EN-US> int <u><span style='color:blue'>sys_mkdir</span></u>(const char *
|
||
pathname, int mode)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>516</span></u><span
|
||
lang=EN-US> {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>517</span></u><span
|
||
lang=EN-US> const char *
|
||
basename;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>518</span></u><span
|
||
lang=EN-US> int namelen;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>519</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>m_inode</span></u> * dir, * inode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>520</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>buffer_head</span></u> * bh, *dir_block;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>521</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>dir_entry</span></u> * de;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>522</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ê×Ïȼì²é²ÎÊýµÄÓÐЧÐÔ²¢È¡Â·¾¶ÃûÖж¥²ãĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£Èç¹ûÕÒ²»µ½¶ÔӦ·¾¶ÃûÖж¥²ãĿ¼</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÄ<span lang=EN-US>i</span>½Úµã£¬Ôò·µ»Ø³ö´íÂë¡£Èç¹û×î¶¥¶ËµÄÎļþÃû³¤¶ÈΪ<span
|
||
lang=EN-US>0</span>£¬Ôò˵Ã÷¸ø³öµÄ·¾¶Ãû×îºóûÓÐÖ¸</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¶¨ÎļþÃû£¬·Å»Ø¸ÃĿ¼<span
|
||
lang=EN-US>i</span>½Úµã£¬·µ»Ø³ö´íÂëÍ˳ö¡£Èç¹ûÔÚ¸ÃĿ¼ÖÐûÓÐдµÄȨÏÞ£¬Ôò·Å»Ø¸Ã</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼µÄ<span lang=EN-US>i</span>½Úµã£¬·µ»Ø·ÃÎÊÐí¿É³ö´íÂëÍ˳ö¡£Èç¹û²»Êdz¬¼¶Óû§£¬Ôò·µ»Ø·ÃÎÊÐí¿É³ö´íÂë¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>523</span></u><span
|
||
lang=EN-US> if (!(dir = <u><span
|
||
style='color:blue'>dir_namei</span></u>(pathname,&namelen,&basename, <u><span
|
||
style='color:blue'>NULL</span></u>)))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>524</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOENT</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>525</span></u><span
|
||
lang=EN-US> if (!namelen) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>526</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>527</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOENT</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>528</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>529</span></u><span
|
||
lang=EN-US> if (!<u><span
|
||
style='color:blue'>permission</span></u>(dir,<u><span style='color:blue'>MAY_WRITE</span></u>))
|
||
{</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>530</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>531</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EPERM</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>532</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºóÎÒÃÇËÑË÷һϷ¾¶ÃûÖ¸¶¨µÄĿ¼ÃûÊÇ·ñÒѾ´æÔÚ¡£ÈôÒѾ´æÔÚÔò²»ÄÜ´´½¨Í¬ÃûĿ¼½Úµã¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹û¶ÔӦ·¾¶ÃûÉÏ×îºóµÄĿ¼ÃûµÄĿ¼ÏîÒѾ´æÔÚ£¬ÔòÊͷŰüº¬¸ÃĿ¼ÏîµÄ»º³åÇø¿é²¢·Å»Ø</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼µÄ<span lang=EN-US>i</span>½Úµã£¬·µ»ØÎļþÒѾ´æÔڵijö´íÂëÍ˳ö¡£·ñÔòÎÒÃǾÍÉêÇëÒ»¸öеÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬²¢ÉèÖÃ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¸Ã<span lang=EN-US>i</span>½ÚµãµÄÊôÐÔģʽ£ºÖøÃÐÂ<span
|
||
lang=EN-US>i</span>½Úµã¶ÔÓ¦µÄÎļþ³¤¶ÈΪ<span lang=EN-US>32</span>×Ö½Ú £¨<span lang=EN-US>2</span>¸öĿ¼ÏîµÄ´óС£©¡¢ÖÃ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>½ÚµãÒÑÐ޸ıêÖ¾£¬ÒÔ¼°½ÚµãµÄÐÞ¸Äʱ¼äºÍ·ÃÎÊʱ¼ä¡£<span
|
||
lang=EN-US>2</span>¸öĿ¼Ïî·Ö±ðÓÃÓÚ<span lang=EN-US>'.'</span>ºÍ<span lang=EN-US>'..'</span>Ŀ¼¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>533</span></u><span
|
||
lang=EN-US> bh = <u><span
|
||
style='color:blue'>find_entry</span></u>(&dir,basename,namelen,&de);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>534</span></u><span
|
||
lang=EN-US> if (bh) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>535</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>536</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>537</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EEXIST</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>538</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>539</span></u><span
|
||
lang=EN-US> inode = <u><span
|
||
style='color:blue'>new_inode</span></u>(dir->i_dev);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>540</span></u><span
|
||
lang=EN-US> if (!inode) {
|
||
// </span>Èô²»³É¹¦Ôò·Å»ØÄ¿Â¼µÄ<span lang=EN-US>i</span>½Úµã£¬·µ»ØÎÞ¿Õ¼ä³ö´íÂë¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>541</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>542</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOSPC</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>543</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>544</span></u><span
|
||
lang=EN-US> inode->i_size =
|
||
32;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>545</span></u><span
|
||
lang=EN-US> inode->i_dirt =
|
||
1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>546</span></u><span
|
||
lang=EN-US> inode->i_mtime =
|
||
inode->i_atime = <u><span style='color:blue'>CURRENT_TIME</span></u>;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>½Ó×ÅΪ¸ÃÐÂ<span lang=EN-US>i</span>½ÚµãÉêÇëÒ»ÓÃÓÚ±£´æÄ¿Â¼ÏîÊý¾ÝµÄ´ÅÅ̿飬²¢Áî<span
|
||
lang=EN-US>i</span>½ÚµãµÄµÚÒ»¸öÖ±½Ó¿éÖ¸ÕëµÈ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÓڸÿéºÅ¡£Èç¹ûÉêÇëʧ°ÜÔò·Å»Ø¶ÔӦĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã£»¸´Î»ÐÂÉêÇëµÄ<span lang=EN-US>i</span>½ÚµãÁ¬½Ó¼ÆÊý£»·Å»Ø¸Ã</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>еÄ<span lang=EN-US>i</span>½Úµã£¬·µ»ØÃ»Óпռä³ö´íÂëÍ˳ö¡£·ñÔòÖøÃеÄ<span
|
||
lang=EN-US>i</span>½ÚµãÒÑÐ޸ıêÖ¾¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>547</span></u><span
|
||
lang=EN-US> if
|
||
(!(inode->i_zone[0]=<u><span style='color:blue'>new_block</span></u>(inode->i_dev)))
|
||
{</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>548</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>549</span></u><span
|
||
lang=EN-US>
|
||
inode->i_nlinks--;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>550</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>551</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOSPC</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>552</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>553</span></u><span
|
||
lang=EN-US> inode->i_dirt =
|
||
1;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>´ÓÉ豸É϶ÁÈ¡ÐÂÉêÇëµÄ´ÅÅ̿飨ĿµÄÊǰѶÔÓ¦¿é·Åµ½¸ßËÙ»º³åÇøÖУ©¡£Èô³ö´í£¬Ôò·Å»Ø¶ÔÓ¦</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼µÄ<span lang=EN-US>i</span>½Úµã£»ÊÍ·ÅÉêÇëµÄ´ÅÅ̿飻¸´Î»ÐÂÉêÇëµÄ<span
|
||
lang=EN-US>i</span>½ÚµãÁ¬½Ó¼ÆÊý£»·Å»Ø¸ÃеÄ<span lang=EN-US>i</span>½Úµã£¬·µ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>»ØÃ»Óпռä³ö´íÂëÍ˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>554</span></u><span
|
||
lang=EN-US> if (!(dir_block=<u><span
|
||
style='color:blue'>bread</span></u>(inode->i_dev,inode->i_zone[0]))) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>555</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>556</span></u><span
|
||
lang=EN-US>
|
||
inode->i_nlinks--;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>557</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>558</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ERROR</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>559</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºóÎÒÃÇÔÚ»º³å¿éÖн¨Á¢ÆðËù´´½¨Ä¿Â¼ÎļþÖеÄ<span
|
||
lang=EN-US>2</span>¸öĬÈϵÄÐÂĿ¼Ï<span lang=EN-US>'.'</span>ºÍ<span lang=EN-US>'..'</span>£©½á¹¹Êý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¾Ý¡£Ê×ÏÈÁî<span lang=EN-US>de</span>Ö¸Ïò´æ·ÅĿ¼ÏîµÄÊý¾Ý¿é£¬È»ºóÖøÃĿ¼ÏîµÄ<span
|
||
lang=EN-US>i</span>½ÚµãºÅ×ֶεÈÓÚÐÂÉêÇëµÄ<span lang=EN-US>i</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>½ÚµãºÅ£¬Ãû×Ö×ֶεÈÓÚ<span
|
||
lang=EN-US>"."</span>¡£ È»ºó<span lang=EN-US>de</span>Ö¸ÏòÏÂÒ»¸öĿ¼Ïî½á¹¹£¬²¢ÔڸýṹÖдæ·ÅÉϼ¶Ä¿Â¼</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÄ <span lang=EN-US>i</span>½ÚµãºÅºÍÃû×Ö<span
|
||
lang=EN-US>".."</span>¡£È»ºóÉèÖøøßËÙ»º³å¿éÒÑÐ޸ıêÖ¾£¬²¢ÊͷŸûº³å¿é¡£ÔÙ³õʼ»¯</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÉèÖÃÐÂ<span lang=EN-US>i</span>½ÚµãµÄģʽ×ֶΣ¬²¢ÖøÃ<span
|
||
lang=EN-US>i</span>½ÚµãÒÑÐ޸ıêÖ¾¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>560</span></u><span
|
||
lang=EN-US> de = (struct <u><span
|
||
style='color:blue'>dir_entry</span></u> *) dir_block->b_data;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>561</span></u><span
|
||
lang=EN-US>
|
||
de->inode=inode->i_num; //
|
||
</span>ÉèÖÃ<span lang=EN-US>'.'</span>Ŀ¼Ïî¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>562</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>strcpy</span></u>(de->name,<i>"."</i>);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>563</span></u><span
|
||
lang=EN-US> de++;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>564</span></u><span
|
||
lang=EN-US> de->inode =
|
||
dir->i_num;
|
||
// </span>ÉèÖÃ<span lang=EN-US>'..'</span>Ŀ¼Ïî¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>565</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>strcpy</span></u>(de->name,<i>".."</i>);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>566</span></u><span
|
||
lang=EN-US> inode->i_nlinks
|
||
= 2;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>567</span></u><span
|
||
lang=EN-US>
|
||
dir_block->b_dirt = 1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>568</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>brelse</span></u>(dir_block);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>569</span></u><span
|
||
lang=EN-US> inode->i_mode = <u><span
|
||
style='color:blue'>I_DIRECTORY</span></u> | (mode & 0777 &
|
||
~current-><u><span style='color:blue'>umask</span></u>);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>570</span></u><span
|
||
lang=EN-US> inode->i_dirt =
|
||
1;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÏÖÔÚÎÒÃÇÔÚÖ¸¶¨Ä¿Â¼ÖÐÐÂÌí¼ÓÒ»¸öĿ¼ÏÓÃÓÚ´æ·Åн¨Ä¿Â¼µÄ<span
|
||
lang=EN-US>i</span>½ÚµãºÍĿ¼Ãû¡£Èç¹ûʧ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>°Ü£¨°üº¬¸ÃĿ¼ÏîµÄ¸ßËÙ»º³åÇøÖ¸ÕëΪ<span
|
||
lang=EN-US>NULL</span>£©£¬Ôò·Å»ØÄ¿Â¼µÄ<span lang=EN-US>i</span>½Úµã£»ËùÉêÇëµÄ<span lang=EN-US>i</span>½ÚµãÒý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÓÃÁ¬½Ó¼ÆÊý¸´Î»£¬²¢·Å»Ø¸Ã<span
|
||
lang=EN-US>i</span>½Úµã¡£·µ»Ø³ö´íÂëÍ˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>571</span></u><span
|
||
lang=EN-US> bh = <u><span
|
||
style='color:blue'>add_entry</span></u>(dir,basename,namelen,&de);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>572</span></u><span
|
||
lang=EN-US> if (!bh) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>573</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>574</span></u><span
|
||
lang=EN-US>
|
||
inode->i_nlinks=0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>575</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>576</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOSPC</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>577</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>×îºóÁî¸ÃÐÂĿ¼ÏîµÄ<span
|
||
lang=EN-US>i</span>½Úµã×ֶεÈÓÚÐÂ<span lang=EN-US>i</span>½ÚµãºÅ£¬²¢ÖøßËÙ»º³å¿éÒÑÐ޸ıêÖ¾£¬·Å»ØÄ¿Â¼</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ºÍеÄ<span lang=EN-US>i</span>½Úµã£¬ÊͷŸßËÙ»º³åÇø£¬×îºó·µ»Ø<span
|
||
lang=EN-US>0</span>£¨³É¹¦£©¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>578</span></u><span
|
||
lang=EN-US> de->inode =
|
||
inode->i_num;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>579</span></u><span
|
||
lang=EN-US> bh->b_dirt = 1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>580</span></u><span
|
||
lang=EN-US> dir->i_nlinks++;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>581</span></u><span
|
||
lang=EN-US> dir->i_dirt = 1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>582</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>583</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>584</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>585</span></u><span
|
||
lang=EN-US> return 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>586</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>587</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>588</span></u><span
|
||
lang=EN-US> <b><i>/*</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>589</span></u><span
|
||
lang=EN-US> <b><i> * routine to check that the specified directory is
|
||
empty (for rmdir)</i></b></span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>590</span></u><span
|
||
lang=EN-US> <b><i> */</i></b></span></p>
|
||
|
||
<p class=a><span lang=EN-US> /*</span></p>
|
||
|
||
<p class=a><span lang=EN-US> * </span>ÓÃÓÚ¼ì²éÖ¸¶¨µÄĿ¼ÊÇ·ñΪ¿ÕµÄ×Ó³ÌÐò£¨ÓÃÓÚ<span
|
||
lang=EN-US>rmdir</span>ϵͳµ÷Óã©¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> */</span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>¼ì²éÖ¸¶¨Ä¿Â¼ÊÇ·ñ¿Õ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>inode
|
||
- </span>Ö¸¶¨Ä¿Â¼µÄ<span lang=EN-US>i</span>½ÚµãÖ¸Õë¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£º<span lang=EN-US>1 ¨C
|
||
</span>Ŀ¼ÖÐÊǿյģ»<span lang=EN-US>0 - </span>²»¿Õ¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>591</span></u><span
|
||
lang=EN-US> static int <u><span style='color:blue'>empty_dir</span></u>(struct <u><span
|
||
style='color:blue'>m_inode</span></u> * inode)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>592</span></u><span
|
||
lang=EN-US> {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>593</span></u><span
|
||
lang=EN-US> int nr,block;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>594</span></u><span
|
||
lang=EN-US> int len;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>595</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>buffer_head</span></u> * bh;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>596</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>dir_entry</span></u> * de;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>597</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ê×ÏȼÆËãÖ¸¶¨Ä¿Â¼ÖÐÏÖÓÐĿ¼Ïî¸öÊý²¢¼ì²é¿ªÊ¼Á½¸öÌØ¶¨Ä¿Â¼ÏîÖÐÐÅÏ¢ÊÇ·ñÕýÈ·¡£Ò»¸öĿ¼</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÖÐÓ¦¸ÃÆðÂëÓÐ<span
|
||
lang=EN-US>2</span>¸öĿ¼Ï¼´<span lang=EN-US>"."</span>ºÍ<span
|
||
lang=EN-US>".."</span>¡£ Èç¹ûĿ¼Ïî¸öÊýÉÙÓÚ<span lang=EN-US>2</span>¸ö»òÕ߸ÃĿ¼<span
|
||
lang=EN-US>i</span>½ÚµãµÄµÚ</p>
|
||
|
||
<p class=a><span lang=EN-US> // 1</span>¸öÖ±½Ó¿éûÓÐÖ¸ÏòÈκδÅÅÌ¿éºÅ£¬»òÕ߸ÃÖ±½Ó¿é¶Á²»³ö£¬ÔòÏÔʾ¾¯¸æÐÅÏ¢¡°É豸<span
|
||
lang=EN-US>dev </span>ÉÏÄ¿</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼´í¡±£¬·µ»Ø<span
|
||
lang=EN-US>0(</span>ʧ°Ü<span lang=EN-US>)</span>¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>598</span></u><span
|
||
lang=EN-US> len =
|
||
inode->i_size / sizeof (struct <u><span style='color:blue'>dir_entry</span></u>);
|
||
// </span>Ŀ¼ÖÐĿ¼Ïî¸öÊý¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>599</span></u><span
|
||
lang=EN-US> if (len<2 ||
|
||
!inode->i_zone[0] ||</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>600</span></u><span
|
||
lang=EN-US>
|
||
!(bh=<u><span style='color:blue'>bread</span></u>(inode->i_dev,inode->i_zone[0])))
|
||
{</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>601</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>printk</span></u>(<i>"warning - bad directory
|
||
on dev %04x\n"</i>,inode->i_dev);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>602</span></u><span
|
||
lang=EN-US>
|
||
return 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>603</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>´Ëʱ<span lang=EN-US>bh</span>ËùÖ¸»º³å¿éÖк¬ÓÐĿ¼ÏîÊý¾Ý¡£ÎÒÃÇÈÃĿ¼ÏîÖ¸Õë<span
|
||
lang=EN-US>de</span>Ö¸Ïò»º³å¿éÖеÚ<span lang=EN-US>1</span>¸öĿ¼Ïî¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¶ÔÓÚµÚ<span lang=EN-US>1</span>¸öĿ¼Ï<span
|
||
lang=EN-US>"."</span>£©£¬ËüµÄ<span lang=EN-US>i</span>½ÚµãºÅ×Ö¶Î<span
|
||
lang=EN-US>inode</span>Ó¦¸ÃµÈÓÚµ±Ç°Ä¿Â¼µÄ<span lang=EN-US>i</span>½ÚµãºÅ¡£¶ÔÓÚ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÚ<span lang=EN-US>2</span>¸öĿ¼Ï<span
|
||
lang=EN-US>".."</span>£©£¬ËüµÄ<span lang=EN-US>i</span>½ÚµãºÅ×Ö¶Î<span
|
||
lang=EN-US> inode </span>Ó¦¸ÃµÈÓÚÉÏÒ»²ãĿ¼µÄ<span lang=EN-US>i</span>½ÚµãºÅ£¬²»»á</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ϊ<span lang=EN-US>0</span>¡£Òò´ËÈç¹ûµÚ<span
|
||
lang=EN-US>1</span>¸öĿ¼ÏîµÄ<span lang=EN-US>i</span>½ÚµãºÅ×Ö¶ÎÖµ²»µÈÓÚ¸ÃĿ¼µÄ<span lang=EN-US>i</span>½ÚµãºÅ£¬»òÕßµÚ<span
|
||
lang=EN-US>2</span>¸öĿ¼</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÏîµÄ<span lang=EN-US>i</span>½ÚµãºÅ×Ö¶ÎΪÁ㣬»òÕßÁ½¸öĿ¼ÏîµÄÃû×Ö×ֶβ»·Ö±ðµÈÓÚ<span
|
||
lang=EN-US>"."</span>ºÍ<span lang=EN-US>".."</span>£¬ÔòÏÔʾ³ö´í¾¯</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¸æÐÅÏ¢¡°É豸<span
|
||
lang=EN-US>dev</span>ÉÏĿ¼´í¡±£¬²¢·µ»Ø<span lang=EN-US>0</span>¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>604</span></u><span
|
||
lang=EN-US> de = (struct <u><span
|
||
style='color:blue'>dir_entry</span></u> *) bh->b_data;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>605</span></u><span
|
||
lang=EN-US> if (de[0].inode !=
|
||
inode->i_num || !de[1].inode || </span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>606</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>strcmp</span></u>(<i>"."</i>,de[0].name)
|
||
|| <u><span style='color:blue'>strcmp</span></u>(<i>".."</i>,de[1].name))
|
||
{</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>607</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>printk</span></u>(<i>"warning - bad directory
|
||
on dev %04x\n"</i>,inode->i_dev);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>608</span></u><span
|
||
lang=EN-US>
|
||
return 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>609</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºóÎÒÃÇÁî<span lang=EN-US>nr</span>µÈÓÚĿ¼ÏîÐòºÅ£¨´Ó<span
|
||
lang=EN-US>0</span>¿ªÊ¼¼Æ£©£»<span lang=EN-US>de</span>Ö¸ÏòµÚÈý¸öĿ¼Ïî¡£²¢Ñ»·¼ì²â¸ÃĿ¼</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÖÐÆäÓàËùÓеģ¨<span
|
||
lang=EN-US>len - 2</span>£©¸öĿ¼Ï¿´ÓÐûÓÐĿ¼ÏîµÄ<span lang=EN-US>i</span>½ÚµãºÅ×ֶβ»Îª<span
|
||
lang=EN-US>0</span>£¨±»Ê¹Óã©¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>610</span></u><span
|
||
lang=EN-US> nr = 2;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>611</span></u><span
|
||
lang=EN-US> de += 2;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>612</span></u><span
|
||
lang=EN-US> while (nr<len) {</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹û¸Ã¿é´ÅÅÌ¿éÖеÄĿ¼ÏîÒѾȫ²¿¼ì²âÍê±Ï£¬ÔòÊͷŸôÅÅÌ¿éµÄ»º³å¿é£¬²¢¶ÁȡĿ¼Êý¾Ý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÎļþÖÐÏÂÒ»¿éº¬ÓÐĿ¼ÏîµÄ´ÅÅ̿顣¶ÁÈ¡µÄ·½·¨ÊǸù¾Ýµ±Ç°¼ì²âµÄĿ¼ÏîÐòºÅ<span
|
||
lang=EN-US> nr </span>¼ÆËã³ö¶Ô</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ӦĿ¼ÏîÔÚĿ¼Êý¾ÝÎļþÖеÄÊý¾Ý¿éºÅ£¨<span
|
||
lang=EN-US>nr/DIR_ENTRIES_PER_BLOCK</span>£©£¬È»ºóʹÓÃ<span lang=EN-US> bmap()</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>º¯ÊýÈ¡µÃ¶ÔÓ¦µÄÅÌ¿éºÅ<span
|
||
lang=EN-US> block</span>£¬ÔÙʹÓöÁÉ豸Å̿麯Êý<span lang=EN-US>bread() </span>°ÑÏàÓ¦ÅÌ¿é¶ÁÈ뻺³å¿éÖУ¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²¢·µ»Ø¸Ã»º³å¿éµÄÖ¸Õë¡£ÈôËù¶ÁÈ¡µÄÏàÓ¦ÅÌ¿éûÓÐʹÓ㨻òÒѾ²»Óã¬ÈçÎļþÒѾɾ³ýµÈ£©£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ôò¼ÌÐø¶ÁÏÂÒ»¿é£¬Èô¶Á²»³ö£¬Ôò³ö´í·µ»Ø<span
|
||
lang=EN-US>0</span>¡£·ñÔòÈÃ<span lang=EN-US>de</span>Ö¸Ïò¶Á³ö¿éµÄÊ׸öĿ¼Ïî¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>613</span></u><span
|
||
lang=EN-US>
|
||
if ((void *) de >= (void *) (bh->b_data+<u><span style='color:blue'>BLOCK_SIZE</span></u>))
|
||
{</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>614</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>615</span></u><span
|
||
lang=EN-US> block=<u><span
|
||
style='color:blue'>bmap</span></u>(inode,nr/<u><span style='color:blue'>DIR_ENTRIES_PER_BLOCK</span></u>);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>616</span></u><span
|
||
lang=EN-US>
|
||
if (!block) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>617</span></u><span
|
||
lang=EN-US>
|
||
nr += <u><span style='color:blue'>DIR_ENTRIES_PER_BLOCK</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>618</span></u><span
|
||
lang=EN-US>
|
||
continue;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>619</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>620</span></u><span
|
||
lang=EN-US>
|
||
if (!(bh=<u><span style='color:blue'>bread</span></u>(inode->i_dev,block)))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>621</span></u><span
|
||
lang=EN-US>
|
||
return 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>622</span></u><span
|
||
lang=EN-US>
|
||
de = (struct <u><span style='color:blue'>dir_entry</span></u> *) bh->b_data;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>623</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¶ÔÓÚ<span lang=EN-US>de</span>Ö¸ÏòµÄµ±Ç°Ä¿Â¼ÏÈç¹û¸ÃĿ¼ÏîµÄ<span
|
||
lang=EN-US>i</span>½ÚµãºÅ×ֶβ»µÈÓÚ<span lang=EN-US>0</span>£¬Ôò±íʾ¸ÃĿ¼ÏîĿǰÕý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>±»Ê¹Óã¬ÔòÊͷŸøßËÙ»º³åÇø£¬·µ»Ø<span
|
||
lang=EN-US>0</span>Í˳ö¡£·ñÔò£¬Èô»¹Ã»ÓвéѯÍê¸ÃĿ¼ÖеÄËùÓÐĿ¼Ï</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ôò°ÑĿ¼ÏîÐòºÅ<span
|
||
lang=EN-US>nr</span>Ôö<span lang=EN-US>1</span>¡¢<span lang=EN-US>de</span>Ö¸ÏòÏÂÒ»¸öĿ¼Ï¼ÌÐø¼ì²â¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>624</span></u><span
|
||
lang=EN-US>
|
||
if (de->inode) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>625</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>626</span></u><span
|
||
lang=EN-US>
|
||
return 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>627</span></u><span
|
||
lang=EN-US>
|
||
}</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>628</span></u><span
|
||
lang=EN-US>
|
||
de++;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>629</span></u><span
|
||
lang=EN-US>
|
||
nr++;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>630</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ö´Ðе½ÕâÀï˵Ã÷¸ÃĿ¼ÖÐûÓÐÕÒµ½ÒÑÓõÄĿ¼Ïî<span
|
||
lang=EN-US>(</span>µ±È»³ýÁËÍ·Á½¸öÒÔÍâ<span lang=EN-US>)</span>£¬ÔòÊÍ·Å»º³å¿é·µ»Ø<span lang=EN-US>1</span>¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>631</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><a name=L632><u><span lang=EN-US style='color:blue'>632</span></u></a><span
|
||
lang=EN-US> return 1;</span></p>
|
||
|
||
<p class=a><a name=L633><u><span lang=EN-US style='color:blue'>633</span></u></a><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><a name=L634><u><span lang=EN-US style='color:blue'>634</span></u></a><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>ɾ³ýĿ¼¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º <span lang=EN-US>name
|
||
- </span>Ŀ¼Ãû£¨Â·¾¶Ãû£©¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£º·µ»Ø<span lang=EN-US>0</span>±íʾ³É¹¦£¬·ñÔò·µ»Ø³ö´íºÅ¡£</p>
|
||
|
||
<p class=a><a name=L635><u><span lang=EN-US style='color:blue'>635</span></u></a><span
|
||
lang=EN-US> int <u><span style='color:blue'>sys_rmdir</span></u>(const char *
|
||
name)</span></p>
|
||
|
||
<p class=a><a name=L636><u><span lang=EN-US style='color:blue'>636</span></u></a><span
|
||
lang=EN-US> {</span></p>
|
||
|
||
<p class=a><a name=L637><u><span lang=EN-US style='color:blue'>637</span></u></a><span
|
||
lang=EN-US> const char *
|
||
basename;</span></p>
|
||
|
||
<p class=a><a name=L638><u><span lang=EN-US style='color:blue'>638</span></u></a><span
|
||
lang=EN-US> int namelen;</span></p>
|
||
|
||
<p class=a><a name=L639><u><span lang=EN-US style='color:blue'>639</span></u></a><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>m_inode</span></u> * dir, * inode;</span></p>
|
||
|
||
<p class=a><a name=L640><u><span lang=EN-US style='color:blue'>640</span></u></a><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>buffer_head</span></u> * bh;</span></p>
|
||
|
||
<p class=a><a name=L641><u><span lang=EN-US style='color:blue'>641</span></u></a><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>dir_entry</span></u> * de;</span></p>
|
||
|
||
<p class=a><a name=L642><u><span lang=EN-US style='color:blue'>642</span></u></a><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ê×Ïȼì²é²ÎÊýµÄÓÐЧÐÔ²¢È¡Â·¾¶ÃûÖж¥²ãĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£Èç¹ûÕÒ²»µ½¶ÔӦ·¾¶ÃûÖж¥²ãĿ¼</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÄ<span lang=EN-US>i</span>½Úµã£¬Ôò·µ»Ø³ö´íÂë¡£Èç¹û×î¶¥¶ËµÄÎļþÃû³¤¶ÈΪ<span
|
||
lang=EN-US>0</span>£¬Ôò˵Ã÷¸ø³öµÄ·¾¶Ãû×îºóûÓÐÖ¸</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¶¨ÎļþÃû£¬·Å»Ø¸ÃĿ¼<span
|
||
lang=EN-US>i</span>½Úµã£¬·µ»Ø³ö´íÂëÍ˳ö¡£Èç¹ûÔÚ¸ÃĿ¼ÖÐûÓÐдµÄȨÏÞ£¬Ôò·Å»Ø¸Ã</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼µÄ<span lang=EN-US>i</span>½Úµã£¬·µ»Ø·ÃÎÊÐí¿É³ö´íÂëÍ˳ö¡£Èç¹û²»Êdz¬¼¶Óû§£¬Ôò·µ»Ø·ÃÎÊÐí¿É³ö´íÂë¡£</p>
|
||
|
||
<p class=a><a name=L643><u><span lang=EN-US style='color:blue'>643</span></u></a><span
|
||
lang=EN-US> if (!(dir = <u><span
|
||
style='color:blue'>dir_namei</span></u>(name,&namelen,&basename, <u><span
|
||
style='color:blue'>NULL</span></u>)))</span></p>
|
||
|
||
<p class=a><a name=L644><u><span lang=EN-US style='color:blue'>644</span></u></a><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOENT</span></u>;</span></p>
|
||
|
||
<p class=a><a name=L645><u><span lang=EN-US style='color:blue'>645</span></u></a><span
|
||
lang=EN-US> if (!namelen) {</span></p>
|
||
|
||
<p class=a><a name=L646><u><span lang=EN-US style='color:blue'>646</span></u></a><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><a name=L647><u><span lang=EN-US style='color:blue'>647</span></u></a><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOENT</span></u>;</span></p>
|
||
|
||
<p class=a><a name=L648><u><span lang=EN-US style='color:blue'>648</span></u></a><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><a name=L649><u><span lang=EN-US style='color:blue'>649</span></u></a><span
|
||
lang=EN-US> if (!<u><span
|
||
style='color:blue'>permission</span></u>(dir,<u><span style='color:blue'>MAY_WRITE</span></u>))
|
||
{</span></p>
|
||
|
||
<p class=a><a name=L650><u><span lang=EN-US style='color:blue'>650</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><a name=L651><u><span lang=EN-US style='color:blue'>651</span></u></a><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EPERM</span></u>;</span></p>
|
||
|
||
<p class=a><a name=L652><u><span lang=EN-US style='color:blue'>652</span></u></a><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºó¸ù¾ÝÖ¸¶¨Ä¿Â¼µÄ<span
|
||
lang=EN-US>i</span>½ÚµãºÍĿ¼ÃûÀûÓú¯Êý<span lang=EN-US>find_entry()</span>ѰÕÒ¶ÔӦĿ¼Ï²¢·µ»Ø°üº¬¸Ã</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼ÏîµÄ»º³å¿éÖ¸Õë<span
|
||
lang=EN-US>bh</span>¡¢°üº¬¸ÃĿ¼ÏîµÄĿ¼µÄ<span lang=EN-US>i</span>½ÚµãÖ¸Õë<span lang=EN-US>dir</span>ºÍ¸ÃĿ¼ÏîÖ¸Õë<span
|
||
lang=EN-US>de</span>¡£ÔÙ¸ù¾Ý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¸ÃĿ¼Ïî<span lang=EN-US>de
|
||
</span>ÖеÄ<span lang=EN-US>i</span>½ÚµãºÅÀûÓÃ<span lang=EN-US> iget()</span>º¯ÊýµÃµ½¶ÔÓ¦µÄ<span
|
||
lang=EN-US>i</span>½Úµã<span lang=EN-US> inode</span>¡£Èç¹û¶ÔӦ·¾¶ÃûÉÏ×î</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ºóĿ¼ÃûµÄĿ¼Ïî²»´æÔÚ£¬ÔòÊͷŰüº¬¸ÃĿ¼ÏîµÄ¸ßËÙ»º³åÇø£¬·Å»ØÄ¿Â¼µÄ
|
||
<span lang=EN-US>i</span>½Úµã£¬·µ»ØÎÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼þÒѾ´æÔÚ³ö´íÂ룬²¢Í˳ö¡£Èç¹ûȡĿ¼ÏîµÄ<span
|
||
lang=EN-US>i</span>½Úµã³ö´í£¬Ôò·Å»ØÄ¿Â¼µÄ <span lang=EN-US>i</span>½Úµã£¬²¢Êͷź¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÓÐĿ¼ÏîµÄ¸ßËÙ»º³åÇø£¬·µ»Ø³ö´íºÅ¡£</p>
|
||
|
||
<p class=a><a name=L653><u><span lang=EN-US style='color:blue'>653</span></u></a><span
|
||
lang=EN-US> bh = <u><span
|
||
style='color:blue'>find_entry</span></u>(&dir,basename,namelen,&de);</span></p>
|
||
|
||
<p class=a><a name=L654><u><span lang=EN-US style='color:blue'>654</span></u></a><span
|
||
lang=EN-US> if (!bh) {</span></p>
|
||
|
||
<p class=a><a name=L655><u><span lang=EN-US style='color:blue'>655</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><a name=L656><u><span lang=EN-US style='color:blue'>656</span></u></a><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOENT</span></u>;</span></p>
|
||
|
||
<p class=a><a name=L657><u><span lang=EN-US style='color:blue'>657</span></u></a><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><a name=L658><u><span lang=EN-US style='color:blue'>658</span></u></a><span
|
||
lang=EN-US> if (!(inode = <u><span
|
||
style='color:blue'>iget</span></u>(dir->i_dev, de->inode))) {</span></p>
|
||
|
||
<p class=a><a name=L659><u><span lang=EN-US style='color:blue'>659</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><a name=L660><u><span lang=EN-US style='color:blue'>660</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><a name=L661><u><span lang=EN-US style='color:blue'>661</span></u></a><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EPERM</span></u>;</span></p>
|
||
|
||
<p class=a><a name=L662><u><span lang=EN-US style='color:blue'>662</span></u></a><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>´ËʱÎÒÃÇÒÑÓаüº¬Òª±»É¾³ýĿ¼ÏîµÄĿ¼<span
|
||
lang=EN-US>i</span>½Úµã<span lang=EN-US>dir</span>¡¢Òª±»É¾³ýĿ¼ÏîµÄ<span lang=EN-US>i</span>½Úµã<span
|
||
lang=EN-US>inode</span>ºÍÒª</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>±»É¾³ýĿ¼ÏîÖ¸Õë<span
|
||
lang=EN-US>de</span>¡£ÏÂÃæÎÒÃÇͨ¹ý¶ÔÕâ<span lang=EN-US>3</span>¸ö¶ÔÏóÖÐÐÅÏ¢µÄ¼ì²éÀ´Ñé֤ɾ³ý²Ù×÷µÄ¿ÉÐÐÐÔ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èô¸ÃĿ¼ÉèÖÃÁËÊÜÏÞɾ³ý±êÖ¾²¢ÇÒ½ø³ÌµÄÓÐЧÓû§<span
|
||
lang=EN-US>id</span>£¨<span lang=EN-US>euid</span>£©²»ÊÇ<span lang=EN-US>root</span>£¬²¢ÇÒ½ø³ÌµÄÓÐЧ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Óû§<span lang=EN-US>id</span>£¨<span
|
||
lang=EN-US>euid</span>£©²»µÈÓÚ¸Ã<span lang=EN-US>i</span>½ÚµãµÄÓû§<span lang=EN-US>id</span>£¬Ôò±íʾµ±Ç°½ø³ÌûÓÐȨÏÞɾ³ý¸ÃĿ¼£¬ÓÚÊÇ·Å</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>»Ø°üº¬ÒªÉ¾³ýĿ¼ÃûµÄĿ¼ <span
|
||
lang=EN-US>i</span>½ÚµãºÍ¸ÃҪɾ³ýĿ¼µÄ <span lang=EN-US>i</span>½Úµã£¬È»ºóÊͷŸßËÙ»º³åÇø£¬·µ»Ø</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>³ö´íÂë¡£</p>
|
||
|
||
<p class=a><a name=L663><u><span lang=EN-US style='color:blue'>663</span></u></a><span
|
||
lang=EN-US> if ((dir->i_mode
|
||
& <u><span style='color:blue'>S_ISVTX</span></u>) && <u><span
|
||
style='color:blue'>current</span></u>->euid &&</span></p>
|
||
|
||
<p class=a><a name=L664><u><span lang=EN-US style='color:blue'>664</span></u></a><span
|
||
lang=EN-US>
|
||
inode->i_uid != <u><span style='color:blue'>current</span></u>->euid) {</span></p>
|
||
|
||
<p class=a><a name=L665><u><span lang=EN-US style='color:blue'>665</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><a name=L666><u><span lang=EN-US style='color:blue'>666</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><a name=L667><u><span lang=EN-US style='color:blue'>667</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><a name=L668><u><span lang=EN-US style='color:blue'>668</span></u></a><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EPERM</span></u>;</span></p>
|
||
|
||
<p class=a><a name=L669><u><span lang=EN-US style='color:blue'>669</span></u></a><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹ûÒª±»É¾³ýµÄĿ¼Ïî<span
|
||
lang=EN-US>i</span>½ÚµãµÄÉ豸ºÅ²»µÈÓÚ°üº¬¸ÃĿ¼ÏîµÄĿ¼µÄÉ豸ºÅ£¬»òÕ߸ñ»É¾³ý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼µÄÒýÓÃÁ¬½Ó¼ÆÊý´óÓÚ<span
|
||
lang=EN-US> 1</span>£¨±íʾÓзûºÅÁ¬½ÓµÈ£©£¬Ôò²»ÄÜɾ³ý¸ÃĿ¼¡£ÓÚÊÇÊͷŰüº¬ÒªÉ¾</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>³ýĿ¼ÃûµÄĿ¼<span
|
||
lang=EN-US>i</span>½ÚµãºÍ¸ÃҪɾ³ýĿ¼µÄ<span lang=EN-US>i</span>½Úµã£¬ÊͷŸßËÙ»º³å¿é£¬·µ»Ø³ö´íÂë¡£</p>
|
||
|
||
<p class=a><a name=L670><u><span lang=EN-US style='color:blue'>670</span></u></a><span
|
||
lang=EN-US> if (inode->i_dev
|
||
!= dir->i_dev || inode->i_count>1) {</span></p>
|
||
|
||
<p class=a><a name=L671><u><span lang=EN-US style='color:blue'>671</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><a name=L672><u><span lang=EN-US style='color:blue'>672</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><a name=L673><u><span lang=EN-US style='color:blue'>673</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><a name=L674><u><span lang=EN-US style='color:blue'>674</span></u></a><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EPERM</span></u>;</span></p>
|
||
|
||
<p class=a><a name=L675><u><span lang=EN-US style='color:blue'>675</span></u></a><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹ûÒª±»É¾³ýĿ¼µÄĿ¼Ïî<span
|
||
lang=EN-US>i</span>½Úµã¾ÍµÈÓÚ°üº¬¸ÃÐèɾ³ýĿ¼µÄĿ¼<span lang=EN-US>i</span>½Úµã£¬Ôò±íʾÊÔͼɾ³ý</p>
|
||
|
||
<p class=a><span lang=EN-US> // "."</span>Ŀ¼£¬ÕâÊDz»ÔÊÐíµÄ¡£ÓÚÊǷŻذüº¬ÒªÉ¾³ýĿ¼ÃûµÄĿ¼<span
|
||
lang=EN-US>i</span>½ÚµãºÍҪɾ³ýĿ¼µÄ<span lang=EN-US>i</span>½Úµã£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÊͷŸßËÙ»º³å¿é£¬·µ»Ø³ö´íÂë¡£</p>
|
||
|
||
<p class=a><a name=L676><u><span lang=EN-US style='color:blue'>676</span></u></a><span
|
||
lang=EN-US> if (inode == dir)
|
||
{ <b><i>/* we may not delete ".", but
|
||
"../dir" is ok */</i></b></span></p>
|
||
|
||
<p class=a><a name=L677><u><span lang=EN-US style='color:blue'>677</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><a name=L678><u><span lang=EN-US style='color:blue'>678</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><a name=L679><u><span lang=EN-US style='color:blue'>679</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><a name=L680><u><span lang=EN-US style='color:blue'>680</span></u></a><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EPERM</span></u>;</span></p>
|
||
|
||
<p class=a><a name=L681><u><span lang=EN-US style='color:blue'>681</span></u></a><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÈôÒª±»É¾³ýĿ¼<span
|
||
lang=EN-US>i</span>½ÚµãµÄÊôÐÔ±íÃ÷Õâ²»ÊÇÒ»¸öĿ¼£¬Ôò±¾É¾³ý²Ù×÷µÄǰÌáÍêÈ«²»´æÔÚ¡£ÓÚÊÇ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·Å»Ø°üº¬É¾³ýĿ¼ÃûµÄĿ¼<span
|
||
lang=EN-US>i</span>½ÚµãºÍ¸ÃҪɾ³ýĿ¼µÄ<span lang=EN-US>i</span>½Úµã£¬ÊͷŸßËÙ»º³å¿é£¬·µ»Ø³ö´íÂë¡£</p>
|
||
|
||
<p class=a><a name=L682><u><span lang=EN-US style='color:blue'>682</span></u></a><span
|
||
lang=EN-US> if (!<u><span
|
||
style='color:blue'>S_ISDIR</span></u>(inode->i_mode)) {</span></p>
|
||
|
||
<p class=a><a name=L683><u><span lang=EN-US style='color:blue'>683</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><a name=L684><u><span lang=EN-US style='color:blue'>684</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><a name=L685><u><span lang=EN-US style='color:blue'>685</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><a name=L686><u><span lang=EN-US style='color:blue'>686</span></u></a><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOTDIR</span></u>;</span></p>
|
||
|
||
<p class=a><a name=L687><u><span lang=EN-US style='color:blue'>687</span></u></a><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èô¸ÃÐ豻ɾ³ýµÄĿ¼²»¿Õ£¬ÔòÒ²²»ÄÜɾ³ý¡£ÓÚÊǷŻذüº¬ÒªÉ¾³ýĿ¼ÃûµÄĿ¼<span
|
||
lang=EN-US>i</span>½ÚµãºÍ¸ÃÒª</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ɾ³ýĿ¼µÄ<span lang=EN-US>i</span>½Úµã£¬ÊͷŸßËÙ»º³å¿é£¬·µ»Ø³ö´íÂë¡£</p>
|
||
|
||
<p class=a><a name=L688><u><span lang=EN-US style='color:blue'>688</span></u></a><span
|
||
lang=EN-US> if (!<u><span
|
||
style='color:blue'>empty_dir</span></u>(inode)) {</span></p>
|
||
|
||
<p class=a><a name=L689><u><span lang=EN-US style='color:blue'>689</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><a name=L690><u><span lang=EN-US style='color:blue'>690</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><a name=L691><u><span lang=EN-US style='color:blue'>691</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><a name=L692><u><span lang=EN-US style='color:blue'>692</span></u></a><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOTEMPTY</span></u>;</span></p>
|
||
|
||
<p class=a><a name=L693><u><span lang=EN-US style='color:blue'>693</span></u></a><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¶ÔÓÚÒ»¸ö¿ÕĿ¼£¬ÆäĿ¼ÏîÁ´½ÓÊýÓ¦¸ÃΪ<span
|
||
lang=EN-US>2</span>£¨Á´½Óµ½ÉϲãĿ¼ºÍ±¾Ä¿Â¼£©¡£Èô¸ÃÐ豻ɾ³ýÄ¿</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼µÄ<span lang=EN-US>i</span>½ÚµãµÄÁ¬½ÓÊý²»µÈÓÚ<span
|
||
lang=EN-US>2</span>£¬ÔòÏÔʾ¾¯¸æÐÅÏ¢¡£µ«É¾³ý²Ù×÷ÈÔÈ»¼ÌÐøÖ´ÐС£ÓÚÊÇÖøÃÐè±»</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ɾ³ýĿ¼µÄĿ¼ÏîµÄ<span
|
||
lang=EN-US>i</span>½ÚµãºÅ×Ö¶ÎΪ<span lang=EN-US>0</span>£¬±íʾ¸ÃĿ¼Ïî²»ÔÙʹÓ㬲¢Öú¬ÓиÃĿ¼ÏîµÄ¸ßËÙ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>»º³å¿éÒÑÐ޸ıêÖ¾£¬²¢ÊͷŸûº³å¿é¡£È»ºóÔÙÖñ»É¾³ýĿ¼<span
|
||
lang=EN-US>i</span>½ÚµãµÄÁ´½ÓÊýΪ<span lang=EN-US>0</span>£¨±íʾ¿ÕÏУ©£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²¢ÖÃ<span lang=EN-US>i</span>½ÚµãÒÑÐ޸ıêÖ¾¡£</p>
|
||
|
||
<p class=a><a name=L694><u><span lang=EN-US style='color:blue'>694</span></u></a><span
|
||
lang=EN-US> if
|
||
(inode->i_nlinks != 2)</span></p>
|
||
|
||
<p class=a><a name=L695><u><span lang=EN-US style='color:blue'>695</span></u></a><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>printk</span></u>(<i>"empty directory has
|
||
nlink!=2 (%d)"</i>,inode->i_nlinks);</span></p>
|
||
|
||
<p class=a><a name=L696><u><span lang=EN-US style='color:blue'>696</span></u></a><span
|
||
lang=EN-US> de->inode = 0;</span></p>
|
||
|
||
<p class=a><a name=L697><u><span lang=EN-US style='color:blue'>697</span></u></a><span
|
||
lang=EN-US> bh->b_dirt = 1;</span></p>
|
||
|
||
<p class=a><a name=L698><u><span lang=EN-US style='color:blue'>698</span></u></a><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><a name=L699><u><span lang=EN-US style='color:blue'>699</span></u></a><span
|
||
lang=EN-US>
|
||
inode->i_nlinks=0;</span></p>
|
||
|
||
<p class=a><a name=L700><u><span lang=EN-US style='color:blue'>700</span></u></a><span
|
||
lang=EN-US> inode->i_dirt=1;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÔÙ½«°üº¬±»É¾³ýĿ¼ÃûµÄĿ¼µÄ<span
|
||
lang=EN-US>i</span>½ÚµãÁ´½Ó¼ÆÊý¼õ<span lang=EN-US>1</span>£¬ÐÞ¸ÄÆä¸Ä±äʱ¼äºÍÐÞ¸Äʱ¼äΪµ±Ç°Ê±</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼ä£¬²¢ÖøýڵãÒÑÐ޸ıêÖ¾¡£×îºó·Å»Ø°üº¬ÒªÉ¾³ýĿ¼ÃûµÄĿ¼<span
|
||
lang=EN-US>i</span>½ÚµãºÍ¸ÃҪɾ³ýĿ¼µÄ<span lang=EN-US>i</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>½Úµã£¬·µ»Ø<span lang=EN-US>0</span>£¨É¾³ý²Ù×÷³É¹¦£©¡£</p>
|
||
|
||
<p class=a><a name=L701><u><span lang=EN-US style='color:blue'>701</span></u></a><span
|
||
lang=EN-US> dir->i_nlinks--;</span></p>
|
||
|
||
<p class=a><a name=L702><u><span lang=EN-US style='color:blue'>702</span></u></a><span
|
||
lang=EN-US> dir->i_ctime =
|
||
dir->i_mtime = <u><span style='color:blue'>CURRENT_TIME</span></u>;</span></p>
|
||
|
||
<p class=a><a name=L703><u><span lang=EN-US style='color:blue'>703</span></u></a><span
|
||
lang=EN-US> dir->i_dirt=1;</span></p>
|
||
|
||
<p class=a><a name=L704><u><span lang=EN-US style='color:blue'>704</span></u></a><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><a name=L705><u><span lang=EN-US style='color:blue'>705</span></u></a><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><a name=L706><u><span lang=EN-US style='color:blue'>706</span></u></a><span
|
||
lang=EN-US> return 0;</span></p>
|
||
|
||
<p class=a><a name=L707><u><span lang=EN-US style='color:blue'>707</span></u></a><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><a name=L708><u><span lang=EN-US style='color:blue'>708</span></u></a><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>ɾ³ý£¨ÊÍ·Å£©ÎļþÃû¶ÔÓ¦µÄĿ¼Ïî¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>´ÓÎļþϵͳɾ³ýÒ»¸öÃû×Ö¡£Èç¹ûÊÇÎļþµÄ×îºóÒ»¸öÁ´½Ó£¬²¢ÇÒûÓнø³ÌÕý´ò¿ª¸ÃÎļþ£¬Ôò¸Ã</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÎļþÒ²½«±»É¾³ý£¬²¢ÊÍ·ÅËùÕ¼ÓõÄÉ豸¿Õ¼ä¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>name
|
||
- </span>ÎļþÃû£¨Â·¾¶Ãû£©¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£º³É¹¦Ôò·µ»Ø<span
|
||
lang=EN-US>0</span>£¬·ñÔò·µ»Ø³ö´íºÅ¡£</p>
|
||
|
||
<p class=a><a name=L709><u><span lang=EN-US style='color:blue'>709</span></u></a><span
|
||
lang=EN-US> int <u><span style='color:blue'>sys_unlink</span></u>(const char *
|
||
name)</span></p>
|
||
|
||
<p class=a><a name=L710><u><span lang=EN-US style='color:blue'>710</span></u></a><span
|
||
lang=EN-US> {</span></p>
|
||
|
||
<p class=a><a name=L711><u><span lang=EN-US style='color:blue'>711</span></u></a><span
|
||
lang=EN-US> const char *
|
||
basename;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>712</span></u><span
|
||
lang=EN-US> int namelen;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>713</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>m_inode</span></u> * dir, * inode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>714</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>buffer_head</span></u> * bh;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>715</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>dir_entry</span></u> * de;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>716</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ê×Ïȼì²é²ÎÊýµÄÓÐЧÐÔ²¢È¡Â·¾¶ÃûÖж¥²ãĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£Èç¹ûÕÒ²»µ½¶ÔӦ·¾¶ÃûÖж¥²ãĿ¼</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÄ <span lang=EN-US>i</span>½Úµã£¬Ôò·µ»Ø³ö´íÂë¡£Èç¹û×î¶¥¶ËµÄÎļþÃû³¤¶ÈΪ<span
|
||
lang=EN-US>0</span>£¬Ôò˵Ã÷¸ø³öµÄ·¾¶Ãû×îºóûÓÐÖ¸</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¶¨ÎļþÃû£¬·Å»Ø¸ÃĿ¼<span
|
||
lang=EN-US>i</span>½Úµã£¬·µ»Ø³ö´íÂëÍ˳ö¡£Èç¹ûÔÚ¸ÃĿ¼ÖÐûÓÐдµÄȨÏÞ£¬Ôò·Å»Ø¸Ã</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼µÄ<span lang=EN-US>i</span>½Úµã£¬·µ»Ø·ÃÎÊÐí¿É³ö´íÂëÍ˳ö¡£Èç¹ûÕÒ²»µ½¶ÔӦ·¾¶Ãû¶¥²ãĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬Ôò·µ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>»Ø³ö´íÂë¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>717</span></u><span
|
||
lang=EN-US> if (!(dir = <u><span
|
||
style='color:blue'>dir_namei</span></u>(name,&namelen,&basename, <u><span
|
||
style='color:blue'>NULL</span></u>)))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>718</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOENT</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>719</span></u><span
|
||
lang=EN-US> if (!namelen) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>720</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>721</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOENT</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>722</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>723</span></u><span
|
||
lang=EN-US> if (!<u><span
|
||
style='color:blue'>permission</span></u>(dir,<u><span style='color:blue'>MAY_WRITE</span></u>))
|
||
{</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>724</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>725</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EPERM</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>726</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºó¸ù¾ÝÖ¸¶¨Ä¿Â¼µÄ<span
|
||
lang=EN-US>i</span>½ÚµãºÍĿ¼ÃûÀûÓú¯Êý<span lang=EN-US>find_entry()</span>ѰÕÒ¶ÔӦĿ¼Ï²¢·µ»Ø°üº¬¸Ã</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼ÏîµÄ»º³å¿éÖ¸Õë<span
|
||
lang=EN-US>bh</span>¡¢°üº¬¸ÃĿ¼ÏîµÄĿ¼µÄ<span lang=EN-US>i</span>½ÚµãÖ¸Õë<span lang=EN-US>dir</span>ºÍ¸ÃĿ¼ÏîÖ¸Õë<span
|
||
lang=EN-US>de</span>¡£ÔÙ¸ù¾Ý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¸ÃĿ¼Ïî<span lang=EN-US>de
|
||
</span>ÖеÄ<span lang=EN-US>i</span>½ÚµãºÅÀûÓÃ<span lang=EN-US> iget()</span>º¯ÊýµÃµ½¶ÔÓ¦µÄ<span
|
||
lang=EN-US>i</span>½Úµã<span lang=EN-US> inode</span>¡£Èç¹û¶ÔӦ·¾¶ÃûÉÏ×î</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ºóĿ¼ÃûµÄĿ¼Ïî²»´æÔÚ£¬ÔòÊͷŰüº¬¸ÃĿ¼ÏîµÄ¸ßËÙ»º³åÇø£¬·Å»ØÄ¿Â¼µÄ
|
||
<span lang=EN-US>i</span>½Úµã£¬·µ»ØÎÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼þÒѾ´æÔÚ³ö´íÂ룬²¢Í˳ö¡£Èç¹ûȡĿ¼ÏîµÄ<span
|
||
lang=EN-US>i</span>½Úµã³ö´í£¬Ôò·Å»ØÄ¿Â¼µÄ <span lang=EN-US>i</span>½Úµã£¬²¢Êͷź¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÓÐĿ¼ÏîµÄ¸ßËÙ»º³åÇø£¬·µ»Ø³ö´íºÅ¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>727</span></u><span
|
||
lang=EN-US> bh = <u><span
|
||
style='color:blue'>find_entry</span></u>(&dir,basename,namelen,&de);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>728</span></u><span
|
||
lang=EN-US> if (!bh) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>729</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>730</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOENT</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>731</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>732</span></u><span
|
||
lang=EN-US> if (!(inode = <u><span
|
||
style='color:blue'>iget</span></u>(dir->i_dev, de->inode))) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>733</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>734</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>735</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOENT</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>736</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>´ËʱÎÒÃÇÒÑÓаüº¬Òª±»É¾³ýĿ¼ÏîµÄĿ¼<span
|
||
lang=EN-US>i</span>½Úµã<span lang=EN-US>dir</span>¡¢Òª±»É¾³ýĿ¼ÏîµÄ<span lang=EN-US>i</span>½Úµã<span
|
||
lang=EN-US>inode</span>ºÍÒª</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>±»É¾³ýĿ¼ÏîÖ¸Õë<span
|
||
lang=EN-US>de</span>¡£ÏÂÃæÎÒÃÇͨ¹ý¶ÔÕâ<span lang=EN-US>3</span>¸ö¶ÔÏóÖÐÐÅÏ¢µÄ¼ì²éÀ´Ñé֤ɾ³ý²Ù×÷µÄ¿ÉÐÐÐÔ¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èô¸ÃĿ¼ÉèÖÃÁËÊÜÏÞɾ³ý±êÖ¾²¢ÇÒ½ø³ÌµÄÓÐЧÓû§<span
|
||
lang=EN-US>id</span>£¨<span lang=EN-US>euid</span>£©²»ÊÇ<span lang=EN-US>root</span>£¬²¢ÇÒ½ø³ÌµÄ<span
|
||
lang=EN-US>euid</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²»µÈÓÚ¸Ã<span lang=EN-US>i</span>½ÚµãµÄÓû§<span
|
||
lang=EN-US>id</span>£¬²¢ÇÒ½ø³ÌµÄ<span lang=EN-US>euid</span>Ò²²»µÈÓÚĿ¼<span lang=EN-US>i</span>½ÚµãµÄÓû§<span
|
||
lang=EN-US>id</span>£¬Ôò±íʾµ±Ç°½ø</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>³ÌûÓÐȨÏÞɾ³ý¸ÃĿ¼£¬ÓÚÊǷŻذüº¬ÒªÉ¾³ýĿ¼ÃûµÄĿ¼<span
|
||
lang=EN-US>i</span>½ÚµãºÍ¸ÃҪɾ³ýĿ¼µÄ<span lang=EN-US>i</span>½Úµã£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºóÊͷŸßËÙ»º³å¿é£¬·µ»Ø³ö´íÂë¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>737</span></u><span
|
||
lang=EN-US> if ((dir->i_mode
|
||
& <u><span style='color:blue'>S_ISVTX</span></u>) && !<u><span
|
||
style='color:blue'>suser</span></u>() &&</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>738</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>current</span></u>->euid != inode->i_uid
|
||
&&</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>739</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>current</span></u>->euid != dir->i_uid) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>740</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>741</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>742</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>743</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EPERM</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>744</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹û¸ÃÖ¸¶¨ÎļþÃûÊÇÒ»¸öĿ¼£¬ÔòÒ²²»ÄÜɾ³ý¡£·Å»Ø¸ÃĿ¼<span
|
||
lang=EN-US>i</span>½ÚµãºÍ¸ÃÎļþÃûĿ¼ÏîµÄ<span lang=EN-US>i</span>½Ú</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µã£¬ÊͷŰüº¬¸ÃĿ¼ÏîµÄ»º³å¿é£¬·µ»Ø³ö´íºÅ¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>745</span></u><span
|
||
lang=EN-US> if (<u><span
|
||
style='color:blue'>S_ISDIR</span></u>(inode->i_mode)) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>746</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>747</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>748</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>749</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EPERM</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>750</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Èç¹û¸Ã<span lang=EN-US>i</span>½ÚµãµÄÁ´½Ó¼ÆÊýÖµÒѾΪ<span
|
||
lang=EN-US>0</span>£¬ÔòÏÔʾ¾¯¸æÐÅÏ¢£¬²¢ÐÞÕýÆäΪ<span lang=EN-US>1</span>¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>751</span></u><span
|
||
lang=EN-US> if
|
||
(!inode->i_nlinks) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>752</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>printk</span></u>(<i>"Deleting nonexistent file
|
||
(%04x:%d), %d\n"</i>,</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>753</span></u><span
|
||
lang=EN-US>
|
||
inode->i_dev,inode->i_num,inode->i_nlinks);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>754</span></u><span
|
||
lang=EN-US>
|
||
inode->i_nlinks=1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>755</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÏÖÔÚÎÒÃÇ¿ÉÒÔɾ³ýÎļþÃû¶ÔÓ¦µÄĿ¼ÏîÁË¡£ÓÚÊǽ«¸ÃÎļþÃûĿ¼ÏîÖеÄ<span
|
||
lang=EN-US>i</span>½ÚµãºÅ×Ö¶ÎÖÃΪ<span lang=EN-US>0</span>£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>±íʾÊͷŸÃĿ¼Ï²¢ÉèÖðüº¬¸ÃĿ¼ÏîµÄ»º³å¿éÒÑÐ޸ıêÖ¾£¬ÊͷŸøßËÙ»º³å¿é¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>756</span></u><span
|
||
lang=EN-US> de->inode = 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>757</span></u><span
|
||
lang=EN-US> bh->b_dirt = 1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>758</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºó°ÑÎļþÃû¶ÔÓ¦<span
|
||
lang=EN-US>i</span>½ÚµãµÄÁ´½ÓÊý¼õ<span lang=EN-US>1</span>£¬ÖÃÒÑÐ޸ıêÖ¾£¬¸üиıäʱ¼äΪµ±Ç°Ê±¼ä¡£×îºó·Å</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>»Ø¸Ã<span lang=EN-US>i</span>½ÚµãºÍĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬·µ»Ø<span lang=EN-US>0</span>£¨³É¹¦£©¡£Èç¹ûÊÇÎļþµÄ×îºóÒ»¸öÁ´½Ó£¬¼´<span
|
||
lang=EN-US>i</span>½ÚµãÁ´½Ó</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Êý¼õ<span lang=EN-US>1</span>ºóµÈÓÚ<span
|
||
lang=EN-US>0</span>£¬²¢ÇÒ´ËʱûÓнø³ÌÕý´ò¿ª¸ÃÎļþ£¬ÄÇôÔÚµ÷ÓÃ<span lang=EN-US>iput()</span>·Å»Ø<span
|
||
lang=EN-US>i</span>½Úµãʱ£¬¸ÃÎÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼þÒ²½«±»É¾³ý£¬²¢ÊÍ·ÅËùÕ¼ÓõÄÉ豸¿Õ¼ä¡£²Î¼û<span
|
||
lang=EN-US>fs/inode.c</span>£¬µÚ<span lang=EN-US>183</span>ÐС£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>759</span></u><span
|
||
lang=EN-US>
|
||
inode->i_nlinks--;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>760</span></u><span
|
||
lang=EN-US> inode->i_dirt =
|
||
1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>761</span></u><span
|
||
lang=EN-US> inode->i_ctime =
|
||
<u><span style='color:blue'>CURRENT_TIME</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>762</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>763</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>764</span></u><span
|
||
lang=EN-US> return 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>765</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>766</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>½¨Á¢·ûºÅÁ´½Ó¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ϊһ¸öÒÑ´æÔÚÎļþ´´½¨Ò»¸ö·ûºÅÁ´½Ó£¨Ò²³ÆÎªÈíÁ¬½Ó<span
|
||
lang=EN-US> - hard link</span>£©¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>oldname
|
||
- </span>Ô·¾¶Ãû£»<span lang=EN-US>newname - </span>еķ¾¶Ãû¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£ºÈô³É¹¦Ôò·µ»Ø<span
|
||
lang=EN-US>0</span>£¬·ñÔò·µ»Ø³ö´íºÅ¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>767</span></u><span
|
||
lang=EN-US> int <u><span style='color:blue'>sys_symlink</span></u>(const char *
|
||
oldname, const char * newname)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>768</span></u><span
|
||
lang=EN-US> {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>769</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>dir_entry</span></u> * de;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>770</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>m_inode</span></u> * dir, * inode;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>771</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>buffer_head</span></u> * bh, * name_block;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>772</span></u><span
|
||
lang=EN-US> const char *
|
||
basename;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>773</span></u><span
|
||
lang=EN-US> int namelen, i;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>774</span></u><span
|
||
lang=EN-US> char c;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>775</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ê×ÏȲéÕÒз¾¶ÃûµÄ×î¶¥²ãĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã<span lang=EN-US>dir</span>£¬²¢·µ»Ø×îºóµÄÎļþÃû¼°Æä³¤¶È¡£Èç¹ûĿ¼µÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // i</span>½ÚµãûÓÐÕÒµ½£¬Ôò·µ»Ø³ö´íºÅ¡£Èç¹ûз¾¶ÃûÖв»°üÀ¨ÎļþÃû£¬Ôò·Å»ØÐ·¾¶ÃûĿ¼µÄ<span
|
||
lang=EN-US>i</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>½Úµã£¬·µ»Ø³ö´íºÅ¡£ÁíÍ⣬Èç¹ûÓû§Ã»ÓÐÔÚÐÂĿ¼ÖÐдµÄȨÏÞ£¬ÔòÒ²²»Äܽ¨Á¢Á¬½Ó£¬ÓÚÊÇ·Å</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>»ØÐ·¾¶ÃûĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬·µ»Ø³ö´íºÅ¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>776</span></u><span
|
||
lang=EN-US> dir = <u><span
|
||
style='color:blue'>dir_namei</span></u>(newname,&namelen,&basename, <u><span
|
||
style='color:blue'>NULL</span></u>);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>777</span></u><span
|
||
lang=EN-US> if (!dir)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>778</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EACCES</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>779</span></u><span
|
||
lang=EN-US> if (!namelen) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>780</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>781</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EPERM</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>782</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>783</span></u><span
|
||
lang=EN-US> if (!<u><span
|
||
style='color:blue'>permission</span></u>(dir,<u><span style='color:blue'>MAY_WRITE</span></u>))
|
||
{</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>784</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>785</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EACCES</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>786</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÏÖÔÚÎÒÃÇÔÚĿ¼ָ¶¨É豸ÉÏÉêÇëÒ»¸öеÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬²¢ÉèÖøÃ<span lang=EN-US>i</span>½ÚµãģʽΪ·ûºÅÁ´½ÓÀàÐÍÒÔ¼°</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>½ø³Ì¹æ¶¨µÄģʽÆÁ±ÎÂë¡£²¢ÇÒÉèÖøÃ<span
|
||
lang=EN-US>i</span>½ÚµãÒÑÐ޸ıêÖ¾¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>787</span></u><span
|
||
lang=EN-US> if (!(inode = <u><span
|
||
style='color:blue'>new_inode</span></u>(dir->i_dev))) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>788</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>789</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOSPC</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>790</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>791</span></u><span
|
||
lang=EN-US> inode->i_mode = <u><span
|
||
style='color:blue'>S_IFLNK</span></u> | (0777 & ~current-><u><span
|
||
style='color:blue'>umask</span></u>);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>792</span></u><span
|
||
lang=EN-US> inode->i_dirt =
|
||
1;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ΪÁ˱£´æ·ûºÅÁ´½Ó·¾¶Ãû×Ö·û´®ÐÅÏ¢£¬ÎÒÃÇÐèҪΪ¸Ã<span
|
||
lang=EN-US>i</span>½ÚµãÉêÇëÒ»¸ö´ÅÅ̿飬²¢ÈÃ<span lang=EN-US>i</span>½ÚµãµÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÚ<span lang=EN-US>1</span>¸öÖ±½Ó¿éºÅ<span
|
||
lang=EN-US>i_zone[0]</span>µÈÓڵõ½µÄÂß¼¿éºÅ¡£È»ºóÖÃ<span lang=EN-US>i</span>½ÚµãÒÑÐ޸ıêÖ¾¡£Èç¹ûÉêÇëʧ°Ü</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ôò·Å»Ø¶ÔӦĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã£»¸´Î»ÐÂÉêÇëµÄ<span lang=EN-US>i</span>½ÚµãÁ´½Ó¼ÆÊý£»·Å»Ø¸ÃеÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬·µ»ØÃ»ÓпÕ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼ä³ö´íÂëÍ˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>793</span></u><span
|
||
lang=EN-US> if
|
||
(!(inode->i_zone[0]=<u><span style='color:blue'>new_block</span></u>(inode->i_dev)))
|
||
{</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>794</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>795</span></u><span
|
||
lang=EN-US>
|
||
inode->i_nlinks--;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>796</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>797</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOSPC</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>798</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>799</span></u><span
|
||
lang=EN-US> inode->i_dirt =
|
||
1;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºó´ÓÉ豸É϶ÁÈ¡ÐÂÉêÇëµÄ´ÅÅ̿飨ĿµÄÊǰѶÔÓ¦¿é·Åµ½¸ßËÙ»º³åÇøÖУ©¡£Èô³ö´í£¬Ôò·Å»Ø</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¶ÔӦĿ¼µÄ<span lang=EN-US>i</span>½Úµã£»¸´Î»ÐÂÉêÇëµÄ<span
|
||
lang=EN-US>i</span>½ÚµãÁ´½Ó¼ÆÊý£»·Å»Ø¸ÃеÄ<span lang=EN-US>i</span>½Úµã£¬·µ»ØÃ»Óпռä³ö´í</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÂëÍ˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>800</span></u><span
|
||
lang=EN-US> if (!(name_block=<u><span
|
||
style='color:blue'>bread</span></u>(inode->i_dev,inode->i_zone[0]))) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>801</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>802</span></u><span
|
||
lang=EN-US>
|
||
inode->i_nlinks--;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>803</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>804</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ERROR</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>805</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÏÖÔÚÎÒÃÇ¿ÉÒÔ°Ñ·ûºÅÁ´½ÓÃû×Ö·û´®·ÅÈëÕâ¸öÅÌ¿éÖÐÁË¡£Å̿鳤¶ÈΪ<span
|
||
lang=EN-US>1024</span>×Ö½Ú£¬Òò´ËĬÈÏ·ûºÅ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Á´½ÓÃû³¤¶È×î´óÒ²Ö»ÄÜÊÇ<span
|
||
lang=EN-US>1024</span>×Ö½Ú¡£ÎÒÃǰÑÓû§¿Õ¼äÖеķûºÅÁ´½ÓÃû×Ö·û´®¸´ÖƵ½ÅÌ¿éËùÔÚ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÄ»º³å¿éÖУ¬²¢Öûº³å¿éÒÑÐ޸ıêÖ¾¡£Îª·ÀÖ¹Óû§ÌṩµÄ×Ö·û´®Ã»ÓÐÒÔ<span
|
||
lang=EN-US>null</span>½á⣬ÎÒÃÇÔÚ»º</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>³å¿éÊý¾ÝÇø×îºóÒ»¸ö×Ö½Ú´¦·ÅÉÏÒ»¸ö<span
|
||
lang=EN-US>NULL</span>¡£È»ºóÊͷŸûº³å¿é£¬²¢ÉèÖÃ<span lang=EN-US>i</span>½Úµã¶ÔÓ¦ÎļþÖÐÊý</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¾Ý³¤¶ÈµÈÓÚ·ûºÅÁ´½ÓÃû×Ö·û´®³¤¶È£¬²¢ÖÃ<span
|
||
lang=EN-US>i</span>½ÚµãÒÑÐ޸ıêÖ¾¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>806</span></u><span
|
||
lang=EN-US> i = 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>807</span></u><span
|
||
lang=EN-US> while (i < 1023
|
||
&& (c=<u><span style='color:blue'>get_fs_byte</span></u>(oldname++)))</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>808</span></u><span
|
||
lang=EN-US>
|
||
name_block->b_data[i++] = c;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>809</span></u><span
|
||
lang=EN-US>
|
||
name_block->b_data[i] = 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>810</span></u><span
|
||
lang=EN-US>
|
||
name_block->b_dirt = 1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>811</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>brelse</span></u>(name_block);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>812</span></u><span
|
||
lang=EN-US> inode->i_size =
|
||
i;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>813</span></u><span
|
||
lang=EN-US> inode->i_dirt =
|
||
1;</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºóÎÒÃÇËÑË÷һϷ¾¶ÃûÖ¸¶¨µÄ·ûºÅÁ´½ÓÎļþÃûÊÇ·ñÒѾ´æÔÚ¡£ÈôÒѾ´æÔÚÔò²»ÄÜ´´½¨Í¬Ãû</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ŀ¼Ïî<span lang=EN-US>i</span>½Úµã¡£Èç¹û¶ÔÓ¦·ûºÅÁ´½ÓÎļþÃûÒѾ´æÔÚ£¬ÔòÊͷŰüº¬¸ÃĿ¼ÏîµÄ»º³åÇø¿é£¬¸´Î»</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÐÂÉêÇëµÄ<span lang=EN-US>i</span>½ÚµãÁ¬½Ó¼ÆÊý£¬²¢·Å»ØÄ¿Â¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬·µ»ØÎļþÒѾ´æÔڵijö´íÂëÍ˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>814</span></u><span
|
||
lang=EN-US> bh = <u><span
|
||
style='color:blue'>find_entry</span></u>(&dir,basename,namelen,&de);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>815</span></u><span
|
||
lang=EN-US> if (bh) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>816</span></u><span
|
||
lang=EN-US>
|
||
inode->i_nlinks--;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>817</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>818</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>819</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>820</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EEXIST</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>821</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÏÖÔÚÎÒÃÇÔÚÖ¸¶¨Ä¿Â¼ÖÐÐÂÌí¼ÓÒ»¸öĿ¼ÏÓÃÓÚ´æ·Åн¨·ûºÅÁ´½ÓÎļþÃûµÄ<span
|
||
lang=EN-US>i</span>½ÚµãºÅºÍĿ¼</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ãû¡£Èç¹ûʧ°Ü£¨°üº¬¸ÃĿ¼ÏîµÄ¸ßËÙ»º³åÇøÖ¸ÕëΪ<span
|
||
lang=EN-US>NULL</span>£©£¬Ôò·Å»ØÄ¿Â¼µÄ<span lang=EN-US>i</span>½Úµã£»ËùÉêÇëµÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // i</span>½ÚµãÒýÓÃÁ¬½Ó¼ÆÊý¸´Î»£¬²¢·Å»Ø¸Ã<span
|
||
lang=EN-US>i</span>½Úµã¡£·µ»Ø³ö´íÂëÍ˳ö¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>822</span></u><span
|
||
lang=EN-US> bh = <u><span
|
||
style='color:blue'>add_entry</span></u>(dir,basename,namelen,&de);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>823</span></u><span
|
||
lang=EN-US> if (!bh) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>824</span></u><span
|
||
lang=EN-US>
|
||
inode->i_nlinks--;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>825</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>826</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>827</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOSPC</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>828</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>×îºóÁî¸ÃÐÂĿ¼ÏîµÄ<span
|
||
lang=EN-US>i</span>½Úµã×ֶεÈÓÚÐÂ<span lang=EN-US>i</span>½ÚµãºÅ£¬²¢ÖøßËÙ»º³å¿éÒÑÐ޸ıêÖ¾£¬ÊͷŸßËÙ»º</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>³å¿é£¬·Å»ØÄ¿Â¼ºÍеÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬×îºó·µ»Ø<span lang=EN-US>0</span>£¨³É¹¦£©¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>829</span></u><span
|
||
lang=EN-US> de->inode =
|
||
inode->i_num;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>830</span></u><span
|
||
lang=EN-US> bh->b_dirt = 1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>831</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>832</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>833</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(inode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>834</span></u><span
|
||
lang=EN-US> return 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>835</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>836</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> //// </span>ΪÎļþ½¨Á¢Ò»¸öÎļþÃûĿ¼Ïî¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ϊһ¸öÒÑ´æÔÚµÄÎļþ´´½¨Ò»¸öÐÂÁ´½Ó£¨Ò²³ÆÎªÓ²Á¬½Ó<span
|
||
lang=EN-US> - hard link</span>£©¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²ÎÊý£º<span lang=EN-US>oldname
|
||
- </span>Ô·¾¶Ãû£»<span lang=EN-US>newname - </span>еķ¾¶Ãû¡£</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·µ»Ø£ºÈô³É¹¦Ôò·µ»Ø<span
|
||
lang=EN-US>0</span>£¬·ñÔò·µ»Ø³ö´íºÅ¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>837</span></u><span
|
||
lang=EN-US> int <u><span style='color:blue'>sys_link</span></u>(const char *
|
||
oldname, const char * newname)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>838</span></u><span
|
||
lang=EN-US> {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>839</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>dir_entry</span></u> * de;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>840</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>m_inode</span></u> * oldinode, * dir;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>841</span></u><span
|
||
lang=EN-US> struct <u><span
|
||
style='color:blue'>buffer_head</span></u> * bh;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>842</span></u><span
|
||
lang=EN-US> const char *
|
||
basename;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>843</span></u><span
|
||
lang=EN-US> int namelen;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>844</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ê×ÏȶÔÔÎļþÃû½øÐÐÓÐЧÐÔÑéÖ¤£¬ËüÓ¦¸Ã´æÔÚ²¢ÇÒ²»ÊÇÒ»¸öĿ¼Ãû¡£ËùÒÔÎÒÃÇÏÈÈ¡ÔÎļþ·</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¾¶Ãû¶ÔÓ¦µÄ<span lang=EN-US>i</span>½Úµã<span
|
||
lang=EN-US>oldinode</span>¡£Èç¹ûΪ<span lang=EN-US>0</span>£¬Ôò±íʾ³ö´í£¬·µ»Ø³ö´íºÅ¡£Èç¹ûÔ·¾¶Ãû¶ÔÓ¦µÄÊÇ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ò»¸öĿ¼Ãû£¬Ôò·Å»Ø¸Ã<span
|
||
lang=EN-US>i</span>½Úµã£¬Ò²·µ»Ø³ö´íºÅ¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>845</span></u><span
|
||
lang=EN-US> oldinode=<u><span
|
||
style='color:blue'>namei</span></u>(oldname);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>846</span></u><span
|
||
lang=EN-US> if (!oldinode)</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>847</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOENT</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>848</span></u><span
|
||
lang=EN-US> if (<u><span
|
||
style='color:blue'>S_ISDIR</span></u>(oldinode->i_mode)) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>849</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(oldinode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>850</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EPERM</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>851</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>È»ºó²éÕÒз¾¶ÃûµÄ×î¶¥²ãĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã<span lang=EN-US>dir</span>£¬²¢·µ»Ø×îºóµÄÎļþÃû¼°Æä³¤¶È¡£Èç¹ûĿ¼µÄ</p>
|
||
|
||
<p class=a><span lang=EN-US> // i</span>½ÚµãûÓÐÕÒµ½£¬Ôò·Å»ØÔ·¾¶ÃûµÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬·µ»Ø³ö´íºÅ¡£Èç¹ûз¾¶ÃûÖв»°üÀ¨ÎļþÃû£¬</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>Ôò·Å»ØÔ·¾¶Ãû<span
|
||
lang=EN-US>i</span>½ÚµãºÍз¾¶ÃûĿ¼µÄ<span lang=EN-US>i</span>½Úµã£¬·µ»Ø³ö´íºÅ¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>852</span></u><span
|
||
lang=EN-US> dir = <u><span
|
||
style='color:blue'>dir_namei</span></u>(newname,&namelen,&basename, <u><span
|
||
style='color:blue'>NULL</span></u>);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>853</span></u><span
|
||
lang=EN-US> if (!dir) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>854</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(oldinode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>855</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EACCES</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>856</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>857</span></u><span
|
||
lang=EN-US> if (!namelen) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>858</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(oldinode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>859</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>860</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EPERM</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>861</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÎÒÃDz»ÄÜ¿çÉ豸½¨Á¢Ó²Á´½Ó¡£Òò´ËÈç¹ûз¾¶Ãû¶¥²ãĿ¼µÄÉ豸ºÅÓëÔ·¾¶ÃûµÄÉ豸ºÅ</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>²»Ò»Ñù£¬Ôò·Å»ØÐ·¾¶ÃûĿ¼µÄ<span
|
||
lang=EN-US>i</span>½ÚµãºÍÔ·¾¶ÃûµÄ<span lang=EN-US>i</span>½Úµã£¬·µ»Ø³ö´íºÅ¡£ÁíÍ⣬Èç¹ûÓû§</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ûÓÐÔÚÐÂĿ¼ÖÐдµÄȨÏÞ£¬ÔòÒ²²»Äܽ¨Á¢Á¬½Ó£¬ÓÚÊÇ·Å»ØÐ·¾¶ÃûĿ¼µÄ<span
|
||
lang=EN-US>i</span>½ÚµãºÍÔ·¾¶Ãû</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µÄ<span lang=EN-US>i</span>½Úµã£¬·µ»Ø³ö´íºÅ¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>862</span></u><span
|
||
lang=EN-US> if (dir->i_dev
|
||
!= oldinode->i_dev) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>863</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>864</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(oldinode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>865</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EXDEV</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>866</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>867</span></u><span
|
||
lang=EN-US> if (!<u><span
|
||
style='color:blue'>permission</span></u>(dir,<u><span style='color:blue'>MAY_WRITE</span></u>))
|
||
{</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>868</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>869</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(oldinode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>870</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EACCES</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>871</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÏÖÔÚ²éѯ¸Ãз¾¶ÃûÊÇ·ñÒѾ´æÔÚ£¬Èç¹û´æÔÚÔòÒ²²»Äܽ¨Á¢Á´½Ó¡£ÓÚÊÇÊͷŰüº¬¸ÃÒÑ´æÔÚÄ¿</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>¼ÏîµÄ¸ßËÙ»º³å¿é£¬·Å»ØÐ·¾¶ÃûĿ¼µÄ<span
|
||
lang=EN-US>i</span>½ÚµãºÍÔ·¾¶ÃûµÄ<span lang=EN-US>i</span>½Úµã£¬·µ»Ø³ö´íºÅ¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>872</span></u><span
|
||
lang=EN-US> bh = <u><span
|
||
style='color:blue'>find_entry</span></u>(&dir,basename,namelen,&de);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>873</span></u><span
|
||
lang=EN-US> if (bh) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>874</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>875</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>876</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(oldinode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>877</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>EEXIST</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>878</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÏÖÔÚËùÓÐÌõ¼þ¶¼Âú×ãÁË£¬ÓÚÊÇÎÒÃÇÔÚÐÂĿ¼ÖÐÌí¼ÓÒ»¸öĿ¼Ïî¡£Èôʧ°ÜÔò·Å»Ø¸ÃĿ¼µÄ<span
|
||
lang=EN-US>i</span>½Ú</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>µãºÍÔ·¾¶ÃûµÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬·µ»Ø³ö´íºÅ¡£·ñÔò³õʼÉèÖøÃĿ¼ÏîµÄ<span lang=EN-US>i</span>½ÚµãºÅµÈÓÚÔ·¾¶ÃûµÄ<span
|
||
lang=EN-US>i</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>½ÚµãºÅ£¬²¢Öðüº¬¸ÃÐÂÌíĿ¼ÏîµÄ»º³å¿éÒÑÐ޸ıêÖ¾£¬ÊͷŸûº³å¿é£¬·Å»ØÄ¿Â¼µÄ<span
|
||
lang=EN-US>i</span>½Úµã¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>879</span></u><span
|
||
lang=EN-US> bh = <u><span
|
||
style='color:blue'>add_entry</span></u>(dir,basename,namelen,&de);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>880</span></u><span
|
||
lang=EN-US> if (!bh) {</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>881</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>882</span></u><span
|
||
lang=EN-US>
|
||
<u><span style='color:blue'>iput</span></u>(oldinode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>883</span></u><span
|
||
lang=EN-US>
|
||
return -<u><span style='color:blue'>ENOSPC</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>884</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>885</span></u><span
|
||
lang=EN-US> de->inode =
|
||
oldinode->i_num;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>886</span></u><span
|
||
lang=EN-US> bh->b_dirt = 1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>887</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>brelse</span></u>(bh);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>888</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(dir);</span></p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>ÔÙ½«Ô½ÚµãµÄÁ´½Ó¼ÆÊý¼Ó<span
|
||
lang=EN-US>1</span>£¬ÐÞ¸ÄÆä¸Ä±äʱ¼äΪµ±Ç°Ê±¼ä£¬²¢ÉèÖÃ<span lang=EN-US>i</span>½ÚµãÒÑÐ޸ıêÖ¾¡£×îºó</p>
|
||
|
||
<p class=a><span lang=EN-US> // </span>·Å»ØÔ·¾¶ÃûµÄ<span
|
||
lang=EN-US>i</span>½Úµã£¬²¢·µ»Ø<span lang=EN-US>0</span>£¨³É¹¦£©¡£</p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>889</span></u><span
|
||
lang=EN-US>
|
||
oldinode->i_nlinks++;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>890</span></u><span
|
||
lang=EN-US>
|
||
oldinode->i_ctime = <u><span style='color:blue'>CURRENT_TIME</span></u>;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>891</span></u><span
|
||
lang=EN-US> oldinode->i_dirt
|
||
= 1;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>892</span></u><span
|
||
lang=EN-US> <u><span
|
||
style='color:blue'>iput</span></u>(oldinode);</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>893</span></u><span
|
||
lang=EN-US> return 0;</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>894</span></u><span
|
||
lang=EN-US> }</span></p>
|
||
|
||
<p class=a><u><span lang=EN-US style='color:blue'>895</span></u><span
|
||
lang=EN-US> </span></p>
|
||
|
||
<div class=a align=center style='text-align:center'><span lang=EN-US>
|
||
|
||
<hr size=4 width="100%" align=center>
|
||
|
||
</span></div>
|
||
|
||
<p class=MsoNormal><span lang=EN-US> </span></p>
|
||
|
||
<p class=MsoNormal><span lang=EN-US> </span></p>
|
||
|
||
</div>
|
||
|
||
</body>
|
||
|
||
</html>
|