Per un incarico universitario, è necessario modificare il file system ext2 per memorizzare i file nei puntatori dei blocchi degli inode se è inferiore a 60 byte e passare alla memoria del blocco normale quando il file diventa più grande di .Scrittura della memoria del kernel nel blocco ext2
Ho copiato il codice ext2 dal sorgente del kernel Linux 2.6 (come indicato) e sono passato da lì.
Quando il file diventa più grande di 60 byte, ho bisogno di copiare tutti i dati che sono attualmente nella matrice di puntatori a blocchi degli inode in blocchi reali. Quindi, ho bisogno di scrivere la memoria del kernel in blocchi ext2. Una semplice chiamata a do_sync_write
non funzionerà qui perché richiede memoria dello spazio utente.
Ho esaminato l'implementazione di do_sync_write
e non sono sicuro di come replicare ciò che fa, ma con la memoria del kernel.
Questo è il mio attuale implementazione di questa parte specifica (non funziona):
ssize_t extmod_write(struct file *filp, const char *buf,
size_t len, loff_t *ppos)
{
...
printk(KERN_INFO "Switching to regular file");
temp = kmalloc(inode->i_size, GFP_KERNEL);
memcpy(temp, EXT2_I(inode)->i_data, inode->i_size);
/* Need to clear the block pointers before they are allocated by kernel */
memset(EXT2_I(inode)->i_data, 0, sizeof(EXT2_I(inode)->i_data));
if (do_sync_write(filp, temp, inode->i_size, &dummy) < 0) {
printk(KERN_INFO "DAMN! Writing current buffer failed");
return -EINVAL;
}
kfree(temp);
return do_sync_write(filp, buf, len, ppos);
Edit:
ho guardato i collegamenti simbolici. Fondamentalmente, ext2 ha il concetto di "symlink veloci"; il nome del collegamento è inferiore a 60 byte. Se si tratta di un collegamento simbolico veloce, i dati vengono memorizzati nei puntatori ai blocchi. Questo è facile da fare e l'ho già implementato per i file normali. Se il collegamento non è un collegamento simbolico veloce, i dati vengono gestiti allo stesso modo dei file normali. Penso di essere tornato al punto di partenza.
Suggerimento: dare un'occhiata ai collegamenti simbolici. IIRC sono memorizzati anche nell'inode, con dimensioni sufficientemente ridotte. – wildplasser
Sì, posso vedere dove hanno appena "memcpy" il nome del collegamento a "EXT2_I (inode) -> i_data'. Il mio problema è cosa se poi vuoi copiare quei dati in un blocco. Il modo generico con cui il modulo ext2 si aspetta sono i dati dell'utente. – Anthony
Non sto facendo i compiti o leggendo, solo per darti un suggerimento. Dai un'occhiata a cosa fa il codice symlink quando il carico utile diventa troppo grande per entrare nell'inode. Ovviamente un blocco del disco deve essere allocato e i puntatori ai blocchi degli inode devono essere inizializzati per puntare ad esso. Non menzionare i bitmap (non so se li aveva ext2) – wildplasser