diff options
author | Liav A <liavalb@gmail.com> | 2020-03-26 02:51:06 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-04-02 12:03:08 +0200 |
commit | 6b59311d4bdc1447e085573f9bd2c42819e264dd (patch) | |
tree | 8f015232e7cb5466e151b11fef9a01c620fae6de /Kernel/FileSystem/FileBackedFileSystem.h | |
parent | 2f2016f51d217e6c0c05a72664bdb1307ad538e6 (diff) | |
download | serenity-6b59311d4bdc1447e085573f9bd2c42819e264dd.zip |
Kernel: Change Ext2FS to be backed by a file instead of a block device
This ensures that we can mount image files as virtual disks without the
need of implementing gross hacks like loopback devices :)
Diffstat (limited to 'Kernel/FileSystem/FileBackedFileSystem.h')
-rw-r--r-- | Kernel/FileSystem/FileBackedFileSystem.h | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/Kernel/FileSystem/FileBackedFileSystem.h b/Kernel/FileSystem/FileBackedFileSystem.h new file mode 100644 index 0000000000..36c89e4af0 --- /dev/null +++ b/Kernel/FileSystem/FileBackedFileSystem.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include <Kernel/FileSystem/FileDescription.h> +#include <Kernel/FileSystem/FileSystem.h> +#include <Kernel/Forward.h> + +namespace Kernel { + +class FileBackedFS : public FS { +public: + virtual ~FileBackedFS() override; + + virtual bool is_file_backed() const override { return true; } + + File& file() { return m_file_description->file(); } + FileDescription& file_description() { return *m_file_description; } + const File& file() const { return m_file_description->file(); } + const FileDescription& file_description() const { return *m_file_description; } + + virtual void flush_writes() override; + + void flush_writes_impl(); + + size_t logical_block_size() const { return m_logical_block_size; }; + +protected: + explicit FileBackedFS(FileDescription&); + + bool read_block(unsigned index, u8* buffer, FileDescription* = nullptr, bool use_logical_block_size = false, bool cache_disabled = false) const; + bool read_blocks(unsigned index, unsigned count, u8* buffer, FileDescription* = nullptr, bool use_logical_block_size = false, bool cache_disabled = false) const; + + bool write_block(unsigned index, const u8*, FileDescription* = nullptr, bool use_logical_block_size = false); + bool write_blocks(unsigned index, unsigned count, const u8*, FileDescription* = nullptr, bool use_logical_block_size = false); + + size_t m_logical_block_size { 512 }; + +private: + DiskCache& cache() const; + void flush_specific_block_if_needed(unsigned index); + + NonnullRefPtr<FileDescription> m_file_description; + mutable OwnPtr<DiskCache> m_cache; +}; + +} |