From 50d73e7890af4bb6760fafec8706c2f4795a8d82 Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Fri, 22 Nov 2013 13:55:05 +0100 Subject: [PATCH] block_session: extend interface with sync() call To support components, which implement the block session's server side rpc object, and which doesn't write data to their device backend immediately, an additional synchronization call is needed. Thereby, clients like for instance a file system can tell these components, when a synchronization is required. Ref #113 --- dde_linux/src/lib/usb/include/storage/component.h | 2 ++ gems/src/server/http_block/main.cc | 2 ++ os/include/block/component.h | 2 ++ os/include/block/driver.h | 5 +++++ os/include/block_session/block_session.h | 8 +++++++- os/include/block_session/client.h | 1 + os/src/drivers/ahci/include/ahci_driver_base.h | 2 ++ os/src/drivers/atapi/main.cc | 2 ++ os/src/drivers/sd_card/exynos5/driver.h | 2 ++ os/src/drivers/sd_card/omap4/driver.h | 2 ++ os/src/drivers/sd_card/pl180/sd_card.h | 2 ++ os/src/server/part_blk/back_end.cc | 2 +- os/src/server/part_blk/main.cc | 2 ++ os/src/server/part_blk/part_blk.h | 5 +++++ os/src/server/rom_loopdev/main.cc | 2 ++ os/src/test/fb_block_adapter/main.cc | 2 ++ 16 files changed, 41 insertions(+), 2 deletions(-) diff --git a/dde_linux/src/lib/usb/include/storage/component.h b/dde_linux/src/lib/usb/include/storage/component.h index 14abd8490..e25e7e704 100644 --- a/dde_linux/src/lib/usb/include/storage/component.h +++ b/dde_linux/src/lib/usb/include/storage/component.h @@ -92,6 +92,8 @@ namespace Block { ops->set_operation(Packet_descriptor::WRITE); } + void sync() {} + void complete(Packet_descriptor &packet, bool success) { packet.succeeded(success); diff --git a/gems/src/server/http_block/main.cc b/gems/src/server/http_block/main.cc index 6b851ace5..ccffbb57a 100644 --- a/gems/src/server/http_block/main.cc +++ b/gems/src/server/http_block/main.cc @@ -178,6 +178,8 @@ namespace Block { ops->set_operation(Packet_descriptor::READ); } + void sync() {} + /** * Signal indicating that transmit thread is ready */ diff --git a/os/include/block/component.h b/os/include/block/component.h index b383870dc..e3611f1b7 100644 --- a/os/include/block/component.h +++ b/os/include/block/component.h @@ -142,6 +142,8 @@ namespace Block { ops->set_operation(Packet_descriptor::READ); ops->set_operation(Packet_descriptor::WRITE); } + + void sync() { _driver.sync(); } }; /* diff --git a/os/include/block/driver.h b/os/include/block/driver.h index 5a1aafdbd..c035d5436 100644 --- a/os/include/block/driver.h +++ b/os/include/block/driver.h @@ -98,6 +98,11 @@ namespace Block { * Allocate buffer which is suitable for DMA. */ virtual Genode::Ram_dataspace_capability alloc_dma_buffer(Genode::size_t) = 0; + + /** + * Synchronize with with device. + */ + virtual void sync() = 0; }; diff --git a/os/include/block_session/block_session.h b/os/include/block_session/block_session.h index d7eec24e0..9f4c7a161 100644 --- a/os/include/block_session/block_session.h +++ b/os/include/block_session/block_session.h @@ -129,6 +129,11 @@ namespace Block { Genode::size_t *blk_size, Operations *ops) = 0; + /** + * Synchronize with block device, like ensuring data to be written + */ + virtual void sync() = 0; + /** * Request packet-transmission channel */ @@ -146,7 +151,8 @@ namespace Block { GENODE_RPC(Rpc_info, void, info, Genode::size_t *, Genode::size_t *, Operations *); GENODE_RPC(Rpc_tx_cap, Genode::Capability, _tx_cap); - GENODE_RPC_INTERFACE(Rpc_info, Rpc_tx_cap); + GENODE_RPC(Rpc_sync, void, sync); + GENODE_RPC_INTERFACE(Rpc_info, Rpc_tx_cap, Rpc_sync); }; } diff --git a/os/include/block_session/client.h b/os/include/block_session/client.h index b153dccf8..adeb1c142 100644 --- a/os/include/block_session/client.h +++ b/os/include/block_session/client.h @@ -55,6 +55,7 @@ namespace Block { Tx *tx_channel() { return &_tx; } Tx::Source *tx() { return _tx.source(); } + void sync() { call(); } /* * Wrapper for alloc_packet, allocates 2KB aligned packets diff --git a/os/src/drivers/ahci/include/ahci_driver_base.h b/os/src/drivers/ahci/include/ahci_driver_base.h index 2a5e47eab..38440bb2b 100644 --- a/os/src/drivers/ahci/include/ahci_driver_base.h +++ b/os/src/drivers/ahci/include/ahci_driver_base.h @@ -78,6 +78,8 @@ class Ahci_driver_base : public Block::Driver Ram_dataspace_capability alloc_dma_buffer(size_t size) { return _device->alloc_dma_buffer(size); } + + void sync() {} }; #endif /* _AHCI_DRIVER_BASE_H_ */ diff --git a/os/src/drivers/atapi/main.cc b/os/src/drivers/atapi/main.cc index 52b508b6c..7bf621b19 100644 --- a/os/src/drivers/atapi/main.cc +++ b/os/src/drivers/atapi/main.cc @@ -159,6 +159,8 @@ namespace Block { ops->set_operation(Packet_descriptor::WRITE); } + void sync() {} + Ata::Device* device() { return _device; }; /** diff --git a/os/src/drivers/sd_card/exynos5/driver.h b/os/src/drivers/sd_card/exynos5/driver.h index 01a235686..013efbbfe 100644 --- a/os/src/drivers/sd_card/exynos5/driver.h +++ b/os/src/drivers/sd_card/exynos5/driver.h @@ -125,6 +125,8 @@ class Block::Exynos5_driver : public Block::Driver Ram_dataspace_capability alloc_dma_buffer(size_t size) { return Genode::env()->ram_session()->alloc(size, false); } + + void sync() {} }; #endif /* _DRIVER_H_ */ diff --git a/os/src/drivers/sd_card/omap4/driver.h b/os/src/drivers/sd_card/omap4/driver.h index 2a42299d0..bd49d253e 100644 --- a/os/src/drivers/sd_card/omap4/driver.h +++ b/os/src/drivers/sd_card/omap4/driver.h @@ -118,6 +118,8 @@ class Block::Omap4_driver : public Block::Driver Ram_dataspace_capability alloc_dma_buffer(size_t size) { return Genode::env()->ram_session()->alloc(size, false); } + + void sync() {} }; #endif /* _DRIVER_H_ */ diff --git a/os/src/drivers/sd_card/pl180/sd_card.h b/os/src/drivers/sd_card/pl180/sd_card.h index 837ca4215..82df5b3bb 100644 --- a/os/src/drivers/sd_card/pl180/sd_card.h +++ b/os/src/drivers/sd_card/pl180/sd_card.h @@ -135,6 +135,8 @@ class Sd_card : public Block::Driver { return Genode::env()->ram_session()->alloc(size, false); } + + void sync() {} }; #endif /* _SD_CARD_H_ */ diff --git a/os/src/server/part_blk/back_end.cc b/os/src/server/part_blk/back_end.cc index 67aa2da54..c5d2b22ae 100644 --- a/os/src/server/part_blk/back_end.cc +++ b/os/src/server/part_blk/back_end.cc @@ -35,7 +35,7 @@ namespace Partition { Partition *partition(int num) { return (num < MAX_PARTITIONS) ? _part_list[num] : 0; } size_t blk_size() { return _blk_size; } inline unsigned long max_packets() { return (MAX_PACKET_SIZE / _blk_size); } - + void sync() { _blk.sync(); } /** * Partition table entry format diff --git a/os/src/server/part_blk/main.cc b/os/src/server/part_blk/main.cc index 83a2a42c0..8d14ddded 100644 --- a/os/src/server/part_blk/main.cc +++ b/os/src/server/part_blk/main.cc @@ -137,6 +137,8 @@ namespace Block { ops->set_operation(Packet_descriptor::WRITE); } + void sync() { Partition::sync(); } + Partition::Partition *partition() { return _partition; } }; diff --git a/os/src/server/part_blk/part_blk.h b/os/src/server/part_blk/part_blk.h index 0b2933dfb..a2ee96aff 100644 --- a/os/src/server/part_blk/part_blk.h +++ b/os/src/server/part_blk/part_blk.h @@ -72,6 +72,11 @@ namespace Partition { * Returns block size of back end */ Genode::size_t blk_size(); + + /** + * Synchronize with backend device + */ + void sync(); } #endif /* _PART_BLK_H_ */ diff --git a/os/src/server/rom_loopdev/main.cc b/os/src/server/rom_loopdev/main.cc index 14dfac26e..cee8a8009 100644 --- a/os/src/server/rom_loopdev/main.cc +++ b/os/src/server/rom_loopdev/main.cc @@ -173,6 +173,8 @@ namespace Block { *blk_size = _block_size; ops->set_operation(Block::Packet_descriptor::READ); } + + void sync() {} }; diff --git a/os/src/test/fb_block_adapter/main.cc b/os/src/test/fb_block_adapter/main.cc index e38ecefe4..a3cf7dd28 100644 --- a/os/src/test/fb_block_adapter/main.cc +++ b/os/src/test/fb_block_adapter/main.cc @@ -153,6 +153,8 @@ namespace Block { ops->set_operation(Packet_descriptor::WRITE); } + void sync() {} + /** Signal that transmit thread is ready */ void tx_ready() { _startup_sema.up(); } };