# HG changeset patch # User Paul Boddie # Date 1634489310 -7200 # Node ID 8bf9abc10ae7ac53b083bca481015bce10c1b54b # Parent c9eb29eecf6972f339f08e2e135642094bd908aa Reorganised the mechanism of obtaining providers and resources in the registry. diff -r c9eb29eecf69 -r 8bf9abc10ae7 libfsserver/include/fsserver/file_object_registry.h --- a/libfsserver/include/fsserver/file_object_registry.h Sat Oct 16 23:41:12 2021 +0200 +++ b/libfsserver/include/fsserver/file_object_registry.h Sun Oct 17 18:48:30 2021 +0200 @@ -37,35 +37,43 @@ 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); + /* Provider initialisation methods. */ + + long make_directory_provider(FileOpening *opening, const char *path, + flags_t flags, fileid_t fileid, + Provider **provider); - long get_file_provider(FileOpening *opening, const char *path, - flags_t flags, fileid_t fileid, - FileProvider **file_provider); + long make_file_provider(FileOpening *opening, const char *path, + flags_t flags, fileid_t fileid, + Provider **provider); + + long make_provider(FileOpening *opening, const char *path, + flags_t flags, fileid_t fileid, + Provider **provider); /* Resource initialisation methods. */ - long get_directory(FileOpening *opening, const char *path, flags_t flags, - fileid_t fileid, offset_t *size, object_flags_t *object_flags, - Resource **resource); + long make_directory_resource(fileid_t fileid, offset_t *size, + object_flags_t *object_flags, + DirectoryProvider *provider, + Resource **resource); - long get_file(FileOpening *opening, const char *path, flags_t flags, - fileid_t fileid, offset_t *size, object_flags_t *object_flags, - Resource **resource); + long make_file_resource(flags_t flags, fileid_t fileid, offset_t *size, + object_flags_t *object_flags, + FileProvider *provider, Resource **resource); + + long make_resource(flags_t flags, fileid_t fileid, offset_t *size, + object_flags_t *object_flags, + Provider *provider, Resource **resource); public: explicit FileObjectRegistry(Pages *pages); /* Resource discovery methods. */ - long find_directory_provider(fileid_t fileid, - DirectoryProvider **directory_provider); + long find_provider(fileid_t fileid, Provider **provider); /* Resource initialisation methods. */ diff -r c9eb29eecf69 -r 8bf9abc10ae7 libfsserver/lib/files/file_object_registry.cc --- a/libfsserver/lib/files/file_object_registry.cc Sat Oct 16 23:41:12 2021 +0200 +++ b/libfsserver/lib/files/file_object_registry.cc Sun Oct 17 18:48:30 2021 +0200 @@ -46,77 +46,36 @@ -/* 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); +/* Make a directory 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 FileObjectRegistry::make_directory_provider(FileOpening *opening, + const char *path, flags_t flags, + fileid_t fileid, + Provider **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); + long err = opening->make_directory_accessor(path, flags, fileid, &accessor); if (err) return err; - *directory_provider = new DirectoryProvider(accessor); + *provider = new DirectoryProvider(accessor); /* Register the provider. */ - set(fileid, *directory_provider); + set(fileid, *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); +/* Make a file provider. */ - if (provider != NULL) - { - *file_provider = dynamic_cast(provider); - - if ((*file_provider) != NULL) - return L4_EOK; - else - return -L4_EIO; - } - +long FileObjectRegistry::make_file_provider(FileOpening *opening, + const char *path, flags_t flags, + fileid_t fileid, + Provider **provider) +{ /* Make an accessor, page mapper, and a provider to encapsulate them. */ Accessor *accessor; @@ -126,32 +85,38 @@ return err; PageMapper *mapper = new PageMapper(accessor, _pages); - *file_provider = new FileProvider(mapper); + *provider = new FileProvider(mapper); /* Register the provider. */ - set(fileid, *file_provider); + set(fileid, *provider); return L4_EOK; } +/* Make a provider of the appropriate type. */ + +long FileObjectRegistry::make_provider(FileOpening *opening, + const char *path, flags_t flags, + fileid_t fileid, + Provider **provider) +{ + if (opening->accessing_directory(path, flags, fileid)) + return make_directory_provider(opening, path, flags, fileid, provider); + else if (opening->accessing_file(path, flags, fileid)) + return make_file_provider(opening, path, flags, fileid, provider); + else + return -L4_EIO; +} + /* Return a directory resource initialised with a provider. */ -long FileObjectRegistry::get_directory(FileOpening *opening, const char *path, - flags_t flags, fileid_t fileid, - offset_t *size, object_flags_t *object_flags, - Resource **resource) +long FileObjectRegistry::make_directory_resource(fileid_t fileid, offset_t *size, + object_flags_t *object_flags, + DirectoryProvider *provider, + Resource **resource) { - /* 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; - /* Provide non-file values for certain outputs. */ *size = 0; @@ -167,20 +132,12 @@ /* Return a file pager initialised with a provider, page mapper and accessor. */ -long FileObjectRegistry::get_file(FileOpening *opening, const char *path, - flags_t flags, fileid_t fileid, - offset_t *size, object_flags_t *object_flags, - Resource **resource) +long FileObjectRegistry::make_file_resource(flags_t flags, fileid_t fileid, + offset_t *size, + object_flags_t *object_flags, + FileProvider *provider, + Resource **resource) { - /* 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. */ @@ -197,6 +154,26 @@ return L4_EOK; } +/* Make a resource of the appropriate type. */ + +long FileObjectRegistry::make_resource(flags_t flags, fileid_t fileid, + offset_t *size, + object_flags_t *object_flags, + Provider *provider, Resource **resource) +{ + DirectoryProvider *dp = dynamic_cast(provider); + + if (dp != NULL) + return make_directory_resource(fileid, size, object_flags, dp, resource); + + FileProvider *fp = dynamic_cast(provider); + + if (fp != NULL) + return make_file_resource(flags, fileid, size, object_flags, fp, resource); + + return -L4_EIO; +} + /* Return a resource for a filesystem object. */ @@ -208,8 +185,8 @@ { std::lock_guard guard(_lock); - /* Obtain an identifier for the file, even for new files (subject to use of - the appropriate flag). */ + /* Obtain an identifier for the object, even for new files (subject to use + of the appropriate flag). */ fileid_t fileid; long err = opening->get_fileid(path, flags, &fileid); @@ -217,14 +194,45 @@ if (err) return err; - /* Test for file and directory access. */ + /* Obtain a provider for the object. */ + + Provider *provider; + err = find_provider(fileid, &provider); + + /* Make a new provider if necessary. */ + + if (err == -L4_ENOENT) + err = make_provider(opening, path, flags, fileid, &provider); + + if (err) + return err; + + /* Make a resource for the provider. */ + + return make_resource(flags, fileid, size, object_flags, provider, resource); +} + + - if (opening->accessing_directory(path, flags, fileid)) - return get_directory(opening, path, flags, fileid, size, object_flags, resource); - else if (opening->accessing_file(path, flags, fileid)) - return get_file(opening, path, flags, fileid, size, object_flags, resource); - else - return -L4_EIO; +/* Obtain any active provider for the given 'fileid'. */ + +long FileObjectRegistry::find_provider(fileid_t fileid, Provider **provider) +{ + /* Obtain any registered provider. */ + + Accountable *accountable = get(fileid); + + if (accountable != NULL) + { + *provider = dynamic_cast(accountable); + + if ((*provider) != NULL) + return L4_EOK; + else + return -L4_EIO; + } + + return -L4_ENOENT; } // vim: tabstop=4 expandtab shiftwidth=4 diff -r c9eb29eecf69 -r 8bf9abc10ae7 libfsserver/lib/files/opener_resource.cc --- a/libfsserver/lib/files/opener_resource.cc Sat Oct 16 23:41:12 2021 +0200 +++ b/libfsserver/lib/files/opener_resource.cc Sun Oct 17 18:48:30 2021 +0200 @@ -78,7 +78,7 @@ long OpenerResource::notify_parent(const char *path) { - DirectoryProvider *provider; + Provider *provider; fileid_t fileid; long err; @@ -89,7 +89,7 @@ /* Obtain the provider of the parent directory. */ - err = _registry->find_directory_provider(fileid, &provider); + err = _registry->find_provider(fileid, &provider); if (err) return err;