Loading drivers/acpi/scan.c +15 −34 Original line number Diff line number Diff line Loading @@ -287,6 +287,7 @@ static void acpi_bus_device_eject(void *context) struct acpi_device *device = NULL; struct acpi_scan_handler *handler; u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; int error; mutex_lock(&acpi_scan_lock); Loading @@ -301,17 +302,13 @@ static void acpi_bus_device_eject(void *context) } acpi_evaluate_hotplug_ost(handle, ACPI_NOTIFY_EJECT_REQUEST, ACPI_OST_SC_EJECT_IN_PROGRESS, NULL); if (handler->hotplug.mode == AHM_CONTAINER) { device->flags.eject_pending = true; if (handler->hotplug.mode == AHM_CONTAINER) kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE); } else { int error; get_device(&device->dev); error = acpi_scan_hot_remove(device); if (error) goto err_out; } out: mutex_unlock(&acpi_scan_lock); Loading Loading @@ -496,7 +493,6 @@ acpi_eject_store(struct device *d, struct device_attribute *attr, struct acpi_eject_event *ej_event; acpi_object_type not_used; acpi_status status; u32 ost_source; int ret; if (!count || buf[0] != '1') Loading @@ -510,43 +506,28 @@ acpi_eject_store(struct device *d, struct device_attribute *attr, if (ACPI_FAILURE(status) || !acpi_device->flags.ejectable) return -ENODEV; mutex_lock(&acpi_scan_lock); if (acpi_device->flags.eject_pending) { /* ACPI eject notification event. */ ost_source = ACPI_NOTIFY_EJECT_REQUEST; acpi_device->flags.eject_pending = 0; } else { /* Eject initiated by user space. */ ost_source = ACPI_OST_EC_OSPM_EJECT; } ej_event = kmalloc(sizeof(*ej_event), GFP_KERNEL); if (!ej_event) { ret = -ENOMEM; goto err_out; } acpi_evaluate_hotplug_ost(acpi_device->handle, ost_source, acpi_evaluate_hotplug_ost(acpi_device->handle, ACPI_OST_EC_OSPM_EJECT, ACPI_OST_SC_EJECT_IN_PROGRESS, NULL); ej_event->device = acpi_device; ej_event->event = ost_source; ej_event->event = ACPI_OST_EC_OSPM_EJECT; get_device(&acpi_device->dev); status = acpi_os_hotplug_execute(acpi_bus_hot_remove_device, ej_event); if (ACPI_FAILURE(status)) { if (ACPI_SUCCESS(status)) return count; put_device(&acpi_device->dev); kfree(ej_event); ret = status == AE_NO_MEMORY ? -ENOMEM : -EAGAIN; goto err_out; } ret = count; out: mutex_unlock(&acpi_scan_lock); return ret; err_out: acpi_evaluate_hotplug_ost(acpi_device->handle, ost_source, acpi_evaluate_hotplug_ost(acpi_device->handle, ACPI_OST_EC_OSPM_EJECT, ACPI_OST_SC_NON_SPECIFIC_FAILURE, NULL); goto out; return ret; } static DEVICE_ATTR(eject, 0200, NULL, acpi_eject_store); Loading drivers/base/core.c +28 −15 Original line number Diff line number Diff line Loading @@ -49,6 +49,28 @@ static struct kobject *dev_kobj; struct kobject *sysfs_dev_char_kobj; struct kobject *sysfs_dev_block_kobj; static DEFINE_MUTEX(device_hotplug_lock); void lock_device_hotplug(void) { mutex_lock(&device_hotplug_lock); } void unlock_device_hotplug(void) { mutex_unlock(&device_hotplug_lock); } int lock_device_hotplug_sysfs(void) { if (mutex_trylock(&device_hotplug_lock)) return 0; /* Avoid busy looping (5 ms of sleep should do). */ msleep(5); return restart_syscall(); } #ifdef CONFIG_BLOCK static inline int device_is_not_partition(struct device *dev) { Loading Loading @@ -408,9 +430,9 @@ static ssize_t show_online(struct device *dev, struct device_attribute *attr, { bool val; lock_device_hotplug(); device_lock(dev); val = !dev->offline; unlock_device_hotplug(); device_unlock(dev); return sprintf(buf, "%u\n", val); } Loading @@ -424,7 +446,10 @@ static ssize_t store_online(struct device *dev, struct device_attribute *attr, if (ret < 0) return ret; lock_device_hotplug(); ret = lock_device_hotplug_sysfs(); if (ret) return ret; ret = val ? device_online(dev) : device_offline(dev); unlock_device_hotplug(); return ret < 0 ? ret : count; Loading Loading @@ -1479,18 +1504,6 @@ EXPORT_SYMBOL_GPL(put_device); EXPORT_SYMBOL_GPL(device_create_file); EXPORT_SYMBOL_GPL(device_remove_file); static DEFINE_MUTEX(device_hotplug_lock); void lock_device_hotplug(void) { mutex_lock(&device_hotplug_lock); } void unlock_device_hotplug(void) { mutex_unlock(&device_hotplug_lock); } static int device_check_offline(struct device *dev, void *not_used) { int ret; Loading drivers/base/memory.c +3 −1 Original line number Diff line number Diff line Loading @@ -351,7 +351,9 @@ store_mem_state(struct device *dev, mem = container_of(dev, struct memory_block, dev); lock_device_hotplug(); ret = lock_device_hotplug_sysfs(); if (ret) return ret; if (!strncmp(buf, "online_kernel", min_t(int, count, 13))) { offline = false; Loading include/acpi/acpi_bus.h +1 −2 Original line number Diff line number Diff line Loading @@ -167,9 +167,8 @@ struct acpi_device_flags { u32 removable:1; u32 ejectable:1; u32 power_manageable:1; u32 eject_pending:1; u32 match_driver:1; u32 reserved:26; u32 reserved:27; }; /* File System */ Loading include/linux/device.h +1 −0 Original line number Diff line number Diff line Loading @@ -895,6 +895,7 @@ static inline bool device_supports_offline(struct device *dev) extern void lock_device_hotplug(void); extern void unlock_device_hotplug(void); extern int lock_device_hotplug_sysfs(void); extern int device_offline(struct device *dev); extern int device_online(struct device *dev); /* Loading Loading
drivers/acpi/scan.c +15 −34 Original line number Diff line number Diff line Loading @@ -287,6 +287,7 @@ static void acpi_bus_device_eject(void *context) struct acpi_device *device = NULL; struct acpi_scan_handler *handler; u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; int error; mutex_lock(&acpi_scan_lock); Loading @@ -301,17 +302,13 @@ static void acpi_bus_device_eject(void *context) } acpi_evaluate_hotplug_ost(handle, ACPI_NOTIFY_EJECT_REQUEST, ACPI_OST_SC_EJECT_IN_PROGRESS, NULL); if (handler->hotplug.mode == AHM_CONTAINER) { device->flags.eject_pending = true; if (handler->hotplug.mode == AHM_CONTAINER) kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE); } else { int error; get_device(&device->dev); error = acpi_scan_hot_remove(device); if (error) goto err_out; } out: mutex_unlock(&acpi_scan_lock); Loading Loading @@ -496,7 +493,6 @@ acpi_eject_store(struct device *d, struct device_attribute *attr, struct acpi_eject_event *ej_event; acpi_object_type not_used; acpi_status status; u32 ost_source; int ret; if (!count || buf[0] != '1') Loading @@ -510,43 +506,28 @@ acpi_eject_store(struct device *d, struct device_attribute *attr, if (ACPI_FAILURE(status) || !acpi_device->flags.ejectable) return -ENODEV; mutex_lock(&acpi_scan_lock); if (acpi_device->flags.eject_pending) { /* ACPI eject notification event. */ ost_source = ACPI_NOTIFY_EJECT_REQUEST; acpi_device->flags.eject_pending = 0; } else { /* Eject initiated by user space. */ ost_source = ACPI_OST_EC_OSPM_EJECT; } ej_event = kmalloc(sizeof(*ej_event), GFP_KERNEL); if (!ej_event) { ret = -ENOMEM; goto err_out; } acpi_evaluate_hotplug_ost(acpi_device->handle, ost_source, acpi_evaluate_hotplug_ost(acpi_device->handle, ACPI_OST_EC_OSPM_EJECT, ACPI_OST_SC_EJECT_IN_PROGRESS, NULL); ej_event->device = acpi_device; ej_event->event = ost_source; ej_event->event = ACPI_OST_EC_OSPM_EJECT; get_device(&acpi_device->dev); status = acpi_os_hotplug_execute(acpi_bus_hot_remove_device, ej_event); if (ACPI_FAILURE(status)) { if (ACPI_SUCCESS(status)) return count; put_device(&acpi_device->dev); kfree(ej_event); ret = status == AE_NO_MEMORY ? -ENOMEM : -EAGAIN; goto err_out; } ret = count; out: mutex_unlock(&acpi_scan_lock); return ret; err_out: acpi_evaluate_hotplug_ost(acpi_device->handle, ost_source, acpi_evaluate_hotplug_ost(acpi_device->handle, ACPI_OST_EC_OSPM_EJECT, ACPI_OST_SC_NON_SPECIFIC_FAILURE, NULL); goto out; return ret; } static DEVICE_ATTR(eject, 0200, NULL, acpi_eject_store); Loading
drivers/base/core.c +28 −15 Original line number Diff line number Diff line Loading @@ -49,6 +49,28 @@ static struct kobject *dev_kobj; struct kobject *sysfs_dev_char_kobj; struct kobject *sysfs_dev_block_kobj; static DEFINE_MUTEX(device_hotplug_lock); void lock_device_hotplug(void) { mutex_lock(&device_hotplug_lock); } void unlock_device_hotplug(void) { mutex_unlock(&device_hotplug_lock); } int lock_device_hotplug_sysfs(void) { if (mutex_trylock(&device_hotplug_lock)) return 0; /* Avoid busy looping (5 ms of sleep should do). */ msleep(5); return restart_syscall(); } #ifdef CONFIG_BLOCK static inline int device_is_not_partition(struct device *dev) { Loading Loading @@ -408,9 +430,9 @@ static ssize_t show_online(struct device *dev, struct device_attribute *attr, { bool val; lock_device_hotplug(); device_lock(dev); val = !dev->offline; unlock_device_hotplug(); device_unlock(dev); return sprintf(buf, "%u\n", val); } Loading @@ -424,7 +446,10 @@ static ssize_t store_online(struct device *dev, struct device_attribute *attr, if (ret < 0) return ret; lock_device_hotplug(); ret = lock_device_hotplug_sysfs(); if (ret) return ret; ret = val ? device_online(dev) : device_offline(dev); unlock_device_hotplug(); return ret < 0 ? ret : count; Loading Loading @@ -1479,18 +1504,6 @@ EXPORT_SYMBOL_GPL(put_device); EXPORT_SYMBOL_GPL(device_create_file); EXPORT_SYMBOL_GPL(device_remove_file); static DEFINE_MUTEX(device_hotplug_lock); void lock_device_hotplug(void) { mutex_lock(&device_hotplug_lock); } void unlock_device_hotplug(void) { mutex_unlock(&device_hotplug_lock); } static int device_check_offline(struct device *dev, void *not_used) { int ret; Loading
drivers/base/memory.c +3 −1 Original line number Diff line number Diff line Loading @@ -351,7 +351,9 @@ store_mem_state(struct device *dev, mem = container_of(dev, struct memory_block, dev); lock_device_hotplug(); ret = lock_device_hotplug_sysfs(); if (ret) return ret; if (!strncmp(buf, "online_kernel", min_t(int, count, 13))) { offline = false; Loading
include/acpi/acpi_bus.h +1 −2 Original line number Diff line number Diff line Loading @@ -167,9 +167,8 @@ struct acpi_device_flags { u32 removable:1; u32 ejectable:1; u32 power_manageable:1; u32 eject_pending:1; u32 match_driver:1; u32 reserved:26; u32 reserved:27; }; /* File System */ Loading
include/linux/device.h +1 −0 Original line number Diff line number Diff line Loading @@ -895,6 +895,7 @@ static inline bool device_supports_offline(struct device *dev) extern void lock_device_hotplug(void); extern void unlock_device_hotplug(void); extern int lock_device_hotplug_sysfs(void); extern int device_offline(struct device *dev); extern int device_online(struct device *dev); /* Loading