forked from Bananymous/banan-os
				
			
			update main #1
			
				
			
		
		
		
	| 
						 | 
					@ -2,6 +2,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <kernel/Device/Device.h>
 | 
					#include <kernel/Device/Device.h>
 | 
				
			||||||
#include <kernel/FS/RamFS/FileSystem.h>
 | 
					#include <kernel/FS/RamFS/FileSystem.h>
 | 
				
			||||||
 | 
					#include <kernel/Semaphore.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Kernel
 | 
					namespace Kernel
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -19,6 +20,8 @@ namespace Kernel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		dev_t get_next_dev();
 | 
							dev_t get_next_dev();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void initiate_sync(bool should_block);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private:
 | 
						private:
 | 
				
			||||||
		DevFileSystem(size_t size)
 | 
							DevFileSystem(size_t size)
 | 
				
			||||||
			: RamFileSystem(size)
 | 
								: RamFileSystem(size)
 | 
				
			||||||
| 
						 | 
					@ -26,6 +29,10 @@ namespace Kernel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private:
 | 
						private:
 | 
				
			||||||
		SpinLock m_device_lock;
 | 
							SpinLock m_device_lock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Semaphore m_sync_done;
 | 
				
			||||||
 | 
							Semaphore m_sync_semaphore;
 | 
				
			||||||
 | 
							volatile bool m_should_sync { false };
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -109,7 +109,7 @@ namespace Kernel
 | 
				
			||||||
		BAN::ErrorOr<long> sys_fstatat(int fd, const char* path, struct stat* buf, int flag);
 | 
							BAN::ErrorOr<long> sys_fstatat(int fd, const char* path, struct stat* buf, int flag);
 | 
				
			||||||
		BAN::ErrorOr<long> sys_stat(const char* path, struct stat* buf, int flag);
 | 
							BAN::ErrorOr<long> sys_stat(const char* path, struct stat* buf, int flag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		BAN::ErrorOr<long> sys_sync();
 | 
							BAN::ErrorOr<long> sys_sync(bool should_block);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		BAN::ErrorOr<void> mount(BAN::StringView source, BAN::StringView target);
 | 
							BAN::ErrorOr<void> mount(BAN::StringView source, BAN::StringView target);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,7 @@
 | 
				
			||||||
#include <kernel/FS/RamFS/Inode.h>
 | 
					#include <kernel/FS/RamFS/Inode.h>
 | 
				
			||||||
#include <kernel/LockGuard.h>
 | 
					#include <kernel/LockGuard.h>
 | 
				
			||||||
#include <kernel/Process.h>
 | 
					#include <kernel/Process.h>
 | 
				
			||||||
 | 
					#include <kernel/Storage/StorageDevice.h>
 | 
				
			||||||
#include <kernel/Timer/Timer.h>
 | 
					#include <kernel/Timer/Timer.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Kernel
 | 
					namespace Kernel
 | 
				
			||||||
| 
						 | 
					@ -53,6 +54,67 @@ namespace Kernel
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}, nullptr
 | 
								}, nullptr
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							auto* sync_process = Process::create_kernel();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sync_process->add_thread(MUST(Thread::create_kernel(
 | 
				
			||||||
 | 
								[](void*)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									// NOTE: we lock the device lock here and unlock
 | 
				
			||||||
 | 
									//       it only while semaphore is blocking
 | 
				
			||||||
 | 
									s_instance->m_device_lock.lock();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									while (true)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										while (!s_instance->m_should_sync)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											s_instance->m_device_lock.unlock();
 | 
				
			||||||
 | 
											s_instance->m_sync_semaphore.block();
 | 
				
			||||||
 | 
											s_instance->m_device_lock.lock();
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										s_instance->for_each_inode(
 | 
				
			||||||
 | 
											[](BAN::RefPtr<RamInode> inode)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												if (inode->is_device())
 | 
				
			||||||
 | 
													if (((Device*)inode.ptr())->is_storage_device())
 | 
				
			||||||
 | 
														if (auto ret = ((StorageDevice*)inode.ptr())->sync_disk_cache(); ret.is_error())
 | 
				
			||||||
 | 
															dwarnln("disk sync: {}", ret.error());
 | 
				
			||||||
 | 
												return BAN::Iteration::Continue;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										);
 | 
				
			||||||
 | 
										s_instance->m_should_sync = false;
 | 
				
			||||||
 | 
										s_instance->m_sync_done.unblock();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}, nullptr, sync_process
 | 
				
			||||||
 | 
							)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sync_process->add_thread(MUST(Kernel::Thread::create_kernel(
 | 
				
			||||||
 | 
								[](void*)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									while (true)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										SystemTimer::get().sleep(10000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										LockGuard _(s_instance->m_device_lock);
 | 
				
			||||||
 | 
										s_instance->m_should_sync = true;
 | 
				
			||||||
 | 
										s_instance->m_sync_semaphore.unblock();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}, nullptr, sync_process
 | 
				
			||||||
 | 
							)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sync_process->register_to_scheduler();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void DevFileSystem::initiate_sync(bool should_block)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								LockGuard _(m_device_lock);
 | 
				
			||||||
 | 
								m_should_sync = true;
 | 
				
			||||||
 | 
								m_sync_semaphore.unblock();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (should_block)
 | 
				
			||||||
 | 
								m_sync_done.block();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void DevFileSystem::add_device(BAN::StringView path, BAN::RefPtr<RamInode> device)
 | 
						void DevFileSystem::add_device(BAN::StringView path, BAN::RefPtr<RamInode> device)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -767,22 +767,10 @@ namespace Kernel
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BAN::ErrorOr<long> Process::sys_sync()
 | 
						BAN::ErrorOr<long> Process::sys_sync(bool should_block)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		BAN::ErrorOr<long> ret = 0;
 | 
							DevFileSystem::get().initiate_sync(should_block);
 | 
				
			||||||
		DevFileSystem::get().for_each_device(
 | 
							return 0;
 | 
				
			||||||
			[&](Device* device)
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				if (device->is_storage_device())
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					auto success = ((StorageDevice*)device)->sync_disk_cache();
 | 
					 | 
				
			||||||
					if (success.is_error())
 | 
					 | 
				
			||||||
						ret = success.release_error();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return BAN::Iteration::Continue;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		);
 | 
					 | 
				
			||||||
		return ret;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BAN::ErrorOr<long> Process::sys_read_dir_entries(int fd, DirectoryEntryList* list, size_t list_size)
 | 
						BAN::ErrorOr<long> Process::sys_read_dir_entries(int fd, DirectoryEntryList* list, size_t list_size)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -185,7 +185,7 @@ namespace Kernel
 | 
				
			||||||
			ret = Process::current().sys_stat((const char*)arg1, (struct stat*)arg2, (int)arg3);
 | 
								ret = Process::current().sys_stat((const char*)arg1, (struct stat*)arg2, (int)arg3);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case SYS_SYNC:
 | 
							case SYS_SYNC:
 | 
				
			||||||
			ret = Process::current().sys_sync();
 | 
								ret = Process::current().sys_sync((bool)arg1);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case SYS_MMAP:
 | 
							case SYS_MMAP:
 | 
				
			||||||
			ret = Process::current().sys_mmap((const sys_mmap_t*)arg1);
 | 
								ret = Process::current().sys_mmap((const sys_mmap_t*)arg1);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue