2010-12-10 11 views
5

tmpfsはinode番号を再利用していないようですが、代わりに空きinodeが必要なときに+1シーケンスを使って新しいinode番号を作成します。linux tmpfsでinode番号はどのように生成されますか?

これがどのように実装されているか知っていますか?/ tmpfsで使用されているアルゴリズムをチェックできるソースコードにピンポイントを付けることができますか?

これは、キャッシュキーとしてiノード番号を使用するキャッシュシステムの制限を回避するために理解する必要があります(したがって、inodeが頻繁に再利用されると、まれにしか発生しません)。一意のinode番号を作成し続けることが証明できれば、tmpfsは私の一日を節約することができます。

ジェローム・ワグナー

答えて

3

tmpfsコードの大部分はmm/shmem.cです。新しいinodeは

static struct inode *shmem_get_inode(struct super_block *sb, const struct inode *dir, 
           int mode, dev_t dev, unsigned long flags) 

で作成されますが、ほとんどすべてが汎用ファイルシステムコードに委譲されています。

/** 
*  new_inode  - obtain an inode 
*  @sb: superblock 
* 
*  Allocates a new inode for given superblock. The default gfp_mask 
*  for allocations related to inode->i_mapping is GFP_HIGHUSER_MOVABLE. 
*  If HIGHMEM pages are unsuitable or it is known that pages allocated 
*  for the page cache are not reclaimable or migratable, 
*  mapping_set_gfp_mask() must be called with suitable flags on the 
*  newly created inode's mapping 
* 
*/ 
struct inode *new_inode(struct super_block *sb) 
{ 
     /* 
     * On a 32bit, non LFS stat() call, glibc will generate an EOVERFLOW 
     * error if st_ino won't fit in target struct field. Use 32bit counter 
     * here to attempt to avoid that. 
     */ 
     static unsigned int last_ino; 
     struct inode *inode; 

     spin_lock_prefetch(&inode_lock); 

     inode = alloc_inode(sb); 
     if (inode) { 
       spin_lock(&inode_lock); 
       __inode_add_to_lists(sb, NULL, inode); 
       inode->i_ino = ++last_ino; 
       inode->i_state = 0; 
       spin_unlock(&inode_lock); 
     } 
     return inode; 
} 

をそして、それは確かにちょうどインクリメントカウンタ(last_ino)を使用しない:特に

、フィールドi_inofs/inode.cに埋められます。

他のほとんどのファイルシステムでは、ディスク上のファイルの情報を使用して、あとでi_inoフィールドを上書きします。

これが完全に回避できることに注意してください。カーネルには、さまざまな方法で塗りつぶされる「世代」フィールドもあります。 mm/shmem.cは現在の時刻を使用します。

+0

ありがとうございました。あなたは「周りを包み込む」とはどういう意味ですか? –

+1

オーバーフローが発生したときにゼロに戻ります。 – slezica

7

、あなたの助けをありがとう、私は直接あなたの質問にお答えしませんので、私はそれのために事前にお詫び申し上げます。

tmpfsのアイデアは良いですが、私のプログラムはキーを生成するための多かれ少なかれわかりにくい実装の詳細に依存しません。 inode番号を他の情報と組み合わせるなど、別の方法を試してみませんか?おそらく修正日:システムの日付が変更されない限り、2つのファイルがキー生成時に同じiノード番号と変更日を取得することは不可能です。

乾杯!

+0

私はそのようなインプリメントに頼っていることに同意します。細部は合理的かつ将来の証拠に見えません。実際には、キーはすでに(inode、mtime)に依存していますが、mtimeは1秒単位であるため、衝突が起こるという難しい方法を学びました。キーにファイル名とファイルサイズを使用すると、衝突の可能性も低くなります。私の考えでは、inodeがリリースされたときに(カーネルから何らかの種類の通知を使って)キャッシュを削除するのが最善の方法です。本当の修正が開発され、テストされるまで、tmpfsの「ハック」は私の問題に迅速かつ汚れた解決策をもたらす可能性があります。アドバイスをありがとう –

+0

ああ、あなたがすでに知っていて、テストしたことを教えてくれて申し訳ありません。xD – slezica

関連する問題