1.1 --- a/libfsclient/include/fsclient/file.h Sat Aug 07 23:19:20 2021 +0200
1.2 +++ b/libfsclient/include/fsclient/file.h Sun Aug 08 23:12:34 2021 +0200
1.3 @@ -56,13 +56,9 @@
1.4
1.5 offset_t size;
1.6
1.7 - /* Arbitrary memory mapping support. */
1.8 -
1.9 - int can_mmap;
1.10 + /* Support for arbitrary memory mapping and explicit object size. */
1.11
1.12 - /* Explicit size support. */
1.13 -
1.14 - int has_size;
1.15 + object_flags_t object_flags;
1.16
1.17 /* Blocking accesses. */
1.18
2.1 --- a/libfsclient/lib/src/client.cc Sat Aug 07 23:19:20 2021 +0200
2.2 +++ b/libfsclient/lib/src/client.cc Sun Aug 08 23:12:34 2021 +0200
2.3 @@ -42,7 +42,7 @@
2.4 {
2.5 long err;
2.6
2.7 - if (file->can_mmap)
2.8 + if (file->object_flags & OBJECT_SUPPORTS_MMAP)
2.9 {
2.10 /* Where the position is outside the current region, re-map. */
2.11
2.12 @@ -147,7 +147,7 @@
2.13 {
2.14 if (file->memory == NULL)
2.15 {
2.16 - if (file->can_mmap)
2.17 + if (file->object_flags & OBJECT_SUPPORTS_MMAP)
2.18 return client_mmap(file, client_tell(file), count);
2.19 else if (pipe_current(file))
2.20 return NULL;
2.21 @@ -551,7 +551,7 @@
2.22
2.23 offset_t needed_size = file_data_current_position(file) + count;
2.24
2.25 - if (file->has_size)
2.26 + if (file->object_flags & OBJECT_HAS_SIZE)
2.27 {
2.28 if (file->size < needed_size)
2.29 {
3.1 --- a/libfsclient/lib/src/file.cc Sat Aug 07 23:19:20 2021 +0200
3.2 +++ b/libfsclient/lib/src/file.cc Sun Aug 08 23:12:34 2021 +0200
3.3 @@ -84,8 +84,7 @@
3.4 file->end_pos = 0;
3.5 file->data_end = 0;
3.6 file->data_current = 0;
3.7 - file->can_mmap = 1;
3.8 - file->has_size = 1;
3.9 + file->object_flags = 0;
3.10 file->can_block = 0;
3.11 file->notifications = 0;
3.12 }
3.13 @@ -173,7 +172,7 @@
3.14 {
3.15 client_OpenerContext openercontext(context->ref);
3.16 file_init(file);
3.17 - return openercontext.open(flags, &file->size, &file->ref);
3.18 + return openercontext.open(flags, &file->size, &file->ref, &file->object_flags);
3.19 }
3.20
3.21
3.22 @@ -223,7 +222,7 @@
3.23
3.24 long file_resize(file_t *file, offset_t size)
3.25 {
3.26 - if (!file->has_size)
3.27 + if (!file->object_flags & OBJECT_HAS_SIZE)
3.28 return -L4_EIO;
3.29
3.30 client_File _file(file->ref);
3.31 @@ -434,13 +433,6 @@
3.32 file_init(reader);
3.33 file_init(writer);
3.34
3.35 - /* Pipes can usually only be accessed via region navigation. */
3.36 -
3.37 - reader->can_mmap = 0;
3.38 - reader->has_size = 0;
3.39 - writer->can_mmap = 0;
3.40 - writer->has_size = 0;
3.41 -
3.42 long err = opener.pipe(size, &reader->ref, &writer->ref);
3.43 if (err)
3.44 return err;
4.1 --- a/libfsserver/include/fsserver/ext2_file_opener.h Sat Aug 07 23:19:20 2021 +0200
4.2 +++ b/libfsserver/include/fsserver/ext2_file_opener.h Sun Aug 08 23:12:34 2021 +0200
4.3 @@ -52,7 +52,9 @@
4.4
4.5 /* Convenience methods obtaining different pager types. */
4.6
4.7 - virtual long get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap);
4.8 + virtual long get_directory(const char *path, flags_t flags, fileid_t fileid,
4.9 + offset_t *size, l4_cap_idx_t *cap,
4.10 + object_flags_t *object_flags);
4.11
4.12 public:
4.13 explicit Ext2FileOpener(FilePaging *paging, Ext2FileOperations *ops, user_t user)
5.1 --- a/libfsserver/include/fsserver/host_file_opener.h Sat Aug 07 23:19:20 2021 +0200
5.2 +++ b/libfsserver/include/fsserver/host_file_opener.h Sun Aug 08 23:12:34 2021 +0200
5.3 @@ -56,7 +56,9 @@
5.4
5.5 /* Convenience methods obtaining different pager types. */
5.6
5.7 - virtual long get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap);
5.8 + virtual long get_directory(const char *path, flags_t flags, fileid_t fileid,
5.9 + offset_t *size, l4_cap_idx_t *cap,
5.10 + object_flags_t *object_flags);
5.11
5.12 public:
5.13 explicit HostFileOpener(FilePaging *paging)
6.1 --- a/libfsserver/include/fsserver/opener_context_resource.h Sat Aug 07 23:19:20 2021 +0200
6.2 +++ b/libfsserver/include/fsserver/opener_context_resource.h Sun Aug 08 23:12:34 2021 +0200
6.3 @@ -57,7 +57,8 @@
6.4
6.5 /* Opener context interface methods. */
6.6
6.7 - long open(flags_t flags, offset_t *size, l4_cap_idx_t *file);
6.8 + long open(flags_t flags, offset_t *size, l4_cap_idx_t *file,
6.9 + object_flags_t *object_flags);
6.10
6.11 /* Pager/dataspace methods. */
6.12
7.1 --- a/libfsserver/include/fsserver/opener_resource.h Sat Aug 07 23:19:20 2021 +0200
7.2 +++ b/libfsserver/include/fsserver/opener_resource.h Sun Aug 08 23:12:34 2021 +0200
7.3 @@ -44,9 +44,13 @@
7.4
7.5 /* Convenience methods obtaining different pager types. */
7.6
7.7 - virtual long get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap);
7.8 + virtual long get_directory(const char *path, flags_t flags, fileid_t fileid,
7.9 + offset_t *size, l4_cap_idx_t *cap,
7.10 + object_flags_t *object_flags);
7.11
7.12 - virtual long get_file(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap);
7.13 + virtual long get_file(const char *path, flags_t flags, fileid_t fileid,
7.14 + offset_t *size, l4_cap_idx_t *cap,
7.15 + object_flags_t *object_flags);
7.16
7.17 /* Preparation of resources for pagers. */
7.18
7.19 @@ -68,7 +72,8 @@
7.20
7.21 /* Direct access methods. */
7.22
7.23 - long open(const char *path, flags_t flags, offset_t *size, l4_cap_idx_t *cap);
7.24 + long open(const char *path, flags_t flags, offset_t *size,
7.25 + l4_cap_idx_t *cap, object_flags_t *object_flags);
7.26
7.27 /* Opener interface methods. */
7.28
8.1 --- a/libfsserver/lib/files/ext2_file_opener.cc Sat Aug 07 23:19:20 2021 +0200
8.2 +++ b/libfsserver/lib/files/ext2_file_opener.cc Sun Aug 08 23:12:34 2021 +0200
8.3 @@ -118,8 +118,12 @@
8.4
8.5 // NOTE: This is mostly the same as the HostFileOpener implementation.
8.6
8.7 -long Ext2FileOpener::get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap)
8.8 +long Ext2FileOpener::get_directory(const char *path, flags_t flags,
8.9 + fileid_t fileid, offset_t *size,
8.10 + l4_cap_idx_t *cap, object_flags_t *object_flags)
8.11 {
8.12 + /* The file identifier is used to obtain the directory. */
8.13 +
8.14 (void) path; (void) flags;
8.15
8.16 file_t *reader, *writer;
8.17 @@ -134,6 +138,7 @@
8.18
8.19 *size = reader->size;
8.20 *cap = reader->ref;
8.21 + *object_flags = 0; /* does not support mmap, has no fixed size */
8.22
8.23 /* Spawn a independent thread for reading the directory details and writing
8.24 them to the pipe. */
9.1 --- a/libfsserver/lib/files/host_file_opener.cc Sat Aug 07 23:19:20 2021 +0200
9.2 +++ b/libfsserver/lib/files/host_file_opener.cc Sun Aug 08 23:12:34 2021 +0200
9.3 @@ -91,8 +91,14 @@
9.4 return (st.st_mode & S_IFREG) ? true : false;
9.5 }
9.6
9.7 -long HostFileOpener::get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap)
9.8 +long HostFileOpener::get_directory(const char *path, flags_t flags,
9.9 + fileid_t fileid, offset_t *size,
9.10 + l4_cap_idx_t *cap, object_flags_t *object_flags)
9.11 {
9.12 + /* The path is used to obtain the directory. */
9.13 +
9.14 + (void) flags; (void) fileid;
9.15 +
9.16 file_t *reader, *writer;
9.17
9.18 // NOTE: Might be more appropriate to use lower-level file operations to
9.19 @@ -105,6 +111,7 @@
9.20
9.21 *size = reader->size;
9.22 *cap = reader->ref;
9.23 + *object_flags = 0; /* does not support mmap, has no fixed size */
9.24
9.25 /* Discard the reader structure but preserve the capability. */
9.26
10.1 --- a/libfsserver/lib/files/opener_context_resource.cc Sat Aug 07 23:19:20 2021 +0200
10.2 +++ b/libfsserver/lib/files/opener_context_resource.cc Sun Aug 08 23:12:34 2021 +0200
10.3 @@ -67,21 +67,22 @@
10.4
10.5 /* Opener context interface methods. */
10.6
10.7 -long OpenerContextResource::open(flags_t flags, offset_t *size, l4_cap_idx_t *file)
10.8 +long OpenerContextResource::open(flags_t flags, offset_t *size,
10.9 + l4_cap_idx_t *file, object_flags_t *object_flags)
10.10 {
10.11 char *path = get_path();
10.12
10.13 if (path == NULL)
10.14 return -L4_EINVAL;
10.15
10.16 - long err = _opener->open(path, flags, size, file);
10.17 + long err = _opener->open(path, flags, size, file, object_flags);
10.18
10.19 /* Handle propagated capabilities. By indicating the special status, the
10.20 operation is first completed and then the capability is discarded. */
10.21
10.22 if (err == IPC_MESSAGE_SENT)
10.23 {
10.24 - complete_OpenerContext_open(*size, *file);
10.25 + complete_OpenerContext_open(*size, *file, *object_flags);
10.26 ipc_cap_free_um(*file);
10.27 return IPC_MESSAGE_SENT;
10.28 }
11.1 --- a/libfsserver/lib/files/opener_resource.cc Sat Aug 07 23:19:20 2021 +0200
11.2 +++ b/libfsserver/lib/files/opener_resource.cc Sun Aug 08 23:12:34 2021 +0200
11.3 @@ -48,7 +48,8 @@
11.4
11.5 /* Return a pager object for the given path and flags. */
11.6
11.7 -long OpenerResource::open(const char *path, flags_t flags, offset_t *size, l4_cap_idx_t *cap)
11.8 +long OpenerResource::open(const char *path, flags_t flags, offset_t *size,
11.9 + l4_cap_idx_t *cap, object_flags_t *object_flags)
11.10 {
11.11 /* Obtain an identifier for the file, even for new files. */
11.12
11.13 @@ -61,9 +62,9 @@
11.14 /* Test for file and directory access. */
11.15
11.16 if (accessing_directory(path, flags, fileid))
11.17 - return get_directory(path, flags, fileid, size, cap);
11.18 + return get_directory(path, flags, fileid, size, cap, object_flags);
11.19 else if (accessing_file(path, flags, fileid))
11.20 - return get_file(path, flags, fileid, size, cap);
11.21 + return get_file(path, flags, fileid, size, cap, object_flags);
11.22 else
11.23 return -L4_EIO;
11.24 }
11.25 @@ -72,15 +73,19 @@
11.26
11.27 /* Return a directory pager. */
11.28
11.29 -long OpenerResource::get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap)
11.30 +long OpenerResource::get_directory(const char *path, flags_t flags,
11.31 + fileid_t fileid, offset_t *size,
11.32 + l4_cap_idx_t *cap, object_flags_t *object_flags)
11.33 {
11.34 - (void) path; (void) flags; (void) fileid; (void) size; (void) cap;
11.35 + (void) path; (void) flags; (void) fileid; (void) size; (void) cap; (void) object_flags;
11.36 return -L4_EIO;
11.37 }
11.38
11.39 /* Return a file pager. */
11.40
11.41 -long OpenerResource::get_file(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap)
11.42 +long OpenerResource::get_file(const char *path, flags_t flags, fileid_t fileid,
11.43 + offset_t *size, l4_cap_idx_t *cap,
11.44 + object_flags_t *object_flags)
11.45 {
11.46 Pager *pager;
11.47 long err = _paging->get_pager(this, path, flags, fileid, &pager);
11.48 @@ -88,6 +93,8 @@
11.49 if (err)
11.50 return err;
11.51
11.52 + *object_flags = OBJECT_SUPPORTS_MMAP | OBJECT_HAS_SIZE;
11.53 +
11.54 return resource_for_pager(pager, size, cap);
11.55 }
11.56
12.1 --- a/tests/dstest_file_readdir.cc Sat Aug 07 23:19:20 2021 +0200
12.2 +++ b/tests/dstest_file_readdir.cc Sun Aug 08 23:12:34 2021 +0200
12.3 @@ -109,12 +109,6 @@
12.4
12.5 static long open_directory(file_t *file)
12.6 {
12.7 - // NOTE: To be replaced by a proper mechanism identifying the nature of each
12.8 - // NOTE: obtained object.
12.9 -
12.10 - file->can_mmap = 0;
12.11 - file->has_size = 0;
12.12 -
12.13 /* Register the reader for notification. */
12.14
12.15 return client_set_blocking(file, NOTIFY_CONTENT_AVAILABLE | NOTIFY_PEER_CLOSED);