📄 ll_rw_blk.c
字号:
<a name=L74 href="source/kernel/blk_drv/ll_rw_blk.c#L74">74</a> <a href="ident?i=sti">sti</a>(); <a name=L75 href="source/kernel/blk_drv/ll_rw_blk.c#L75">75</a> (dev->request_fn)(); <a name=L76 href="source/kernel/blk_drv/ll_rw_blk.c#L76">76</a> return; <a name=L77 href="source/kernel/blk_drv/ll_rw_blk.c#L77">77</a> } <a name=L78 href="source/kernel/blk_drv/ll_rw_blk.c#L78">78</a> for ( ; tmp->next ; tmp=tmp->next) <a name=L79 href="source/kernel/blk_drv/ll_rw_blk.c#L79">79</a> if ((<a href="ident?i=IN_ORDER">IN_ORDER</a>(tmp,req) || <a name=L80 href="source/kernel/blk_drv/ll_rw_blk.c#L80">80</a> !<a href="ident?i=IN_ORDER">IN_ORDER</a>(tmp,tmp->next)) && <a name=L81 href="source/kernel/blk_drv/ll_rw_blk.c#L81">81</a> <a href="ident?i=IN_ORDER">IN_ORDER</a>(req,tmp->next)) <a name=L82 href="source/kernel/blk_drv/ll_rw_blk.c#L82">82</a> break; <a name=L83 href="source/kernel/blk_drv/ll_rw_blk.c#L83">83</a> req->next=tmp->next; <a name=L84 href="source/kernel/blk_drv/ll_rw_blk.c#L84">84</a> tmp->next=req; <a name=L85 href="source/kernel/blk_drv/ll_rw_blk.c#L85">85</a> <a href="ident?i=sti">sti</a>(); <a name=L86 href="source/kernel/blk_drv/ll_rw_blk.c#L86">86</a> } <a name=L87 href="source/kernel/blk_drv/ll_rw_blk.c#L87">87</a> <a name=L88 href="source/kernel/blk_drv/ll_rw_blk.c#L88">88</a> static void <a href="ident?i=make_request">make_request</a>(int major,int rw, struct <a href="ident?i=buffer_head">buffer_head</a> * bh) <a name=L89 href="source/kernel/blk_drv/ll_rw_blk.c#L89">89</a> { <a name=L90 href="source/kernel/blk_drv/ll_rw_blk.c#L90">90</a> struct <a href="ident?i=request">request</a> * req; <a name=L91 href="source/kernel/blk_drv/ll_rw_blk.c#L91">91</a> int rw_ahead; <a name=L92 href="source/kernel/blk_drv/ll_rw_blk.c#L92">92</a> <a name=L93 href="source/kernel/blk_drv/ll_rw_blk.c#L93">93</a> <b><i>/* WRITEA/READA is special case - it is not really needed, so if the */</i></b> <a name=L94 href="source/kernel/blk_drv/ll_rw_blk.c#L94">94</a> <b><i>/* buffer is locked, we just forget about it, else it's a normal read */</i></b> <a name=L95 href="source/kernel/blk_drv/ll_rw_blk.c#L95">95</a> if (rw_ahead = (rw == <a href="ident?i=READA">READA</a> || rw == <a href="ident?i=WRITEA">WRITEA</a>)) { <a name=L96 href="source/kernel/blk_drv/ll_rw_blk.c#L96">96</a> if (bh->b_lock) <a name=L97 href="source/kernel/blk_drv/ll_rw_blk.c#L97">97</a> return; <a name=L98 href="source/kernel/blk_drv/ll_rw_blk.c#L98">98</a> if (rw == <a href="ident?i=READA">READA</a>) <a name=L99 href="source/kernel/blk_drv/ll_rw_blk.c#L99">99</a> rw = <a href="ident?i=READ">READ</a>;<a name=L100 href="source/kernel/blk_drv/ll_rw_blk.c#L100">100</a> else<a name=L101 href="source/kernel/blk_drv/ll_rw_blk.c#L101">101</a> rw = <a href="ident?i=WRITE">WRITE</a>;<a name=L102 href="source/kernel/blk_drv/ll_rw_blk.c#L102">102</a> }<a name=L103 href="source/kernel/blk_drv/ll_rw_blk.c#L103">103</a> if (rw!=<a href="ident?i=READ">READ</a> && rw!=<a href="ident?i=WRITE">WRITE</a>)<a name=L104 href="source/kernel/blk_drv/ll_rw_blk.c#L104">104</a> <a href="ident?i=panic">panic</a>(<i>"Bad block dev command, must be R/W/RA/WA"</i>);<a name=L105 href="source/kernel/blk_drv/ll_rw_blk.c#L105">105</a> <a href="ident?i=lock_buffer">lock_buffer</a>(bh);<a name=L106 href="source/kernel/blk_drv/ll_rw_blk.c#L106">106</a> if ((rw == <a href="ident?i=WRITE">WRITE</a> && !bh->b_dirt) || (rw == <a href="ident?i=READ">READ</a> && bh->b_uptodate)) {<a name=L107 href="source/kernel/blk_drv/ll_rw_blk.c#L107">107</a> <a href="ident?i=unlock_buffer">unlock_buffer</a>(bh);<a name=L108 href="source/kernel/blk_drv/ll_rw_blk.c#L108">108</a> return;<a name=L109 href="source/kernel/blk_drv/ll_rw_blk.c#L109">109</a> }<a name=L110 href="source/kernel/blk_drv/ll_rw_blk.c#L110">110</a> repeat:<a name=L111 href="source/kernel/blk_drv/ll_rw_blk.c#L111">111</a> <b><i>/* we don't allow the write-requests to fill up the queue completely:</i></b><a name=L112 href="source/kernel/blk_drv/ll_rw_blk.c#L112">112</a> <b><i> * we want some room for reads: they take precedence. The last third</i></b><a name=L113 href="source/kernel/blk_drv/ll_rw_blk.c#L113">113</a> <b><i> * of the requests are only for reads.</i></b><a name=L114 href="source/kernel/blk_drv/ll_rw_blk.c#L114">114</a> <b><i> */</i></b><a name=L115 href="source/kernel/blk_drv/ll_rw_blk.c#L115">115</a> if (rw == <a href="ident?i=READ">READ</a>)<a name=L116 href="source/kernel/blk_drv/ll_rw_blk.c#L116">116</a> req = <a href="ident?i=request">request</a>+<a href="ident?i=NR_REQUEST">NR_REQUEST</a>;<a name=L117 href="source/kernel/blk_drv/ll_rw_blk.c#L117">117</a> else<a name=L118 href="source/kernel/blk_drv/ll_rw_blk.c#L118">118</a> req = <a href="ident?i=request">request</a>+((<a href="ident?i=NR_REQUEST">NR_REQUEST</a>*2)/3);<a name=L119 href="source/kernel/blk_drv/ll_rw_blk.c#L119">119</a> <b><i>/* find an empty request */</i></b><a name=L120 href="source/kernel/blk_drv/ll_rw_blk.c#L120">120</a> while (--req >= <a href="ident?i=request">request</a>)<a name=L121 href="source/kernel/blk_drv/ll_rw_blk.c#L121">121</a> if (req->dev<0)<a name=L122 href="source/kernel/blk_drv/ll_rw_blk.c#L122">122</a> break;<a name=L123 href="source/kernel/blk_drv/ll_rw_blk.c#L123">123</a> <b><i>/* if none found, sleep on new requests: check for rw_ahead */</i></b><a name=L124 href="source/kernel/blk_drv/ll_rw_blk.c#L124">124</a> if (req < <a href="ident?i=request">request</a>) {<a name=L125 href="source/kernel/blk_drv/ll_rw_blk.c#L125">125</a> if (rw_ahead) {<a name=L126 href="source/kernel/blk_drv/ll_rw_blk.c#L126">126</a> <a href="ident?i=unlock_buffer">unlock_buffer</a>(bh);<a name=L127 href="source/kernel/blk_drv/ll_rw_blk.c#L127">127</a> return;<a name=L128 href="source/kernel/blk_drv/ll_rw_blk.c#L128">128</a> }<a name=L129 href="source/kernel/blk_drv/ll_rw_blk.c#L129">129</a> <a href="ident?i=sleep_on">sleep_on</a>(&<a href="ident?i=wait_for_request">wait_for_request</a>);<a name=L130 href="source/kernel/blk_drv/ll_rw_blk.c#L130">130</a> goto repeat;<a name=L131 href="source/kernel/blk_drv/ll_rw_blk.c#L131">131</a> }<a name=L132 href="source/kernel/blk_drv/ll_rw_blk.c#L132">132</a> <b><i>/* fill up the request-info, and add it to the queue */</i></b><a name=L133 href="source/kernel/blk_drv/ll_rw_blk.c#L133">133</a> req->dev = bh->b_dev;<a name=L134 href="source/kernel/blk_drv/ll_rw_blk.c#L134">134</a> req->cmd = rw;<a name=L135 href="source/kernel/blk_drv/ll_rw_blk.c#L135">135</a> req->errors=0;<a name=L136 href="source/kernel/blk_drv/ll_rw_blk.c#L136">136</a> req-><a href="ident?i=sector">sector</a> = bh->b_blocknr<<1;<a name=L137 href="source/kernel/blk_drv/ll_rw_blk.c#L137">137</a> req->nr_sectors = 2;<a name=L138 href="source/kernel/blk_drv/ll_rw_blk.c#L138">138</a> req->buffer = bh->b_data;<a name=L139 href="source/kernel/blk_drv/ll_rw_blk.c#L139">139</a> req->waiting = <a href="ident?i=NULL">NULL</a>;<a name=L140 href="source/kernel/blk_drv/ll_rw_blk.c#L140">140</a> req->bh = bh;<a name=L141 href="source/kernel/blk_drv/ll_rw_blk.c#L141">141</a> req->next = <a href="ident?i=NULL">NULL</a>;<a name=L142 href="source/kernel/blk_drv/ll_rw_blk.c#L142">142</a> <a href="ident?i=add_request">add_request</a>(major+<a href="ident?i=blk_dev">blk_dev</a>,req);<a name=L143 href="source/kernel/blk_drv/ll_rw_blk.c#L143">143</a> }<a name=L144 href="source/kernel/blk_drv/ll_rw_blk.c#L144">144</a> <a name=L145 href="source/kernel/blk_drv/ll_rw_blk.c#L145">145</a> void <a href="ident?i=ll_rw_block">ll_rw_block</a>(int rw, struct <a href="ident?i=buffer_head">buffer_head</a> * bh)<a name=L146 href="source/kernel/blk_drv/ll_rw_blk.c#L146">146</a> {<a name=L147 href="source/kernel/blk_drv/ll_rw_blk.c#L147">147</a> unsigned int major;<a name=L148 href="source/kernel/blk_drv/ll_rw_blk.c#L148">148</a> <a name=L149 href="source/kernel/blk_drv/ll_rw_blk.c#L149">149</a> if ((major=<a href="ident?i=MAJOR">MAJOR</a>(bh->b_dev)) >= <a href="ident?i=NR_BLK_DEV">NR_BLK_DEV</a> ||<a name=L150 href="source/kernel/blk_drv/ll_rw_blk.c#L150">150</a> !(<a href="ident?i=blk_dev">blk_dev</a>[major].request_fn)) {<a name=L151 href="source/kernel/blk_drv/ll_rw_blk.c#L151">151</a> <a href="ident?i=printk">printk</a>(<i>"Trying to read nonexistent block-device\n\r"</i>);<a name=L152 href="source/kernel/blk_drv/ll_rw_blk.c#L152">152</a> return;<a name=L153 href="source/kernel/blk_drv/ll_rw_blk.c#L153">153</a> }<a name=L154 href="source/kernel/blk_drv/ll_rw_blk.c#L154">154</a> <a href="ident?i=make_request">make_request</a>(major,rw,bh);<a name=L155 href="source/kernel/blk_drv/ll_rw_blk.c#L155">155</a> }<a name=L156 href="source/kernel/blk_drv/ll_rw_blk.c#L156">156</a> <a name=L157 href="source/kernel/blk_drv/ll_rw_blk.c#L157">157</a> void <a href="ident?i=blk_dev_init">blk_dev_init</a>(void)<a name=L158 href="source/kernel/blk_drv/ll_rw_blk.c#L158">158</a> {<a name=L159 href="source/kernel/blk_drv/ll_rw_blk.c#L159">159</a> int i;<a name=L160 href="source/kernel/blk_drv/ll_rw_blk.c#L160">160</a> <a name=L161 href="source/kernel/blk_drv/ll_rw_blk.c#L161">161</a> for (i=0 ; i<<a href="ident?i=NR_REQUEST">NR_REQUEST</a> ; i++) {<a name=L162 href="source/kernel/blk_drv/ll_rw_blk.c#L162">162</a> <a href="ident?i=request">request</a>[i].dev = -1;<a name=L163 href="source/kernel/blk_drv/ll_rw_blk.c#L163">163</a> <a href="ident?i=request">request</a>[i].next = <a href="ident?i=NULL">NULL</a>;<a name=L164 href="source/kernel/blk_drv/ll_rw_blk.c#L164">164</a> }<a name=L165 href="source/kernel/blk_drv/ll_rw_blk.c#L165">165</a> }<a name=L166 href="source/kernel/blk_drv/ll_rw_blk.c#L166">166</a> </pre><hr><div align=center> [<b><i>源代码浏览</i></b>] [<a href="diff/kernel/blk_drv/ll_rw_blk.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 + -