[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Lost] [Patch] ramdisk



Am Sonntag, 24. August 2008 13.19:27 schrieb stultus / dunklermeuchler:
> So, hier dann mal der Patch für die ramdisk. Das Teil kann Verzeichnisse
> anlegen, Dateien anlegen, Schreiben, Lesen, und truncate sollte für
> verkleinern und vergrößern funktionieren.

> Index: src/modules/cdi/ramdisk/dir.c
> ===================================================================
> --- src/modules/cdi/ramdisk/dir.c	(revision 0)
> +++ src/modules/cdi/ramdisk/dir.c	(revision 0)
> @@ -0,0 +1,65 @@
> ....
> +int ramdisk_fs_dir_create_child(struct cdi_fs_stream* stream, const char*
> name, +                             struct cdi_fs_res* parent)
> +{
> +    struct ramdisk_fs_res* res = malloc(sizeof(*res));
> +    struct ramdisk_fs_res* parent_res = (struct ramdisk_fs_res*) parent;
> +
> +    memset(res, 0, sizeof(*res));
> +
> +    res->res.loaded = 1;
> +
> +    res->res.name = strdup(name);
> +    res->res.res = &ramdisk_fs_res;
> +    res->buffer = 0;

NULL, wenns dir nichts ausmacht. ;-)

> +    res->size = 0;
> +
> +    cdi_list_push(parent_res->res.children, res);
> +    res->res.parent = parent;
> +
> +    stream->res = (struct cdi_fs_res*) res;
> +    return 1;
> +}
> Index: src/modules/cdi/ramdisk/ramdisk_cdi.h
> ===================================================================
> --- src/modules/cdi/ramdisk/ramdisk_cdi.h	(revision 0)
> +++ src/modules/cdi/ramdisk/ramdisk_cdi.h	(revision 0)
> @@ -0,0 +1,99 @@
> ...
> +/**
> + * Dateisystemressource fuer ramdisk
> + */
> +struct ramdisk_fs_res {
> +    struct cdi_fs_res res;
> +    void* buffer;
> +    size_t size;
> +    int64_t access_time;
> +    int64_t modification_time;
> +};

Hier hätte ich gegen Dokumentation der Member nichts einzuwenden. ;-)

> ....
> +
> +// Pointer auf die ramdisk-Ressourcen

Solche Kommentare darfst du gerne auch korrigieren beim Übernehmen. Das sind 
ja keine Pointer.

> +extern struct cdi_fs_res_res    ramdisk_fs_res;
> +extern struct cdi_fs_res_file   ramdisk_fs_file;
> +extern struct cdi_fs_res_dir    ramdisk_fs_dir;
> +extern struct cdi_fs_res_link   ramdisk_fs_link;
> +
> +#endif
> +
> Index: src/modules/cdi/ramdisk/file.c
> ===================================================================
> --- src/modules/cdi/ramdisk/file.c	(revision 0)
> +++ src/modules/cdi/ramdisk/file.c	(revision 0)
> @@ -0,0 +1,103 @@
> ...
> +size_t ramdisk_fs_file_write(struct cdi_fs_stream* stream, uint64_t start,
> +    size_t size, const void* data)
> +{
> +    struct ramdisk_fs_res* res = (struct ramdisk_fs_res*) stream->res;
> +
> +    // Es soll mehr geschrieben werden als Platz ist. Buffer vergr��ern!.

oe statt ö

> +    if ((res->size - start) < size) {
> +        size_t new_size;
> +        new_size = start + size;

> +        void* new_buffer = malloc(new_size);
> +        if (new_size == 0) {

Hier willst du vermutlich nicht new_size prüfen, aber siehe unten....

> +            stream->error = CDI_FS_ERROR_INTERNAL;
> +            return 0;
> +        }
> +        memcpy(new_buffer,res->buffer,res->size);
> +        free(res->buffer);
> +        res->buffer = new_buffer;
> +        res->size = new_size;
> +    }
> +
> +    memcpy(res->buffer + start, data, size);

if (!(new_buffer = realloc(res->buffer, new_size))) {
...
memset(res->buffer + res->size, 0, new_size - res->size);

Dürfte effizienter als malloc memcpy und free sein. ;-)

> +    return size;
> +}
> +
> +int ramdisk_fs_file_truncate(struct cdi_fs_stream* stream, uint64_t size)
> +{
> +    struct ramdisk_fs_res* res = (struct ramdisk_fs_res*) stream->res;
> +
> +    // Nichts zu tun
> +    if (size == res->size) {
> +        return 1;
> +    }
> +
> +    void* new_buffer;
> +    new_buffer = malloc(size);
> +    if (new_buffer == 0) {
> +        stream->error = CDI_FS_ERROR_INTERNAL;
> +        return 0;
> +    }
> +
> +    if (res->size < size) {
> +        memcpy(new_buffer,res->buffer,res->size);
> +        memset(new_buffer + res->size,0,size - res->size);
> +    }
> +    else {
> +        memcpy(new_buffer,res->buffer,size);
> +    }
> +    free(res->buffer);

Auch hier realloc() bitte

> +    res->buffer = new_buffer;
> +    res->size = size;
> +    return 1;
> +}
> Index: src/modules/cdi/ramdisk/init.c
> ===================================================================
> --- src/modules/cdi/ramdisk/init.c	(revision 0)
> +++ src/modules/cdi/ramdisk/init.c	(revision 0)
> @@ -0,0 +1,67 @@

> +#include "ramdisk_cdi.h"
> +#include <stdio.h>
> +
> +int ramdisk_fs_init(struct cdi_fs_filesystem* cdi_fs)
> +{
> +    struct ramdisk_fs_res* root_res;
> +    //ramdisk_fs_t* fs = malloc(sizeof(*fs))

Das kannst du ja getrost rauswerfen.

> +
> +    cdi_fs->opaque = NULL;

Benutzt du das irgendwo?

> +
> +    //fs->dev_read = null;
> +    //fs->dev_write = null;
> +    //fs->dev_private = cdi_fs;

Raus damit

> +
> +    root_res = malloc(sizeof(*root_res));
> +    memset(root_res, 0, sizeof(*root_res));
> +    root_res->res.name = strdup("/");
> +    root_res->res.res = &ramdisk_fs_res;
> +    root_res->res.dir = &ramdisk_fs_dir;
> +    root_res->res.loaded = 1;
> +    root_res->buffer = 0;
> +    root_res->size = 0;
> +
> +    cdi_fs->root_res = (struct cdi_fs_res*) root_res;
> +    puts("mounted");

Diese Debugausgabe aus ext2 darfst du auch gerne löschen. ;-)

> +    return 1;
> +}
> +
> +int ramdisk_fs_destroy(struct cdi_fs_filesystem* fs)
> +{
> +    return 0;
> +}
> Index: src/modules/cdi/ramdisk/res.c
> ===================================================================
> --- src/modules/cdi/ramdisk/res.c	(revision 0)
> +++ src/modules/cdi/ramdisk/res.c	(revision 0)
> @@ -0,0 +1,160 @@
> ...
> +int ramdisk_fs_res_unload(struct cdi_fs_stream* stream)
> +{
> +    struct ramdisk_fs_res* res = (struct ramdisk_fs_res*) stream->res;
> +
> +    if (!res->res.loaded) {
> +        return 0;
> +    }
> +
> +    if (res->res.dir) {
> +    //    dir_clear(stream);
> +    }

Raus damit.

> +
> +    res->res.loaded = 0;
> +    return 1;
> +}
> +
> ,,.

Attachment: signature.asc
Description: This is a digitally signed message part.