2
0
Fork 0

cached_fs_rom: do not change dir for "/nix/store/…" ROMs

This commit is contained in:
Ehmry - 2020-11-05 21:34:32 +01:00
parent 0aba8e75bc
commit dd24e9bdca
2 changed files with 59 additions and 50 deletions

View File

@ -12,44 +12,6 @@ let TextMapType = Prelude.Map.Type Text
let Manifest/Type = TextMapType (TextMapType Text) let Manifest/Type = TextMapType (TextMapType Text)
let storeServiceRoute =
{ service =
{ name = "ROM", label = Init.LabelSelector.prefix "/nix/store/" }
, route =
Init.Route.Type.Parent
{ prefix = Some "", suffix = None Text, diag = Some True }
}
let withStoreRoute =
λ(attrs : Child.Attributes.Type) →
attrs
with routes = attrs.routes # [ storeServiceRoute ]
let Child/withStoreRoutes
: Child.Type → Child.Type
= λ(child : Child.Type) →
child
Child.Type
{ flat =
λ(attrs : Child.Attributes.Type) →
Child.flat (withStoreRoute attrs)
, nested =
λ(children : Prelude.Map.Type Text Child.Type) →
λ(attrs : Child.Attributes.Type) →
Child.nested children (withStoreRoute attrs)
}
let Init/withStoreRoutes =
λ(init : Init.Type) →
init
with children =
Prelude.Map.map
Text
Child.Type
Child.Type
Child/withStoreRoutes
init.children
in λ(subinit : Init.Type) → in λ(subinit : Init.Type) →
λ(storeName : Text) → λ(storeName : Text) →
λ(storeSize : Natural) → λ(storeSize : Natural) →
@ -168,7 +130,7 @@ in λ(subinit : Init.Type) →
, child , child
"nixos" "nixos"
( Init.toChild ( Init.toChild
(Init/withStoreRoutes subinit) subinit
Init.Attributes::{ Init.Attributes::{
, exitPropagate = True , exitPropagate = True
, resources = Init.Resources::{ , resources = Init.Resources::{

View File

@ -1,7 +1,7 @@
From 3ff27b172afd3ee436f9cce754c15d5913f0cb86 Mon Sep 17 00:00:00 2001 From e65583c3e9cf0e9c326bb2d414d40fa32f64f9c6 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net> From: Emery Hemingway <ehmry@posteo.net>
Date: Tue, 3 Nov 2020 15:28:56 +0100 Date: Tue, 3 Nov 2020 15:28:56 +0100
Subject: [PATCH 1/2] cached_fs_rom: resolve symlinks Subject: [PATCH 1/3] cached_fs_rom: resolve symlinks
Follow symlinks from ROM requests to files. This complicates the Follow symlinks from ROM requests to files. This complicates the
implementation but allows ROM requests to be redirected at both the implementation but allows ROM requests to be redirected at both the
@ -9,11 +9,11 @@ label routing and the file-system layers. Redirecting ROMs with symlinks
is useful for retrieving ROMs from deeply nested or otherwise is useful for retrieving ROMs from deeply nested or otherwise
excessively long file-system paths. excessively long file-system paths.
--- ---
repos/os/src/server/cached_fs_rom/main.cc | 469 +++++++++++++--------- repos/os/src/server/cached_fs_rom/main.cc | 472 +++++++++++++---------
1 file changed, 278 insertions(+), 191 deletions(-) 1 file changed, 281 insertions(+), 191 deletions(-)
diff --git a/repos/os/src/server/cached_fs_rom/main.cc b/repos/os/src/server/cached_fs_rom/main.cc diff --git a/repos/os/src/server/cached_fs_rom/main.cc b/repos/os/src/server/cached_fs_rom/main.cc
index 9e4e4d0eee..5f2aea63f5 100755 index 9e4e4d0eee..bac2c075a9 100755
--- a/repos/os/src/server/cached_fs_rom/main.cc --- a/repos/os/src/server/cached_fs_rom/main.cc
+++ b/repos/os/src/server/cached_fs_rom/main.cc +++ b/repos/os/src/server/cached_fs_rom/main.cc
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
@ -534,7 +534,7 @@ index 9e4e4d0eee..5f2aea63f5 100755
catch (Permission_denied) { error(file_path, ": permission denied"); } catch (Permission_denied) { error(file_path, ": permission denied"); }
catch (...) { error(file_path, ": unhandled error"); } catch (...) { error(file_path, ": unhandled error"); }
throw Service_denied(); throw Service_denied();
@@ -364,55 +444,55 @@ struct Cached_fs_rom::Main final : Genode::Session_request_handler @@ -364,55 +444,58 @@ struct Cached_fs_rom::Main final : Genode::Session_request_handler
** Find ROM in cache ** ** Find ROM in cache **
***********************/ ***********************/
@ -592,6 +592,9 @@ index 9e4e4d0eee..5f2aea63f5 100755
+ +
+ if (pending) /* wait until transfer completes */ + if (pending) /* wait until transfer completes */
+ return; + return;
+
+ if (diag)
+ log("lookup \"", path, "\" for \"", label, "\"");
+ /* initiate new transfer or throw Service_denied */ + /* initiate new transfer or throw Service_denied */
+ try_transfer(path, [&] () { + try_transfer(path, [&] () {
@ -619,7 +622,7 @@ index 9e4e4d0eee..5f2aea63f5 100755
void handle_session_close(Parent::Server::Id pid) override void handle_session_close(Parent::Server::Id pid) override
{ {
Session_space::Id id { pid.value }; Session_space::Id id { pid.value };
@@ -425,6 +505,9 @@ struct Cached_fs_rom::Main final : Genode::Session_request_handler @@ -425,6 +508,9 @@ struct Cached_fs_rom::Main final : Genode::Session_request_handler
}); });
} }
@ -629,7 +632,7 @@ index 9e4e4d0eee..5f2aea63f5 100755
void handle_packets() void handle_packets()
{ {
Tx_source &source = *fs.tx(); Tx_source &source = *fs.tx();
@@ -439,12 +522,16 @@ struct Cached_fs_rom::Main final : Genode::Session_request_handler @@ -439,12 +525,16 @@ struct Cached_fs_rom::Main final : Genode::Session_request_handler
transfers.apply<Transfer&>( transfers.apply<Transfer&>(
Transfer_space::Id{pkt.handle().value}, [&] (Transfer &transfer) Transfer_space::Id{pkt.handle().value}, [&] (Transfer &transfer)
{ {
@ -654,10 +657,10 @@ index 9e4e4d0eee..5f2aea63f5 100755
2.28.0 2.28.0
From 4bff3638684e807a79a24e81bf59913849c9c100 Mon Sep 17 00:00:00 2001 From 8e994fdb882071d224b1bb2b6efc711571b523f0 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net> From: Emery Hemingway <ehmry@posteo.net>
Date: Tue, 3 Nov 2020 17:37:50 +0100 Date: Tue, 3 Nov 2020 17:37:50 +0100
Subject: [PATCH 2/2] cached_fs_rom: add directory session policy Subject: [PATCH 2/3] cached_fs_rom: add directory session policy
Support for directing ROM requests into directories by policy. Support for directing ROM requests into directories by policy.
--- ---
@ -686,7 +689,7 @@ index 0000000000..855c20ba7c
+! <default-policy directory="rom/bin" /> +! <default-policy directory="rom/bin" />
+! </config> +! </config>
diff --git a/repos/os/src/server/cached_fs_rom/main.cc b/repos/os/src/server/cached_fs_rom/main.cc diff --git a/repos/os/src/server/cached_fs_rom/main.cc b/repos/os/src/server/cached_fs_rom/main.cc
index 5f2aea63f5..59dc2c7d98 100755 index bac2c075a9..8df3001111 100755
--- a/repos/os/src/server/cached_fs_rom/main.cc --- a/repos/os/src/server/cached_fs_rom/main.cc
+++ b/repos/os/src/server/cached_fs_rom/main.cc +++ b/repos/os/src/server/cached_fs_rom/main.cc
@@ -13,6 +13,7 @@ @@ -13,6 +13,7 @@
@ -734,3 +737,47 @@ index 5f2aea63f5..59dc2c7d98 100755
-- --
2.28.0 2.28.0
From c98ba6fd70938804833e5c65a18d01c60f5be17f Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Thu, 5 Nov 2020 21:22:31 +0100
Subject: [PATCH 3/3] cached_fs_rom: do not apply directory for absolute ROMs
If the ROM name starts with / then do not apply a directory policy.
---
repos/os/src/server/cached_fs_rom/main.cc | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/repos/os/src/server/cached_fs_rom/main.cc b/repos/os/src/server/cached_fs_rom/main.cc
index 8df3001111..4479b41e87 100755
--- a/repos/os/src/server/cached_fs_rom/main.cc
+++ b/repos/os/src/server/cached_fs_rom/main.cc
@@ -450,17 +450,18 @@ struct Cached_fs_rom::Main final : Genode::Session_request_handler
** Find ROM in cache **
***********************/
+ Path path;
- Path path("/");
- Session_label const label = label_from_args(args.string());
+ auto const label = label_from_args(args.string());
+ auto const rom_name = label.last_element();
try {
Session_policy policy(label, config_rom.xml());
- path.append(policy.attribute_value(
- "directory", String<Path::capacity()>("/")).string());
- } catch (Service_denied) { }
-
- path.append_element(label.last_element().string());
+ auto dir = policy.attribute_value("directory", String<Path::capacity()>("/"));
+ path = Path(rom_name.string(), dir.string());
+ } catch (Service_denied) {
+ path = Path(rom_name.string());
+ }
bool diag = session_diag_from_args(args.string()).enabled;
--
2.28.0