MULTI_DEBUG_CHANNEL(qemu, hds);
+// send # of available PCI slot
+static void ecs_hds_send_available_pci(char* cmd)
+{
+ int n_possible;
+ int n_hidden;
+ int n_available = 0;
+ char slot_data [OUT_BUF_SIZE];
+
+ n_possible = hds_get_pci_available_slot_num();
+ if (n_possible > 0) {
+ n_hidden = hds_get_num_hidden_conn();
+
+ if (n_hidden > ECS_HDS_HIDDEN_RESERVED) {
+ n_hidden = 0;
+ } else {
+ n_hidden = ECS_HDS_HIDDEN_RESERVED - n_hidden;
+ }
+
+ n_available = n_possible - n_hidden;
+ if (n_available < 0){
+ n_available = 0;
+ }
+ }
+
+ snprintf(slot_data, sizeof(slot_data), "%d", n_available);
+ make_send_device_ntf(cmd, ECS_HDS_MSG_GROUP, ECS_HDS_ACTION_PCI, slot_data);
+}
+
+static bool check_pci_slot(enum hds_level level)
+{
+ int n_possible;
+ int n_hidden;
+
+ n_possible = hds_get_pci_available_slot_num();
+ if (n_possible <= 0) {
+ return false;
+ }
+
+ g_assert(n_possible > 0);
+
+ if (level == hds_level_hidden) {
+ return true;
+ }
+
+ n_hidden = hds_get_num_hidden_conn();
+
+ if (n_hidden < ECS_HDS_HIDDEN_RESERVED) {
+ n_hidden = ECS_HDS_HIDDEN_RESERVED - n_hidden;
+
+ n_possible = n_possible - n_hidden;
+ if (n_possible <= 0){
+ return false;
+ }
+ }
+
+ return true;
+}
+
static void ecs_hds_do_status(char* cmd, type_group group)
{
char* data = get_hds_lists();
LOG_INFO("hds status: %s\n", data);
make_send_device_ntf(cmd, group, ECS_HDS_ACTION_STATE, data);
+
+ ecs_hds_send_available_pci(cmd);
}
static void ecs_hds_do_mount(char* cmd, type_group group, char *data)
level = atoi(level_token);
}
+ // check available PCI slot num
+ if (!check_pci_slot(level)) {
+ LOG_WARNING("No available pci slot.\n");
+ make_send_device_ntf(cmd, group, ECS_HDS_ACT_MOUNT_NO_SPACE, NULL);
+ return;
+ }
+
hds_id = new_hds_list(host, guest, level);
if (hds_id != NULL) {
LOG_INFO("do attach tag: %s, host: %s, guest: %s, level: %d\n", hds_id, host, guest, level);
#include "ecs.h"
+#define ECS_HDS_HIDDEN_RESERVED 4
+
#define ECS_HDS_MSG_GROUP 100
#define ECS_HDS_ACTION_MOUNT 1
#define ECS_HDS_ACTION_UMOUNT 2
+#define ECS_HDS_ACTION_PCI 98
#define ECS_HDS_ACTION_STATE 99
enum hds_act_result {
ECS_HDS_ACT_MOUNT_NOT_VALID_PATH = 12,
ECS_HDS_ACT_MOUNT_DUP_HOST_PATH = 21,
ECS_HDS_ACT_MOUNT_DUP_GUEST_PATH = 22,
+ ECS_HDS_ACT_MOUNT_NO_SPACE = 23,
ECS_HDS_ACT_UMOUNT_SUCCESS = 3,
ECS_HDS_ACT_UMOUNT_FAIL = 4,
ECS_HDS_ACT_UMOUNT_DETACH_FAIL = 5,