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

Yasuhisa Nakamura email@hidden
2013年 6月 1日 (土) 04:09:44 JST


中村です。

ズレの大きさが違いますが、再現できました。
こんな感じで、(727-5)秒ずれました。

5: flatfsd -r ... flatfsd: restore fs+ from partition 0, tstamp=1
flatfsd: Created 2 configuration files (0 bytes)
real    12m 1.35s
user    0m 0.01s
sys     0m 0.01s
done (727: 0)

make config で、
  CONFIG_USER_FLATFSD_HAS_RTC
をOFFにしてますね?

デフォルト(アットマークテクノ社提供状態)から変更された部分は、
質問時に動作(ビルド)条件として、教えていただかないと・・・

HAS_RTCでないとき、configフラッシュに時刻に関する
情報(保存時の現在時刻)を書き込んでおき、
flatfsd -r 実行時に保存されている値をシステム時計に
セットしてます。

#この仕組みが時刻保存と復帰のためにほんとに役に立つのか
#疑問ですが・・・

保存処理

int flat_savefs(int version)
{
        ...
#ifndef HAS_RTC
        {
                /* Create a special config file to store the current time. */
                FILE *hfile;

                if ((hfile = fopen(FLATFSD_CONFIG, "w")) == NULL)
                        return ERROR_CODE();
                fprintf(hfile, "time %ld\n", time(NULL));
                /* Ignore errors! */
                fflush(hfile);
                fclose(hfile);
        }
#endif
        ...
}

読み出しとシステム時計設定処理

static int flat3_restorefsoffset(off_t offset, int dowrite)
{
        ...
                if (strcmp(filename, FLATFSD_CONFIG) == 0) {
        ...
#ifndef HAS_RTC
                                if (dowrite)
                                        parseconfig(confbuf);
#endif
        ...
}

#ifndef HAS_RTC
static void parseconfig(char *buf)
{
        char *confline, *confdata;

        confline = strtok(buf, "\n");
        while (confline) {
                confdata = strchr(confline, ' ');
                if (confdata) {
                        *confdata = '\0';
                        confdata++;
                        if (!strcmp(confline, "time")) {
                                time_t t;
                                t = atol(confdata);
                                if (t > time(NULL))
                                        stime(&t);
                        }
                }
                confline = strtok(NULL, "\n");
        }
}
#endif

FLATFSD_CONFIGといのは".flatfsd"というファイルで、
このファイルはconfigフラッシュには存在しますが、
/etc/configにはコピーしないようになっています。

もし、このファイルを見えるようにしたいのならば、
ソース中の何か所かにある
                if ((strcmp(dp->d_name, ".") == 0) ||
                    (strcmp(dp->d_name, "..") == 0) ||
                    (strcmp(dp->d_name, FLATFSD_CONFIG) == 0))
                        continue;
という部分をいじってあげればいいのではないかと思います。

-- 
なかむら




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