org
This commit is contained in:
parent
ce2b373313
commit
9114529153
46 changed files with 126016 additions and 125522 deletions
208
kernel/drivers/fs/nqfs/nqfs.c
Normal file
208
kernel/drivers/fs/nqfs/nqfs.c
Normal file
|
@ -0,0 +1,208 @@
|
|||
// Nick's Quick(ly made) File System
|
||||
#include "nqfs.h"
|
||||
#include "../../../io/io.h"
|
||||
#include "../../../memory/memory.h"
|
||||
|
||||
#define FILEPTR_SECTORS (128)
|
||||
#define FILEPTR_PER_SECTOR (4)
|
||||
#define FILEPTR_CNT (FILEPTR_SECTORS * FILEPTR_PER_SECTOR)
|
||||
|
||||
void NQFS_init() {}
|
||||
|
||||
uint32_t NQFS_get_next_free_block(struct block_dev *device) {
|
||||
char sector[512];
|
||||
struct NQFS_storage_block *sb = (struct NQFS_storage_block *)sector;
|
||||
|
||||
for (uint32_t i = FILEPTR_SECTORS; i < device->num_sectors; ++i) {
|
||||
if (!device->read_sector(device->device_no, i, sector)) {
|
||||
return 0;
|
||||
}
|
||||
if (sb->magic_number != 0xC001) {
|
||||
sb->magic_number = 0xC001;
|
||||
sb->next_sector = 0;
|
||||
if (!device->write_sector(device->device_no, i, sector)) {
|
||||
return 0;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t NQFS_create_file(struct block_dev *device, char *filename) {
|
||||
char sector[512];
|
||||
for (int i = 0; i < FILEPTR_SECTORS; ++i) {
|
||||
if (!device->read_sector(device->device_no, i, sector)) {
|
||||
return 0;
|
||||
}
|
||||
struct NQFS_inode *fp = (struct NQFS_inode *)sector;
|
||||
for (int j = 0; j < FILEPTR_PER_SECTOR; ++j) {
|
||||
if (!fp->allocd) {
|
||||
uint32_t new_sector = NQFS_get_next_free_block(device);
|
||||
if (new_sector == 0) {
|
||||
return 0;
|
||||
}
|
||||
fp->allocd = 1;
|
||||
fp->size = 0;
|
||||
fp->start_sector = new_sector;
|
||||
strncpy(filename, fp->filename, NQFS_MAX_FILENAME_SIZE);
|
||||
fp->filename[NQFS_MAX_FILENAME_SIZE - 1] = '\0';
|
||||
if (!device->write_sector(device->device_no, i, sector)) {
|
||||
return 0;
|
||||
}
|
||||
printf_nolock("Created file \"%s\" at sector %d fp %d\n", fp->filename,
|
||||
new_sector, i);
|
||||
return i;
|
||||
}
|
||||
fp++;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
uint32_t NQFS_read_bytes(struct block_dev *device, uint32_t inode_sector,
|
||||
char *out, uint32_t size) {
|
||||
char sector[512];
|
||||
struct NQFS_inode *fp = (struct NQFS_inode *)sector;
|
||||
if (!device->read_sector(device->device_no, inode_sector, sector)) {
|
||||
return 0;
|
||||
}
|
||||
char storage_sector[512];
|
||||
struct NQFS_storage_block *sb = (struct NQFS_storage_block *)storage_sector;
|
||||
|
||||
if (fp->start_sector != 0) {
|
||||
uint32_t read_sector = fp->start_sector;
|
||||
|
||||
if (size > fp->size) {
|
||||
size = fp->size;
|
||||
}
|
||||
|
||||
while (size > 0) {
|
||||
if (!device->read_sector(device->device_no, read_sector,
|
||||
storage_sector)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t readable = NQFS_STORAGE_BYTES_SECTOR;
|
||||
if (size < readable) {
|
||||
readable = size;
|
||||
}
|
||||
|
||||
// Copy data into struct
|
||||
memcpy(sb->data, out, readable);
|
||||
out += readable;
|
||||
size -= readable;
|
||||
|
||||
if (size > 0) {
|
||||
read_sector = sb->next_sector;
|
||||
if (read_sector == 0) {
|
||||
return size;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return size;
|
||||
|
||||
} else {
|
||||
printf_nolock("didn't find start\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t NQFS_write_bytes(struct block_dev *device, uint32_t inode_sector,
|
||||
char *in, uint32_t size) {
|
||||
uint32_t total_written = 0;
|
||||
char sector[512];
|
||||
struct NQFS_inode *fp = (struct NQFS_inode *)sector;
|
||||
if (!device->read_sector(device->device_no, inode_sector, sector)) {
|
||||
return 0;
|
||||
}
|
||||
char storage_sector[512];
|
||||
struct NQFS_storage_block *sb = (struct NQFS_storage_block *)storage_sector;
|
||||
|
||||
if (fp->start_sector != 0) {
|
||||
uint32_t cur_size = fp->size;
|
||||
uint32_t read_sector = fp->start_sector;
|
||||
|
||||
while (cur_size >= NQFS_STORAGE_BYTES_SECTOR) {
|
||||
if (!device->read_sector(device->device_no, read_sector,
|
||||
storage_sector)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
cur_size -= NQFS_STORAGE_BYTES_SECTOR;
|
||||
read_sector = sb->next_sector;
|
||||
if (read_sector == 0) {
|
||||
sb->next_sector = NQFS_get_next_free_block(device);
|
||||
read_sector = sb->next_sector;
|
||||
if (read_sector == 0) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (size > 0) {
|
||||
if (!device->read_sector(device->device_no, read_sector,
|
||||
storage_sector)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t writeable = NQFS_STORAGE_BYTES_SECTOR - cur_size;
|
||||
if (size < writeable) {
|
||||
writeable = size;
|
||||
}
|
||||
|
||||
// Copy data into struct
|
||||
memcpy(in + total_written, sb->data + cur_size, writeable);
|
||||
cur_size = 0;
|
||||
|
||||
fp->size += writeable;
|
||||
total_written += writeable;
|
||||
|
||||
if (!device->write_sector(device->device_no, inode_sector, sector)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Write struct out to disk
|
||||
if (!device->write_sector(device->device_no, read_sector,
|
||||
storage_sector)) {
|
||||
return 0;
|
||||
}
|
||||
size -= writeable;
|
||||
if (size > 0) {
|
||||
sb->next_sector = NQFS_get_next_free_block(device);
|
||||
// Write struct out to disk
|
||||
if (!device->write_sector(device->device_no, read_sector,
|
||||
storage_sector)) {
|
||||
return 0;
|
||||
}
|
||||
read_sector = sb->next_sector;
|
||||
if (read_sector == 0) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
printf_nolock("File didn't point to a storage block\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return total_written;
|
||||
}
|
||||
|
||||
void NQFS_DEBUG_list_files(struct block_dev *device) {
|
||||
char sector[512];
|
||||
for (int i = 0; i < FILEPTR_SECTORS; ++i) {
|
||||
if (!device->read_sector(device->device_no, i, sector)) {
|
||||
printf_nolock("Error reading sector %d\n", i);
|
||||
return;
|
||||
}
|
||||
struct NQFS_inode *fp = (struct NQFS_inode *)sector;
|
||||
for (int j = 0; j < FILEPTR_PER_SECTOR; ++j) {
|
||||
if (fp->allocd) {
|
||||
printf_nolock("Found file: %s\n", fp->filename);
|
||||
}
|
||||
fp++;
|
||||
}
|
||||
}
|
||||
}
|
32
kernel/drivers/fs/nqfs/nqfs.h
Normal file
32
kernel/drivers/fs/nqfs/nqfs.h
Normal file
|
@ -0,0 +1,32 @@
|
|||
#pragma once
|
||||
|
||||
#include "../../blk/blk.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#define NQFS_MAX_FILENAME_SIZE (64)
|
||||
#define NQFS_STORAGE_BYTES_SECTOR (504)
|
||||
|
||||
struct NQFS_inode {
|
||||
uint8_t allocd;
|
||||
char filename[NQFS_MAX_FILENAME_SIZE];
|
||||
uint32_t start_sector;
|
||||
uint32_t size;
|
||||
char _[55];
|
||||
} __attribute__((packed));
|
||||
|
||||
struct NQFS_storage_block {
|
||||
uint32_t magic_number;
|
||||
char data[NQFS_STORAGE_BYTES_SECTOR];
|
||||
uint32_t next_sector;
|
||||
} __attribute__((packed));
|
||||
|
||||
uint32_t NQFS_get_next_free_inode(struct block_dev *device);
|
||||
uint32_t NQFS_create_file(struct block_dev *device, char *filename);
|
||||
|
||||
// Returns number of bytes read into char
|
||||
uint32_t NQFS_read_bytes(struct block_dev *device, uint32_t inode_sector,
|
||||
char *out, uint32_t max_size);
|
||||
uint32_t NQFS_write_bytes(struct block_dev *device, uint32_t inode_sector,
|
||||
char *in, uint32_t size);
|
||||
|
||||
void NQFS_DEBUG_list_files(struct block_dev *device);
|
Loading…
Add table
Add a link
Reference in a new issue