📄 bitmap.c
字号:
<a name=L75 href="source/fs/bitmap.c#L75">75</a> int <a href="ident?i=new_block">new_block</a>(int dev) <a name=L76 href="source/fs/bitmap.c#L76">76</a> { <a name=L77 href="source/fs/bitmap.c#L77">77</a> struct <a href="ident?i=buffer_head">buffer_head</a> * bh; <a name=L78 href="source/fs/bitmap.c#L78">78</a> struct <a href="ident?i=super_block">super_block</a> * sb; <a name=L79 href="source/fs/bitmap.c#L79">79</a> int i,j; <a name=L80 href="source/fs/bitmap.c#L80">80</a> <a name=L81 href="source/fs/bitmap.c#L81">81</a> if (!(sb = <a href="ident?i=get_super">get_super</a>(dev))) <a name=L82 href="source/fs/bitmap.c#L82">82</a> <a href="ident?i=panic">panic</a>(<i>"trying to get new block from nonexistant device"</i>); <a name=L83 href="source/fs/bitmap.c#L83">83</a> j = 8192; <a name=L84 href="source/fs/bitmap.c#L84">84</a> for (i=0 ; i<8 ; i++) <a name=L85 href="source/fs/bitmap.c#L85">85</a> if (bh=sb->s_zmap[i]) <a name=L86 href="source/fs/bitmap.c#L86">86</a> if ((j=<a href="ident?i=find_first_zero">find_first_zero</a>(bh->b_data))<8192) <a name=L87 href="source/fs/bitmap.c#L87">87</a> break; <a name=L88 href="source/fs/bitmap.c#L88">88</a> if (i>=8 || !bh || j>=8192) <a name=L89 href="source/fs/bitmap.c#L89">89</a> return 0; <a name=L90 href="source/fs/bitmap.c#L90">90</a> if (<a href="ident?i=set_bit">set_bit</a>(j,bh->b_data)) <a name=L91 href="source/fs/bitmap.c#L91">91</a> <a href="ident?i=panic">panic</a>(<i>"new_block: bit already set"</i>); <a name=L92 href="source/fs/bitmap.c#L92">92</a> bh->b_dirt = 1; <a name=L93 href="source/fs/bitmap.c#L93">93</a> j += i*8192 + sb->s_firstdatazone-1; <a name=L94 href="source/fs/bitmap.c#L94">94</a> if (j >= sb->s_nzones) <a name=L95 href="source/fs/bitmap.c#L95">95</a> return 0; <a name=L96 href="source/fs/bitmap.c#L96">96</a> if (!(bh=<a href="ident?i=getblk">getblk</a>(dev,j))) <a name=L97 href="source/fs/bitmap.c#L97">97</a> <a href="ident?i=panic">panic</a>(<i>"new_block: cannot get block"</i>); <a name=L98 href="source/fs/bitmap.c#L98">98</a> if (bh->b_count != 1) <a name=L99 href="source/fs/bitmap.c#L99">99</a> <a href="ident?i=panic">panic</a>(<i>"new block: count is != 1"</i>);<a name=L100 href="source/fs/bitmap.c#L100">100</a> <a href="ident?i=clear_block">clear_block</a>(bh->b_data);<a name=L101 href="source/fs/bitmap.c#L101">101</a> bh->b_uptodate = 1;<a name=L102 href="source/fs/bitmap.c#L102">102</a> bh->b_dirt = 1;<a name=L103 href="source/fs/bitmap.c#L103">103</a> <a href="ident?i=brelse">brelse</a>(bh);<a name=L104 href="source/fs/bitmap.c#L104">104</a> return j;<a name=L105 href="source/fs/bitmap.c#L105">105</a> }<a name=L106 href="source/fs/bitmap.c#L106">106</a> <a name=L107 href="source/fs/bitmap.c#L107">107</a> void <a href="ident?i=free_inode">free_inode</a>(struct <a href="ident?i=m_inode">m_inode</a> * inode)<a name=L108 href="source/fs/bitmap.c#L108">108</a> {<a name=L109 href="source/fs/bitmap.c#L109">109</a> struct <a href="ident?i=super_block">super_block</a> * sb;<a name=L110 href="source/fs/bitmap.c#L110">110</a> struct <a href="ident?i=buffer_head">buffer_head</a> * bh;<a name=L111 href="source/fs/bitmap.c#L111">111</a> <a name=L112 href="source/fs/bitmap.c#L112">112</a> if (!inode)<a name=L113 href="source/fs/bitmap.c#L113">113</a> return;<a name=L114 href="source/fs/bitmap.c#L114">114</a> if (!inode->i_dev) {<a name=L115 href="source/fs/bitmap.c#L115">115</a> <a href="ident?i=memset">memset</a>(inode,0,sizeof(*inode));<a name=L116 href="source/fs/bitmap.c#L116">116</a> return;<a name=L117 href="source/fs/bitmap.c#L117">117</a> }<a name=L118 href="source/fs/bitmap.c#L118">118</a> if (inode->i_count>1) {<a name=L119 href="source/fs/bitmap.c#L119">119</a> <a href="ident?i=printk">printk</a>(<i>"trying to free inode with count=%d\n"</i>,inode->i_count);<a name=L120 href="source/fs/bitmap.c#L120">120</a> <a href="ident?i=panic">panic</a>(<i>"free_inode"</i>);<a name=L121 href="source/fs/bitmap.c#L121">121</a> }<a name=L122 href="source/fs/bitmap.c#L122">122</a> if (inode->i_nlinks)<a name=L123 href="source/fs/bitmap.c#L123">123</a> <a href="ident?i=panic">panic</a>(<i>"trying to free inode with links"</i>);<a name=L124 href="source/fs/bitmap.c#L124">124</a> if (!(sb = <a href="ident?i=get_super">get_super</a>(inode->i_dev)))<a name=L125 href="source/fs/bitmap.c#L125">125</a> <a href="ident?i=panic">panic</a>(<i>"trying to free inode on nonexistent device"</i>);<a name=L126 href="source/fs/bitmap.c#L126">126</a> if (inode->i_num < 1 || inode->i_num > sb->s_ninodes)<a name=L127 href="source/fs/bitmap.c#L127">127</a> <a href="ident?i=panic">panic</a>(<i>"trying to free inode 0 or nonexistant inode"</i>);<a name=L128 href="source/fs/bitmap.c#L128">128</a> if (!(bh=sb->s_imap[inode->i_num>>13]))<a name=L129 href="source/fs/bitmap.c#L129">129</a> <a href="ident?i=panic">panic</a>(<i>"nonexistent imap in superblock"</i>);<a name=L130 href="source/fs/bitmap.c#L130">130</a> if (<a href="ident?i=clear_bit">clear_bit</a>(inode->i_num&8191,bh->b_data))<a name=L131 href="source/fs/bitmap.c#L131">131</a> <a href="ident?i=printk">printk</a>(<i>"free_inode: bit already cleared.\n\r"</i>);<a name=L132 href="source/fs/bitmap.c#L132">132</a> bh->b_dirt = 1;<a name=L133 href="source/fs/bitmap.c#L133">133</a> <a href="ident?i=memset">memset</a>(inode,0,sizeof(*inode));<a name=L134 href="source/fs/bitmap.c#L134">134</a> }<a name=L135 href="source/fs/bitmap.c#L135">135</a> <a name=L136 href="source/fs/bitmap.c#L136">136</a> struct <a href="ident?i=m_inode">m_inode</a> * <a href="ident?i=new_inode">new_inode</a>(int dev)<a name=L137 href="source/fs/bitmap.c#L137">137</a> {<a name=L138 href="source/fs/bitmap.c#L138">138</a> struct <a href="ident?i=m_inode">m_inode</a> * inode;<a name=L139 href="source/fs/bitmap.c#L139">139</a> struct <a href="ident?i=super_block">super_block</a> * sb;<a name=L140 href="source/fs/bitmap.c#L140">140</a> struct <a href="ident?i=buffer_head">buffer_head</a> * bh;<a name=L141 href="source/fs/bitmap.c#L141">141</a> int i,j;<a name=L142 href="source/fs/bitmap.c#L142">142</a> <a name=L143 href="source/fs/bitmap.c#L143">143</a> if (!(inode=<a href="ident?i=get_empty_inode">get_empty_inode</a>()))<a name=L144 href="source/fs/bitmap.c#L144">144</a> return <a href="ident?i=NULL">NULL</a>;<a name=L145 href="source/fs/bitmap.c#L145">145</a> if (!(sb = <a href="ident?i=get_super">get_super</a>(dev)))<a name=L146 href="source/fs/bitmap.c#L146">146</a> <a href="ident?i=panic">panic</a>(<i>"new_inode with unknown device"</i>);<a name=L147 href="source/fs/bitmap.c#L147">147</a> j = 8192;<a name=L148 href="source/fs/bitmap.c#L148">148</a> for (i=0 ; i<8 ; i++)<a name=L149 href="source/fs/bitmap.c#L149">149</a> if (bh=sb->s_imap[i])<a name=L150 href="source/fs/bitmap.c#L150">150</a> if ((j=<a href="ident?i=find_first_zero">find_first_zero</a>(bh->b_data))<8192)<a name=L151 href="source/fs/bitmap.c#L151">151</a> break;<a name=L152 href="source/fs/bitmap.c#L152">152</a> if (!bh || j >= 8192 || j+i*8192 > sb->s_ninodes) {<a name=L153 href="source/fs/bitmap.c#L153">153</a> <a href="ident?i=iput">iput</a>(inode);<a name=L154 href="source/fs/bitmap.c#L154">154</a> return <a href="ident?i=NULL">NULL</a>;<a name=L155 href="source/fs/bitmap.c#L155">155</a> }<a name=L156 href="source/fs/bitmap.c#L156">156</a> if (<a href="ident?i=set_bit">set_bit</a>(j,bh->b_data))<a name=L157 href="source/fs/bitmap.c#L157">157</a> <a href="ident?i=panic">panic</a>(<i>"new_inode: bit already set"</i>);<a name=L158 href="source/fs/bitmap.c#L158">158</a> bh->b_dirt = 1;<a name=L159 href="source/fs/bitmap.c#L159">159</a> inode->i_count=1;<a name=L160 href="source/fs/bitmap.c#L160">160</a> inode->i_nlinks=1;<a name=L161 href="source/fs/bitmap.c#L161">161</a> inode->i_dev=dev;<a name=L162 href="source/fs/bitmap.c#L162">162</a> inode->i_uid=<a href="ident?i=current">current</a>->euid;<a name=L163 href="source/fs/bitmap.c#L163">163</a> inode->i_gid=<a href="ident?i=current">current</a>->egid;<a name=L164 href="source/fs/bitmap.c#L164">164</a> inode->i_dirt=1;<a name=L165 href="source/fs/bitmap.c#L165">165</a> inode->i_num = j + i*8192;<a name=L166 href="source/fs/bitmap.c#L166">166</a> inode->i_mtime = inode->i_atime = inode->i_ctime = <a href="ident?i=CURRENT_TIME">CURRENT_TIME</a>;<a name=L167 href="source/fs/bitmap.c#L167">167</a> return inode;<a name=L168 href="source/fs/bitmap.c#L168">168</a> }<a name=L169 href="source/fs/bitmap.c#L169">169</a> </pre><hr><div align=center> [<b><i>源代码浏览</i></b>] [<a href="diff/fs/bitmap.c">区别标定</a>] [<a href="ident">标识符搜索</a>] [<a href="search">文本搜索</a>] [<a href="find">文件搜索</a>] </div><hr>本网页由 <a href="http:blurb.html">LXR引擎</a> 自动生成.<br></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -