<?xml version="1.0" encoding="utf-8"?>

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:cc="http://web.resource.org/cc/"
  xmlns="http://purl.org/rss/1.0/">

<channel rdf:about="http://blog.miraclelinux.com/uraura/">
<title>路地裏 ソース解読研究所</title>
<link>http://blog.miraclelinux.com/uraura/</link>
<description>日々遭遇する疑問・難問を解決すべくさまざまなソースを解析して得た知識や経験など、知っていると役に立つ技術情報を公開していきます。</description>
<dc:language>ja-JP</dc:language>
<dc:creator></dc:creator>
<dc:date>2006-09-26T16:30:41+09:00</dc:date>
<admin:generatorAgent rdf:resource="http://www.typepad.com/" />


<items>
<rdf:Seq><rdf:li rdf:resource="http://blog.miraclelinux.com/uraura/2006/09/post_9308.html" />
<rdf:li rdf:resource="http://blog.miraclelinux.com/uraura/2006/08/post_5be9.html" />
<rdf:li rdf:resource="http://blog.miraclelinux.com/uraura/2006/07/post_ef9a.html" />
<rdf:li rdf:resource="http://blog.miraclelinux.com/uraura/2006/07/210_0bbe.html" />
<rdf:li rdf:resource="http://blog.miraclelinux.com/uraura/2006/07/post_43ac.html" />
<rdf:li rdf:resource="http://blog.miraclelinux.com/uraura/2006/07/post_3d31.html" />
<rdf:li rdf:resource="http://blog.miraclelinux.com/uraura/2006/07/kernel2617spinl_0b84.html" />
<rdf:li rdf:resource="http://blog.miraclelinux.com/uraura/2006/07/post_80d9.html" />
<rdf:li rdf:resource="http://blog.miraclelinux.com/uraura/2006/07/dump1__1352.html" />
<rdf:li rdf:resource="http://blog.miraclelinux.com/uraura/2006/07/dump__b6ee.html" />
</rdf:Seq>
</items>

</channel>

<item rdf:about="http://blog.miraclelinux.com/uraura/2006/09/post_9308.html">
<title>「路地裏ソース解読研究所」ブログ閉鎖について</title>
<link>http://blog.miraclelinux.com/uraura/2006/09/post_9308.html</link>
<description>当ブログをご覧の皆様へ 武田保真が株式会社ミラクル・リナックスを退職したことに伴...</description>
<content:encoded>&lt;p&gt;当ブログをご覧の皆様へ&lt;/p&gt;

&lt;p&gt;武田保真が株式会社ミラクル・リナックスを退職したことに伴い、&lt;br /&gt;
当ブログを閉鎖・休止させていただくことになりましたことを、&lt;br /&gt;
お知らせさせていただきます。&lt;/p&gt;

&lt;p&gt;
ブログ開設以来たくさんの方にご支援を頂き、誠にありがとうございました。&lt;/p&gt;</content:encoded>


<dc:subject>その他</dc:subject>

<dc:creator>MIRACLE LINUX</dc:creator>
<dc:date>2006-09-26T16:30:41+09:00</dc:date>
</item>
<item rdf:about="http://blog.miraclelinux.com/uraura/2006/08/post_5be9.html">
<title>岡山カーネル勉強会</title>
<link>http://blog.miraclelinux.com/uraura/2006/08/post_5be9.html</link>
<description>8/5(土)に無事、岡山カーネル勉強会を行うことができました。 その中で、私はc...</description>
<content:encoded>&lt;p&gt;8/5(土)に無事、岡山カーネル勉強会を行うことができました。&lt;/p&gt;

&lt;p&gt;その中で、私はcrashコマンドの使い方を中心に、一部ハンズオンのような形で&lt;br /&gt;実際にみなさんで一緒にcrashを使ってみながら、カーネル内部を覗いていくということが簡単にできるんだということを体感していただきました。&lt;/p&gt;

&lt;p&gt;私のセッションの流れとしては、&lt;br /&gt;- VMwareでcrashをすぐに使えるMIRACLEV4.0環境をDVD-Rで配布。みなさんのノートPCで起動。&lt;br /&gt;- 当日の資料にはdiskdumpやnetdumpに関する資料が無かったので、少し口頭で説明しました。&lt;br /&gt;&amp;nbsp; - なぜダンプが必要か?&lt;br /&gt;&amp;nbsp; &amp;nbsp; - カーネルPANICが発生した瞬間のログやメッセージは、syslogでは記録されない。&lt;br /&gt;&amp;nbsp; &amp;nbsp; - カーネルダンプを取得することで、問題の原因が何であるか追及することができる。&lt;/p&gt;

&lt;p&gt;- crashの使い方&lt;br /&gt;&amp;nbsp; 1. 稼働中カーネルのメモリ内容を簡単に見るためにcrashを使う方法&lt;br /&gt;&amp;nbsp; 2. sysrq+cによる強制PANICを実施。カーネルダンプファイルを作成&lt;br /&gt;&amp;nbsp; 3. 作成したダンプファイルを見ながらcrashの使い方を勉強&lt;/p&gt;

&lt;p&gt;こういった流れで説明をしていきました。&lt;br /&gt;カーネルの事を知らない方が対象でしたので、うまく伝えきることができない部分もありましたが、「crashを使ってカーネルの勉強することができる」というのは新しい発見でした。&lt;/p&gt;

&lt;p&gt;当日の資料を載せておきますので、ぜひ参考にしてみてください。&lt;br /&gt;&lt;a href=&quot;http://blog.miraclelinux.com/uraura/files/kernel_study_20060805.pdf&quot;&gt;kernel_study_20060805.pdfをダウンロード&lt;/a&gt;

&lt;/p&gt;</content:encoded>


<dc:subject>カーネル</dc:subject>

<dc:creator>yasuma</dc:creator>
<dc:date>2006-08-07T09:00:00+09:00</dc:date>
</item>
<item rdf:about="http://blog.miraclelinux.com/uraura/2006/07/post_ef9a.html">
<title>ファイルシステムに関する情報源</title>
<link>http://blog.miraclelinux.com/uraura/2006/07/post_ef9a.html</link>
<description>みなさんは、WikiPediaを使ったことはありますか。 今回、たまたまGoog...</description>
<content:encoded>&lt;p&gt;みなさんは、WikiPediaを使ったことはありますか。&lt;/p&gt;

&lt;p&gt;今回、たまたまGoogle検索の結果でWikiPediaのページがひっかかったのですが、&lt;br /&gt;英語版は内容が充実していますね。&lt;/p&gt;

&lt;p&gt;参考までに、Linuxの3つのファイルシステムに関するページを見てください。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Ext3 : &lt;a href=&quot;http://en.wikipedia.org/wiki/Ext3&quot;&gt;http://en.wikipedia.org/wiki/Ext3&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;XFS : &lt;a href=&quot;http://en.wikipedia.org/wiki/XFS&quot;&gt;http://en.wikipedia.org/wiki/XFS&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;ReiserFS : &lt;a href=&quot;http://en.wikipedia.org/wiki/ReiserFS&quot;&gt;http://en.wikipedia.org/wiki/ReiserFS&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;弊社でもよくファイルシステムの制限値などに関して問い合わせを受けることがあるのですが、一般的な内容に関しては上記のページの内容で十分すぎるほどに記載されています。&lt;br /&gt;日本語で記載されていないので、少し障壁が高いかもしれませんが情報源としては、非常に価値のあるものだと思います。&lt;br /&gt;ぜひ、みなさんも活用してみてはいかがでしょうか。&lt;br /&gt;&lt;/p&gt;</content:encoded>


<dc:subject>カーネル</dc:subject>

<dc:creator>yasuma</dc:creator>
<dc:date>2006-07-28T16:24:00+09:00</dc:date>
</item>
<item rdf:about="http://blog.miraclelinux.com/uraura/2006/07/210_0bbe.html">
<title>2進数と10進数の区別</title>
<link>http://blog.miraclelinux.com/uraura/2006/07/210_0bbe.html</link>
<description>最近、Linuxに関連するドキュメントなどで、KiBとかGiBといった単位を目に...</description>
<content:encoded>&lt;p&gt;最近、Linuxに関連するドキュメントなどで、KiBとかGiBといった単位を目にする機会が増えてきました。&lt;br /&gt;詳細については、&lt;a href=&quot;http://www.asahi-net.or.jp/~ax2s-kmtn/ref/unit.html&quot;&gt;このあたりのドキュメント&lt;/a&gt;が詳しいのですが、ギガやテラといった桁になると、2進数での計算結果と、10進数での計算結果の差が大きくなるので明確に使い分けなければ、大きな誤解を招くことになるために、2進数用の単位としてKiBやGiBを使うことが一般的になりつつあるようです。&lt;/p&gt;

&lt;p&gt;HDDは100ギガバイトですが、メモリは1ギビバイトというべきみたいです。&lt;br /&gt;みなさんも「キロ、メガ、ギガ、テラ、ペタ」を覚えたら、「キビ、メビ、ギビ、テビ、ペビ」を覚えて使いこなしてみてはいかがでしょうか。&lt;/p&gt;

