From 2f8005d9c2e42a4d21e3bab586ece381401c763a Mon Sep 17 00:00:00 2001 From: liuyucai <1486344514@qq.com> Date: Fri, 11 Jul 2025 15:13:12 +0800 Subject: [PATCH] =?UTF-8?q?components:=20ramfs=E9=80=82=E9=85=8Ddfsv2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Yucai Liu <1486344514@qq.com> --- .../dfs/dfs_v2/filesystems/ramfs/dfs_ramfs.c | 367 +++++++++++------- .../dfs/dfs_v2/filesystems/ramfs/dfs_ramfs.h | 3 +- 2 files changed, 218 insertions(+), 152 deletions(-) diff --git a/components/dfs/dfs_v2/filesystems/ramfs/dfs_ramfs.c b/components/dfs/dfs_v2/filesystems/ramfs/dfs_ramfs.c index fd7326bd018..0aae7778956 100644 --- a/components/dfs/dfs_v2/filesystems/ramfs/dfs_ramfs.c +++ b/components/dfs/dfs_v2/filesystems/ramfs/dfs_ramfs.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -9,41 +9,39 @@ * 2013-05-05 Bernard remove CRC for ramfs persistence * 2013-05-22 Bernard fix the no entry issue. */ - -#include #include -#include +#include #include - +#include +#include +#include "dfs_mnt.h" #include "dfs_ramfs.h" -int dfs_ramfs_mount(struct dfs_filesystem *fs, - unsigned long rwflag, - const void *data) +int dfs_ramfs_mount(struct dfs_mnt* mnt, unsigned long rwflag, const void* data) { - struct dfs_ramfs *ramfs; + struct dfs_ramfs* ramfs; if (data == NULL) return -EIO; - ramfs = (struct dfs_ramfs *)data; - fs->data = ramfs; + ramfs = ( struct dfs_ramfs* )data; + mnt->data = ramfs; return RT_EOK; } -int dfs_ramfs_unmount(struct dfs_filesystem *fs) +int dfs_ramfs_unmount(struct dfs_mnt* mnt) { - fs->data = NULL; + mnt->data = NULL; return RT_EOK; } -int dfs_ramfs_statfs(struct dfs_filesystem *fs, struct statfs *buf) +int dfs_ramfs_statfs(struct dfs_mnt* mnt, struct statfs* buf) { - struct dfs_ramfs *ramfs; + struct dfs_ramfs* ramfs; - ramfs = (struct dfs_ramfs *)fs->data; + ramfs = ( struct dfs_ramfs* )mnt->data; RT_ASSERT(ramfs != NULL); RT_ASSERT(buf != NULL); @@ -54,32 +52,28 @@ int dfs_ramfs_statfs(struct dfs_filesystem *fs, struct statfs *buf) return RT_EOK; } -int dfs_ramfs_ioctl(struct dfs_file *file, int cmd, void *args) +int dfs_ramfs_ioctl(struct dfs_file* file, int cmd, void* args) { return -EIO; } -struct ramfs_dirent *dfs_ramfs_lookup(struct dfs_ramfs *ramfs, - const char *path, - rt_size_t *size) +struct ramfs_dirent* dfs_ramfs_lookup(struct dfs_ramfs* ramfs, const char* path, rt_size_t* size) { - const char *subpath; - struct ramfs_dirent *dirent; + const char* subpath; + struct ramfs_dirent* dirent; subpath = path; - while (*subpath == '/' && *subpath) - subpath ++; - if (! *subpath) /* is root directory */ + while (*subpath == '/' && *subpath) subpath++; + if (!*subpath) /* is root directory */ { *size = 0; return &(ramfs->root); } - for (dirent = rt_list_entry(ramfs->root.list.next, struct ramfs_dirent, list); - dirent != &(ramfs->root); + for (dirent = rt_list_entry(ramfs->root.list.next, struct ramfs_dirent, list); dirent != &(ramfs->root); dirent = rt_list_entry(dirent->list.next, struct ramfs_dirent, list)) - { + { if (rt_strcmp(dirent->name, subpath) == 0) { *size = dirent->size; @@ -92,43 +86,42 @@ struct ramfs_dirent *dfs_ramfs_lookup(struct dfs_ramfs *ramfs, return NULL; } -int dfs_ramfs_read(struct dfs_file *file, void *buf, size_t count) +ssize_t dfs_ramfs_read(struct dfs_file* file, void* buf, size_t count, off_t* pos) { rt_size_t length; - struct ramfs_dirent *dirent; + struct ramfs_dirent* dirent; - dirent = (struct ramfs_dirent *)file->vnode->data; + dirent = ( struct ramfs_dirent* )file->vnode->data; RT_ASSERT(dirent != NULL); - if (count < file->vnode->size - file->pos) + if (count < file->vnode->size - file->fpos) length = count; else - length = file->vnode->size - file->pos; + length = file->vnode->size - file->fpos; if (length > 0) - rt_memcpy(buf, &(dirent->data[file->pos]), length); + rt_memcpy(buf, &(dirent->data[file->fpos]), length); /* update file current position */ - file->pos += length; - + *pos += length; return length; } -int dfs_ramfs_write(struct dfs_file *fd, const void *buf, size_t count) +ssize_t dfs_ramfs_write(struct dfs_file* file, const void* buf, size_t count, off_t* pos) { - struct ramfs_dirent *dirent; - struct dfs_ramfs *ramfs; + struct ramfs_dirent* dirent; + struct dfs_ramfs* ramfs; - dirent = (struct ramfs_dirent *)fd->vnode->data; + dirent = ( struct ramfs_dirent* )file->vnode->data; RT_ASSERT(dirent != NULL); ramfs = dirent->fs; RT_ASSERT(ramfs != NULL); - if (count + fd->pos > fd->vnode->size) + if (count + file->fpos > file->vnode->size) { - rt_uint8_t *ptr; - ptr = rt_memheap_realloc(&(ramfs->memheap), dirent->data, fd->pos + count); + rt_uint8_t* ptr; + ptr = rt_memheap_realloc(&(ramfs->memheap), dirent->data, file->fpos + count); if (ptr == NULL) { rt_set_errno(-ENOMEM); @@ -137,33 +130,32 @@ int dfs_ramfs_write(struct dfs_file *fd, const void *buf, size_t count) } /* update dirent and file size */ - dirent->data = ptr; - dirent->size = fd->pos + count; - fd->vnode->size = dirent->size; + dirent->data = ptr; + dirent->size = file->fpos + count; + file->vnode->size = dirent->size; } if (count > 0) - rt_memcpy(dirent->data + fd->pos, buf, count); + rt_memcpy(dirent->data + file->fpos, buf, count); /* update file current position */ - fd->pos += count; - + *pos += count; return count; } -int dfs_ramfs_lseek(struct dfs_file *file, off_t offset) +off_t dfs_ramfs_lseek(struct dfs_file* file, off_t offset, int wherece) { - if (offset <= (off_t)file->vnode->size) + if (offset <= ( off_t )file->vnode->size) { - file->pos = offset; + file->fpos = offset; - return file->pos; + return file->fpos; } return -EIO; } -int dfs_ramfs_close(struct dfs_file *file) +int dfs_ramfs_close(struct dfs_file* file) { RT_ASSERT(file->vnode->ref_count > 0); if (file->vnode->ref_count > 1) @@ -176,28 +168,24 @@ int dfs_ramfs_close(struct dfs_file *file) return RT_EOK; } -int dfs_ramfs_open(struct dfs_file *file) +int dfs_ramfs_open(struct dfs_file* file) { rt_size_t size; - struct dfs_ramfs *ramfs; - struct ramfs_dirent *dirent; - struct dfs_filesystem *fs; + struct dfs_ramfs* ramfs; + struct ramfs_dirent* dirent; RT_ASSERT(file->vnode->ref_count > 0); if (file->vnode->ref_count > 1) { - if (file->vnode->type == FT_DIRECTORY - && !(file->flags & O_DIRECTORY)) + if (file->vnode->type == FT_DIRECTORY && !(file->flags & O_DIRECTORY)) { return -ENOENT; } - file->pos = 0; + file->fpos = 0; return 0; } - fs = file->vnode->fs; - - ramfs = (struct dfs_ramfs *)fs->data; + ramfs = ( struct dfs_ramfs* )file->dentry->mnt->data; RT_ASSERT(ramfs != NULL); if (file->flags & O_DIRECTORY) @@ -208,7 +196,7 @@ int dfs_ramfs_open(struct dfs_file *file) } /* open directory */ - dirent = dfs_ramfs_lookup(ramfs, file->vnode->path, &size); + dirent = dfs_ramfs_lookup(ramfs, file->dentry->pathname, &size); if (dirent == NULL) return -ENOENT; if (dirent == &(ramfs->root)) /* it's root directory */ @@ -220,9 +208,8 @@ int dfs_ramfs_open(struct dfs_file *file) } file->vnode->type = FT_DIRECTORY; } - else - { - dirent = dfs_ramfs_lookup(ramfs, file->vnode->path, &size); + else { + dirent = dfs_ramfs_lookup(ramfs, file->dentry->pathname, &size); if (dirent == &(ramfs->root)) /* it's root directory */ { return -ENOENT; @@ -232,19 +219,17 @@ int dfs_ramfs_open(struct dfs_file *file) { if (file->flags & O_CREAT || file->flags & O_WRONLY) { - char *name_ptr; + char* name_ptr; /* create a file entry */ - dirent = (struct ramfs_dirent *) - rt_memheap_alloc(&(ramfs->memheap), - sizeof(struct ramfs_dirent)); + dirent = ( struct ramfs_dirent* )rt_memheap_alloc(&(ramfs->memheap), sizeof(struct ramfs_dirent)); if (dirent == NULL) { return -ENOMEM; } /* remove '/' separator */ - name_ptr = file->vnode->path; + name_ptr = file->dentry->pathname; while (*name_ptr == '/' && *name_ptr) { name_ptr++; @@ -252,10 +237,10 @@ int dfs_ramfs_open(struct dfs_file *file) strncpy(dirent->name, name_ptr, RAMFS_NAME_MAX); rt_list_init(&(dirent->list)); - dirent->data = NULL; - dirent->size = 0; - dirent->fs = ramfs; - file->vnode->type = FT_DIRECTORY; + dirent->data = NULL; + dirent->size = 0; + dirent->fs = ramfs; + file->vnode->type = FT_REGULAR; /* add to the root directory */ rt_list_insert_after(&(ramfs->root.list), &(dirent->list)); @@ -282,52 +267,53 @@ int dfs_ramfs_open(struct dfs_file *file) file->vnode->size = dirent->size; if (file->flags & O_APPEND) { - file->pos = file->vnode->size; + file->fpos = file->vnode->size; } - else - { - file->pos = 0; + else { + file->fpos = 0; } return 0; } -int dfs_ramfs_stat(struct dfs_filesystem *fs, - const char *path, - struct stat *st) +int dfs_ramfs_stat(struct dfs_dentry* dentry, struct stat* st) { rt_size_t size; - struct ramfs_dirent *dirent; - struct dfs_ramfs *ramfs; + struct ramfs_dirent* dirent; + struct dfs_ramfs* ramfs; - ramfs = (struct dfs_ramfs *)fs->data; - dirent = dfs_ramfs_lookup(ramfs, path, &size); + ramfs = ( struct dfs_ramfs* )dentry->mnt->data; + dirent = dfs_ramfs_lookup(ramfs, dentry->pathname, &size); if (dirent == NULL) return -ENOENT; st->st_dev = 0; - st->st_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH | - S_IWUSR | S_IWGRP | S_IWOTH; + if (!rt_memcmp(dentry->pathname, "/", 2) && size == 0) + { + st->st_mode = S_IFDIR | S_IRUSR | S_IRGRP | S_IROTH | S_IXUSR | S_IXGRP | S_IXOTH; + } + else { + st->st_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IWGRP | S_IWOTH; + } + - st->st_size = dirent->size; + st->st_size = dirent->size; st->st_mtime = 0; return RT_EOK; } -int dfs_ramfs_getdents(struct dfs_file *file, - struct dirent *dirp, - uint32_t count) +int dfs_ramfs_getdents(struct dfs_file* file, struct dirent* dirp, uint32_t count) { rt_size_t index, end; - struct dirent *d; - struct ramfs_dirent *dirent; - struct dfs_ramfs *ramfs; + struct dirent* d; + struct ramfs_dirent* dirent; + struct dfs_ramfs* ramfs; - dirent = (struct ramfs_dirent *)file->vnode->data; + dirent = ( struct ramfs_dirent* )file->vnode->data; - ramfs = dirent->fs; + ramfs = dirent->fs; RT_ASSERT(ramfs != RT_NULL); if (dirent != &(ramfs->root)) @@ -338,23 +324,22 @@ int dfs_ramfs_getdents(struct dfs_file *file, if (count == 0) return -EINVAL; - end = file->pos + count; + end = file->fpos + count; index = 0; count = 0; - for (dirent = rt_list_entry(dirent->list.next, struct ramfs_dirent, list); - dirent != &(ramfs->root) && index < end; + for (dirent = rt_list_entry(dirent->list.next, struct ramfs_dirent, list); dirent != &(ramfs->root) && index < end; dirent = rt_list_entry(dirent->list.next, struct ramfs_dirent, list)) - { - if (index >= (rt_size_t)file->pos) + { + if (index >= ( rt_size_t )file->fpos) { - d = dirp + count; - d->d_type = DT_REG; + d = dirp + count; + d->d_type = DT_REG; d->d_namlen = RT_NAME_MAX; - d->d_reclen = (rt_uint16_t)sizeof(struct dirent); + d->d_reclen = ( rt_uint16_t )sizeof(struct dirent); rt_strncpy(d->d_name, dirent->name, RAMFS_NAME_MAX); count += 1; - file->pos += 1; + file->fpos += 1; } index += 1; } @@ -362,16 +347,16 @@ int dfs_ramfs_getdents(struct dfs_file *file, return count * sizeof(struct dirent); } -int dfs_ramfs_unlink(struct dfs_filesystem *fs, const char *path) +int dfs_ramfs_unlink(struct dfs_dentry* dentry) { rt_size_t size; - struct dfs_ramfs *ramfs; - struct ramfs_dirent *dirent; + struct dfs_ramfs* ramfs; + struct ramfs_dirent* dirent; - ramfs = (struct dfs_ramfs *)fs->data; + ramfs = ( struct dfs_ramfs* )dentry->mnt->data; RT_ASSERT(ramfs != NULL); - dirent = dfs_ramfs_lookup(ramfs, path, &size); + dirent = dfs_ramfs_lookup(ramfs, dentry->pathname, &size); if (dirent == NULL) return -ENOENT; @@ -383,79 +368,138 @@ int dfs_ramfs_unlink(struct dfs_filesystem *fs, const char *path) return RT_EOK; } -int dfs_ramfs_rename(struct dfs_filesystem *fs, - const char *oldpath, - const char *newpath) +int dfs_ramfs_rename(struct dfs_dentry* old_dentry, struct dfs_dentry* new_dentry) { - struct ramfs_dirent *dirent; - struct dfs_ramfs *ramfs; + struct ramfs_dirent* dirent; + struct dfs_ramfs* ramfs; rt_size_t size; - ramfs = (struct dfs_ramfs *)fs->data; + ramfs = ( struct dfs_ramfs* )old_dentry->mnt->data; RT_ASSERT(ramfs != NULL); - dirent = dfs_ramfs_lookup(ramfs, newpath, &size); + dirent = dfs_ramfs_lookup(ramfs, new_dentry->pathname, &size); if (dirent != NULL) return -EEXIST; - dirent = dfs_ramfs_lookup(ramfs, oldpath, &size); + dirent = dfs_ramfs_lookup(ramfs, old_dentry->pathname, &size); if (dirent == NULL) return -ENOENT; - - strncpy(dirent->name, newpath, RAMFS_NAME_MAX); + /* skip '/' */ + rt_strncpy(dirent->name, new_dentry->pathname + 1, RAMFS_NAME_MAX); return RT_EOK; } -static const struct dfs_file_ops _ram_fops = +struct dfs_vnode* _dfs_ramfs_lookup(struct dfs_dentry* dentry) { - dfs_ramfs_open, - dfs_ramfs_close, - dfs_ramfs_ioctl, - dfs_ramfs_read, - dfs_ramfs_write, - NULL, /* flush */ - dfs_ramfs_lseek, - dfs_ramfs_getdents, + struct ramfs_dirent* dirent; + struct dfs_ramfs* ramfs; + rt_size_t size; + struct dfs_vnode* vnode = NULL; + + ramfs = ( struct dfs_ramfs* )dentry->mnt->data; + dirent = dfs_ramfs_lookup(ramfs, dentry->pathname, &size); + if (dirent == NULL) + return NULL; + else { + vnode = dfs_vnode_create(); + if (vnode) + { + if (!rt_memcmp(dentry->pathname, "/", 2) && size == 0) + { + vnode->mode = S_IFDIR | 0755; + vnode->type = FT_DIRECTORY; + } + else { + vnode->mode = S_IFREG | 0755; + vnode->type = FT_REGULAR; + } + vnode->mnt = dentry->mnt; + vnode->size = size; + } + } + return vnode; +} + +struct dfs_vnode* dfs_ramfs_create_vnode(struct dfs_dentry* dentry, int type, mode_t mode) +{ + struct dfs_vnode* vnode = RT_NULL; + if (type == FT_DIRECTORY) + { + return NULL; + } + vnode = dfs_vnode_create(); + if (vnode) + { + vnode->mnt = dentry->mnt; + vnode->mode = S_IFREG | (S_IRWXU | S_IRWXG | S_IRWXO); + vnode->type = FT_REGULAR; + } + return vnode; +} + +static const struct dfs_file_ops _ram_fops = { + .open = dfs_ramfs_open, + .close = dfs_ramfs_close, + .ioctl = dfs_ramfs_ioctl, + .read = dfs_ramfs_read, + .write = dfs_ramfs_write, + .flush = NULL, /* flush */ + .lseek = dfs_ramfs_lseek, + .getdents = dfs_ramfs_getdents, }; -static const struct dfs_filesystem_ops _ramfs = +int dfs_ramfs_free_vnode(struct dfs_vnode* vnode) { + if (vnode && vnode->ref_count <= 1) + { + vnode->data = NULL; + } + return 0; +} + +static const struct dfs_filesystem_ops _ramfs = { "ram", DFS_FS_FLAG_DEFAULT, &_ram_fops, - dfs_ramfs_mount, - dfs_ramfs_unmount, - NULL, /* mkfs */ - dfs_ramfs_statfs, + .mount = dfs_ramfs_mount, + .umount = dfs_ramfs_unmount, + .mkfs = NULL, /* mkfs */ + .statfs = dfs_ramfs_statfs, - dfs_ramfs_unlink, - dfs_ramfs_stat, - dfs_ramfs_rename, -}; + .unlink = dfs_ramfs_unlink, + .stat = dfs_ramfs_stat, + .rename = dfs_ramfs_rename, + .lookup = _dfs_ramfs_lookup, + .create_vnode = dfs_ramfs_create_vnode, + .free_vnode = dfs_ramfs_free_vnode, +}; +struct dfs_filesystem_type ramfs_type = { + .fs_ops = &_ramfs, +}; int dfs_ramfs_init(void) { /* register ram file system */ - dfs_register(&_ramfs); + dfs_register(&ramfs_type); return 0; } INIT_COMPONENT_EXPORT(dfs_ramfs_init); -struct dfs_ramfs *dfs_ramfs_create(rt_uint8_t *pool, rt_size_t size) +struct dfs_ramfs* dfs_ramfs_create(rt_uint8_t* pool, rt_size_t size) { - struct dfs_ramfs *ramfs; - rt_uint8_t *data_ptr; + struct dfs_ramfs* ramfs; + rt_uint8_t* data_ptr; rt_err_t result; size = RT_ALIGN_DOWN(size, RT_ALIGN_SIZE); - ramfs = (struct dfs_ramfs *)pool; + ramfs = ( struct dfs_ramfs* )pool; - data_ptr = (rt_uint8_t *)(ramfs + 1); - size = size - sizeof(struct dfs_ramfs); - size = RT_ALIGN_DOWN(size, RT_ALIGN_SIZE); + data_ptr = ( rt_uint8_t* )(ramfs + 1); + size = size - sizeof(struct dfs_ramfs); + size = RT_ALIGN_DOWN(size, RT_ALIGN_SIZE); result = rt_memheap_init(&ramfs->memheap, "ramfs", data_ptr, size); if (result != RT_EOK) @@ -464,7 +508,7 @@ struct dfs_ramfs *dfs_ramfs_create(rt_uint8_t *pool, rt_size_t size) rt_object_detach((rt_object_t) & (ramfs->memheap)); /* initialize ramfs object */ - ramfs->magic = RAMFS_MAGIC; + ramfs->magic = RAMFS_MAGIC; ramfs->memheap.parent.type = RT_Object_Class_MemHeap | RT_Object_Class_Static; /* initialize root directory */ @@ -477,3 +521,26 @@ struct dfs_ramfs *dfs_ramfs_create(rt_uint8_t *pool, rt_size_t size) return ramfs; } +/** + * @example + * @code + static int ramfs_init(void) + { + int res = RT_EOK; + uint8_t* pool = rt_malloc(1024 * 10); + if (pool == RT_NULL) + { + return -1; + } + struct dfs_ramfs* ramfs = dfs_ramfs_create(pool, 1024 * 10); + res = dfs_mount(NULL, "/tmp", "ram", 0, ramfs); + if (res != RT_EOK) + { + rt_free(pool); + } + return 0; + } + INIT_ENV_EXPORT(ramfs_init); + * @endcode + */ + diff --git a/components/dfs/dfs_v2/filesystems/ramfs/dfs_ramfs.h b/components/dfs/dfs_v2/filesystems/ramfs/dfs_ramfs.h index 87adde99a52..103242ac722 100644 --- a/components/dfs/dfs_v2/filesystems/ramfs/dfs_ramfs.h +++ b/components/dfs/dfs_v2/filesystems/ramfs/dfs_ramfs.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -8,7 +8,6 @@ * 2013-04-15 Bernard the first version * 2013-05-05 Bernard remove CRC for ramfs persistence */ - #ifndef __DFS_RAMFS_H__ #define __DFS_RAMFS_H__