2010-12-10 12 views
5

Wydaje mi się, że nie jest tmpfs ponownie za pomocą cyfr-węzła, ale zamiast tego tworzy nowy numer węzła poprzez sekwencję +1 każdym potrzebuje wolnego iwęzeł.W jaki sposób są generowane numery i węzłów w tmpfs?

Czy wiesz jak to jest realizowane/można przypiąć-punktowy mnie do pewnego kodu źródłowego gdzie mogę sprawdzić algorytm, który jest używany w tmpfs?

Muszę to zrozumieć, aby ominąć ograniczenie w systemie buforowania, który używa numeru i-węzła jako jego klucza pamięci podręcznej (co prowadzi do rzadkich, ale zdarzających się kolizji, gdy i -ody są ponownie używane zbyt często). tmpfs może uratować mój dzień, jeśli uda mi się udowodnić, że ciągle tworzy unikalne numery i-węzłów.

Dziękuję za pomoc,

Jerome Wagner

Odpowiedz

3

Większość kodu Tmpfs w mm/shmem.c. Nowe i-węzły są tworzone przez:

static struct inode *shmem_get_inode(struct super_block *sb, const struct inode *dir, 
           int mode, dev_t dev, unsigned long flags) 
, ale przekazują prawie wszystko do ogólnego kodu systemu plików.

W szczególności pole i_ino jest wypełnione w 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; 
} 

I rzeczywiście wystarczy użyć licznik zwiększany (last_ino).

Większość innych systemów plików wykorzystywać informacje z plików na dysku, aby później zmienić pole i_ino.

Należy pamiętać, że jest to jak najbardziej możliwe do tego, aby owinąć dookoła. Jądro ma również pole "generacji", które jest wypełniane na różne sposoby. mm/shmem.c używa aktualnego czasu.

+0

Dzięki za wykopanie tego. Co rozumiesz przez "owijanie naokoło"? –

+1

Powrót do zera po wystąpieniu przepełnienia – slezica

7

nie będę bezpośrednio odpowiedzieć na to pytanie, więc z góry przepraszam za to.

tmpfs pomysł jest dobry, ale nie mam programu zależy od mniej lub bardziej niejasnych szczegółów implementacji generowania kluczy. Dlaczego nie spróbujesz innej metody, takiej jak połączenie numeru i-węzła z kilkoma innymi informacjami? Być może data modyfikacji: niemożliwe jest, aby dwa pliki otrzymały ten sam numer i-węzła ORAZ datę modyfikacji w momencie generowania klucza, chyba że zmieni się data systemowa.

Pozdrawiam!

+0

Zgadzam się, że polegam na takim impedzie. szczegóły nie wydają się rozsądne i przyszłościowe. Faktem jest, że klucz już polega na (i-węźle, mtime), ale ponieważ mtime ma 1-sekundową ziarnistość, nauczyłem się na własnej skórze, że zderzenie się zdarza. Użycie nazwy pliku i filesize w kluczu również obniżyłoby prawdopodobieństwo kolizji. Najlepszym moim zdaniem byłoby usunięcie pamięci podręcznej po zwolnieniu i-węzła (za pomocą powiadomień z jądra). "Hack" tmpfs może przynieść szybkie i brudne rozwiązanie mojego problemu, dopóki prawdziwa poprawka nie zostanie opracowana i przetestowana. Dzięki za poradę –

+0

No cóż, przepraszam za przekazanie ci tego, co już wiedziałeś i przetestowałeś xD – slezica

Powiązane problemy