V cache používáme
tyto typy promìných,struktur.
Ze souboru COMMON/type.h
typedef unsigned int zone_t;
typedef unsigned int dev_t;
typedef unsigned int block_t;
Ze souboru buf.h
EXTERN struct buf {
/* Data portion of the buffer. Can be treated as various formats or uninterpreted
*/
union { char b__data[BLOCK_SIZE];
/* ordinary user data */
struct direct b__dir[NR_DIR_ENTRIES]; /* directory block */
zone_t b__ind[NR_INDIRECTS]; /* indirect block */
d_inode b__inode[INODES_PER_BLOCK]; /* inode block */
}
kde BLOCK_SIZE, NR_DIR_ENTRIES, NR_INDIRECTS, INODES_PER_BLOCK jsou definovany v COMMON/const.h a COMMON/fsconst.h
Cache poskytuje tyto funkce
Inicializace cache : PUBLIC void buf_pool();
Jak pracovat s bloky: O blok se žádá cache, pomoci funkce get_block. Ta o daný blok požádá nižší vrstvu a vratí na nìj ukazatel. Pokud v danem bloku nastala zmìna tak v hlavièce bloku nastavit b_dirt a vratit tento blok cache pomocí funkce put_block.
Poskytnutí bloku:
Vrací pointer na buffer s daty požadovaného bloku. Jestliže
Cache vlastní tento blok zvìtší b_count a vratí
pointer na blok. Pokud ho, ale nevlastní požadá ovládaè
o jeho naètení.
PUBLIC struct buf *get_block(register dev_t dev, register block_t block,
int only_search);
kde: register dev_t
dev - na kterém zaøízení je blok
?
register block_t block - ktrý blok je požadován
?
int only_search - jestliže NO_READ*, neète,
jinak act NORM
* - NO_READ se používá, když danný
blok se bude celý mìnit, takže je celkem zbyteèné
ho naèítat.
Vrácení bloku:Na
základì parametru 'block_type', který identifikuje
charakter v bloku obsažených dat pøesune blok v obousmìrném
seynamu na stranu LRU nebo MRU podle toho, zda se pøedpokládá,
že blok bude v krátké dobì znovu vyžadán. U
zvlášť dùležitých dat rovnìž vynutí
zápis bufferu na disk.
PUBLIC void put_block(register struct buf *bp, int block_type);
kde : register struct
buf *bp - ukazatel na buffer, který má být
uvolnìn
int block_type - INODE_BLOCK( Inode Block
) *
- DIRECTORY_BLOCK ( Directory
Block ) *
- INDIRECT_BLOCK ( Pointer Block ) *
- MAP_BLOCK ( Map Block ) *
- ZUPER_BLOCK ( Super Block ) **
- FULL_DATA_BLOCK ( data, plnì používaná
)
- PARTIAL_DATA_BLOCK (data, èásteènì
užívaná )
* - tyto bloky jsou typu WRITE_IMMED,
okamžitì pøi zmìnì zapsány na disk.
** - super block
Alokace nové zony :
Alokuje novou zónu na indikovaném zaøízení
a vrací jeho èíslo. (To znamená nalezení
"prazdneho" bitu v tabulkach volnych bloku daného zaøízení
a jeho nastaveni na obsazeno (o to se stará super.c)
a vraceni odpovidajiciho cisla bloku v pøípadì, že
již vše je obsazeno vrací NO_ZONE).
PUBLIC zone_t alloc_zone(dev_t dev);
kde : dev_t dev - zaøízení kde je zóna požadována
Uvolnìní zony :
Uvolní zónu na pøislušném zaøízení
s pøíslušným šíslem. (To znamená nalezení
daného èísla zóny v tabulkach volnych bloku
daného zaøízení a jeho nastaveni na "volno"
(o to se stará super.c)).
PUBLIC void free_zone(dev_t dev, zone_t number);
kde : dev_t dev - zaøízení
kde je zóna umístìna
zone_t number - zóna, která má
být uvolnìna
Invalidate: Uloží všechny bloky ve, kterých
došlo ke zmìnì. A odstraní je z cache. Tz. že všechny
tyto bloky budou znaèeny jako prazdné.
PUBLIC void invalidate(dev_t dev);
kde : dev_t device - zaøízení jehož bloky mají být odstranìny
flushall: Uloží všechny
bloky ve kterých došlo ke zmìnì, ale na rozdíl
od invalidate si je ponechá v pamìti.
PUBLIC void flushall(dev_t dev);
kde : dev_t dev - device to flush
Cache využívá funkce z tìchto vrstev