new fs node device pointer
This commit is contained in:
parent
bac4d54bed
commit
a55a652e0e
@ -13,13 +13,6 @@ uint32_t PTRS_PER_BLOCK = 256;
|
||||
#define SECTORSIZE 512
|
||||
#define DISK_PORT 0x1F0
|
||||
|
||||
typedef struct {
|
||||
uint32_t block_no;
|
||||
uint32_t last_use;
|
||||
uint8_t dirty;
|
||||
uint8_t *block;
|
||||
} ext2_disk_cache_entry_t;
|
||||
|
||||
ext2_disk_cache_entry_t *ext2_disk_cache = NULL; // LSU block cache
|
||||
ext2_superblock_t *ext2_disk_superblock = NULL;
|
||||
ext2_bgdescriptor_t *ext2_disk_root_block = NULL;
|
||||
|
@ -26,7 +26,7 @@ static inline size_t pipe_unread(pipe_device_t * pipe) {
|
||||
}
|
||||
|
||||
int pipe_size(fs_node_t * node) {
|
||||
pipe_device_t * pipe = (pipe_device_t *)node->inode;
|
||||
pipe_device_t * pipe = (pipe_device_t *)node->device;
|
||||
return pipe_unread(pipe);
|
||||
}
|
||||
|
||||
@ -61,14 +61,14 @@ static inline void pipe_increment_write_by(pipe_device_t * pipe, size_t amount)
|
||||
}
|
||||
|
||||
uint32_t read_pipe(fs_node_t *node, uint32_t offset, uint32_t size, uint8_t *buffer) {
|
||||
assert(node->inode != 0 && "Attempted to read from a fully-closed pipe.");
|
||||
assert(node->device != 0 && "Attempted to read from a fully-closed pipe.");
|
||||
|
||||
/* Retreive the pipe object associated with this file node */
|
||||
pipe_device_t * pipe = (pipe_device_t *)node->inode;
|
||||
pipe_device_t * pipe = (pipe_device_t *)node->device;
|
||||
|
||||
#if DEBUG_PIPES
|
||||
if (pipe->size > 300) { /* Ignore small pipes (ie, keyboard) */
|
||||
kprintf("[debug] Call to read from pipe 0x%x\n", node->inode);
|
||||
kprintf("[debug] Call to read from pipe 0x%x\n", node->device);
|
||||
kprintf(" Unread bytes: %d\n", pipe_unread(pipe));
|
||||
kprintf(" Total size: %d\n", pipe->size);
|
||||
kprintf(" Request size: %d\n", size);
|
||||
@ -99,14 +99,14 @@ uint32_t read_pipe(fs_node_t *node, uint32_t offset, uint32_t size, uint8_t *buf
|
||||
}
|
||||
|
||||
uint32_t write_pipe(fs_node_t *node, uint32_t offset, uint32_t size, uint8_t *buffer) {
|
||||
assert(node->inode != 0 && "Attempted to write to a fully-closed pipe.");
|
||||
assert(node->device != 0 && "Attempted to write to a fully-closed pipe.");
|
||||
|
||||
/* Retreive the pipe object associated with this file node */
|
||||
pipe_device_t * pipe = (pipe_device_t *)node->inode;
|
||||
pipe_device_t * pipe = (pipe_device_t *)node->device;
|
||||
|
||||
#if DEBUG_PIPES
|
||||
if (pipe->size > 300) { /* Ignore small pipes (ie, keyboard) */
|
||||
kprintf("[debug] Call to write to pipe 0x%x\n", node->inode);
|
||||
kprintf("[debug] Call to write to pipe 0x%x\n", node->device);
|
||||
kprintf(" Available space: %d\n", pipe_available(pipe));
|
||||
kprintf(" Total size: %d\n", pipe->size);
|
||||
kprintf(" Request size: %d\n", size);
|
||||
@ -153,10 +153,10 @@ uint32_t write_pipe(fs_node_t *node, uint32_t offset, uint32_t size, uint8_t *bu
|
||||
}
|
||||
|
||||
void open_pipe(fs_node_t * node, uint8_t read, uint8_t write) {
|
||||
assert(node->inode != 0 && "Attempted to open a fully-closed pipe.");
|
||||
assert(node->device != 0 && "Attempted to open a fully-closed pipe.");
|
||||
|
||||
/* Retreive the pipe object associated with this file node */
|
||||
pipe_device_t * pipe = (pipe_device_t *)node->inode;
|
||||
pipe_device_t * pipe = (pipe_device_t *)node->device;
|
||||
|
||||
/* Add a reference */
|
||||
pipe->refcount++;
|
||||
@ -165,10 +165,10 @@ void open_pipe(fs_node_t * node, uint8_t read, uint8_t write) {
|
||||
}
|
||||
|
||||
void close_pipe(fs_node_t * node) {
|
||||
assert(node->inode != 0 && "Attempted to close an already fully-closed pipe.");
|
||||
assert(node->device != 0 && "Attempted to close an already fully-closed pipe.");
|
||||
|
||||
/* Retreive the pipe object associated with this file node */
|
||||
pipe_device_t * pipe = (pipe_device_t *)node->inode;
|
||||
pipe_device_t * pipe = (pipe_device_t *)node->device;
|
||||
|
||||
/* Drop one reference */
|
||||
pipe->refcount--;
|
||||
@ -182,7 +182,7 @@ void close_pipe(fs_node_t * node) {
|
||||
free(pipe->wait_queue);
|
||||
free(pipe);
|
||||
/* And let the creator know there are no more references */
|
||||
node->inode = 0;
|
||||
node->device = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -193,7 +193,7 @@ fs_node_t * make_pipe(size_t size) {
|
||||
fs_node_t * fnode = malloc(sizeof(fs_node_t));
|
||||
pipe_device_t * pipe = malloc(sizeof(pipe_device_t));
|
||||
|
||||
fnode->inode = 0;
|
||||
fnode->device = 0;
|
||||
fnode->name[0] = '\0';
|
||||
sprintf(fnode->name, "[pipe]");
|
||||
fnode->uid = 0;
|
||||
@ -212,7 +212,7 @@ fs_node_t * make_pipe(size_t size) {
|
||||
fnode->mtime = fnode->atime;
|
||||
fnode->ctime = fnode->atime;
|
||||
|
||||
fnode->inode = (uintptr_t)pipe;
|
||||
fnode->device = pipe;
|
||||
|
||||
pipe->buffer = malloc(size);
|
||||
pipe->write_ptr = 0;
|
||||
|
@ -20,11 +20,11 @@ uint32_t read_serial(fs_node_t *node, uint32_t offset, uint32_t size, uint8_t *b
|
||||
memset(buffer, 0x00, 1);
|
||||
uint32_t collected = 0;
|
||||
while (collected < size) {
|
||||
while (!serial_rcvd(node->inode)) {
|
||||
while (!serial_rcvd((int)node->device)) {
|
||||
switch_task(1);
|
||||
}
|
||||
debug_print(NOTICE, "Data received from TTY");
|
||||
buffer[collected] = serial_recv(node->inode);
|
||||
buffer[collected] = serial_recv((int)node->device);
|
||||
collected++;
|
||||
}
|
||||
return collected;
|
||||
@ -33,7 +33,7 @@ uint32_t read_serial(fs_node_t *node, uint32_t offset, uint32_t size, uint8_t *b
|
||||
uint32_t write_serial(fs_node_t *node, uint32_t offset, uint32_t size, uint8_t *buffer) {
|
||||
uint32_t sent = 0;
|
||||
while (sent < size) {
|
||||
serial_send(node->inode, buffer[sent]);
|
||||
serial_send((int)node->device, buffer[sent]);
|
||||
sent++;
|
||||
}
|
||||
return size;
|
||||
@ -50,7 +50,7 @@ void close_serial(fs_node_t * node) {
|
||||
fs_node_t * serial_device_create(int device) {
|
||||
fs_node_t * fnode = malloc(sizeof(fs_node_t));
|
||||
memset(fnode, 0x00, sizeof(fs_node_t));
|
||||
fnode->inode = device;
|
||||
fnode->device= (void *)device;
|
||||
strcpy(fnode->name, "serial");
|
||||
fnode->uid = 0;
|
||||
fnode->gid = 0;
|
||||
|
@ -77,7 +77,7 @@ static inline size_t ring_buffer_unread(ring_buffer_t * ring_buffer) {
|
||||
}
|
||||
|
||||
size_t ring_buffer_size(fs_node_t * node) {
|
||||
ring_buffer_t * ring_buffer = (ring_buffer_t *)node->inode;
|
||||
ring_buffer_t * ring_buffer = (ring_buffer_t *)node->device;
|
||||
return ring_buffer_unread(ring_buffer);
|
||||
}
|
||||
|
||||
@ -109,7 +109,7 @@ static inline void ring_buffer_increment_write(ring_buffer_t * ring_buffer) {
|
||||
|
||||
|
||||
uint32_t read_pty_master(fs_node_t * node, uint32_t offset, uint32_t size, uint8_t *buffer) {
|
||||
pty_t * pty = (pty_t *)node->inode;
|
||||
pty_t * pty = (pty_t *)node->device;
|
||||
|
||||
/* Standard pipe read */
|
||||
size_t collected = 0;
|
||||
@ -130,7 +130,7 @@ uint32_t read_pty_master(fs_node_t * node, uint32_t offset, uint32_t size, uint
|
||||
return collected;
|
||||
}
|
||||
uint32_t write_pty_master(fs_node_t * node, uint32_t offset, uint32_t size, uint8_t *buffer) {
|
||||
pty_t * pty = (pty_t *)node->inode;
|
||||
pty_t * pty = (pty_t *)node->device;
|
||||
|
||||
size_t written = 0;
|
||||
while (written < size) {
|
||||
@ -163,7 +163,7 @@ void close_pty_master(fs_node_t * node) {
|
||||
}
|
||||
|
||||
uint32_t read_pty_slave(fs_node_t * node, uint32_t offset, uint32_t size, uint8_t *buffer) {
|
||||
pty_t * pty = (pty_t *)node->inode;
|
||||
pty_t * pty = (pty_t *)node->device;
|
||||
|
||||
debug_print(INFO, "tty read at offset=%d, size=%d", offset, size);
|
||||
|
||||
@ -188,7 +188,7 @@ uint32_t read_pty_slave(fs_node_t * node, uint32_t offset, uint32_t size, uint8
|
||||
return collected;
|
||||
}
|
||||
uint32_t write_pty_slave(fs_node_t * node, uint32_t offset, uint32_t size, uint8_t *buffer) {
|
||||
pty_t * pty = (pty_t *)node->inode;
|
||||
pty_t * pty = (pty_t *)node->device;
|
||||
|
||||
size_t written = 0;
|
||||
while (written < size) {
|
||||
@ -221,22 +221,22 @@ void close_pty_slave(fs_node_t * node) {
|
||||
* things differently in the slave or master.
|
||||
*/
|
||||
int ioctl_pty_master(fs_node_t * node, int request, void * argp) {
|
||||
pty_t * pty = (pty_t *)node->inode;
|
||||
pty_t * pty = (pty_t *)node->device;
|
||||
return pty_ioctl(pty, request, argp);
|
||||
}
|
||||
|
||||
int ioctl_pty_slave(fs_node_t * node, int request, void * argp) {
|
||||
pty_t * pty = (pty_t *)node->inode;
|
||||
pty_t * pty = (pty_t *)node->device;
|
||||
return pty_ioctl(pty, request, argp);
|
||||
}
|
||||
|
||||
int pty_available_input(fs_node_t * node) {
|
||||
pty_t * pty = (pty_t *)node->inode;
|
||||
pty_t * pty = (pty_t *)node->device;
|
||||
return ring_buffer_unread(&pty->in);
|
||||
}
|
||||
|
||||
int pty_available_output(fs_node_t * node) {
|
||||
pty_t * pty = (pty_t *)node->inode;
|
||||
pty_t * pty = (pty_t *)node->device;
|
||||
return ring_buffer_unread(&pty->out);
|
||||
}
|
||||
|
||||
@ -258,7 +258,7 @@ fs_node_t * pty_master_create(pty_t * pty) {
|
||||
fnode->ioctl = ioctl_pty_master;
|
||||
fnode->get_size = pty_available_output;
|
||||
|
||||
fnode->inode = (uintptr_t)pty;
|
||||
fnode->device = pty;
|
||||
|
||||
return fnode;
|
||||
}
|
||||
@ -281,7 +281,7 @@ fs_node_t * pty_slave_create(pty_t * pty) {
|
||||
fnode->ioctl = ioctl_pty_slave;
|
||||
fnode->get_size = pty_available_input;
|
||||
|
||||
fnode->inode = (uintptr_t)pty;
|
||||
fnode->device = pty;
|
||||
|
||||
return fnode;
|
||||
}
|
||||
|
@ -15,6 +15,8 @@
|
||||
|
||||
#define EXT2_SUPER_MAGIC 0xEF53
|
||||
|
||||
#define EXT2_DIRECT_BLOCKS 12
|
||||
|
||||
/* Super block struct. */
|
||||
struct ext2_superblock {
|
||||
uint32_t inodes_count;
|
||||
@ -162,7 +164,16 @@ struct ext2_dir {
|
||||
|
||||
typedef struct ext2_dir ext2_dir_t;
|
||||
|
||||
typedef struct {
|
||||
uint32_t block_no;
|
||||
uint32_t last_use;
|
||||
uint8_t dirty;
|
||||
uint8_t *block;
|
||||
} ext2_disk_cache_entry_t;
|
||||
|
||||
void ext2_ramdisk_mount(uint32_t offset);
|
||||
|
||||
typedef int (*ext2_block_io_t) (void *, uint32_t, uint8_t *);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -39,14 +39,22 @@ typedef int (*ioctl_type_t) (struct fs_node *, int request, void * argp);
|
||||
typedef int (*get_size_type_t) (struct fs_node *);
|
||||
|
||||
typedef struct fs_node {
|
||||
char name[256]; // The filename.
|
||||
uint32_t mask; // The permissions mask.
|
||||
uint32_t uid; // The owning user.
|
||||
uint32_t gid; // The owning group.
|
||||
uint32_t flags; // Flags (node type, etc).
|
||||
uint32_t inode; // Inode number.
|
||||
uint32_t length; // Size of the file, in byte.
|
||||
uint32_t impl; // Used to keep track which fs it belongs to.
|
||||
char name[256]; // The filename.
|
||||
void * device; // Device object (optional)
|
||||
uint32_t mask; // The permissions mask.
|
||||
uint32_t uid; // The owning user.
|
||||
uint32_t gid; // The owning group.
|
||||
uint32_t flags; // Flags (node type, etc).
|
||||
uint32_t inode; // Inode number.
|
||||
uint32_t length; // Size of the file, in byte.
|
||||
uint32_t impl; // Used to keep track which fs it belongs to.
|
||||
|
||||
/* times */
|
||||
uint32_t atime; // Accessed
|
||||
uint32_t mtime; // Modified
|
||||
uint32_t ctime; // Created
|
||||
|
||||
/* File operations */
|
||||
read_type_t read;
|
||||
write_type_t write;
|
||||
open_type_t open;
|
||||
@ -57,17 +65,15 @@ typedef struct fs_node {
|
||||
mkdir_type_t mkdir;
|
||||
ioctl_type_t ioctl;
|
||||
get_size_type_t get_size;
|
||||
struct fs_node *ptr; // Used by mountpoints and symlinks.
|
||||
uint32_t offset;
|
||||
int32_t shared_with;
|
||||
uint32_t atime;
|
||||
uint32_t mtime;
|
||||
uint32_t ctime;
|
||||
|
||||
struct fs_node *ptr; // Alias pointer, for symlinks.
|
||||
uint32_t offset; // Offset for read operations XXX move this to new "file descriptor" entry
|
||||
int32_t shared_with; // File descriptor sharing XXX
|
||||
} fs_node_t;
|
||||
|
||||
struct dirent {
|
||||
uint32_t ino; // Inode number.
|
||||
char name[256]; // The filename.
|
||||
uint32_t ino; // Inode number.
|
||||
char name[256]; // The filename.
|
||||
};
|
||||
|
||||
struct stat {
|
||||
|
Loading…
Reference in New Issue
Block a user