From 86af7f631080bc4b45846bd7f382c4cedcbec2b4 Mon Sep 17 00:00:00 2001 From: Benji Dial Date: Thu, 4 Mar 2021 14:57:31 -0500 Subject: making fs drivers ignore already open files during kernel setup and when opening init for the first time --- src/kernel/drive.c | 2 ++ src/kernel/drive.h | 2 ++ src/kernel/fat.c | 2 +- src/kernel/main.c | 4 ++++ 4 files changed, 9 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/kernel/drive.c b/src/kernel/drive.c index 8dc0e68..bc1c67d 100644 --- a/src/kernel/drive.c +++ b/src/kernel/drive.c @@ -6,6 +6,8 @@ uint8_t n_drives; struct drive drives[256]; +bool ignore_already_open = false; + void init_drives() { n_drives = 0; } diff --git a/src/kernel/drive.h b/src/kernel/drive.h index 93811e8..d09365d 100644 --- a/src/kernel/drive.h +++ b/src/kernel/drive.h @@ -49,4 +49,6 @@ extern struct drive drives[MAX_DRIVES]; void init_drives(); void commit_drive(struct drive data); +extern bool ignore_already_open; + #endif \ No newline at end of file diff --git a/src/kernel/fat.c b/src/kernel/fat.c index e328f61..b342267 100644 --- a/src/kernel/fat.c +++ b/src/kernel/fat.c @@ -238,7 +238,7 @@ static file_id_t fat_get_file(const struct drive *d, const char *path) { return 0; } - if (cur_dir->extra_attrib & FEA_OPEN_EXCLUSIVE) { + if (!ignore_already_open && (cur_dir->extra_attrib & FEA_OPEN_EXCLUSIVE)) { d->done(d); return 0;//maybe have a special return value for this? } diff --git a/src/kernel/main.c b/src/kernel/main.c index 36b5fc1..9699029 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -38,6 +38,8 @@ void main() { init_ide(); //other drive drivers + ignore_already_open = true; + init_log(); init_settings(); @@ -94,6 +96,8 @@ void main() { if (!try_elf_run(drives, "bin/init", "", 0)) PANIC("Failed to load init program."); + ignore_already_open = false; + logf(LOG_INFO, "Switching to init task."); _start_user_mode(); -- cgit v1.2.3