Lines Matching +full:suspend +full:- +full:to +full:- +full:disk
2 * QEMU Guest Agent Linux-specific command implementations
11 * See the COPYING file in the top-level directory.
16 #include "qga-qapi-commands.h"
18 #include "commands-common.h"
46 slog("failed to stat device file '%s': %s", devpath, strerror(errno)); in dev_major_minor()
47 return -1; in dev_major_minor()
51 return -2; in dev_major_minor()
58 return -1; in dev_major_minor()
71 error_setg(errp, "failed to open mtab file: '%s'", mtab); in build_fs_mount_list_from_mtab()
82 if ((ment->mnt_fsname[0] != '/') || in build_fs_mount_list_from_mtab()
83 (strcmp(ment->mnt_type, "smbfs") == 0) || in build_fs_mount_list_from_mtab()
84 (strcmp(ment->mnt_type, "cifs") == 0)) { in build_fs_mount_list_from_mtab()
87 if (dev_major_minor(ment->mnt_fsname, &devmajor, &devminor) == -2) { in build_fs_mount_list_from_mtab()
93 mount->dirname = g_strdup(ment->mnt_dir); in build_fs_mount_list_from_mtab()
94 mount->devtype = g_strdup(ment->mnt_type); in build_fs_mount_list_from_mtab()
95 mount->devmajor = devmajor; in build_fs_mount_list_from_mtab()
96 mount->devminor = devminor; in build_fs_mount_list_from_mtab()
117 name[j++] = (name[i + 1] - '0') * 64 + in decode_mntname()
118 (name[i + 2] - '0') * 8 + in decode_mntname()
119 (name[i + 3] - '0'); in decode_mntname()
146 while (getline(&line, &n, fp) != -1) { in build_fs_mount_list()
152 dash = strstr(line + dir_e, " - "); in build_fs_mount_list()
156 ret = sscanf(dash, " - %n%*s%n %n%*s%n%c", in build_fs_mount_list()
164 decode_mntname(line + dir_s, dir_e - dir_s); in build_fs_mount_list()
165 decode_mntname(dash + dev_s, dev_e - dev_s); in build_fs_mount_list()
175 mount->dirname = g_strdup(line + dir_s); in build_fs_mount_list()
176 mount->devtype = g_strdup(dash + type_s); in build_fs_mount_list()
177 mount->devmajor = devmajor; in build_fs_mount_list()
178 mount->devminor = devminor; in build_fs_mount_list()
204 /* To issue fsfreeze in the reverse order of mounts, check if the in qmp_guest_fsfreeze_do_freeze_list()
207 for (list = mountpoints; list; list = list->next) { in qmp_guest_fsfreeze_do_freeze_list()
208 if (strcmp(list->value, mount->dirname) == 0) { in qmp_guest_fsfreeze_do_freeze_list()
217 fd = qga_open_cloexec(mount->dirname, O_RDONLY, 0); in qmp_guest_fsfreeze_do_freeze_list()
218 if (fd == -1) { in qmp_guest_fsfreeze_do_freeze_list()
219 error_setg_errno(errp, errno, "failed to open %s", mount->dirname); in qmp_guest_fsfreeze_do_freeze_list()
220 return -1; in qmp_guest_fsfreeze_do_freeze_list()
223 /* we try to cull filesystems we know won't work in advance, but other in qmp_guest_fsfreeze_do_freeze_list()
228 * consecutive attempt to freeze an already frozen filesystem will in qmp_guest_fsfreeze_do_freeze_list()
231 * any other error means a failure to freeze a filesystem we in qmp_guest_fsfreeze_do_freeze_list()
232 * expect to be freezable, so return an error in those cases in qmp_guest_fsfreeze_do_freeze_list()
233 * and return system to thawed state. in qmp_guest_fsfreeze_do_freeze_list()
236 if (ret == -1) { in qmp_guest_fsfreeze_do_freeze_list()
238 error_setg_errno(errp, errno, "failed to freeze %s", in qmp_guest_fsfreeze_do_freeze_list()
239 mount->dirname); in qmp_guest_fsfreeze_do_freeze_list()
241 return -1; in qmp_guest_fsfreeze_do_freeze_list()
262 return -1; in qmp_guest_fsfreeze_do_thaw()
267 fd = qga_open_cloexec(mount->dirname, O_RDONLY, 0); in qmp_guest_fsfreeze_do_thaw()
268 if (fd == -1) { in qmp_guest_fsfreeze_do_thaw()
272 * as a result of a successful call to FITHAW, only that if an error in qmp_guest_fsfreeze_do_thaw()
276 * since multiple preceding FIFREEZEs require multiple calls to FITHAW in qmp_guest_fsfreeze_do_thaw()
277 * to unfreeze, continuing issuing FITHAW until an error is returned, in qmp_guest_fsfreeze_do_thaw()
282 * the actual unfreeze, we can use this to provide an accurate count in qmp_guest_fsfreeze_do_thaw()
283 * of the number of filesystems unfrozen by guest-fsfreeze-thaw, which in qmp_guest_fsfreeze_do_thaw()
285 * during the freeze/thaw phase by a process other than qemu-ga. in qmp_guest_fsfreeze_do_thaw()
315 len = readlink(dpath, buf, sizeof(buf) - 1); in get_pci_driver()
316 if (len != -1) { in get_pci_driver()
330 return a < b ? -1 : a > b ? 1 : 0; in compare_uint()
342 path = g_strndup(syspath, host - syspath); in build_hosts()
347 return -1; in build_hosts()
355 if (ata && sscanf(entry->d_name, "ata%d", hosts + i) == 1) { in build_hosts()
357 } else if (!ata && sscanf(entry->d_name, "host%d", hosts + i) == 1) { in build_hosts()
370 * Store disk device info for devices on the PCI bus.
374 GuestDiskAddress *disk, in build_guest_fsinfo_for_pci_dev() argument
379 GuestPCIAddress *pciaddr = disk->pci_controller; in build_guest_fsinfo_for_pci_dev()
393 driver = get_pci_driver(syspath, p - syspath, errp); in build_guest_fsinfo_for_pci_dev()
396 g_str_equal(driver, "virtio-pci") || in build_guest_fsinfo_for_pci_dev()
400 g_str_equal(driver, "ehci-pci"))) { in build_guest_fsinfo_for_pci_dev()
438 pciaddr->domain = pci[0]; in build_guest_fsinfo_for_pci_dev()
439 pciaddr->bus = pci[1]; in build_guest_fsinfo_for_pci_dev()
440 pciaddr->slot = pci[2]; in build_guest_fsinfo_for_pci_dev()
441 pciaddr->function = pci[3]; in build_guest_fsinfo_for_pci_dev()
451 disk->bus_type = GUEST_DISK_BUS_TYPE_IDE; in build_guest_fsinfo_for_pci_dev()
452 disk->bus = i; in build_guest_fsinfo_for_pci_dev()
453 disk->unit = tgt[1]; in build_guest_fsinfo_for_pci_dev()
467 disk->bus_type = GUEST_DISK_BUS_TYPE_SCSI; in build_guest_fsinfo_for_pci_dev()
468 disk->unit = tgt[1]; in build_guest_fsinfo_for_pci_dev()
469 } else if (strcmp(driver, "virtio-pci") == 0) { in build_guest_fsinfo_for_pci_dev()
471 /* virtio-scsi: target*:0:0:<unit> */ in build_guest_fsinfo_for_pci_dev()
472 disk->bus_type = GUEST_DISK_BUS_TYPE_SCSI; in build_guest_fsinfo_for_pci_dev()
473 disk->unit = tgt[2]; in build_guest_fsinfo_for_pci_dev()
475 /* virtio-blk: 1 disk per 1 device */ in build_guest_fsinfo_for_pci_dev()
476 disk->bus_type = GUEST_DISK_BUS_TYPE_VIRTIO; in build_guest_fsinfo_for_pci_dev()
486 disk->unit = i; in build_guest_fsinfo_for_pci_dev()
487 disk->bus_type = GUEST_DISK_BUS_TYPE_SATA; in build_guest_fsinfo_for_pci_dev()
496 disk->bus_type = GUEST_DISK_BUS_TYPE_NVME; in build_guest_fsinfo_for_pci_dev()
497 } else if (strcmp(driver, "ehci-pci") == 0 || strcmp(driver, "xhci_hcd") == 0) { in build_guest_fsinfo_for_pci_dev()
498 disk->bus_type = GUEST_DISK_BUS_TYPE_USB; in build_guest_fsinfo_for_pci_dev()
512 * Store disk device info for non-PCI virtio devices (for example s390x
517 GuestDiskAddress *disk, in build_guest_fsinfo_for_nonpci_virtio() argument
531 /* virtio-scsi: target*:0:<target>:<unit> */ in build_guest_fsinfo_for_nonpci_virtio()
532 disk->bus_type = GUEST_DISK_BUS_TYPE_SCSI; in build_guest_fsinfo_for_nonpci_virtio()
533 disk->bus = tgt[0]; in build_guest_fsinfo_for_nonpci_virtio()
534 disk->target = tgt[1]; in build_guest_fsinfo_for_nonpci_virtio()
535 disk->unit = tgt[2]; in build_guest_fsinfo_for_nonpci_virtio()
537 /* virtio-blk: 1 disk per 1 device */ in build_guest_fsinfo_for_nonpci_virtio()
538 disk->bus_type = GUEST_DISK_BUS_TYPE_VIRTIO; in build_guest_fsinfo_for_nonpci_virtio()
545 * Store disk device info for CCW devices (s390x channel I/O devices).
549 GuestDiskAddress *disk, in build_guest_fsinfo_for_ccw_dev() argument
562 disk->ccw_address = g_new0(GuestCCWAddress, 1); in build_guest_fsinfo_for_ccw_dev()
563 disk->ccw_address->cssid = cssid; in build_guest_fsinfo_for_ccw_dev()
564 disk->ccw_address->ssid = ssid; in build_guest_fsinfo_for_ccw_dev()
565 disk->ccw_address->subchno = subchno; in build_guest_fsinfo_for_ccw_dev()
566 disk->ccw_address->devno = devno; in build_guest_fsinfo_for_ccw_dev()
569 build_guest_fsinfo_for_nonpci_virtio(syspath, disk, errp); in build_guest_fsinfo_for_ccw_dev()
575 /* Store disk device info specified by @sysfs into @fs */
580 GuestDiskAddress *disk; in build_guest_fsinfo_for_real_device() local
589 pciaddr->domain = -1; /* -1 means field is invalid */ in build_guest_fsinfo_for_real_device()
590 pciaddr->bus = -1; in build_guest_fsinfo_for_real_device()
591 pciaddr->slot = -1; in build_guest_fsinfo_for_real_device()
592 pciaddr->function = -1; in build_guest_fsinfo_for_real_device()
594 disk = g_new0(GuestDiskAddress, 1); in build_guest_fsinfo_for_real_device()
595 disk->pci_controller = pciaddr; in build_guest_fsinfo_for_real_device()
596 disk->bus_type = GUEST_DISK_BUS_TYPE_UNKNOWN; in build_guest_fsinfo_for_real_device()
602 g_debug("failed to query udev"); in build_guest_fsinfo_for_real_device()
607 disk->dev = g_strdup(devnode); in build_guest_fsinfo_for_real_device()
611 disk->serial = g_strdup(serial); in build_guest_fsinfo_for_real_device()
620 has_hwinf = build_guest_fsinfo_for_pci_dev(syspath, disk, errp); in build_guest_fsinfo_for_real_device()
622 has_hwinf = build_guest_fsinfo_for_ccw_dev(syspath, disk, errp); in build_guest_fsinfo_for_real_device()
624 has_hwinf = build_guest_fsinfo_for_nonpci_virtio(syspath, disk, errp); in build_guest_fsinfo_for_real_device()
630 if (has_hwinf || disk->dev || disk->serial) { in build_guest_fsinfo_for_real_device()
631 QAPI_LIST_PREPEND(fs->disk, disk); in build_guest_fsinfo_for_real_device()
633 qapi_free_GuestDiskAddress(disk); in build_guest_fsinfo_for_real_device()
672 if (entry->d_type == DT_LNK) { in build_guest_fsinfo_for_virtual_device()
675 g_debug(" slave device '%s'", entry->d_name); in build_guest_fsinfo_for_virtual_device()
676 path = g_strdup_printf("%s/slaves/%s", syspath, entry->d_name); in build_guest_fsinfo_for_virtual_device()
702 /* Dispatch to functions for virtual/real device */
719 if (!fs->name) { in build_guest_fsinfo_for_device()
720 fs->name = g_path_get_basename(devpath); in build_guest_fsinfo_for_device()
725 if (!fs->name) { in build_guest_fsinfo_for_device()
726 fs->name = g_path_get_basename(syspath); in build_guest_fsinfo_for_device()
745 * the disk address.
753 if (fs->disk != NULL) { in get_disk_address()
754 return g_steal_pointer(&fs->disk->value); in get_disk_address()
767 g_debug("failed to query udev"); in get_alias_for_syspath()
772 g_debug("failed to query udev for path: %s", syspath); in get_alias_for_syspath()
782 g_debug("failed to query udev for device alias for: %s", in get_alias_for_syspath()
803 g_debug("failed to query udev"); in get_device_for_syspath()
808 g_debug("failed to query udev for path: %s", syspath); in get_device_for_syspath()
820 static void get_disk_deps(const char *disk_dir, GuestDiskInfo *disk) in get_disk_deps() argument
831 g_debug("failed to list entries in %s", deps_dir); in get_disk_deps()
834 disk->has_dependencies = true; in get_disk_deps()
844 QAPI_LIST_PREPEND(disk->dependencies, dev_name); in get_disk_deps()
854 * @disk_name -- last component of /sys path (e.g. sda)
855 * @disk_dir -- sys path of the disk (e.g. /sys/block/sda)
856 * @disk_dev -- device node of the disk (e.g. /dev/sda)
874 if (!(de_disk->d_type & DT_DIR)) { in get_disk_partitions()
878 if (!(strncmp(disk_name, de_disk->d_name, len) == 0 && in get_disk_partitions()
879 ((*(de_disk->d_name + len) == 'p' && in get_disk_partitions()
880 isdigit(*(de_disk->d_name + len + 1))) || in get_disk_partitions()
881 isdigit(*(de_disk->d_name + len))))) { in get_disk_partitions()
886 disk_dir, de_disk->d_name); in get_disk_partitions()
889 g_debug("Failed to get device name for syspath: %s", in get_disk_partitions()
894 partition->name = dev_name; in get_disk_partitions()
895 partition->partition = true; in get_disk_partitions()
896 partition->has_dependencies = true; in get_disk_partitions()
897 /* Add parent disk as dependent for easier tracking of hierarchy */ in get_disk_partitions()
898 QAPI_LIST_PREPEND(partition->dependencies, g_strdup(disk_dev)); in get_disk_partitions()
907 static void get_nvme_smart(GuestDiskInfo *disk) in get_nvme_smart() argument
918 | (((sizeof(log) >> 2) - 1) << 16) in get_nvme_smart()
921 fd = qga_open_cloexec(disk->name, O_RDONLY, 0); in get_nvme_smart()
922 if (fd == -1) { in get_nvme_smart()
923 g_debug("Failed to open device: %s: %s", disk->name, g_strerror(errno)); in get_nvme_smart()
928 g_debug("Failed to get smart: %s: %s", disk->name, g_strerror(errno)); in get_nvme_smart()
933 disk->smart = g_new0(GuestDiskSmart, 1); in get_nvme_smart()
934 disk->smart->type = GUEST_DISK_BUS_TYPE_NVME; in get_nvme_smart()
936 smart = &disk->smart->u.nvme; in get_nvme_smart()
937 smart->critical_warning = log.critical_warning; in get_nvme_smart()
938 smart->temperature = lduw_le_p(&log.temperature); /* unaligned field */ in get_nvme_smart()
939 smart->available_spare = log.available_spare; in get_nvme_smart()
940 smart->available_spare_threshold = log.available_spare_threshold; in get_nvme_smart()
941 smart->percentage_used = log.percentage_used; in get_nvme_smart()
942 smart->data_units_read_lo = le64_to_cpu(log.data_units_read[0]); in get_nvme_smart()
943 smart->data_units_read_hi = le64_to_cpu(log.data_units_read[1]); in get_nvme_smart()
944 smart->data_units_written_lo = le64_to_cpu(log.data_units_written[0]); in get_nvme_smart()
945 smart->data_units_written_hi = le64_to_cpu(log.data_units_written[1]); in get_nvme_smart()
946 smart->host_read_commands_lo = le64_to_cpu(log.host_read_commands[0]); in get_nvme_smart()
947 smart->host_read_commands_hi = le64_to_cpu(log.host_read_commands[1]); in get_nvme_smart()
948 smart->host_write_commands_lo = le64_to_cpu(log.host_write_commands[0]); in get_nvme_smart()
949 smart->host_write_commands_hi = le64_to_cpu(log.host_write_commands[1]); in get_nvme_smart()
950 smart->controller_busy_time_lo = le64_to_cpu(log.controller_busy_time[0]); in get_nvme_smart()
951 smart->controller_busy_time_hi = le64_to_cpu(log.controller_busy_time[1]); in get_nvme_smart()
952 smart->power_cycles_lo = le64_to_cpu(log.power_cycles[0]); in get_nvme_smart()
953 smart->power_cycles_hi = le64_to_cpu(log.power_cycles[1]); in get_nvme_smart()
954 smart->power_on_hours_lo = le64_to_cpu(log.power_on_hours[0]); in get_nvme_smart()
955 smart->power_on_hours_hi = le64_to_cpu(log.power_on_hours[1]); in get_nvme_smart()
956 smart->unsafe_shutdowns_lo = le64_to_cpu(log.unsafe_shutdowns[0]); in get_nvme_smart()
957 smart->unsafe_shutdowns_hi = le64_to_cpu(log.unsafe_shutdowns[1]); in get_nvme_smart()
958 smart->media_errors_lo = le64_to_cpu(log.media_errors[0]); in get_nvme_smart()
959 smart->media_errors_hi = le64_to_cpu(log.media_errors[1]); in get_nvme_smart()
960 smart->number_of_error_log_entries_lo = in get_nvme_smart()
962 smart->number_of_error_log_entries_hi = in get_nvme_smart()
968 static void get_disk_smart(GuestDiskInfo *disk) in get_disk_smart() argument
970 if (disk->address in get_disk_smart()
971 && (disk->address->bus_type == GUEST_DISK_BUS_TYPE_NVME)) { in get_disk_smart()
972 get_nvme_smart(disk); in get_disk_smart()
979 GuestDiskInfo *disk; in qmp_guest_get_disks() local
994 if (de->d_type != DT_LNK) { in qmp_guest_get_disks()
995 g_debug(" skipping entry: %s", de->d_name); in qmp_guest_get_disks()
999 /* Check size and skip zero-sized disks */ in qmp_guest_get_disks()
1000 g_debug(" checking disk size"); in qmp_guest_get_disks()
1001 size_path = g_strdup_printf("/sys/block/%s/size", de->d_name); in qmp_guest_get_disks()
1003 g_debug(" failed to read disk size"); in qmp_guest_get_disks()
1007 g_debug(" skipping zero-sized disk"); in qmp_guest_get_disks()
1011 g_debug(" adding %s", de->d_name); in qmp_guest_get_disks()
1012 disk_dir = g_strdup_printf("/sys/block/%s", de->d_name); in qmp_guest_get_disks()
1015 g_debug("Failed to get device name for syspath: %s", in qmp_guest_get_disks()
1019 disk = g_new0(GuestDiskInfo, 1); in qmp_guest_get_disks()
1020 disk->name = dev_name; in qmp_guest_get_disks()
1021 disk->partition = false; in qmp_guest_get_disks()
1022 disk->alias = get_alias_for_syspath(disk_dir); in qmp_guest_get_disks()
1023 QAPI_LIST_PREPEND(ret, disk); in qmp_guest_get_disks()
1025 /* Get address for non-virtual devices */ in qmp_guest_get_disks()
1028 g_debug(" failed to check disk path, ignoring error: %s", in qmp_guest_get_disks()
1032 /* Don't try to get the address */ in qmp_guest_get_disks()
1036 disk->address = get_disk_address(disk_dir, &local_err); in qmp_guest_get_disks()
1038 g_debug(" failed to get device info, ignoring error: %s", in qmp_guest_get_disks()
1045 get_disk_deps(disk_dir, disk); in qmp_guest_get_disks()
1046 get_disk_smart(disk); in qmp_guest_get_disks()
1047 ret = get_disk_partitions(ret, de->d_name, disk_dir, dev_name); in qmp_guest_get_disks()
1057 /* Return a list of the disk device(s)' info which @mount lies on */
1065 mount->devmajor, mount->devminor); in build_guest_fsinfo()
1067 fs->mountpoint = g_strdup(mount->dirname); in build_guest_fsinfo()
1068 fs->type = g_strdup(mount->devtype); in build_guest_fsinfo()
1071 if (statvfs(fs->mountpoint, &buf) == 0) { in build_guest_fsinfo()
1073 used = buf.f_blocks - buf.f_bfree; in build_guest_fsinfo()
1075 fs->used_bytes = used * fr_size; in build_guest_fsinfo()
1076 fs->total_bytes = nonroot_total * fr_size; in build_guest_fsinfo()
1077 fs->total_bytes_privileged = buf.f_blocks * fr_size; in build_guest_fsinfo()
1079 fs->has_total_bytes = true; in build_guest_fsinfo()
1080 fs->has_total_bytes_privileged = true; in build_guest_fsinfo()
1081 fs->has_used_bytes = true; in build_guest_fsinfo()
1103 g_debug("Building guest fsinfo for '%s'", mount->dirname); in qmp_guest_get_fsinfo()
1134 slog("guest-fstrim called"); in qmp_guest_fstrim()
1145 result->path = g_strdup(mount->dirname); in qmp_guest_fstrim()
1147 QAPI_LIST_PREPEND(response->paths, result); in qmp_guest_fstrim()
1149 fd = qga_open_cloexec(mount->dirname, O_RDONLY, 0); in qmp_guest_fstrim()
1150 if (fd == -1) { in qmp_guest_fstrim()
1151 result->error = g_strdup_printf("failed to open: %s", in qmp_guest_fstrim()
1156 /* We try to cull filesystems we know won't work in advance, but other in qmp_guest_fstrim()
1159 * will be reported (e.g. CD-ROMs). in qmp_guest_fstrim()
1163 r.len = -1; in qmp_guest_fstrim()
1166 if (ret == -1) { in qmp_guest_fstrim()
1168 result->error = g_strdup("trim not supported"); in qmp_guest_fstrim()
1170 result->error = g_strdup_printf("failed to trim: %s", in qmp_guest_fstrim()
1177 result->has_minimum = true; in qmp_guest_fstrim()
1178 result->minimum = r.minlen; in qmp_guest_fstrim()
1179 result->has_trimmed = true; in qmp_guest_fstrim()
1180 result->trimmed = r.len; in qmp_guest_fstrim()
1204 * If the program wasn't found in path, returns -1.
1207 * returns -1 and errp is set.
1226 if (g_err && (g_err->code != G_SPAWN_ERROR_NOENT)) { in run_process_child()
1227 error_setg(errp, "failed to create child process, error '%s'", in run_process_child()
1228 g_err->message); in run_process_child()
1232 return -1; in run_process_child()
1237 const char *systemctl_args[3] = {"systemd-hibernate", "systemd-suspend", in systemd_supports_mode()
1238 "systemd-hybrid-sleep"}; in systemd_supports_mode()
1246 * status > 0 and be ok. To assert if the guest has support in systemd_supports_mode()
1247 * for the selected suspend mode, status should be < 4. 4 is in systemd_supports_mode()
1262 const char *systemctl_args[3] = {"hibernate", "suspend", "hybrid-sleep"}; in systemd_suspend()
1272 if ((status == -1) && !local_err) { in systemd_suspend()
1290 const char *pmutils_args[3] = {"--hibernate", "--suspend", in pmutils_supports_mode()
1291 "--suspend-hybrid"}; in pmutils_supports_mode()
1292 const char *cmd[3] = {"pm-is-supported", pmutils_args[mode], NULL}; in pmutils_supports_mode()
1301 if ((status == -1) && !local_err) { in pmutils_supports_mode()
1310 " status code (%d)", "pm-is-supported", status); in pmutils_supports_mode()
1319 const char *pmutils_binaries[3] = {"pm-hibernate", "pm-suspend", in pmutils_suspend()
1320 "pm-suspend-hybrid"}; in pmutils_suspend()
1330 if ((status == -1) && !local_err) { in pmutils_suspend()
1347 const char *sysfile_strs[3] = {"disk", "mem", NULL}; in linux_sys_state_supports_mode()
1354 error_setg(errp, "unknown guest suspend mode"); in linux_sys_state_supports_mode()
1363 ret = read(fd, buf, sizeof(buf) - 1); in linux_sys_state_supports_mode()
1379 const char *sysfile_strs[3] = {"disk", "mem", NULL}; in linux_sys_state_suspend()
1383 error_setg(errp, "unknown guest suspend mode"); in linux_sys_state_suspend()
1388 -1, &local_gerr)) { in linux_sys_state_suspend()
1389 error_setg(errp, "suspend: cannot write to '%s': %s", in linux_sys_state_suspend()
1390 LINUX_SYS_STATE_FILE, local_gerr->message); in linux_sys_state_suspend()
1432 "the requested suspend mode is not supported by the guest"); in guest_suspend()
1457 * In system-to-@vcpu direction, the following @vcpu fields are accessed:
1458 * - R: vcpu->logical_id
1459 * - W: vcpu->online
1460 * - W: vcpu->can_offline
1462 * In @vcpu-to-system direction, the following @vcpu fields are accessed:
1463 * - R: vcpu->logical_id
1464 * - R: vcpu->online
1477 if (dirfd == -1) { in transfer_vcpu()
1483 if (fd == -1) { in transfer_vcpu()
1487 vcpu->online = true; in transfer_vcpu()
1488 vcpu->can_offline = false; in transfer_vcpu()
1489 } else if (!vcpu->online) { in transfer_vcpu()
1491 "offlined", vcpu->logical_id); in transfer_vcpu()
1492 } /* otherwise pretend successful re-onlining */ in transfer_vcpu()
1497 if (res == -1) { in transfer_vcpu()
1503 vcpu->online = (status != '0'); in transfer_vcpu()
1504 vcpu->can_offline = true; in transfer_vcpu()
1505 } else if (vcpu->online != (status != '0')) { in transfer_vcpu()
1506 status = '0' + vcpu->online; in transfer_vcpu()
1507 if (pwrite(fd, &status, 1, 0) == -1) { in transfer_vcpu()
1511 } /* otherwise pretend successful re-(on|off)-lining */ in transfer_vcpu()
1534 error_setg_errno(errp, errno, "failed to list entries: %s", cpu_dir); in qmp_guest_get_vcpus()
1545 vcpu->logical_id = id; in qmp_guest_get_vcpus()
1546 vcpu->has_can_offline = true; /* lolspeak ftw */ in qmp_guest_get_vcpus()
1571 vcpus->value->logical_id); in qmp_guest_set_vcpus()
1573 transfer_vcpu(vcpus->value, false, path, &local_err); in qmp_guest_set_vcpus()
1579 vcpus = vcpus->next; in qmp_guest_set_vcpus()
1602 if (fd == -1) { in ga_read_sysfs_file()
1608 if (res == -1) { in ga_read_sysfs_file()
1623 if (fd == -1) { in ga_write_sysfs_file()
1628 if (pwrite(fd, buf, size, 0) == -1) { in ga_write_sysfs_file()
1639 * In system-to-@mem_blk direction, the following @mem_blk fields are accessed:
1640 * - R: mem_blk->phys_index
1641 * - W: mem_blk->online
1642 * - W: mem_blk->can_offline
1644 * In @mem_blk-to-system direction, the following @mem_blk fields are accessed:
1645 * - R: mem_blk->phys_index
1646 * - R: mem_blk->online
1647 *- R: mem_blk->can_offline
1674 result->response = in transfer_memory_block()
1683 mem_blk->phys_index); in transfer_memory_block()
1685 if (dirfd == -1) { in transfer_memory_block()
1690 result->response = GUEST_MEMORY_BLOCK_RESPONSE_TYPE_NOT_FOUND; in transfer_memory_block()
1692 result->response = in transfer_memory_block()
1708 mem_blk->online = true; in transfer_memory_block()
1709 mem_blk->can_offline = false; in transfer_memory_block()
1710 } else if (!mem_blk->online) { in transfer_memory_block()
1711 result->response = in transfer_memory_block()
1719 result->response = in transfer_memory_block()
1729 mem_blk->online = (strncmp(status, "online", 6) == 0); in transfer_memory_block()
1736 mem_blk->can_offline = false; in transfer_memory_block()
1741 mem_blk->can_offline = (removable != '0'); in transfer_memory_block()
1744 if (mem_blk->online != (strncmp(status, "online", 6) == 0)) { in transfer_memory_block()
1745 const char *new_state = mem_blk->online ? "online" : "offline"; in transfer_memory_block()
1751 result->response = in transfer_memory_block()
1756 result->response = GUEST_MEMORY_BLOCK_RESPONSE_TYPE_SUCCESS; in transfer_memory_block()
1757 result->has_error_code = false; in transfer_memory_block()
1758 } /* otherwise pretend successful re-(on|off)-lining */ in transfer_memory_block()
1769 result->has_error_code = true; in transfer_memory_block()
1770 result->error_code = errno; in transfer_memory_block()
1786 /* it's ok if this happens to be a system that doesn't expose in qmp_guest_get_memory_blocks()
1805 if ((strncmp(de->d_name, "memory", 6) != 0) || in qmp_guest_get_memory_blocks()
1806 !(de->d_type & DT_DIR)) { in qmp_guest_get_memory_blocks()
1812 mem_blk->phys_index = strtoul(&de->d_name[6], NULL, 10); in qmp_guest_get_memory_blocks()
1813 mem_blk->has_can_offline = true; /* lolspeak ftw */ in qmp_guest_get_memory_blocks()
1847 GuestMemoryBlock *current_mem_blk = mem_blks->value; in qmp_guest_set_memory_blocks()
1850 result->phys_index = current_mem_blk->phys_index; in qmp_guest_set_memory_blocks()
1857 mem_blks = mem_blks->next; in qmp_guest_set_memory_blocks()
1877 if (dirfd == -1) { in qmp_guest_get_memory_block_info()
1894 info->size = strtol(buf, NULL, 16); /* the unit is bytes */ in qmp_guest_get_memory_block_info()
1916 while (getline(&line, &n, fp) != -1) { in guest_get_diskstats()
1942 diskstatinfo->name = g_strdup(dev_name); in guest_get_diskstats()
1943 diskstatinfo->major = major; in guest_get_diskstats()
1944 diskstatinfo->minor = minor; in guest_get_diskstats()
1948 diskstat->has_read_ios = true; in guest_get_diskstats()
1949 diskstat->read_ios = rd_ios; in guest_get_diskstats()
1950 diskstat->has_read_sectors = true; in guest_get_diskstats()
1951 diskstat->read_sectors = rd_merges_or_rd_sec; in guest_get_diskstats()
1952 diskstat->has_write_ios = true; in guest_get_diskstats()
1953 diskstat->write_ios = rd_sec_or_wr_ios; in guest_get_diskstats()
1954 diskstat->has_write_sectors = true; in guest_get_diskstats()
1955 diskstat->write_sectors = rd_ticks_or_wr_sec; in guest_get_diskstats()
1958 diskstat->has_read_ios = true; in guest_get_diskstats()
1959 diskstat->read_ios = rd_ios; in guest_get_diskstats()
1960 diskstat->has_read_sectors = true; in guest_get_diskstats()
1961 diskstat->read_sectors = rd_sec_or_wr_ios; in guest_get_diskstats()
1962 diskstat->has_read_merges = true; in guest_get_diskstats()
1963 diskstat->read_merges = rd_merges_or_rd_sec; in guest_get_diskstats()
1964 diskstat->has_read_ticks = true; in guest_get_diskstats()
1965 diskstat->read_ticks = rd_ticks_or_wr_sec; in guest_get_diskstats()
1966 diskstat->has_write_ios = true; in guest_get_diskstats()
1967 diskstat->write_ios = wr_ios; in guest_get_diskstats()
1968 diskstat->has_write_sectors = true; in guest_get_diskstats()
1969 diskstat->write_sectors = wr_sec; in guest_get_diskstats()
1970 diskstat->has_write_merges = true; in guest_get_diskstats()
1971 diskstat->write_merges = wr_merges; in guest_get_diskstats()
1972 diskstat->has_write_ticks = true; in guest_get_diskstats()
1973 diskstat->write_ticks = wr_ticks; in guest_get_diskstats()
1974 diskstat->has_ios_pgr = true; in guest_get_diskstats()
1975 diskstat->ios_pgr = ios_pgr; in guest_get_diskstats()
1976 diskstat->has_total_ticks = true; in guest_get_diskstats()
1977 diskstat->total_ticks = tot_ticks; in guest_get_diskstats()
1978 diskstat->has_weight_ticks = true; in guest_get_diskstats()
1979 diskstat->weight_ticks = rq_ticks; in guest_get_diskstats()
1982 diskstat->has_discard_ios = true; in guest_get_diskstats()
1983 diskstat->discard_ios = dc_ios; in guest_get_diskstats()
1984 diskstat->has_discard_merges = true; in guest_get_diskstats()
1985 diskstat->discard_merges = dc_merges; in guest_get_diskstats()
1986 diskstat->has_discard_sectors = true; in guest_get_diskstats()
1987 diskstat->discard_sectors = dc_sec; in guest_get_diskstats()
1988 diskstat->has_discard_ticks = true; in guest_get_diskstats()
1989 diskstat->discard_ticks = dc_ticks; in guest_get_diskstats()
1992 diskstat->has_flush_ios = true; in guest_get_diskstats()
1993 diskstat->flush_ios = fl_ios; in guest_get_diskstats()
1994 diskstat->has_flush_ticks = true; in guest_get_diskstats()
1995 diskstat->flush_ticks = fl_ticks; in guest_get_diskstats()
1998 diskstatinfo->stats = g_steal_pointer(&diskstat); in guest_get_diskstats()
2027 while (getline(&line, &n, fp) != -1) { in qmp_guest_get_cpustats()
2050 cpustat->type = GUEST_CPU_STATS_TYPE_LINUX; in qmp_guest_get_cpustats()
2052 linuxcpustat = &cpustat->u.q_linux; in qmp_guest_get_cpustats()
2053 linuxcpustat->cpu = atoi(&name[3]); in qmp_guest_get_cpustats()
2054 linuxcpustat->user = user * 1000 / clk_tck; in qmp_guest_get_cpustats()
2055 linuxcpustat->nice = nice * 1000 / clk_tck; in qmp_guest_get_cpustats()
2056 linuxcpustat->system = system * 1000 / clk_tck; in qmp_guest_get_cpustats()
2057 linuxcpustat->idle = idle * 1000 / clk_tck; in qmp_guest_get_cpustats()
2060 linuxcpustat->has_iowait = true; in qmp_guest_get_cpustats()
2061 linuxcpustat->iowait = iowait * 1000 / clk_tck; in qmp_guest_get_cpustats()
2065 linuxcpustat->has_irq = true; in qmp_guest_get_cpustats()
2066 linuxcpustat->irq = irq * 1000 / clk_tck; in qmp_guest_get_cpustats()
2067 linuxcpustat->has_softirq = true; in qmp_guest_get_cpustats()
2068 linuxcpustat->softirq = softirq * 1000 / clk_tck; in qmp_guest_get_cpustats()
2072 linuxcpustat->has_steal = true; in qmp_guest_get_cpustats()
2073 linuxcpustat->steal = steal * 1000 / clk_tck; in qmp_guest_get_cpustats()
2077 linuxcpustat->has_guest = true; in qmp_guest_get_cpustats()
2078 linuxcpustat->guest = guest * 1000 / clk_tck; in qmp_guest_get_cpustats()
2082 linuxcpustat->has_guest = true; in qmp_guest_get_cpustats()
2083 linuxcpustat->guest = guest * 1000 / clk_tck; in qmp_guest_get_cpustats()
2084 linuxcpustat->has_guestnice = true; in qmp_guest_get_cpustats()
2085 linuxcpustat->guestnice = guest_nice * 1000 / clk_tck; in qmp_guest_get_cpustats()
2144 while (getline(&line, &n, fp) != -1) { in qmp_guest_network_get_route()
2161 route->destination = hex_to_ip_address(destination, 1); in qmp_guest_network_get_route()
2162 if (route->destination == NULL) { in qmp_guest_network_get_route()
2165 route->iface = g_strdup(iface); in qmp_guest_network_get_route()
2166 route->source = hex_to_ip_address(source, 1); in qmp_guest_network_get_route()
2167 route->nexthop = hex_to_ip_address(next_hop, 1); in qmp_guest_network_get_route()
2168 route->desprefixlen = g_strdup_printf("%d", des_prefixlen); in qmp_guest_network_get_route()
2169 route->srcprefixlen = g_strdup_printf("%d", src_prefixlen); in qmp_guest_network_get_route()
2170 route->metric = metric; in qmp_guest_network_get_route()
2171 route->has_flags = true; in qmp_guest_network_get_route()
2172 route->flags = flags; in qmp_guest_network_get_route()
2173 route->has_refcnt = true; in qmp_guest_network_get_route()
2174 route->refcnt = refcnt; in qmp_guest_network_get_route()
2175 route->has_use = true; in qmp_guest_network_get_route()
2176 route->use = use; in qmp_guest_network_get_route()
2177 route->version = 6; in qmp_guest_network_get_route()
2187 route->destination = hex_to_ip_address(&destination, 0); in qmp_guest_network_get_route()
2188 if (route->destination == NULL) { in qmp_guest_network_get_route()
2191 route->iface = g_strdup(iface); in qmp_guest_network_get_route()
2192 route->gateway = hex_to_ip_address(&gateway, 0); in qmp_guest_network_get_route()
2193 route->mask = hex_to_ip_address(&mask, 0); in qmp_guest_network_get_route()
2194 route->metric = metric; in qmp_guest_network_get_route()
2195 route->has_flags = true; in qmp_guest_network_get_route()
2196 route->flags = flags; in qmp_guest_network_get_route()
2197 route->has_refcnt = true; in qmp_guest_network_get_route()
2198 route->refcnt = refcnt; in qmp_guest_network_get_route()
2199 route->has_use = true; in qmp_guest_network_get_route()
2200 route->use = use; in qmp_guest_network_get_route()
2201 route->has_mtu = true; in qmp_guest_network_get_route()
2202 route->mtu = mtu; in qmp_guest_network_get_route()
2203 route->has_window = true; in qmp_guest_network_get_route()
2204 route->window = window; in qmp_guest_network_get_route()
2205 route->has_irtt = true; in qmp_guest_network_get_route()
2206 route->irtt = irtt; in qmp_guest_network_get_route()
2207 route->version = 4; in qmp_guest_network_get_route()