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()
113 assert(!pr_mgr->ioc); in pr_manager_helper_initialize()
114 qio_channel_set_name(QIO_CHANNEL(sioc), "pr-manager-helper"); in pr_manager_helper_initialize()
122 return -ENOTCONN; in pr_manager_helper_initialize()
126 pr_mgr->ioc = QIO_CHANNEL(sioc); in pr_manager_helper_initialize()
137 r = pr_manager_helper_write(pr_mgr, -1, &flags, sizeof(flags), errp); in pr_manager_helper_initialize()
146 object_unref(OBJECT(pr_mgr->ioc)); in pr_manager_helper_initialize()
147 pr_mgr->ioc = NULL; in pr_manager_helper_initialize()
163 if (!io_hdr->cmd_len || io_hdr->cmd_len > PR_HELPER_CDB_SIZE) { in pr_manager_helper_run()
164 return -EINVAL; in pr_manager_helper_run()
167 memcpy(cdb, io_hdr->cmdp, io_hdr->cmd_len); in pr_manager_helper_run()
171 if (io_hdr->dxfer_direction != expected_dir) { in pr_manager_helper_run()
172 return -EINVAL; in pr_manager_helper_run()
176 if (io_hdr->dxfer_len < len || len > PR_HELPER_DATA_SIZE) { in pr_manager_helper_run()
177 return -EINVAL; in pr_manager_helper_run()
180 qemu_mutex_lock(&pr_mgr->lock); in pr_manager_helper_run()
184 if (!pr_mgr->ioc) { in pr_manager_helper_run()
187 qemu_mutex_unlock(&pr_mgr->lock); in pr_manager_helper_run()
189 qemu_mutex_lock(&pr_mgr->lock); in pr_manager_helper_run()
208 io_hdr->resid = io_hdr->dxfer_len - len; in pr_manager_helper_run()
209 ret = pr_manager_helper_write(pr_mgr, -1, io_hdr->dxferp, len, NULL); in pr_manager_helper_run()
221 if (io_hdr->dxfer_direction == SG_DXFER_FROM_DEV) { in pr_manager_helper_run()
222 assert(resp.sz <= io_hdr->dxfer_len); in pr_manager_helper_run()
223 ret = pr_manager_helper_read(pr_mgr, io_hdr->dxferp, resp.sz, NULL); in pr_manager_helper_run()
227 io_hdr->resid = io_hdr->dxfer_len - resp.sz; in pr_manager_helper_run()
232 io_hdr->status = resp.result; in pr_manager_helper_run()
234 io_hdr->driver_status = SG_ERR_DRIVER_SENSE; in pr_manager_helper_run()
235 io_hdr->sb_len_wr = MIN(io_hdr->mx_sb_len, PR_HELPER_SENSE_SIZE); in pr_manager_helper_run()
236 memcpy(io_hdr->sbp, resp.sense, io_hdr->sb_len_wr); in pr_manager_helper_run()
241 int sense_len = scsi_build_sense(io_hdr->sbp, in pr_manager_helper_run()
243 io_hdr->driver_status = SG_ERR_DRIVER_SENSE; in pr_manager_helper_run()
244 io_hdr->sb_len_wr = MIN(io_hdr->mx_sb_len, sense_len); in pr_manager_helper_run()
245 io_hdr->status = CHECK_CONDITION; in pr_manager_helper_run()
247 qemu_mutex_unlock(&pr_mgr->lock); in pr_manager_helper_run()
256 qemu_mutex_lock(&pr_mgr->lock); in pr_manager_helper_is_connected()
257 result = (pr_mgr->ioc != NULL); in pr_manager_helper_is_connected()
258 qemu_mutex_unlock(&pr_mgr->lock); in pr_manager_helper_is_connected()
267 qemu_mutex_lock(&pr_mgr->lock); in pr_manager_helper_complete()
269 qemu_mutex_unlock(&pr_mgr->lock); in pr_manager_helper_complete()
276 return g_strdup(pr_mgr->path); in get_path()
283 g_free(pr_mgr->path); in set_path()
284 pr_mgr->path = g_strdup(str); in set_path()
291 object_unref(OBJECT(pr_mgr->ioc)); in pr_manager_helper_instance_finalize()
292 qemu_mutex_destroy(&pr_mgr->lock); in pr_manager_helper_instance_finalize()
299 qemu_mutex_init(&pr_mgr->lock); in pr_manager_helper_instance_init()
309 uc_klass->complete = pr_manager_helper_complete; in pr_manager_helper_class_init()
310 prmgr_klass->run = pr_manager_helper_run; in pr_manager_helper_class_init()
311 prmgr_klass->is_connected = pr_manager_helper_is_connected; in pr_manager_helper_class_init()