Lines Matching +full:lock +full:- +full:pr
2 * Persistent reservation manager that talks to qemu-pr-helper
15 #include "scsi/pr-manager.h"
18 #include "io/channel-socket.h"
19 #include "pr-helper.h"
20 #include "qapi/qapi-events-block.h"
28 #define TYPE_PR_MANAGER_HELPER "pr-manager-helper"
38 QemuMutex lock; member
47 qapi_event_send_pr_manager_status_changed(id, !!pr_mgr->ioc); in pr_manager_send_status_changed_event()
51 /* Called with lock held. */
55 ssize_t r = qio_channel_read_all(pr_mgr->ioc, buf, sz, errp); in pr_manager_helper_read()
58 object_unref(OBJECT(pr_mgr->ioc)); in pr_manager_helper_read()
59 pr_mgr->ioc = NULL; in pr_manager_helper_read()
61 return -EINVAL; in pr_manager_helper_read()
67 /* Called with lock held. */
72 size_t nfds = (fd != -1); in pr_manager_helper_write()
79 n_written = qio_channel_writev_full(QIO_CHANNEL(pr_mgr->ioc), &iov, 1, in pr_manager_helper_write()
84 object_unref(OBJECT(pr_mgr->ioc)); in pr_manager_helper_write()
85 pr_mgr->ioc = NULL; in pr_manager_helper_write()
87 return n_written < 0 ? -EINVAL : 0; in pr_manager_helper_write()
92 sz -= n_written; in pr_manager_helper_write()
98 /* Called with lock held. */
102 char *path = g_strdup(pr_mgr->path); in pr_manager_helper_initialize()
111 assert(!pr_mgr->ioc); in pr_manager_helper_initialize()
112 qio_channel_set_name(QIO_CHANNEL(sioc), "pr-manager-helper"); in pr_manager_helper_initialize()
117 return -ENOTCONN; in pr_manager_helper_initialize()
121 pr_mgr->ioc = QIO_CHANNEL(sioc); in pr_manager_helper_initialize()
132 r = pr_manager_helper_write(pr_mgr, -1, &flags, sizeof(flags), errp); in pr_manager_helper_initialize()
141 object_unref(OBJECT(pr_mgr->ioc)); in pr_manager_helper_initialize()
142 pr_mgr->ioc = NULL; in pr_manager_helper_initialize()
158 if (!io_hdr->cmd_len || io_hdr->cmd_len > PR_HELPER_CDB_SIZE) { in pr_manager_helper_run()
159 return -EINVAL; in pr_manager_helper_run()
162 memcpy(cdb, io_hdr->cmdp, io_hdr->cmd_len); in pr_manager_helper_run()
166 if (io_hdr->dxfer_direction != expected_dir) { in pr_manager_helper_run()
167 return -EINVAL; in pr_manager_helper_run()
171 if (io_hdr->dxfer_len < len || len > PR_HELPER_DATA_SIZE) { in pr_manager_helper_run()
172 return -EINVAL; in pr_manager_helper_run()
175 qemu_mutex_lock(&pr_mgr->lock); in pr_manager_helper_run()
179 if (!pr_mgr->ioc) { in pr_manager_helper_run()
182 qemu_mutex_unlock(&pr_mgr->lock); in pr_manager_helper_run()
184 qemu_mutex_lock(&pr_mgr->lock); in pr_manager_helper_run()
203 io_hdr->resid = io_hdr->dxfer_len - len; in pr_manager_helper_run()
204 ret = pr_manager_helper_write(pr_mgr, -1, io_hdr->dxferp, len, NULL); in pr_manager_helper_run()
216 if (io_hdr->dxfer_direction == SG_DXFER_FROM_DEV) { in pr_manager_helper_run()
217 assert(resp.sz <= io_hdr->dxfer_len); in pr_manager_helper_run()
218 ret = pr_manager_helper_read(pr_mgr, io_hdr->dxferp, resp.sz, NULL); in pr_manager_helper_run()
222 io_hdr->resid = io_hdr->dxfer_len - resp.sz; in pr_manager_helper_run()
227 io_hdr->status = resp.result; in pr_manager_helper_run()
229 io_hdr->driver_status = SG_ERR_DRIVER_SENSE; in pr_manager_helper_run()
230 io_hdr->sb_len_wr = MIN(io_hdr->mx_sb_len, PR_HELPER_SENSE_SIZE); in pr_manager_helper_run()
231 memcpy(io_hdr->sbp, resp.sense, io_hdr->sb_len_wr); in pr_manager_helper_run()
236 int sense_len = scsi_build_sense(io_hdr->sbp, in pr_manager_helper_run()
238 io_hdr->driver_status = SG_ERR_DRIVER_SENSE; in pr_manager_helper_run()
239 io_hdr->sb_len_wr = MIN(io_hdr->mx_sb_len, sense_len); in pr_manager_helper_run()
240 io_hdr->status = CHECK_CONDITION; in pr_manager_helper_run()
242 qemu_mutex_unlock(&pr_mgr->lock); in pr_manager_helper_run()
251 qemu_mutex_lock(&pr_mgr->lock); in pr_manager_helper_is_connected()
252 result = (pr_mgr->ioc != NULL); in pr_manager_helper_is_connected()
253 qemu_mutex_unlock(&pr_mgr->lock); in pr_manager_helper_is_connected()
262 qemu_mutex_lock(&pr_mgr->lock); in pr_manager_helper_complete()
264 qemu_mutex_unlock(&pr_mgr->lock); in pr_manager_helper_complete()
271 return g_strdup(pr_mgr->path); in get_path()
278 g_free(pr_mgr->path); in set_path()
279 pr_mgr->path = g_strdup(str); in set_path()
286 object_unref(OBJECT(pr_mgr->ioc)); in pr_manager_helper_instance_finalize()
287 qemu_mutex_destroy(&pr_mgr->lock); in pr_manager_helper_instance_finalize()
294 qemu_mutex_init(&pr_mgr->lock); in pr_manager_helper_instance_init()
304 uc_klass->complete = pr_manager_helper_complete; in pr_manager_helper_class_init()
305 prmgr_klass->run = pr_manager_helper_run; in pr_manager_helper_class_init()
306 prmgr_klass->is_connected = pr_manager_helper_is_connected; in pr_manager_helper_class_init()