Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 8 Mar 2010 18:17:20 +0000 (10:17 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 8 Mar 2010 18:17:20 +0000 (10:17 -0800)
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6: (62 commits)
  msi-laptop: depends on RFKILL
  msi-laptop: Detect 3G device exists by standard ec command
  msi-laptop: Add resume method for set the SCM load again
  msi-laptop: Support some MSI 3G netbook that is need load SCM
  msi-laptop: Add threeg sysfs file for support query 3G state by standard 66/62 ec command
  msi-laptop: Support standard ec 66/62 command on MSI notebook and nebook
  Driver core: create lock/unlock functions for struct device
  sysfs: fix for thinko with sysfs_bin_attr_init()
  sysfs: Kill unused sysfs_sb variable.
  sysfs: Pass super_block to sysfs_get_inode
  driver core: Use sysfs_rename_link in device_rename
  sysfs: Implement sysfs_rename_link
  sysfs: Pack sysfs_dirent more tightly.
  sysfs: Serialize updates to the vfs inode
  sysfs: windfarm: init sysfs attributes
  sysfs: Use sysfs_attr_init and sysfs_bin_attr_init on module dynamic attributes
  sysfs: Document sysfs_attr_init and sysfs_bin_attr_init
  sysfs: Use sysfs_attr_init and sysfs_bin_attr_init on dynamic attributes
  sysfs: Use one lockdep class per sysfs attribute.
  sysfs: Only take active references on attributes.
  ...

145 files changed:
Documentation/HOWTO
Documentation/kobject.txt
arch/arm/mach-pxa/corgi_ssp.c
arch/arm/mach-pxa/sharpsl_pm.c
arch/arm/mach-s3c2410/h1940-bluetooth.c
arch/arm/mach-sa1100/jornada720_ssp.c
arch/ia64/kernel/topology.c
arch/mips/txx9/generic/7segled.c
arch/powerpc/kernel/cacheinfo.c
arch/s390/kernel/smp.c
arch/s390/kernel/time.c
arch/sh/kernel/cpu/sh4/sq.c
arch/x86/kernel/cpu/intel_cacheinfo.c
arch/x86/kernel/cpu/mcheck/mce.c
arch/x86/kernel/cpu/mcheck/mce_amd.c
block/blk-integrity.c
block/blk-sysfs.c
block/elevator.c
drivers/acpi/system.c
drivers/auxdisplay/cfag12864bfb.c
drivers/base/Kconfig
drivers/base/bus.c
drivers/base/class.c
drivers/base/core.c
drivers/base/cpu.c
drivers/base/dd.c
drivers/base/devtmpfs.c
drivers/base/firmware_class.c
drivers/base/memory.c
drivers/base/node.c
drivers/base/platform.c
drivers/base/power/main.c
drivers/base/sys.c
drivers/block/osdblk.c
drivers/block/pktcdvd.c
drivers/cpufreq/cpufreq.c
drivers/cpuidle/sysfs.c
drivers/dma/ioat/dma.c
drivers/dma/ioat/dma.h
drivers/edac/edac_device_sysfs.c
drivers/edac/edac_mc_sysfs.c
drivers/edac/edac_pci_sysfs.c
drivers/firewire/core-device.c
drivers/firmware/edd.c
drivers/firmware/efivars.c
drivers/firmware/iscsi_ibft.c
drivers/firmware/memmap.c
drivers/gpio/gpiolib.c
drivers/gpu/drm/drm_sysfs.c
drivers/gpu/drm/ttm/ttm_bo.c
drivers/gpu/drm/ttm/ttm_memory.c
drivers/i2c/busses/i2c-omap.c
drivers/ieee1394/nodemgr.c
drivers/infiniband/core/cm.c
drivers/infiniband/core/sysfs.c
drivers/infiniband/core/ucm.c
drivers/infiniband/core/user_mad.c
drivers/infiniband/core/uverbs_main.c
drivers/macintosh/windfarm_core.c
drivers/macintosh/windfarm_smu_controls.c
drivers/md/dm-sysfs.c
drivers/md/md.c
drivers/media/video/omap24xxcam.c
drivers/misc/phantom.c
drivers/mtd/ubi/build.c
drivers/net/bonding/bond_sysfs.c
drivers/net/ibmveth.c
drivers/net/iseries_veth.c
drivers/parisc/pdc_stable.c
drivers/pci/bus.c
drivers/pci/hotplug/fakephp.c
drivers/pci/pci-sysfs.c
drivers/pci/pci.c
drivers/pci/slot.c
drivers/pcmcia/ds.c
drivers/platform/x86/Kconfig
drivers/platform/x86/hp-wmi.c
drivers/platform/x86/msi-laptop.c
drivers/scsi/sgiwd93.c
drivers/scsi/sni_53c710.c
drivers/staging/asus_oled/asus_oled.c
drivers/uio/Kconfig
drivers/uio/Makefile
drivers/uio/uio.c
drivers/uio/uio_netx.c [new file with mode: 0644]
drivers/uio/uio_smx.c [deleted file]
drivers/usb/core/driver.c
drivers/uwb/driver.c
drivers/uwb/umc-bus.c
drivers/uwb/uwb-internal.h
drivers/uwb/wlp/sysfs.c
drivers/video/acornfb.c
drivers/video/arcfb.c
drivers/video/cobalt_lcdfb.c
drivers/video/efifb.c
drivers/video/epson1355fb.c
drivers/video/gbefb.c
drivers/video/hgafb.c
drivers/video/hitfb.c
drivers/video/omap2/dss/manager.c
drivers/video/omap2/dss/overlay.c
drivers/video/q40fb.c
drivers/video/s3c2410fb.c
drivers/video/sa1100fb.c
drivers/video/sgivwfb.c
drivers/video/sh_mobile_lcdcfb.c
drivers/video/vesafb.c
drivers/video/vfb.c
drivers/video/vga16fb.c
drivers/video/w100fb.c
drivers/w1/masters/omap_hdq.c
drivers/xen/sys-hypervisor.c
fs/btrfs/sysfs.c
fs/dlm/lockspace.c
fs/ext4/super.c
fs/gfs2/sys.c
fs/ocfs2/cluster/masklog.c
fs/sysfs/bin.c
fs/sysfs/dir.c
fs/sysfs/file.c
fs/sysfs/inode.c
fs/sysfs/mount.c
fs/sysfs/symlink.c
fs/sysfs/sysfs.h
include/linux/device.h
include/linux/kobject.h
include/linux/platform_device.h
include/linux/sysdev.h
include/linux/sysfs.h
include/linux/usb.h
kernel/module.c
kernel/params.c
kernel/perf_event.c
kernel/sched.c
lib/kobject.c
lib/kobject_uevent.c
mm/slub.c
net/bluetooth/l2cap.c
net/bluetooth/rfcomm/core.c
net/bluetooth/rfcomm/sock.c
net/bluetooth/sco.c
net/bridge/br_private.h
net/bridge/br_sysfs_if.c
samples/kobject/kobject-example.c
samples/kobject/kset-example.c

index 8495fc9..f5395af 100644 (file)
@@ -221,8 +221,8 @@ branches.  These different branches are:
   - main 2.6.x kernel tree
   - 2.6.x.y -stable kernel tree
   - 2.6.x -git kernel patches
-  - 2.6.x -mm kernel patches
   - subsystem specific kernel trees and patches
+  - the 2.6.x -next kernel tree for integration tests
 
 2.6.x kernel tree
 -----------------
@@ -232,7 +232,7 @@ process is as follows:
   - As soon as a new kernel is released a two weeks window is open,
     during this period of time maintainers can submit big diffs to
     Linus, usually the patches that have already been included in the
-    -mm kernel for a few weeks.  The preferred way to submit big changes
+    -next kernel for a few weeks.  The preferred way to submit big changes
     is using git (the kernel's source management tool, more information
     can be found at http://git.or.cz/) but plain patches are also just
     fine.
@@ -293,84 +293,43 @@ daily and represent the current state of Linus' tree.  They are more
 experimental than -rc kernels since they are generated automatically
 without even a cursory glance to see if they are sane.
 
-2.6.x -mm kernel patches
-------------------------
-These are experimental kernel patches released by Andrew Morton.  Andrew
-takes all of the different subsystem kernel trees and patches and mushes
-them together, along with a lot of patches that have been plucked from
-the linux-kernel mailing list.  This tree serves as a proving ground for
-new features and patches.  Once a patch has proved its worth in -mm for
-a while Andrew or the subsystem maintainer pushes it on to Linus for
-inclusion in mainline.
-
-It is heavily encouraged that all new patches get tested in the -mm tree
-before they are sent to Linus for inclusion in the main kernel tree.  Code
-which does not make an appearance in -mm before the opening of the merge
-window will prove hard to merge into the mainline.
-
-These kernels are not appropriate for use on systems that are supposed
-to be stable and they are more risky to run than any of the other
-branches.
-
-If you wish to help out with the kernel development process, please test
-and use these kernel releases and provide feedback to the linux-kernel
-mailing list if you have any problems, and if everything works properly.
-
-In addition to all the other experimental patches, these kernels usually
-also contain any changes in the mainline -git kernels available at the
-time of release.
-
-The -mm kernels are not released on a fixed schedule, but usually a few
--mm kernels are released in between each -rc kernel (1 to 3 is common).
-
 Subsystem Specific kernel trees and patches
 -------------------------------------------
-A number of the different kernel subsystem developers expose their
-development trees so that others can see what is happening in the
-different areas of the kernel.  These trees are pulled into the -mm
-kernel releases as described above.
-
-Here is a list of some of the different kernel trees available:
-  git trees:
-    - Kbuild development tree, Sam Ravnborg <sam@ravnborg.org>
-       git.kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
-
-    - ACPI development tree, Len Brown <len.brown@intel.com>
-       git.kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
-
-    - Block development tree, Jens Axboe <jens.axboe@oracle.com>
-       git.kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
-
-    - DRM development tree, Dave Airlie <airlied@linux.ie>
-       git.kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git
-
-    - ia64 development tree, Tony Luck <tony.luck@intel.com>
-       git.kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
-
-    - infiniband, Roland Dreier <rolandd@cisco.com>
-       git.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
-
-    - libata, Jeff Garzik <jgarzik@pobox.com>
-       git.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
-
-    - network drivers, Jeff Garzik <jgarzik@pobox.com>
-       git.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git
-
-    - pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
-       git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
-
-    - SCSI, James Bottomley <James.Bottomley@hansenpartnership.com>
-       git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
-
-    - x86, Ingo Molnar <mingo@elte.hu>
-       git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
-
-  quilt trees:
-    - USB, Driver Core, and I2C, Greg Kroah-Hartman <gregkh@suse.de>
-       kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
+The maintainers of the various kernel subsystems --- and also many
+kernel subsystem developers --- expose their current state of
+development in source repositories.  That way, others can see what is
+happening in the different areas of the kernel.  In areas where
+development is rapid, a developer may be asked to base his submissions
+onto such a subsystem kernel tree so that conflicts between the
+submission and other already ongoing work are avoided.
+
+Most of these repositories are git trees, but there are also other SCMs
+in use, or patch queues being published as quilt series.  Addresses of
+these subsystem repositories are listed in the MAINTAINERS file.  Many
+of them can be browsed at http://git.kernel.org/.
+
+Before a proposed patch is committed to such a subsystem tree, it is
+subject to review which primarily happens on mailing lists (see the
+respective section below).  For several kernel subsystems, this review
+process is tracked with the tool patchwork.  Patchwork offers a web
+interface which shows patch postings, any comments on a patch or
+revisions to it, and maintainers can mark patches as under review,
+accepted, or rejected.  Most of these patchwork sites are listed at
+http://patchwork.kernel.org/ or http://patchwork.ozlabs.org/.
+
+2.6.x -next kernel tree for integration tests
+---------------------------------------------
+Before updates from subsystem trees are merged into the mainline 2.6.x
+tree, they need to be integration-tested.  For this purpose, a special
+testing repository exists into which virtually all subsystem trees are
+pulled on an almost daily basis:
+       http://git.kernel.org/?p=linux/kernel/git/sfr/linux-next.git
+       http://linux.f-seidel.de/linux-next/pmwiki/
+
+This way, the -next kernel gives a summary outlook onto what will be
+expected to go into the mainline kernel at the next merge period.
+Adventurous testers are very welcome to runtime-test the -next kernel.
 
-  Other kernel trees can be found listed at http://git.kernel.org/ and in
-  the MAINTAINERS file.
 
 Bug Reporting
 -------------
index c79ab99..bdb1381 100644 (file)
@@ -266,7 +266,7 @@ kobj_type:
 
     struct kobj_type {
            void (*release)(struct kobject *);
-           struct sysfs_ops    *sysfs_ops;
+           const struct sysfs_ops *sysfs_ops;
            struct attribute    **default_attrs;
     };
 
index a5ee707..1d9bc11 100644 (file)
@@ -204,7 +204,7 @@ void __init corgi_ssp_set_machinfo(struct corgissp_machinfo *machinfo)
        ssp_machinfo = machinfo;
 }
 
-static int __init corgi_ssp_probe(struct platform_device *dev)
+static int __devinit corgi_ssp_probe(struct platform_device *dev)
 {
        int ret;
 
index 67229a1..463d874 100644 (file)
@@ -900,7 +900,7 @@ static struct platform_suspend_ops sharpsl_pm_ops = {
 };
 #endif
 
-static int __init sharpsl_pm_probe(struct platform_device *pdev)
+static int __devinit sharpsl_pm_probe(struct platform_device *pdev)
 {
        int ret;
 
index b7d1f8d..a3f3c7b 100644 (file)
@@ -56,7 +56,7 @@ static const struct rfkill_ops h1940bt_rfkill_ops = {
        .set_block = h1940bt_set_block,
 };
 
-static int __init h1940bt_probe(struct platform_device *pdev)
+static int __devinit h1940bt_probe(struct platform_device *pdev)
 {
        struct rfkill *rfk;
        int ret = 0;
index 506a5e5..9b6dee5 100644 (file)
@@ -130,7 +130,7 @@ void jornada_ssp_end(void)
 };
 EXPORT_SYMBOL(jornada_ssp_end);
 
-static int __init jornada_ssp_probe(struct platform_device *dev)
+static int __devinit jornada_ssp_probe(struct platform_device *dev)
 {
        int ret;
 
index 8f06035..b3a5818 100644 (file)
@@ -282,7 +282,7 @@ static ssize_t cache_show(struct kobject * kobj, struct attribute * attr, char *
        return ret;
 }
 
-static struct sysfs_ops cache_sysfs_ops = {
+static const struct sysfs_ops cache_sysfs_ops = {
        .show   = cache_show
 };
 
index 727ab21..7f8416f 100644 (file)
@@ -58,13 +58,16 @@ static ssize_t raw_store(struct sys_device *dev,
 static SYSDEV_ATTR(ascii, 0200, NULL, ascii_store);
 static SYSDEV_ATTR(raw, 0200, NULL, raw_store);
 
-static ssize_t map_seg7_show(struct sysdev_class *class, char *buf)
+static ssize_t map_seg7_show(struct sysdev_class *class,
+                            struct sysdev_class_attribute *attr,
+                            char *buf)
 {
        memcpy(buf, &txx9_seg7map, sizeof(txx9_seg7map));
        return sizeof(txx9_seg7map);
 }
 
 static ssize_t map_seg7_store(struct sysdev_class *class,
+                             struct sysdev_class_attribute *attr,
                              const char *buf, size_t size)
 {
        if (size != sizeof(txx9_seg7map))
index bb37b1d..01fe9ce 100644 (file)
@@ -642,7 +642,7 @@ static struct kobj_attribute *cache_index_opt_attrs[] = {
        &cache_assoc_attr,
 };
 
-static struct sysfs_ops cache_index_ops = {
+static const struct sysfs_ops cache_index_ops = {
        .show = cache_index_show,
 };
 
index 8b10127..29f65bc 100644 (file)
@@ -1020,7 +1020,9 @@ out:
        return rc;
 }
 
-static ssize_t __ref rescan_store(struct sysdev_class *class, const char *buf,
+static ssize_t __ref rescan_store(struct sysdev_class *class,
+                                 struct sysdev_class_attribute *attr,
+                                 const char *buf,
                                  size_t count)
 {
        int rc;
@@ -1031,7 +1033,9 @@ static ssize_t __ref rescan_store(struct sysdev_class *class, const char *buf,
 static SYSDEV_CLASS_ATTR(rescan, 0200, NULL, rescan_store);
 #endif /* CONFIG_HOTPLUG_CPU */
 
-static ssize_t dispatching_show(struct sysdev_class *class, char *buf)
+static ssize_t dispatching_show(struct sysdev_class *class,
+                               struct sysdev_class_attribute *attr,
+                               char *buf)
 {
        ssize_t count;
 
@@ -1041,7 +1045,9 @@ static ssize_t dispatching_show(struct sysdev_class *class, char *buf)
        return count;
 }
 
-static ssize_t dispatching_store(struct sysdev_class *dev, const char *buf,
+static ssize_t dispatching_store(struct sysdev_class *dev,
+                                struct sysdev_class_attribute *attr,
+                                const char *buf,
                                 size_t count)
 {
        int val, rc;
index 8b22e7f..aa2483e 100644 (file)
@@ -1116,14 +1116,18 @@ static struct sys_device etr_port1_dev = {
 /*
  * ETR class attributes
  */
-static ssize_t etr_stepping_port_show(struct sysdev_class *class, char *buf)
+static ssize_t etr_stepping_port_show(struct sysdev_class *class,
+                                       struct sysdev_class_attribute *attr,
+                                       char *buf)
 {
        return sprintf(buf, "%i\n", etr_port0.esw.p);
 }
 
 static SYSDEV_CLASS_ATTR(stepping_port, 0400, etr_stepping_port_show, NULL);
 
-static ssize_t etr_stepping_mode_show(struct sysdev_class *class, char *buf)
+static ssize_t etr_stepping_mode_show(struct sysdev_class *class,
+                                       struct sysdev_class_attribute *attr,
+                                       char *buf)
 {
        char *mode_str;
 
@@ -1584,7 +1588,9 @@ static struct sysdev_class stp_sysclass = {
        .name   = "stp",
 };
 
-static ssize_t stp_ctn_id_show(struct sysdev_class *class, char *buf)
+static ssize_t stp_ctn_id_show(struct sysdev_class *class,
+                               struct sysdev_class_attribute *attr,
+                               char *buf)
 {
        if (!stp_online)
                return -ENODATA;
@@ -1594,7 +1600,9 @@ static ssize_t stp_ctn_id_show(struct sysdev_class *class, char *buf)
 
 static SYSDEV_CLASS_ATTR(ctn_id, 0400, stp_ctn_id_show, NULL);
 
-static ssize_t stp_ctn_type_show(struct sysdev_class *class, char *buf)
+static ssize_t stp_ctn_type_show(struct sysdev_class *class,
+                               struct sysdev_class_attribute *attr,
+                               char *buf)
 {
        if (!stp_online)
                return -ENODATA;
@@ -1603,7 +1611,9 @@ static ssize_t stp_ctn_type_show(struct sysdev_class *class, char *buf)
 
 static SYSDEV_CLASS_ATTR(ctn_type, 0400, stp_ctn_type_show, NULL);
 
-static ssize_t stp_dst_offset_show(struct sysdev_class *class, char *buf)
+static ssize_t stp_dst_offset_show(struct sysdev_class *class,
+                                  struct sysdev_class_attribute *attr,
+                                  char *buf)
 {
        if (!stp_online || !(stp_info.vbits & 0x2000))
                return -ENODATA;
@@ -1612,7 +1622,9 @@ static ssize_t stp_dst_offset_show(struct sysdev_class *class, char *buf)
 
 static SYSDEV_CLASS_ATTR(dst_offset, 0400, stp_dst_offset_show, NULL);
 
-static ssize_t stp_leap_seconds_show(struct sysdev_class *class, char *buf)
+static ssize_t stp_leap_seconds_show(struct sysdev_class *class,
+                                       struct sysdev_class_attribute *attr,
+                                       char *buf)
 {
        if (!stp_online || !(stp_info.vbits & 0x8000))
                return -ENODATA;
@@ -1621,7 +1633,9 @@ static ssize_t stp_leap_seconds_show(struct sysdev_class *class, char *buf)
 
 static SYSDEV_CLASS_ATTR(leap_seconds, 0400, stp_leap_seconds_show, NULL);
 
-static ssize_t stp_stratum_show(struct sysdev_class *class, char *buf)
+static ssize_t stp_stratum_show(struct sysdev_class *class,
+                               struct sysdev_class_attribute *attr,
+                               char *buf)
 {
        if (!stp_online)
                return -ENODATA;
@@ -1630,7 +1644,9 @@ static ssize_t stp_stratum_show(struct sysdev_class *class, char *buf)
 
 static SYSDEV_CLASS_ATTR(stratum, 0400, stp_stratum_show, NULL);
 
-static ssize_t stp_time_offset_show(struct sysdev_class *class, char *buf)
+static ssize_t stp_time_offset_show(struct sysdev_class *class,
+                               struct sysdev_class_attribute *attr,
+                               char *buf)
 {
        if (!stp_online || !(stp_info.vbits & 0x0800))
                return -ENODATA;
@@ -1639,7 +1655,9 @@ static ssize_t stp_time_offset_show(struct sysdev_class *class, char *buf)
 
 static SYSDEV_CLASS_ATTR(time_offset, 0400, stp_time_offset_show, NULL);
 
-static ssize_t stp_time_zone_offset_show(struct sysdev_class *class, char *buf)
+static ssize_t stp_time_zone_offset_show(struct sysdev_class *class,
+                               struct sysdev_class_attribute *attr,
+                               char *buf)
 {
        if (!stp_online || !(stp_info.vbits & 0x4000))
                return -ENODATA;
@@ -1649,7 +1667,9 @@ static ssize_t stp_time_zone_offset_show(struct sysdev_class *class, char *buf)
 static SYSDEV_CLASS_ATTR(time_zone_offset, 0400,
                         stp_time_zone_offset_show, NULL);
 
-static ssize_t stp_timing_mode_show(struct sysdev_class *class, char *buf)
+static ssize_t stp_timing_mode_show(struct sysdev_class *class,
+                               struct sysdev_class_attribute *attr,
+                               char *buf)
 {
        if (!stp_online)
                return -ENODATA;
@@ -1658,7 +1678,9 @@ static ssize_t stp_timing_mode_show(struct sysdev_class *class, char *buf)
 
 static SYSDEV_CLASS_ATTR(timing_mode, 0400, stp_timing_mode_show, NULL);
 
-static ssize_t stp_timing_state_show(struct sysdev_class *class, char *buf)
+static ssize_t stp_timing_state_show(struct sysdev_class *class,
+                               struct sysdev_class_attribute *attr,
+                               char *buf)
 {
        if (!stp_online)
                return -ENODATA;
@@ -1667,12 +1689,15 @@ static ssize_t stp_timing_state_show(struct sysdev_class *class, char *buf)
 
 static SYSDEV_CLASS_ATTR(timing_state, 0400, stp_timing_state_show, NULL);
 
-static ssize_t stp_online_show(struct sysdev_class *class, char *buf)
+static ssize_t stp_online_show(struct sysdev_class *class,
+                               struct sysdev_class_attribute *attr,
+                               char *buf)
 {
        return sprintf(buf, "%i\n", stp_online);
 }
 
 static ssize_t stp_online_store(struct sysdev_class *class,
+                               struct sysdev_class_attribute *attr,
                                const char *buf, size_t count)
 {
        unsigned int value;
index fc065f9..14726ee 100644 (file)
@@ -326,7 +326,7 @@ static struct attribute *sq_sysfs_attrs[] = {
        NULL,
 };
 
-static struct sysfs_ops sq_sysfs_ops = {
+static const struct sysfs_ops sq_sysfs_ops = {
        .show   = sq_sysfs_show,
        .store  = sq_sysfs_store,
 };
index eddb1bd..b3eeb66 100644 (file)
@@ -903,7 +903,7 @@ static ssize_t store(struct kobject *kobj, struct attribute *attr,
        return ret;
 }
 
-static struct sysfs_ops sysfs_ops = {
+static const struct sysfs_ops sysfs_ops = {
        .show   = show,
        .store  = store,
 };
index a8aacd4..28cba46 100644 (file)
@@ -2044,6 +2044,7 @@ static __init void mce_init_banks(void)
                struct mce_bank *b = &mce_banks[i];
                struct sysdev_attribute *a = &b->attr;
 
+               sysfs_attr_init(&a->attr);
                a->attr.name    = b->attrname;
                snprintf(b->attrname, ATTR_LEN, "bank%d", i);
 
index 83a3d1f..cda932c 100644 (file)
@@ -388,7 +388,7 @@ static ssize_t store(struct kobject *kobj, struct attribute *attr,
        return ret;
 }
 
-static struct sysfs_ops threshold_ops = {
+static const struct sysfs_ops threshold_ops = {
        .show                   = show,
        .store                  = store,
 };
index 15c6308..96e83c2 100644 (file)
@@ -278,7 +278,7 @@ static struct attribute *integrity_attrs[] = {
        NULL,
 };
 
-static struct sysfs_ops integrity_ops = {
+static const struct sysfs_ops integrity_ops = {
        .show   = &integrity_attr_show,
        .store  = &integrity_attr_store,
 };
index e854424..2ae2cb3 100644 (file)
@@ -450,7 +450,7 @@ static void blk_release_queue(struct kobject *kobj)
        kmem_cache_free(blk_requestq_cachep, q);
 }
 
-static struct sysfs_ops queue_sysfs_ops = {
+static const struct sysfs_ops queue_sysfs_ops = {
        .show   = queue_attr_show,
        .store  = queue_attr_store,
 };
index ee3a883..df75676 100644 (file)
@@ -892,7 +892,7 @@ elv_attr_store(struct kobject *kobj, struct attribute *attr,
        return error;
 }
 
-static struct sysfs_ops elv_sysfs_ops = {
+static const struct sysfs_ops elv_sysfs_ops = {
        .show   = elv_attr_show,
        .store  = elv_attr_store,
 };
index a206a12..743f244 100644 (file)
@@ -101,6 +101,7 @@ static void acpi_table_attr_init(struct acpi_table_attr *table_attr,
        struct acpi_table_header *header = NULL;
        struct acpi_table_attr *attr = NULL;
 
+       sysfs_attr_init(&table_attr->attr.attr);
        if (table_header->signature[0] != '\0')
                memcpy(table_attr->name, table_header->signature,
                        ACPI_NAME_SIZE);
@@ -475,6 +476,7 @@ void acpi_irq_stats_init(void)
                        goto fail;
                strncpy(name, buffer, strlen(buffer) + 1);
 
+               sysfs_attr_init(&counter_attrs[i].attr);
                counter_attrs[i].attr.name = name;
                counter_attrs[i].attr.mode = 0644;
                counter_attrs[i].show = counter_show;
index fe3a865..b0ca5a4 100644 (file)
@@ -81,7 +81,7 @@ static struct fb_ops cfag12864bfb_ops = {
        .fb_mmap = cfag12864bfb_mmap,
 };
 
-static int __init cfag12864bfb_probe(struct platform_device *device)
+static int __devinit cfag12864bfb_probe(struct platform_device *device)
 {
        int ret = -EINVAL;
        struct fb_info *info = framebuffer_alloc(0, &device->dev);
index ee37727..fd52c48 100644 (file)
@@ -3,35 +3,50 @@ menu "Generic Driver Options"
 config UEVENT_HELPER_PATH
        string "path to uevent helper"
        depends on HOTPLUG
-       default "/sbin/hotplug"
+       default ""
        help
          Path to uevent helper program forked by the kernel for
          every uevent.
+         Before the switch to the netlink-based uevent source, this was
+         used to hook hotplug scripts into kernel device events. It
+         usually pointed to a shell script at /sbin/hotplug.
+         This should not be used today, because usual systems create
+         many events at bootup or device discovery in a very short time
+         frame. One forked process per event can create so many processes
+         that it creates a high system load, or on smaller systems
+         it is known to create out-of-memory situations during bootup.
 
 config DEVTMPFS
-       bool "Create a kernel maintained /dev tmpfs (EXPERIMENTAL)"
+       bool "Maintain a devtmpfs filesystem to mount at /dev"
        depends on HOTPLUG && SHMEM && TMPFS
        help
-         This creates a tmpfs filesystem, and mounts it at bootup
-         and mounts it at /dev. The kernel driver core creates device
-         nodes for all registered devices in that filesystem. All device
-         nodes are owned by root and have the default mode of 0600.
-         Userspace can add and delete the nodes as needed. This is
-         intended to simplify bootup, and make it possible to delay
-         the initial coldplug at bootup done by udev in userspace.
-         It should also provide a simpler way for rescue systems
-         to bring up a kernel with dynamic major/minor numbers.
-         Meaningful symlinks, permissions and device ownership must
-         still be handled by userspace.
-         If unsure, say N here.
+         This creates a tmpfs filesystem instance early at bootup.
+         In this filesystem, the kernel driver core maintains device
+         nodes with their default names and permissions for all
+         registered devices with an assigned major/minor number.
+         Userspace can modify the filesystem content as needed, add
+         symlinks, and apply needed permissions.
+         It provides a fully functional /dev directory, where usually
+         udev runs on top, managing permissions and adding meaningful
+         symlinks.
+         In very limited environments, it may provide a sufficient
+         functional /dev without any further help. It also allows simple
+         rescue systems, and reliably handles dynamic major/minor numbers.
 
 config DEVTMPFS_MOUNT
-       bool "Automount devtmpfs at /dev"
+       bool "Automount devtmpfs at /dev, after the kernel mounted the rootfs"
        depends on DEVTMPFS
        help
-         This will mount devtmpfs at /dev if the kernel mounts the root
-         filesystem. It will not affect initramfs based mounting.
-         If unsure, say N here.
+         This will instruct the kernel to automatically mount the
+         devtmpfs filesystem at /dev, directly after the kernel has
+         mounted the root filesystem. The behavior can be overridden
+         with the commandline parameter: devtmpfs.mount=0|1.
+         This option does not affect initramfs based booting, here
+         the devtmpfs filesystem always needs to be mounted manually
+         after the roots is mounted.
+         With this option enabled, it allows to bring up a system in
+         rescue mode with init=/bin/sh, even when the /dev directory
+         on the rootfs is completely empty.
 
 config STANDALONE
        bool "Select only drivers that don't need compile-time external firmware" if EXPERIMENTAL
index c0c5a43..71f6af5 100644 (file)
@@ -70,7 +70,7 @@ static ssize_t drv_attr_store(struct kobject *kobj, struct attribute *attr,
        return ret;
 }
 
-static struct sysfs_ops driver_sysfs_ops = {
+static const struct sysfs_ops driver_sysfs_ops = {
        .show   = drv_attr_show,
        .store  = drv_attr_store,
 };
@@ -115,7 +115,7 @@ static ssize_t bus_attr_store(struct kobject *kobj, struct attribute *attr,
        return ret;
 }
 
-static struct sysfs_ops bus_sysfs_ops = {
+static const struct sysfs_ops bus_sysfs_ops = {
        .show   = bus_attr_show,
        .store  = bus_attr_store,
 };
@@ -154,7 +154,7 @@ static int bus_uevent_filter(struct kset *kset, struct kobject *kobj)
        return 0;
 }
 
-static struct kset_uevent_ops bus_uevent_ops = {
+static const struct kset_uevent_ops bus_uevent_ops = {
        .filter = bus_uevent_filter,
 };
 
@@ -173,10 +173,10 @@ static ssize_t driver_unbind(struct device_driver *drv,
        dev = bus_find_device_by_name(bus, NULL, buf);
        if (dev && dev->driver == drv) {
                if (dev->parent)        /* Needed for USB */
-                       down(&dev->parent->sem);
+                       device_lock(dev->parent);
                device_release_driver(dev);
                if (dev->parent)
-                       up(&dev->parent->sem);
+                       device_unlock(dev->parent);
                err = count;
        }
        put_device(dev);
@@ -200,12 +200,12 @@ static ssize_t driver_bind(struct device_driver *drv,
        dev = bus_find_device_by_name(bus, NULL, buf);
        if (dev && dev->driver == NULL && driver_match_device(drv, dev)) {
                if (dev->parent)        /* Needed for USB */
-                       down(&dev->parent->sem);
-               down(&dev->sem);
+                       device_lock(dev->parent);
+               device_lock(dev);
                err = driver_probe_device(drv, dev);
-               up(&dev->sem);
+               device_unlock(dev);
                if (dev->parent)
-                       up(&dev->parent->sem);
+                       device_unlock(dev->parent);
 
                if (err > 0) {
                        /* success */
@@ -744,10 +744,10 @@ static int __must_check bus_rescan_devices_helper(struct device *dev,
 
        if (!dev->driver) {
                if (dev->parent)        /* Needed for USB */
-                       down(&dev->parent->sem);
+                       device_lock(dev->parent);
                ret = device_attach(dev);
                if (dev->parent)
-                       up(&dev->parent->sem);
+                       device_unlock(dev->parent);
        }
        return ret < 0 ? ret : 0;
 }
@@ -779,10 +779,10 @@ int device_reprobe(struct device *dev)
 {
        if (dev->driver) {
                if (dev->parent)        /* Needed for USB */
-                       down(&dev->parent->sem);
+                       device_lock(dev->parent);
                device_release_driver(dev);
                if (dev->parent)
-                       up(&dev->parent->sem);
+                       device_unlock(dev->parent);
        }
        return bus_rescan_devices_helper(dev, NULL);
 }
index 6e2c3b0..0147f47 100644 (file)
@@ -31,7 +31,7 @@ static ssize_t class_attr_show(struct kobject *kobj, struct attribute *attr,
        ssize_t ret = -EIO;
 
        if (class_attr->show)
-               ret = class_attr->show(cp->class, buf);
+               ret = class_attr->show(cp->class, class_attr, buf);
        return ret;
 }
 
@@ -43,7 +43,7 @@ static ssize_t class_attr_store(struct kobject *kobj, struct attribute *attr,
        ssize_t ret = -EIO;
 
        if (class_attr->store)
-               ret = class_attr->store(cp->class, buf, count);
+               ret = class_attr->store(cp->class, class_attr, buf, count);
        return ret;
 }
 
@@ -63,7 +63,7 @@ static void class_release(struct kobject *kobj)
        kfree(cp);
 }
 
-static struct sysfs_ops class_sysfs_ops = {
+static const struct sysfs_ops class_sysfs_ops = {
        .show   = class_attr_show,
        .store  = class_attr_store,
 };
@@ -490,6 +490,16 @@ void class_interface_unregister(struct class_interface *class_intf)
        class_put(parent);
 }
 
+ssize_t show_class_attr_string(struct class *class, struct class_attribute *attr,
+                               char *buf)
+{
+       struct class_attribute_string *cs;
+       cs = container_of(attr, struct class_attribute_string, attr);
+       return snprintf(buf, PAGE_SIZE, "%s\n", cs->str);
+}
+
+EXPORT_SYMBOL_GPL(show_class_attr_string);
+
 struct class_compat {
        struct kobject *kobj;
 };
index 2820257..ef55df3 100644 (file)
@@ -100,7 +100,7 @@ static ssize_t dev_attr_store(struct kobject *kobj, struct attribute *attr,
        return ret;
 }
 
-static struct sysfs_ops dev_sysfs_ops = {
+static const struct sysfs_ops dev_sysfs_ops = {
        .show   = dev_attr_show,
        .store  = dev_attr_store,
 };
@@ -252,7 +252,7 @@ static int dev_uevent(struct kset *kset, struct kobject *kobj,
        return retval;
 }
 
-static struct kset_uevent_ops device_uevent_ops = {
+static const struct kset_uevent_ops device_uevent_ops = {
        .filter =       dev_uevent_filter,
        .name =         dev_uevent_name,
        .uevent =       dev_uevent,
@@ -306,15 +306,10 @@ static ssize_t store_uevent(struct device *dev, struct device_attribute *attr,
 {
        enum kobject_action action;
 
-       if (kobject_action_type(buf, count, &action) == 0) {
+       if (kobject_action_type(buf, count, &action) == 0)
                kobject_uevent(&dev->kobj, action);
-               goto out;
-       }
-
-       dev_err(dev, "uevent: unsupported action-string; this will "
-                    "be ignored in a future kernel version\n");
-       kobject_uevent(&dev->kobj, KOBJ_ADD);
-out:
+       else
+               dev_err(dev, "uevent: unknown action-string\n");
        return count;
 }
 
@@ -607,6 +602,7 @@ static struct kobject *get_device_parent(struct device *dev,
        int retval;
 
        if (dev->class) {
+               static DEFINE_MUTEX(gdp_mutex);
                struct kobject *kobj = NULL;
                struct kobject *parent_kobj;
                struct kobject *k;
@@ -623,6 +619,8 @@ static struct kobject *get_device_parent(struct device *dev,
                else
                        parent_kobj = &parent->kobj;
 
+               mutex_lock(&gdp_mutex);
+
                /* find our class-directory at the parent and reference it */
                spin_lock(&dev->class->p->class_dirs.list_lock);
                list_for_each_entry(k, &dev->class->p->class_dirs.list, entry)
@@ -631,20 +629,26 @@ static struct kobject *get_device_parent(struct device *dev,
                                break;
                        }
                spin_unlock(&dev->class->p->class_dirs.list_lock);
-               if (kobj)
+               if (kobj) {
+                       mutex_unlock(&gdp_mutex);
                        return kobj;
+               }
 
                /* or create a new class-directory at the parent device */
                k = kobject_create();
-               if (!k)
+               if (!k) {
+                       mutex_unlock(&gdp_mutex);
                        return NULL;
+               }
                k->kset = &dev->class->p->class_dirs;
                retval = kobject_add(k, parent_kobj, "%s", dev->class->name);
                if (retval < 0) {
+                       mutex_unlock(&gdp_mutex);
                        kobject_put(k);
                        return NULL;
                }
                /* do not emit an uevent for this simple "glue" directory */
+               mutex_unlock(&gdp_mutex);
                return k;
        }
 
@@ -1574,22 +1578,16 @@ int device_rename(struct device *dev, char *new_name)
        if (old_class_name) {
                new_class_name = make_class_name(dev->class->name, &dev->kobj);
                if (new_class_name) {
-                       error = sysfs_create_link_nowarn(&dev->parent->kobj,
-                                                        &dev->kobj,
-                                                        new_class_name);
-                       if (error)
-                               goto out;
-                       sysfs_remove_link(&dev->parent->kobj, old_class_name);
+                       error = sysfs_rename_link(&dev->parent->kobj,
+                                                 &dev->kobj,
+                                                 old_class_name,
+                                                 new_class_name);
                }
        }
 #else
        if (dev->class) {
-               error = sysfs_create_link_nowarn(&dev->class->p->class_subsys.kobj,
-                                                &dev->kobj, dev_name(dev));
-               if (error)
-                       goto out;
-               sysfs_remove_link(&dev->class->p->class_subsys.kobj,
-                                 old_device_name);
+               error = sysfs_rename_link(&dev->class->p->class_subsys.kobj,
+                                         &dev->kobj, old_device_name, new_name);
        }
 #endif
 
index 958bd15..7036e8e 100644 (file)
 
 #include "base.h"
 
+static struct sysdev_class_attribute *cpu_sysdev_class_attrs[];
+
 struct sysdev_class cpu_sysdev_class = {
        .name = "cpu",
+       .attrs = cpu_sysdev_class_attrs,
 };
 EXPORT_SYMBOL(cpu_sysdev_class);
 
@@ -76,34 +79,24 @@ void unregister_cpu(struct cpu *cpu)
 }
 
 #ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
-static ssize_t cpu_probe_store(struct class *class, const char *buf,
+static ssize_t cpu_probe_store(struct sys_device *dev,
+                               struct sysdev_attribute *attr,
+                               const char *buf,
                               size_t count)
 {
        return arch_cpu_probe(buf, count);
 }
 
-static ssize_t cpu_release_store(struct class *class, const char *buf,
+static ssize_t cpu_release_store(struct sys_device *dev,
+                               struct sysdev_attribute *attr,
+                               const char *buf,
                                 size_t count)
 {
        return arch_cpu_release(buf, count);
 }
 
-static CLASS_ATTR(probe, S_IWUSR, NULL, cpu_probe_store);
-static CLASS_ATTR(release, S_IWUSR, NULL, cpu_release_store);
-
-int __init cpu_probe_release_init(void)
-{
-       int rc;
-
-       rc = sysfs_create_file(&cpu_sysdev_class.kset.kobj,
-                              &class_attr_probe.attr);
-       if (!rc)
-               rc = sysfs_create_file(&cpu_sysdev_class.kset.kobj,
-                                      &class_attr_release.attr);
-
-       return rc;
-}
-device_initcall(cpu_probe_release_init);
+static SYSDEV_ATTR(probe, S_IWUSR, NULL, cpu_probe_store);
+static SYSDEV_ATTR(release, S_IWUSR, NULL, cpu_release_store);
 #endif /* CONFIG_ARCH_CPU_PROBE_RELEASE */
 
 #else /* ... !CONFIG_HOTPLUG_CPU */
@@ -141,31 +134,39 @@ static SYSDEV_ATTR(crash_notes, 0400, show_crash_notes, NULL);
 /*
  * Print cpu online, possible, present, and system maps
  */
-static ssize_t print_cpus_map(char *buf, const struct cpumask *map)
+
+struct cpu_attr {
+       struct sysdev_class_attribute attr;
+       const struct cpumask *const * const map;
+};
+
+static ssize_t show_cpus_attr(struct sysdev_class *class,
+                             struct sysdev_class_attribute *attr,
+                             char *buf)
 {
-       int n = cpulist_scnprintf(buf, PAGE_SIZE-2, map);
+       struct cpu_attr *ca = container_of(attr, struct cpu_attr, attr);
+       int n = cpulist_scnprintf(buf, PAGE_SIZE-2, *(ca->map));
 
        buf[n++] = '\n';
        buf[n] = '\0';
        return n;
 }
 
-#define        print_cpus_func(type) \
-static ssize_t print_cpus_##type(struct sysdev_class *class, char *buf)        \
-{                                                                      \
-       return print_cpus_map(buf, cpu_##type##_mask);                  \
-}                                                                      \
-static struct sysdev_class_attribute attr_##type##_map =               \
-       _SYSDEV_CLASS_ATTR(type, 0444, print_cpus_##type, NULL)
+#define _CPU_ATTR(name, map)                                           \
+       { _SYSDEV_CLASS_ATTR(name, 0444, show_cpus_attr, NULL), map }
 
-print_cpus_func(online);
-print_cpus_func(possible);
-print_cpus_func(present);
+/* Keep in sync with cpu_sysdev_class_attrs */
+static struct cpu_attr cpu_attrs[] = {
+       _CPU_ATTR(online, &cpu_online_mask),
+       _CPU_ATTR(possible, &cpu_possible_mask),
+       _CPU_ATTR(present, &cpu_present_mask),
+};
 
 /*
  * Print values for NR_CPUS and offlined cpus
  */
-static ssize_t print_cpus_kernel_max(struct sysdev_class *class, char *buf)
+static ssize_t print_cpus_kernel_max(struct sysdev_class *class,
+                                    struct sysdev_class_attribute *attr, char *buf)
 {
        int n = snprintf(buf, PAGE_SIZE-2, "%d\n", NR_CPUS - 1);
        return n;
@@ -175,7 +176,8 @@ static SYSDEV_CLASS_ATTR(kernel_max, 0444, print_cpus_kernel_max, NULL);
 /* arch-optional setting to enable display of offline cpus >= nr_cpu_ids */
 unsigned int total_cpus;
 
-static ssize_t print_cpus_offline(struct sysdev_class *class, char *buf)
+static ssize_t print_cpus_offline(struct sysdev_class *class,
+                                 struct sysdev_class_attribute *attr, char *buf)
 {
        int n = 0, len = PAGE_SIZE-2;
        cpumask_var_t offline;
@@ -204,29 +206,6 @@ static ssize_t print_cpus_offline(struct sysdev_class *class, char *buf)
 }
 static SYSDEV_CLASS_ATTR(offline, 0444, print_cpus_offline, NULL);
 
-static struct sysdev_class_attribute *cpu_state_attr[] = {
-       &attr_online_map,
-       &attr_possible_map,
-       &attr_present_map,
-       &attr_kernel_max,
-       &attr_offline,
-};
-
-static int cpu_states_init(void)
-{
-       int i;
-       int err = 0;
-
-       for (i = 0;  i < ARRAY_SIZE(cpu_state_attr); i++) {
-               int ret;
-               ret = sysdev_class_create_file(&cpu_sysdev_class,
-                                               cpu_state_attr[i]);
-               if (!err)
-                       err = ret;
-       }
-       return err;
-}
-
 /*
  * register_cpu - Setup a sysfs device for a CPU.
  * @cpu - cpu->hotpluggable field set to 1 will generate a control file in
@@ -272,9 +251,6 @@ int __init cpu_dev_init(void)
        int err;
 
        err = sysdev_class_register(&cpu_sysdev_class);
-       if (!err)
-               err = cpu_states_init();
-
 #if defined(CONFIG_SCHED_MC) || defined(CONFIG_SCHED_SMT)
        if (!err)
                err = sched_create_sysfs_power_savings_entries(&cpu_sysdev_class);
@@ -282,3 +258,16 @@ int __init cpu_dev_init(void)
 
        return err;
 }
+
+static struct sysdev_class_attribute *cpu_sysdev_class_attrs[] = {
+#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
+       &attr_probe,
+       &attr_release,
+#endif
+       &cpu_attrs[0].attr,
+       &cpu_attrs[1].attr,
+       &cpu_attrs[2].attr,
+       &attr_kernel_max,
+       &attr_offline,
+       NULL
+};
index ee95c76..c89291f 100644 (file)
@@ -85,7 +85,7 @@ static void driver_sysfs_remove(struct device *dev)
  * for before calling this. (It is ok to call with no other effort
  * from a driver's probe() method.)
  *
- * This function must be called with @dev->sem held.
+ * This function must be called with the device lock held.
  */
 int device_bind_driver(struct device *dev)
 {
@@ -190,8 +190,8 @@ EXPORT_SYMBOL_GPL(wait_for_device_probe);
  * This function returns -ENODEV if the device is not registered,
  * 1 if the device is bound successfully and 0 otherwise.
  *
- * This function must be called with @dev->sem held.  When called for a
- * USB interface, @dev->parent->sem must be held as well.
+ * This function must be called with @dev lock held.  When called for a
+ * USB interface, @dev->parent lock must be held as well.
  */
 int driver_probe_device(struct device_driver *drv, struct device *dev)
 {
@@ -233,13 +233,13 @@ static int __device_attach(struct device_driver *drv, void *data)
  * 0 if no matching driver was found;
  * -ENODEV if the device is not registered.
  *
- * When called for a USB interface, @dev->parent->sem must be held.
+ * When called for a USB interface, @dev->parent lock must be held.
  */
 int device_attach(struct device *dev)
 {
        int ret = 0;
 
-       down(&dev->sem);
+       device_lock(dev);
        if (dev->driver) {
                ret = device_bind_driver(dev);
                if (ret == 0)
@@ -253,7 +253,7 @@ int device_attach(struct device *dev)
                ret = bus_for_each_drv(dev->bus, NULL, dev, __device_attach);
                pm_runtime_put_sync(dev);
        }
-       up(&dev->sem);
+       device_unlock(dev);
        return ret;
 }
 EXPORT_SYMBOL_GPL(device_attach);
@@ -276,13 +276,13 @@ static int __driver_attach(struct device *dev, void *data)
                return 0;
 
        if (dev->parent)        /* Needed for USB */
-               down(&dev->parent->sem);
-       down(&dev->sem);
+               device_lock(dev->parent);
+       device_lock(dev);
        if (!dev->driver)
                driver_probe_device(drv, dev);
-       up(&dev->sem);
+       device_unlock(dev);
        if (dev->parent)
-               up(&dev->parent->sem);
+               device_unlock(dev->parent);
 
        return 0;
 }
@@ -303,8 +303,8 @@ int driver_attach(struct device_driver *drv)
 EXPORT_SYMBOL_GPL(driver_attach);
 
 /*
- * __device_release_driver() must be called with @dev->sem held.
- * When called for a USB interface, @dev->parent->sem must be held as well.
+ * __device_release_driver() must be called with @dev lock held.
+ * When called for a USB interface, @dev->parent lock must be held as well.
  */
 static void __device_release_driver(struct device *dev)
 {
@@ -343,7 +343,7 @@ static void __device_release_driver(struct device *dev)
  * @dev: device.
  *
  * Manually detach device from driver.
- * When called for a USB interface, @dev->parent->sem must be held.
+ * When called for a USB interface, @dev->parent lock must be held.
  */
 void device_release_driver(struct device *dev)
 {
@@ -352,9 +352,9 @@ void device_release_driver(struct device *dev)
         * within their ->remove callback for the same device, they
         * will deadlock right here.
         */
-       down(&dev->sem);
+       device_lock(dev);
        __device_release_driver(dev);
-       up(&dev->sem);
+       device_unlock(dev);
 }
 EXPORT_SYMBOL_GPL(device_release_driver);
 
@@ -381,13 +381,13 @@ void driver_detach(struct device_driver *drv)
                spin_unlock(&drv->p->klist_devices.k_lock);
 
                if (dev->parent)        /* Needed for USB */
-                       down(&dev->parent->sem);
-               down(&dev->sem);
+                       device_lock(dev->parent);
+               device_lock(dev);
                if (dev->driver == drv)
                        __device_release_driver(dev);
-               up(&dev->sem);
+               device_unlock(dev);
                if (dev->parent)
-                       up(&dev->parent->sem);
+                       device_unlock(dev->parent);
                put_device(dev);
        }
 }
index 42ae452..dac478c 100644 (file)
@@ -301,6 +301,19 @@ int devtmpfs_delete_node(struct device *dev)
                if (dentry->d_inode) {
                        err = vfs_getattr(nd.path.mnt, dentry, &stat);
                        if (!err && dev_mynode(dev, dentry->d_inode, &stat)) {
+                               struct iattr newattrs;
+                               /*
+                                * before unlinking this node, reset permissions
+                                * of possible references like hardlinks
+                                */
+                               newattrs.ia_uid = 0;
+                               newattrs.ia_gid = 0;
+                               newattrs.ia_mode = stat.mode & ~0777;
+                               newattrs.ia_valid =
+                                       ATTR_UID|ATTR_GID|ATTR_MODE;
+                               mutex_lock(&dentry->d_inode->i_mutex);
+                               notify_change(dentry, &newattrs);
+                               mutex_unlock(&dentry->d_inode->i_mutex);
                                err = vfs_unlink(nd.path.dentry->d_inode,
                                                 dentry);
                                if (!err || err == -ENOENT)
index a950241..d0dc26a 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/kthread.h>
 #include <linux/highmem.h>
 #include <linux/firmware.h>
-#include "base.h"
 
 #define to_dev(obj) container_of(obj, struct device, kobj)
 
@@ -69,7 +68,9 @@ fw_load_abort(struct firmware_priv *fw_priv)
 }
 
 static ssize_t
-firmware_timeout_show(struct class *class, char *buf)
+firmware_timeout_show(struct class *class,
+                     struct class_attribute *attr,
+                     char *buf)
 {
        return sprintf(buf, "%d\n", loading_timeout);
 }
@@ -87,7 +88,9 @@ firmware_timeout_show(struct class *class, char *buf)
  *     Note: zero means 'wait forever'.
  **/
 static ssize_t
-firmware_timeout_store(struct class *class, const char *buf, size_t count)
+firmware_timeout_store(struct class *class,
+                       struct class_attribute *attr,
+                       const char *buf, size_t count)
 {
        loading_timeout = simple_strtol(buf, NULL, 10);
        if (loading_timeout < 0)
@@ -610,7 +613,7 @@ request_firmware_work_func(void *arg)
 }
 
 /**
- * request_firmware_nowait: asynchronous version of request_firmware
+ * request_firmware_nowait - asynchronous version of request_firmware
  * @module: module requesting the firmware
  * @uevent: sends uevent to copy the firmware image if this flag
  *     is non-zero else the firmware copy must be done manually.
index bd02505..2f86915 100644 (file)
@@ -44,7 +44,7 @@ static int memory_uevent(struct kset *kset, struct kobject *obj, struct kobj_uev
        return retval;
 }
 
-static struct kset_uevent_ops memory_uevent_ops = {
+static const struct kset_uevent_ops memory_uevent_ops = {
        .name           = memory_uevent_name,
        .uevent         = memory_uevent,
 };
@@ -309,17 +309,18 @@ static SYSDEV_ATTR(removable, 0444, show_mem_removable, NULL);
  * Block size attribute stuff
  */
 static ssize_t
-print_block_size(struct class *class, char *buf)
+print_block_size(struct sysdev_class *class, struct sysdev_class_attribute *attr,
+                char *buf)
 {
        return sprintf(buf, "%#lx\n", (unsigned long)PAGES_PER_SECTION * PAGE_SIZE);
 }
 
-static CLASS_ATTR(block_size_bytes, 0444, print_block_size, NULL);
+static SYSDEV_CLASS_ATTR(block_size_bytes, 0444, print_block_size, NULL);
 
 static int block_size_init(void)
 {
        return sysfs_create_file(&memory_sysdev_class.kset.kobj,
-                               &class_attr_block_size_bytes.attr);
+                               &attr_block_size_bytes.attr);
 }
 
 /*
@@ -330,7 +331,8 @@ static int block_size_init(void)
  */
 #ifdef CONFIG_ARCH_MEMORY_PROBE
 static ssize_t
-memory_probe_store(struct class *class, const char *buf, size_t count)
+memory_probe_store(struct class *class, struct class_attribute *attr,
+                  const char *buf, size_t count)
 {
        u64 phys_addr;
        int nid;
@@ -367,7 +369,9 @@ static inline int memory_probe_init(void)
 
 /* Soft offline a page */
 static ssize_t
-store_soft_offline_page(struct class *class, const char *buf, size_t count)
+store_soft_offline_page(struct class *class,
+                       struct class_attribute *attr,
+                       const char *buf, size_t count)
 {
        int ret;
        u64 pfn;
@@ -384,7 +388,9 @@ store_soft_offline_page(struct class *class, const char *buf, size_t count)
 
 /* Forcibly offline a page, including killing processes. */
 static ssize_t
-store_hard_offline_page(struct class *class, const char *buf, size_t count)
+store_hard_offline_page(struct class *class,
+                       struct class_attribute *attr,
+                       const char *buf, size_t count)
 {
        int ret;
        u64 pfn;
index 7012279..ad43185 100644 (file)
 #include <linux/device.h>
 #include <linux/swap.h>
 
+static struct sysdev_class_attribute *node_state_attrs[];
+
 static struct sysdev_class node_class = {
        .name = "node",
+       .attrs = node_state_attrs,
 };
 
 
@@ -544,76 +547,52 @@ static ssize_t print_nodes_state(enum node_states state, char *buf)
        return n;
 }
 
-static ssize_t print_nodes_possible(struct sysdev_class *class, char *buf)
-{
-       return print_nodes_state(N_POSSIBLE, buf);
-}
-
-static ssize_t print_nodes_online(struct sysdev_class *class, char *buf)
-{
-       return print_nodes_state(N_ONLINE, buf);
-}
-
-static ssize_t print_nodes_has_normal_memory(struct sysdev_class *class,
-                                               char *buf)
-{
-       return print_nodes_state(N_NORMAL_MEMORY, buf);
-}
+struct node_attr {
+       struct sysdev_class_attribute attr;
+       enum node_states state;
+};
 
-static ssize_t print_nodes_has_cpu(struct sysdev_class *class, char *buf)
+static ssize_t show_node_state(struct sysdev_class *class,
+                              struct sysdev_class_attribute *attr, char *buf)
 {
-       return print_nodes_state(N_CPU, buf);
+       struct node_attr *na = container_of(attr, struct node_attr, attr);
+       return print_nodes_state(na->state, buf);
 }
 
-static SYSDEV_CLASS_ATTR(possible, 0444, print_nodes_possible, NULL);
-static SYSDEV_CLASS_ATTR(online, 0444, print_nodes_online, NULL);
-static SYSDEV_CLASS_ATTR(has_normal_memory, 0444, print_nodes_has_normal_memory,
-                                                                       NULL);
-static SYSDEV_CLASS_ATTR(has_cpu, 0444, print_nodes_has_cpu, NULL);
+#define _NODE_ATTR(name, state) \
+       { _SYSDEV_CLASS_ATTR(name, 0444, show_node_state, NULL), state }
 
+static struct node_attr node_state_attr[] = {
+       _NODE_ATTR(possible, N_POSSIBLE),
+       _NODE_ATTR(online, N_ONLINE),
+       _NODE_ATTR(has_normal_memory, N_NORMAL_MEMORY),
+       _NODE_ATTR(has_cpu, N_CPU),
 #ifdef CONFIG_HIGHMEM
-static ssize_t print_nodes_has_high_memory(struct sysdev_class *class,
-                                                char *buf)
-{
-       return print_nodes_state(N_HIGH_MEMORY, buf);
-}
-
-static SYSDEV_CLASS_ATTR(has_high_memory, 0444, print_nodes_has_high_memory,
-                                                                        NULL);
+       _NODE_ATTR(has_high_memory, N_HIGH_MEMORY),
 #endif
+};
 
-struct sysdev_class_attribute *node_state_attr[] = {
-       &attr_possible,
-       &attr_online,
-       &attr_has_normal_memory,
+static struct sysdev_class_attribute *node_state_attrs[] = {
+       &node_state_attr[0].attr,
+       &node_state_attr[1].attr,
+       &node_state_attr[2].attr,
+       &node_state_attr[3].attr,
 #ifdef CONFIG_HIGHMEM
-       &attr_has_high_memory,
+       &node_state_attr[4].attr,
 #endif
-       &attr_has_cpu,
+       NULL
 };
 
-static int node_states_init(void)
-{
-       int i;
-       int err = 0;
-
-       for (i = 0;  i < NR_NODE_STATES; i++) {
-               int ret;
-               ret = sysdev_class_create_file(&node_class, node_state_attr[i]);
-               if (!err)
-                       err = ret;
-       }
-       return err;
-}
-
 #define NODE_CALLBACK_PRI      2       /* lower than SLAB */
 static int __init register_node_type(void)
 {
        int ret;
 
+       BUILD_BUG_ON(ARRAY_SIZE(node_state_attr) != NR_NODE_STATES);
+       BUILD_BUG_ON(ARRAY_SIZE(node_state_attrs)-1 != NR_NODE_STATES);
+
        ret = sysdev_class_register(&node_class);
        if (!ret) {
-               ret = node_states_init();
                hotplug_memory_notifier(node_memory_callback,
                                        NODE_CALLBACK_PRI);
        }
index 58efaf2..1ba9d61 100644 (file)
@@ -128,7 +128,7 @@ struct platform_object {
 };
 
 /**
- * platform_device_put
+ * platform_device_put - destroy a platform device
  * @pdev: platform device to free
  *
  * Free all memory associated with a platform device.  This function must
@@ -152,7 +152,7 @@ static void platform_device_release(struct device *dev)
 }
 
 /**
- * platform_device_alloc
+ * platform_device_alloc - create a platform device
  * @name: base name of the device we're adding
  * @id: instance id
  *
@@ -177,7 +177,7 @@ struct platform_device *platform_device_alloc(const char *name, int id)
 EXPORT_SYMBOL_GPL(platform_device_alloc);
 
 /**
- * platform_device_add_resources
+ * platform_device_add_resources - add resources to a platform device
  * @pdev: platform device allocated by platform_device_alloc to add resources to
  * @res: set of resources that needs to be allocated for the device
  * @num: number of resources
@@ -202,7 +202,7 @@ int platform_device_add_resources(struct platform_device *pdev,
 EXPORT_SYMBOL_GPL(platform_device_add_resources);
 
 /**
- * platform_device_add_data
+ * platform_device_add_data - add platform-specific data to a platform device
  * @pdev: platform device allocated by platform_device_alloc to add resources to
  * @data: platform specific data for this platform device
  * @size: size of platform specific data
@@ -344,7 +344,7 @@ void platform_device_unregister(struct platform_device *pdev)
 EXPORT_SYMBOL_GPL(platform_device_unregister);
 
 /**
- * platform_device_register_simple
+ * platform_device_register_simple - add a platform-level device and its resources
  * @name: base name of the device we're adding
  * @id: instance id
  * @res: set of resources that needs to be allocated for the device
@@ -396,7 +396,7 @@ error:
 EXPORT_SYMBOL_GPL(platform_device_register_simple);
 
 /**
- * platform_device_register_data
+ * platform_device_register_data - add a platform-level device with platform-specific data
  * @parent: parent device for the device we're adding
  * @name: base name of the device we're adding
  * @id: instance id
@@ -473,7 +473,7 @@ static void platform_drv_shutdown(struct device *_dev)
 }
 
 /**
- * platform_driver_register
+ * platform_driver_register - register a driver for platform-level devices
  * @drv: platform driver structure
  */
 int platform_driver_register(struct platform_driver *drv)
@@ -491,7 +491,7 @@ int platform_driver_register(struct platform_driver *drv)
 EXPORT_SYMBOL_GPL(platform_driver_register);
 
 /**
- * platform_driver_unregister
+ * platform_driver_unregister - unregister a driver for platform-level devices
  * @drv: platform driver structure
  */
 void platform_driver_unregister(struct platform_driver *drv)
@@ -548,6 +548,64 @@ int __init_or_module platform_driver_probe(struct platform_driver *drv,
 }
 EXPORT_SYMBOL_GPL(platform_driver_probe);
 
+/**
+ * platform_create_bundle - register driver and create corresponding device
+ * @driver: platform driver structure
+ * @probe: the driver probe routine, probably from an __init section
+ * @res: set of resources that needs to be allocated for the device
+ * @n_res: number of resources
+ * @data: platform specific data for this platform device
+ * @size: size of platform specific data
+ *
+ * Use this in legacy-style modules that probe hardware directly and
+ * register a single platform device and corresponding platform driver.
+ */
+struct platform_device * __init_or_module platform_create_bundle(
+                       struct platform_driver *driver,
+                       int (*probe)(struct platform_device *),
+                       struct resource *res, unsigned int n_res,
+                       const void *data, size_t size)
+{
+       struct platform_device *pdev;
+       int error;
+
+       pdev = platform_device_alloc(driver->driver.name, -1);
+       if (!pdev) {
+               error = -ENOMEM;
+               goto err_out;
+       }
+
+       if (res) {
+               error = platform_device_add_resources(pdev, res, n_res);
+               if (error)
+                       goto err_pdev_put;
+       }
+
+       if (data) {
+               error = platform_device_add_data(pdev, data, size);
+               if (error)
+                       goto err_pdev_put;
+       }
+
+       error = platform_device_add(pdev);
+       if (error)
+               goto err_pdev_put;
+
+       error = platform_driver_probe(driver, probe);
+       if (error)
+               goto err_pdev_del;
+
+       return pdev;
+
+err_pdev_del:
+       platform_device_del(pdev);
+err_pdev_put:
+       platform_device_put(pdev);
+err_out:
+       return ERR_PTR(error);
+}
+EXPORT_SYMBOL_GPL(platform_create_bundle);
+
 /* modalias support enables more hands-off userspace setup:
  * (a) environment variable lets new-style hotplug events work once system is
  *     fully running:  "modprobe $MODALIAS"
@@ -578,7 +636,7 @@ static int platform_uevent(struct device *dev, struct kobj_uevent_env *env)
 }
 
 static const struct platform_device_id *platform_match_id(
-                       struct platform_device_id *id,
+                       const struct platform_device_id *id,
                        struct platform_device *pdev)
 {
        while (id->name[0]) {
index 0e26a6f..d477f4d 100644 (file)
@@ -35,8 +35,8 @@
  * because children are guaranteed to be discovered after parents, and
  * are inserted at the back of the list on discovery.
  *
- * Since device_pm_add() may be called with a device semaphore held,
- * we must never try to acquire a device semaphore while holding
+ * Since device_pm_add() may be called with a device lock held,
+ * we must never try to acquire a device lock while holding
  * dpm_list_mutex.
  */
 
@@ -508,7 +508,7 @@ static int device_resume(struct device *dev, pm_message_t state, bool async)
        TRACE_RESUME(0);
 
        dpm_wait(dev->parent, async);
-       down(&dev->sem);
+       device_lock(dev);
 
        dev->power.status = DPM_RESUMING;
 
@@ -543,7 +543,7 @@ static int device_resume(struct device *dev, pm_message_t state, bool async)
                }
        }
  End:
-       up(&dev->sem);
+       device_unlock(dev);
        complete_all(&dev->power.completion);
 
        TRACE_RESUME(error);
@@ -629,7 +629,7 @@ static void dpm_resume(pm_message_t state)
  */
 static void device_complete(struct device *dev, pm_message_t state)
 {
-       down(&dev->sem);
+       device_lock(dev);
 
        if (dev->class && dev->class->pm && dev->class->pm->complete) {
                pm_dev_dbg(dev, state, "completing class ");
@@ -646,7 +646,7 @@ static void device_complete(struct device *dev, pm_message_t state)
                dev->bus->pm->complete(dev);
        }
 
-       up(&dev->sem);
+       device_unlock(dev);
 }
 
 /**
@@ -809,7 +809,7 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
        int error = 0;
 
        dpm_wait_for_children(dev, async);
-       down(&dev->sem);
+       device_lock(dev);
 
        if (async_error)
                goto End;
@@ -849,7 +849,7 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
                dev->power.status = DPM_OFF;
 
  End:
-       up(&dev->sem);
+       device_unlock(dev);
        complete_all(&dev->power.completion);
 
        return error;
@@ -938,7 +938,7 @@ static int device_prepare(struct device *dev, pm_message_t state)
 {
        int error = 0;
 
-       down(&dev->sem);
+       device_lock(dev);
 
        if (dev->bus && dev->bus->pm && dev->bus->pm->prepare) {
                pm_dev_dbg(dev, state, "preparing ");
@@ -962,7 +962,7 @@ static int device_prepare(struct device *dev, pm_message_t state)
                suspend_report_result(dev->class->pm->prepare, error);
        }
  End:
-       up(&dev->sem);
+       device_unlock(dev);
 
        return error;
 }
index 0d90390..8980fee 100644 (file)
@@ -54,7 +54,7 @@ sysdev_store(struct kobject *kobj, struct attribute *attr,
        return -EIO;
 }
 
-static struct sysfs_ops sysfs_ops = {
+static const struct sysfs_ops sysfs_ops = {
        .show   = sysdev_show,
        .store  = sysdev_store,
 };
@@ -89,7 +89,7 @@ static ssize_t sysdev_class_show(struct kobject *kobj, struct attribute *attr,
        struct sysdev_class_attribute *class_attr = to_sysdev_class_attr(attr);
 
        if (class_attr->show)
-               return class_attr->show(class, buffer);
+               return class_attr->show(class, class_attr, buffer);
        return -EIO;
 }
 
@@ -100,11 +100,11 @@ static ssize_t sysdev_class_store(struct kobject *kobj, struct attribute *attr,
        struct sysdev_class_attribute *class_attr = to_sysdev_class_attr(attr);
 
        if (class_attr->store)
-               return class_attr->store(class, buffer, count);
+               return class_attr->store(class, class_attr, buffer, count);
        return -EIO;
 }
 
-static struct sysfs_ops sysfs_class_ops = {
+static const struct sysfs_ops sysfs_class_ops = {
        .show   = sysdev_class_show,
        .store  = sysdev_class_store,
 };
@@ -145,13 +145,20 @@ int sysdev_class_register(struct sysdev_class *cls)
        if (retval)
                return retval;
 
-       return kset_register(&cls->kset);
+       retval = kset_register(&cls->kset);
+       if (!retval && cls->attrs)
+               retval = sysfs_create_files(&cls->kset.kobj,
+                                           (const struct attribute **)cls->attrs);
+       return retval;
 }
 
 void sysdev_class_unregister(struct sysdev_class *cls)
 {
        pr_debug("Unregistering sysdev class '%s'\n",
                 kobject_name(&cls->kset.kobj));
+       if (cls->attrs)
+               sysfs_remove_files(&cls->kset.kobj,
+                                  (const struct attribute **)cls->attrs);
        kset_unregister(&cls->kset);
 }
 
index a808b15..eb2091a 100644 (file)
@@ -476,7 +476,9 @@ static void class_osdblk_release(struct class *cls)
        kfree(cls);
 }
 
-static ssize_t class_osdblk_list(struct class *c, char *data)
+static ssize_t class_osdblk_list(struct class *c,
+                               struct class_attribute *attr,
+                               char *data)
 {
        int n = 0;
        struct list_head *tmp;
@@ -500,7 +502,9 @@ static ssize_t class_osdblk_list(struct class *c, char *data)
        return n;
 }
 
-static ssize_t class_osdblk_add(struct class *c, const char *buf, size_t count)
+static ssize_t class_osdblk_add(struct class *c,
+                               struct class_attribute *attr,
+                               const char *buf, size_t count)
 {
        struct osdblk_device *osdev;
        ssize_t rc;
@@ -592,7 +596,9 @@ err_out_mod:
        return rc;
 }
 
-static ssize_t class_osdblk_remove(struct class *c, const char *buf,
+static ssize_t class_osdblk_remove(struct class *c,
+                                       struct class_attribute *attr,
+                                       const char *buf,
                                        size_t count)
 {
        struct osdblk_device *osdev = NULL;
index b72935b..39c8514 100644 (file)
@@ -284,7 +284,7 @@ static ssize_t kobj_pkt_store(struct kobject *kobj,
        return len;
 }
 
-static struct sysfs_ops kobj_pkt_ops = {
+static const struct sysfs_ops kobj_pkt_ops = {
        .show = kobj_pkt_show,
        .store = kobj_pkt_store
 };
@@ -337,7 +337,9 @@ static void class_pktcdvd_release(struct class *cls)
 {
        kfree(cls);
 }
-static ssize_t class_pktcdvd_show_map(struct class *c, char *data)
+static ssize_t class_pktcdvd_show_map(struct class *c,
+                                       struct class_attribute *attr,
+                                       char *data)
 {
        int n = 0;
        int idx;
@@ -356,7 +358,9 @@ static ssize_t class_pktcdvd_show_map(struct class *c, char *data)
        return n;
 }
 
-static ssize_t class_pktcdvd_store_add(struct class *c, const char *buf,
+static ssize_t class_pktcdvd_store_add(struct class *c,
+                                       struct class_attribute *attr,
+                                       const char *buf,
                                        size_t count)
 {
        unsigned int major, minor;
@@ -376,7 +380,9 @@ static ssize_t class_pktcdvd_store_add(struct class *c, const char *buf,
        return -EINVAL;
 }
 
-static ssize_t class_pktcdvd_store_remove(struct class *c, const char *buf,
+static ssize_t class_pktcdvd_store_remove(struct class *c,
+                                         struct class_attribute *attr,
+                                         const char *buf,
                                        size_t count)
 {
        unsigned int major, minor;
index 67bc2ec..2d5d575 100644 (file)
@@ -766,7 +766,7 @@ static void cpufreq_sysfs_release(struct kobject *kobj)
        complete(&policy->kobj_unregister);
 }
 
-static struct sysfs_ops sysfs_ops = {
+static const struct sysfs_ops sysfs_ops = {
        .show   = show,
        .store  = store,
 };
index 97b0038..8719b36 100644 (file)
@@ -22,6 +22,7 @@ static int __init cpuidle_sysfs_setup(char *unused)
 __setup("cpuidle_sysfs_switch", cpuidle_sysfs_setup);
 
 static ssize_t show_available_governors(struct sysdev_class *class,
+                                       struct sysdev_class_attribute *attr,
                                        char *buf)
 {
        ssize_t i = 0;
@@ -41,6 +42,7 @@ out:
 }
 
 static ssize_t show_current_driver(struct sysdev_class *class,
+                                  struct sysdev_class_attribute *attr,
                                   char *buf)
 {
        ssize_t ret;
@@ -56,6 +58,7 @@ static ssize_t show_current_driver(struct sysdev_class *class,
 }
 
 static ssize_t show_current_governor(struct sysdev_class *class,
+                                    struct sysdev_class_attribute *attr,
                                     char *buf)
 {
        ssize_t ret;
@@ -71,6 +74,7 @@ static ssize_t show_current_governor(struct sysdev_class *class,
 }
 
 static ssize_t store_current_governor(struct sysdev_class *class,
+                                     struct sysdev_class_attribute *attr,
                                      const char *buf, size_t count)
 {
        char gov_name[CPUIDLE_NAME_LEN];
@@ -191,7 +195,7 @@ static ssize_t cpuidle_store(struct kobject * kobj, struct attribute * attr,
        return ret;
 }
 
-static struct sysfs_ops cpuidle_sysfs_ops = {
+static const struct sysfs_ops cpuidle_sysfs_ops = {
        .show = cpuidle_show,
        .store = cpuidle_store,
 };
@@ -277,7 +281,7 @@ static ssize_t cpuidle_state_show(struct kobject * kobj,
        return ret;
 }
 
-static struct sysfs_ops cpuidle_state_sysfs_ops = {
+static const struct sysfs_ops cpuidle_state_sysfs_ops = {
        .show = cpuidle_state_show,
 };
 
index af14c9a..0099340 100644 (file)
@@ -1138,7 +1138,7 @@ ioat_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
        return entry->show(&chan->common, page);
 }
 
-struct sysfs_ops ioat_sysfs_ops = {
+const struct sysfs_ops ioat_sysfs_ops = {
        .show   = ioat_attr_show,
 };
 
index 4f747a2..86b97ac 100644 (file)
@@ -346,7 +346,7 @@ bool ioat_cleanup_preamble(struct ioat_chan_common *chan,
                           unsigned long *phys_complete);
 void ioat_kobject_add(struct ioatdma_device *device, struct kobj_type *type);
 void ioat_kobject_del(struct ioatdma_device *device);
-extern struct sysfs_ops ioat_sysfs_ops;
+extern const struct sysfs_ops ioat_sysfs_ops;
 extern struct ioat_sysfs_entry ioat_version_attr;
 extern struct ioat_sysfs_entry ioat_cap_attr;
 #endif /* IOATDMA_H */
index 5376457..5fdedbc 100644 (file)
@@ -137,7 +137,7 @@ static ssize_t edac_dev_ctl_info_store(struct kobject *kobj,
 }
 
 /* edac_dev file operations for an 'ctl_info' */
-static struct sysfs_ops device_ctl_info_ops = {
+static const struct sysfs_ops device_ctl_info_ops = {
        .show = edac_dev_ctl_info_show,
        .store = edac_dev_ctl_info_store
 };
@@ -373,7 +373,7 @@ static ssize_t edac_dev_instance_store(struct kobject *kobj,
 }
 
 /* edac_dev file operations for an 'instance' */
-static struct sysfs_ops device_instance_ops = {
+static const struct sysfs_ops device_instance_ops = {
        .show = edac_dev_instance_show,
        .store = edac_dev_instance_store
 };
@@ -476,7 +476,7 @@ static ssize_t edac_dev_block_store(struct kobject *kobj,
 }
 
 /* edac_dev file operations for a 'block' */
-static struct sysfs_ops device_block_ops = {
+static const struct sysfs_ops device_block_ops = {
        .show = edac_dev_block_show,
        .store = edac_dev_block_store
 };
index e1d4ce0..88840e9 100644 (file)
@@ -245,7 +245,7 @@ static ssize_t csrowdev_store(struct kobject *kobj, struct attribute *attr,
        return -EIO;
 }
 
-static struct sysfs_ops csrowfs_ops = {
+static const struct sysfs_ops csrowfs_ops = {
        .show = csrowdev_show,
        .store = csrowdev_store
 };
@@ -575,7 +575,7 @@ static ssize_t mcidev_store(struct kobject *kobj, struct attribute *attr,
 }
 
 /* Intermediate show/store table */
-static struct sysfs_ops mci_ops = {
+static const struct sysfs_ops mci_ops = {
        .show = mcidev_show,
        .store = mcidev_store
 };
index fb60a87..bef94e3 100644 (file)
@@ -121,7 +121,7 @@ static ssize_t edac_pci_instance_store(struct kobject *kobj,
 }
 
 /* fs_ops table */
-static struct sysfs_ops pci_instance_ops = {
+static const struct sysfs_ops pci_instance_ops = {
        .show = edac_pci_instance_show,
        .store = edac_pci_instance_store
 };
@@ -261,7 +261,7 @@ static ssize_t edac_pci_dev_store(struct kobject *kobj,
        return -EIO;
 }
 
-static struct sysfs_ops edac_pci_sysfs_ops = {
+static const struct sysfs_ops edac_pci_sysfs_ops = {
        .show = edac_pci_dev_show,
        .store = edac_pci_dev_store
 };
index 014cabd..5db0518 100644 (file)
@@ -33,7 +33,6 @@
 #include <linux/module.h>
 #include <linux/mutex.h>
 #include <linux/rwsem.h>
-#include <linux/semaphore.h>
 #include <linux/spinlock.h>
 #include <linux/string.h>
 #include <linux/workqueue.h>
@@ -828,9 +827,9 @@ static int update_unit(struct device *dev, void *data)
        struct fw_driver *driver = (struct fw_driver *)dev->driver;
 
        if (is_fw_unit(dev) && driver != NULL && driver->update != NULL) {
-               down(&dev->sem);
+               device_lock(dev);
                driver->update(unit);
-               up(&dev->sem);
+               device_unlock(dev);
        }
 
        return 0;
index 9e4f59d..110e24e 100644 (file)
@@ -122,7 +122,7 @@ edd_attr_show(struct kobject * kobj, struct attribute *attr, char *buf)
        return ret;
 }
 
-static struct sysfs_ops edd_attr_ops = {
+static const struct sysfs_ops edd_attr_ops = {
        .show = edd_attr_show,
 };
 
index f4f709d..082f06e 100644 (file)
@@ -362,7 +362,7 @@ static ssize_t efivar_attr_store(struct kobject *kobj, struct attribute *attr,
        return ret;
 }
 
-static struct sysfs_ops efivar_attr_ops = {
+static const struct sysfs_ops efivar_attr_ops = {
        .show = efivar_attr_show,
        .store = efivar_attr_store,
 };
index a3600e3..ed2801c 100644 (file)
@@ -519,7 +519,7 @@ static ssize_t ibft_show_attribute(struct kobject *kobj,
        return ret;
 }
 
-static struct sysfs_ops ibft_attr_ops = {
+static const struct sysfs_ops ibft_attr_ops = {
        .show = ibft_show_attribute,
 };
 
index 20f6457..d59f7ca 100644 (file)
@@ -74,7 +74,7 @@ static struct attribute *def_attrs[] = {
        NULL
 };
 
-static struct sysfs_ops memmap_attr_ops = {
+static const struct sysfs_ops memmap_attr_ops = {
        .show = memmap_attr_show,
 };
 
index 9006fdb..6d1b866 100644 (file)
@@ -623,7 +623,9 @@ static const struct attribute_group gpiochip_attr_group = {
  * /sys/class/gpio/unexport ... write-only
  *     integer N ... number of GPIO to unexport
  */
-static ssize_t export_store(struct class *class, const char *buf, size_t len)
+static ssize_t export_store(struct class *class,
+                               struct class_attribute *attr,
+                               const char *buf, size_t len)
 {
        long    gpio;
        int     status;
@@ -653,7 +655,9 @@ done:
        return status ? : len;
 }
 
-static ssize_t unexport_store(struct class *class, const char *buf, size_t len)
+static ssize_t unexport_store(struct class *class,
+                               struct class_attribute *attr,
+                               const char *buf, size_t len)
 {
        long    gpio;
        int     status;
index 7e42b7e..014ce24 100644 (file)
@@ -70,19 +70,17 @@ static int drm_class_resume(struct device *dev)
        return 0;
 }
 
-/* Display the version of drm_core. This doesn't work right in current design */
-static ssize_t version_show(struct class *dev, char *buf)
-{
-       return sprintf(buf, "%s %d.%d.%d %s\n", CORE_NAME, CORE_MAJOR,
-                      CORE_MINOR, CORE_PATCHLEVEL, CORE_DATE);
-}
-
 static char *drm_devnode(struct device *dev, mode_t *mode)
 {
        return kasprintf(GFP_KERNEL, "dri/%s", dev_name(dev));
 }
 
-static CLASS_ATTR(version, S_IRUGO, version_show, NULL);
+static CLASS_ATTR_STRING(version, S_IRUGO,
+               CORE_NAME " "
+               __stringify(CORE_MAJOR) "."
+               __stringify(CORE_MINOR) "."
+               __stringify(CORE_PATCHLEVEL) " "
+               CORE_DATE);
 
 /**
  * drm_sysfs_create - create a struct drm_sysfs_class structure
@@ -109,7 +107,7 @@ struct class *drm_sysfs_create(struct module *owner, char *name)
        class->suspend = drm_class_suspend;
        class->resume = drm_class_resume;
 
-       err = class_create_file(class, &class_attr_version);
+       err = class_create_file(class, &class_attr_version.attr);
        if (err)
                goto err_out_class;
 
@@ -132,7 +130,7 @@ void drm_sysfs_destroy(void)
 {
        if ((drm_class == NULL) || (IS_ERR(drm_class)))
                return;
-       class_remove_file(drm_class, &class_attr_version);
+       class_remove_file(drm_class, &class_attr_version.attr);
        class_destroy(drm_class);
 }
 
index c7320ce..89c38c4 100644 (file)
@@ -128,7 +128,7 @@ static struct attribute *ttm_bo_global_attrs[] = {
        NULL
 };
 
-static struct sysfs_ops ttm_bo_global_ops = {
+static const struct sysfs_ops ttm_bo_global_ops = {
        .show = &ttm_bo_global_show
 };
 
index f5245c0..eb143e0 100644 (file)
@@ -152,7 +152,7 @@ static struct attribute *ttm_mem_zone_attrs[] = {
        NULL
 };
 
-static struct sysfs_ops ttm_mem_zone_ops = {
+static const struct sysfs_ops ttm_mem_zone_ops = {
        .show = &ttm_mem_zone_show,
        .store = &ttm_mem_zone_store
 };
index 913abd7..c7c2375 100644 (file)
@@ -850,7 +850,7 @@ static const struct i2c_algorithm omap_i2c_algo = {
        .functionality  = omap_i2c_func,
 };
 
-static int __init
+static int __devinit
 omap_i2c_probe(struct platform_device *pdev)
 {
        struct omap_i2c_dev     *dev;
index 5122b5a..1835021 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/moduleparam.h>
 #include <linux/mutex.h>
 #include <linux/freezer.h>
-#include <linux/semaphore.h>
 #include <asm/atomic.h>
 
 #include "csr.h"
@@ -1397,9 +1396,9 @@ static int update_pdrv(struct device *dev, void *data)
                        pdrv = container_of(drv, struct hpsb_protocol_driver,
                                            driver);
                        if (pdrv->update) {
-                               down(&ud->device.sem);
+                               device_lock(&ud->device);
                                error = pdrv->update(ud);
-                               up(&ud->device.sem);
+                               device_unlock(&ud->device);
                        }
                        if (error)
                                device_release_driver(&ud->device);
index 5130fc5..764787e 100644 (file)
@@ -3597,7 +3597,7 @@ static ssize_t cm_show_counter(struct kobject *obj, struct attribute *attr,
                       atomic_long_read(&group->counter[cm_attr->index]));
 }
 
-static struct sysfs_ops cm_counter_ops = {
+static const struct sysfs_ops cm_counter_ops = {
        .show = cm_show_counter
 };
 
index 158a214..1558bb7 100644 (file)
@@ -79,7 +79,7 @@ static ssize_t port_attr_show(struct kobject *kobj,
        return port_attr->show(p, port_attr, buf);
 }
 
-static struct sysfs_ops port_sysfs_ops = {
+static const struct sysfs_ops port_sysfs_ops = {
        .show = port_attr_show
 };
 
index 1b09b73..017d6e2 100644 (file)
@@ -1336,11 +1336,8 @@ static void ib_ucm_remove_one(struct ib_device *device)
        device_unregister(&ucm_dev->dev);
 }
 
-static ssize_t show_abi_version(struct class *class, char *buf)
-{
-       return sprintf(buf, "%d\n", IB_USER_CM_ABI_VERSION);
-}
-static CLASS_ATTR(abi_version, S_IRUGO, show_abi_version, NULL);
+static CLASS_ATTR_STRING(abi_version, S_IRUGO,
+                        __stringify(IB_USER_CM_ABI_VERSION));
 
 static int __init ib_ucm_init(void)
 {
@@ -1353,7 +1350,7 @@ static int __init ib_ucm_init(void)
                goto error1;
        }
 
-       ret = class_create_file(&cm_class, &class_attr_abi_version);
+       ret = class_create_file(&cm_class, &class_attr_abi_version.attr);
        if (ret) {
                printk(KERN_ERR "ucm: couldn't create abi_version attribute\n");
                goto error2;
@@ -1367,7 +1364,7 @@ static int __init ib_ucm_init(void)
        return 0;
 
 error3:
-       class_remove_file(&cm_class, &class_attr_abi_version);
+       class_remove_file(&cm_class, &class_attr_abi_version.attr);
 error2:
        unregister_chrdev_region(IB_UCM_BASE_DEV, IB_UCM_MAX_DEVICES);
 error1:
@@ -1377,7 +1374,7 @@ error1:
 static void __exit ib_ucm_cleanup(void)
 {
        ib_unregister_client(&ucm_client);
-       class_remove_file(&cm_class, &class_attr_abi_version);
+       class_remove_file(&cm_class, &class_attr_abi_version.attr);
        unregister_chrdev_region(IB_UCM_BASE_DEV, IB_UCM_MAX_DEVICES);
        if (overflow_maj)
                unregister_chrdev_region(overflow_maj, IB_UCM_MAX_DEVICES);
index 02d360c..04b585e 100644 (file)
@@ -965,11 +965,8 @@ static ssize_t show_port(struct device *dev, struct device_attribute *attr,
 }
 static DEVICE_ATTR(port, S_IRUGO, show_port, NULL);
 
-static ssize_t show_abi_version(struct class *class, char *buf)
-{
-       return sprintf(buf, "%d\n", IB_USER_MAD_ABI_VERSION);
-}
-static CLASS_ATTR(abi_version, S_IRUGO, show_abi_version, NULL);
+static CLASS_ATTR_STRING(abi_version, S_IRUGO,
+                        __stringify(IB_USER_MAD_ABI_VERSION));
 
 static dev_t overflow_maj;
 static DECLARE_BITMAP(overflow_map, IB_UMAD_MAX_PORTS);
@@ -1194,7 +1191,7 @@ static int __init ib_umad_init(void)
                goto out_chrdev;
        }
 
-       ret = class_create_file(umad_class, &class_attr_abi_version);
+       ret = class_create_file(umad_class, &class_attr_abi_version.attr);
        if (ret) {
                printk(KERN_ERR "user_mad: couldn't create abi_version attribute\n");
                goto out_class;
index 4fa2e65..d805cf3 100644 (file)
@@ -691,11 +691,8 @@ static ssize_t show_dev_abi_version(struct device *device,
 }
 static DEVICE_ATTR(abi_version, S_IRUGO, show_dev_abi_version, NULL);
 
-static ssize_t show_abi_version(struct class *class, char *buf)
-{
-       return sprintf(buf, "%d\n", IB_USER_VERBS_ABI_VERSION);
-}
-static CLASS_ATTR(abi_version, S_IRUGO, show_abi_version, NULL);
+static CLASS_ATTR_STRING(abi_version, S_IRUGO,
+                        __stringify(IB_USER_VERBS_ABI_VERSION));
 
 static dev_t overflow_maj;
 static DECLARE_BITMAP(overflow_map, IB_UVERBS_MAX_DEVICES);
@@ -841,7 +838,7 @@ static int __init ib_uverbs_init(void)
                goto out_chrdev;
        }
 
-       ret = class_create_file(uverbs_class, &class_attr_abi_version);
+       ret = class_create_file(uverbs_class, &class_attr_abi_version.attr);
        if (ret) {
                printk(KERN_ERR "user_verbs: couldn't create abi_version attribute\n");
                goto out_class;
index 437f55c..419795f 100644 (file)
@@ -321,6 +321,7 @@ int wf_register_sensor(struct wf_sensor *new_sr)
        kref_init(&new_sr->ref);
        list_add(&new_sr->link, &wf_sensors);
 
+       sysfs_attr_init(&new_sr->attr.attr);
        new_sr->attr.attr.name = new_sr->name;
        new_sr->attr.attr.mode = 0444;
        new_sr->attr.show = wf_show_sensor;
index 6c68b9e..43137b4 100644 (file)
@@ -173,6 +173,7 @@ static struct smu_fan_control *smu_fan_create(struct device_node *node,
 
        fct->fan_type = pwm_fan;
        fct->ctrl.type = pwm_fan ? WF_CONTROL_PWM_FAN : WF_CONTROL_RPM_FAN;
+       sysfs_attr_init(&fct->ctrl.attr.attr);
 
        /* We use the name & location here the same way we do for SMU sensors,
         * see the comment in windfarm_smu_sensors.c. The locations are a bit
index f91b409..84d2b91 100644 (file)
@@ -75,7 +75,7 @@ static struct attribute *dm_attrs[] = {
        NULL,
 };
 
-static struct sysfs_ops dm_sysfs_ops = {
+static const struct sysfs_ops dm_sysfs_ops = {
        .show   = dm_attr_show,
 };
 
index a20a71e..fdc1890 100644 (file)
@@ -2642,7 +2642,7 @@ static void rdev_free(struct kobject *ko)
        mdk_rdev_t *rdev = container_of(ko, mdk_rdev_t, kobj);
        kfree(rdev);
 }
-static struct sysfs_ops rdev_sysfs_ops = {
+static const struct sysfs_ops rdev_sysfs_ops = {
        .show           = rdev_attr_show,
        .store          = rdev_attr_store,
 };
@@ -4059,7 +4059,7 @@ static void md_free(struct kobject *ko)
        kfree(mddev);
 }
 
-static struct sysfs_ops md_sysfs_ops = {
+static const struct sysfs_ops md_sysfs_ops = {
        .show   = md_attr_show,
        .store  = md_attr_store,
 };
index 7400eac..142c327 100644 (file)
@@ -1735,7 +1735,7 @@ static struct v4l2_int_device omap24xxcam = {
  *
  */
 
-static int __init omap24xxcam_probe(struct platform_device *pdev)
+static int __devinit omap24xxcam_probe(struct platform_device *pdev)
 {
        struct omap24xxcam_device *cam;
        struct resource *mem;
index 04c2726..779aa8e 100644 (file)
@@ -497,12 +497,7 @@ static struct pci_driver phantom_pci_driver = {
        .resume = phantom_resume
 };
 
-static ssize_t phantom_show_version(struct class *cls, char *buf)
-{
-       return sprintf(buf, PHANTOM_VERSION "\n");
-}
-
-static CLASS_ATTR(version, 0444, phantom_show_version, NULL);
+static CLASS_ATTR_STRING(version, 0444, PHANTOM_VERSION);
 
 static int __init phantom_init(void)
 {
@@ -515,7 +510,7 @@ static int __init phantom_init(void)
                printk(KERN_ERR "phantom: can't register phantom class\n");
                goto err;
        }
-       retval = class_create_file(phantom_class, &class_attr_version);
+       retval = class_create_file(phantom_class, &class_attr_version.attr);
        if (retval) {
                printk(KERN_ERR "phantom: can't create sysfs version file\n");
                goto err_class;
@@ -541,7 +536,7 @@ static int __init phantom_init(void)
 err_unchr:
        unregister_chrdev_region(dev, PHANTOM_MAX_MINORS);
 err_attr:
-       class_remove_file(phantom_class, &class_attr_version);
+       class_remove_file(phantom_class, &class_attr_version.attr);
 err_class:
        class_destroy(phantom_class);
 err:
@@ -554,7 +549,7 @@ static void __exit phantom_exit(void)
 
        unregister_chrdev_region(MKDEV(phantom_major, 0), PHANTOM_MAX_MINORS);
 
-       class_remove_file(phantom_class, &class_attr_version);
+       class_remove_file(phantom_class, &class_attr_version.attr);
        class_destroy(phantom_class);
 
        pr_debug("phantom: module successfully removed\n");
index bc45ef9..fad40aa 100644 (file)
@@ -89,7 +89,8 @@ DEFINE_MUTEX(ubi_devices_mutex);
 static DEFINE_SPINLOCK(ubi_devices_lock);
 
 /* "Show" method for files in '/<sysfs>/class/ubi/' */
-static ssize_t ubi_version_show(struct class *class, char *buf)
+static ssize_t ubi_version_show(struct class *class, struct class_attribute *attr,
+                               char *buf)
 {
        return sprintf(buf, "%d\n", UBI_VERSION);
 }
index 5acd557..b8bec08 100644 (file)
@@ -51,7 +51,9 @@
  * "show" function for the bond_masters attribute.
  * The class parameter is ignored.
  */
-static ssize_t bonding_show_bonds(struct class *cls, char *buf)
+static ssize_t bonding_show_bonds(struct class *cls,
+                                 struct class_attribute *attr,
+                                 char *buf)
 {
        struct net *net = current->nsproxy->net_ns;
        struct bond_net *bn = net_generic(net, bond_net_id);
@@ -98,6 +100,7 @@ static struct net_device *bond_get_by_name(struct net *net, const char *ifname)
  */
 
 static ssize_t bonding_store_bonds(struct class *cls,
+                                  struct class_attribute *attr,
                                   const char *buffer, size_t count)
 {
        struct net *net = current->nsproxy->net_ns;
index f2b9379..0bc777b 100644 (file)
@@ -1577,7 +1577,7 @@ static struct attribute * veth_pool_attrs[] = {
        NULL,
 };
 
-static struct sysfs_ops veth_pool_ops = {
+static const struct sysfs_ops veth_pool_ops = {
        .show   = veth_pool_show,
        .store  = veth_pool_store,
 };
index 966de5d..e6e972d 100644 (file)
@@ -384,7 +384,7 @@ static struct attribute *veth_cnx_default_attrs[] = {
        NULL
 };
 
-static struct sysfs_ops veth_cnx_sysfs_ops = {
+static const struct sysfs_ops veth_cnx_sysfs_ops = {
                .show = veth_cnx_attribute_show
 };
 
@@ -441,7 +441,7 @@ static struct attribute *veth_port_default_attrs[] = {
        NULL
 };
 
-static struct sysfs_ops veth_port_sysfs_ops = {
+static const struct sysfs_ops veth_port_sysfs_ops = {
        .show = veth_port_attribute_show
 };
 
index 0bc5d47..1062b8f 100644 (file)
@@ -481,7 +481,7 @@ pdcspath_attr_store(struct kobject *kobj, struct attribute *attr,
        return ret;
 }
 
-static struct sysfs_ops pdcspath_attr_ops = {
+static const struct sysfs_ops pdcspath_attr_ops = {
        .show = pdcspath_attr_show,
        .store = pdcspath_attr_store,
 };
index 712250f..26301cb 100644 (file)
@@ -288,9 +288,9 @@ void pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev *, void *),
                        next = dev->bus_list.next;
 
                /* Run device routines with the device locked */
-               down(&dev->dev.sem);
+               device_lock(&dev->dev);
                retval = cb(dev, userdata);
-               up(&dev->dev.sem);
+               device_unlock(&dev->dev);
                if (retval)
                        break;
        }
index 6151389..0a894ef 100644 (file)
@@ -73,7 +73,7 @@ static void legacy_release(struct kobject *kobj)
 }
 
 static struct kobj_type legacy_ktype = {
-       .sysfs_ops = &(struct sysfs_ops){
+       .sysfs_ops = &(const struct sysfs_ops){
                .store = legacy_store, .show = legacy_show
        },
        .release = &legacy_release,
index 807224e..de29645 100644 (file)
@@ -642,6 +642,7 @@ void pci_create_legacy_files(struct pci_bus *b)
        if (!b->legacy_io)
                goto kzalloc_err;
 
+       sysfs_bin_attr_init(b->legacy_io);
        b->legacy_io->attr.name = "legacy_io";
        b->legacy_io->size = 0xffff;
        b->legacy_io->attr.mode = S_IRUSR | S_IWUSR;
@@ -654,6 +655,7 @@ void pci_create_legacy_files(struct pci_bus *b)
                goto legacy_io_err;
 
        /* Allocated above after the legacy_io struct */
+       sysfs_bin_attr_init(b->legacy_mem);
        b->legacy_mem = b->legacy_io + 1;
        b->legacy_mem->attr.name = "legacy_mem";
        b->legacy_mem->size = 1024*1024;
@@ -800,6 +802,7 @@ static int pci_create_attr(struct pci_dev *pdev, int num, int write_combine)
        if (res_attr) {
                char *res_attr_name = (char *)(res_attr + 1);
 
+               sysfs_bin_attr_init(res_attr);
                if (write_combine) {
                        pdev->res_attr_wc[num] = res_attr;
                        sprintf(res_attr_name, "resource%d_wc", num);
@@ -972,6 +975,7 @@ static int pci_create_capabilities_sysfs(struct pci_dev *dev)
                if (!attr)
                        return -ENOMEM;
 
+               sysfs_bin_attr_init(attr);
                attr->size = dev->vpd->len;
                attr->attr.name = "vpd";
                attr->attr.mode = S_IRUSR | S_IWUSR;
@@ -1038,6 +1042,7 @@ int __must_check pci_create_sysfs_dev_files (struct pci_dev *pdev)
                        retval = -ENOMEM;
                        goto err_resource_files;
                }
+               sysfs_bin_attr_init(attr);
                attr->size = rom_size;
                attr->attr.name = "rom";
                attr->attr.mode = S_IRUSR;
index 77b493b..897fa5c 100644 (file)
@@ -2486,7 +2486,7 @@ static int pci_dev_reset(struct pci_dev *dev, int probe)
        if (!probe) {
                pci_block_user_cfg_access(dev);
                /* block PM suspend, driver probe, etc. */
-               down(&dev->dev.sem);
+               device_lock(&dev->dev);
        }
 
        rc = pci_dev_specific_reset(dev, probe);
@@ -2508,7 +2508,7 @@ static int pci_dev_reset(struct pci_dev *dev, int probe)
        rc = pci_parent_bus_reset(dev, probe);
 done:
        if (!probe) {
-               up(&dev->dev.sem);
+               device_unlock(&dev->dev);
                pci_unblock_user_cfg_access(dev);
        }
 
index 49c9e6c..f75a44d 100644 (file)
@@ -29,7 +29,7 @@ static ssize_t pci_slot_attr_store(struct kobject *kobj,
        return attribute->store ? attribute->store(slot, buf, len) : -EIO;
 }
 
-static struct sysfs_ops pci_slot_sysfs_ops = {
+static const struct sysfs_ops pci_slot_sysfs_ops = {
        .show = pci_slot_attr_show,
        .store = pci_slot_attr_store,
 };
index 0f98be4..ad93ebd 100644 (file)
@@ -971,9 +971,9 @@ static int runtime_suspend(struct device *dev)
 {
        int rc;
 
-       down(&dev->sem);
+       device_lock(dev);
        rc = pcmcia_dev_suspend(dev, PMSG_SUSPEND);
-       up(&dev->sem);
+       device_unlock(dev);
        return rc;
 }
 
@@ -981,9 +981,9 @@ static int runtime_resume(struct device *dev)
 {
        int rc;
 
-       down(&dev->sem);
+       device_lock(dev);
        rc = pcmcia_dev_resume(dev);
-       up(&dev->sem);
+       device_unlock(dev);
        return rc;
 }
 
index cd2ee6f..e631dbe 100644 (file)
@@ -150,6 +150,7 @@ config MSI_LAPTOP
        tristate "MSI Laptop Extras"
        depends on ACPI
        depends on BACKLIGHT_CLASS_DEVICE
+       depends on RFKILL
        ---help---
          This is a driver for laptops built by MSI (MICRO-STAR
          INTERNATIONAL):
index 3aa57da..7ccf33c 100644 (file)
@@ -57,7 +57,7 @@ enum hp_wmi_radio {
        HPWMI_WWAN = 2,
 };
 
-static int __init hp_wmi_bios_setup(struct platform_device *device);
+static int __devinit hp_wmi_bios_setup(struct platform_device *device);
 static int __exit hp_wmi_bios_remove(struct platform_device *device);
 static int hp_wmi_resume_handler(struct device *device);
 
@@ -447,7 +447,7 @@ static void cleanup_sysfs(struct platform_device *device)
        device_remove_file(&device->dev, &dev_attr_tablet);
 }
 
-static int __init hp_wmi_bios_setup(struct platform_device *device)
+static int __devinit hp_wmi_bios_setup(struct platform_device *device)
 {
        int err;
        int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0);
index 759763d..c2b05da 100644 (file)
@@ -58,6 +58,7 @@
 #include <linux/dmi.h>
 #include <linux/backlight.h>
 #include <linux/platform_device.h>
+#include <linux/rfkill.h>
 
 #define MSI_DRIVER_VERSION "0.5"
 
 #define MSI_EC_COMMAND_WIRELESS 0x10
 #define MSI_EC_COMMAND_LCD_LEVEL 0x11
 
+#define MSI_STANDARD_EC_COMMAND_ADDRESS        0x2e
+#define MSI_STANDARD_EC_BLUETOOTH_MASK (1 << 0)
+#define MSI_STANDARD_EC_WEBCAM_MASK    (1 << 1)
+#define MSI_STANDARD_EC_WLAN_MASK      (1 << 3)
+#define MSI_STANDARD_EC_3G_MASK                (1 << 4)
+
+/* For set SCM load flag to disable BIOS fn key */
+#define MSI_STANDARD_EC_SCM_LOAD_ADDRESS       0x2d
+#define MSI_STANDARD_EC_SCM_LOAD_MASK          (1 << 0)
+
+static int msi_laptop_resume(struct platform_device *device);
+
+#define MSI_STANDARD_EC_DEVICES_EXISTS_ADDRESS 0x2f
+
 static int force;
 module_param(force, bool, 0);
 MODULE_PARM_DESC(force, "Force driver load, ignore DMI data");
@@ -74,6 +89,23 @@ static int auto_brightness;
 module_param(auto_brightness, int, 0);
 MODULE_PARM_DESC(auto_brightness, "Enable automatic brightness control (0: disabled; 1: enabled; 2: don't touch)");
 
+static bool old_ec_model;
+static int wlan_s, bluetooth_s, threeg_s;
+static int threeg_exists;
+
+/* Some MSI 3G netbook only have one fn key to control Wlan/Bluetooth/3G,
+ * those netbook will load the SCM (windows app) to disable the original
+ * Wlan/Bluetooth control by BIOS when user press fn key, then control
+ * Wlan/Bluetooth/3G by SCM (software control by OS). Without SCM, user
+ * cann't on/off 3G module on those 3G netbook.
+ * On Linux, msi-laptop driver will do the same thing to disable the
+ * original BIOS control, then might need use HAL or other userland
+ * application to do the software control that simulate with SCM.
+ * e.g. MSI N034 netbook
+ */
+static bool load_scm_model;
+static struct rfkill *rfk_wlan, *rfk_bluetooth, *rfk_threeg;
+
 /* Hardware access */
 
 static int set_lcd_level(int level)
@@ -130,6 +162,35 @@ static int set_auto_brightness(int enable)
        return ec_transaction(MSI_EC_COMMAND_LCD_LEVEL, wdata, 2, NULL, 0, 1);
 }
 
+static ssize_t set_device_state(const char *buf, size_t count, u8 mask)
+{
+       int status;
+       u8 wdata = 0, rdata;
+       int result;
+
+       if (sscanf(buf, "%i", &status) != 1 || (status < 0 || status > 1))
+               return -EINVAL;
+
+       /* read current device state */
+       result = ec_read(MSI_STANDARD_EC_COMMAND_ADDRESS, &rdata);
+       if (result < 0)
+               return -EINVAL;
+
+       if (!!(rdata & mask) != status) {
+               /* reverse device bit */
+               if (rdata & mask)
+                       wdata = rdata & ~mask;
+               else
+                       wdata = rdata | mask;
+
+               result = ec_write(MSI_STANDARD_EC_COMMAND_ADDRESS, wdata);
+               if (result < 0)
+                       return -EINVAL;
+       }
+
+       return count;
+}
+
 static int get_wireless_state(int *wlan, int *bluetooth)
 {
        u8 wdata = 0, rdata;
@@ -148,6 +209,38 @@ static int get_wireless_state(int *wlan, int *bluetooth)
        return 0;
 }
 
+static int get_wireless_state_ec_standard(void)
+{
+       u8 rdata;
+       int result;
+
+       result = ec_read(MSI_STANDARD_EC_COMMAND_ADDRESS, &rdata);
+       if (result < 0)
+               return -1;
+
+       wlan_s = !!(rdata & MSI_STANDARD_EC_WLAN_MASK);
+
+       bluetooth_s = !!(rdata & MSI_STANDARD_EC_BLUETOOTH_MASK);
+
+       threeg_s = !!(rdata & MSI_STANDARD_EC_3G_MASK);
+
+       return 0;
+}
+
+static int get_threeg_exists(void)
+{
+       u8 rdata;
+       int result;
+
+       result = ec_read(MSI_STANDARD_EC_DEVICES_EXISTS_ADDRESS, &rdata);
+       if (result < 0)
+               return -1;
+
+       threeg_exists = !!(rdata & MSI_STANDARD_EC_3G_MASK);
+
+       return 0;
+}
+
 /* Backlight device stuff */
 
 static int bl_get_brightness(struct backlight_device *b)
@@ -176,26 +269,71 @@ static ssize_t show_wlan(struct device *dev,
 
        int ret, enabled;
 
-       ret = get_wireless_state(&enabled, NULL);
+       if (old_ec_model) {
+               ret = get_wireless_state(&enabled, NULL);
+       } else {
+               ret = get_wireless_state_ec_standard();
+               enabled = wlan_s;
+       }
        if (ret < 0)
                return ret;
 
        return sprintf(buf, "%i\n", enabled);
 }
 
+static ssize_t store_wlan(struct device *dev,
+       struct device_attribute *attr, const char *buf, size_t count)
+{
+       return set_device_state(buf, count, MSI_STANDARD_EC_WLAN_MASK);
+}
+
 static ssize_t show_bluetooth(struct device *dev,
        struct device_attribute *attr, char *buf)
 {
 
        int ret, enabled;
 
-       ret = get_wireless_state(NULL, &enabled);
+       if (old_ec_model) {
+               ret = get_wireless_state(NULL, &enabled);
+       } else {
+               ret = get_wireless_state_ec_standard();
+               enabled = bluetooth_s;
+       }
        if (ret < 0)
                return ret;
 
        return sprintf(buf, "%i\n", enabled);
 }
 
+static ssize_t store_bluetooth(struct device *dev,
+       struct device_attribute *attr, const char *buf, size_t count)
+{
+       return set_device_state(buf, count, MSI_STANDARD_EC_BLUETOOTH_MASK);
+}
+
+static ssize_t show_threeg(struct device *dev,
+       struct device_attribute *attr, char *buf)
+{
+
+       int ret;
+
+       /* old msi ec not support 3G */
+       if (old_ec_model)
+               return -1;
+
+       ret = get_wireless_state_ec_standard();
+       if (ret < 0)
+               return ret;
+
+       return sprintf(buf, "%i\n", threeg_s);
+}
+
+static ssize_t store_threeg(struct device *dev,
+       struct device_attribute *attr, const char *buf, size_t count)
+{
+       return set_device_state(buf, count, MSI_STANDARD_EC_3G_MASK);
+}
+
 static ssize_t show_lcd_level(struct device *dev,
        struct device_attribute *attr, char *buf)
 {
@@ -258,6 +396,7 @@ static DEVICE_ATTR(lcd_level, 0644, show_lcd_level, store_lcd_level);
 static DEVICE_ATTR(auto_brightness, 0644, show_auto_brightness, store_auto_brightness);
 static DEVICE_ATTR(bluetooth, 0444, show_bluetooth, NULL);
 static DEVICE_ATTR(wlan, 0444, show_wlan, NULL);
+static DEVICE_ATTR(threeg, 0444, show_threeg, NULL);
 
 static struct attribute *msipf_attributes[] = {
        &dev_attr_lcd_level.attr,
@@ -275,7 +414,8 @@ static struct platform_driver msipf_driver = {
        .driver = {
                .name = "msi-laptop-pf",
                .owner = THIS_MODULE,
-       }
+       },
+       .resume = msi_laptop_resume,
 };
 
 static struct platform_device *msipf_device;
@@ -332,6 +472,192 @@ static struct dmi_system_id __initdata msi_dmi_table[] = {
        { }
 };
 
+static struct dmi_system_id __initdata msi_load_scm_models_dmi_table[] = {
+       {
+               .ident = "MSI N034",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR,
+                               "MICRO-STAR INTERNATIONAL CO., LTD"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "MS-N034"),
+                       DMI_MATCH(DMI_CHASSIS_VENDOR,
+                       "MICRO-STAR INTERNATIONAL CO., LTD")
+               },
+               .callback = dmi_check_cb
+       },
+       { }
+};
+
+static int rfkill_bluetooth_set(void *data, bool blocked)
+{
+       /* Do something with blocked...*/
+       /*
+        * blocked == false is on
+        * blocked == true is off
+        */
+       if (blocked)
+               set_device_state("0", 0, MSI_STANDARD_EC_BLUETOOTH_MASK);
+       else
+               set_device_state("1", 0, MSI_STANDARD_EC_BLUETOOTH_MASK);
+
+       return 0;
+}
+
+static int rfkill_wlan_set(void *data, bool blocked)
+{
+       if (blocked)
+               set_device_state("0", 0, MSI_STANDARD_EC_WLAN_MASK);
+       else
+               set_device_state("1", 0, MSI_STANDARD_EC_WLAN_MASK);
+
+       return 0;
+}
+
+static int rfkill_threeg_set(void *data, bool blocked)
+{
+       if (blocked)
+               set_device_state("0", 0, MSI_STANDARD_EC_3G_MASK);
+       else
+               set_device_state("1", 0, MSI_STANDARD_EC_3G_MASK);
+
+       return 0;
+}
+
+static struct rfkill_ops rfkill_bluetooth_ops = {
+       .set_block = rfkill_bluetooth_set
+};
+
+static struct rfkill_ops rfkill_wlan_ops = {
+       .set_block = rfkill_wlan_set
+};
+
+static struct rfkill_ops rfkill_threeg_ops = {
+       .set_block = rfkill_threeg_set
+};
+
+static void rfkill_cleanup(void)
+{
+       if (rfk_bluetooth) {
+               rfkill_unregister(rfk_bluetooth);
+               rfkill_destroy(rfk_bluetooth);
+       }
+
+       if (rfk_threeg) {
+               rfkill_unregister(rfk_threeg);
+               rfkill_destroy(rfk_threeg);
+       }
+
+       if (rfk_wlan) {
+               rfkill_unregister(rfk_wlan);
+               rfkill_destroy(rfk_wlan);
+       }
+}
+
+static int rfkill_init(struct platform_device *sdev)
+{
+       /* add rfkill */
+       int retval;
+
+       rfk_bluetooth = rfkill_alloc("msi-bluetooth", &sdev->dev,
+                               RFKILL_TYPE_BLUETOOTH,
+                               &rfkill_bluetooth_ops, NULL);
+       if (!rfk_bluetooth) {
+               retval = -ENOMEM;
+               goto err_bluetooth;
+       }
+       retval = rfkill_register(rfk_bluetooth);
+       if (retval)
+               goto err_bluetooth;
+
+       rfk_wlan = rfkill_alloc("msi-wlan", &sdev->dev, RFKILL_TYPE_WLAN,
+                               &rfkill_wlan_ops, NULL);
+       if (!rfk_wlan) {
+               retval = -ENOMEM;
+               goto err_wlan;
+       }
+       retval = rfkill_register(rfk_wlan);
+       if (retval)
+               goto err_wlan;
+
+       if (threeg_exists) {
+               rfk_threeg = rfkill_alloc("msi-threeg", &sdev->dev,
+                               RFKILL_TYPE_WWAN, &rfkill_threeg_ops, NULL);
+               if (!rfk_threeg) {
+                       retval = -ENOMEM;
+                       goto err_threeg;
+               }
+               retval = rfkill_register(rfk_threeg);
+               if (retval)
+                       goto err_threeg;
+       }
+
+       return 0;
+
+err_threeg:
+       rfkill_destroy(rfk_threeg);
+       if (rfk_wlan)
+               rfkill_unregister(rfk_wlan);
+err_wlan:
+       rfkill_destroy(rfk_wlan);
+       if (rfk_bluetooth)
+               rfkill_unregister(rfk_bluetooth);
+err_bluetooth:
+       rfkill_destroy(rfk_bluetooth);
+
+       return retval;
+}
+
+static int msi_laptop_resume(struct platform_device *device)
+{
+       u8 data;
+       int result;
+
+       if (!load_scm_model)
+               return 0;
+
+       /* set load SCM to disable hardware control by fn key */
+       result = ec_read(MSI_STANDARD_EC_SCM_LOAD_ADDRESS, &data);
+       if (result < 0)
+               return result;
+
+       result = ec_write(MSI_STANDARD_EC_SCM_LOAD_ADDRESS,
+               data | MSI_STANDARD_EC_SCM_LOAD_MASK);
+       if (result < 0)
+               return result;
+
+       return 0;
+}
+
+static int load_scm_model_init(struct platform_device *sdev)
+{
+       u8 data;
+       int result;
+
+       /* allow userland write sysfs file  */
+       dev_attr_bluetooth.store = store_bluetooth;
+       dev_attr_wlan.store = store_wlan;
+       dev_attr_threeg.store = store_threeg;
+       dev_attr_bluetooth.attr.mode |= S_IWUSR;
+       dev_attr_wlan.attr.mode |= S_IWUSR;
+       dev_attr_threeg.attr.mode |= S_IWUSR;
+
+       /* disable hardware control by fn key */
+       result = ec_read(MSI_STANDARD_EC_SCM_LOAD_ADDRESS, &data);
+       if (result < 0)
+               return result;
+
+       result = ec_write(MSI_STANDARD_EC_SCM_LOAD_ADDRESS,
+               data | MSI_STANDARD_EC_SCM_LOAD_MASK);
+       if (result < 0)
+               return result;
+
+       /* initial rfkill */
+       result = rfkill_init(sdev);
+       if (result < 0)
+               return result;
+
+       return 0;
+}
+
 static int __init msi_init(void)
 {
        int ret;
@@ -339,8 +665,14 @@ static int __init msi_init(void)
        if (acpi_disabled)
                return -ENODEV;
 
-       if (!force && !dmi_check_system(msi_dmi_table))
-               return -ENODEV;
+       if (force || dmi_check_system(msi_dmi_table))
+               old_ec_model = 1;
+
+       if (!old_ec_model)
+               get_threeg_exists();
+
+       if (!old_ec_model && dmi_check_system(msi_load_scm_models_dmi_table))
+               load_scm_model = 1;
 
        if (auto_brightness < 0 || auto_brightness > 2)
                return -EINVAL;
@@ -374,10 +706,23 @@ static int __init msi_init(void)
        if (ret)
                goto fail_platform_device1;
 
+       if (load_scm_model && (load_scm_model_init(msipf_device) < 0)) {
+               ret = -EINVAL;
+               goto fail_platform_device1;
+       }
+
        ret = sysfs_create_group(&msipf_device->dev.kobj, &msipf_attribute_group);
        if (ret)
                goto fail_platform_device2;
 
+       if (!old_ec_model) {
+               if (threeg_exists)
+                       ret = device_create_file(&msipf_device->dev,
+                                               &dev_attr_threeg);
+               if (ret)
+                       goto fail_platform_device2;
+       }
+
        /* Disable automatic brightness control by default because
         * this module was probably loaded to do brightness control in
         * software. */
@@ -412,10 +757,14 @@ static void __exit msi_cleanup(void)
 {
 
        sysfs_remove_group(&msipf_device->dev.kobj, &msipf_attribute_group);
+       if (!old_ec_model && threeg_exists)
+               device_remove_file(&msipf_device->dev, &dev_attr_threeg);
        platform_device_unregister(msipf_device);
        platform_driver_unregister(&msipf_driver);
        backlight_device_unregister(msibl_device);
 
+       rfkill_cleanup();
+
        /* Enable automatic brightness control again */
        if (auto_brightness != 2)
                set_auto_brightness(1);
@@ -435,3 +784,4 @@ MODULE_ALIAS("dmi:*:svnMICRO-STARINT'LCO.,LTD:pnMS-1013:pvr0131*:cvnMICRO-STARIN
 MODULE_ALIAS("dmi:*:svnMicro-StarInternational:pnMS-1058:pvr0581:rvnMSI:rnMS-1058:*:ct10:*");
 MODULE_ALIAS("dmi:*:svnMicro-StarInternational:pnMS-1412:*:rvnMSI:rnMS-1412:*:cvnMICRO-STARINT'LCO.,LTD:ct10:*");
 MODULE_ALIAS("dmi:*:svnNOTEBOOK:pnSAM2000:pvr0131*:cvnMICRO-STARINT'LCO.,LTD:ct10:*");
+MODULE_ALIAS("dmi:*:svnMICRO-STARINTERNATIONAL*:pnMS-N034:*");
index 0807b26..fef0e3c 100644 (file)
@@ -226,7 +226,7 @@ static struct scsi_host_template sgiwd93_template = {
        .use_clustering         = DISABLE_CLUSTERING,
 };
 
-static int __init sgiwd93_probe(struct platform_device *pdev)
+static int __devinit sgiwd93_probe(struct platform_device *pdev)
 {
        struct sgiwd93_platform_data *pd = pdev->dev.platform_data;
        unsigned char *wdregs = pd->wdregs;
index 37b3359..56cf0bb 100644 (file)
@@ -64,7 +64,7 @@ static struct scsi_host_template snirm710_template = {
        .module         = THIS_MODULE,
 };
 
-static int __init snirm710_probe(struct platform_device *dev)
+static int __devinit snirm710_probe(struct platform_device *dev)
 {
        unsigned long base;
        struct NCR_700_Host_Parameters *hostdata;
index cadb6f7..7ebecc9 100644 (file)
@@ -770,13 +770,8 @@ static struct usb_driver oled_driver = {
        .id_table =     id_table,
 };
 
-static ssize_t version_show(struct class *dev, char *buf)
-{
-       return sprintf(buf, ASUS_OLED_UNDERSCORE_NAME " %s\n",
-                      ASUS_OLED_VERSION);
-}
-
-static CLASS_ATTR(version, S_IRUGO, version_show, NULL);
+static CLASS_ATTR_STRING(version, S_IRUGO,
+                       ASUS_OLED_UNDERSCORE_NAME " " ASUS_OLED_VERSION);
 
 static int __init asus_oled_init(void)
 {
@@ -788,7 +783,7 @@ static int __init asus_oled_init(void)
                return PTR_ERR(oled_class);
        }
 
-       retval = class_create_file(oled_class, &class_attr_version);
+       retval = class_create_file(oled_class, &class_attr_version.attr);
        if (retval) {
                err("Error creating class version file");
                goto error;
@@ -810,7 +805,7 @@ error:
 
 static void __exit asus_oled_exit(void)
 {
-       class_remove_file(oled_class, &class_attr_version);
+       class_remove_file(oled_class, &class_attr_version.attr);
        class_destroy(oled_class);
 
        usb_deregister(&oled_driver);
index 8aa1955..1da73ec 100644 (file)
@@ -44,17 +44,6 @@ config UIO_PDRV_GENIRQ
 
          If you don't know what to do here, say N.
 
-config UIO_SMX
-       tristate "SMX cryptengine UIO interface"
-       help
-         Userspace IO interface to the Cryptography engine found on the
-         Nias Digital SMX boards.  These will be available from Q4 2008
-         from http://www.niasdigital.com.  The userspace part of this
-         driver will be released under the GPL at the same time as the
-         hardware and will be able to be downloaded from the same site.
-
-         If you compile this as a module, it will be called uio_smx.
-
 config UIO_AEC
        tristate "AEC video timestamp device"
        depends on PCI
@@ -74,6 +63,7 @@ config UIO_AEC
 
 config UIO_SERCOS3
        tristate "Automata Sercos III PCI card driver"
+       depends on PCI
        help
          Userspace I/O interface for the Sercos III PCI card from
          Automata GmbH. The userspace part of this driver will be
@@ -87,11 +77,21 @@ config UIO_SERCOS3
 config UIO_PCI_GENERIC
        tristate "Generic driver for PCI 2.3 and PCI Express cards"
        depends on PCI
-       default n
        help
          Generic driver that you can bind, dynamically, to any
          PCI 2.3 compliant and PCI Express card. It is useful,
          primarily, for virtualization scenarios.
          If you compile this as a module, it will be called uio_pci_generic.
 
+config UIO_NETX
+       tristate "Hilscher NetX Card driver"
+       depends on PCI
+       help
+         Driver for Hilscher NetX based fieldbus cards (cifX, comX).
+         This driver requires a userspace component that comes with the card
+         or is available from Hilscher (http://www.hilscher.com).
+
+         To compile this driver as a module, choose M here; the module
+         will be called uio_netx.
+
 endif
index 73b2e75..18fd818 100644 (file)
@@ -2,7 +2,7 @@ obj-$(CONFIG_UIO)       += uio.o
 obj-$(CONFIG_UIO_CIF)  += uio_cif.o
 obj-$(CONFIG_UIO_PDRV) += uio_pdrv.o
 obj-$(CONFIG_UIO_PDRV_GENIRQ)  += uio_pdrv_genirq.o
-obj-$(CONFIG_UIO_SMX)  += uio_smx.o
 obj-$(CONFIG_UIO_AEC)  += uio_aec.o
 obj-$(CONFIG_UIO_SERCOS3)      += uio_sercos3.o
 obj-$(CONFIG_UIO_PCI_GENERIC)  += uio_pci_generic.o
+obj-$(CONFIG_UIO_NETX) += uio_netx.o
index e941367..4de382a 100644 (file)
@@ -129,7 +129,7 @@ static ssize_t map_type_show(struct kobject *kobj, struct attribute *attr,
        return entry->show(mem, buf);
 }
 
-static struct sysfs_ops map_sysfs_ops = {
+static const struct sysfs_ops map_sysfs_ops = {
        .show = map_type_show,
 };
 
@@ -217,7 +217,7 @@ static ssize_t portio_type_show(struct kobject *kobj, struct attribute *attr,
        return entry->show(port, buf);
 }
 
-static struct sysfs_ops portio_sysfs_ops = {
+static const struct sysfs_ops portio_sysfs_ops = {
        .show = portio_type_show,
 };
 
diff --git a/drivers/uio/uio_netx.c b/drivers/uio/uio_netx.c
new file mode 100644 (file)
index 0000000..afbf0bd
--- /dev/null
@@ -0,0 +1,172 @@
+/*
+ * UIO driver for Hilscher NetX based fieldbus cards (cifX, comX).
+ * See http://www.hilscher.com for details.
+ *
+ * (C) 2007 Hans J. Koch <hjk@linutronix.de>
+ * (C) 2008 Manuel Traut <manut@linutronix.de>
+ *
+ * Licensed under GPL version 2 only.
+ *
+ */
+
+#include <linux/device.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/uio_driver.h>
+
+#define PCI_VENDOR_ID_HILSCHER         0x15CF
+#define PCI_DEVICE_ID_HILSCHER_NETX    0x0000
+#define PCI_SUBDEVICE_ID_NXSB_PCA      0x3235
+#define PCI_SUBDEVICE_ID_NXPCA         0x3335
+
+#define DPM_HOST_INT_EN0       0xfff0
+#define DPM_HOST_INT_STAT0     0xffe0
+
+#define DPM_HOST_INT_MASK      0xe600ffff
+#define DPM_HOST_INT_GLOBAL_EN 0x80000000
+
+static irqreturn_t netx_handler(int irq, struct uio_info *dev_info)
+{
+       void __iomem *int_enable_reg = dev_info->mem[0].internal_addr
+                                       + DPM_HOST_INT_EN0;
+       void __iomem *int_status_reg = dev_info->mem[0].internal_addr
+                                       + DPM_HOST_INT_STAT0;
+
+       /* Is one of our interrupts enabled and active ? */
+       if (!(ioread32(int_enable_reg) & ioread32(int_status_reg)
+               & DPM_HOST_INT_MASK))
+               return IRQ_NONE;
+
+       /* Disable interrupt */
+       iowrite32(ioread32(int_enable_reg) & ~DPM_HOST_INT_GLOBAL_EN,
+               int_enable_reg);
+       return IRQ_HANDLED;
+}
+
+static int __devinit netx_pci_probe(struct pci_dev *dev,
+                                       const struct pci_device_id *id)
+{
+       struct uio_info *info;
+       int bar;
+
+       info = kzalloc(sizeof(struct uio_info), GFP_KERNEL);
+       if (!info)
+               return -ENOMEM;
+
+       if (pci_enable_device(dev))
+               goto out_free;
+
+       if (pci_request_regions(dev, "netx"))
+               goto out_disable;
+
+       switch (id->device) {
+       case PCI_DEVICE_ID_HILSCHER_NETX:
+               bar = 0;
+               info->name = "netx";
+               break;
+       default:
+               bar = 2;
+               info->name = "netx_plx";
+       }
+
+       /* BAR0 or 2 points to the card's dual port memory */
+       info->mem[0].addr = pci_resource_start(dev, bar);
+       if (!info->mem[0].addr)
+               goto out_release;
+       info->mem[0].internal_addr = ioremap(pci_resource_start(dev, bar),
+                                               pci_resource_len(dev, bar));
+
+       if (!info->mem[0].internal_addr)
+                       goto out_release;
+
+       info->mem[0].size = pci_resource_len(dev, bar);
+       info->mem[0].memtype = UIO_MEM_PHYS;
+       info->irq = dev->irq;
+       info->irq_flags = IRQF_SHARED;
+       info->handler = netx_handler;
+       info->version = "0.0.1";
+
+       /* Make sure all interrupts are disabled */
+       iowrite32(0, info->mem[0].internal_addr + DPM_HOST_INT_EN0);
+
+       if (uio_register_device(&dev->dev, info))
+               goto out_unmap;
+
+       pci_set_drvdata(dev, info);
+       dev_info(&dev->dev, "Found %s card, registered UIO device.\n",
+                               info->name);
+
+       return 0;
+
+out_unmap:
+       iounmap(info->mem[0].internal_addr);
+out_release:
+       pci_release_regions(dev);
+out_disable:
+       pci_disable_device(dev);
+out_free:
+       kfree(info);
+       return -ENODEV;
+}
+
+static void netx_pci_remove(struct pci_dev *dev)
+{
+       struct uio_info *info = pci_get_drvdata(dev);
+
+       /* Disable all interrupts */
+       iowrite32(0, info->mem[0].internal_addr + DPM_HOST_INT_EN0);
+       uio_unregister_device(info);
+       pci_release_regions(dev);
+       pci_disable_device(dev);
+       pci_set_drvdata(dev, NULL);
+       iounmap(info->mem[0].internal_addr);
+
+       kfree(info);
+}
+
+static struct pci_device_id netx_pci_ids[] = {
+       {
+               .vendor =       PCI_VENDOR_ID_HILSCHER,
+               .device =       PCI_DEVICE_ID_HILSCHER_NETX,
+               .subvendor =    0,
+               .subdevice =    0,
+       },
+       {
+               .vendor =       PCI_VENDOR_ID_PLX,
+               .device =       PCI_DEVICE_ID_PLX_9030,
+               .subvendor =    PCI_VENDOR_ID_PLX,
+               .subdevice =    PCI_SUBDEVICE_ID_NXSB_PCA,
+       },
+       {
+               .vendor =       PCI_VENDOR_ID_PLX,
+               .device =       PCI_DEVICE_ID_PLX_9030,
+               .subvendor =    PCI_VENDOR_ID_PLX,
+               .subdevice =    PCI_SUBDEVICE_ID_NXPCA,
+       },
+       { 0, }
+};
+
+static struct pci_driver netx_pci_driver = {
+       .name = "netx",
+       .id_table = netx_pci_ids,
+       .probe = netx_pci_probe,
+       .remove = netx_pci_remove,
+};
+
+static int __init netx_init_module(void)
+{
+       return pci_register_driver(&netx_pci_driver);
+}
+
+static void __exit netx_exit_module(void)
+{
+       pci_unregister_driver(&netx_pci_driver);
+}
+
+module_init(netx_init_module);
+module_exit(netx_exit_module);
+
+MODULE_DEVICE_TABLE(pci, netx_pci_ids);
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Hans J. Koch, Manuel Traut");
diff --git a/drivers/uio/uio_smx.c b/drivers/uio/uio_smx.c
deleted file mode 100644 (file)
index 44054a6..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * UIO SMX Cryptengine driver.
- *
- * (C) 2008 Nias Digital P/L <bn@niasdigital.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- */
-
-#include <linux/device.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/uio_driver.h>
-#include <linux/io.h>
-
-#define DRV_NAME "smx-ce"
-#define DRV_VERSION "0.03"
-
-#define SMX_CSR  0x00000000
-#define SMX_EnD  0x00000001
-#define SMX_RUN  0x00000002
-#define SMX_DRDY 0x00000004
-#define SMX_ERR  0x00000008
-
-static irqreturn_t smx_handler(int irq, struct uio_info *dev_info)
-{
-       void __iomem *csr = dev_info->mem[0].internal_addr + SMX_CSR;
-
-       u32 status = ioread32(csr);
-
-       if (!(status & SMX_DRDY))
-               return IRQ_NONE;
-
-       /* Disable interrupt */
-       iowrite32(status & ~SMX_DRDY, csr);
-       return IRQ_HANDLED;
-}
-
-static int __devinit smx_ce_probe(struct platform_device *dev)
-{
-
-       int ret = -ENODEV;
-       struct uio_info *info;
-       struct resource *regs;
-
-       info = kzalloc(sizeof(struct uio_info), GFP_KERNEL);
-       if (!info)
-               return -ENOMEM;
-
-       regs = platform_get_resource(dev, IORESOURCE_MEM, 0);
-       if (!regs) {
-               dev_err(&dev->dev, "No memory resource specified\n");
-               goto out_free;
-       }
-
-       info->mem[0].addr = regs->start;
-       if (!info->mem[0].addr) {
-               dev_err(&dev->dev, "Invalid memory resource\n");
-               goto out_free;
-       }
-
-       info->mem[0].size = regs->end - regs->start + 1;
-       info->mem[0].internal_addr = ioremap(regs->start, info->mem[0].size);
-
-       if (!info->mem[0].internal_addr) {
-               dev_err(&dev->dev, "Can't remap memory address range\n");
-               goto out_free;
-       }
-
-       info->mem[0].memtype = UIO_MEM_PHYS;
-
-       info->name = "smx-ce";
-       info->version = "0.03";
-
-       info->irq = platform_get_irq(dev, 0);
-       if (info->irq < 0) {
-               ret = info->irq;
-               dev_err(&dev->dev, "No (or invalid) IRQ resource specified\n");
-               goto out_unmap;
-       }
-
-       info->irq_flags = IRQF_SHARED;
-       info->handler = smx_handler;
-
-       platform_set_drvdata(dev, info);
-
-       ret = uio_register_device(&dev->dev, info);
-
-       if (ret)
-               goto out_unmap;
-
-       return 0;
-
-out_unmap:
-       iounmap(info->mem[0].internal_addr);
-out_free:
-       kfree(info);
-
-       return ret;
-}
-
-static int __devexit smx_ce_remove(struct platform_device *dev)
-{
-       struct uio_info *info = platform_get_drvdata(dev);
-
-       uio_unregister_device(info);
-       platform_set_drvdata(dev, NULL);
-       iounmap(info->mem[0].internal_addr);
-
-       kfree(info);
-
-       return 0;
-}
-
-static struct platform_driver smx_ce_driver = {
-       .probe          = smx_ce_probe,
-       .remove         = __devexit_p(smx_ce_remove),
-       .driver         = {
-               .name   = DRV_NAME,
-               .owner  = THIS_MODULE,
-       },
-};
-
-static int __init smx_ce_init_module(void)
-{
-       return platform_driver_register(&smx_ce_driver);
-}
-module_init(smx_ce_init_module);
-
-static void __exit smx_ce_exit_module(void)
-{
-       platform_driver_unregister(&smx_ce_driver);
-}
-module_exit(smx_ce_exit_module);
-
-MODULE_LICENSE("GPL v2");
-MODULE_VERSION(DRV_VERSION);
-MODULE_AUTHOR("Ben Nizette <bn@niasdigital.com>");
index a7037bf..f3c2338 100644 (file)
@@ -489,10 +489,10 @@ void usb_driver_release_interface(struct usb_driver *driver,
        if (device_is_registered(dev)) {
                device_release_driver(dev);
        } else {
-               down(&dev->sem);
+               device_lock(dev);
                usb_unbind_interface(dev);
                dev->driver = NULL;
-               up(&dev->sem);
+               device_unlock(dev);
        }
 }
 EXPORT_SYMBOL_GPL(usb_driver_release_interface);
index da77e41..08bd6db 100644 (file)
 unsigned long beacon_timeout_ms = 500;
 
 static
-ssize_t beacon_timeout_ms_show(struct class *class, char *buf)
+ssize_t beacon_timeout_ms_show(struct class *class,
+                               struct class_attribute *attr,
+                               char *buf)
 {
        return scnprintf(buf, PAGE_SIZE, "%lu\n", beacon_timeout_ms);
 }
 
 static
 ssize_t beacon_timeout_ms_store(struct class *class,
+                               struct class_attribute *attr,
                                const char *buf, size_t size)
 {
        unsigned long bt;
index cdd6c8e..5fad4e7 100644 (file)
@@ -62,12 +62,12 @@ int umc_controller_reset(struct umc_dev *umc)
        struct device *parent = umc->dev.parent;
        int ret = 0;
 
-       if(down_trylock(&parent->sem))
+       if (device_trylock(parent))
                return -EAGAIN;
        ret = device_for_each_child(parent, parent, umc_bus_pre_reset_helper);
        if (ret >= 0)
                ret = device_for_each_child(parent, parent, umc_bus_post_reset_helper);
-       up(&parent->sem);
+       device_unlock(parent);
 
        return ret;
 }
index d5bcfc1..157485c 100644 (file)
@@ -366,12 +366,12 @@ struct dentry *uwb_dbg_create_pal_dir(struct uwb_pal *pal);
 
 static inline void uwb_dev_lock(struct uwb_dev *uwb_dev)
 {
-       down(&uwb_dev->dev.sem);
+       device_lock(&uwb_dev->dev);
 }
 
 static inline void uwb_dev_unlock(struct uwb_dev *uwb_dev)
 {
-       up(&uwb_dev->dev.sem);
+       device_unlock(&uwb_dev->dev);
 }
 
 #endif /* #ifndef __UWB_INTERNAL_H__ */
index 0370399..6627c94 100644 (file)
@@ -615,8 +615,7 @@ ssize_t wlp_wss_attr_store(struct kobject *kobj, struct attribute *attr,
        return ret;
 }
 
-static
-struct sysfs_ops wss_sysfs_ops = {
+static const struct sysfs_ops wss_sysfs_ops = {
        .show   = wlp_wss_attr_show,
        .store  = wlp_wss_attr_store,
 };
index 0bcc59e..43d7d50 100644 (file)
@@ -1221,7 +1221,7 @@ free_unused_pages(unsigned int virtual_start, unsigned int virtual_end)
        printk("acornfb: freed %dK memory\n", mb_freed);
 }
 
-static int __init acornfb_probe(struct platform_device *dev)
+static int __devinit acornfb_probe(struct platform_device *dev)
 {
        unsigned long size;
        u_int h_sync, v_sync;
index c343169..01554d6 100644 (file)
@@ -504,7 +504,7 @@ static struct fb_ops arcfb_ops = {
        .fb_ioctl       = arcfb_ioctl,
 };
 
-static int __init arcfb_probe(struct platform_device *dev)
+static int __devinit arcfb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        int retval = -ENOMEM;
index 108b89e..5eb61b5 100644 (file)
@@ -287,7 +287,7 @@ static struct fb_ops cobalt_lcd_fbops = {
        .fb_cursor      = cobalt_lcdfb_cursor,
 };
 
-static int __init cobalt_lcdfb_probe(struct platform_device *dev)
+static int __devinit cobalt_lcdfb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        struct resource *res;
index d25df51..581d2db 100644 (file)
@@ -210,7 +210,7 @@ static int __init efifb_setup(char *options)
        return 0;
 }
 
-static int __init efifb_probe(struct platform_device *dev)
+static int __devinit efifb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        int err;
index 2735b79..6d755bb 100644 (file)
@@ -602,7 +602,7 @@ static int epson1355fb_remove(struct platform_device *dev)
        return 0;
 }
 
-int __init epson1355fb_probe(struct platform_device *dev)
+int __devinit epson1355fb_probe(struct platform_device *dev)
 {
        struct epson1355_par *default_par;
        struct fb_info *info;
index 695fa01..5643a35 100644 (file)
@@ -1128,7 +1128,7 @@ static int __init gbefb_setup(char *options)
        return 0;
 }
 
-static int __init gbefb_probe(struct platform_device *p_dev)
+static int __devinit gbefb_probe(struct platform_device *p_dev)
 {
        int i, ret = 0;
        struct fb_info *info;
index 0129c04..db9b785 100644 (file)
@@ -551,7 +551,7 @@ static struct fb_ops hgafb_ops = {
         *  Initialization
         */
 
-static int __init hgafb_probe(struct platform_device *pdev)
+static int __devinit hgafb_probe(struct platform_device *pdev)
 {
        struct fb_info *info;
 
index 73c83a8..bf78779 100644 (file)
@@ -325,7 +325,7 @@ static struct fb_ops hitfb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static int __init hitfb_probe(struct platform_device *dev)
+static int __devinit hitfb_probe(struct platform_device *dev)
 {
        unsigned short lcdclor, ldr3, ldvndr;
        struct fb_info *info;
index 913142d..9acef00 100644 (file)
@@ -341,7 +341,7 @@ static ssize_t manager_attr_store(struct kobject *kobj, struct attribute *attr,
        return manager_attr->store(manager, buf, size);
 }
 
-static struct sysfs_ops manager_sysfs_ops = {
+static const struct sysfs_ops manager_sysfs_ops = {
        .show = manager_attr_show,
        .store = manager_attr_store,
 };
index 0c5bea2..aed3f31 100644 (file)
@@ -320,7 +320,7 @@ static ssize_t overlay_attr_store(struct kobject *kobj, struct attribute *attr,
        return overlay_attr->store(overlay, buf, size);
 }
 
-static struct sysfs_ops overlay_sysfs_ops = {
+static const struct sysfs_ops overlay_sysfs_ops = {
        .show = overlay_attr_show,
        .store = overlay_attr_store,
 };
index 4beac1d..de40a62 100644 (file)
@@ -85,7 +85,7 @@ static struct fb_ops q40fb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static int __init q40fb_probe(struct platform_device *dev)
+static int __devinit q40fb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
 
index aac6612..2b094de 100644 (file)
@@ -1004,12 +1004,12 @@ dealloc_fb:
        return ret;
 }
 
-static int __init s3c2410fb_probe(struct platform_device *pdev)
+static int __devinit s3c2410fb_probe(struct platform_device *pdev)
 {
        return s3c24xxfb_probe(pdev, DRV_S3C2410);
 }
 
-static int __init s3c2412fb_probe(struct platform_device *pdev)
+static int __devinit s3c2412fb_probe(struct platform_device *pdev)
 {
        return s3c24xxfb_probe(pdev, DRV_S3C2412);
 }
index cdaa873..e8b76d6 100644 (file)
@@ -1435,7 +1435,7 @@ static struct sa1100fb_info * __init sa1100fb_init_fbinfo(struct device *dev)
        return fbi;
 }
 
-static int __init sa1100fb_probe(struct platform_device *pdev)
+static int __devinit sa1100fb_probe(struct platform_device *pdev)
 {
        struct sa1100fb_info *fbi;
        int ret, irq;
index f860122..7a3a5e2 100644 (file)
@@ -745,7 +745,7 @@ int __init sgivwfb_setup(char *options)
 /*
  *  Initialisation
  */
-static int __init sgivwfb_probe(struct platform_device *dev)
+static int __devinit sgivwfb_probe(struct platform_device *dev)
 {
        struct sgivw_par *par;
        struct fb_info *info;
index 8d7653e..bbd1dbf 100644 (file)
@@ -943,7 +943,7 @@ static const struct dev_pm_ops sh_mobile_lcdc_dev_pm_ops = {
 
 static int sh_mobile_lcdc_remove(struct platform_device *pdev);
 
-static int __init sh_mobile_lcdc_probe(struct platform_device *pdev)
+static int __devinit sh_mobile_lcdc_probe(struct platform_device *pdev)
 {
        struct fb_info *info;
        struct sh_mobile_lcdc_priv *priv;
index bd37ee1..ef4128c 100644 (file)
@@ -226,7 +226,7 @@ static int __init vesafb_setup(char *options)
        return 0;
 }
 
-static int __init vesafb_probe(struct platform_device *dev)
+static int __devinit vesafb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        int i, err;
index 050d432..b8ab995 100644 (file)
@@ -479,7 +479,7 @@ static int __init vfb_setup(char *options)
      *  Initialisation
      */
 
-static int __init vfb_probe(struct platform_device *dev)
+static int __devinit vfb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        int retval = -ENOMEM;
index 5b29389..76d8dae 100644 (file)
@@ -1293,7 +1293,7 @@ static int vga16fb_setup(char *options)
 }
 #endif
 
-static int __init vga16fb_probe(struct platform_device *dev)
+static int __devinit vga16fb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        struct vga16fb_par *par;
index 2376f68..5d22395 100644 (file)
@@ -628,7 +628,7 @@ static int w100fb_resume(struct platform_device *dev)
 #endif
 
 
-int __init w100fb_probe(struct platform_device *pdev)
+int __devinit w100fb_probe(struct platform_device *pdev)
 {
        int err = -EIO;
        struct w100fb_mach_info *inf;
index 0d92969..22977d3 100644 (file)
@@ -72,7 +72,7 @@ struct hdq_data {
        int                     init_trans;
 };
 
-static int __init omap_hdq_probe(struct platform_device *pdev);
+static int __devinit omap_hdq_probe(struct platform_device *pdev);
 static int omap_hdq_remove(struct platform_device *pdev);
 
 static struct platform_driver omap_hdq_driver = {
@@ -558,7 +558,7 @@ static void omap_w1_write_byte(void *_hdq, u8 byte)
        return;
 }
 
-static int __init omap_hdq_probe(struct platform_device *pdev)
+static int __devinit omap_hdq_probe(struct platform_device *pdev)
 {
        struct hdq_data *hdq_data;
        struct resource *res;
index ae5cb05..bb71ab2 100644 (file)
@@ -426,7 +426,7 @@ static ssize_t hyp_sysfs_store(struct kobject *kobj,
        return 0;
 }
 
-static struct sysfs_ops hyp_sysfs_ops = {
+static const struct sysfs_ops hyp_sysfs_ops = {
        .show = hyp_sysfs_show,
        .store = hyp_sysfs_store,
 };
index a240b6f..4ce16ef 100644 (file)
@@ -164,12 +164,12 @@ static void btrfs_root_release(struct kobject *kobj)
        complete(&root->kobj_unregister);
 }
 
-static struct sysfs_ops btrfs_super_attr_ops = {
+static const struct sysfs_ops btrfs_super_attr_ops = {
        .show   = btrfs_super_attr_show,
        .store  = btrfs_super_attr_store,
 };
 
-static struct sysfs_ops btrfs_root_attr_ops = {
+static const struct sysfs_ops btrfs_root_attr_ops = {
        .show   = btrfs_root_attr_show,
        .store  = btrfs_root_attr_store,
 };
index 26a8bd4..f994a7d 100644 (file)
@@ -148,7 +148,7 @@ static void lockspace_kobj_release(struct kobject *k)
        kfree(ls);
 }
 
-static struct sysfs_ops dlm_attr_ops = {
+static const struct sysfs_ops dlm_attr_ops = {
        .show  = dlm_attr_show,
        .store = dlm_attr_store,
 };
index 2b83b96..ce84a6e 100644 (file)
@@ -2358,7 +2358,7 @@ static void ext4_sb_release(struct kobject *kobj)
 }
 
 
-static struct sysfs_ops ext4_attr_ops = {
+static const struct sysfs_ops ext4_attr_ops = {
        .show   = ext4_attr_show,
        .store  = ext4_attr_store,
 };
index b5f1a46..419042f 100644 (file)
@@ -49,7 +49,7 @@ static ssize_t gfs2_attr_store(struct kobject *kobj, struct attribute *attr,
        return a->store ? a->store(sdp, buf, len) : len;
 }
 
-static struct sysfs_ops gfs2_attr_ops = {
+static const struct sysfs_ops gfs2_attr_ops = {
        .show  = gfs2_attr_show,
        .store = gfs2_attr_store,
 };
@@ -574,7 +574,7 @@ static int gfs2_uevent(struct kset *kset, struct kobject *kobj,
        return 0;
 }
 
-static struct kset_uevent_ops gfs2_uevent_ops = {
+static const struct kset_uevent_ops gfs2_uevent_ops = {
        .uevent = gfs2_uevent,
 };
 
index b39da87..3bb928a 100644 (file)
@@ -136,7 +136,7 @@ static ssize_t mlog_store(struct kobject *obj, struct attribute *attr,
        return mlog_mask_store(mlog_attr->mask, buf, count);
 }
 
-static struct sysfs_ops mlog_attr_ops = {
+static const struct sysfs_ops mlog_attr_ops = {
        .show  = mlog_show,
        .store = mlog_store,
 };
index a0a500a..e9d2935 100644 (file)
@@ -54,14 +54,14 @@ fill_read(struct dentry *dentry, char *buffer, loff_t off, size_t count)
        int rc;
 
        /* need attr_sd for attr, its parent for kobj */
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                return -ENODEV;
 
        rc = -EIO;
        if (attr->read)
                rc = attr->read(kobj, attr, buffer, off, count);
 
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
 
        return rc;
 }
@@ -125,14 +125,14 @@ flush_write(struct dentry *dentry, char *buffer, loff_t offset, size_t count)
        int rc;
 
        /* need attr_sd for attr, its parent for kobj */
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                return -ENODEV;
 
        rc = -EIO;
        if (attr->write)
                rc = attr->write(kobj, attr, buffer, offset, count);
 
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
 
        return rc;
 }
@@ -184,12 +184,12 @@ static void bin_vma_open(struct vm_area_struct *vma)
        if (!bb->vm_ops || !bb->vm_ops->open)
                return;
 
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                return;
 
        bb->vm_ops->open(vma);
 
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
 }
 
 static void bin_vma_close(struct vm_area_struct *vma)
@@ -201,12 +201,12 @@ static void bin_vma_close(struct vm_area_struct *vma)
        if (!bb->vm_ops || !bb->vm_ops->close)
                return;
 
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                return;
 
        bb->vm_ops->close(vma);
 
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
 }
 
 static int bin_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
@@ -219,12 +219,12 @@ static int bin_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
        if (!bb->vm_ops || !bb->vm_ops->fault)
                return VM_FAULT_SIGBUS;
 
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                return VM_FAULT_SIGBUS;
 
        ret = bb->vm_ops->fault(vma, vmf);
 
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
        return ret;
 }
 
@@ -241,12 +241,12 @@ static int bin_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
        if (!bb->vm_ops->page_mkwrite)
                return 0;
 
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                return VM_FAULT_SIGBUS;
 
        ret = bb->vm_ops->page_mkwrite(vma, vmf);
 
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
        return ret;
 }
 
@@ -261,12 +261,12 @@ static int bin_access(struct vm_area_struct *vma, unsigned long addr,
        if (!bb->vm_ops || !bb->vm_ops->access)
                return -EINVAL;
 
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                return -EINVAL;
 
        ret = bb->vm_ops->access(vma, addr, buf, len, write);
 
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
        return ret;
 }
 
@@ -281,12 +281,12 @@ static int bin_set_policy(struct vm_area_struct *vma, struct mempolicy *new)
        if (!bb->vm_ops || !bb->vm_ops->set_policy)
                return 0;
 
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                return -EINVAL;
 
        ret = bb->vm_ops->set_policy(vma, new);
 
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
        return ret;
 }
 
@@ -301,12 +301,12 @@ static struct mempolicy *bin_get_policy(struct vm_area_struct *vma,
        if (!bb->vm_ops || !bb->vm_ops->get_policy)
                return vma->vm_policy;
 
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                return vma->vm_policy;
 
        pol = bb->vm_ops->get_policy(vma, addr);
 
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
        return pol;
 }
 
@@ -321,12 +321,12 @@ static int bin_migrate(struct vm_area_struct *vma, const nodemask_t *from,
        if (!bb->vm_ops || !bb->vm_ops->migrate)
                return 0;
 
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                return 0;
 
        ret = bb->vm_ops->migrate(vma, from, to, flags);
 
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
        return ret;
 }
 #endif
@@ -356,7 +356,7 @@ static int mmap(struct file *file, struct vm_area_struct *vma)
 
        /* need attr_sd for attr, its parent for kobj */
        rc = -ENODEV;
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                goto out_unlock;
 
        rc = -EINVAL;
@@ -384,7 +384,7 @@ static int mmap(struct file *file, struct vm_area_struct *vma)
        bb->vm_ops = vma->vm_ops;
        vma->vm_ops = &bin_vm_ops;
 out_put:
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
 out_unlock:
        mutex_unlock(&bb->mutex);
 
@@ -399,7 +399,7 @@ static int open(struct inode * inode, struct file * file)
        int error;
 
        /* binary file operations requires both @sd and its parent */
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                return -ENODEV;
 
        error = -EACCES;
@@ -426,11 +426,11 @@ static int open(struct inode * inode, struct file * file)
        mutex_unlock(&sysfs_bin_lock);
 
        /* open succeeded, put active references */
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
        return 0;
 
  err_out:
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
        kfree(bb);
        return error;
 }
index 699f371..5907178 100644 (file)
@@ -93,7 +93,7 @@ static void sysfs_unlink_sibling(struct sysfs_dirent *sd)
  *     RETURNS:
  *     Pointer to @sd on success, NULL on failure.
  */
-static struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd)
+struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd)
 {
        if (unlikely(!sd))
                return NULL;
@@ -124,7 +124,7 @@ static struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd)
  *     Put an active reference to @sd.  This function is noop if @sd
  *     is NULL.
  */
-static void sysfs_put_active(struct sysfs_dirent *sd)
+void sysfs_put_active(struct sysfs_dirent *sd)
 {
        struct completion *cmpl;
        int v;
@@ -144,45 +144,6 @@ static void sysfs_put_active(struct sysfs_dirent *sd)
        complete(cmpl);
 }
 
-/**
- *     sysfs_get_active_two - get active references to sysfs_dirent and parent
- *     @sd: sysfs_dirent of interest
- *
- *     Get active reference to @sd and its parent.  Parent's active
- *     reference is grabbed first.  This function is noop if @sd is
- *     NULL.
- *
- *     RETURNS:
- *     Pointer to @sd on success, NULL on failure.
- */
-struct sysfs_dirent *sysfs_get_active_two(struct sysfs_dirent *sd)
-{
-       if (sd) {
-               if (sd->s_parent && unlikely(!sysfs_get_active(sd->s_parent)))
-                       return NULL;
-               if (unlikely(!sysfs_get_active(sd))) {
-                       sysfs_put_active(sd->s_parent);
-                       return NULL;
-               }
-       }
-       return sd;
-}
-
-/**
- *     sysfs_put_active_two - put active references to sysfs_dirent and parent
- *     @sd: sysfs_dirent of interest
- *
- *     Put active references to @sd and its parent.  This function is
- *     noop if @sd is NULL.
- */
-void sysfs_put_active_two(struct sysfs_dirent *sd)
-{
-       if (sd) {
-               sysfs_put_active(sd);
-               sysfs_put_active(sd->s_parent);
-       }
-}
-
 /**
  *     sysfs_deactivate - deactivate sysfs_dirent
  *     @sd: sysfs_dirent to deactivate
@@ -195,6 +156,10 @@ static void sysfs_deactivate(struct sysfs_dirent *sd)
        int v;
 
        BUG_ON(sd->s_sibling || !(sd->s_flags & SYSFS_FLAG_REMOVED));
+
+       if (!(sysfs_type(sd) & SYSFS_ACTIVE_REF))
+               return;
+
        sd->s_sibling = (void *)&wait;
 
        rwsem_acquire(&sd->dep_map, 0, 0, _RET_IP_);
@@ -354,7 +319,6 @@ struct sysfs_dirent *sysfs_new_dirent(const char *name, umode_t mode, int type)
 
        atomic_set(&sd->s_count, 1);
        atomic_set(&sd->s_active, 0);
-       sysfs_dirent_init_lockdep(sd);
 
        sd->s_name = name;
        sd->s_mode = mode;
@@ -681,7 +645,7 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
        }
 
        /* attach dentry and inode */
-       inode = sysfs_get_inode(sd);
+       inode = sysfs_get_inode(dir->i_sb, sd);
        if (!inode) {
                ret = ERR_PTR(-ENOMEM);
                goto out_unlock;
@@ -837,11 +801,46 @@ static inline unsigned char dt_type(struct sysfs_dirent *sd)
        return (sd->s_mode >> 12) & 15;
 }
 
+static int sysfs_dir_release(struct inode *inode, struct file *filp)
+{
+       sysfs_put(filp->private_data);
+       return 0;
+}
+
+static struct sysfs_dirent *sysfs_dir_pos(struct sysfs_dirent *parent_sd,
+       ino_t ino, struct sysfs_dirent *pos)
+{
+       if (pos) {
+               int valid = !(pos->s_flags & SYSFS_FLAG_REMOVED) &&
+                       pos->s_parent == parent_sd &&
+                       ino == pos->s_ino;
+               sysfs_put(pos);
+               if (valid)
+                       return pos;
+       }
+       pos = NULL;
+       if ((ino > 1) && (ino < INT_MAX)) {
+               pos = parent_sd->s_dir.children;
+               while (pos && (ino > pos->s_ino))
+                       pos = pos->s_sibling;
+       }
+       return pos;
+}
+
+static struct sysfs_dirent *sysfs_dir_next_pos(struct sysfs_dirent *parent_sd,
+       ino_t ino, struct sysfs_dirent *pos)
+{
+       pos = sysfs_dir_pos(parent_sd, ino, pos);
+       if (pos)
+               pos = pos->s_sibling;
+       return pos;
+}
+
 static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
 {
        struct dentry *dentry = filp->f_path.dentry;
        struct sysfs_dirent * parent_sd = dentry->d_fsdata;
-       struct sysfs_dirent *pos;
+       struct sysfs_dirent *pos = filp->private_data;
        ino_t ino;
 
        if (filp->f_pos == 0) {
@@ -857,29 +856,31 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
                if (filldir(dirent, "..", 2, filp->f_pos, ino, DT_DIR) == 0)
                        filp->f_pos++;
        }
-       if ((filp->f_pos > 1) && (filp->f_pos < INT_MAX)) {
-               mutex_lock(&sysfs_mutex);
-
-               /* Skip the dentries we have already reported */
-               pos = parent_sd->s_dir.children;
-               while (pos && (filp->f_pos > pos->s_ino))
-                       pos = pos->s_sibling;
-
-               for ( ; pos; pos = pos->s_sibling) {
-                       const char * name;
-                       int len;
-
-                       name = pos->s_name;
-                       len = strlen(name);
-                       filp->f_pos = ino = pos->s_ino;
+       mutex_lock(&sysfs_mutex);
+       for (pos = sysfs_dir_pos(parent_sd, filp->f_pos, pos);
+            pos;
+            pos = sysfs_dir_next_pos(parent_sd, filp->f_pos, pos)) {
+               const char * name;
+               unsigned int type;
+               int len, ret;
+
+               name = pos->s_name;
+               len = strlen(name);
+               ino = pos->s_ino;
+               type = dt_type(pos);
+               filp->f_pos = ino;
+               filp->private_data = sysfs_get(pos);
 
-                       if (filldir(dirent, name, len, filp->f_pos, ino,
-                                        dt_type(pos)) < 0)
-                               break;
-               }
-               if (!pos)
-                       filp->f_pos = INT_MAX;
                mutex_unlock(&sysfs_mutex);
+               ret = filldir(dirent, name, len, filp->f_pos, ino, type);
+               mutex_lock(&sysfs_mutex);
+               if (ret < 0)
+                       break;
+       }
+       mutex_unlock(&sysfs_mutex);
+       if ((filp->f_pos > 1) && !pos) { /* EOF */
+               filp->f_pos = INT_MAX;
+               filp->private_data = NULL;
        }
        return 0;
 }
@@ -888,5 +889,6 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
 const struct file_operations sysfs_dir_operations = {
        .read           = generic_read_dir,
        .readdir        = sysfs_readdir,
+       .release        = sysfs_dir_release,
        .llseek         = generic_file_llseek,
 };
index dc30d9e..e222b25 100644 (file)
@@ -53,7 +53,7 @@ struct sysfs_buffer {
        size_t                  count;
        loff_t                  pos;
        char                    * page;
-       struct sysfs_ops        * ops;
+       const struct sysfs_ops  * ops;
        struct mutex            mutex;
        int                     needs_read_fill;
        int                     event;
@@ -75,7 +75,7 @@ static int fill_read_buffer(struct dentry * dentry, struct sysfs_buffer * buffer
 {
        struct sysfs_dirent *attr_sd = dentry->d_fsdata;
        struct kobject *kobj = attr_sd->s_parent->s_dir.kobj;
-       struct sysfs_ops * ops = buffer->ops;
+       const struct sysfs_ops * ops = buffer->ops;
        int ret = 0;
        ssize_t count;
 
@@ -85,13 +85,13 @@ static int fill_read_buffer(struct dentry * dentry, struct sysfs_buffer * buffer
                return -ENOMEM;
 
        /* need attr_sd for attr and ops, its parent for kobj */
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                return -ENODEV;
 
        buffer->event = atomic_read(&attr_sd->s_attr.open->event);
        count = ops->show(kobj, attr_sd->s_attr.attr, buffer->page);
 
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
 
        /*
         * The code works fine with PAGE_SIZE return but it's likely to
@@ -199,16 +199,16 @@ flush_write_buffer(struct dentry * dentry, struct sysfs_buffer * buffer, size_t
 {
        struct sysfs_dirent *attr_sd = dentry->d_fsdata;
        struct kobject *kobj = attr_sd->s_parent->s_dir.kobj;
-       struct sysfs_ops * ops = buffer->ops;
+       const struct sysfs_ops * ops = buffer->ops;
        int rc;
 
        /* need attr_sd for attr and ops, its parent for kobj */
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                return -ENODEV;
 
        rc = ops->store(kobj, attr_sd->s_attr.attr, buffer->page, count);
 
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
 
        return rc;
 }
@@ -335,7 +335,7 @@ static int sysfs_open_file(struct inode *inode, struct file *file)
        struct sysfs_dirent *attr_sd = file->f_path.dentry->d_fsdata;
        struct kobject *kobj = attr_sd->s_parent->s_dir.kobj;
        struct sysfs_buffer *buffer;
-       struct sysfs_ops *ops;
+       const struct sysfs_ops *ops;
        int error = -EACCES;
        char *p;
 
@@ -344,7 +344,7 @@ static int sysfs_open_file(struct inode *inode, struct file *file)
                memmove(last_sysfs_file, p, strlen(p) + 1);
 
        /* need attr_sd for attr and ops, its parent for kobj */
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                return -ENODEV;
 
        /* every kobject with an attribute needs a ktype assigned */
@@ -393,13 +393,13 @@ static int sysfs_open_file(struct inode *inode, struct file *file)
                goto err_free;
 
        /* open succeeded, put active references */
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
        return 0;
 
  err_free:
        kfree(buffer);
  err_out:
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
        return error;
 }
 
@@ -437,12 +437,12 @@ static unsigned int sysfs_poll(struct file *filp, poll_table *wait)
        struct sysfs_open_dirent *od = attr_sd->s_attr.open;
 
        /* need parent for the kobj, grab both */
-       if (!sysfs_get_active_two(attr_sd))
+       if (!sysfs_get_active(attr_sd))
                goto trigger;
 
        poll_wait(filp, &od->poll, wait);
 
-       sysfs_put_active_two(attr_sd);
+       sysfs_put_active(attr_sd);
 
        if (buffer->event != atomic_read(&od->event))
                goto trigger;
@@ -509,6 +509,7 @@ int sysfs_add_file_mode(struct sysfs_dirent *dir_sd,
        if (!sd)
                return -ENOMEM;
        sd->s_attr.attr = (void *)attr;
+       sysfs_dirent_init_lockdep(sd);
 
        sysfs_addrm_start(&acxt, dir_sd);
        rc = sysfs_add_one(&acxt, sd);
@@ -542,6 +543,18 @@ int sysfs_create_file(struct kobject * kobj, const struct attribute * attr)
 
 }
 
+int sysfs_create_files(struct kobject *kobj, const struct attribute **ptr)
+{
+       int err = 0;
+       int i;
+
+       for (i = 0; ptr[i] && !err; i++)
+               err = sysfs_create_file(kobj, ptr[i]);
+       if (err)
+               while (--i >= 0)
+                       sysfs_remove_file(kobj, ptr[i]);
+       return err;
+}
 
 /**
  * sysfs_add_file_to_group - add an attribute file to a pre-existing group.
@@ -614,6 +627,12 @@ void sysfs_remove_file(struct kobject * kobj, const struct attribute * attr)
        sysfs_hash_and_remove(kobj->sd, attr->name);
 }
 
+void sysfs_remove_files(struct kobject * kobj, const struct attribute **ptr)
+{
+       int i;
+       for (i = 0; ptr[i]; i++)
+               sysfs_remove_file(kobj, ptr[i]);
+}
 
 /**
  * sysfs_remove_file_from_group - remove an attribute file from a group.
@@ -732,3 +751,5 @@ EXPORT_SYMBOL_GPL(sysfs_schedule_callback);
 
 EXPORT_SYMBOL_GPL(sysfs_create_file);
 EXPORT_SYMBOL_GPL(sysfs_remove_file);
+EXPORT_SYMBOL_GPL(sysfs_remove_files);
+EXPORT_SYMBOL_GPL(sysfs_create_files);
index 6a06a1d..082daae 100644 (file)
@@ -111,20 +111,20 @@ int sysfs_setattr(struct dentry *dentry, struct iattr *iattr)
        if (!sd)
                return -EINVAL;
 
+       mutex_lock(&sysfs_mutex);
        error = inode_change_ok(inode, iattr);
        if (error)
-               return error;
+               goto out;
 
        iattr->ia_valid &= ~ATTR_SIZE; /* ignore size changes */
 
        error = inode_setattr(inode, iattr);
        if (error)
-               return error;
+               goto out;
 
-       mutex_lock(&sysfs_mutex);
        error = sysfs_sd_setattr(sd, iattr);
+out:
        mutex_unlock(&sysfs_mutex);
-
        return error;
 }
 
@@ -283,6 +283,7 @@ static void sysfs_init_inode(struct sysfs_dirent *sd, struct inode *inode)
 
 /**
  *     sysfs_get_inode - get inode for sysfs_dirent
+ *     @sb: super block
  *     @sd: sysfs_dirent to allocate inode for
  *
  *     Get inode for @sd.  If such inode doesn't exist, a new inode
@@ -295,11 +296,11 @@ static void sysfs_init_inode(struct sysfs_dirent *sd, struct inode *inode)
  *     RETURNS:
  *     Pointer to allocated inode on success, NULL on failure.
  */
-struct inode * sysfs_get_inode(struct sysfs_dirent *sd)
+struct inode * sysfs_get_inode(struct super_block *sb, struct sysfs_dirent *sd)
 {
        struct inode *inode;
 
-       inode = iget_locked(sysfs_sb, sd->s_ino);
+       inode = iget_locked(sb, sd->s_ino);
        if (inode && (inode->i_state & I_NEW))
                sysfs_init_inode(sd, inode);
 
index 4974995..0cb1088 100644 (file)
@@ -23,7 +23,6 @@
 
 
 static struct vfsmount *sysfs_mount;
-struct super_block * sysfs_sb = NULL;
 struct kmem_cache *sysfs_dir_cachep;
 
 static const struct super_operations sysfs_ops = {
@@ -50,11 +49,10 @@ static int sysfs_fill_super(struct super_block *sb, void *data, int silent)
        sb->s_magic = SYSFS_MAGIC;
        sb->s_op = &sysfs_ops;
        sb->s_time_gran = 1;
-       sysfs_sb = sb;
 
        /* get root inode, initialize and unlock it */
        mutex_lock(&sysfs_mutex);
-       inode = sysfs_get_inode(&sysfs_root);
+       inode = sysfs_get_inode(sb, &sysfs_root);
        mutex_unlock(&sysfs_mutex);
        if (!inode) {
                pr_debug("sysfs: could not get root inode\n");
index c5eff49..1b9a3a1 100644 (file)
@@ -123,6 +123,44 @@ void sysfs_remove_link(struct kobject * kobj, const char * name)
        sysfs_hash_and_remove(parent_sd, name);
 }
 
+/**
+ *     sysfs_rename_link - rename symlink in object's directory.
+ *     @kobj:  object we're acting for.
+ *     @targ:  object we're pointing to.
+ *     @old:   previous name of the symlink.
+ *     @new:   new name of the symlink.
+ *
+ *     A helper function for the common rename symlink idiom.
+ */
+int sysfs_rename_link(struct kobject *kobj, struct kobject *targ,
+                       const char *old, const char *new)
+{
+       struct sysfs_dirent *parent_sd, *sd = NULL;
+       int result;
+
+       if (!kobj)
+               parent_sd = &sysfs_root;
+       else
+               parent_sd = kobj->sd;
+
+       result = -ENOENT;
+       sd = sysfs_get_dirent(parent_sd, old);
+       if (!sd)
+               goto out;
+
+       result = -EINVAL;
+       if (sysfs_type(sd) != SYSFS_KOBJ_LINK)
+               goto out;
+       if (sd->s_symlink.target_sd->s_dir.kobj != targ)
+               goto out;
+
+       result = sysfs_rename(sd, parent_sd, new);
+
+out:
+       sysfs_put(sd);
+       return result;
+}
+
 static int sysfs_get_target_path(struct sysfs_dirent *parent_sd,
                                 struct sysfs_dirent *target_sd, char *path)
 {
index cdd9377..30f5a44 100644 (file)
@@ -66,8 +66,8 @@ struct sysfs_dirent {
        };
 
        unsigned int            s_flags;
+       unsigned short          s_mode;
        ino_t                   s_ino;
-       umode_t                 s_mode;
        struct sysfs_inode_attrs *s_iattr;
 };
 
@@ -79,6 +79,7 @@ struct sysfs_dirent {
 #define SYSFS_KOBJ_BIN_ATTR            0x0004
 #define SYSFS_KOBJ_LINK                        0x0008
 #define SYSFS_COPY_NAME                        (SYSFS_DIR | SYSFS_KOBJ_LINK)
+#define SYSFS_ACTIVE_REF               (SYSFS_KOBJ_ATTR | SYSFS_KOBJ_BIN_ATTR)
 
 #define SYSFS_FLAG_MASK                        ~SYSFS_TYPE_MASK
 #define SYSFS_FLAG_REMOVED             0x0200
@@ -91,9 +92,12 @@ static inline unsigned int sysfs_type(struct sysfs_dirent *sd)
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
 #define sysfs_dirent_init_lockdep(sd)                          \
 do {                                                           \
-       static struct lock_class_key __key;                     \
+       struct attribute *attr = sd->s_attr.attr;               \
+       struct lock_class_key *key = attr->key;                 \
+       if (!key)                                               \
+               key = &attr->skey;                              \
                                                                \
-       lockdep_init_map(&sd->dep_map, "s_active", &__key, 0);  \
+       lockdep_init_map(&sd->dep_map, "s_active", key, 0);     \
 } while(0)
 #else
 #define sysfs_dirent_init_lockdep(sd) do {} while(0)
@@ -111,7 +115,6 @@ struct sysfs_addrm_cxt {
  * mount.c
  */
 extern struct sysfs_dirent sysfs_root;
-extern struct super_block *sysfs_sb;
 extern struct kmem_cache *sysfs_dir_cachep;
 
 /*
@@ -124,8 +127,8 @@ extern const struct file_operations sysfs_dir_operations;
 extern const struct inode_operations sysfs_dir_inode_operations;
 
 struct dentry *sysfs_get_dentry(struct sysfs_dirent *sd);
-struct sysfs_dirent *sysfs_get_active_two(struct sysfs_dirent *sd);
-void sysfs_put_active_two(struct sysfs_dirent *sd);
+struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd);
+void sysfs_put_active(struct sysfs_dirent *sd);
 void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,
                       struct sysfs_dirent *parent_sd);
 int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd);
@@ -168,7 +171,7 @@ static inline void __sysfs_put(struct sysfs_dirent *sd)
 /*
  * inode.c
  */
-struct inode *sysfs_get_inode(struct sysfs_dirent *sd);
+struct inode *sysfs_get_inode(struct super_block *sb, struct sysfs_dirent *sd);
 void sysfs_delete_inode(struct inode *inode);
 int sysfs_sd_setattr(struct sysfs_dirent *sd, struct iattr *iattr);
 int sysfs_permission(struct inode *inode, int mask);
index b30527d..1821928 100644 (file)
@@ -106,7 +106,7 @@ extern int bus_unregister_notifier(struct bus_type *bus,
 
 /* All 4 notifers below get called with the target struct device *
  * as an argument. Note that those functions are likely to be called
- * with the device semaphore held in the core, so be careful.
+ * with the device lock held in the core, so be careful.
  */
 #define BUS_NOTIFY_ADD_DEVICE          0x00000001 /* device added */
 #define BUS_NOTIFY_DEL_DEVICE          0x00000002 /* device removed */
@@ -251,8 +251,10 @@ extern struct device *class_find_device(struct class *class,
 
 struct class_attribute {
        struct attribute attr;
-       ssize_t (*show)(struct class *class, char *buf);
-       ssize_t (*store)(struct class *class, const char *buf, size_t count);
+       ssize_t (*show)(struct class *class, struct class_attribute *attr,
+                       char *buf);
+       ssize_t (*store)(struct class *class, struct class_attribute *attr,
+                       const char *buf, size_t count);
 };
 
 #define CLASS_ATTR(_name, _mode, _show, _store)                        \
@@ -263,6 +265,23 @@ extern int __must_check class_create_file(struct class *class,
 extern void class_remove_file(struct class *class,
                              const struct class_attribute *attr);
 
+/* Simple class attribute that is just a static string */
+
+struct class_attribute_string {
+       struct class_attribute attr;
+       char *str;
+};
+
+/* Currently read-only only */
+#define _CLASS_ATTR_STRING(_name, _mode, _str) \
+       { __ATTR(_name, _mode, show_class_attr_string, NULL), _str }
+#define CLASS_ATTR_STRING(_name, _mode, _str) \
+       struct class_attribute_string class_attr_##_name = \
+               _CLASS_ATTR_STRING(_name, _mode, _str)
+
+extern ssize_t show_class_attr_string(struct class *class, struct class_attribute *attr,
+                        char *buf);
+
 struct class_interface {
        struct list_head        node;
        struct class            *class;
@@ -489,6 +508,21 @@ static inline bool device_async_suspend_enabled(struct device *dev)
        return !!dev->power.async_suspend;
 }
 
+static inline void device_lock(struct device *dev)
+{
+       down(&dev->sem);
+}
+
+static inline int device_trylock(struct device *dev)
+{
+       return down_trylock(&dev->sem);
+}
+
+static inline void device_unlock(struct device *dev)
+{
+       up(&dev->sem);
+}
+
 void driver_init(void);
 
 /*
index 58ae8e0..3950d3c 100644 (file)
@@ -106,7 +106,7 @@ extern char *kobject_get_path(struct kobject *kobj, gfp_t flag);
 
 struct kobj_type {
        void (*release)(struct kobject *kobj);
-       struct sysfs_ops *sysfs_ops;
+       const struct sysfs_ops *sysfs_ops;
        struct attribute **default_attrs;
 };
 
@@ -118,9 +118,9 @@ struct kobj_uevent_env {
 };
 
 struct kset_uevent_ops {
-       int (*filter)(struct kset *kset, struct kobject *kobj);
-       const char *(*name)(struct kset *kset, struct kobject *kobj);
-       int (*uevent)(struct kset *kset, struct kobject *kobj,
+       int (* const filter)(struct kset *kset, struct kobject *kobj);
+       const char *(* const name)(struct kset *kset, struct kobject *kobj);
+       int (* const uevent)(struct kset *kset, struct kobject *kobj,
                      struct kobj_uevent_env *env);
 };
 
@@ -132,7 +132,7 @@ struct kobj_attribute {
                         const char *buf, size_t count);
 };
 
-extern struct sysfs_ops kobj_sysfs_ops;
+extern const struct sysfs_ops kobj_sysfs_ops;
 
 /**
  * struct kset - a set of kobjects of a specific type, belonging to a specific subsystem.
@@ -155,14 +155,14 @@ struct kset {
        struct list_head list;
        spinlock_t list_lock;
        struct kobject kobj;
-       struct kset_uevent_ops *uevent_ops;
+       const struct kset_uevent_ops *uevent_ops;
 };
 
 extern void kset_init(struct kset *kset);
 extern int __must_check kset_register(struct kset *kset);
 extern void kset_unregister(struct kset *kset);
 extern struct kset * __must_check kset_create_and_add(const char *name,
-                                               struct kset_uevent_ops *u,
+                                               const struct kset_uevent_ops *u,
                                                struct kobject *parent_kobj);
 
 static inline struct kset *to_kset(struct kobject *kobj)
index 71ff887..212da17 100644 (file)
@@ -21,7 +21,7 @@ struct platform_device {
        u32             num_resources;
        struct resource * resource;
 
-       struct platform_device_id       *id_entry;
+       const struct platform_device_id *id_entry;
 
        /* arch specific additions */
        struct pdev_archdata    archdata;
@@ -62,7 +62,7 @@ struct platform_driver {
        int (*suspend)(struct platform_device *, pm_message_t state);
        int (*resume)(struct platform_device *);
        struct device_driver driver;
-       struct platform_device_id *id_table;
+       const struct platform_device_id *id_table;
 };
 
 extern int platform_driver_register(struct platform_driver *);
@@ -77,6 +77,11 @@ extern int platform_driver_probe(struct platform_driver *driver,
 #define platform_get_drvdata(_dev)     dev_get_drvdata(&(_dev)->dev)
 #define platform_set_drvdata(_dev,data)        dev_set_drvdata(&(_dev)->dev, (data))
 
+extern struct platform_device *platform_create_bundle(struct platform_driver *driver,
+                                       int (*probe)(struct platform_device *),
+                                       struct resource *res, unsigned int n_res,
+                                       const void *data, size_t size);
+
 /* early platform driver interface */
 struct early_platform_driver {
        const char *class_str;
index f395bb3..1154c29 100644 (file)
 
 
 struct sys_device;
+struct sysdev_class_attribute;
 
 struct sysdev_class {
        const char *name;
        struct list_head        drivers;
+       struct sysdev_class_attribute **attrs;
 
        /* Default operations for these types of devices */
        int     (*shutdown)(struct sys_device *);
@@ -41,8 +43,10 @@ struct sysdev_class {
 
 struct sysdev_class_attribute {
        struct attribute attr;
-       ssize_t (*show)(struct sysdev_class *, char *);
-       ssize_t (*store)(struct sysdev_class *, const char *, size_t);
+       ssize_t (*show)(struct sysdev_class *, struct sysdev_class_attribute *,
+                       char *);
+       ssize_t (*store)(struct sysdev_class *, struct sysdev_class_attribute *,
+                        const char *, size_t);
 };
 
 #define _SYSDEV_CLASS_ATTR(_name,_mode,_show,_store)           \
@@ -119,6 +123,19 @@ struct sysdev_attribute {
 extern int sysdev_create_file(struct sys_device *, struct sysdev_attribute *);
 extern void sysdev_remove_file(struct sys_device *, struct sysdev_attribute *);
 
+/* Create/remove NULL terminated attribute list */
+static inline int
+sysdev_create_files(struct sys_device *d, struct sysdev_attribute **a)
+{
+       return sysfs_create_files(&d->kobj, (const struct attribute **)a);
+}
+
+static inline void
+sysdev_remove_files(struct sys_device *d, struct sysdev_attribute **a)
+{
+       return sysfs_remove_files(&d->kobj, (const struct attribute **)a);
+}
+
 struct sysdev_ext_attribute {
        struct sysdev_attribute attr;
        void *var;
index cfa8308..f0496b3 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/compiler.h>
 #include <linux/errno.h>
 #include <linux/list.h>
+#include <linux/lockdep.h>
 #include <asm/atomic.h>
 
 struct kobject;
@@ -29,8 +30,33 @@ struct attribute {
        const char              *name;
        struct module           *owner;
        mode_t                  mode;
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+       struct lock_class_key   *key;
+       struct lock_class_key   skey;
+#endif
 };
 
+/**
+ *     sysfs_attr_init - initialize a dynamically allocated sysfs attribute
+ *     @attr: struct attribute to initialize
+ *
+ *     Initialize a dynamically allocated struct attribute so we can
+ *     make lockdep happy.  This is a new requirement for attributes
+ *     and initially this is only needed when lockdep is enabled.
+ *     Lockdep gives a nice error when your attribute is added to
+ *     sysfs if you don't have this.
+ */
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+#define sysfs_attr_init(attr)                          \
+do {                                                   \
+       static struct lock_class_key __key;             \
+                                                       \
+       (attr)->key = &__key;                           \
+} while(0)
+#else
+#define sysfs_attr_init(attr) do {} while(0)
+#endif
+
 struct attribute_group {
        const char              *name;
        mode_t                  (*is_visible)(struct kobject *,
@@ -74,6 +100,18 @@ struct bin_attribute {
                    struct vm_area_struct *vma);
 };
 
+/**
+ *     sysfs_bin_attr_init - initialize a dynamically allocated bin_attribute
+ *     @attr: struct bin_attribute to initialize
+ *
+ *     Initialize a dynamically allocated struct bin_attribute so we
+ *     can make lockdep happy.  This is a new requirement for
+ *     attributes and initially this is only needed when lockdep is
+ *     enabled.  Lockdep gives a nice error when your attribute is
+ *     added to sysfs if you don't have this.
+ */
+#define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr)
+
 struct sysfs_ops {
        ssize_t (*show)(struct kobject *, struct attribute *,char *);
        ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);
@@ -94,9 +132,12 @@ int __must_check sysfs_move_dir(struct kobject *kobj,
 
 int __must_check sysfs_create_file(struct kobject *kobj,
                                   const struct attribute *attr);
+int __must_check sysfs_create_files(struct kobject *kobj,
+                                  const struct attribute **attr);
 int __must_check sysfs_chmod_file(struct kobject *kobj, struct attribute *attr,
                                  mode_t mode);
 void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr);
+void sysfs_remove_files(struct kobject *kobj, const struct attribute **attr);
 
 int __must_check sysfs_create_bin_file(struct kobject *kobj,
                                       const struct bin_attribute *attr);
@@ -110,6 +151,9 @@ int __must_check sysfs_create_link_nowarn(struct kobject *kobj,
                                          const char *name);
 void sysfs_remove_link(struct kobject *kobj, const char *name);
 
+int sysfs_rename_link(struct kobject *kobj, struct kobject *target,
+                       const char *old_name, const char *new_name);
+
 int __must_check sysfs_create_group(struct kobject *kobj,
                                    const struct attribute_group *grp);
 int sysfs_update_group(struct kobject *kobj,
@@ -164,6 +208,12 @@ static inline int sysfs_create_file(struct kobject *kobj,
        return 0;
 }
 
+static inline int sysfs_create_files(struct kobject *kobj,
+                                   const struct attribute **attr)
+{
+       return 0;
+}
+
 static inline int sysfs_chmod_file(struct kobject *kobj,
                                   struct attribute *attr, mode_t mode)
 {
@@ -175,6 +225,11 @@ static inline void sysfs_remove_file(struct kobject *kobj,
 {
 }
 
+static inline void sysfs_remove_files(struct kobject *kobj,
+                                    const struct attribute **attr)
+{
+}
+
 static inline int sysfs_create_bin_file(struct kobject *kobj,
                                        const struct bin_attribute *attr)
 {
@@ -203,6 +258,12 @@ static inline void sysfs_remove_link(struct kobject *kobj, const char *name)
 {
 }
 
+static inline int sysfs_rename_link(struct kobject *k, struct kobject *t,
+                                   const char *old_name, const char *new_name)
+{
+       return 0;
+}
+
 static inline int sysfs_create_group(struct kobject *kobj,
                                     const struct attribute_group *grp)
 {
index 3492abf..8c9f053 100644 (file)
@@ -512,9 +512,9 @@ extern struct usb_device *usb_get_dev(struct usb_device *dev);
 extern void usb_put_dev(struct usb_device *dev);
 
 /* USB device locking */
-#define usb_lock_device(udev)          down(&(udev)->dev.sem)
-#define usb_unlock_device(udev)                up(&(udev)->dev.sem)
-#define usb_trylock_device(udev)       down_trylock(&(udev)->dev.sem)
+#define usb_lock_device(udev)          device_lock(&(udev)->dev)
+#define usb_unlock_device(udev)                device_unlock(&(udev)->dev)
+#define usb_trylock_device(udev)       device_trylock(&(udev)->dev)
 extern int usb_lock_device_for_reset(struct usb_device *udev,
                                     const struct usb_interface *iface);
 
index e5538d5..c968d36 100644 (file)
@@ -1085,6 +1085,7 @@ static void add_sect_attrs(struct module *mod, unsigned int nsect,
                if (sattr->name == NULL)
                        goto out;
                sect_attrs->nsections++;
+               sysfs_attr_init(&sattr->mattr.attr);
                sattr->mattr.show = module_sect_show;
                sattr->mattr.store = NULL;
                sattr->mattr.attr.name = sattr->name;
@@ -1180,6 +1181,7 @@ static void add_notes_attrs(struct module *mod, unsigned int nsect,
                if (sect_empty(&sechdrs[i]))
                        continue;
                if (sechdrs[i].sh_type == SHT_NOTE) {
+                       sysfs_bin_attr_init(nattr);
                        nattr->attr.name = mod->sect_attrs->attrs[loaded].name;
                        nattr->attr.mode = S_IRUGO;
                        nattr->size = sechdrs[i].sh_size;
@@ -1252,6 +1254,7 @@ int module_add_modinfo_attrs(struct module *mod)
                if (!attr->test ||
                    (attr->test && attr->test(mod))) {
                        memcpy(temp_attr, attr, sizeof(*temp_attr));
+                       sysfs_attr_init(&temp_attr->attr);
                        error = sysfs_create_file(&mod->mkobj.kobj,&temp_attr->attr);
                        ++temp_attr;
                }
index 8d95f54..d55a53e 100644 (file)
@@ -516,6 +516,7 @@ static __modinit int add_sysfs_param(struct module_kobject *mk,
        new->grp.attrs = attrs;
 
        /* Tack new one on the end. */
+       sysfs_attr_init(&new->attrs[num].mattr.attr);
        new->attrs[num].param = kp;
        new->attrs[num].mattr.show = param_attr_show;
        new->attrs[num].mattr.store = param_attr_store;
@@ -722,7 +723,7 @@ static ssize_t module_attr_store(struct kobject *kobj,
        return ret;
 }
 
-static struct sysfs_ops module_sysfs_ops = {
+static const struct sysfs_ops module_sysfs_ops = {
        .show = module_attr_show,
        .store = module_attr_store,
 };
@@ -736,7 +737,7 @@ static int uevent_filter(struct kset *kset, struct kobject *kobj)
        return 0;
 }
 
-static struct kset_uevent_ops module_uevent_ops = {
+static const struct kset_uevent_ops module_uevent_ops = {
        .filter = uevent_filter,
 };
 
index 8e352c7..f40560b 100644 (file)
@@ -5481,13 +5481,16 @@ void __init perf_event_init(void)
        register_cpu_notifier(&perf_cpu_nb);
 }
 
-static ssize_t perf_show_reserve_percpu(struct sysdev_class *class, char *buf)
+static ssize_t perf_show_reserve_percpu(struct sysdev_class *class,
+                                       struct sysdev_class_attribute *attr,
+                                       char *buf)
 {
        return sprintf(buf, "%d\n", perf_reserved_percpu);
 }
 
 static ssize_t
 perf_set_reserve_percpu(struct sysdev_class *class,
+                       struct sysdev_class_attribute *attr,
                        const char *buf,
                        size_t count)
 {
@@ -5516,13 +5519,17 @@ perf_set_reserve_percpu(struct sysdev_class *class,
        return count;
 }
 
-static ssize_t perf_show_overcommit(struct sysdev_class *class, char *buf)
+static ssize_t perf_show_overcommit(struct sysdev_class *class,
+                                   struct sysdev_class_attribute *attr,
+                                   char *buf)
 {
        return sprintf(buf, "%d\n", perf_overcommit);
 }
 
 static ssize_t
-perf_set_overcommit(struct sysdev_class *class, const char *buf, size_t count)
+perf_set_overcommit(struct sysdev_class *class,
+                   struct sysdev_class_attribute *attr,
+                   const char *buf, size_t count)
 {
        unsigned long val;
        int err;
index b47ceee..150b698 100644 (file)
@@ -7406,11 +7406,13 @@ static ssize_t sched_power_savings_store(const char *buf, size_t count, int smt)
 
 #ifdef CONFIG_SCHED_MC
 static ssize_t sched_mc_power_savings_show(struct sysdev_class *class,
+                                          struct sysdev_class_attribute *attr,
                                           char *page)
 {
        return sprintf(page, "%u\n", sched_mc_power_savings);
 }
 static ssize_t sched_mc_power_savings_store(struct sysdev_class *class,
+                                           struct sysdev_class_attribute *attr,
                                            const char *buf, size_t count)
 {
        return sched_power_savings_store(buf, count, 0);
@@ -7422,11 +7424,13 @@ static SYSDEV_CLASS_ATTR(sched_mc_power_savings, 0644,
 
 #ifdef CONFIG_SCHED_SMT
 static ssize_t sched_smt_power_savings_show(struct sysdev_class *dev,
+                                           struct sysdev_class_attribute *attr,
                                            char *page)
 {
        return sprintf(page, "%u\n", sched_smt_power_savings);
 }
 static ssize_t sched_smt_power_savings_store(struct sysdev_class *dev,
+                                            struct sysdev_class_attribute *attr,
                                             const char *buf, size_t count)
 {
        return sched_power_savings_store(buf, count, 1);
index b512b74..8115eb1 100644 (file)
@@ -700,7 +700,7 @@ static ssize_t kobj_attr_store(struct kobject *kobj, struct attribute *attr,
        return ret;
 }
 
-struct sysfs_ops kobj_sysfs_ops = {
+const struct sysfs_ops kobj_sysfs_ops = {
        .show   = kobj_attr_show,
        .store  = kobj_attr_store,
 };
@@ -789,7 +789,7 @@ static struct kobj_type kset_ktype = {
  * If the kset was not able to be created, NULL will be returned.
  */
 static struct kset *kset_create(const char *name,
-                               struct kset_uevent_ops *uevent_ops,
+                               const struct kset_uevent_ops *uevent_ops,
                                struct kobject *parent_kobj)
 {
        struct kset *kset;
@@ -832,7 +832,7 @@ static struct kset *kset_create(const char *name,
  * If the kset was not able to be created, NULL will be returned.
  */
 struct kset *kset_create_and_add(const char *name,
-                                struct kset_uevent_ops *uevent_ops,
+                                const struct kset_uevent_ops *uevent_ops,
                                 struct kobject *parent_kobj)
 {
        struct kset *kset;
index 920a3ca..c9d3a3e 100644 (file)
@@ -95,7 +95,7 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
        const char *subsystem;
        struct kobject *top_kobj;
        struct kset *kset;
-       struct kset_uevent_ops *uevent_ops;
+       const struct kset_uevent_ops *uevent_ops;
        u64 seq;
        int i = 0;
        int retval = 0;
index 0bfd386..a2b8969 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -4390,7 +4390,7 @@ static void kmem_cache_release(struct kobject *kobj)
        kfree(s);
 }
 
-static struct sysfs_ops slab_sysfs_ops = {
+static const struct sysfs_ops slab_sysfs_ops = {
        .show = slab_attr_show,
        .store = slab_attr_store,
 };
@@ -4409,7 +4409,7 @@ static int uevent_filter(struct kset *kset, struct kobject *kobj)
        return 0;
 }
 
-static struct kset_uevent_ops slab_uevent_ops = {
+static const struct kset_uevent_ops slab_uevent_ops = {
        .filter = uevent_filter,
 };
 
index 400efa2..4db7ae2 100644 (file)
@@ -3937,7 +3937,9 @@ drop:
        return 0;
 }
 
-static ssize_t l2cap_sysfs_show(struct class *dev, char *buf)
+static ssize_t l2cap_sysfs_show(struct class *dev,
+                               struct class_attribute *attr,
+                               char *buf)
 {
        struct sock *sk;
        struct hlist_node *node;
index 89f4a59..db8a68e 100644 (file)
@@ -2098,7 +2098,9 @@ static struct hci_cb rfcomm_cb = {
        .security_cfm   = rfcomm_security_cfm
 };
 
-static ssize_t rfcomm_dlc_sysfs_show(struct class *dev, char *buf)
+static ssize_t rfcomm_dlc_sysfs_show(struct class *dev,
+                                    struct class_attribute *attr,
+                                    char *buf)
 {
        struct rfcomm_session *s;
        struct list_head *pp, *p;
index 4b5968d..ca87d6a 100644 (file)
@@ -1061,7 +1061,9 @@ done:
        return result;
 }
 
-static ssize_t rfcomm_sock_sysfs_show(struct class *dev, char *buf)
+static ssize_t rfcomm_sock_sysfs_show(struct class *dev,
+                                     struct class_attribute *attr,
+                                     char *buf)
 {
        struct sock *sk;
        struct hlist_node *node;
index dd8f6ec..f93b939 100644 (file)
@@ -953,7 +953,9 @@ drop:
        return 0;
 }
 
-static ssize_t sco_sysfs_show(struct class *dev, char *buf)
+static ssize_t sco_sysfs_show(struct class *dev,
+                               struct class_attribute *attr,
+                               char *buf)
 {
        struct sock *sk;
        struct hlist_node *node;
index 1cf2cef..fef0384 100644 (file)
@@ -423,7 +423,7 @@ extern void br_ifinfo_notify(int event, struct net_bridge_port *port);
 
 #ifdef CONFIG_SYSFS
 /* br_sysfs_if.c */
-extern struct sysfs_ops brport_sysfs_ops;
+extern const struct sysfs_ops brport_sysfs_ops;
 extern int br_sysfs_addif(struct net_bridge_port *p);
 
 /* br_sysfs_br.c */
index 696596c..0b99164 100644 (file)
@@ -238,7 +238,7 @@ static ssize_t brport_store(struct kobject * kobj,
        return ret;
 }
 
-struct sysfs_ops brport_sysfs_ops = {
+const struct sysfs_ops brport_sysfs_ops = {
        .show = brport_show,
        .store = brport_store,
 };
index 8d9b55a..86ea0c3 100644 (file)
@@ -44,7 +44,7 @@ static struct kobj_attribute foo_attribute =
        __ATTR(foo, 0666, foo_show, foo_store);
 
 /*
- * More complex function where we determine which varible is being accessed by
+ * More complex function where we determine which variable is being accessed by
  * looking at the attribute for the "baz" and "bar" files.
  */
 static ssize_t b_show(struct kobject *kobj, struct kobj_attribute *attr,
@@ -79,7 +79,7 @@ static struct kobj_attribute bar_attribute =
 
 
 /*
- * Create a group of attributes so that we can create and destory them all
+ * Create a group of attributes so that we can create and destroy them all
  * at once.
  */
 static struct attribute *attrs[] = {
index 45b7d56..3b126d1 100644 (file)
@@ -87,7 +87,7 @@ static ssize_t foo_attr_store(struct kobject *kobj,
 }
 
 /* Our custom sysfs_ops that we will associate with our ktype later on */
-static struct sysfs_ops foo_sysfs_ops = {
+static const struct sysfs_ops foo_sysfs_ops = {
        .show = foo_attr_show,
        .store = foo_attr_store,
 };
@@ -127,7 +127,7 @@ static struct foo_attribute foo_attribute =
        __ATTR(foo, 0666, foo_show, foo_store);
 
 /*
- * More complex function where we determine which varible is being accessed by
+ * More complex function where we determine which variable is being accessed by
  * looking at the attribute for the "baz" and "bar" files.
  */
 static ssize_t b_show(struct foo_obj *foo_obj, struct foo_attribute *attr,
@@ -161,7 +161,7 @@ static struct foo_attribute bar_attribute =
        __ATTR(bar, 0666, b_show, b_store);
 
 /*
- * Create a group of attributes so that we can create and destory them all
+ * Create a group of attributes so that we can create and destroy them all
  * at once.
  */
 static struct attribute *foo_default_attrs[] = {