список каталогов с помощью FUSE

Вот проблема, с которой я боролся в течение некоторого времени без какого-либо прогресса. Надеюсь, вы можете мне помочь!

Я без проблем монтирую FUSE в каталог ('home/fsc'), даже перечисляя его родительский каталог (/home) следующим образом:

в то время как на /home .. ls -l

И операция getattr работает просто отлично.

Проблема возникает, когда я открываю каталог ('cd fsc'), он открывается правильно, и при отладке операций я вижу, как предохранитель запрашивает атрибуты файла '/', но когда я пытаюсь перечислить файлы внутри этого каталога, предохранитель запрашивает атрибуты «/ tls» в бесконечном цикле всегда получают ошибку «2», «Нет такого файла или каталога», пока он не отключится.

Что я нахожу еще более любопытным, так это то, что он никогда не входит в операцию readdir, как я ожидал.

Любая идея о том, почему это может происходить? Почему предохранитель запрашивает атрибуты «/ tls» вместо выполнения readdir «/»?

Большое спасибо за вашу помощь здесь, мне нужно решение для этого университетского проекта, мне нужно, чтобы он работал в ближайшее время, поэтому помощь очень ценится!.

С уважением,

РЕДАКТИРОВАТЬ:

Я только что заметил, что он также запрашивает атрибуты файла «/i686», «/sse2», «/ cmov», «/ librt.so.1» во время этого цикла, а затем снова возвращается к «/ tls».

2.-РЕДАКТИРОВАТЬ:

ОПЕРАЦИЯ ПОЛУЧЕНИЯ

int client_getattr(const char* c_ruta, struct stat* ptr_est_salida) {

int error = 0;
size_t size_structStat = sizeof(struct stat);
t_conexion* ptr_conexionLibre = poolConexion_obtenerConexion();
char out_key[50];
char s_stat[sizeof(struct stat)];
_ArmaKeyRC_fsc(c_ruta,GET_ATTR,out_key);

if (!strcmp((char*) configuracion_estadoRC(),"ON")){
    if (rc_get_static(out_key, s_stat, &size_structStat) != 0) {

        logger_info("Acierto en RC (Getattr) Se omite comunicacion con RFS...");
        // TODO
        return error;

    } else {

        logger_info("No hubo acierto en RC (Getattr) Inicia comunicacion con RFS...");
    }
}

error = nipc_invocar_getattr(ptr_conexionLibre, c_ruta, ptr_est_salida);

if (!error){
    logger_info("La operacion getattr fue realizada con éxito");

    if (!strcmp((char*) configuracion_estadoRC(),"ON")){
        logger_info("Almacenando getattr en RC...");

        _serializaStructStat(*ptr_est_salida,s_stat);
        rc_store(out_key, s_stat, sizeof(struct stat));
    }
}

poolConexion_conexionDisponible(ptr_conexionLibre);

return error;

ОПЕРАЦИЯ READDIR

int client_readdir(const char* c_ruta, void* ptr_salida,
    fuse_fill_dir_t fn_llenadorDeElementosEnBuffer, off_t offset,
    struct fuse_file_info* ptr_est_infoArchivo) {

int error = 0;

t_conexion* ptr_conexionLibre = poolConexion_obtenerConexion();

if (!strcmp((char*) configuracion_estadoRC(),"ON")){
    if (rc_get(c_ruta) != 0) {

        logger_info("Acierto en RC (Readdir) Se omite comunicacion con RFS...");

        return error;

    } else {

        logger_info("No hubo acierto en RC (Readdir) Inicia comunicacion con RFS...");
    }
}

char** ptr_datos=NULL;
size_t cantidadLeida = 0;
error = nipc_invocar_readDir(ptr_conexionLibre, c_ruta,
        ptr_est_infoArchivo->fh, &ptr_datos, &cantidadLeida);
off_t filler_offset;

while (strcmp( ptr_datos[filler_offset],"")==0){
    fn_llenadorDeElementosEnBuffer(ptr_salida,(const char*) ptr_datos[filler_offset],NULL,0);
    filler_offset = filler_offset + 256;
}

if (!error){
    logger_info("La operacion readdir fue realizada con éxito");

    if (!strcmp((char*) configuracion_estadoRC(),"ON")){
        logger_info("Almacenando readdir en RC...");

        //char out_key[50];
        //_ArmaKeyRC_fsc(c_ruta, GET_ATTR, out_key);
        //rc_store(out_key, (char*) ptr_est_salida, sizeof(struct stat));
    }
}

poolConexion_conexionDisponible(ptr_conexionLibre);

return error;

ПРЕДОХРАНИТЕЛЬ ГЛАВНЫЙ

#include "fuse_interface.h"
#include <stddef.h>
#include <stdlib.h>
#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <time.h>
#include "cliente.h"

// Estructura auxiliar que se usa para pasarle parámetros
// por línea de comando a la función principal de FUSE
struct t_runtime_options {
    char* welcome_msg;
} runtime_options;

// Esta macro sirve para definir nuestros propios parámetros
#define CUSTOM_FUSE_OPT_KEY(t, p, v) { t, offsetof(struct t_runtime_options, p), v }

// Estructura de operaciones de FUSE, contiene
// punteros a las funciones que debe ejecutar FUSE
// según se solicite.

static struct fuse_operations client_operations = { .getattr = client_getattr,
        .readdir = client_readdir, .open = client_open, .read = client_read,
        .unlink = client_unlink, .release = client_release, .rmdir =
                client_rmdir, .truncate = client_truncate,
        .write = client_write, .create = client_create, .mkdir = client_mkdir, };

/** keys for FUSE_OPT_ options */
enum {
    KEY_VERSION, KEY_HELP,
};

//Esta estructura es utilizada para decirle a la biblioteca de FUSE que
// parametro puede recibir y donde tiene que guardar el valor de estos
static struct fuse_opt fuse_options[] = {

        // Este es un parámetro definido por la cátedra de SISOP
        CUSTOM_FUSE_OPT_KEY("--welcome-msg %s", welcome_msg, 0),

        // Estos son parametros por defecto que ya tiene FUSE
        FUSE_OPT_KEY("-V", KEY_VERSION), FUSE_OPT_KEY("--version", KEY_VERSION),
                FUSE_OPT_KEY("-h", KEY_HELP), FUSE_OPT_KEY("--help", KEY_HELP),
        FUSE_OPT_END, };

int main(int argc, char *argv[]) {

    if (argc < 2) {
        perror("FSC:falta indicar la ruta del archivo de configuracion");
        exit(-1);
    }

    char c_config[256];
    strcpy(c_config, argv[1]);

    cliente_iniciar(c_config);

    int fuse_argc = 3;
    char nombrePrograma[256];
    strcpy(nombrePrograma, argv[0]);
    char puntoMontaje[256];
    strcpy(puntoMontaje, configuracion_pathMontajeFS());
    char parametro[256];
    strcpy(parametro, "-f");

    char* fuse_argv[3];
    fuse_argv[0]=nombrePrograma;
    fuse_argv[1]=puntoMontaje;
    fuse_argv[2]=parametro;


    printf("Iniciando Fuse: Mount Point: %s", configuracion_pathMontajeFS());
    // Inicializo la estructura de argumentos de FUSE
    struct fuse_args args = FUSE_ARGS_INIT(fuse_argc, fuse_argv);

    // Limpio la estructura que va a contener los parametros
    memset(&runtime_options, 0, sizeof(struct t_runtime_options));

    // Esta funcion de FUSE lee los parametros recibidos y los intepreta
    if (fuse_opt_parse(&args, &runtime_options, fuse_options, NULL) == -1) {
        perror("Fuse dice: Argumentos Invalidos");
        return EXIT_FAILURE;
    }

    // Si se paso el parametro --welcome-msg
    // el campo welcome_msg deberia tener el
    // valor pasado
    if (runtime_options.welcome_msg != NULL) {
        printf("%s\n", runtime_options.welcome_msg);
    } else {
    }

    // Esta es la funcion principal de FUSE, es la que se encarga
    // de realizar el montaje, comuniscarse con el kernel, delegar las cosas
    // en varios threads
    return fuse_main(args.argc, args.argv, &client_operations, NULL);

}

person Guillermo Gruschka    schedule 15.07.2012    source источник
comment
Вам нужно включить код, который у вас есть, чтобы мы могли понять, о чем вы говорите. Все, что мы можем сделать, это предположить, в чем ваша проблема.   -  person Jeff Mercado    schedule 16.07.2012
comment
@JeffMercado: Спасибо за ваш ответ, я понял вашу точку зрения, я этого не сделал, потому что код довольно большой. Пожалуйста, проверьте мой пост сейчас, я добавлю операции getattr и readdir, о которых я говорю.   -  person Guillermo Gruschka    schedule 16.07.2012
comment
@JeffMercado: В любом случае, вы можете проверить это сейчас, если бы вы могли дать мне подсказку о том, как FUSE должен вести себя при попытке перечислить свою точку монтирования, это могло бы мне очень помочь! это скорее концептуальное сомнение.   -  person Guillermo Gruschka    schedule 16.07.2012


Ответы (1)


я думаю, что это та же самая проблема, описанная в этом отчете об ошибке Debian 747941 в основном, это проблема пути поиска динамической библиотеки.

person Dyno Fu    schedule 24.01.2015