# HG changeset patch # User Paul Boddie # Date 1628119721 -7200 # Node ID 4b4500850cce84c2bce1accc68b1574155a3db18 # Parent 0bf39e6d7142b7d97711f4007fb1acb97f696c19 Changed pipe initialisation to ensure region availability. diff -r 0bf39e6d7142 -r 4b4500850cce libfsclient/lib/src/file.cc --- a/libfsclient/lib/src/file.cc Wed Aug 04 17:30:14 2021 +0200 +++ b/libfsclient/lib/src/file.cc Thu Aug 05 01:28:41 2021 +0200 @@ -445,7 +445,9 @@ if (err) return err; - err = pipe_next(writer) || pipe_next(reader); + /* Obtain current region details. */ + + err = pipe_current(writer) || pipe_current(reader); if (err) { diff -r 0bf39e6d7142 -r 4b4500850cce libfsserver/lib/pipes/pipe_opener_resource.cc --- a/libfsserver/lib/pipes/pipe_opener_resource.cc Wed Aug 04 17:30:14 2021 +0200 +++ b/libfsserver/lib/pipes/pipe_opener_resource.cc Thu Aug 05 01:28:41 2021 +0200 @@ -19,6 +19,8 @@ * Boston, MA 02110-1301, USA */ +#include + #include "pipe_opener_resource.h" #include "pipe_opener_server.h" #include "pipe_pager.h" @@ -55,11 +57,24 @@ /* Each endpoint will have its own pager. */ - /* NOTE: Failure to open an endpoint should invalidate both, plus the - paging object. Also, any active server thread would need to be - cancelled. */ + long err = open_endpoint(paging, true, writer); + + if (err) + return err; + + err = open_endpoint(paging, false, reader); - return open_endpoint(paging, false, reader) || open_endpoint(paging, true, writer); + /* Failure to open an endpoint should invalidate both, plus the paging + object. Also, any active server thread would need to be cancelled. The + freeing of the writer capability attempts to do this. */ + + if (err) + { + ipc_cap_free_um(*writer); + return err; + } + + return L4_EOK; } /* Start the endpoint server in a new thread. If the thread does not start, the @@ -69,6 +84,14 @@ { PipePager *pager = new PipePager(paging, writing); + /* Initialise the first region. */ + + offset_t populated_size, region_size; + long err = pager->next_region(&populated_size, ®ion_size); + + if (err) + return err; + return ResourceServer(pager).start_thread(endpoint); }