2010-12-10 94 views
5

在我看来,tmpfs并不是重新使用inode号码,而是每次需要一个空闲的inode时,通过+1顺序创建一个新的inode号码。linux tmpfs中如何生成inode数字?

你知道这是如何实现/你可以指向我的一些源代码,我可以检查在tmpfs中使用的算法吗?

我需要理解这一点,以便绕过使用inode编号作为其缓存键的缓存系统中的限制(因此当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) 

创建,但它将几乎所有东西委托给通用文件系统代码。

特别是,本场i_ino填充在fs/inode.c

/** 
*  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_ino字段。

请注意,这完全可能包裹所有。内核还有一个以不同方式填充的“生成”字段。 mm/shmem.c使用当前时间。

+0

感谢您挖掘出来。 “一路包裹”是什么意思? – 2010-12-10 23:10:12

+1

发生溢出时回零 – slezica 2010-12-11 00:14:00

7

我不会直接回答你的问题,所以我提前对此表示道歉。

tmpfs的想法很好,但我不会让我的程序依赖于生成密钥的更多或更少的模糊实现细节。为什么不尝试其他方法,如将inode号码与其他信息结合起来?也许修改日期:除非系统日期更改,否则两个文件不可能在密钥生成时获得相同的inode编号和修改日期。

干杯!

+0

我同意依靠这样一个impl。细节似乎并不合理,未来的证据。事实上,密钥已经依赖于(inode,mtime),但由于mtime具有1秒的粒度,我已经学会了碰撞发生的困难方式。在密钥中使用文件名和文件大小也会降低碰撞概率。我认为最好的办法是在发布inode时使用某种内核通知来删除缓存。 tmpfs'hack'可能会给我的问题带来快速和肮脏的解决方案,直到真正的修复程序开发和测试。感谢您的建议 – 2010-12-10 23:06:36

+0

哦,那么,很抱歉告诉你什么,你已经知道,并已测试xD – slezica 2010-12-11 00:14:54