Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux tmpfs中如何生成索引节点号?_Linux_Filesystems - Fatal编程技术网

linux tmpfs中如何生成索引节点号?

linux tmpfs中如何生成索引节点号?,linux,filesystems,Linux,Filesystems,在我看来,tmpfs并没有重复使用inode编号,而是在每次需要空闲inode时通过+1序列创建一个新的inode编号 你知道这是如何实现的吗/你能告诉我一些源代码,在那里我可以检查tmpfs中使用的算法吗 我需要了解这一点,以便绕过使用inode编号作为其缓存密钥的缓存系统中的限制(因此,在重复使用inode太频繁时,会导致罕见但会发生冲突)。如果我能证明tmpfs一直在创建唯一的inode编号,那么tmpfs可以拯救我的一天 谢谢你的帮助 杰罗姆·瓦格纳(Jerome Wagner)我不会直

在我看来,tmpfs并没有重复使用inode编号,而是在每次需要空闲inode时通过+1序列创建一个新的inode编号

你知道这是如何实现的吗/你能告诉我一些源代码,在那里我可以检查tmpfs中使用的算法吗

我需要了解这一点,以便绕过使用inode编号作为其缓存密钥的缓存系统中的限制(因此,在重复使用inode太频繁时,会导致罕见但会发生冲突)。如果我能证明tmpfs一直在创建唯一的inode编号,那么tmpfs可以拯救我的一天

谢谢你的帮助


杰罗姆·瓦格纳(Jerome Wagner)

我不会直接回答你的问题,因此我为此提前道歉

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


干杯

tmpfs代码的大部分在
mm/shmem.c
中。新的索引节点是由

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\u ino
字段


请注意,这是完全有可能的,以所有的方式包装。内核还有一个“generation”字段,它以各种方式填充
mm/shmem.c
使用当前时间。

我同意依赖这样一个impl。细节似乎不合理,无法证明未来。事实上,密钥已经依赖于(inode,mtime),但是由于mtime具有1秒的粒度,我已经了解了发生冲突的艰难方式。在密钥中使用filename和filesize也会降低冲突的概率。在我看来,最好是在释放inode时删除缓存(使用来自内核的某种通知)。tmpfs“黑客”可以为我的问题带来一个快速而肮脏的解决方案,直到真正的解决方案被开发和测试。谢谢你的建议哦,那么,很抱歉告诉你你已经知道的和已经测试过的,谢谢你挖掘出来。你所说的“一路环绕”是什么意思?当溢出发生时,返回到零