# HG changeset patch # User Paul Boddie # Date 1627941943 -7200 # Node ID 3b44f61b63035e955b654bc04ef201818fc65045 # Parent d29545453b6a0bdf6fae0fdf71b5205c23d2d44f Made the opener resource responsible for creating new resource servers instead of returning pagers for the context to wrap up in servers whose references are then returned. diff -r d29545453b6a -r 3b44f61b6303 libfsserver/include/fsserver/opener_resource.h --- a/libfsserver/include/fsserver/opener_resource.h Mon Aug 02 19:39:10 2021 +0200 +++ b/libfsserver/include/fsserver/opener_resource.h Tue Aug 03 00:05:43 2021 +0200 @@ -44,9 +44,13 @@ /* Convenience methods obtaining different pager types. */ - virtual long get_directory(const char *path, flags_t flags, fileid_t fileid, Pager **pager); + virtual long get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap); + + virtual long get_file(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap); - virtual long get_file(const char *path, flags_t flags, fileid_t fileid, Pager **pager); + /* Preparation of resources for pagers. */ + + long resource_for_pager(Pager *pager, offset_t *size, l4_cap_idx_t *cap); public: explicit OpenerResource(FilePaging *paging); @@ -64,7 +68,7 @@ /* Direct access methods. */ - long open(const char *path, flags_t flags, Pager **pager); + long open(const char *path, flags_t flags, offset_t *size, l4_cap_idx_t *cap); /* Opener interface methods. */ diff -r d29545453b6a -r 3b44f61b6303 libfsserver/lib/files/opener_context_resource.cc --- a/libfsserver/lib/files/opener_context_resource.cc Mon Aug 02 19:39:10 2021 +0200 +++ b/libfsserver/lib/files/opener_context_resource.cc Tue Aug 03 00:05:43 2021 +0200 @@ -22,7 +22,6 @@ #include "opener_context_resource.h" #include "opener_context_object_server.h" #include "opener_resource.h" -#include "resource_server.h" #include @@ -73,19 +72,7 @@ if (path == NULL) return -L4_EINVAL; - Pager *pager; - long err = _opener->open(path, flags, &pager); - - if (err) - return err; - - *size = pager->get_data_size(); - - /* Complete the initialisation and start a server in a new thread. - If the thread does not start, the resource (including pager) will be - finalised. */ - - return ResourceServer(pager).start_thread(file); + return _opener->open(path, flags, size, file); } // vim: tabstop=4 expandtab shiftwidth=4 diff -r d29545453b6a -r 3b44f61b6303 libfsserver/lib/files/opener_resource.cc --- a/libfsserver/lib/files/opener_resource.cc Mon Aug 02 19:39:10 2021 +0200 +++ b/libfsserver/lib/files/opener_resource.cc Tue Aug 03 00:05:43 2021 +0200 @@ -48,7 +48,7 @@ /* Return a pager object for the given path and flags. */ -long OpenerResource::open(const char *path, flags_t flags, Pager **pager) +long OpenerResource::open(const char *path, flags_t flags, offset_t *size, l4_cap_idx_t *cap) { /* Obtain an identifier for the file, even for new files. */ @@ -61,9 +61,9 @@ /* Test for file and directory access. */ if (accessing_directory(path, flags, fileid)) - return get_directory(path, flags, fileid, pager); + return get_directory(path, flags, fileid, size, cap); else if (accessing_file(path, flags, fileid)) - return get_file(path, flags, fileid, pager); + return get_file(path, flags, fileid, size, cap); else return -L4_EIO; } @@ -72,17 +72,36 @@ /* Return a directory pager. */ -long OpenerResource::get_directory(const char *path, flags_t flags, fileid_t fileid, Pager **pager) +long OpenerResource::get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap) { - (void) path; (void) flags; (void) fileid; *pager = NULL; + (void) path; (void) flags; (void) fileid; (void) size; (void) cap; return -L4_EIO; } /* Return a file pager. */ -long OpenerResource::get_file(const char *path, flags_t flags, fileid_t fileid, Pager **pager) +long OpenerResource::get_file(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap) { - return _paging->get_pager(this, path, flags, fileid, pager); + Pager *pager; + long err = _paging->get_pager(this, path, flags, fileid, &pager); + + if (err) + return err; + + return resource_for_pager(pager, size, cap); +} + +/* Return pager resource details. */ + +long OpenerResource::resource_for_pager(Pager *pager, offset_t *size, l4_cap_idx_t *cap) +{ + *size = pager->get_data_size(); + + /* Complete the initialisation and start a server in a new thread. + If the thread does not start, the resource (including pager) will be + finalised. */ + + return ResourceServer(pager).start_thread(cap); }