# HG changeset patch # User Paul Boddie # Date 1654617628 -7200 # Node ID c9db9e4c9f4044afc78a59d7c9b0ec8034c16f55 # Parent 04881b15def85420412ee2e6293230d89a2938fe Introduced file_mmap_only which does not map a memory region in the task. diff -r 04881b15def8 -r c9db9e4c9f40 libfsclient/include/fsclient/file.h --- a/libfsclient/include/fsclient/file.h Tue Jun 07 01:14:05 2022 +0200 +++ b/libfsclient/include/fsclient/file.h Tue Jun 07 18:00:28 2022 +0200 @@ -112,6 +112,8 @@ long file_mmap(file_t *file, offset_t position, offset_t length, offset_t start_visible, offset_t end_visible, l4re_rm_flags_t region_flags); +long file_mmap_only(file_t *file, offset_t position, offset_t length, + offset_t start_visible, offset_t end_visible); flags_t file_opening_flags(l4re_rm_flags_t rm_flags); l4re_rm_flags_t file_region_flags(flags_t flags); long file_resize(file_t *file, offset_t size); diff -r 04881b15def8 -r c9db9e4c9f40 libfsclient/lib/src/file.cc --- a/libfsclient/lib/src/file.cc Tue Jun 07 01:14:05 2022 +0200 +++ b/libfsclient/lib/src/file.cc Tue Jun 07 18:00:28 2022 +0200 @@ -356,15 +356,11 @@ l4re_rm_flags_t region_flags) { char *memory = file->memory; - client_MappedFile mapped_file(file->ref); - long err = mapped_file.mmap(position, length, start_visible, end_visible, - &file->start_pos, &file->end_pos, &file->size); + long err = file_mmap_only(file, position, length, start_visible, end_visible); if (err) return err; - _update_extent(file); - err = ipc_attach_dataspace_align(file->ref, file_span(file), L4RE_RM_F_SEARCH_ADDR | region_flags, L4_PAGESHIFT, @@ -378,6 +374,24 @@ return L4_EOK; } +/* Request access to a region of the given file, obtaining an updated file size + and populated data details. The region is not mapped, however. */ + +long file_mmap_only(file_t *file, offset_t position, offset_t length, + offset_t start_visible, offset_t end_visible) +{ + client_MappedFile mapped_file(file->ref); + long err = mapped_file.mmap(position, length, start_visible, end_visible, + &file->start_pos, &file->end_pos, &file->size); + + if (err) + return err; + + _update_extent(file); + + return L4_EOK; +} + /* Return opening flags compatible with the given region flags. */ flags_t file_opening_flags(l4re_rm_flags_t rm_flags) diff -r 04881b15def8 -r c9db9e4c9f40 tests/Makefile --- a/tests/Makefile Tue Jun 07 01:14:05 2022 +0200 +++ b/tests/Makefile Tue Jun 07 18:00:28 2022 +0200 @@ -30,7 +30,7 @@ # Individual interfaces. -CLIENT_INTERFACES_CC = dataspace mapped_file +CLIENT_INTERFACES_CC = dataspace # Generated and plain source files. diff -r 04881b15def8 -r c9db9e4c9f40 tests/dstest_file_mapping.cc --- a/tests/dstest_file_mapping.cc Tue Jun 07 01:14:05 2022 +0200 +++ b/tests/dstest_file_mapping.cc Tue Jun 07 18:00:28 2022 +0200 @@ -32,29 +32,6 @@ #include #include "dataspace_client.h" -#include "mapped_file_client.h" - - - -/* NOTE: Copied from libfsclient. */ - -static void _update_extent(file_t *file) -{ - /* Handle files ending after or within the region. */ - - if (file->size > file->start_pos) - { - if (file->size > file->end_pos) - file->data_end = file->end_pos - file->start_pos; - else - file->data_end = file->size - file->start_pos; - } - - /* Handle files ending before the region. */ - - else - file->data_end = 0; -} @@ -91,11 +68,9 @@ return 1; } - /* A region of the file is mapped. */ + /* A region of the file is mapped but not attached. */ - client_MappedFile mapped_file(file.ref); - - err = mapped_file.mmap(0, page(10), 0, 0, &file.start_pos, &file.end_pos, &file.size); + err = file_mmap_only(&file, 0, page(10), 0, 0); if (err) { @@ -106,7 +81,6 @@ /* Fix up the file data structure manually. */ file.memory = (char *) 0x2000000; - _update_extent(&file); /* Explicitly map the file into this address space, without region mapper usage. The receive window base must be a multiple of its size. */