Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2007e0cc authored by Sandeep Dhavale's avatar Sandeep Dhavale Committed by Gerrit Code Review
Browse files

Merge "snapuserd: remove implicit assumption about dm-user in BufferSink" into main

parents 20d170fc 3df2dc1a
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@

#include <snapuserd/block_server.h>
#include <snapuserd/snapuserd_buffer.h>
#include <snapuserd/snapuserd_kernel.h>

namespace android {
namespace snapshot {
+7 −2
Original line number Diff line number Diff line
@@ -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
+0 −10
Original line number Diff line number Diff line
@@ -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
+11 −11
Original line number Diff line number Diff line
@@ -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