This shows you the differences between two versions of the page.
so2:laboratoare:lab08 [2018/04/17 22:11] anda.nicolae [Înregistrarea și deînregistrarea sistemelor de fișiere] |
so2:laboratoare:lab08 [2018/04/18 00:39] (current) anda.nicolae [Resurse utile] |
||
---|---|---|---|
Line 54: | Line 54: | ||
Localizare: | Localizare: | ||
* În cazul sistemelor de fișiere pentru discuri, superblocul are un corespondent în primul bloc al acestora (Filesystem Control Block). | * În cazul sistemelor de fișiere pentru discuri, superblocul are un corespondent în primul bloc al acestora (Filesystem Control Block). | ||
- | * În **VFS**, toate superbloc-urile sistemelor de fișiere sunt reținute într-o listă de structuri [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L1338 | struct super_block]] și metodele în [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L1786 | struct super_operations ]] | + | * În **VFS**, toate superbloc-urile sistemelor de fișiere sunt reținute într-o listă de structuri [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L1337 | struct super_block]] și metodele în [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L1803 | struct super_operations ]] |
==== inode ==== | ==== inode ==== | ||
Line 67: | Line 67: | ||
<note> | <note> | ||
- | În general, inode-ul nu deține numele fișierului. Numele este reținut de entitatea [[http://lxr.free-electrons.com/source/include/linux/dcache.h?v=4.9#L83 | dentry]]. Astfel, un inode poate avea mai multe nume (hardlink-uri). | + | În general, inode-ul nu deține numele fișierului. Numele este reținut de entitatea [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/dcache.h#L90 | dentry]]. Astfel, un inode poate avea mai multe nume (hardlink-uri). |
</note> | </note> | ||
Localizare: | Localizare: | ||
- | * La fel ca și superblocul, inode-ul are un corespondent pe disc. inode-urile de pe disc sunt, în general, grupate într-o zonă specializată (zonă de inode-uri), separată de zona de blocuri de date; în unele sisteme de fișiere, structurile echivalente inode-urilor sunt răspândite în structura sistemului de fișiere ([[http://lxr.free-electrons.com/source/fs/fat/?v=4.9 | FAT]]); | + | * La fel ca și superblocul, inode-ul are un corespondent pe disc. inode-urile de pe disc sunt, în general, grupate într-o zonă specializată (zonă de inode-uri), separată de zona de blocuri de date; în unele sisteme de fișiere, structurile echivalente inode-urilor sunt răspândite în structura sistemului de fișiere ([[http://lxr.free-electrons.com/source/fs/fat/?v=4.15 | FAT]]); |
- | * ca entitate **VFS**, inode-ul este reprezentat de structura [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L604 | struct inode]] și de operațiile cu aceasta definite în structura [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L1736| struct inode_operations]]. | + | * ca entitate **VFS**, inode-ul este reprezentat de structura [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L565 | struct inode]] și de operațiile cu aceasta definite în structura [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L1733| struct inode_operations]]. |
Fiecare inode este în general identificat de un număr. Pe Linux, argumentul ''-i'' la comanda ''ls'' precizează numărului inode-ului asociat fișierului: | Fiecare inode este în general identificat de un număr. Pe Linux, argumentul ''-i'' la comanda ''ls'' precizează numărului inode-ului asociat fișierului: | ||
Line 94: | Line 94: | ||
Localizare: | Localizare: | ||
- | * Structura [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L880 | struct file]] reprezintă entitatea VFS asociată, iar structura [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L1696 | struct file_operations]] operațiile cu aceasta. | + | * Structura [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L852 | struct file]] reprezintă entitatea VFS asociată, iar structura [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L1692 | struct file_operations]] operațiile cu aceasta. |
==== dentry ==== | ==== dentry ==== | ||
Line 108: | Line 108: | ||
* dentry are un corespondent pe disc, dar corespondența nu este directă deoarece fiecare sistem de fișiere păstrează dentry-urile într-un mod specific | * dentry are un corespondent pe disc, dar corespondența nu este directă deoarece fiecare sistem de fișiere păstrează dentry-urile într-un mod specific | ||
- | * în VFS, entitatea dentry este reprezentată de structura [[http://lxr.free-electrons.com/source/include/linux/dcache.h?v=4.9#L83 | struct dentry]] și de operațiile cu aceasta definite în structura [[http://lxr.free-electrons.com/source/include/linux/dcache.h?v=4.9#L129 | struct dentry_operations]]. | + | * în VFS, entitatea dentry este reprezentată de structura [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/dcache.h#L90 | struct dentry]] și de operațiile cu aceasta definite în structura [[hhttps://elixir.bootlin.com/linux/v4.15/source/include/linux/dcache.h#L136 | struct dentry_operations]]. |
===== Înregistrarea și deînregistrarea sistemelor de fișiere ===== | ===== Înregistrarea și deînregistrarea sistemelor de fișiere ===== | ||
Line 176: | Line 176: | ||
==== Funcțiile mount, kill_sb ==== | ==== Funcțiile mount, kill_sb ==== | ||
- | La montarea sistemului de fișiere, nucleul apelează funcția [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L2036 | mount]] definită în cadrul structurii [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L2028 | struct file_system_type]]. Funcția face un set de inițializări și returnează un dentry (structura [[http://lxr.free-electrons.com/source/include/linux/dcache.h?v=2.6.35#L89 | struct dentry]]) ce reprezinta directorul punctului de mount. De obicei, ''mount'' este o funcție simplă care apelează una din funcțiile: | + | La montarea sistemului de fișiere, nucleul apelează funcția [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L2079 | mount]] definită în cadrul structurii [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L2071 | struct file_system_type]]. Funcția face un set de inițializări și returnează un dentry (structura [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/dcache.h#L90 | struct dentry]]) ce reprezinta directorul punctului de mount. De obicei, ''mount'' este o funcție simplă care apelează una din funcțiile: |
- | * [[http://lxr.free-electrons.com/source/fs/super.c?v=4.9#L1020 | mount_bdev]], care montează un sistem de fișiere aflat pe un device de tip bloc | + | * [[https://elixir.bootlin.com/linux/v4.15/source/fs/super.c#L1065 | mount_bdev]], care montează un sistem de fișiere aflat pe un device de tip bloc |
- | * [[http://lxr.free-electrons.com/source/fs/super.c?v=4.9#L1135 | mount_single]], care montează un sistem de fișiere care partajează o instanță între toate operațiile de montare | + | * [[https://elixir.bootlin.com/linux/v4.15/source/fs/super.c#L1180 | mount_single]], care montează un sistem de fișiere care partajează o instanță între toate operațiile de montare |
- | * [[http://lxr.free-electrons.com/source/fs/super.c?v=4.9#L1110 | mount_nodev]], care montează un sistem de fișiere ce nu se afla pe un device fizic | + | * [[https://elixir.bootlin.com/linux/v4.15/source/fs/super.c#L1155 | mount_nodev]], care montează un sistem de fișiere ce nu se afla pe un device fizic |
- | * [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L2093 | mount_pseudo]], o funcție ajutătoare pentru pseudo-sistemele de fișiere (''sockfs'', ''pipefs'', în general sisteme de fișiere care nu pot fi montate) | + | * [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L2152 | mount_pseudo]], o funcție ajutătoare pentru pseudo-sistemele de fișiere (''sockfs'', ''pipefs'', în general sisteme de fișiere care nu pot fi montate) |
- | Aceste funcții primesc ca parametru un pointer spre o funcție [[http://lxr.free-electrons.com/source/security/inode.c?v=4.9#L28 | fill_super]] care va fi apelată după inițializarea superblocului pentru terminarea inițializării acestuia de către driver. Un exemplu de o astfel de funcție găsiți în [[#functia_fill_super |secțiunea fill_super]]. | + | Aceste funcții primesc ca parametru un pointer spre o funcție [[https://elixir.bootlin.com/linux/v4.15/source/security/inode.c#L42 | fill_super]] care va fi apelată după inițializarea superblocului pentru terminarea inițializării acestuia de către driver. Un exemplu de o astfel de funcție găsiți în [[#functia_fill_super |secțiunea fill_super]]. |
- | La demontare nucleul apelează [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L2038 | kill_sb]], care face operații de tip cleanup și apelează una din funcțiile: | + | La demontare nucleul apelează [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L2081 | kill_sb]], care face operații de tip cleanup și apelează una din funcțiile: |
- | * [[http://lxr.free-electrons.com/source/fs/super.c?v=4.9#L1095 | kill_block_super]], care demontează un sistem de fișiere aflat pe un device de tip bloc | + | * [[https://elixir.bootlin.com/linux/v4.15/source/fs/super.c#L1140 | kill_block_super]], care demontează un sistem de fișiere aflat pe un device de tip bloc |
- | * [[http://lxr.free-electrons.com/source/fs/super.c?v=4.9#L939 | kill_anon_super]], care demontează un sistem de fișiere virtual (informația este generată în momentul în care este cerută) | + | * [[https://elixir.bootlin.com/linux/v4.15/source/fs/super.c#L988 | kill_anon_super]], care demontează un sistem de fișiere virtual (informația este generată în momentul în care este cerută) |
- | * [[http://lxr.free-electrons.com/source/fs/super.c?v=4.9#L948 | kill_litter_super]], care demontează un sistem de fișiere ce nu se afla pe un device fizic (menține informația în memorie) | + | * [[https://elixir.bootlin.com/linux/v4.15/source/fs/super.c#L997 | kill_litter_super]], care demontează un sistem de fișiere ce nu se afla pe un device fizic (menține informația în memorie) |
- | Un **exemplu pentru un sistem de fișiere fără suport pe disc** este funcția [[http://lxr.free-electrons.com/source/fs/ramfs/inode.c?v=4.9#L240 | ramfs_mount]] din sistemul de fișiere [[http://lxr.free-electrons.com/source/fs/ramfs/?v=4.9 | ramfs]]: | + | Un **exemplu pentru un sistem de fișiere fără suport pe disc** este funcția [[https://elixir.bootlin.com/linux/v4.15/source/fs/ramfs/inode.c#L250 | ramfs_mount]] din sistemul de fișiere [[http://lxr.free-electrons.com/source/fs/ramfs/?v=4.9 | ramfs]]: |
<code c> | <code c> | ||
Line 199: | Line 199: | ||
</code> | </code> | ||
- | Un **exemplu pentru un sistem de fișiere pentru disc** este funcția [[http://lxr.free-electrons.com/source/fs/minix/inode.c?v=4.9#L651 | minix_mount]] din sistemul de fișiere [[http://lxr.free-electrons.com/source/fs/minix/?v=4.9 | minix]]: | + | Un **exemplu pentru un sistem de fișiere pentru disc** este funcția [[https://elixir.bootlin.com/linux/v4.15/source/fs/minix/inode.c#L653 | minix_mount]] din sistemul de fișiere [[http://lxr.free-electrons.com/source/fs/minix/?v=4.15 | minix]]: |
<code c> | <code c> | ||
Line 215: | Line 215: | ||
==== Structura struct super_block ==== | ==== Structura struct super_block ==== | ||
- | O parte din definiția structurii [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L1338 | struct super_block]] este prezentată mai jos: | + | O parte din definiția structurii [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L1337 | struct super_block]] este prezentată mai jos: |
<code c> | <code c> | ||
Line 221: | Line 221: | ||
//... | //... | ||
dev_t s_dev; /* identifier */ | dev_t s_dev; /* identifier */ | ||
+ | unsigned char s_blocksize_bits; /* block size in bits */ | ||
unsigned long s_blocksize; /* block size in bytes */ | unsigned long s_blocksize; /* block size in bytes */ | ||
- | unsigned char s_blocksize_bits; /* block size in bits */ | ||
unsigned char s_dirt; /* dirty flag */ | unsigned char s_dirt; /* dirty flag */ | ||
- | unsigned long long s_maxbytes; /* max file size */ | + | loff_t s_maxbytes; /* max file size */ |
struct file_system_type *s_type; /* filesystem type */ | struct file_system_type *s_type; /* filesystem type */ | ||
struct super_operations *s_op; /* superblock methods */ | struct super_operations *s_op; /* superblock methods */ | ||
Line 249: | Line 249: | ||
==== Operațiile pe superbloc ==== | ==== Operațiile pe superbloc ==== | ||
- | Operațiile pe superbloc sunt descrise de structura [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L1786 | struct super_operations]]: | + | Operațiile pe superbloc sunt descrise de structura [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L1803 | struct super_operations]]: |
<code c> | <code c> | ||
Line 260: | Line 260: | ||
void (*put_super) (struct super_block *); | void (*put_super) (struct super_block *); | ||
int (*statfs) (struct dentry *, struct kstatfs *); | int (*statfs) (struct dentry *, struct kstatfs *); | ||
- | int (*remount_fs) (struct super_block *sb, int *flags, char *data); | + | int (*remount_fs) (struct super_block *, int *, char *); |
//... | //... | ||
}; | }; | ||
Line 274: | Line 274: | ||
===== Funcția fill_super ===== | ===== Funcția fill_super ===== | ||
- | După cum s-a specificat, funcția ''fill_super'' este apelată pentru terminarea inițializării superblocului. Această inițializare presupune completarea câmpurilor structurii [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L1338 | struct super_block]] și inițializarea inode-ului rădăcină. | + | După cum s-a specificat, funcția ''fill_super'' este apelată pentru terminarea inițializării superblocului. Această inițializare presupune completarea câmpurilor structurii [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L1337 | struct super_block]] și inițializarea inode-ului rădăcină. |
- | Un exemplu de implementare este funcția [[http://lxr.free-electrons.com/source/fs/ramfs/inode.c?v=4.9#L208 | ramfs_fill_super]] apelată pentru inițializarea câmpurile din superbloc care au mai rămas de inițializat: | + | Un exemplu de implementare este funcția [[https://elixir.bootlin.com/linux/v4.15/source/fs/ramfs/inode.c#L220 | ramfs_fill_super]] apelată pentru inițializarea câmpurile din superbloc care au mai rămas de inițializat: |
<code c> | <code c> | ||
Line 285: | Line 285: | ||
static const struct super_operations ramfs_ops = { | static const struct super_operations ramfs_ops = { | ||
.statfs = simple_statfs, | .statfs = simple_statfs, | ||
- | .drop_inode = generic_drop_inode, | + | .drop_inode = generic_delete_inode, |
- | .show_options = generic_show_options, | + | .show_options = ramfs_show_options, |
}; | }; | ||
Line 322: | Line 322: | ||
</code> | </code> | ||
- | În kernel sunt disponibile funcții generice pentru implementarea operațiilor cu structurile sistemelor de fișiere. Funcțiile [[http://lxr.free-electrons.com/source/include/linux/fs.h?v=4.9#L2730 | generic_drop_inode]] și [[http://lxr.free-electrons.com/source/fs/libfs.c?v=4.9#L33 | simple_statfs]], folosite în codul de mai sus, sunt astfel de funcții și pot fi folosite în implementarea driverelor, daca funcționalitatea acestora este suficientă. | + | În kernel sunt disponibile funcții generice pentru implementarea operațiilor cu structurile sistemelor de fișiere. Funcțiile [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/fs.h#L2867 | generic_drop_inode]] și [[https://elixir.bootlin.com/linux/v4.15/source/fs/libfs.c#L34 | simple_statfs]], folosite în codul de mai sus, sunt astfel de funcții și pot fi folosite în implementarea driverelor, daca funcționalitatea acestora este suficientă. |
- | În mare, funcția [[http://lxr.free-electrons.com/source/fs/ramfs/inode.c?v=4.9#L208 | ramfs_fill_super]] din codul de mai sus setează câteva câmpuri din superbloc, apoi citește inode-ul rădăcină și alocă dentry-ul rădăcină. Citirea inode-ului radăcină se face în funcția [[http://lxr.free-electrons.com/source/fs/ramfs/inode.c?v=4.9#L53 | ramfs_get_inode]], și constă din alocarea unui nou inode folosind [[http://lxr.free-electrons.com/source/fs/inode.c?v=4.9#L900 | new_inode]] și inițializarea acestuia. Pentru eliberarea inode-ului se folosește [[http://lxr.free-electrons.com/source/fs/inode.c?v=4.9#L1518 | iput]], iar pentru alocarea dentry-ului rădăcină [[http://lxr.free-electrons.com/source/fs/dcache.c?v=4.9#L1846 | d_make_root]]. | + | În mare, funcția [[https://elixir.bootlin.com/linux/v4.15/source/fs/ramfs/inode.c#L220 | ramfs_fill_super]] din codul de mai sus setează câteva câmpuri din superbloc, apoi citește inode-ul rădăcină și alocă dentry-ul rădăcină. Citirea inode-ului radăcină se face în funcția [[https://elixir.bootlin.com/linux/v4.15/source/fs/ramfs/inode.c#L61 | ramfs_get_inode]], și constă din alocarea unui nou inode folosind [[https://elixir.bootlin.com/linux/v4.15/source/fs/inode.c#L901 | new_inode]] și inițializarea acestuia. Pentru eliberarea inode-ului se folosește [[https://elixir.bootlin.com/linux/v4.15/source/fs/inode.c#L1518 | iput]], iar pentru alocarea dentry-ului rădăcină [[https://elixir.bootlin.com/linux/v4.15/source/fs/dcache.c#L1885 | d_make_root]]. |
- | Un exemplu de implementare pentru un sistem de fișiere pentru disc este funcția [[http://lxr.free-electrons.com/source/fs/minix/inode.c?v=4.9#L158 | minix_fill_super]] din sistemul de fișiere [[http://lxr.free-electrons.com/source/fs/minix/?v=4.9 | minix]]. | + | Un exemplu de implementare pentru un sistem de fișiere pentru disc este funcția [[https://elixir.bootlin.com/linux/v4.15/source/fs/minix/inode.c#L158 | minix_fill_super]] din sistemul de fișiere [[http://lxr.free-electrons.com/source/fs/minix/?v=4.15 | minix]]. |
- | Funcționalitatea pentru sistemul de fișiere pentru disc este similară cu cea a sistemului de fișiere virtual, cu deosebirea folosirii buffer cache-ului. De asemenea, sistemul de fișiere ''minix'' păstrează date private de forma [[http://lxr.free-electrons.com/source/fs/minix/minix.h?v=4.9#L27 | struct minix_sb_info]]. Mare parte a acestei funcții se ocupa cu inițializarea acestor date private (care nu sunt incluse în extrasul de cod de mai sus, pentru claritate). Datele private sunt alocate folosind funcția [[http://lxr.free-electrons.com/source/include/linux/slab.h?v=4.9#L629| kzalloc]] și sunt păstrate în câmpul ''s_fs_info'' al superblocului. | + | Funcționalitatea pentru sistemul de fișiere pentru disc este similară cu cea a sistemului de fișiere virtual, cu deosebirea folosirii buffer cache-ului. De asemenea, sistemul de fișiere ''minix'' păstrează date private de forma [[https://elixir.bootlin.com/linux/v4.15/source/fs/minix/minix.h#L28 | struct minix_sb_info]]. Mare parte a acestei funcții se ocupa cu inițializarea acestor date private (care nu sunt incluse în extrasul de cod de mai sus, pentru claritate). Datele private sunt alocate folosind funcția [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/slab.h#L681| kzalloc]] și sunt păstrate în câmpul ''s_fs_info'' al superblocului. |
Funcțiile VFS-ului primesc de obicei ca parametru superblocul, un inode sau/și un dentry, care conțin un pointer către superbloc, astfel încât aceste date private pot fi accesate ușor. | Funcțiile VFS-ului primesc de obicei ca parametru superblocul, un inode sau/și un dentry, care conțin un pointer către superbloc, astfel încât aceste date private pot fi accesate ușor. | ||
Line 333: | Line 333: | ||
===== Buffer cache-ul ===== | ===== Buffer cache-ul ===== | ||
- | Buffer cache-ul este un subsistem în kernel care se ocupă caching-ul (atât la citire cât și la scriere) blocurilor de pe dispozitivele de tip bloc. Entitatea de bază cu care lucrează buffer cache-ul este [[http://lxr.free-electrons.com/source/include/linux/buffer_head.h?v=4.9#L62 | struct buffer_head]]. Câmpurile mai importante din această structură sunt: | + | Buffer cache-ul este un subsistem în kernel care se ocupă caching-ul (atât la citire cât și la scriere) blocurilor de pe dispozitivele de tip bloc. Entitatea de bază cu care lucrează buffer cache-ul este [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/buffer_head.h#L54 | struct buffer_head]]. Câmpurile mai importante din această structură sunt: |
* ''b_data'', pointer către o zonă din memorie de unde au fost citite sau unde trebuie scrise date | * ''b_data'', pointer către o zonă din memorie de unde au fost citite sau unde trebuie scrise date | ||
* ''b_size'', dimensiunea buffer-ului | * ''b_size'', dimensiunea buffer-ului | ||
Line 341: | Line 341: | ||
Există câteva funcții importante ce lucrează cu astfel de structuri: | Există câteva funcții importante ce lucrează cu astfel de structuri: | ||
- | * [[http://lxr.free-electrons.com/source/include/linux/buffer_head.h?v=4.9#L377 | __bread]]: citește un bloc cu numărul dat și de dimensiune dată într-o structură ''buffer_head''; în caz de succes întoarce un pointer către ''buffer_head'', altfel întoarce ''NULL''; | + | * [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/buffer_head.h#L383 | __bread]]: citește un bloc cu numărul dat și de dimensiune dată într-o structură ''buffer_head''; în caz de succes întoarce un pointer către ''buffer_head'', altfel întoarce ''NULL''; |
- | * [[http://lxr.free-electrons.com/source/include/linux/buffer_head.h?v=4.9#L298 | sb_bread]]: face același lucru ca și funcția precedentă, dimensiunea blocului de citit fiind luată din superbloc, la fel și dispozitivul de pe care se face citirea; | + | * [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/buffer_head.h#L304 | sb_bread]]: face același lucru ca și funcția precedentă, dimensiunea blocului de citit fiind luată din superbloc, la fel și dispozitivul de pe care se face citirea; |
- | * [[http://lxr.free-electrons.com/source/fs/buffer.c?v=4.9#L1136 | mark_buffer_dirty]]: marchează buffer-ul dirty (setează bitul ''BH_Dirty''); buffer-ul va fi scris pe disc la un moment ulterior de timp (din când în când kernel thread-ul ''bdflush'' se trezește și scrie buffere pe disc); | + | * [[https://elixir.bootlin.com/linux/v4.15/source/fs/buffer.c#L1094 | mark_buffer_dirty]]: marchează buffer-ul dirty (setează bitul ''BH_Dirty''); buffer-ul va fi scris pe disc la un moment ulterior de timp (din când în când kernel thread-ul ''bdflush'' se trezește și scrie buffere pe disc); |
- | * [[http://lxr.free-electrons.com/source/include/linux/buffer_head.h?v=4.9#L286 | brelse]]: eliberează memoria folosită de buffer, după ce în prealabil a scris buffer-ul pe disc daca era nevoie; | + | * [[https://elixir.bootlin.com/linux/v4.15/source/fs/buffer.c#L1152 | brelse]]: eliberează memoria folosită de buffer, după ce în prealabil a scris buffer-ul pe disc daca era nevoie; |
- | * [[http://lxr.free-electrons.com/source/include/linux/buffer_head.h?v=4.9#L329 | map_bh]]: asociază buffer-head-ul cu sectorul corespunzător. | + | * [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/buffer_head.h#L341 | map_bh]]: asociază buffer-head-ul cu sectorul corespunzător. |
===== Funcții și macro-uri folositoare ===== | ===== Funcții și macro-uri folositoare ===== | ||
Superblocul conține de obicei o hartă a blocurilor ocupate (de inode-uri, dentry, date) sub forma unui bitmap (vector de biți). Pentru lucrul cu aceste hărți se recomandă folosirea următoarelor funcții: | Superblocul conține de obicei o hartă a blocurilor ocupate (de inode-uri, dentry, date) sub forma unui bitmap (vector de biți). Pentru lucrul cu aceste hărți se recomandă folosirea următoarelor funcții: | ||
- | * [[http://lxr.free-electrons.com/source/lib/find_bit.c?v=4.9#L100 | find_first_zero_bit]], pentru găsirea primului bit zero dintr-o zonă de memorie. Parametrul size semnifică numărul de biți al zonei în care se face căutarea; | + | * [[https://elixir.bootlin.com/linux/v4.15/source/lib/find_bit.c#L100 | find_first_zero_bit]], pentru găsirea primului bit zero dintr-o zonă de memorie. Parametrul size semnifică numărul de biți al zonei în care se face căutarea; |
- | * [[http://lxr.free-electrons.com/source/include/asm-generic/bitops/atomic.h?v=4.9#L118 | test_and_set_bit]], pentru setarea unui bit și obținerea vechii valori; | + | * [[https://elixir.bootlin.com/linux/v4.15/source/include/asm-generic/bitops/atomic.h#L119 | test_and_set_bit]], pentru setarea unui bit și obținerea vechii valori; |
- | * [[http://lxr.free-electrons.com/source/include/asm-generic/bitops/atomic.h?v=4.9#L142 | test_and_clear_bit]], pentru ștergerea unui bit și obținerea vechii valori; | + | * [[https://elixir.bootlin.com/linux/v4.15/source/include/asm-generic/bitops/atomic.h#L143 | test_and_clear_bit]], pentru ștergerea unui bit și obținerea vechii valori; |
- | * [[http://lxr.free-electrons.com/source/include/asm-generic/bitops/atomic.h?v=4.9#L166 | test_and_change_bit]], pentru inversarea valorii unui bit și obținerea vechii valori. | + | * [[https://elixir.bootlin.com/linux/v4.15/source/include/asm-generic/bitops/atomic.h#L167 | test_and_change_bit]], pentru inversarea valorii unui bit și obținerea vechii valori. |
Pentru verificarea tipului unui inode se pot folosi următoarele macrodefiniții: | Pentru verificarea tipului unui inode se pot folosi următoarele macrodefiniții: | ||
- | * [[http://lxr.free-electrons.com/source/include/uapi/linux/stat.h?v=4.9#L21 | S_ISDIR]]''(inode->i_mode)'', pentru a verifica dacă inode-ul este un director; | + | * [[https://elixir.bootlin.com/linux/v4.15/source/include/uapi/linux/stat.h#L23 | S_ISDIR]]''(inode->i_mode)'', pentru a verifica dacă inode-ul este un director; |
- | * [[http://lxr.free-electrons.com/source/include/uapi/linux/stat.h?v=4.9#L20 | S_ISREG]]''(inode->i_mode)'', pentru a verifica dacă inode-ul este un fișier clasic (nu de tip link sau device). | + | * [[https://elixir.bootlin.com/linux/v4.15/source/include/uapi/linux/stat.h#L22 | S_ISREG]]''(inode->i_mode)'', pentru a verifica dacă inode-ul este un fișier clasic (nu de tip link sau device). |
===== Resurse utile ===== | ===== Resurse utile ===== | ||
Line 372: | Line 372: | ||
- [[http://lxr.free-electrons.com/source/Documentation/filesystems/vfs.txt|Documentation/filesystems/vfs.txt]] | - [[http://lxr.free-electrons.com/source/Documentation/filesystems/vfs.txt|Documentation/filesystems/vfs.txt]] | ||
- [[http://lxr.free-electrons.com/source/fs/|Sursele sistemelor de fișiere]] | - [[http://lxr.free-electrons.com/source/fs/|Sursele sistemelor de fișiere]] | ||
- | * [[http://lxr.free-electrons.com/source/fs/proc/?v=4.9 | procfs]] (//Process File System//) - [[http://lxr.free-electrons.com/source/fs/proc/?v=4.9|sursele sistemului de fișiere procfs]] și [[http://lxr.free-electrons.com/source/Documentation/filesystems/proc.txt?v=4.9|documentația]] | + | * [[http://lxr.free-electrons.com/source/fs/proc/?v=4.15 | procfs]] (//Process File System//) - [[http://lxr.free-electrons.com/source/fs/proc/?v=4.15|sursele sistemului de fișiere procfs]] și [[http://lxr.free-electrons.com/source/Documentation/filesystems/proc.txt?v=4.15|documentația]] |
- | * [[http://lxr.free-electrons.com/source/fs/ramfs/?v=4.9 | ramfs]] (//Random Access Memory Filing System//) - [[http://lxr.free-electrons.com/source/fs/ramfs/?v=4.9|sursele sistemului de fișiere ramfs]] și [[http://lxr.free-electrons.com/source/Documentation/filesystems/ramfs-rootfs-initramfs.txt?v=4.9|documentația]] | + | * [[http://lxr.free-electrons.com/source/fs/ramfs/?v=4.15 | ramfs]] (//Random Access Memory Filing System//) - [[http://lxr.free-electrons.com/source/fs/ramfs/?v=4.15|sursele sistemului de fișiere ramfs]] și [[http://lxr.free-electrons.com/source/Documentation/filesystems/ramfs-rootfs-initramfs.txt?v=4.15|documentația]] |
- | * [[http://en.wikipedia.org/wiki/Romfs|romfs]] (//Read-Only Memory File System//) - [[http://lxr.free-electrons.com/source/fs/romfs/?v=4.9|sursele sistemului de fișiere romfs]] și [[http://lxr.free-electrons.com/source/Documentation/filesystems/romfs.txt?v=4.9|documentația]] | + | * [[http://en.wikipedia.org/wiki/Romfs|romfs]] (//Read-Only Memory File System//) - [[http://lxr.free-electrons.com/source/fs/romfs/?v=4.15|sursele sistemului de fișiere romfs]] și [[http://lxr.free-electrons.com/source/Documentation/filesystems/romfs.txt?v=4.15|documentația]] |
- | * [[http://lxr.free-electrons.com/source/fs/minix/?v=4.9 | minix]] - [[http://lxr.free-electrons.com/source/fs/minix/?v=4.9|sursele sistemului de fișiere minix]] și informații: [[http://www.minix3.org/index.html|Minix Homepage]], Operating Systems Design and Implementation, Third Edition - Chapter 5. File Systems | + | * [[http://lxr.free-electrons.com/source/fs/minix/?v=4.15 | minix]] - [[http://lxr.free-electrons.com/source/fs/minix/?v=4.15|sursele sistemului de fișiere minix]] și informații: [[http://www.minix3.org/index.html|Minix Homepage]], Operating Systems Design and Implementation, Third Edition - Chapter 5. File Systems |
- | * [[http://en.wikipedia.org/wiki/Boot_File_System|bfs]] (//UnixWare Boot FileSystem//)- [[http://lxr.free-electrons.com/source/fs/bfs/?v=4.9|sursele sistemului de fișiere bfs]], [[http://lxr.free-electrons.com/source/Documentation/filesystems/bfs.txt|documentația]] și informații: [[http://www.nondot.org/sabre/os/files/FileSystems/bfs-structure.html|The BFS filesystem structure]], [[http://tldp.org/LDP/lki/lki-3.html#ss3.7|Linux Kernel 2.4 Internals - 3.7. Example Disk Filesystem: BFS]] | + | * [[http://en.wikipedia.org/wiki/Boot_File_System|bfs]] (//UnixWare Boot FileSystem//)- [[http://lxr.free-electrons.com/source/fs/bfs/?v=4.15|sursele sistemului de fișiere bfs]], [[http://lxr.free-electrons.com/source/Documentation/filesystems/bfs.txt|documentația]] și informații: [[http://www.nondot.org/sabre/os/files/FileSystems/bfs-structure.html|The BFS filesystem structure]], [[http://tldp.org/LDP/lki/lki-3.html#ss3.7|Linux Kernel 2.4 Internals - 3.7. Example Disk Filesystem: BFS]] |