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 <dhavale@google.com>
This commit is contained in:
Sandeep Dhavale 2024-08-05 17:03:38 -07:00
parent 60d8d17fbc
commit 3df2dc1aae
5 changed files with 24 additions and 26 deletions

View file

@ -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<struct dm_user_header*>(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<struct dm_user_header*>(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

View file

@ -20,6 +20,7 @@
#include <snapuserd/block_server.h>
#include <snapuserd/snapuserd_buffer.h>
#include <snapuserd/snapuserd_kernel.h>
namespace android {
namespace snapshot {

View file

@ -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<uint8_t[]> buffer_;
loff_t buffer_offset_;
size_t buffer_size_;
size_t header_size_;
};
} // namespace snapshot

View file

@ -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

View file

@ -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<uint8_t[]>(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<char*>(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<char*>(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<char*>(GetBufPtr());
struct dm_user_message* msg = reinterpret_cast<struct dm_user_message*>(&(buffer[0]));
return msg->payload.buf;
return &buffer[header_size_];
}
} // namespace snapshot