[so2] [Tema4] Problemă cu sincronizarea bufferelor

Florin-Alexandru Stancu niflostancu at gmail.com
Sun May 12 20:26:31 EEST 2013


Salut,

Câteva probleme / nelămuriri.

*1. buffer_head şi block_size*
Am terminat de implementat tot la temă şi ajungeam cu testerul aici:

test 347: check free blocks...........................................ok
test 348: check free inodes...........................................ok
test 349: umounting fs................................................ok
test 350: mounting fs.................................................ok
test 351: check free blocks.......................................failed
  -- [ 4095 = 3494 ]

După cum se observă, la umount nu se salva bine superblocul.
Eu am apelat *mark_buffer_dirty* şi *brelse* la toate buffer_head-urile
folosite de *super_block* din handler-ul *put_super*.
M-am uitat cu hexeditorul şi imap-ul şi dmap-ul se salvau, super_block-ul
nu!

Am rezolvat problema, dar nu ştiu ce avea.
Pentru superbloc, deschideam un buffer_head (sbi->sb_bh) pe care il tineam
deschis până la *put_super*.
Aici îl făceam dirty şi închideam. Ei bine, exact la fel făceam şi cu *
imap_bh* şi *dmap_bh* şi ele se salvau...
Ce diferă: *sb_bh* îl deschideam cu un block_size de 4096 şi, după aceea,
modificam block_size-ul la cât scria în structura mea super_block citită.
Se pare că asta făcea probleme. Am rezolvat închizând bufferul şi
re-deschizându-l la *put_super*, când aveam nevoie de el.

*2. write_inode*
Mai am o problemă asemănătoare şi la *write_inode*. De data asta
nerezolvată :D
Doar că aici nu mi se apelează deloc dacă dau umount prea devreme.
Trebuie, la fel, să aştept câteva secunde după ce am făcut modificările să
mi se scrie inode-ul pe disk.
Am apelat *mark_inode_dirty* peste tot, sunt 100% sigur de asta. La fel, *
brelse*-uri apelate bine (însă aici nici nu apucă să se execute, deoarece
nu-mi intră deloc în write_inode când dau umount).
Şi acum nu am mai modificat buffer_size-ul. A rămas cel setat în *fill_super
*.

Ştie careva din ce cauză se întâmplă lucrul acesta?
Cum pot forţa să-mi salveze inode-urile dirty automat înainte de mount?
Am găsit nişte rutine de sincronizare a device-ului răsfoind prin surse, o
să încerc să le apelez, dar am marcat bufferele ca dirty, ar trebui să mi
se salveze la un moment dat.
Am căutat şi în codul sursă de la minix şi nu se apelează nimic neobişnuit
(nici o astfel rutină de buffer sync etc.).
De ce minix nu are problema asta, deşi nu a apelat nicio rutină de
sincronizare?

Mulţumesc.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so2/attachments/20130512/42c81b7d/attachment.html>


More information about the so2 mailing list