]>
git.proxmox.com Git - ceph.git/blob - ceph/src/tools/rbd_ggate/Driver.cc
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
);