1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
6 #include "common/debug.h"
7 #include "common/errno.h"
11 #define dout_context g_ceph_context
12 #define dout_subsys ceph_subsys_rbd
14 #define dout_prefix *_dout << "rbd::ggate::Driver: " << this \
15 << " " << __func__ << ": "
22 return ggate_drv_load();
25 int Driver::kill(const std::string &devname) {
27 int r = ggate_drv_kill(devname.c_str());
32 int Driver::list(std::list<std::string> &devs) {
34 char **devs_ = nullptr;
37 while (size <= 1024 * 1024) {
38 devs_ = static_cast<char **>(
39 realloc(static_cast<void *>(devs_), size * sizeof(*devs_)));
40 r = ggate_drv_list(devs_, &size);
51 for (size_t i = 0; i < size; i++) {
52 devs.push_back(devs_[i]);
55 ggate_drv_list_free(devs_, size);
62 Driver::Driver(const std::string &devname, size_t sectorsize, size_t mediasize,
63 bool readonly, const std::string &info)
64 : m_devname(devname), m_sectorsize(sectorsize), m_mediasize(mediasize),
65 m_readonly(readonly), m_info(info) {
74 if (m_devname.empty()) {
78 namelen = m_devname.size();
79 if (namelen >= PATH_MAX) {
82 strncpy(name, m_devname.c_str(), namelen + 1);
85 int r = ggate_drv_create(name, namelen, m_sectorsize, m_mediasize, m_readonly,
86 m_info.c_str(), &m_drv);
91 if (m_devname.empty()) {
98 std::string Driver::get_devname() const {
99 dout(30) << m_devname << dendl;
104 void Driver::shut_down() {
107 ggate_drv_destroy(m_drv);
110 int Driver::resize(size_t newsize) {
111 dout(20) << "newsize=" << newsize << dendl;
113 int r = ggate_drv_resize(m_drv, newsize);
118 m_mediasize = newsize;
122 int Driver::recv(Request **req) {
125 ggate_drv_req_t req_;
127 int r = ggate_drv_recv(m_drv, &req_);
132 *req = new Request(req_);
134 dout(20) << "req=" << *req << dendl;
136 if (ggate_drv_req_cmd(req_) == GGATE_DRV_CMD_WRITE) {
137 bufferptr ptr(buffer::claim_malloc(
138 ggate_drv_req_length(req_),
139 static_cast<char *>(ggate_drv_req_release_buf(req_))));
140 (*req)->bl.push_back(ptr);
146 int Driver::send(Request *req) {
147 dout(20) << "req=" << req << dendl;
149 if (ggate_drv_req_cmd(req->req) == GGATE_DRV_CMD_READ &&
150 ggate_drv_req_error(req->req) == 0) {
151 assert(req->bl.length() == ggate_drv_req_length(req->req));
152 // TODO: avoid copying?
153 req->bl.copy(0, ggate_drv_req_length(req->req),
154 static_cast<char *>(ggate_drv_req_buf(req->req)));
155 dout(20) << "copied resulting " << req->bl.length() << " bytes to "
156 << ggate_drv_req_buf(req->req) << dendl;
159 int r = ggate_drv_send(m_drv, req->req);