From 3df2dc1aaed17ed9bc682cab1058fa8f29fbd39d Mon Sep 17 00:00:00 2001 From: Sandeep Dhavale Date: Mon, 5 Aug 2024 17:03:38 -0700 Subject: [PATCH] snapuserd: remove implicit assumption about dm-user in BufferSink This removes implicit assumption that BufferSink can only be used with dm-user. User of BufferSink can specify size of header during BufferSink::Initialize to reserve the space for the header. Also get rid of now unused structure dm_user_payload and dm_user_message. Test: TH Test: ota Test: vts_snapused_test Bug: 357711761 Change-Id: I1e550393ce1f0277fe215015fa6948ad3c3b68ba Signed-off-by: Sandeep Dhavale --- .../snapuserd/dm_user_block_server.cpp | 8 ++++--- .../include/snapuserd/dm_user_block_server.h | 1 + .../include/snapuserd/snapuserd_buffer.h | 9 ++++++-- .../include/snapuserd/snapuserd_kernel.h | 10 --------- .../snapuserd/snapuserd_buffer.cpp | 22 +++++++++---------- 5 files changed, 24 insertions(+), 26 deletions(-) diff --git a/fs_mgr/libsnapshot/snapuserd/dm_user_block_server.cpp b/fs_mgr/libsnapshot/snapuserd/dm_user_block_server.cpp index e98833502..4599ad3b3 100644 --- a/fs_mgr/libsnapshot/snapuserd/dm_user_block_server.cpp +++ b/fs_mgr/libsnapshot/snapuserd/dm_user_block_server.cpp @@ -27,11 +27,12 @@ using android::base::unique_fd; DmUserBlockServer::DmUserBlockServer(const std::string& misc_name, unique_fd&& ctrl_fd, Delegate* delegate, size_t buffer_size) : misc_name_(misc_name), ctrl_fd_(std::move(ctrl_fd)), delegate_(delegate) { - buffer_.Initialize(buffer_size); + buffer_.Initialize(sizeof(struct dm_user_header), buffer_size); } bool DmUserBlockServer::ProcessRequests() { - struct dm_user_header* header = buffer_.GetHeaderPtr(); + struct dm_user_header* header = + reinterpret_cast(buffer_.GetHeaderPtr()); if (!android::base::ReadFully(ctrl_fd_, header, sizeof(*header))) { if (errno != ENOTBLK) { SNAP_PLOG(ERROR) << "Control-read failed"; @@ -90,7 +91,8 @@ bool DmUserBlockServer::SendBufferedIo() { } void DmUserBlockServer::SendError() { - struct dm_user_header* header = buffer_.GetHeaderPtr(); + struct dm_user_header* header = + reinterpret_cast(buffer_.GetHeaderPtr()); header->type = DM_USER_RESP_ERROR; // This is an issue with the dm-user interface. There // is no way to propagate the I/O error back to dm-user diff --git a/fs_mgr/libsnapshot/snapuserd/include/snapuserd/dm_user_block_server.h b/fs_mgr/libsnapshot/snapuserd/include/snapuserd/dm_user_block_server.h index f1f8da143..35c6bfbb2 100644 --- a/fs_mgr/libsnapshot/snapuserd/include/snapuserd/dm_user_block_server.h +++ b/fs_mgr/libsnapshot/snapuserd/include/snapuserd/dm_user_block_server.h @@ -20,6 +20,7 @@ #include #include +#include namespace android { namespace snapshot { diff --git a/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_buffer.h b/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_buffer.h index c5ca2b120..cc7c48c96 100644 --- a/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_buffer.h +++ b/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_buffer.h @@ -27,13 +27,17 @@ namespace snapshot { class BufferSink final { public: - void Initialize(size_t size); + // Do not reserve any space of header by default + void Initialize(size_t size) { return Initialize(0, size); }; + // This allows to set const header_size_ to be used if caller needs it + // for example, while working with dm_user + void Initialize(size_t header_size, size_t size); void* GetBufPtr() { return buffer_.get(); } void Clear() { memset(GetBufPtr(), 0, buffer_size_); } void* GetPayloadBuffer(size_t size); void* GetBuffer(size_t requested, size_t* actual); void UpdateBufferOffset(size_t size) { buffer_offset_ += size; } - struct dm_user_header* GetHeaderPtr(); + void* GetHeaderPtr(); void ResetBufferOffset() { buffer_offset_ = 0; } void* GetPayloadBufPtr(); loff_t GetPayloadBytesWritten() { return buffer_offset_; } @@ -56,6 +60,7 @@ class BufferSink final { std::unique_ptr buffer_; loff_t buffer_offset_; size_t buffer_size_; + size_t header_size_; }; } // namespace snapshot diff --git a/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_kernel.h b/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_kernel.h index 7ab75dc79..14291b214 100644 --- a/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_kernel.h +++ b/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_kernel.h @@ -92,15 +92,5 @@ struct dm_user_header { __u64 len; } __attribute__((packed)); -struct dm_user_payload { - __u8 buf[]; -}; - -// Message comprising both header and payload -struct dm_user_message { - struct dm_user_header header; - struct dm_user_payload payload; -}; - } // namespace snapshot } // namespace android diff --git a/fs_mgr/libsnapshot/snapuserd/snapuserd_buffer.cpp b/fs_mgr/libsnapshot/snapuserd/snapuserd_buffer.cpp index 490c0e63a..51b249034 100644 --- a/fs_mgr/libsnapshot/snapuserd/snapuserd_buffer.cpp +++ b/fs_mgr/libsnapshot/snapuserd/snapuserd_buffer.cpp @@ -22,8 +22,9 @@ namespace android { namespace snapshot { -void BufferSink::Initialize(size_t size) { - buffer_size_ = size + sizeof(struct dm_user_header); +void BufferSink::Initialize(size_t header_size, size_t size) { + header_size_ = header_size; + buffer_size_ = size + header_size; buffer_offset_ = 0; buffer_ = std::make_unique(buffer_size_); } @@ -41,11 +42,11 @@ void* BufferSink::AcquireBuffer(size_t size, size_t to_write) { void* BufferSink::GetPayloadBuffer(size_t size) { char* buffer = reinterpret_cast(GetBufPtr()); - struct dm_user_message* msg = (struct dm_user_message*)(&(buffer[0])); - if ((buffer_size_ - buffer_offset_ - sizeof(msg->header)) < size) { + + if ((buffer_size_ - buffer_offset_ - header_size_) < size) { return nullptr; } - return (char*)msg->payload.buf + buffer_offset_; + return (char*)(&buffer[0] + header_size_ + buffer_offset_); } void* BufferSink::GetBuffer(size_t requested, size_t* actual) { @@ -58,19 +59,18 @@ void* BufferSink::GetBuffer(size_t requested, size_t* actual) { return buf; } -struct dm_user_header* BufferSink::GetHeaderPtr() { - if (!(sizeof(struct dm_user_header) <= buffer_size_)) { +void* BufferSink::GetHeaderPtr() { + // If no sufficient space or header not reserved + if (!(header_size_ <= buffer_size_) || !header_size_) { return nullptr; } char* buf = reinterpret_cast(GetBufPtr()); - struct dm_user_header* header = (struct dm_user_header*)(&(buf[0])); - return header; + return (void*)(&(buf[0])); } void* BufferSink::GetPayloadBufPtr() { char* buffer = reinterpret_cast(GetBufPtr()); - struct dm_user_message* msg = reinterpret_cast(&(buffer[0])); - return msg->payload.buf; + return &buffer[header_size_]; } } // namespace snapshot