Merge branch 'acpi-pm'
* acpi-pm: (35 commits) ACPI / PM: Handle missing _PSC in acpi_bus_update_power() ACPI / PM: Do not power manage devices in unknown initial states ACPI / PM: Fix acpi_bus_get_device() check in drivers/acpi/device_pm.c ACPI / PM: Fix /proc/acpi/wakeup for devices w/o bus or parent ACPI / PM: Fix consistency check for power resources during resume ACPI / PM: Expose lists of device power resources to user space sysfs: Functions for adding/removing symlinks to/from attribute groups ACPI / PM: Expose current status of ACPI power resources ACPI / PM: Expose power states of ACPI devices to user space ACPI / scan: Prevent device add uevents from racing with user space ACPI / PM: Fix device power state value after transitions to D3cold ACPI / PM: Use string "D3cold" to represent ACPI_STATE_D3_COLD ACPI / PM: Sanitize checks in acpi_power_on_resources() ACPI / PM: Always evaluate _PSn after setting power resources ACPI / PM: Introduce helper for executing _PSn methods ACPI / PM: Make acpi_bus_init_power() more robust ACPI / PM: Fix build for unusual combination of Kconfig options ACPI / PM: remove leading whitespace from #ifdef ACPI / PM: Consolidate suspend-specific and hibernate-specific code ACPI / PM: Move device power management functions to device_pm.c ...
This commit is contained in:
@@ -205,6 +205,48 @@ void sysfs_unmerge_group(struct kobject *kobj,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sysfs_unmerge_group);
|
||||
|
||||
/**
|
||||
* sysfs_add_link_to_group - add a symlink to an attribute group.
|
||||
* @kobj: The kobject containing the group.
|
||||
* @group_name: The name of the group.
|
||||
* @target: The target kobject of the symlink to create.
|
||||
* @link_name: The name of the symlink to create.
|
||||
*/
|
||||
int sysfs_add_link_to_group(struct kobject *kobj, const char *group_name,
|
||||
struct kobject *target, const char *link_name)
|
||||
{
|
||||
struct sysfs_dirent *dir_sd;
|
||||
int error = 0;
|
||||
|
||||
dir_sd = sysfs_get_dirent(kobj->sd, NULL, group_name);
|
||||
if (!dir_sd)
|
||||
return -ENOENT;
|
||||
|
||||
error = sysfs_create_link_sd(dir_sd, target, link_name);
|
||||
sysfs_put(dir_sd);
|
||||
|
||||
return error;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sysfs_add_link_to_group);
|
||||
|
||||
/**
|
||||
* sysfs_remove_link_from_group - remove a symlink from an attribute group.
|
||||
* @kobj: The kobject containing the group.
|
||||
* @group_name: The name of the group.
|
||||
* @link_name: The name of the symlink to remove.
|
||||
*/
|
||||
void sysfs_remove_link_from_group(struct kobject *kobj, const char *group_name,
|
||||
const char *link_name)
|
||||
{
|
||||
struct sysfs_dirent *dir_sd;
|
||||
|
||||
dir_sd = sysfs_get_dirent(kobj->sd, NULL, group_name);
|
||||
if (dir_sd) {
|
||||
sysfs_hash_and_remove(dir_sd, NULL, link_name);
|
||||
sysfs_put(dir_sd);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sysfs_remove_link_from_group);
|
||||
|
||||
EXPORT_SYMBOL_GPL(sysfs_create_group);
|
||||
EXPORT_SYMBOL_GPL(sysfs_update_group);
|
||||
|
@@ -21,26 +21,17 @@
|
||||
|
||||
#include "sysfs.h"
|
||||
|
||||
static int sysfs_do_create_link(struct kobject *kobj, struct kobject *target,
|
||||
const char *name, int warn)
|
||||
static int sysfs_do_create_link_sd(struct sysfs_dirent *parent_sd,
|
||||
struct kobject *target,
|
||||
const char *name, int warn)
|
||||
{
|
||||
struct sysfs_dirent *parent_sd = NULL;
|
||||
struct sysfs_dirent *target_sd = NULL;
|
||||
struct sysfs_dirent *sd = NULL;
|
||||
struct sysfs_addrm_cxt acxt;
|
||||
enum kobj_ns_type ns_type;
|
||||
int error;
|
||||
|
||||
BUG_ON(!name);
|
||||
|
||||
if (!kobj)
|
||||
parent_sd = &sysfs_root;
|
||||
else
|
||||
parent_sd = kobj->sd;
|
||||
|
||||
error = -EFAULT;
|
||||
if (!parent_sd)
|
||||
goto out_put;
|
||||
BUG_ON(!name || !parent_sd);
|
||||
|
||||
/* target->sd can go away beneath us but is protected with
|
||||
* sysfs_assoc_lock. Fetch target_sd from it.
|
||||
@@ -95,6 +86,34 @@ static int sysfs_do_create_link(struct kobject *kobj, struct kobject *target,
|
||||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
* sysfs_create_link_sd - create symlink to a given object.
|
||||
* @sd: directory we're creating the link in.
|
||||
* @target: object we're pointing to.
|
||||
* @name: name of the symlink.
|
||||
*/
|
||||
int sysfs_create_link_sd(struct sysfs_dirent *sd, struct kobject *target,
|
||||
const char *name)
|
||||
{
|
||||
return sysfs_do_create_link_sd(sd, target, name, 1);
|
||||
}
|
||||
|
||||
static int sysfs_do_create_link(struct kobject *kobj, struct kobject *target,
|
||||
const char *name, int warn)
|
||||
{
|
||||
struct sysfs_dirent *parent_sd = NULL;
|
||||
|
||||
if (!kobj)
|
||||
parent_sd = &sysfs_root;
|
||||
else
|
||||
parent_sd = kobj->sd;
|
||||
|
||||
if (!parent_sd)
|
||||
return -EFAULT;
|
||||
|
||||
return sysfs_do_create_link_sd(parent_sd, target, name, warn);
|
||||
}
|
||||
|
||||
/**
|
||||
* sysfs_create_link - create symlink between two objects.
|
||||
* @kobj: object whose directory we're creating the link in.
|
||||
|
@@ -240,3 +240,5 @@ void unmap_bin_file(struct sysfs_dirent *attr_sd);
|
||||
* symlink.c
|
||||
*/
|
||||
extern const struct inode_operations sysfs_symlink_inode_operations;
|
||||
int sysfs_create_link_sd(struct sysfs_dirent *sd, struct kobject *target,
|
||||
const char *name);
|
||||
|
Reference in New Issue
Block a user