Solucionando: FUSE “Function not implemented” en write

27 05 2012

Vuelvo a pasar por acá…

Estoy haciendo el bendito TP de Sistemas Operativos, y estoy peleando con FUSE.

Implementando la operación de write, me pasaba que al hacer un echo a un archivo inexistente, la consola me daba un “Function not implemented”.

[~]$ echo "test" > tmp/fuse/text.txt
bash: tmp/fuse/text.txt: Function not implemented

En mi fuse_operations había declarado la función de write, por lo que no entendía qué pasaba. Tampoco sabía qué función era la que faltaba, así que después de buscar un rato, me di cuenta de que le podía pasar un parámetro “-d” a fuse_main para que me muestre información de debug.

Ahora, el output del proceso FUSE me mostraba lo siguiente:
unique: 10, opcode: LOOKUP (1), nodeid: 1, insize: 49
LOOKUP /text.txt
getattr /text.txt
getattr /text.txt
NODEID: 3
unique: 10, success, outsize: 144
unique: 11, opcode: OPEN (14), nodeid: 3, insize: 48
open flags: 0x8001 /text.txt
open /text.txt
1, 32769, /text.txt
1, 32769, /text.txt
open[0] flags: 0x8001 /text.txt
unique: 11, success, outsize: 32
unique: 12, opcode: SETATTR (4), nodeid: 3, insize: 128
unique: 12, error: -38 (Function not implemented), outsize: 16
unique: 13, opcode: RELEASE (18), nodeid: 3, insize: 64
release[0] flags: 0x8001
release /text.txt
unique: 13, success, outsize: 16

Las líneas importantes eran esas dos:
unique: 12, opcode: SETATTR (4), nodeid: 3, insize: 128
unique: 12, error: -38 (Function not implemented), outsize: 16

Que me estaban diciendo que me faltaba implementar la operación SETATTR.

Mirando el archivo fuse/fuse.h (yo lo tengo en “/usr/include/fuse/fuse.h”), el struct fuse_operations no tiene ninguna operación .setattr ni nada similar.

Así que buscando en la internés, llegué a este post en osdir en el que cuentan que SETATTR es, en realidad, 4 métodos en uno: chmod, chown, truncate y utime, y que, como mínimo, hay que implementar truncate para que el open no falle.

Así que simplemente me inventé una función dummy (al menos de momento) que no hace nada más que convencer a FUSE de que todos tenemos que ser felices:

int remote_truncate(const char * path, off_t offset) {
// funcion dummy para que no se queje de "function not implemented"
return 0;
}

/**
* http://sourceforge.net/apps/mediawiki/fuse/index.php?title=Functions_list
*/
static struct fuse_operations remote_operations = {
.create = remote_create,
.open = remote_open,
.read = remote_read,
.write = remote_write,
.flush = remote_flush,
.release = remote_release,
.unlink = remote_unlink,
.mkdir = remote_mkdir,
.readdir = remote_readdir,
.rmdir = remote_rmdir,
.getattr = remote_getattr,
.truncate = remote_truncate
};

Y, voilá, todos felices… Al menos por ahora :)

About these ads

Acciones

Información

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.