Commit ab69bcd6 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 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
  ...
parents c513b67e 6937e8f8
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -111,6 +111,7 @@ X!Edrivers/base/attribute_container.c
<!--
<!--
X!Edrivers/base/interface.c
X!Edrivers/base/interface.c
-->
-->
!Iinclude/linux/platform_device.h
!Edrivers/base/platform.c
!Edrivers/base/platform.c
!Edrivers/base/bus.c
!Edrivers/base/bus.c
     </sect1>
     </sect1>
+26 −20
Original line number Original line Diff line number Diff line
@@ -4,7 +4,7 @@ sysfs - _The_ filesystem for exporting kernel objects.
Patrick Mochel	<mochel@osdl.org>
Patrick Mochel	<mochel@osdl.org>
Mike Murphy <mamurph@cs.clemson.edu>
Mike Murphy <mamurph@cs.clemson.edu>


Revised:    22 February 2009
Revised:    15 July 2010
Original:   10 January 2003
Original:   10 January 2003




@@ -124,7 +124,7 @@ show and store methods of the attribute owners.


struct sysfs_ops {
struct sysfs_ops {
        ssize_t (*show)(struct kobject *, struct attribute *, char *);
        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
[ Subsystems should have already defined a struct kobj_type as a
@@ -139,18 +139,22 @@ calls the associated methods.


To illustrate:
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_attr(_attr) container_of(_attr, struct device_attribute, attr)
#define to_dev(d) container_of(d, struct device, kobj)


static ssize_t
static ssize_t dev_attr_show(struct kobject *kobj, struct attribute *attr,
dev_attr_show(struct kobject * kobj, struct attribute * attr, char * buf)
                             char *buf)
{
{
        struct device_attribute *dev_attr = to_dev_attr(attr);
        struct device_attribute *dev_attr = to_dev_attr(attr);
        struct device *dev = to_dev(kobj);
        struct device *dev = to_dev(kobj);
        ssize_t ret = 0;
        ssize_t ret = -EIO;


        if (dev_attr->show)
        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;
        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
specified when declaring the attribute. The method types should be as
simple as those defined for device attributes:
simple as those defined for device attributes:


ssize_t (*show)(struct device * dev, struct device_attribute * attr,
ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf);
                char * buf);
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
                 const char * buf);
                 const char *buf, size_t count);


IOW, they should take only an object, an attribute, and a buffer as parameters.
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(). 
- show() should always use snprintf(). 


- store() should return the number of bytes used from the buffer. This
- store() should return the number of bytes used from the buffer. If the
  can be done using strlen().
  entire buffer has been used, just return the count argument.


- show() or store() can always return errors. If a bad value comes
- show() or store() can always return errors. If a bad value comes
  through, be sure to return an error.
  through, be sure to return an error.
@@ -223,15 +226,18 @@ Other notes:


A very simple (and naive) implementation of a device attribute is:
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);
	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);
        snprintf(dev->name, sizeof(dev->name), "%.*s",
	return strnlen(buf, PAGE_SIZE);
                 (int)min(count, sizeof(dev->name) - 1), buf);
	return count;
}
}


static DEVICE_ATTR(name, S_IRUGO, show_name, store_name);
static DEVICE_ATTR(name, S_IRUGO, show_name, store_name);
@@ -327,7 +333,7 @@ Structure:
struct bus_attribute {
struct bus_attribute {
        struct attribute        attr;
        struct attribute        attr;
        ssize_t (*show)(struct bus_type *, char * buf);
        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:
Declaring:
+9 −8
Original line number Original line Diff line number Diff line
@@ -6,11 +6,12 @@


HOTPLUG_FW_DIR=/usr/lib/hotplug/firmware/
HOTPLUG_FW_DIR=/usr/lib/hotplug/firmware/


if [ "$SUBSYSTEM" == "firmware" -a "$ACTION" == "add" ]; then
  if [ -f $HOTPLUG_FW_DIR/$FIRMWARE ]; then
    echo 1 > /sys/$DEVPATH/loading
    echo 1 > /sys/$DEVPATH/loading
    cat $HOTPLUG_FW_DIR/$FIRMWARE > /sys/$DEVPATH/data
    cat $HOTPLUG_FW_DIR/$FIRMWARE > /sys/$DEVPATH/data
    echo 0 > /sys/$DEVPATH/loading
    echo 0 > /sys/$DEVPATH/loading

  else
# To cancel the load in case of error:
    echo -1 > /sys/$DEVPATH/loading
#
  fi
#	echo -1 > /sys/$DEVPATH/loading
fi
#
+0 −1
Original line number Original line Diff line number Diff line
@@ -73,7 +73,6 @@ static struct bin_attribute mv64x60_hs_reg_attr = { /* Hotswap register */
	.attr = {
	.attr = {
		.name = "hs_reg",
		.name = "hs_reg",
		.mode = S_IRUGO | S_IWUSR,
		.mode = S_IRUGO | S_IWUSR,
		.owner = THIS_MODULE,
	},
	},
	.size  = MV64X60_VAL_LEN_MAX,
	.size  = MV64X60_VAL_LEN_MAX,
	.read  = mv64x60_hs_reg_read,
	.read  = mv64x60_hs_reg_read,
+1 −1
Original line number Original line Diff line number Diff line
@@ -945,8 +945,8 @@ int bus_register(struct bus_type *bus)
	bus_remove_file(bus, &bus_attr_uevent);
	bus_remove_file(bus, &bus_attr_uevent);
bus_uevent_fail:
bus_uevent_fail:
	kset_unregister(&bus->p->subsys);
	kset_unregister(&bus->p->subsys);
	kfree(bus->p);
out:
out:
	kfree(bus->p);
	bus->p = NULL;
	bus->p = NULL;
	return retval;
	return retval;
}
}
Loading