|
|
|
@ -17,6 +17,10 @@ |
|
|
|
#include "block/thread-pool.h" |
|
|
|
#include "scsi/pr-manager.h" |
|
|
|
#include "trace.h" |
|
|
|
#include "qapi/qapi-types-block.h" |
|
|
|
#include "qapi/qapi-commands-block.h" |
|
|
|
|
|
|
|
#define PR_MANAGER_PATH "/objects" |
|
|
|
|
|
|
|
typedef struct PRManagerData { |
|
|
|
PRManager *pr_mgr; |
|
|
|
@ -64,6 +68,14 @@ BlockAIOCB *pr_manager_execute(PRManager *pr_mgr, |
|
|
|
data, complete, opaque); |
|
|
|
} |
|
|
|
|
|
|
|
bool pr_manager_is_connected(PRManager *pr_mgr) |
|
|
|
{ |
|
|
|
PRManagerClass *pr_mgr_class = |
|
|
|
PR_MANAGER_GET_CLASS(pr_mgr); |
|
|
|
|
|
|
|
return !pr_mgr_class->is_connected || pr_mgr_class->is_connected(pr_mgr); |
|
|
|
} |
|
|
|
|
|
|
|
static const TypeInfo pr_manager_info = { |
|
|
|
.parent = TYPE_OBJECT, |
|
|
|
.name = TYPE_PR_MANAGER, |
|
|
|
@ -105,5 +117,38 @@ pr_manager_register_types(void) |
|
|
|
type_register_static(&pr_manager_info); |
|
|
|
} |
|
|
|
|
|
|
|
static int query_one_pr_manager(Object *object, void *opaque) |
|
|
|
{ |
|
|
|
PRManagerInfoList ***prev = opaque; |
|
|
|
PRManagerInfoList *elem; |
|
|
|
PRManagerInfo *info; |
|
|
|
PRManager *pr_mgr; |
|
|
|
|
|
|
|
pr_mgr = (PRManager *)object_dynamic_cast(object, TYPE_PR_MANAGER); |
|
|
|
if (!pr_mgr) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
elem = g_new0(PRManagerInfoList, 1); |
|
|
|
info = g_new0(PRManagerInfo, 1); |
|
|
|
info->id = object_get_canonical_path_component(object); |
|
|
|
info->connected = pr_manager_is_connected(pr_mgr); |
|
|
|
elem->value = info; |
|
|
|
elem->next = NULL; |
|
|
|
|
|
|
|
**prev = elem; |
|
|
|
*prev = &elem->next; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
PRManagerInfoList *qmp_query_pr_managers(Error **errp) |
|
|
|
{ |
|
|
|
PRManagerInfoList *head = NULL; |
|
|
|
PRManagerInfoList **prev = &head; |
|
|
|
Object *container = container_get(object_get_root(), PR_MANAGER_PATH); |
|
|
|
|
|
|
|
object_child_foreach(container, query_one_pr_manager, &prev); |
|
|
|
return head; |
|
|
|
} |
|
|
|
|
|
|
|
type_init(pr_manager_register_types); |
|
|
|
|