tarfs について (4)

2.4 なソースも持っとく必要あるかな。とりあえず 2.4.36 を down 中。とりあえず、struct super_block 構造体の s_fs_info を使う方向で修正する方向かな、と。

        void                    *s_fs_info;     /* Filesystem private info */

てーコトは件のマクロは

#define TARSB(sb)  ((struct tarfs_sb_info*)((sb)->s_fs_info))

で良いのか。

と言いつつ

詳解 Linux カーネルが端末の下にあるのを発見。12.2.1 スーパーブロックの項を見ると確かに u ってメンバが御座いますな。
しかし参考書が 2.2、2.4、2.6 ってのは (実習 Linux カーネルに至っては 2.0) ちょっと微妙じゃないかな、と自分でも思う。やはりオライリーのナニは最新持っといた方が良いのでしょうか。

閑話休題する前に

オトして展開した 2.4 系のカーネル見てみたら以下

        union {
                struct minix_sb_info    minix_sb;
                struct ext2_sb_info     ext2_sb;
                struct ext3_sb_info     ext3_sb;
                struct hpfs_sb_info     hpfs_sb;
                struct ntfs_sb_info     ntfs_sb;
                struct msdos_sb_info    msdos_sb;
                struct isofs_sb_info    isofs_sb;
                struct nfs_sb_info      nfs_sb;
                struct sysv_sb_info     sysv_sb;
                struct affs_sb_info     affs_sb;
                struct ufs_sb_info      ufs_sb;
                struct efs_sb_info      efs_sb;
                struct shmem_sb_info    shmem_sb;
                struct romfs_sb_info    romfs_sb;
                struct smb_sb_info      smbfs_sb;
                struct hfs_sb_info      hfs_sb;
                struct adfs_sb_info     adfs_sb;
                struct qnx4_sb_info     qnx4_sb;
                struct reiserfs_sb_info reiserfs_sb;
                struct bfs_sb_info      bfs_sb;
                struct udf_sb_info      udf_sb;
                struct ncp_sb_info      ncpfs_sb;
                struct usbdev_sb_info   usbdevfs_sb;
                struct jffs2_sb_info    jffs2_sb;
                struct cramfs_sb_info   cramfs_sb;
                void                    *generic_sbp;
        } u;

成程。これはポインタでナニした方が賢いのかなぁ。

閑話休題

色々な意味で意味不明なソレが満載。話を元に戻して、set_blocksize() なソレから見てみる事に。
tarfs_read_super() の先頭部分が以下

struct super_block * tarfs_read_super (struct super_block * sb, void * data,
                                      int silent)
{ 
  kdev_t dev = sb->s_dev;
  
  set_blocksize(dev, TAR_BLOCKSIZE);

いきなり気になるのが s_dev 属性の型。
って kdev_t だな。これは Linux カーネル 2.6 解読室が違うのかな。p.256 にある super_block 構造体のメンバ、な表 15-5 では dev_t になっております。
どっかに dev_t と kdev_t は全然違う、というナニがどっかのコメントにあったんですが、スデに記憶にナシ。
あ、見てたのは 2.4 な super_block だった。(とほほ
2.4 な定義は以下

struct super_block {
        struct list_head        s_list;         /* Keep this first */
        kdev_t                  s_dev;

以下が 2.6 な定義

struct super_block {
        struct list_head        s_list;         /* Keep this first */
        dev_t                   s_dev;          /* search index; _not_ kdev_t */

微妙なコメントがケツにある。単純に置き換えられそうになくって萎えるな。

2.6 ではこんなカンジ

extern int set_blocksize(struct block_device *, int);
extern int sb_set_blocksize(struct super_block *, int);

ちなみに 2.4 は以下だな

extern int set_blocksize(kdev_t, int);
extern int sb_set_blocksize(struct super_block *, int);

結局どうすれば良いのか微妙。

備忘録

上記、2.4 だし。色々見てるに sb_set_blocksize() に移行してると信じたいなぁ。