Salut,<br><br>Câteva probleme / nelămuriri.<br><br><b>1. buffer_head şi block_size</b><br>Am terminat de implementat tot la temă şi ajungeam cu testerul aici:<br><br>test 347: check free blocks...........................................ok<br>
test 348: check free inodes...........................................ok<br>test 349: umounting fs................................................ok<br>test 350: mounting fs.................................................ok<br>
test 351: check free blocks.......................................failed<br>  -- [ 4095 = 3494 ]<br><br>După cum se observă, la umount nu se salva bine superblocul.<br>Eu am apelat <b>mark_buffer_dirty</b> şi <b>brelse</b> la toate buffer_head-urile folosite de <b>super_block</b> din handler-ul <b>put_super</b>.<br>
M-am uitat cu hexeditorul şi imap-ul şi dmap-ul se salvau, super_block-ul nu!<br><br>Am rezolvat problema, dar nu ştiu ce avea.<br>Pentru superbloc, deschideam un buffer_head (sbi->sb_bh) pe care il tineam deschis până la <b>put_super</b>.<br>
Aici îl făceam dirty şi închideam. Ei bine, exact la fel făceam şi cu <b>imap_bh</b> şi <b>dmap_bh</b> şi ele se salvau...<br>Ce diferă: <b>sb_bh</b> î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ă.<br>
Se pare că asta făcea probleme. Am rezolvat închizând bufferul şi re-deschizându-l la <b>put_super</b>, când aveam nevoie de el.<br><br><b>2. write_inode</b><br>Mai am o problemă asemănătoare şi la <b>write_inode</b>. De data asta nerezolvată :D <br>
Doar că aici nu mi se apelează deloc dacă dau umount prea devreme. <br>Trebuie, la fel, să aştept câteva secunde după ce am făcut modificările să mi se scrie inode-ul pe disk.<br>Am apelat <b>mark_inode_dirty</b> peste tot, sunt 100% sigur de asta. La fel, <b>brelse</b>-uri apelate bine (însă aici nici nu apucă să se execute, deoarece nu-mi intră deloc în write_inode când dau umount).<br>
Şi acum nu am mai modificat buffer_size-ul. A rămas cel setat în <b>fill_super</b>.<br><br>Ştie careva din ce cauză se întâmplă lucrul acesta?<br>Cum pot forţa să-mi salveze inode-urile dirty automat înainte de mount? <br>
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.<br>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.).<br>
De ce minix nu are problema asta, deşi nu a apelat nicio rutină de sincronizare?<br><br>Mulţumesc.<br>