driver manager: policy for 'default' block device

If only a single AHCI device is present, the block service provided by
the drivers subsystem allows the client to refer to this block device
via the label 'default'.

Issue #2676
This commit is contained in:
Norman Feske 2018-02-13 20:02:15 +01:00
parent 69ac68ca98
commit 5d9eb55274

View File

@ -216,7 +216,7 @@ struct Driver_manager::Ahci_driver : Device_driver
xml.node("report", [&] () { xml.attribute("ports", "yes"); });
for (unsigned i = 0; i < 6; i++) {
xml.node("policy", [&] () {
xml.attribute("label_suffix", String<64>(" ahci-", i));
xml.attribute("label_suffix", String<64>("ahci-", i));
xml.attribute("device", i);
xml.attribute("writeable", "yes");
});
@ -232,13 +232,25 @@ struct Driver_manager::Ahci_driver : Device_driver
});
}
void generate_block_service_forwarding_policy(Xml_generator &xml) const
typedef String<32> Default_label;
void gen_service_forwarding_policy(Xml_generator &xml,
Default_label const &default_label) const
{
for (unsigned i = 0; i < 6; i++) {
xml.node("policy", [&] () {
xml.attribute("label_suffix", String<64>(" ahci-", i));
xml.attribute("label_suffix", String<64>("ahci-", i));
xml.node("child", [&] () {
xml.attribute("name", "ahci_drv"); });
});
}
if (default_label.valid()) {
xml.node("policy", [&] () {
xml.attribute("label_suffix", " default");
xml.node("child", [&] () {
xml.attribute("name", "ahci_drv");
xml.attribute("label", default_label);
});
});
}
@ -297,6 +309,8 @@ struct Driver_manager::Main : Block_devices_generator
void _generate_usb_drv_config (Reporter &, Xml_node) const;
void _generate_block_devices (Reporter &) const;
Ahci_driver::Default_label _default_block_device() const;
/**
* Block_devices_generator interface
*/
@ -390,6 +404,9 @@ void Driver_manager::Main::_handle_ahci_ports_update()
{
_ahci_ports.update();
_generate_block_devices(_block_devices);
/* update service forwarding rules */
_generate_init_config(_init_config);
}
@ -438,19 +455,46 @@ void Driver_manager::Main::_generate_init_config(Reporter &init_config) const
_ahci_driver->generate_start_node(xml);
/* block-service forwarding rules */
xml.node("service", [&] () {
xml.attribute("name", Block::Session::service_name());
if (_ahci_driver.constructed())
_ahci_driver->generate_block_service_forwarding_policy(xml);
});
if (_ahci_driver.constructed() && _ahci_ports.xml().has_sub_node("port")) {
xml.node("service", [&] () {
xml.attribute("name", Block::Session::service_name());
_ahci_driver->gen_service_forwarding_policy(xml, _default_block_device());
});
}
});
}
Driver_manager::Ahci_driver::Default_label
Driver_manager::Main::_default_block_device() const
{
unsigned num_devices = 0;
Ahci_driver::Default_label result;
_ahci_ports.xml().for_each_sub_node([&] (Xml_node ahci_port) {
/* count devices */
num_devices++;
unsigned long const num = ahci_port.attribute_value("num", 0UL);
result = Ahci_driver::Default_label("ahci-", num);
});
/* if there is more than one device, we don't return a default device */
return (num_devices == 1) ? result : Ahci_driver::Default_label();
}
void Driver_manager::Main::_generate_block_devices(Reporter &block_devices) const
{
Reporter::Xml_generator xml(block_devices, [&] () {
/* mention default block device in 'default' attribute */
Ahci_driver::Default_label const default_label = _default_block_device();
if (default_label.valid())
xml.attribute("default", default_label);
_ahci_ports.xml().for_each_sub_node([&] (Xml_node ahci_port) {
xml.node("device", [&] () {