Loading fs_mgr/libsnapshot/snapuserd/dm_user_block_server.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -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"; Loading Loading @@ -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 Loading fs_mgr/libsnapshot/snapuserd/include/snapuserd/dm_user_block_server.h +1 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <snapuserd/block_server.h> #include <snapuserd/snapuserd_buffer.h> #include <snapuserd/snapuserd_kernel.h> namespace android { namespace snapshot { Loading fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_buffer.h +7 −2 Original line number Diff line number Diff line Loading @@ -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_; } Loading @@ -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 Loading fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_kernel.h +0 −10 Original line number Diff line number Diff line Loading @@ -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 fs_mgr/libsnapshot/snapuserd/snapuserd_buffer.cpp +11 −11 Original line number Diff line number Diff line Loading @@ -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_); } Loading @@ -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) { Loading @@ -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 Loading
fs_mgr/libsnapshot/snapuserd/dm_user_block_server.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -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"; Loading Loading @@ -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 Loading
fs_mgr/libsnapshot/snapuserd/include/snapuserd/dm_user_block_server.h +1 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <snapuserd/block_server.h> #include <snapuserd/snapuserd_buffer.h> #include <snapuserd/snapuserd_kernel.h> namespace android { namespace snapshot { Loading
fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_buffer.h +7 −2 Original line number Diff line number Diff line Loading @@ -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_; } Loading @@ -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 Loading
fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_kernel.h +0 −10 Original line number Diff line number Diff line Loading @@ -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
fs_mgr/libsnapshot/snapuserd/snapuserd_buffer.cpp +11 −11 Original line number Diff line number Diff line Loading @@ -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_); } Loading @@ -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) { Loading @@ -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