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:
parent
60d8d17fbc
commit
3df2dc1aae
5 changed files with 24 additions and 26 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <snapuserd/block_server.h>
|
||||
#include <snapuserd/snapuserd_buffer.h>
|
||||
#include <snapuserd/snapuserd_kernel.h>
|
||||
|
||||
namespace android {
|
||||
namespace snapshot {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue