Closed agustinpriano closed 4 years ago
👋 Nos contás un que funciones tenés implementadas, como lo estás corriendo el programa, etc?
Desde la distancia es bastante dificil debuggear código ajeno 😥
Dale, el struct de funciones es:
Y las Run Configurations del archivo .c del cliente:
Estimo que aún no lo sabés, pero acá hay una contradicción, mirá:
[...] no entiendo por qué tira este error si no está atendiendo ninguna operación [...]
Por consola muestra el siguiente error:
[...] unique: 2, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 3185 unique: 2, error: -38 (Function not implemented), outsize: 16 unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 47, pid: 3185 LOOKUP /.Trash getattr /.Trash fuse: bad error value: 1 unique: 3, error: -34 (Numerical result out of range), outsize: 16 unique: 4, opcode: LOOKUP (1), nodeid: 1, insize: 52, pid: 3185 LOOKUP /.Trash-1000 getattr /.Trash-1000 fuse: bad error value: 1 unique: 4, error: -34 (Numerical result out of range), outsize: 16
El log de debug de FUSE te muestra que le está cayendo al menos una operación de getattr
sobre el path /.Trash
de tu filesystem (y después otro para /.Trash-1000
).
Además, te está diciendo que hay un error - que el valor que tu función getattr
devuelve está fuera del intervalo válido para esa función. Es decir: tu función getattr
no cumple con el protocolo especificado por FUSE.
No miré tu código, pero imagino que, claro - estás arrancando con esto, entonces seguramente hardcodeaste un return 1
en el cuerpo de la función para ver de qué va la mano. Súper entendible, eh 👍 Nomás que, buen - el valor no le gusta a FUSE, y te lo hace saber.
Estimo, igual, que solucionar ese problema... Más o menos te darás maña. Pero lo que realmente te está intrigando es la otra parte de tu mensaje:
simplemente está levantando. O por defecto al levantar pide alguna función en particular?
Y acá es importantísimo que entiendas qué está haciendo tu programa.
Tu programa es una implementación de un filesystem, y, al ejecutarlo, estás montando un nuevo filesystem en tu Linux. Es decir, ejecutar tu programa monta un nuevo volúmen a tu máquina, por lo que ahora todas las syscalls que involucren al directorio en que montaste tu FS (y todos los archivos y directorios descendientes de ese punto de montaje) van a terminar siendo resueltas por tu programa.
Entonces, tu programa "simplemente está levantado", sí. Tu main
sólo dice eso: montate, y quedate esperando a que te hagan pedidos.
Pero, al mismo tiempo, que tu programa esté levantado (y tu FS montado) significa que cualquier otro proceso puede pedir información sobre el contenido de tu FS (en forma de syscalls), y que eventualmente te van a ejecutar las funciones que vos definiste para resolver las distintas operaciones.
Y ¿quién te va a hacer pedidos? Bueno... Cualquier proceso que esté corriendo en tu máquina y tenga permisos para hacerlo.
En particular, lo que estamos viendo en el log es que algún proceso preguntó por un archivo .Trash
en la raíz de tu FS. Lo otro que vemos (bah, que lo ves más vos que nosotros, porque en el log no hay timestamps - pero corregime si estoy mintiendo) es que ese pedido llega siempre al toque de que iniciás tu programa - es decir, al toque de que montás tu FS.
Lo que está pasando es que algún proceso, seguramente parte del escritorio gráfico que está corriendo en tu Linux, se entera de que hay un nuevo FS montado en la máquina, y lo primero que hace es preguntar si existe un directorio que tenga pinta de ser la papelera de reciclaje.
Entonces, sí - simplemente levantaste tu FS; pero no sos vos (como developer) quien controla cuándo te caen pedidos: eso lo decide el kernel, a partir de los pedidos de los procesos que corren en la máquina.
Quizá (no estoy seguro) en la Ubuntu Server no te pase esto de que te pregunten por el .Trash
. De todos modos, el problema a resolver no es "quién me está haciendo este pedido", si no "implementemos bien la función para poder atender el request como FUSE especifica"..
Buenas! Sirvieron las respuestas? Saludos!
Buenas, estaba teniendo un problema cuando quiero inciar el cliente de SAC. Me tira que no está la función implementada, no entiendo por qué tira este error si no está atendiendo ninguna operación, simplemente está levantando. O por defecto al levantar pide alguna función en particular?. El main es del cliente:
En do_operations están las operaciones de fuse con su nuevo nombre redefinidas
Por consola muestra el siguiente error: