Exemple #1
0
int liberar_inodo(unsigned int ninodo) {
    struct superbloque sb;
    struct inodo inodoAux;
    unsigned int blogico = 0;

    if (bread(posSB, &sb) == -1) {
        printf("Error: ficheros_basico.c > liberar_inodo > al intentar leer el superbloque \n");
        return -1;
    }
    inodoAux = leer_inodo(ninodo);
    liberar_bloques_inodo(ninodo, blogico);

    inodoAux.tipo = 'l';
    inodoAux.ctime = time(NULL);
    // Enlazamos el primer inodo libre 
    inodoAux.punterosDirectos[0] = sb.posPrimerInodoLibre;
    sb.posPrimerInodoLibre = ninodo;
    sb.cantInodosLibres++;

    if (escribir_inodo(inodoAux, ninodo) == -1) {
        printf("Error: ficheros_basico.c > liberar_inodo > al intentar liberar inodo \n");
        return -1;
    }
    
    if (bwrite(posSB, &sb) == -1) {
        printf("Error: ficheros_basico.c > reservar_inodo > al intentar actualizar el superbloque \n");
        return -1;
    }
    return ninodo;
}
Exemple #2
0
/*Trunca (corta) un fichero/directorio (ninodo) pasado por argumento a los bytes (nbytes) pasados por argumento, liberando los bloques que no hagan falta
 * si nbytes = 0 lo liberamos TODO
 */
int mi_truncar_f(unsigned int ninodo, unsigned int nbytes) {
    struct inodo inode;

    inode = leer_inodo(ninodo);
    if ((inode.permisos & 2) != 2) { //Si no tenemos permisos de lectura devolvemos un error
        return -1;
    }

    if (nbytes == 0) {//liberamos todo el inodo		
        liberar_inodo(ninodo);
    } else {
        //liberamos a partir del bloque correspondiente del nbyte

        if (liberar_bloques_inodo(ninodo, nbytes) < 0) {
            printf("ERROR: ficheros_basic.c -> (metodo) -> descripcion error.\n");
            return -1;
        }

    }

    //actualizamos el inodo
    inode.mtime = time(NULL);
    inode.ctime = time(NULL);
    inode.tamEnBytesLog = nbytes;

    escribir_inodo(inode, ninodo); //guardamos el inodo

    mi_signalSem();
    return 0;
}