forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-cor…
…e-2.6 * git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6: (28 commits) driver core: device_rename's new_name can be const sysfs: Remove owner field from sysfs struct attribute powerpc/pci: Remove owner field from attribute initialization in PCI bridge init regulator: Remove owner field from attribute initialization in regulator core driver leds: Remove owner field from attribute initialization in bd2802 driver scsi: Remove owner field from attribute initialization in ARCMSR driver scsi: Remove owner field from attribute initialization in LPFC driver cgroupfs: create /sys/fs/cgroup to mount cgroupfs on Driver core: Add BUS_NOTIFY_BIND_DRIVER driver core: fix memory leak on one error path in bus_register() debugfs: no longer needs to depend on SYSFS sysfs: Fix one more signature discrepancy between sysfs implementation and docs. sysfs: fix discrepancies between implementation and documentation dcdbas: remove a redundant smi_data_buf_free in dcdbas_exit dmi-id: fix a memory leak in dmi_id_init error path sysfs: sysfs_chmod_file's attr can be const firmware: Update hotplug script Driver core: move platform device creation helpers to .init.text (if MODULE=n) Driver core: reduce duplicated code for platform_device creation Driver core: use kmemdup in platform_device_add_resources ...
- Loading branch information
Showing
26 changed files
with
288 additions
and
290 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,7 +4,7 @@ sysfs - _The_ filesystem for exporting kernel objects. | |
Patrick Mochel <[email protected]> | ||
Mike Murphy <[email protected]> | ||
|
||
Revised: 22 February 2009 | ||
Revised: 15 July 2010 | ||
Original: 10 January 2003 | ||
|
||
|
||
|
@@ -124,7 +124,7 @@ show and store methods of the attribute owners. | |
|
||
struct sysfs_ops { | ||
ssize_t (*show)(struct kobject *, struct attribute *, char *); | ||
ssize_t (*store)(struct kobject *, struct attribute *, const char *); | ||
ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t); | ||
}; | ||
|
||
[ Subsystems should have already defined a struct kobj_type as a | ||
|
@@ -139,18 +139,22 @@ calls the associated methods. | |
|
||
To illustrate: | ||
|
||
#define to_dev(obj) container_of(obj, struct device, kobj) | ||
#define to_dev_attr(_attr) container_of(_attr, struct device_attribute, attr) | ||
#define to_dev(d) container_of(d, struct device, kobj) | ||
|
||
static ssize_t | ||
dev_attr_show(struct kobject * kobj, struct attribute * attr, char * buf) | ||
static ssize_t dev_attr_show(struct kobject *kobj, struct attribute *attr, | ||
char *buf) | ||
{ | ||
struct device_attribute * dev_attr = to_dev_attr(attr); | ||
struct device * dev = to_dev(kobj); | ||
ssize_t ret = 0; | ||
struct device_attribute *dev_attr = to_dev_attr(attr); | ||
struct device *dev = to_dev(kobj); | ||
ssize_t ret = -EIO; | ||
|
||
if (dev_attr->show) | ||
ret = dev_attr->show(dev, buf); | ||
ret = dev_attr->show(dev, dev_attr, buf); | ||
if (ret >= (ssize_t)PAGE_SIZE) { | ||
print_symbol("dev_attr_show: %s returned bad count\n", | ||
(unsigned long)dev_attr->show); | ||
} | ||
return ret; | ||
} | ||
|
||
|
@@ -163,10 +167,9 @@ To read or write attributes, show() or store() methods must be | |
specified when declaring the attribute. The method types should be as | ||
simple as those defined for device attributes: | ||
|
||
ssize_t (*show)(struct device * dev, struct device_attribute * attr, | ||
char * buf); | ||
ssize_t (*store)(struct device * dev, struct device_attribute * attr, | ||
const char * buf); | ||
ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf); | ||
ssize_t (*store)(struct device *dev, struct device_attribute *attr, | ||
const char *buf, size_t count); | ||
|
||
IOW, they should take only an object, an attribute, and a buffer as parameters. | ||
|
||
|
@@ -209,8 +212,8 @@ Other notes: | |
|
||
- show() should always use snprintf(). | ||
|
||
- store() should return the number of bytes used from the buffer. This | ||
can be done using strlen(). | ||
- store() should return the number of bytes used from the buffer. If the | ||
entire buffer has been used, just return the count argument. | ||
|
||
- show() or store() can always return errors. If a bad value comes | ||
through, be sure to return an error. | ||
|
@@ -223,15 +226,18 @@ Other notes: | |
|
||
A very simple (and naive) implementation of a device attribute is: | ||
|
||
static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf) | ||
static ssize_t show_name(struct device *dev, struct device_attribute *attr, | ||
char *buf) | ||
{ | ||
return snprintf(buf, PAGE_SIZE, "%s\n", dev->name); | ||
} | ||
|
||
static ssize_t store_name(struct device * dev, const char * buf) | ||
static ssize_t store_name(struct device *dev, struct device_attribute *attr, | ||
const char *buf, size_t count) | ||
{ | ||
sscanf(buf, "%20s", dev->name); | ||
return strnlen(buf, PAGE_SIZE); | ||
snprintf(dev->name, sizeof(dev->name), "%.*s", | ||
(int)min(count, sizeof(dev->name) - 1), buf); | ||
return count; | ||
} | ||
|
||
static DEVICE_ATTR(name, S_IRUGO, show_name, store_name); | ||
|
@@ -327,7 +333,7 @@ Structure: | |
struct bus_attribute { | ||
struct attribute attr; | ||
ssize_t (*show)(struct bus_type *, char * buf); | ||
ssize_t (*store)(struct bus_type *, const char * buf); | ||
ssize_t (*store)(struct bus_type *, const char * buf, size_t count); | ||
}; | ||
|
||
Declaring: | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.