[Armadillo:08884] Re: flatfsd のバグ?

Yasuhisa Nakamura email@hidden
2013年 5月 31日 (金) 23:00:08 JST


中村です。

#メールのスレッドが切れてしまっていたらごめんなさい。

[Armadillo:08877]で Yanagihara, Kosaku さんは書きました:
> [Armadillo:07930]でも指摘されている「configフラッシュが空の場合」の分析
> については異議があります。理由は・・・実験の方が分かりやすそうなので、以
> 下参照。
>
> 結論を言うと、configフラッシュは空でも/etc/configが空っぽじゃなければ
> (8,9)何も実行されていません。言い換えると「空っぽで上書き」的な挙動です。

柳原さん、
ご指摘ありがとうございます。
ソースをもう一度、読み直しました。

[Armadillo:08875]で、「configフラッシュが壊れているか、空っぽ」と
書きましたが、違ったようです。

たぶん、Armadillo起動時のrcでのflatfsdの挙動を調べていたときのこと
だったはずなので、柳原さんご指摘のように、/etc/configに最初から
ファイルが何か入っているということをまったく考えていなかったんじゃ
ないかなぁ、と思います。(言い訳モード)

#/etc/configが空っぽで、configフラッシュも空っぽならば、
#configフラッシュから/etc/configへリストアした結果は空っぽなので、
#下↓に書く条件の(2)の(b)にあてはまってしまいます。
#ここのあたりで、動作条件に間違いを犯してました。

とにかく、[Armadillo:08875]で書いたのは間違いで、
 - /etc/defualtの内容を/etc/configにコピー
 - /etc/configの内容をconfigフラッシュに書き込む
という動作をする条件は、次の2つのどちらかでした。
(1) -w オプションを指定している
(2) -r オプションを指定していて、かつ、次の3つのいずれかが成立する。
 (a) configフラッシュから/etc/configへのリストアに失敗(configが壊れているなど)
 (b) (a)が成功したのち、/etc/configが空っぽ
 (c) /etc/config/.initファイルがあり、ファイルの読み込みができる


柳原さんのレポートの

> 9. configフラッシュから/etc/configへ書き戻す(空っぽで上書きする)。
> 	# flatfsd -r
> 	flatfsd: restore fs+ from partition 0, tstamp=1
> 	flatfsd: Created 1 configuration files (0 bytes)

ここに"Created 1 configuration files"というメッセージが気になりました。
空っぽで上書きしているのに"created 1"となる点です。

ソースをみると
        syslog(LOG_INFO, "Created %d configuration files (%d bytes)",
                  numfiles, numbytes);
となっていて、numfilesは、上の(b)でファイルの数を数えた結果でした。
つまり、実際に1つのファイルを作ったということではありませんでした。


> 一方、configフラッシュと/etc/configが両方空っぽ(10,11)だと、-wと同じ結果
> になります。

"-w"と"-r"の違いをソースから引用しておきます。
(インデントはオリジナルから変えています)

int main(int argc, char *argv[])
{
    ...
    int rc, rc1, rc2, readonly, clobbercfg;

    clobbercfg = readonly = 0;
    ...
    while ((rc = getopt(argc, argv, "vcnribwH123hs?")) != EOF) {
        switch (rc) {
        case 'w':
            clobbercfg++;
            readonly++;
            break;
        case 'r':
            readonly++;
            break;
        ...
        }
    }
    if (readonly) {
        rc1 = rc2 = 0;
        if (clobbercfg ||
#if !defined(USING_FLASH_FILESYSTEM)
            ((rc = flat_restorefs()) < 0) ||
#endif
            (rc1 = flat_filecount()) <= 0 ||
            (rc2 = flat_needinit())
        ) {
            ...
            syslog(LOG_ERR, "Nonexistent or bad flatfs (%d), creating new one...", rc);
            flat_clean(1);
            if ((rc = flat_new(DEFAULTDIR)) < 0) {
                syslog(LOG_ERR, "Failed to create new flatfs, err=%d errno=%d",
                        rc, errno);
                exit(1);
            }
            save_config_to_flash();
        }
        syslog(LOG_INFO, "Created %d configuration files (%d bytes)",
                numfiles, numbytes);
        exit(0);
    }

flat_restorefs()は、configフラッシュから/etc/configへリストアします。
flat_filecount()は、/etc/configのファイルの数とバイト数を数えて
グローバル変数 numfiles, numbytes にセットします。
flat_needinit()は、access("/etc/config/.init", R_OK) を調べてます。
DEFAULTDIR は "/etc/default" です。
flat_new()は、引数のディレクトリを/etc/configにコピーします。
save_config_to_flash()は、/etc/configをconfigフラッシュへ書き出します。

#今度は間違いはないと思いますが・・・大丈夫かなぁ。

-- 
なかむら





armadillo メーリングリストの案内