mdadmのヤバそうなバグのCentOSにおける修正状況

はじめに

Ubuntu 16.04のmdadmには、所定の条件を満たすとユーザのデータをぶっ壊すという恐ろしいバグがあります。具体的には次の記事の"バグ1"のことです。

blog.cybozu.io

Ubuntuについては一応回避策もありますし、そのうち修正されるでしょうが、「そういえばこれ、CentOSではどうなってるんだろう」と気になったので、CentOS 6.9と7.4についてこのバグの有無を調べてみました。

調査結果

注意: これと同じことがCentOSのクローン元のRHELに当てはまるかどうかは知りません。気になる人はご自身で確認した上で対処してください。間違ってもRed Hat社に「このブログにCentOS 6.9のmdadmに問題があると書いてたからRHELのmdadmを直して」などと言わないようにしてください。Red Hat社にとってはCentOSにバグがあろうとなかろうと「知らんがな」なので。

調査ログ

このバグが存在するかどうかは実機確認すれば一発でわかるのですが、せっかくなのでソースからバグの有無を調査する手順を載っけときます。

CentOS 6.9

まずはソースパッケージのバージョンを次のサイトから調べました。

Index of /6.9/os/Source/SPackages

その中で次の行が見つかりました。

mdadm-3.3.4-8.el6.src.rpm

続いてこのソースrpmをダウンロード&インストールしてソース調査しました。このパッケージの元になっているのはファイル名からわかる通り、upstreamのバージョン3.3.4です。このバージョンは、この問題の修正がまだ適用されていないものです。

さて、これでアウトかと言うと違います。なぜかというと、CentOSなどのディストリビュータが提供するパッケージはupstreamのものにdistro固有のパッチがいくつか当たっていることがあり、それらパッチによって修正されている可能性があるからです。

mdadmのspecファイルを見ると、いくつか独自パッチが当たっていることがわかりました。

...
Patch1:      mdadm-3.3.4-imsm-don-t-call-abort_reshape-in-imsm_manage_reshape.patch
Patch2:      mdadm-3.3.4-Grow-close-file-descriptor-earlier-to-avoid-still-in.patch
Patch3:      mdadm-3.3.4-imsm-abort-reshape-if-sync_action-is-not-reshape.patch
Patch4:      mdadm-3.3.4-imsm-use-timeout-when-waiting-for-reshape-progress.patch
Patch5:      mdadm-3.3.4-imsm-don-t-update-migration-record-when-reshape-is-i.patch
Patch6:      mdadm-3.3.4-Grow-Add-documentation-to-abort_reshape-for-suspend_.patch
Patch7:      mdadm-3.3.4-super-intel-ensure-suspended-region-is-removed-when-.patch
Patch8:      mdadm-3.3.4-Grow-close-fd-earlier-to-avoid-cannot-get-excl-acces.patch
Patch9:      mdadm-3.3.4-Introduce-stat2kname-and-fd2kname.patch
Patch10:     mdadm-3.3.4-IMSM-retry-reading-sync_completed-during-reshape.patch
Patch11:     mdadm-3.3.4-The-sys_name-array-in-the-mdinfo-structure-is-20-byt.patch
Patch12:     mdadm-3.3.4-imsm-add-handling-of-sync_action-is-equal-to-idle.patch
Patch13:     mdadm-3.3.4-imsm-properly-handle-values-of-sync_completed.patch
Patch14:     mdadm-3.3.4-Incremental-don-t-try-to-load_container-for-a-subarr.patch
Patch15:     mdadm-3.3.4-Allow-level-migration-only-for-single-array-containe.patch
Patch16:     mdadm-3.3.4-imsm-set-generation-number-when-reading-superblock.patch

Patch97:     mdadm-3.3.2-disable-ddf.patch
Patch98:     mdadm-3.3.2-udev.patch
Patch99:     mdadm-3.3-makefile.patch
...

これらのパッチを全部当てた状態のソースを調査しても、バグは修正されていないことがわかりました。つまり、CentOS 6.9は結局アウト。

CentOS 7.4

6.9の場合と同様に、まずはソースパッケージのバージョンを確認しました。

Index of /7.4.1708/os/Source/SPackages

その結果、次のバージョンを使用していることがわかりました。

mdadm-4.0-5.el7.src.rpm

次はこのソースパッケージの調査です。ダウンロード&インストールすると、upstreamのmdadm 4.0がベースとなっていることがわかりました。このバージョンは、バグが修正されているものです。では、これでセーフ確定かというとそうではありません。CentOS固有パッチによってregressionを起こして、またバグが復活している可能性がわずかに残っています。このため、全パッチを適用した上でソース確認しました。確認の結果は問題なかったので、7.4はセーフ。