Linux 2.4.7 - systemy plików

Jerzy Szczepkowski








System plików EXT2








Partycja EXT2

blok startowy

grupa bloków


Mapy bitowe zajętości bloków


Funkcja read_block_bitmap()

                static int read_block_bitmap (struct super_block * sb, 
                                              unsigned int block_group,
                                              unsigned long bitmap_nr);

Funkcja ext2_count_free

                unsigned long ext2_count_free (struct buffer_head * map, 
                                               unsigned int numchars);

Funkcja load_block_bitmap

                static inline int load_block_bitmap (struct super_block * sb,
                                                     unsigned int block_group);
    Działanie:
  1. jeżeli żądana bitmapa jest załadowana w slocie 0, zwracamy 0
  2. jeżeli mamy mniej grup bloków niż rozmiar pamięci podręcznej (EXT2_MAX_GROUP_LOADED, standardowo 8), i żądana mapa jest już załadowana to zwracamy jej slot.
  3. wpp. wywołujemy funkcje __load_block_bitmap

Funkcja __load_block_bitmap

                static int __load_block_bitmap (struct super_block * sb,
                                                unsigned int block_group)


Zwalnianie bloków

Funkcja ext2_free_blocks

                void ext2_free_blocks (const struct inode * inode, 
                                       unsigned long block,
                                       unsigned long count)


Alokacja bloków

Funkcja ext2_alloc_block

                static int ext2_alloc_block (struct inode * inode, 
                                             unsigned long goal, 
                                             int *err)



Funkcja ext2_new_block

                int ext2_new_block (const struct inode * inode, 
                                    unsigned long goal,
                                    u32 * prealloc_count, 
                                    u32 * prealloc_block, 
                                    int * err)
    Działanie:
  1. Wchodzimy do sekcji krytycznej (lock_super)
  2. Szukamy wolnego bloku:
    • Próbujemy zaalokować blok o numerze goal
    • Próbujemy zaalokować któryś z następujących po nim 63 bloków
    • Przeszukujemy aktualną grupę - najpierw szukamy wolnego bajtu w mapie bitowej, potem wolnego bitu.
    • Przeszukujemy cyklicznie pozostałe grupy, aż znajdziemy taką w której są wolne bloki. Szukamy w jej mapie bitowej najpierw wolnego bajtu, potem bitu.
  3. Jeśli znaleźliśmy bajt - cofamy się do siedmiu bloków (jeśli są wolne)
  4. Alokujemy wolny blok
  5. Jeśli działamy z prealokacją i mamy ustawione prealloc_count - staramy się prealokować do prealloc_count-1 bloków za nim.
  6. Wychodzimy z sekcji krytycznej (unlock_super)

Gorące podziekowania dla kol. Maćka Makowskiego za udostępnienie szablonu prezentacji.