[pso] [tema4]buguri
Octavian Voicu
octavian.voicu at gmail.com
Thu Jun 4 15:21:36 EEST 2009
2009/6/4 Sandu Popa Marius <sandupopamarius at gmail.com>
> 2. A doua problema este ca delete_inode si destroy_inode se apeleaza de
> prea multe ori: la rmdir chiar daca intorc eroare el imi apeleaza inainte
> delete_inode si destroy_inode.
>
Sa zicem ca ai asta in super_operations:
struct super_operations pitix_sops = {
.alloc_inode = pitix_alloc_inode,
.destroy_inode = pitix_destroy_inode,
.write_inode = pitix_write_inode,
.delete_inode = pitix_delete_inode,
.put_super = pitix_put_super,
.statfs = pitix_statfs,
};
Presupun ca alloc_inode si destroy_inode sunt puse in super_operations si
fac kzalloc respectiv kfree. Functiile alloc_inode si destroy_inode din
super_operations nu se refera la alocarea / dezalocarea de inode-uri din
imap, ci strict la alocarea / dezalocarea de memorie pentru structura inode
(care e inclusa in structura definita de tine care include in plus pointerii
catre blocurile de date din acel inode).
Legat de stergerea inode-urilor, un inode este sters de pe disc (prin
apelarea delete_inode) atunci cand nlink-ul sau ajunge la 0. Asta e
comportamentul pentru drop_inode, functia din super operations care e
apelata cand se vrea eliberarea unui inode din memorie (generic_drop_inode
face asta).
Deci in unlink tu trebuie sa apelezi inode_dec_link_count. Directoarele ar
trebui sa inceapa cu nlink == 2 (pentru directoare incrementezi nlink-ul in
iget), deci in rmdir trebuie sa apelezi unlink + inca o data
inode_dec_link_count. Functia delete_inode se va apela doar cand nlink
ajunge la 0 (deci dupa doua inode_dec_link_count daca nlink era initial 2).
Functia destroy_inode se va apela oricum (chiar daca returnezi eroare, ca sa
elibereze struct inode *).
--
Octavian Voicu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/pso/attachments/20090604/8b2842c9/attachment.htm>
More information about the pso
mailing list