&lt;p&gt;何も知らない人が聞くと、どれも呪文のようですね。&lt;/p&gt;</content:encoded>


<dc:subject>OS</dc:subject>

<dc:creator>yasuma</dc:creator>
<dc:date>2006-07-27T16:14:25+09:00</dc:date>
</item>
<item rdf:about="http://blog.miraclelinux.com/uraura/2006/07/post_43ac.html">
<title>岡山カーネル勉強会(詳細)</title>
<link>http://blog.miraclelinux.com/uraura/2006/07/post_43ac.html</link>
<description>先日お知らせした岡山カーネル勉強会ですが、内容もほぼ固まりつつありますので、改め...</description>
<content:encoded>&lt;p&gt;先日お知らせした岡山カーネル勉強会ですが、内容もほぼ固まりつつありますので、改めてご紹介しておきます。&lt;/p&gt;

&lt;p&gt;8/5(土) 13:00-18:00に岡山理科大学にて実施します。&lt;br /&gt;詳細確認、申し込みはこちらのwikiにてお願いします。&lt;br /&gt;&lt;a href=&quot;http://hira.main.jp/wiki/pukiwiki.php?%B2%AC%BB%B3%A5%AB%A1%BC%A5%CD%A5%EB%CA%D9%B6%AF%B2%F1&quot;&gt;岡山カーネル勉強会&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;さて私の担当の時間ですが、MIRACLE LINUX V4.0を使って、「crashを使ってカーネル内部を覗いて見よう」という内容で実施しようと思い準備中です。&lt;/p&gt;

&lt;p&gt;そこで、当日の実演用にVMware Player用のMIRACLE LINUX V4.0環境を用意しています。&lt;br /&gt;MIRACLE LINUX V4.0の最小構成インストールに、kernel-debuginfoや、crashコマンドの最新版など、カーネル内部を覗いて見るのに必要なものを含めています。&lt;br /&gt;X Windowなどを除くことで2GB程度のイメージに抑えることができましたので、DVD-Rで参加者のみなさんにも実行環境としてお渡しする予定です。&lt;br /&gt;当日、ノートPCを持ってこられる方は、ぜひVMware Playerをインストールしておいてください。もちろんVMware Workstationとかがインストールされているならば、そちらでも構いません。&lt;/p&gt;

&lt;p&gt;USB接続のDVD-ROMドライブを持参する予定ですので、DVD-ROMドライブが付いていない方でも、PCにコピーしてもらって使ってもらおうと思っています。

&lt;/p&gt;

&lt;p&gt;あとはリモートログインするために、Windows環境の方はputtyなどのssh端末を用意しておくと便利だと思います。&lt;/p&gt;

&lt;p&gt;当日の私の発表資料については、後日、本BLOGに掲載する予定です。&lt;/p&gt;

&lt;p&gt;それではみなさんの参加をお待ちしています。&lt;/p&gt;</content:encoded>


<dc:subject>カーネル</dc:subject>

<dc:creator>yasuma</dc:creator>
<dc:date>2006-07-26T10:49:22+09:00</dc:date>
</item>
<item rdf:about="http://blog.miraclelinux.com/uraura/2006/07/post_3d31.html">
<title>ダンプを解析する技術と伝える技術</title>
<link>http://blog.miraclelinux.com/uraura/2006/07/post_3d31.html</link>
<description>ひらさんの「困難は手法を見つける手がかり」に書かれている「記憶力の限界」というの...</description>
<content:encoded>&lt;p&gt;ひらさんの「&lt;a href=&quot;http://d.hatena.ne.jp/hira_sosuke/20060724/1153725651&quot;&gt;困難は手法を見つける手がかり&lt;/a&gt;」に書かれている「記憶力の限界」というのは、私自身、ダンプ解析の際には、そのたびごとにソースを眺めながらダンプを追っていることからも、自分の記憶力に限界があることは明白だ。&lt;/p&gt;

&lt;p&gt;ひらさんはソースコードを解析する手法として「ひらメソッド」と呼ぶ、記録による新しい解析手法を提案している。&lt;/p&gt;

&lt;p&gt;一方の私がブログに最近書いているのは、ダンプ解析やカーネル内部を覗く手法ということで、まだ私の中で方法論として確立されていない方法ではあるが、自分がやったことを単に書くという形で披露している。&lt;br /&gt;ただ、弊社吉岡のエントリ「&lt;a href=&quot;http://blog.miraclelinux.com/yume/2006/07/post_93da.html&quot;&gt;プロセスプログラミングの実践方法&lt;/a&gt;」にも書かれているとおり、作業の記録をとることがその第一歩であるというのは共通の認識だ。&lt;/p&gt;

&lt;p&gt;ひらさんのサイトにある言葉で「記録力」を高める第一歩が、私にとってはブログにダンプ解析の経緯を記録することであったりする。&lt;br /&gt;技術や知識が記録になった時点で、その記録を通じて他人とそれらを共有することが可能になると思う。そしてその記録は自分の記憶力の限界も越えることができる。&lt;/p&gt;

&lt;p&gt;私のブログも、読者との技術・知識の共有の素となることを願って書いている。&lt;/p&gt;

&lt;p&gt;そして、その内容をいかにうまく伝えるか、それを私は「技術をことばにする」と呼んでいる。いかに上手に「ことば」にできるかで、相手に伝わる技術、伝わらない技術が出てきてしまう。&lt;/p&gt;

&lt;p&gt;この「ことば」の洗練方法を学んでいると思う今日このごろです。&lt;/p&gt;</content:encoded>


<dc:subject>カーネルダンプ</dc:subject>

<dc:creator>yasuma</dc:creator>
<dc:date>2006-07-25T09:00:00+09:00</dc:date>
</item>
<item rdf:about="http://blog.miraclelinux.com/uraura/2006/07/kernel2617spinl_0b84.html">
<title>kernel-2.6.17でのspinlockのオーナー情報</title>
<link>http://blog.miraclelinux.com/uraura/2006/07/kernel2617spinl_0b84.html</link>
<description>先日のダンプ内のSPINLOCKのコメント欄で話題になっていたspinlockの...</description>
<content:encoded>&lt;p&gt;先日の&lt;a href=&quot;http://blog.miraclelinux.com/uraura/2006/07/spinlock_7418.html&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;ダンプ内のSPINLOCK&lt;/span&gt;&lt;/a&gt;のコメント欄で話題になっていたspinlockのオーナーの特定についてですが、少し調べてみました。&lt;/p&gt;

&lt;p&gt;Fedora Core 5のUpdateカーネルとして提供されている2.6.17-1.2157_FC5と&lt;span style=&quot;text-decoration: underline;&quot;&gt;、&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://people.redhat.com/anderson/&quot;&gt;http://people.redhat.com/anderson/&lt;/a&gt; で提供されているcrash-4.0-2.33の組み合わせでカーネルの内部を覗いて見ました。&lt;/p&gt;

&lt;p&gt;kernel-debuginfoは、&lt;br /&gt;ftp://ftp.kddlabs.co.jp/pub/Linux/distributions/fedora/core/updates/5/i386/debug/kernel-debuginfo-2.6.17-1.2157_FC5.i686.rpm&lt;/p&gt;

&lt;p&gt;あたりからダウンロードしてきます。約800MB程度ありますので、ご注意を。&lt;/p&gt;

&lt;p&gt;まず最初にkernel-2.6.17-1.2157_FC5.i686.rpmをインストールし、そのカーネルで起動します。&lt;/p&gt;

&lt;p&gt;続いて、kernel-debuginfo-2.6.17-1.2157_FC5.i686.rpmと、crash-4.0-2.33.i386.rpmをインストールしてから下記の操作を行います。&lt;/p&gt;

&lt;p&gt;-------------&lt;br /&gt;# uname -r&lt;br /&gt;2.6.17-1.2157_FC5&lt;br /&gt;# crash /boot/System.map-2.6.17-1.2157_FC5&lt;br /&gt;crash&amp;gt; ps&lt;br /&gt;--------------&lt;br /&gt;で適当なプロセス(syslogdなどが良いでしょう)を選択して、filesコマンドでファイル一覧を表示させます。&lt;/p&gt;

&lt;p&gt;----------------------&lt;/p&gt;

&lt;p&gt;crash&amp;gt; files 1473 &lt;/p&gt;

&lt;p&gt;PID: 1473&amp;nbsp; &amp;nbsp;TASK: c1321550&amp;nbsp; CPU: 0&amp;nbsp; &amp;nbsp;COMMAND: &amp;quot;syslogd&amp;quot;
&lt;/p&gt;

