# HG changeset patch # User Paul Boddie # Date 1632699005 -7200 # Node ID 8233b51eeab07cdc7923868260122b5d90f49271 # Parent b2e59748a3d8cff85cb73ab94b7884eae6622ec2 Renamed FilePaging to FileObjectRegistry. diff -r b2e59748a3d8 -r 8233b51eeab0 libfsserver/include/fsserver/block_file_opener.h --- a/libfsserver/include/fsserver/block_file_opener.h Mon Sep 27 01:16:49 2021 +0200 +++ b/libfsserver/include/fsserver/block_file_opener.h Mon Sep 27 01:30:05 2021 +0200 @@ -30,8 +30,8 @@ class BlockFileOpener : public HostFileOpener { public: - explicit BlockFileOpener(FilePaging *paging) - : HostFileOpener(paging) + explicit BlockFileOpener(FileObjectRegistry *registry) + : HostFileOpener(registry) { } diff -r b2e59748a3d8 -r 8233b51eeab0 libfsserver/include/fsserver/ext2_file_opener.h --- a/libfsserver/include/fsserver/ext2_file_opener.h Mon Sep 27 01:16:49 2021 +0200 +++ b/libfsserver/include/fsserver/ext2_file_opener.h Mon Sep 27 01:30:05 2021 +0200 @@ -45,8 +45,8 @@ virtual bool accessing_file(const char *path, flags_t flags, fileid_t fileid); public: - explicit Ext2FileOpener(FilePaging *paging, Ext2FileOperations *ops, user_t user) - : OpenerResource(paging), _ops(ops), _user(user) + explicit Ext2FileOpener(FileObjectRegistry *registry, Ext2FileOperations *ops, user_t user) + : OpenerResource(registry), _ops(ops), _user(user) { } diff -r b2e59748a3d8 -r 8233b51eeab0 libfsserver/include/fsserver/file_object_registry.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libfsserver/include/fsserver/file_object_registry.h Mon Sep 27 01:30:05 2021 +0200 @@ -0,0 +1,69 @@ +/* + * A registry of filesystem objects. + * + * Copyright (C) 2021 Paul Boddie + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + + + +/* A registry of filesystem objects. */ + +class FileObjectRegistry : public FileRegistry +{ +protected: + Pages *_pages; + + /* Resource initialisation methods. */ + + map_flags_t get_flags(flags_t flags); + + long get_directory_provider(FileOpening *opening, const char *path, + flags_t flags, fileid_t fileid, + DirectoryProvider **directory_provider); + + long get_file_provider(FileOpening *opening, const char *path, + flags_t flags, fileid_t fileid, + FileProvider **file_provider); + +public: + explicit FileObjectRegistry(Pages *pages); + + /* Resource discovery methods. */ + + long find_directory_provider(fileid_t fileid, + DirectoryProvider **directory_provider); + + /* Resource initialisation methods. */ + + long get_directory(FileOpening *opening, const char *path, flags_t flags, + fileid_t fileid, Resource **resource); + + long get_pager(FileOpening *opening, const char *path, flags_t flags, + fileid_t fileid, Pager **pager); +}; + +// vim: tabstop=4 expandtab shiftwidth=4 diff -r b2e59748a3d8 -r 8233b51eeab0 libfsserver/include/fsserver/file_paging.h --- a/libfsserver/include/fsserver/file_paging.h Mon Sep 27 01:16:49 2021 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* - * A registry of filesystem objects. - * - * Copyright (C) 2021 Paul Boddie - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA - */ - -#pragma once - -#include -#include -#include -#include -#include -#include - - - -/* A registry of filesystem objects. */ - -class FilePaging : public FileRegistry -{ -protected: - Pages *_pages; - - /* Resource initialisation methods. */ - - map_flags_t get_flags(flags_t flags); - - long get_directory_provider(FileOpening *opening, const char *path, - flags_t flags, fileid_t fileid, - DirectoryProvider **directory_provider); - - long get_file_provider(FileOpening *opening, const char *path, - flags_t flags, fileid_t fileid, - FileProvider **file_provider); - -public: - explicit FilePaging(Pages *pages); - - /* Resource discovery methods. */ - - long find_directory_provider(fileid_t fileid, - DirectoryProvider **directory_provider); - - /* Resource initialisation methods. */ - - long get_directory(FileOpening *opening, const char *path, flags_t flags, - fileid_t fileid, Resource **resource); - - long get_pager(FileOpening *opening, const char *path, flags_t flags, - fileid_t fileid, Pager **pager); -}; - -// vim: tabstop=4 expandtab shiftwidth=4 diff -r b2e59748a3d8 -r 8233b51eeab0 libfsserver/include/fsserver/filesystem_resource.h --- a/libfsserver/include/fsserver/filesystem_resource.h Mon Sep 27 01:16:49 2021 +0200 +++ b/libfsserver/include/fsserver/filesystem_resource.h Mon Sep 27 01:30:05 2021 +0200 @@ -21,7 +21,7 @@ #pragma once -#include +#include #include #include @@ -29,7 +29,7 @@ /* Support for providing access to user-specific filesystems. */ -class FilesystemResource : public Resource, public FilePaging, +class FilesystemResource : public Resource, public FileObjectRegistry, public FilesystemObject { public: diff -r b2e59748a3d8 -r 8233b51eeab0 libfsserver/include/fsserver/host_file_opener.h --- a/libfsserver/include/fsserver/host_file_opener.h Mon Sep 27 01:16:49 2021 +0200 +++ b/libfsserver/include/fsserver/host_file_opener.h Mon Sep 27 01:30:05 2021 +0200 @@ -55,8 +55,8 @@ virtual bool accessing_file(const char *path, flags_t flags, fileid_t fileid); public: - explicit HostFileOpener(FilePaging *paging) - : OpenerResource(paging) + explicit HostFileOpener(FileObjectRegistry *registry) + : OpenerResource(registry) { } diff -r b2e59748a3d8 -r 8233b51eeab0 libfsserver/include/fsserver/opener_resource.h --- a/libfsserver/include/fsserver/opener_resource.h Mon Sep 27 01:16:49 2021 +0200 +++ b/libfsserver/include/fsserver/opener_resource.h Mon Sep 27 01:30:05 2021 +0200 @@ -21,8 +21,8 @@ #pragma once +#include #include -#include #include #include #include @@ -34,7 +34,7 @@ class OpenerResource : public Resource, public FileOpening, public Opener { protected: - FilePaging *_paging; + FileObjectRegistry *_registry; /* Convenience methods determining different object types. */ @@ -53,7 +53,7 @@ object_flags_t *object_flags); public: - explicit OpenerResource(FilePaging *paging); + explicit OpenerResource(FileObjectRegistry *registry); virtual ~OpenerResource(); diff -r b2e59748a3d8 -r 8233b51eeab0 libfsserver/include/fsserver/test_file_opener.h --- a/libfsserver/include/fsserver/test_file_opener.h Mon Sep 27 01:16:49 2021 +0200 +++ b/libfsserver/include/fsserver/test_file_opener.h Mon Sep 27 01:30:05 2021 +0200 @@ -39,7 +39,7 @@ virtual bool accessing_file(const char *path, flags_t flags, fileid_t fileid); public: - explicit TestFileOpener(FilePaging *paging, offset_t file_size=0); + explicit TestFileOpener(FileObjectRegistry *registry, offset_t file_size=0); virtual ~TestFileOpener(); diff -r b2e59748a3d8 -r 8233b51eeab0 libfsserver/lib/Makefile --- a/libfsserver/lib/Makefile Mon Sep 27 01:16:49 2021 +0200 +++ b/libfsserver/lib/Makefile Mon Sep 27 01:30:05 2021 +0200 @@ -57,8 +57,8 @@ files/ext2_file_operations.cc \ files/ext2_filesystem.cc \ files/file_notification.cc \ + files/file_object_registry.cc \ files/file_pager.cc \ - files/file_paging.cc \ files/file_provider.cc \ files/file_registry.cc \ files/filesystem_resource.cc \ diff -r b2e59748a3d8 -r 8233b51eeab0 libfsserver/lib/files/file_object_registry.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libfsserver/lib/files/file_object_registry.cc Mon Sep 27 01:30:05 2021 +0200 @@ -0,0 +1,189 @@ +/* + * File registry and opening functionality. + * + * Copyright (C) 2021 Paul Boddie + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA + */ + +#include "directory_resource.h" +#include "file_object_registry.h" +#include "file_pager.h" + +#include + + + +/* The file object registry provides a memory page collection to the page + mappers it creates. */ + +FileObjectRegistry::FileObjectRegistry(Pages *pages) +: _pages(pages) +{ +} + + + +/* Convert opening flags to map-compatible paging flags. */ + +map_flags_t FileObjectRegistry::get_flags(flags_t flags) +{ + return flags & (O_WRONLY | O_RDWR) ? L4RE_DS_MAP_FLAG_RW : L4RE_DS_MAP_FLAG_RO; +} + + + +/* Obtain any active provider for 'fileid'. */ + +long FileObjectRegistry::find_directory_provider(fileid_t fileid, + DirectoryProvider **directory_provider) +{ + /* Obtain any registered provider. */ + + Accountable *provider = get(fileid); + + if (provider != NULL) + { + *directory_provider = dynamic_cast(provider); + + if ((*directory_provider) != NULL) + return L4_EOK; + else + return -L4_EIO; + } + + return -L4_ENOENT; +} + +/* Obtain a provider for the 'fileid' or register a new one. */ + +long FileObjectRegistry::get_directory_provider(FileOpening *opening, + const char *path, flags_t flags, + fileid_t fileid, + DirectoryProvider **directory_provider) +{ + long err = find_directory_provider(fileid, directory_provider); + + if (err != -L4_ENOENT) + return err; + + /* Make an accessor and a provider to encapsulate it. */ + + DirectoryAccessor *accessor; + err = opening->make_directory_accessor(path, flags, fileid, &accessor); + + if (err) + return err; + + *directory_provider = new DirectoryProvider(accessor); + + /* Register the provider. */ + + set(fileid, *directory_provider); + return L4_EOK; +} + +/* Obtain a provider for the 'fileid' or register a new one. */ + +long FileObjectRegistry::get_file_provider(FileOpening *opening, + const char *path, flags_t flags, + fileid_t fileid, + FileProvider **file_provider) +{ + /* Obtain any registered provider. */ + + Accountable *provider = get(fileid); + + if (provider != NULL) + { + *file_provider = dynamic_cast(provider); + + if ((*file_provider) != NULL) + return L4_EOK; + else + return -L4_EIO; + } + + /* Make an accessor, page mapper, and a provider to encapsulate them. */ + + Accessor *accessor; + long err = opening->make_accessor(path, flags, fileid, &accessor); + + if (err) + return err; + + PageMapper *mapper = new PageMapper(accessor, _pages); + *file_provider = new FileProvider(mapper); + + /* Register the provider. */ + + set(fileid, *file_provider); + return L4_EOK; +} + + + +/* Return a directory resource initialised with a provider. */ + +long FileObjectRegistry::get_directory(FileOpening *opening, const char *path, + flags_t flags, fileid_t fileid, + Resource **resource) +{ + std::lock_guard guard(_lock); + + /* Obtain any existing provider registered for the object, or make a new + provider. */ + + DirectoryProvider *provider; + long err = get_directory_provider(opening, path, flags, fileid, &provider); + + if (err) + return err; + + /* Initialise the resource with the provider and a reference to this object + for detaching from the provider. */ + + provider->attach(); + *resource = new DirectoryResource(fileid, provider, this); + return L4_EOK; +} + +/* Return a pager initialised with a provider, page mapper and accessor. */ + +long FileObjectRegistry::get_pager(FileOpening *opening, const char *path, + flags_t flags, fileid_t fileid, + Pager **pager) +{ + std::lock_guard guard(_lock); + + /* Obtain any existing provider registered for the file, or make a new + provider. */ + + FileProvider *provider; + long err = get_file_provider(opening, path, flags, fileid, &provider); + + if (err) + return err; + + /* Initialise the pager with the provider and a reference to this object for + detaching from the provider. */ + + provider->attach(); + *pager = new FilePager(fileid, provider, get_flags(flags), this); + return L4_EOK; +} + +// vim: tabstop=4 expandtab shiftwidth=4 diff -r b2e59748a3d8 -r 8233b51eeab0 libfsserver/lib/files/file_paging.cc --- a/libfsserver/lib/files/file_paging.cc Mon Sep 27 01:16:49 2021 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,186 +0,0 @@ -/* - * File registry and opening functionality. - * - * Copyright (C) 2021 Paul Boddie - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA - */ - -#include "directory_resource.h" -#include "file_pager.h" -#include "file_paging.h" - -#include - - - -/* The file paging coordinator provides a memory page collection to the page - mappers it creates. */ - -FilePaging::FilePaging(Pages *pages) -: _pages(pages) -{ -} - - - -/* Convert opening flags to map-compatible paging flags. */ - -map_flags_t FilePaging::get_flags(flags_t flags) -{ - return flags & (O_WRONLY | O_RDWR) ? L4RE_DS_MAP_FLAG_RW : L4RE_DS_MAP_FLAG_RO; -} - - - -/* Obtain any active provider for 'fileid'. */ - -long FilePaging::find_directory_provider(fileid_t fileid, - DirectoryProvider **directory_provider) -{ - /* Obtain any registered provider. */ - - Accountable *provider = get(fileid); - - if (provider != NULL) - { - *directory_provider = dynamic_cast(provider); - - if ((*directory_provider) != NULL) - return L4_EOK; - else - return -L4_EIO; - } - - return -L4_ENOENT; -} - -/* Obtain a provider for the 'fileid' or register a new one. */ - -long FilePaging::get_directory_provider(FileOpening *opening, const char *path, - flags_t flags, fileid_t fileid, - DirectoryProvider **directory_provider) -{ - long err = find_directory_provider(fileid, directory_provider); - - if (err != -L4_ENOENT) - return err; - - /* Make an accessor and a provider to encapsulate it. */ - - DirectoryAccessor *accessor; - err = opening->make_directory_accessor(path, flags, fileid, &accessor); - - if (err) - return err; - - *directory_provider = new DirectoryProvider(accessor); - - /* Register the provider. */ - - set(fileid, *directory_provider); - return L4_EOK; -} - -/* Obtain a provider for the 'fileid' or register a new one. */ - -long FilePaging::get_file_provider(FileOpening *opening, const char *path, - flags_t flags, fileid_t fileid, - FileProvider **file_provider) -{ - /* Obtain any registered provider. */ - - Accountable *provider = get(fileid); - - if (provider != NULL) - { - *file_provider = dynamic_cast(provider); - - if ((*file_provider) != NULL) - return L4_EOK; - else - return -L4_EIO; - } - - /* Make an accessor, page mapper, and a provider to encapsulate them. */ - - Accessor *accessor; - long err = opening->make_accessor(path, flags, fileid, &accessor); - - if (err) - return err; - - PageMapper *mapper = new PageMapper(accessor, _pages); - *file_provider = new FileProvider(mapper); - - /* Register the provider. */ - - set(fileid, *file_provider); - return L4_EOK; -} - - - -/* Return a directory resource initialised with a provider. */ - -long FilePaging::get_directory(FileOpening *opening, const char *path, - flags_t flags, fileid_t fileid, - Resource **resource) -{ - std::lock_guard guard(_lock); - - /* Obtain any existing provider registered for the object, or make a new - provider. */ - - DirectoryProvider *provider; - long err = get_directory_provider(opening, path, flags, fileid, &provider); - - if (err) - return err; - - /* Initialise the resource with the provider and a reference to this object - for detaching from the provider. */ - - provider->attach(); - *resource = new DirectoryResource(fileid, provider, this); - return L4_EOK; -} - -/* Return a pager initialised with a provider, page mapper and accessor. */ - -long FilePaging::get_pager(FileOpening *opening, const char *path, - flags_t flags, fileid_t fileid, Pager **pager) -{ - std::lock_guard guard(_lock); - - /* Obtain any existing provider registered for the file, or make a new - provider. */ - - FileProvider *provider; - long err = get_file_provider(opening, path, flags, fileid, &provider); - - if (err) - return err; - - /* Initialise the pager with the provider and a reference to this object for - detaching from the provider. */ - - provider->attach(); - *pager = new FilePager(fileid, provider, get_flags(flags), this); - return L4_EOK; -} - -// vim: tabstop=4 expandtab shiftwidth=4 diff -r b2e59748a3d8 -r 8233b51eeab0 libfsserver/lib/files/filesystem_resource.cc --- a/libfsserver/lib/files/filesystem_resource.cc Mon Sep 27 01:16:49 2021 +0200 +++ b/libfsserver/lib/files/filesystem_resource.cc Mon Sep 27 01:30:05 2021 +0200 @@ -25,7 +25,7 @@ /* Support for providing access to user-specific filesystems. */ FilesystemResource::FilesystemResource(Pages *pages) -: FilePaging(pages) +: FileObjectRegistry(pages) { } diff -r b2e59748a3d8 -r 8233b51eeab0 libfsserver/lib/files/opener_resource.cc --- a/libfsserver/lib/files/opener_resource.cc Mon Sep 27 01:16:49 2021 +0200 +++ b/libfsserver/lib/files/opener_resource.cc Mon Sep 27 01:30:05 2021 +0200 @@ -25,8 +25,8 @@ /* Support for providing access to files. */ -OpenerResource::OpenerResource(FilePaging *paging) -: _paging(paging) +OpenerResource::OpenerResource(FileObjectRegistry *registry) +: _registry(registry) { } @@ -79,7 +79,7 @@ object_flags_t *object_flags) { Resource *directory; - long err = _paging->get_directory(this, path, flags, fileid, &directory); + long err = _registry->get_directory(this, path, flags, fileid, &directory); if (err) return err; @@ -99,7 +99,7 @@ object_flags_t *object_flags) { Pager *pager; - long err = _paging->get_pager(this, path, flags, fileid, &pager); + long err = _registry->get_pager(this, path, flags, fileid, &pager); if (err) return err; diff -r b2e59748a3d8 -r 8233b51eeab0 libfsserver/lib/files/test_file_opener.cc --- a/libfsserver/lib/files/test_file_opener.cc Mon Sep 27 01:16:49 2021 +0200 +++ b/libfsserver/lib/files/test_file_opener.cc Mon Sep 27 01:30:05 2021 +0200 @@ -26,8 +26,8 @@ /* Support for providing access to files. */ -TestFileOpener::TestFileOpener(FilePaging *paging, offset_t file_size) -: OpenerResource(paging), _file_size(file_size) +TestFileOpener::TestFileOpener(FileObjectRegistry *registry, offset_t file_size) +: OpenerResource(registry), _file_size(file_size) { } diff -r b2e59748a3d8 -r 8233b51eeab0 servers/block_file_server.cc --- a/servers/block_file_server.cc Mon Sep 27 01:16:49 2021 +0200 +++ b/servers/block_file_server.cc Mon Sep 27 01:30:05 2021 +0200 @@ -66,8 +66,8 @@ MemoryIncremental mem(memory_pages); PageQueueShared queue; Pages pages(&mem, &queue); - FilePaging paging(&pages); - BlockFileOpener opener(&paging); + FileObjectRegistry registry(&pages); + BlockFileOpener opener(®istry); /* Register a server associating it with the given object. */ diff -r b2e59748a3d8 -r 8233b51eeab0 servers/client_file_server.cc --- a/servers/client_file_server.cc Mon Sep 27 01:16:49 2021 +0200 +++ b/servers/client_file_server.cc Mon Sep 27 01:30:05 2021 +0200 @@ -67,8 +67,8 @@ MemoryIncremental mem(memory_pages); PageQueueShared queue; Pages pages(&mem, &queue); - FilePaging paging(&pages); - ClientFileOpener opener(&paging); + FileObjectRegistry registry(&pages); + ClientFileOpener opener(®istry); /* Register a server associating it with the given object. */ diff -r b2e59748a3d8 -r 8233b51eeab0 servers/ext2_file_server.cc --- a/servers/ext2_file_server.cc Mon Sep 27 01:16:49 2021 +0200 +++ b/servers/ext2_file_server.cc Mon Sep 27 01:30:05 2021 +0200 @@ -94,7 +94,6 @@ MemoryIncremental mem(memory_pages); PageQueueShared queue; Pages pages(&mem, &queue); - FilePaging paging(&pages); Ext2Filesystem filesystem(&pages, fs); /* Register a server associating it with the given object. */ diff -r b2e59748a3d8 -r 8233b51eeab0 servers/host_file_server.cc --- a/servers/host_file_server.cc Mon Sep 27 01:16:49 2021 +0200 +++ b/servers/host_file_server.cc Mon Sep 27 01:30:05 2021 +0200 @@ -66,8 +66,8 @@ MemoryIncremental mem(memory_pages); PageQueueShared queue; Pages pages(&mem, &queue); - FilePaging paging(&pages); - HostFileOpener opener(&paging); + FileObjectRegistry registry(&pages); + HostFileOpener opener(®istry); /* Register a server associating it with the given object. */ diff -r b2e59748a3d8 -r 8233b51eeab0 servers/test_file_server.cc --- a/servers/test_file_server.cc Mon Sep 27 01:16:49 2021 +0200 +++ b/servers/test_file_server.cc Mon Sep 27 01:30:05 2021 +0200 @@ -65,8 +65,8 @@ MemoryIncremental mem(memory_pages, page(REGION_PAGES)); PageQueueShared queue; Pages pages(&mem, &queue); - FilePaging paging(&pages); - TestFileOpener opener(&paging, page(FILE_PAGES)); + FileObjectRegistry registry(&pages); + TestFileOpener opener(®istry, page(FILE_PAGES)); /* Register a server associating it with the given object. */