Check the kernel runtime pm status to see if a drive is sleeping before attempting the ata CHECK POWER command. --- src/udiskslinuxdriveata.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
diff --git a/src/udiskslinuxdriveata.c b/src/udiskslinuxdriveata.c index 1575b3d..6d42d48 100644 --- a/src/udiskslinuxdriveata.c +++ b/src/udiskslinuxdriveata.c @@ -427,6 +427,26 @@ selftest_status_to_string (SkSmartSelfTestExecutionStatus status) return ret; } +static gchar * +get_sysfs_attr (GUdevDevice *device, + const gchar *attr) +{ + gchar *filename; + gchar *value; + filename = g_strconcat (g_udev_device_get_sysfs_path (device), + "/", + attr, + NULL); + value = NULL; + /* don't care about errors */ + g_file_get_contents (filename, + &value, + NULL, + NULL); + g_free (filename); + return value; +} + static gboolean get_pm_state (UDisksLinuxDevice *device, GError **error, guchar *count) { int fd = open (g_udev_device_get_device_file (device->udev_device), O_RDONLY|O_NONBLOCK); @@ -434,7 +454,15 @@ static gboolean get_pm_state (UDisksLinuxDevice *device, GError **error, guchar /* ATA8: 7.8 CHECK POWER MODE - E5h, Non-Data */ UDisksAtaCommandInput input = {.command = 0xe5}; UDisksAtaCommandOutput output = {0}; + gchar *rt_status; + rt_status = get_sysfs_attr(device->udev_device, "device/power/runtime_status"); + if (rt_status && g_str_has_prefix (rt_status, "suspend")) + { + *count = 0; + rc = TRUE; + goto out; + } if (fd == -1) { g_set_error (error, UDISKS_ERROR, UDISKS_ERROR_FAILED, @@ -459,6 +487,8 @@ static gboolean get_pm_state (UDisksLinuxDevice *device, GError **error, guchar out: if (fd != -1) close(fd); + if (rt_status) + g_free (rt_status); return rc; } -- 1.8.3.2 _______________________________________________ devkit-devel mailing list devkit-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/devkit-devel