1.1 --- a/libfsserver/lib/files/file_pager.cc Sun May 29 00:58:31 2022 +0200
1.2 +++ b/libfsserver/lib/files/file_pager.cc Mon May 30 00:47:07 2022 +0200
1.3 @@ -19,18 +19,22 @@
1.4 * Boston, MA 02110-1301, USA
1.5 */
1.6
1.7 +#include <fsclient/file.h> /* file_region_flags */
1.8 +#include <systypes/fcntl.h>
1.9 +
1.10 +#include "copied_page_mapper.h"
1.11 #include "file_pager.h"
1.12 #include "mapped_file_object_server.h"
1.13
1.14
1.15
1.16 /* Initialise a pager for a file with a unique file identifier, file provider,
1.17 - mapping flags and a file registry. The provider offers a shared page mapper
1.18 + opening flags and a file registry. The provider offers a shared page mapper
1.19 for moderating access to loaded pages. */
1.20
1.21 -FilePager::FilePager(fileid_t fileid, FileProvider *provider, map_flags_t flags)
1.22 -: Pager(provider->mapper(), flags),
1.23 - _provider(provider), fileid(fileid)
1.24 +FilePager::FilePager(fileid_t fileid, FileProvider *provider, flags_t flags)
1.25 +: Pager(provider->mapper(), file_region_flags(flags)),
1.26 + _provider(provider), _flags(flags), fileid(fileid)
1.27 {
1.28 }
1.29
1.30 @@ -96,17 +100,37 @@
1.31 {
1.32 /* Set the limits of the paged region. */
1.33
1.34 - return Pager::mmap(position, length, start_visible, end_visible, start_pos,
1.35 - end_pos, size);
1.36 + long err = Pager::mmap(position, length, start_visible, end_visible, start_pos,
1.37 + end_pos, size);
1.38 +
1.39 + if (err)
1.40 + return err;
1.41 +
1.42 + /* Impose copy-on-write semantics where appropriate. */
1.43 +
1.44 + if ((_mapper != _mapper_copied) && copy_on_write())
1.45 + {
1.46 + _mapper_copied = new CopiedPageMapper(_mapper);
1.47 + _mapper = _mapper_copied;
1.48 + }
1.49 +
1.50 + return L4_EOK;
1.51 +}
1.52 +
1.53 +/* Return whether the pager should employ copy-on-write semantics. */
1.54 +
1.55 +bool FilePager::copy_on_write()
1.56 +{
1.57 + return (_flags == O_RDONLY) && (_map_flags & L4RE_DS_F_W);
1.58 }
1.59
1.60
1.61
1.62 /* Generic pager operations. */
1.63
1.64 -long FilePager::map(offset_t offset, address_t hot_spot, map_flags_t flags, l4_snd_fpage_t *region)
1.65 +long FilePager::map(offset_t offset, address_t hot_spot, map_flags_t map_flags, l4_snd_fpage_t *region)
1.66 {
1.67 - return Pager::map(offset, hot_spot, flags, region);
1.68 + return Pager::map(offset, hot_spot, map_flags, region);
1.69 }
1.70
1.71