&lt;p&gt;ROOT: /&amp;nbsp; &amp;nbsp; CWD: /
&lt;br /&gt; FD&amp;nbsp; &amp;nbsp; FILE&amp;nbsp; &amp;nbsp;&amp;nbsp; DENTRY&amp;nbsp; &amp;nbsp; INODE&amp;nbsp; &amp;nbsp; TYPE&amp;nbsp; PATH
&amp;nbsp; &lt;br /&gt;0&amp;nbsp; c132e500&amp;nbsp; d08fe6e0&amp;nbsp; d1c985b4&amp;nbsp; SOCK&amp;nbsp; socket:/[3800]
&amp;nbsp; &lt;br /&gt;1&amp;nbsp; d1af3d80&amp;nbsp; d0a1f930&amp;nbsp; d0a47b58&amp;nbsp; REG&amp;nbsp; &amp;nbsp;/var/log/messages
&amp;nbsp; &lt;br /&gt;2&amp;nbsp; c12c7900&amp;nbsp; d0a1f9c4&amp;nbsp; d0a478b4&amp;nbsp; REG&amp;nbsp; &amp;nbsp;/var/log/secure
&amp;nbsp; &lt;br /&gt;3&amp;nbsp; d1c965c0&amp;nbsp; d08fe2d4&amp;nbsp; d0a47610&amp;nbsp; REG&amp;nbsp; &amp;nbsp;/var/log/maillog
&amp;nbsp; &lt;br /&gt;4&amp;nbsp; d1dc78c0&amp;nbsp; d08fe240&amp;nbsp; d0a4736c&amp;nbsp; REG&amp;nbsp; &amp;nbsp;/var/log/cron
&amp;nbsp; &lt;br /&gt;5&amp;nbsp; d1dc7a40&amp;nbsp; d08feef8&amp;nbsp; d0a470c8&amp;nbsp; REG&amp;nbsp; &amp;nbsp;/var/log/spooler
&amp;nbsp; &lt;br /&gt;6&amp;nbsp; c13c10c0&amp;nbsp; d0a1fc14&amp;nbsp; d0a62dfc&amp;nbsp; REG&amp;nbsp; &amp;nbsp;/var/log/boot.log&lt;br /&gt;-----------------&lt;br /&gt;次にinode情報を表示させてみます。&lt;br /&gt;-----------------&lt;br /&gt;crash&amp;gt; struct inode d0a62dfc&lt;br /&gt;....&lt;br /&gt;&amp;nbsp; i_lock = {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; raw_lock = {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;slock = 1&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;magic = 3735899821,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;owner_cpu = 4294967295,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;owner = 0xffffffff&lt;br /&gt;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;....&lt;br /&gt;-------&lt;br /&gt;というように、spinlockをつかんでいるownerのエントリを確認することができるようになっていました。&lt;br /&gt;今回は、稼動中のカーネルの情報を見ましたので、実際にspinlockを取得している瞬間ではないためownerのエントリが0xffffffffに初期化されていましたが、実際のデッドロックの発生時など、ダンプファイルからデッドロックの原因特定に役立つことは間違いなさそうです。&lt;/p&gt;</content:encoded>


<dc:subject>カーネルダンプ</dc:subject>

<dc:creator>yasuma</dc:creator>
<dc:date>2006-07-24T09:00:00+09:00</dc:date>
</item>
<item rdf:about="http://blog.miraclelinux.com/uraura/2006/07/post_80d9.html">
<title>ログイン時のサウンド</title>
<link>http://blog.miraclelinux.com/uraura/2006/07/post_80d9.html</link>
<description>みなさんはMIRACLE LINUX V4.0のログイン時のサウンドって聞いたこ...</description>
<content:encoded>&lt;p&gt;みなさんはMIRACLE LINUX V4.0のログイン時のサウンドって聞いたことがありますか?&lt;/p&gt;

&lt;p&gt;実を言うと、私は、今日、初めて聞きました。&lt;br /&gt;なにしろ社内にあるのはサーバーばかりで、サウンドカードもスピーカーも付いていないマシンばかりなのです。&lt;br /&gt;風の噂でログインサウンドが鳴るというのは知っていたのですが、実際のサウンドは初めてでした。偶然、ヘッドフォンをつないでいて気づきました。&lt;/p&gt;

&lt;p&gt;このサウンドを作ったのは我が社ではなく、多分RedFlag社だと思いますが、なかなかいけています。3社でAsianuxを共同開発しているのでお互いの得意分野を活かすという部分の一端ですね。&lt;/p&gt;

&lt;p&gt;ちなみに簡単に聞く方法としては、Windows上のVMwareにML40をインストールして、VMwareのサウンドも有効にしておくことです。startxするとサウンドが聞こえてきます。&lt;br /&gt;ぜひお試しあれ。&lt;/p&gt;</content:encoded>


<dc:subject>OS</dc:subject>

<dc:creator>yasuma</dc:creator>
<dc:date>2006-07-20T09:00:00+09:00</dc:date>
</item>
<item rdf:about="http://blog.miraclelinux.com/uraura/2006/07/dump1__1352.html">
<title>dump解析(1) 二の巻</title>
<link>http://blog.miraclelinux.com/uraura/2006/07/dump1__1352.html</link>
<description>さて、前回、buffer_headを特定したものの、なぜこのbuffer_hea...</description>
<content:encoded>&lt;p&gt;さて、前回、buffer_headを特定したものの、なぜこのbuffer_headがロックされたままとなっているのか分かりません。&lt;br /&gt;さらに調べを進めていきたいと思います。&lt;/p&gt;

&lt;p&gt;__wait_on_buffer()でなぜ待ちつづけるかというと、__wait_on_buffer()内のsync_buffer()でバッファのロックが解除されないからです。&lt;br /&gt;では、sync_buffer()を調べてみましょう。&lt;br /&gt;-----&lt;br /&gt;fs/buffer.c&lt;br /&gt;static void sync_buffer(struct buffer_head *bh)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; struct block_device *bd;&lt;/p&gt;

&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; smp_mb();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; bd = bh-&amp;gt;b_bdev;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; if (bd)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; blk_run_address_space(bd-&amp;gt;bd_inode-&amp;gt;i_mapping);&lt;br /&gt;}&lt;br /&gt;-----&lt;/p&gt;

&lt;p&gt;ここで、b_bdevは、前回、0xf7f10a80が入っていましたので、blk_run_address_space()が実行されるはずです。そこで、bd-&amp;gt;bd_inode-&amp;gt;i_mappingを調べてみます。&lt;br /&gt;----&lt;br /&gt;crash&amp;gt; struct block_device 0xf7f10a80&lt;br /&gt;struct block_device {&lt;br /&gt;&amp;nbsp; bd_dev = 9437185,&lt;br /&gt;&amp;nbsp; bd_inode = 0xf7f10af4,&lt;br /&gt;&amp;nbsp; bd_openers = 1,&lt;br /&gt;-----&lt;br /&gt;さらにbd_inodeを調べます。&lt;br /&gt;------&lt;br /&gt;crash&amp;gt; struct inode 0xf7f10af4&lt;br /&gt;struct inode {&lt;br /&gt;&amp;nbsp; i_hash = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; next = 0x0,&lt;br /&gt;&amp;nbsp; &amp;nbsp; pprev = 0xf54527f4&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;...略 ...&lt;br /&gt;&amp;nbsp; i_op = 0xc046cae0,&lt;br /&gt;&amp;nbsp; i_fop = 0xc046cb40,&lt;br /&gt;&amp;nbsp; i_sb = 0xf7f47200,&lt;br /&gt;&amp;nbsp; i_flock = 0x0,&lt;br /&gt;&amp;nbsp; i_mapping = 0xf7f10ba4,&lt;br /&gt;&amp;nbsp; i_data = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; host = 0xf7f10af4,&lt;br /&gt;&amp;nbsp; &amp;nbsp; page_tree = {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;height = 4,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;gfp_mask = 544,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;rnode = 0xf620be38&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;--------&lt;/p&gt;

&lt;p&gt;i_mapping=0xf7f10ba4が入っていますので、さらに進んで&lt;br /&gt;-----&lt;br /&gt;static inline void blk_run_address_space(struct address_space *mapping)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; if (mapping)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; blk_run_backing_dev(mapping-&amp;gt;backing_dev_info, NULL);&lt;br /&gt;}&lt;br /&gt;------&lt;br /&gt;ということになります。mapping-&amp;gt;backing_dev_infoを調べてみます。&lt;br /&gt;-----&lt;br /&gt;crash&amp;gt; &lt;strong&gt;struct address_space 0xf7f10ba4&lt;/strong&gt;&lt;br /&gt;&amp;nbsp; host = 0xf7f10af4,&lt;br /&gt; ...&lt;br /&gt; backing_dev_info = 0xf74acec8,&lt;br /&gt; ...&lt;br /&gt;-----&lt;br /&gt;このbacking_dev_infoを使うのは、blk_run_backing_dev()です。&lt;br /&gt;-----&lt;br /&gt;static inline void blk_run_backing_dev(struct backing_dev_info *bdi,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;struct page *page)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; if (bdi &amp;amp;&amp;amp; bdi-&amp;gt;unplug_io_fn)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; bdi-&amp;gt;unplug_io_fn(bdi, page);&lt;br /&gt;}&lt;br /&gt;----&lt;br /&gt;どこまでも地道な作業が進みます...。&lt;br /&gt;----&lt;br /&gt;crash&amp;gt; &lt;strong&gt;struct backing_dev_info 0xf74acec8&lt;/strong&gt;&lt;br /&gt;struct backing_dev_info {&lt;br /&gt;&amp;nbsp; ra_pages = 32,&lt;br /&gt;&amp;nbsp; state = 0,&lt;br /&gt;&amp;nbsp; memory_backed = 0,&lt;br /&gt;&amp;nbsp; congested_fn = 0,&lt;br /&gt;&amp;nbsp; congested_data = 0x0,&lt;br /&gt;&amp;nbsp; unplug_io_fn = 0xc022446f &amp;lt;blk_backing_dev_unplug&amp;gt;,&lt;br /&gt;&amp;nbsp; unplug_io_data = 0xf74acd80&lt;br /&gt;}&lt;br /&gt;-----&lt;/p&gt;

&lt;p&gt;ようやくデバイスのリクエストキューの部分まで来ました。ちなみにここで、*pageはNULLです。&lt;br /&gt;------&lt;br /&gt;static void blk_backing_dev_unplug(struct backing_dev_info *bdi,&lt;/p&gt;

&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; struct page *page)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; request_queue_t *q = bdi-&amp;gt;unplug_io_data;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; /*&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;* devices don&#39;t necessarily have an -&amp;gt;unplug_fn defined&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; if (q-&amp;gt;unplug_fn)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; q-&amp;gt;unplug_fn(q);&lt;br /&gt;}&lt;br /&gt;------&lt;/p&gt;

&lt;p&gt;上記関数内の&lt;/p&gt;

&lt;p&gt;-----&lt;br /&gt;&lt;strong&gt;request_queue_t *q = bdi-&amp;gt;unplug_io_data;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;-----&lt;/p&gt;

&lt;p&gt;これがI/Oリクエストキューであることが判明しました。&lt;/p&gt;

&lt;p&gt;----&lt;br /&gt;&amp;nbsp; unplug_io_data = &lt;strong&gt;0xf74acd80&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-----&lt;/p&gt;

&lt;p&gt;それならば、リクエストキューの中身を確認します。&lt;/p&gt;

&lt;p&gt;-----&lt;br /&gt;crash&amp;gt; &lt;strong&gt;struct request_queue_t 0xf74acd80&lt;/strong&gt;&lt;br /&gt;struct request_queue_t No struct type named request_queue_t.&lt;br /&gt;----&lt;br /&gt;エ、エラーでした。&lt;br /&gt;気を取り直して、&lt;br /&gt;-----&lt;br /&gt;$ &lt;strong&gt;cd include/linux&lt;/strong&gt;&lt;br /&gt;$ &lt;strong&gt;grep request_queue_t *&lt;/strong&gt;&lt;br /&gt;blkdev.h:typedef struct request_queue request_queue_t;&lt;br /&gt;-----&lt;br /&gt;ということで、request_queue型が正しいようなので、改めて、&lt;br /&gt;-----&lt;br /&gt;crash&amp;gt; &lt;strong&gt;struct request_queue 0xf74acd80&lt;/strong&gt;&lt;br /&gt;struct request_queue {&lt;br /&gt;&amp;nbsp; queue_head = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; next = 0x0,&lt;br /&gt;&amp;nbsp; &amp;nbsp; prev = 0x0&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; lasstruct request_queue {&lt;br /&gt;&amp;nbsp; queue_head = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; next = 0x0,&lt;br /&gt;&amp;nbsp; &amp;nbsp; prev = 0x0&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; last_merge = 0x0,&lt;br /&gt;&amp;nbsp; elevator = {&lt;br /&gt;t_merge = 0x0,&lt;br /&gt;&amp;nbsp; elevator = {&lt;br /&gt;... 略 ...&lt;br /&gt;&amp;nbsp; request_fn = 0,&lt;br /&gt;&amp;nbsp; back_merge_fn = 0,&lt;br /&gt;&amp;nbsp; front_merge_fn = 0,&lt;br /&gt;&amp;nbsp; merge_requests_fn = 0,&lt;br /&gt;&amp;nbsp; make_request_fn = 0xf883992e,&lt;br /&gt;&amp;nbsp; prep_rq_fn = 0,&lt;br /&gt;&amp;nbsp; unplug_fn = 0xf88396ef,&lt;br /&gt;&amp;nbsp; merge_bvec_fn = 0,&lt;br /&gt;&amp;nbsp; activity_fn = 0,&lt;br /&gt;&amp;nbsp; issue_flush_fn = 0xc026e939 &amp;lt;md_flush_all&amp;gt;,&lt;br /&gt;&amp;nbsp; unplug_timer = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; entry = {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;next = 0x0,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;prev = 0x0&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; expires = 0,&lt;br /&gt;&amp;nbsp; &amp;nbsp; lock = {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;lock = 1,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;magic = 3735899821&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; magic = 1267182958,&lt;br /&gt;&amp;nbsp; &amp;nbsp; function = 0xc0224488 &amp;lt;blk_unplug_timeout&amp;gt;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; data = 4148874624,&lt;br /&gt;&amp;nbsp; &amp;nbsp; base = 0x0&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; unplug_thresh = 4,&lt;br /&gt;&amp;nbsp; unplug_delay = 3,&lt;br /&gt;&amp;nbsp; unplug_work = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; pending = 0,&lt;br /&gt;&amp;nbsp; &amp;nbsp; entry = {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;next = 0xf74ace90,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;prev = 0xf74ace90&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; func = 0xc022447f &amp;lt;blk_unplug_work&amp;gt;,&lt;br /&gt;...以下略。&lt;br /&gt;-------&lt;br /&gt;となっています。&lt;br /&gt;-----&lt;br /&gt;&amp;nbsp; unplug_fn = 0xf88396ef&lt;br /&gt;-----&lt;br /&gt;が設定されているので、&lt;br /&gt;------&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; if (q-&amp;gt;unplug_fn)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; q-&amp;gt;unplug_fn(q);&lt;br /&gt;------&lt;br /&gt;は実行されているはずです。&lt;br /&gt;------&lt;br /&gt;crash&amp;gt; &lt;strong&gt;sym 0xf88396ef&lt;/strong&gt;&lt;br /&gt;f88396ef (t) raid1_unplug&lt;br /&gt;------&lt;/p&gt;



&lt;p&gt;これでようやくsync_buffer()したときに、今対象としているbuffer_headに対しては、raid1_unplug()という処理が行われるんだなぁ〜というところまでたどり着きました。&lt;/p&gt;

&lt;p&gt;------&lt;br /&gt;static void raid1_unplug(request_queue_t *q)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; unplug_slaves(q-&amp;gt;queuedata);&lt;br /&gt;}&lt;br /&gt;----&lt;br /&gt;q-&amp;gt;queuedataが必要みたいなので、再度request_queueの中身に戻って、&lt;br /&gt;----&lt;br /&gt;queuedata = 0xf7f2e400,&lt;br /&gt;----&lt;br /&gt;を得ます。&lt;/p&gt;

&lt;p&gt;unplug_slaves()は、各RAIDレベルごとに用意されている関数なので、raid1.cのunplug_slaves()を確認します。&lt;/p&gt;

&lt;p&gt;-----&lt;/p&gt;

&lt;p&gt;static void unplug_slaves(mddev_t *mddev)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; conf_t *conf = mddev_to_conf(mddev);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; int i;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; unsigned long flags;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; spin_lock_irqsave(&amp;amp;conf-&amp;gt;device_lock, flags);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; for (i=0; i&amp;lt;mddev-&amp;gt;raid_disks; i++) {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; mdk_rdev_t *rdev = conf-&amp;gt;mirrors[i].rdev;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if (rdev &amp;amp;&amp;amp; atomic_read(&amp;amp;rdev-&amp;gt;nr_pending)) {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;request_queue_t *r_queue = bdev_get_queue(rdev-&amp;gt;bdev);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;atomic_inc(&amp;amp;rdev-&amp;gt;nr_pending);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;spin_unlock_irqrestore(&amp;amp;conf-&amp;gt;device_lock, flags);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;if (r_queue-&amp;gt;unplug_fn)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; r_queue-&amp;gt;unplug_fn(r_queue);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;spin_lock_irqsave(&amp;amp;conf-&amp;gt;device_lock, flags);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;rdev_dec_pending(rdev, mddev);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; spin_unlock_irqrestore(&amp;amp;conf-&amp;gt;device_lock, flags);&lt;br /&gt;}&lt;br /&gt;-------&lt;/p&gt;

&lt;p&gt;まず、*confを導くために、mddev_to_conf()を確認してみます。&lt;/p&gt;

&lt;p&gt;------&lt;br /&gt;typedef struct r1_private_data_s conf_t;&lt;/p&gt;

&lt;p&gt;#define mddev_to_conf(mddev) ((conf_t *) mddev-&amp;gt;private)&lt;br /&gt;------&lt;/p&gt;

&lt;p&gt;ということなので、&lt;/p&gt;

&lt;p&gt;------&lt;br /&gt;crash&amp;gt; &lt;strong&gt;struct conf_t 0xf7f2e400&lt;/strong&gt;&lt;br /&gt;struct: cannot handle &amp;quot;conf_t&amp;quot;: try &amp;quot;gdb whatis&amp;quot; or &amp;quot;gdb ptype&amp;quot;&lt;/p&gt;

&lt;p&gt;------&lt;/p&gt;

&lt;p&gt;そういえば、さきほどconf_tはtypedefされていたので...&lt;/p&gt;

&lt;p&gt;-----&lt;br /&gt;crash&amp;gt; &lt;strong&gt;struct r1_private_data_s 0xf7f2e400&lt;/strong&gt;&lt;br /&gt;struct: cannot handle &amp;quot;r1_private_data_s&amp;quot;: try &amp;quot;gdb whatis&amp;quot; or &amp;quot;gdb ptype&amp;quot;&lt;br /&gt;------&lt;br /&gt;まだだめです。そういえば、raid1.koをロードしていないので、structが判別できないんですね。&lt;/p&gt;

&lt;p&gt;-----&lt;br /&gt;crash&amp;gt; &lt;strong&gt;mod&lt;/strong&gt;&lt;br /&gt; MODULE&amp;nbsp; &amp;nbsp;NAME&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;SIZE&amp;nbsp; OBJECT FILE&lt;br /&gt;f8825e80&amp;nbsp; sd_mod&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;20480&amp;nbsp; (not loaded)&amp;nbsp; [CONFIG_KALLSYMS]&lt;br /&gt;f883cb00&amp;nbsp; raid1&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 19584&amp;nbsp; (not loaded)&amp;nbsp; [CONFIG_KALLSYMS]&lt;br /&gt;.....&lt;/p&gt;

&lt;p&gt;-----&lt;/p&gt;

&lt;p&gt;そこで、raid1.koをロードします。&lt;/p&gt;

&lt;p&gt;-----&lt;/p&gt;

&lt;p&gt;crash&amp;gt; &lt;strong&gt;mod -s raid1 raid1.ko&lt;/strong&gt;&lt;br /&gt; MODULE&amp;nbsp; &amp;nbsp;NAME&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;SIZE&amp;nbsp; OBJECT FILE&lt;br /&gt;f883cb00&amp;nbsp; raid1&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 19584&amp;nbsp; raid1.ko&lt;br /&gt;-----&lt;/p&gt;

&lt;p&gt;再度、confを調べます。&lt;br /&gt;-----&lt;br /&gt;crash&amp;gt; &lt;strong&gt;struct r1_private_data_s 0xf7f2e400&lt;/strong&gt;&lt;br /&gt;
struct: cannot handle &amp;quot;r1_private_data_s&amp;quot;: try &amp;quot;gdb whatis&amp;quot; or &amp;quot;gdb ptype&amp;quot;&lt;br /&gt;-----&lt;/p&gt;

&lt;p&gt;やっぱりだめです。&lt;/p&gt;

&lt;p&gt;注: これは実はkernel-debuginfoに含まれるraid1.ko.debugをロードすれば問題なくstructコマンドで解析できることに後で気づきました。&lt;/p&gt;

&lt;p&gt;とにかく、うまくいかなかったので、&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;----&lt;br /&gt;crash&amp;gt; rd 0xf7f2e400 100&lt;br /&gt;
f7f2e400:&amp;nbsp; f7e5d800 f883ca80 00900001 00000001&amp;nbsp; &amp;nbsp;................&lt;br /&gt;
f7f2e410:&amp;nbsp; f7e5d880 f7e5d880 00000000 00000000&amp;nbsp; &amp;nbsp;................&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;-----&lt;/p&gt;

&lt;p&gt;*mddev = f7e5d800 ということがメモリダンプから分かります。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;include/linux/raid/md_k.hから&lt;/p&gt;

&lt;p&gt;-----&lt;br /&gt;typedef struct mddev_s mddev_t;&lt;br /&gt;-----&lt;/p&gt;

&lt;p&gt;となっているので、&lt;/p&gt;

&lt;p&gt;-----&lt;br /&gt;crash&amp;gt; &lt;strong&gt;struct mddev_s f7e5d800&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;struct mddev_s {&lt;br /&gt;&amp;nbsp; &lt;strong&gt;private = 0xf7f2e400&lt;/strong&gt;,&lt;br /&gt;&amp;nbsp; pers = 0xf74a2f80,&lt;br /&gt;&amp;nbsp; unit = 2,&lt;br /&gt;&amp;nbsp; md_minor = 1,&lt;/p&gt;

&lt;p&gt;-----&lt;/p&gt;

&lt;p&gt;*conf = 0xf7f2e400 ということが分かります。&lt;/p&gt;

&lt;p&gt;さらに次のルーチンで、raidのディスクごとの処理をしているので、raid_disksの&lt;/p&gt;

&lt;p&gt;数値を探します。&lt;/p&gt;

&lt;p&gt;-----&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; for (i=0; i&amp;lt;mddev-&amp;gt;raid_disks; i++) {&lt;br /&gt;-----&lt;/p&gt;

&lt;p&gt;すると、&lt;br /&gt;-----&lt;br /&gt;&amp;nbsp; layout = -135931836,&lt;br /&gt;&lt;strong&gt;&amp;nbsp; raid_disks = -135931836,&lt;/strong&gt;&lt;br /&gt;&amp;nbsp; max_disks = 1,&lt;br /&gt;-----&lt;/p&gt;

&lt;p&gt;と、異常な数値になっています。&lt;/p&gt;

&lt;p&gt;その結果、raid_disksの数値が負のため、各ディスクに対するI/O発行処理のループが実行されず、バッファのステータスが変わらなかったために、ストールが発生したと思われます。&lt;/p&gt;

&lt;p&gt;最後は非常にあっさりしたものでしたが、そこまでにたどり着くまでは非常に地道にデータとソースを確認する作業が続くのでした。&lt;/p&gt;</content:encoded>



<dc:creator>yasuma</dc:creator>
<dc:date>2006-07-19T09:00:00+09:00</dc:date>
</item>
<item rdf:about="http://blog.miraclelinux.com/uraura/2006/07/dump__b6ee.html">
<title>dump解析(1) 一の巻</title>
<link>http://blog.miraclelinux.com/uraura/2006/07/dump__b6ee.html</link>
<description>本エントリはダンプ解析について知ってもらうために多少編集している部分がありますが...</description>
<content:encoded>&lt;p&gt;本エントリはダンプ解析について知ってもらうために多少編集している部分がありますが、ご了承ください。&lt;/p&gt;

&lt;p&gt;ML40でのダンプ解析には、&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;vmcore(ダンプ本体)&lt;/li&gt;

&lt;li&gt;vmlinux(kernel-debuginfoに入っている)&lt;/li&gt;

&lt;li&gt;System.map(kernelパッケージに入っている)&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;が必要です。&lt;/p&gt;

&lt;p&gt;ダンプの解析開始は、通常こんな感じで始まります。&lt;/p&gt;

&lt;p&gt;-----&lt;br /&gt;# &lt;strong&gt;cd /var/crash/10.1.0.111-xxxx/&lt;/strong&gt;&lt;br /&gt;# &lt;strong&gt;crash /boot/System.map-2.6.9-34.21AXsmp /usr/lib/debug/lib/modules/2.6.9-34.21AXsmp/modules/vmlinux vmcore&lt;/strong&gt;&lt;br /&gt;----&lt;/p&gt;


&lt;p&gt; まず何をするかというと、どこでpanicしたのか確認するために、btです。&lt;br /&gt;----&lt;br /&gt;crash&amp;gt; &lt;strong&gt;bt&lt;/strong&gt;&lt;br /&gt;PID: 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;TASK: c0322a80&amp;nbsp; CPU: 0&amp;nbsp; &amp;nbsp;COMMAND: &amp;quot;swapper&amp;quot;&lt;br /&gt; #0 [c0393f10] start_disk_dump at f8e0eced&lt;br /&gt; #1 [c0393f2c] die_nmi at c0106bbb&lt;br /&gt; #2 [c0393f44] unknown_nmi_panic_callback at c0117a97&lt;br /&gt; #3 [c0393f9c] do_nmi at c0106cec&lt;br /&gt; #4 [c0393fa4] nmi at c02d536c&lt;br /&gt;&amp;nbsp; &amp;nbsp; EAX: 00000000&amp;nbsp; EBX: c0393000&amp;nbsp; ECX: 00000000&amp;nbsp; EDX: 00000000&amp;nbsp; EBP: 004ba007&lt;br /&gt;&amp;nbsp; &amp;nbsp; DS:&amp;nbsp; 007b&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;ESI: 00000000&amp;nbsp; ES:&amp;nbsp; 007b&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;EDI: c03cf120&lt;br /&gt;&amp;nbsp; &amp;nbsp; CS:&amp;nbsp; 0060&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;EIP: c01040e8&amp;nbsp; ERR: 00000000&amp;nbsp; EFLAGS: 00000246&lt;br /&gt; #5 [c0393fe0] mwait_idle at c01040e8&lt;br /&gt; #6 [c0393fec] start_kernel at c039478f&lt;br /&gt; #7 [c0393ffc] is386 at c010020c&lt;br /&gt;-----&lt;br /&gt;これを見ると、swaperプロセスなので、idleプロセス中でpanicが発生していることが分かります。&lt;/p&gt;

&lt;p&gt;しかも、#4 [c0393fa4] nmi at c02d536c これは、NMIによる割り込みが発生したのがpanicの要因であることも見て取れます。&lt;br /&gt;普通、こういう場合は、マシンのNMIボタンを押すなどして、能動的に取得したdumpファイルであることがほとんどです。こういったパターンでは、マシンがストールして、何も操作を受け付けなくなり、最後の手段としてNMIによるダンプ取得を行うのが普通です。&lt;/p&gt;
&lt;p&gt;次にどんなプロセスが動いていたのか調べてみます。&lt;br /&gt;-----&lt;br /&gt;crash&amp;gt; ps&lt;/p&gt;

&lt;p&gt;&amp;nbsp; &amp;nbsp;PID&amp;nbsp; &amp;nbsp; PPID&amp;nbsp; CPU&amp;nbsp; &amp;nbsp;TASK&amp;nbsp; &amp;nbsp; ST&amp;nbsp; %MEM&amp;nbsp; &amp;nbsp;&amp;nbsp; VSZ&amp;nbsp; &amp;nbsp; RSS&amp;nbsp; COMM&lt;br /&gt;&amp;gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;0&amp;nbsp; c0322a80&amp;nbsp; RU&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; [swapper]&lt;br /&gt;&amp;gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;1&amp;nbsp; f7e110b0&amp;nbsp; RU&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; [swapper]&lt;br /&gt;&amp;gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;2&amp;nbsp; f7e10b30&amp;nbsp; RU&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; [swapper]&lt;br /&gt;&amp;gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;3&amp;nbsp; f7e105b0&amp;nbsp; RU&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; [swapper]&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;0&amp;nbsp; f7e11630&amp;nbsp; IN&amp;nbsp; &amp;nbsp;0.1&amp;nbsp; &amp;nbsp; 3280&amp;nbsp; &amp;nbsp; 632&amp;nbsp; init&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;2&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;0&amp;nbsp; f7e10030&amp;nbsp; IN&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; [migration/0]&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;3&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;0&amp;nbsp; f7e256b0&amp;nbsp; RU&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; [ksoftirqd/0]&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;4&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;1&amp;nbsp; f7e25130&amp;nbsp; IN&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; [migration/1]&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;5&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;1&amp;nbsp; f7e24bb0&amp;nbsp; IN&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; [ksoftirqd/1]&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;6&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;2&amp;nbsp; f7e24630&amp;nbsp; IN&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; [migration/2]&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;7&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;2&amp;nbsp; f7e240b0&amp;nbsp; IN&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; [ksoftirqd/2]&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;8&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;3&amp;nbsp; f7e99730&amp;nbsp; IN&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; [migration/3]&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;9&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;3&amp;nbsp; f7e991b0&amp;nbsp; IN&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; [ksoftirqd/3]&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; 10&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;0&amp;nbsp; f7e98c30&amp;nbsp; IN&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; [events/0]&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; 11&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;1&amp;nbsp; f7e986b0&amp;nbsp; IN&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; [events/1]&lt;br /&gt;... 以下略 ...&lt;/p&gt;

&lt;p&gt;------&lt;/p&gt;

&lt;p&gt;各プロセスごとに、どのような状況にあるか確認するためには、btにPIDを付けます。&lt;/p&gt;

&lt;p&gt;------&lt;br /&gt;crash&amp;gt; bt 11&lt;br /&gt;PID: 11&amp;nbsp; &amp;nbsp;&amp;nbsp; TASK: f7e986b0&amp;nbsp; CPU: 1&amp;nbsp; &amp;nbsp;COMMAND: &amp;quot;events/1&amp;quot;&lt;br /&gt; #0 [f7feef08] schedule at c02d2699&lt;br /&gt; #1 [f7feef6c] worker_thread at c013109f&lt;br /&gt; #2 [f7feefd0] kthread at c01346eb&lt;br /&gt; #3 [f7feeff0] kernel_thread_helper at c01041f3&lt;br /&gt;------&lt;/p&gt;

&lt;p&gt;今回、ストールが発生しているということで、ステータスが「&lt;strong&gt; UN&lt;/strong&gt;」になっているプロセスについて調べた結果、PID 287(kjournald)のプロセスのタスクが__wait_on_buffer()で、バッファがロックされたままで、ロックが&lt;br /&gt;解放されるのを待っている状態でした。&lt;/p&gt;

&lt;p&gt;__wait_on_buffer()は、&lt;br /&gt;-----&lt;br /&gt;void __wait_on_buffer(struct buffer_head * bh)&lt;br /&gt;-----&lt;br /&gt;と宣言されているので、buffer_headへのポインタを引数として1つだけ持ちます。&lt;/p&gt;

&lt;p&gt;そのため、どこのバッファを待っているのか確認するために、btに-fオプションを付けてみました。&lt;/p&gt;



&lt;p&gt;------&lt;br /&gt;crash &amp;gt; &lt;strong&gt;bt -f 287&lt;/strong&gt;&lt;br /&gt;PID: 287&amp;nbsp; &amp;nbsp; TASK: f760aeb0&amp;nbsp; CPU: 2&amp;nbsp; &amp;nbsp;COMMAND: &amp;quot;kjournald&amp;quot;&lt;br /&gt; #0 [f7551d30] schedule at c02d26a5&lt;br /&gt;&amp;nbsp; &amp;nbsp; [RA: c02d2e36&amp;nbsp; SP: f7551d30&amp;nbsp; FP: f7551d94&amp;nbsp; SIZE: 104]&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551d30: f7551d90&amp;nbsp; 00000046&amp;nbsp; 0000001b&amp;nbsp; 00000000&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551d40: f7e10b30&amp;nbsp; f74fc630&amp;nbsp; 00000019&amp;nbsp; c2025de0&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551d50: f74fc630&amp;nbsp; 00000000&amp;nbsp; c202e740&amp;nbsp; c2025de0&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551d60: 00000002&amp;nbsp; 0000031e&amp;nbsp; 1fa4329b&amp;nbsp; 00000180&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551d70: f7e10b30&amp;nbsp; f760aeb0&amp;nbsp; f760b01c&amp;nbsp; 00000018&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551d80: 00000008&amp;nbsp; c2025de0&amp;nbsp; c0469b80&amp;nbsp; f39e765c&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551d90: f7551d9c&amp;nbsp; c02d2e36&lt;br /&gt; #1 [f7551d94] io_schedule at c02d2e31&lt;br /&gt;&amp;nbsp; &amp;nbsp; [RA: c015c6d4&amp;nbsp; SP: f7551d98&amp;nbsp; FP: f7551da0&amp;nbsp; SIZE: 12]&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551d98: f54819d4&amp;nbsp; f4307e00&amp;nbsp; c015c6d4&lt;br /&gt; #2 [f7551da0] __wait_on_buffer at c015c6cf&lt;br /&gt;&amp;nbsp; &amp;nbsp; [RA: f8e96ac2&amp;nbsp; SP: f7551da4&amp;nbsp; FP: f7551dec&amp;nbsp; SIZE: 76]&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551da4: f54819d4&amp;nbsp; 00000000&amp;nbsp; f760aeb0&amp;nbsp; c015c57c&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551db4: f7551dd4&amp;nbsp; f7551dd4&amp;nbsp; c015f391&amp;nbsp; 00006e30&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551dc4: f54819d4&amp;nbsp; 00000000&amp;nbsp; f760aeb0&amp;nbsp; c015c57c&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551dd4: c0469b88&amp;nbsp; c0469b88&amp;nbsp; 00000013&amp;nbsp; f7551de8&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551de4: f54819d4&amp;nbsp; 00000013&amp;nbsp; f8e96ac2&lt;br /&gt; #3 [f7551dec] journal_commit_transaction at f8e96abd&lt;br /&gt;&amp;nbsp; &amp;nbsp; [RA: f8e98e8d&amp;nbsp; SP: f7551df0&amp;nbsp; FP: f7551f68&amp;nbsp; SIZE: 380]&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551df0: 00000001&amp;nbsp; 00000000&amp;nbsp; 00000f54&amp;nbsp; f679e0ac&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551e00: 00000000&amp;nbsp; 00000000&amp;nbsp; 00000000&amp;nbsp; f7f2b200&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551e10: f39e765c&amp;nbsp; 00000dc6&amp;nbsp; 00000000&amp;nbsp; f760aeb0&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551e20: c0120a59&amp;nbsp; f7551e44&amp;nbsp; f7551e44&amp;nbsp; f74f21a0&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551e30: f7e38dc0&amp;nbsp; 00000001&amp;nbsp; 00000000&amp;nbsp; f760aeb0&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551e40: c0120a59&amp;nbsp; f7551e44&amp;nbsp; f7551e44&amp;nbsp; 00000007&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551e50: ffffffe3&amp;nbsp; 00003029&amp;nbsp; f677c5c4&amp;nbsp; f3d98ba8&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551e60: f3d987cc&amp;nbsp; f3d98b40&amp;nbsp; f3d98ee8&amp;nbsp; f3d985c4&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551e70: f3d98b0c&amp;nbsp; f3d98d14&amp;nbsp; f3d98320&amp;nbsp; f3d98590&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551e80: f3871180&amp;nbsp; f3871694&amp;nbsp; f5f1c938&amp;nbsp; f5e00b40&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551e90: f5e00250&amp;nbsp; f5e00c44&amp;nbsp; f3c99f84&amp;nbsp; f54815c4&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551ea0: f54819d4&amp;nbsp; f3d98660&amp;nbsp; f3d98660&amp;nbsp; f3d98660&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551eb0: f3d98660&amp;nbsp; f3d98660&amp;nbsp; f3d98660&amp;nbsp; f3d98660&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551ec0: f3d98660&amp;nbsp; f3d98660&amp;nbsp; f3d98660&amp;nbsp; f3d98660&lt;br /&gt;------ &lt;/p&gt;

&lt;p&gt;__wait_on_bufferのbh(buffer_head)をきちんと特定するため、もう少し調べると、&lt;/p&gt;

&lt;p&gt;-----&lt;br /&gt;void __wait_on_buffer(struct buffer_head * bh)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; wait_queue_head_t *wqh = bh_waitq_head(bh);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; DEFINE_BH_WAIT(wait, bh);&lt;/p&gt;

&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; do {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; prepare_to_wait(wqh, &amp;amp;wait.wait, TASK_UNINTERRUPTIBLE);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if (buffer_locked(bh)) {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;sync_buffer(bh);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;io_schedule();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; } while (buffer_locked(bh));&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; finish_wait(wqh, &amp;amp;wait.wait);&lt;br /&gt;}&lt;br /&gt;----------------&lt;br /&gt;というコードになっています。&lt;br /&gt;さらに DEFINE_BH_WAIT(wait, bh);はマクロなので、内容をみると、&lt;br /&gt;------&lt;br /&gt;#define __DEFINE_BH_WAIT(name, b, f)&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;\&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; struct bh_wait_queue name = {&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; .bh&amp;nbsp; &amp;nbsp;&amp;nbsp; = b,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; .wait&amp;nbsp; &amp;nbsp;= {&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;\&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; .task&amp;nbsp; &amp;nbsp;= current,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; \&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; .flags&amp;nbsp; = f,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; \&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; .func&amp;nbsp; &amp;nbsp;= bh_wake_function,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; \&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; .task_list =&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; \&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; LIST_HEAD_INIT(name.wait.task_list),\&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;},&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; \&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;#define DEFINE_BH_WAIT(name, bh)&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; __DEFINE_BH_WAIT(name, bh, 0)&lt;br /&gt;-----&lt;br /&gt;このようになっています。&lt;/p&gt;

&lt;p&gt;もういちど__wait_on_buffer()のスタックに注目します。&lt;/p&gt;

&lt;p&gt;------&lt;br /&gt; #2 [f7551da0] __wait_on_buffer at c015c6cf&lt;br /&gt;&amp;nbsp; &amp;nbsp; [RA: f8e96ac2&amp;nbsp; SP: f7551da4&amp;nbsp; FP: f7551dec&amp;nbsp; SIZE: 76]&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551da4: f54819d4&amp;nbsp; 00000000&amp;nbsp; f760aeb0&amp;nbsp; c015c57c&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551db4: f7551dd4&amp;nbsp; f7551dd4&amp;nbsp; c015f391&amp;nbsp; 00006e30&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551dc4: f54819d4&amp;nbsp; 00000000&amp;nbsp; f760aeb0&amp;nbsp; c015c57c&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551dd4: c0469b88&amp;nbsp; c0469b88&amp;nbsp; 00000013&amp;nbsp; f7551de8&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551de4: f54819d4&amp;nbsp; 00000013&amp;nbsp; f8e96ac2&lt;br /&gt;-----&lt;br /&gt;この部分の&lt;br /&gt;-----&lt;br /&gt;&amp;nbsp; &amp;nbsp; f7551da4: f54819d4&amp;nbsp; &lt;strong&gt;00000000 &lt;/strong&gt; f760aeb0&amp;nbsp; c015c57c&lt;br /&gt;-----&lt;br /&gt;に注目すると、00000000のエントリ、つまり 0がスタックに入れられている箇所があります。&lt;/p&gt;

&lt;p&gt;0をスタックに入れている箇所を探すために、disコマンドで__wait_on_buffer()を逆アセンブルします。&lt;/p&gt;

&lt;p&gt;-----&lt;br /&gt;crash&amp;gt; dis __wait_on_buffer&lt;br /&gt;0xc015c668 &amp;lt;__wait_on_buffer&amp;gt;:&amp;nbsp; push&amp;nbsp; &amp;nbsp;%esi&lt;br /&gt;0xc015c669 &amp;lt;__wait_on_buffer+1&amp;gt;:&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; push&amp;nbsp; &amp;nbsp;%ebx&lt;br /&gt;0xc015c66a &amp;lt;__wait_on_buffer+2&amp;gt;:&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; sub&amp;nbsp; &amp;nbsp; $0x40,%esp&lt;br /&gt;0xc015c66d &amp;lt;__wait_on_buffer+5&amp;gt;:&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; mov&amp;nbsp; &amp;nbsp; %eax,%ebx&lt;br /&gt;0xc015c66f &amp;lt;__wait_on_buffer+7&amp;gt;:&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; call&amp;nbsp; &amp;nbsp;0xc015c53b &amp;lt;bh_waitq_head&amp;gt;&lt;br /&gt;0xc015c674 &amp;lt;__wait_on_buffer+12&amp;gt;:&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; mov&amp;nbsp; &amp;nbsp; %ebx,(%esp)&lt;br /&gt;0xc015c677 &amp;lt;__wait_on_buffer+15&amp;gt;:&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; mov&amp;nbsp; &amp;nbsp; %eax,%esi&lt;br /&gt;0xc015c679 &amp;lt;__wait_on_buffer+17&amp;gt;:&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; mov&amp;nbsp; &amp;nbsp; $0xfffff000,%eax&lt;br /&gt;&lt;strong&gt;0xc015c67e &amp;lt;__wait_on_buffer+22&amp;gt;:&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; movl&amp;nbsp; &amp;nbsp;$0x0,0x4(%esp)&lt;/strong&gt;&lt;br /&gt;0xc015c686 &amp;lt;__wait_on_buffer+30&amp;gt;:&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; and&amp;nbsp; &amp;nbsp; %esp,%eax&lt;br /&gt;-----&lt;/p&gt;

&lt;p&gt;すると0xc015c67eの命令でスタックに0を入れています。&lt;/p&gt;

&lt;p&gt;これは、さきほどの&lt;br /&gt;-----&lt;br /&gt;#define DEFINE_BH_WAIT(name, bh)&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; __DEFINE_BH_WAIT(name, bh, &lt;strong&gt;0&lt;/strong&gt;)&lt;br /&gt;-----&lt;br /&gt;の0のことだと気づきます。(ここは経験と&lt;strong&gt;勘&lt;/strong&gt;です。)&lt;/p&gt;

&lt;p&gt;すると、そのマクロの中に、&lt;br /&gt;-----&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; .task&amp;nbsp; &amp;nbsp;= current,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; \&lt;br /&gt;-----&lt;br /&gt;という行があることが分かります。currentというと、このプロセスのtask_structのポインタを表しますので、psの結果、&lt;br /&gt;------&lt;br /&gt;&amp;nbsp; &amp;nbsp; 287&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp;2&amp;nbsp; f760aeb0&amp;nbsp; UN&amp;nbsp; &amp;nbsp;0.0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0&amp;nbsp; [kjournald]&lt;br /&gt;------&lt;br /&gt;より、currentがf760aeb0であることが分かります。&lt;br /&gt;再度、さきほどのスタックのデータを見るとまさに同じ値が格納されています。&lt;br /&gt;-----&lt;br /&gt;
&amp;nbsp; &amp;nbsp; f7551da4: f54819d4&amp;nbsp; 00000000&lt;strong&gt;&amp;nbsp;&lt;/strong&gt; &lt;strong&gt;f760aeb0&lt;/strong&gt;&amp;nbsp; c015c57c&lt;br /&gt;
-----&lt;br /&gt;さらに、&lt;br /&gt;-----&lt;br /&gt;

&amp;nbsp; &amp;nbsp; f7551da4: f54819d4&amp;nbsp; 00000000&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;f760aeb0&lt;strong&gt;&amp;nbsp;&lt;/strong&gt; &lt;strong&gt;c015c57c&lt;/strong&gt;&lt;br /&gt;

-----&lt;br /&gt;の値を確認するために、次のコマンドを実行します。&lt;br /&gt;-----&lt;br /&gt;crash&amp;gt; &lt;strong&gt;sym c015c57c&lt;/strong&gt;&lt;br /&gt;c015c57c (t) bh_wake_function&lt;br /&gt;----&lt;/p&gt;

&lt;p&gt;これはまさに先ほどのマクロ中の&lt;br /&gt;-----&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; .func&amp;nbsp; &amp;nbsp;= &lt;strong&gt;bh_wake_function,&lt;/strong&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; \&lt;br /&gt;-----&lt;br /&gt;です。ということは、必然的に、その前にある&lt;/p&gt;



&lt;p&gt;-----&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; .bh&amp;nbsp; &amp;nbsp;&amp;nbsp; = b,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/p&gt;

&lt;p&gt;------&lt;br /&gt;が&lt;br /&gt;------&lt;br /&gt;&amp;nbsp; &amp;nbsp;f7551da4: &lt;strong&gt;f54819d4&lt;/strong&gt;&amp;nbsp; 00000000&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;f760aeb0&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;c015c57c&lt;br /&gt;-----

&lt;/p&gt;

&lt;p&gt;であることが分かります。&lt;/p&gt;

&lt;p&gt;そこで、このbuffer_head構造体のデータをstructコマンドで確認してみます。&lt;br /&gt;-------&lt;br /&gt;crash&amp;gt; &lt;strong&gt;struct buffer_head 0xf54819d4&lt;/strong&gt;&lt;br /&gt;struct buffer_head {&lt;br /&gt;&amp;nbsp; b_state = 24605,&lt;br /&gt;&amp;nbsp; b_this_page = 0x0,&lt;br /&gt;&amp;nbsp; b_page = 0xc16c71e0,&lt;br /&gt;&amp;nbsp; b_count = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; counter = 2&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; b_size = 4096,&lt;br /&gt;&amp;nbsp; b_blocknr = 3526,&lt;br /&gt;&amp;nbsp; b_data = 0xf638f000 &amp;quot;&amp;lt;A4&amp;gt;\201&amp;quot;,&lt;br /&gt;&amp;nbsp; b_bdev = 0xf7f10a80,&lt;br /&gt;&amp;nbsp; b_end_io = 0xf8e96184,&lt;br /&gt;&amp;nbsp; b_private = 0xf39e765c,&lt;br /&gt;&amp;nbsp; b_assoc_buffers = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; next = 0xf5481a00,&lt;br /&gt;&amp;nbsp; &amp;nbsp; prev = 0xf5481a00&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;-----&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;b_end_io = 0xf8e96184 が設定されています。b_end_ioは、IO完了時に呼び出す後処理の関数アドレスなので、調べてみます。&lt;/p&gt;

&lt;p&gt;-----&lt;/p&gt;

&lt;p&gt;crash &amp;gt; &lt;strong&gt;sym 0xf8e96184&lt;/strong&gt;&lt;br /&gt;f8e96184 (t) journal_end_buffer_io_sync&lt;br /&gt;-----&lt;/p&gt;

&lt;p&gt;普通に、ジャーナルの完了処理のようです。&lt;br /&gt;では、このページのロックが解放されない理由を探さなければなりません。&lt;/p&gt;

&lt;p&gt;このバッファのページは、b_bdev = 0xf7f10a80 ですので、これが指すブロックデバイスを特定します。&lt;/p&gt;

&lt;p&gt;b_bdevは、buffer_head構造体の中で、次のように宣言されています。&lt;/p&gt;

&lt;p&gt;------&lt;/p&gt;

&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; struct block_device *b_bdev;&lt;br /&gt;------&lt;/p&gt;

&lt;p&gt;そこで、ブロックデバイスの情報を確認します。&lt;br /&gt;-------&lt;/p&gt;

&lt;p&gt;crash &amp;gt; &lt;strong&gt;struct block_device 0xf8e96184&lt;/strong&gt;&lt;br /&gt;struct block_device {&lt;br /&gt;&amp;nbsp; bd_dev = 9437185,&lt;br /&gt;&amp;nbsp; bd_inode = 0xf7f10af4,&lt;br /&gt;&amp;nbsp; bd_openers = 1,&lt;br /&gt;&amp;nbsp; bd_sem = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; count = {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;counter = 1&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; sleepers = 0,&lt;br /&gt;&amp;nbsp; &amp;nbsp; wait = {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;lock = {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; lock = 1,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; magic = 3735899821&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;task_list = {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; next = 0xf7f10a9c,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; prev = 0xf7f10a9c&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; bd_mount_sem = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; count = {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;counter = 1&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; sleepers = 0,&lt;br /&gt;&amp;nbsp; &amp;nbsp; wait = {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;lock = {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; lock = 1,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; magic = 3735899821&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;task_list = {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; next = 0xf7f10ab4,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; prev = 0xf7f10ab4&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; bd_inodes = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; next = 0xf754fc10,&lt;br /&gt;&amp;nbsp; &amp;nbsp; prev = 0xf754fc10&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; bd_holder = 0xf885ac60,&lt;br /&gt;&amp;nbsp; bd_holders = 2,&lt;br /&gt;&amp;nbsp; bd_contains = 0xf7f10a80,&lt;br /&gt;&amp;nbsp; bd_block_size = 4096,&lt;br /&gt;&amp;nbsp; bd_part = 0x0,&lt;br /&gt;&amp;nbsp; bd_part_count = 0,&lt;br /&gt;&amp;nbsp; bd_invalidated = 0,&lt;br /&gt;&amp;nbsp; bd_disk = 0xf7e2a180,&lt;br /&gt;&amp;nbsp; bd_list = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; next = 0xf740db64,&lt;br /&gt;&amp;nbsp; &amp;nbsp; prev = 0xf740d964&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; bd_inode_backing_dev_info = 0x0,&lt;br /&gt;&amp;nbsp; bd_private = 0&lt;br /&gt;}&lt;/p&gt;







&lt;p&gt;--------&lt;/p&gt;

&lt;p&gt;どのデバイスであるかは、block_device構造体の先頭に&lt;/p&gt;

&lt;p&gt;-----&lt;/p&gt;

&lt;p&gt;struct block_device {&lt;br /&gt;&amp;nbsp; &amp;nbsp; dev_t bd_dev;&lt;br /&gt;-----&lt;/p&gt;

&lt;p&gt;のように宣言されているので確認してみます。&lt;/p&gt;

&lt;p&gt;-----&lt;/p&gt;

&lt;p&gt;&amp;nbsp; bd_dev = 9437185,&lt;/p&gt;















&lt;p&gt;-----&lt;br /&gt;&lt;br /&gt;ブロックデバイス dev_tは、include/linux/kdev_t.hで、以下のように、メジャーマイナーが設定されています。&lt;br /&gt;-----&lt;br /&gt;#define MINORBITS&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 20&lt;br /&gt;#define MINORMASK&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; ((1U &amp;lt;&amp;lt; MINORBITS) - 1)&lt;/p&gt;

&lt;p&gt;#define MAJOR(dev)&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;((unsigned int) ((dev) &amp;gt;&amp;gt; MINORBITS))&lt;br /&gt;#define MINOR(dev)&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;((unsigned int) ((dev) &amp;amp; MINORMASK))&lt;br /&gt;#define MKDEV(ma,mi)&amp;nbsp; &amp;nbsp; (((ma) &amp;lt;&amp;lt; MINORBITS) | (mi))&lt;br /&gt;-----&lt;/p&gt;

&lt;p&gt;9437185を計算に入れると、Major 9、Minor 1という結果になりました。&lt;/p&gt;

&lt;p&gt;これが確認に使ったプログラム。&lt;br /&gt;-------&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#define MINORBITS&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 20&lt;br /&gt;#define MINORMASK&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; ((1U &amp;lt;&amp;lt; MINORBITS) - 1)&lt;br /&gt;#define MAJOR(dev)&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;((unsigned int) ((dev) &amp;gt;&amp;gt; MINORBITS))&lt;br /&gt;#define MINOR(dev)&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;((unsigned int) ((dev) &amp;amp; MINORMASK))&lt;br /&gt;#define MKDEV(ma,mi)&amp;nbsp; &amp;nbsp; (((ma) &amp;lt;&amp;lt; MINORBITS) | (mi))&lt;/p&gt;

&lt;p&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; printf(&amp;quot;MAJOR:%d\n&amp;quot;, MAJOR(9437185));&lt;br /&gt;&amp;nbsp; printf(&amp;quot;MINOR:%d\n&amp;quot;, MINOR(9437185));&lt;br /&gt;&amp;nbsp; printf(&amp;quot;%d\n&amp;quot;, MKDEV(9,1));&lt;br /&gt;}&lt;br /&gt;---------&lt;/p&gt;



&lt;p&gt;これは、/dev/の下でmajor 9、minor 1のデバイスを探すと、/dev/md1を表していました。&lt;/p&gt;

&lt;p&gt;-----&lt;br /&gt;$ ls -l /dev/md1&lt;br /&gt;brw-r----- 1 root disk 9, 1&amp;nbsp; 7月 16 02:34 /dev/md1 &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;-----&lt;/p&gt;</content:encoded>


<dc:subject>カーネルダンプ</dc:subject>

<dc:creator>yasuma</dc:creator>
<dc:date>2006-07-18T09:00:00+09:00</dc:date>
</item>


</rdf:RDF>
