2010-12-10 3 views
5

tmpfs는 inode 번호를 재사용하지 않고 대신 free inode가 필요할 때마다 +1 시퀀스를 통해 새로운 inode 번호를 만듭니다.linux tmpfs에서 inode 번호는 어떻게 생성됩니까?

이것이 구현 된 방법을 알고 있습니까?/tmpfs에서 사용되는 알고리즘을 확인할 수있는 일부 소스 코드를 알려주시겠습니까?

iode 번호를 캐시 키로 사용하는 캐싱 시스템의 한계를 우회하기 위해이를 이해해야합니다 (따라서 inode가 너무 자주 재사용 될 때 드물지만 충돌이 발생할 수 있음). tmpfs는 고유 한 inode 번호를 계속 생성한다는 것을 증명할 수 있다면 하루를 절약 할 수 있습니다.

내가 직접 귀하의 질문에 대답하지 않을 것이다, 당신의 도움을

제롬 와그너

답변

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

오버플로 발생시 0으로 되돌아갑니다. – slezica

7

을 주셔서 감사합니다, 그래서 나는 그것에 대해 미리 사과드립니다.

tmpfs 아이디어가 좋지만 키를 생성하기 위해 다소 불분명 한 구현 세부 사항에 의존하는 프로그램이 아닙니다. 아이 노드 번호를 다른 정보와 결합하는 등의 다른 방법을 시도해보십시오. 어쩌면 수정 날짜 : 시스템 날짜가 변경되지 않는 한, 두 개의 파일이 키 생성시 동일한 inode 번호와 수정 날짜를 얻는 것은 불가능합니다.

건배!

+0

나는 그런 impl에 의존한다는 것에 동의한다. 세부 사항은 합리적이고 미래의 증거로 보이지 않습니다. 사실은 키가 이미 (inode, mtime)에 의존하고 있지만 mtime은 1 초의 세분성을 가지고 있기 때문에 충돌이 발생한다는 어려운 방법을 배웠습니다. 키에 파일 이름과 파일 크기를 사용하면 충돌 가능성이 낮아집니다. 내 생각에 가장 좋은 것은 커널에서 어떤 종류의 알림을 사용하여 inode가 해제 될 때 캐시를 삭제하는 것입니다. tmpfs 'hack'은 실제 문제가 개발되어 테스트 될 때까지 내 문제를 신속하게 해결할 수 있습니다. 조언을 주셔서 감사합니다 –

+0

오, 그럼, 당신이 이미 알고 있었고 테스트를 거쳐서 미안 해요 xD – slezica

관련 문제