2011-10-26 15 views
6

Para una asignación universitaria, tenemos que modificar el sistema de archivos ext2 para almacenar archivos en los punteros de bloque del inodo si es menor que 60 bytes, y mover al almacenamiento normal una vez que el archivo crezca más que eso .Escribiendo la memoria kernel al bloque ext2

He copiado el código ext2 de la fuente del kernel 2.6 linux (como se indica) y fui desde allí.

Cuando el archivo crece más de 60 bytes, necesito copiar todos los datos que se encuentran actualmente en la matriz de punteros de bloque del inode en bloques reales. Entonces, necesito escribir la memoria del kernel en bloques ext2. Una simple llamada al do_sync_write no funcionará aquí porque requiere memoria de espacio de usuario.

He visto la implementación de do_sync_write y no estoy seguro de cómo replicar lo que hace, pero con la memoria del kernel en su lugar.

Ésta es mi aplicación actual de esta parte específica (que no funciona):

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); 

Editar:

Miré a los enlaces simbólicos. Básicamente, ext2 tiene el concepto de "enlaces rápidos"; es decir, el nombre del enlace tiene menos de 60 bytes de longitud. Si se trata de un enlace simbólico rápido, los datos se almacenan en los punteros de bloque. Esto es fácil de hacer y ya lo he implementado para archivos regulares. Si el enlace no es un enlace rápido, los datos se manejan de la misma manera que los archivos normales. Creo que he vuelto al punto de partida.

+2

Sugerencia: eche un vistazo a los enlaces simbólicos. IIRC también se almacenan en el inodo, dado el tamaño suficientemente pequeño. – wildplasser

+0

Sí, puedo ver dónde solo 'memcpy' el nombre del enlace a' EXT2_I (inode) -> i_data'. Mi problema es qué pasa si quieres copiar esos datos en un bloque. La forma genérica en que el módulo ext2 espera los datos del usuario. – Anthony

+0

No estoy haciendo tu tarea o leyendo, solo dandote una pista. Eche un vistazo a lo que hace el código de enlace simbólico cuando la carga útil crece demasiado para caber en el inodo. Obviamente, se debe asignar un bloque de disco y los punteros de bloque de inodo deben inicializarse para apuntar a él. No menciones los mapas de bits (no sé si ext2 los tenía) – wildplasser

Respuesta

0

Me las arreglé para resolverlo. Requería obtener struct buffer_head instancias y leer/escribir los datos en ellas. Al recorrer los números del bloque lógico y usar el ext2_get_block para recuperar bloques (asignándolos si es necesario) y luego usar sb_getblk para obtener el búfer real y escribir en él. He publicado una implementación en my blog.

1

Asignación de tarea tonta.

El código no funciona. Pruebe mmap() y muera.

Cuestiones relacionadas