#ifndef VFS_VFS_H_ #define VFS_VFS_H_ #include #include #include #include "spinlock/spinlock.h" #include "fs/portlfs/portlfs.h" #include "storedev/storedev.h" #define VFS_MOUNTPOINT_LABEL_MAX 128 #define VFS_MOUNTPOINTS_MAX 30 enum { VFS_LITTLEFS, }; static const char *vfs_strings[] = { "Little FS", }; enum { VFS_TYPE_DIR, VFS_TYPE_FILE, }; enum { VFS_FLAG_READ = 1<<0, VFS_FLAG_WRITE = 1<<1, VFS_FLAG_MAKE = 1<<2, }; #define VFS_PATH_MAX 1024 typedef struct VfsStat { size_t size; int32_t type; } VfsStat; typedef struct VfsObj { SpinLock spinlock; void *extra; size_t extrasize; struct VfsMountPoint *vmp; char path[VFS_PATH_MAX]; int32_t flags; int32_t (*read)(struct VfsObj *vobj, uint8_t *const buffer, size_t n, size_t off); int32_t (*stat)(struct VfsObj *vobj, struct VfsStat *stat); int32_t (*write)(struct VfsObj *vobj, const uint8_t *const buffer, size_t n, size_t off); void (*cleanup)(struct VfsObj *vobj); } VfsObj; typedef struct VfsMountPoint { bool taken; uint8_t label[VFS_MOUNTPOINT_LABEL_MAX]; int32_t fstype; StoreDev *backingsd; VfsObj *(*open)(struct VfsMountPoint *vmp, const char *path, uint32_t flags); int32_t (*cleanup)(struct VfsMountPoint *vmp); union { LittleFs littlefs; } fs; SpinLock spinlock; } VfsMountPoint; typedef struct { SpinLock spinlock; VfsMountPoint mountpoints[VFS_MOUNTPOINTS_MAX]; } VfsTable; extern VfsTable VFS_TABLE; void vfs_init(void); int32_t vfs_unmount(char *mountpoint); int32_t vfs_mount(char *mountpoint, int32_t fstype, StoreDev *backingsd, bool format); void vfs_close(VfsObj *vobj); VfsObj *vfs_open(char *mountpoint, const char *path, uint32_t flags); #endif // VFS_VFS_H_