mirror of
https://github.com/joel16/android_kernel_sony_msm8994.git
synced 2024-11-30 07:31:23 +00:00
220f03ace2
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJVoAOcAAoJEDjbvchgkmk+UhcP/1EOwnsJDcZ/sZkkclNgRmrJ yLBCW65caLAI2E3SmIdKvHQwIx7lHzX5gmWRBrvx+fIl4KhaNKEQ0NCOf1ATaVuQ MkYMdkicXWpLiFNdKokezryevGS8T1RME+2QlPFv3++Rby1Gy90YD5tu7YlIrEn7 sPRJQHEPCzVAQ7Lqhd66yHICM6/QvdefXj4pjh7vV8IMb2YwnY4vqYt7RxnJCUfP tqljxrT274kzpA2awzALNh+o3B3/Y4W9ROmlDWviw3JBc9gEqFXYwbDf8KDwA5c0 sp9GPGed/dV5DFuqRcAHksJenFnE3E4gZjo/R5hluHQU27peBuRfXev2hZyBfZqG 796eUOky8fb0OiyxHfT2vhfGeD7CHI/asvIAORjDBVUqzJy9nkkby3XJ0U4tW+pz VkcilD2oHw1uRIFH3JoBWTJ9W6CYSNFG1qxw+brgfKT5otJG/dBiI8kBABx+aTq7 V+A2cvf11oVwDEb93dnVypMGsfCywqzJUwEIRli9fTFjK7Fg9CBSGX38nwVGUaRv M2/NeloTyWqUQE41Nd11gCu+hKQRtUU77nxpZcSeKn1XsbpO9/7dHTwcELRuKnTD 9XDksqPznXmC9KXGj7XMcRkLyWyB//JHjay0FCS6b4S6v7R5nrEIRjcpdB+H1WLd zMOXRH4ZlcOAS/Yt2QMd =8AB3 -----END PGP SIGNATURE----- Merge upstream tag 'v3.10.84' into LA.BF64.1.2.2 This merge brings us up-to-date as of upstream tag v3.10.84 * tag 'v3.10.84' (1494 commits): Linux 3.10.84 fs: Fix S_NOSEC handling KVM: x86: make vapics_in_nmi_mode atomic MIPS: Fix KVM guest fixmap address x86/PCI: Use host bridge _CRS info on Foxconn K8M890-8237A powerpc/perf: Fix book3s kernel to userspace backtraces arm: KVM: force execution of HCPTR access on VM exit Revert "crypto: talitos - convert to use be16_add_cpu()" crypto: talitos - avoid memleak in talitos_alg_alloc() sctp: Fix race between OOTB responce and route removal packet: avoid out of bounds read in round robin fanout packet: read num_members once in packet_rcv_fanout() bridge: fix br_stp_set_bridge_priority race conditions bridge: fix multicast router rlist endless loop sparc: Use GFP_ATOMIC in ldc_alloc_exp_dring() as it can be called in softirq context Linux 3.10.83 bus: mvebu: pass the coherency availability information at init time KVM: nSVM: Check for NRIPS support before updating control field ARM: clk-imx6q: refine sata's parent d_walk() might skip too much ipv6: update ip6_rt_last_gc every time GC is run ipv6: prevent fib6_run_gc() contention xfrm: Increase the garbage collector threshold Btrfs: make xattr replace operations atomic x86/microcode/intel: Guard against stack overflow in the loader fs: take i_mutex during prepare_binprm for set[ug]id executables hpsa: add missing pci_set_master in kdump path hpsa: refine the pci enable/disable handling sb_edac: Fix erroneous bytes->gigabytes conversion ACPICA: Utilities: Cleanup to remove useless ACPI_PRINTF/FORMAT_xxx helpers. ACPICA: Utilities: Cleanup to convert physical address printing formats. __ptrace_may_access() should not deny sub-threads include/linux/sched.h: don't use task->pid/tgid in same_thread_group/has_group_leader_pid netfilter: Zero the tuple in nfnl_cthelper_parse_tuple() netfilter: nfnetlink_cthelper: Remove 'const' and '&' to avoid warnings config: Enable NEED_DMA_MAP_STATE by default when SWIOTLB is selected get rid of s_files and files_lock fput: turn "list_head delayed_fput_list" into llist_head Linux 3.10.82 lpfc: Add iotag memory barrier pipe: iovec: Fix memory corruption when retrying atomic copy as non-atomic drm/mgag200: Reject non-character-cell-aligned mode widths tracing: Have filter check for balanced ops crypto: caam - fix RNG buffer cache alignment Linux 3.10.81 btrfs: cleanup orphans while looking up default subvolume btrfs: incorrect handling for fiemap_fill_next_extent return cfg80211: wext: clear sinfo struct before calling driver mm/memory_hotplug.c: set zone->wait_table to null after freeing it drm/i915: Fix DDC probe for passive adapters pata_octeon_cf: fix broken build ozwpan: unchecked signed subtraction leads to DoS ozwpan: divide-by-zero leading to panic ozwpan: Use proper check to prevent heap overflow MIPS: Fix enabling of DEBUG_STACKOVERFLOW ring-buffer-benchmark: Fix the wrong sched_priority of producer USB: serial: ftdi_sio: Add support for a Motion Tracker Development Board USB: cp210x: add ID for HubZ dual ZigBee and Z-Wave dongle block: fix ext_dev_lock lockdep report Input: elantech - fix detection of touchpads where the revision matches a known rate ALSA: usb-audio: add MAYA44 USB+ mixer control names ALSA: usb-audio: Add mic volume fix quirk for Logitech Quickcam Fusion ALSA: hda/realtek - Add a fixup for another Acer Aspire 9420 iio: adis16400: Compute the scan mask from channel indices iio: adis16400: Use != channel indices for the two voltage channels iio: adis16400: Report pressure channel scale xen: netback: read hotplug script once at start of day. udp: fix behavior of wrong checksums net_sched: invoke ->attach() after setting dev->qdisc unix/caif: sk_socket can disappear when state is unlocked net: dp83640: fix broken calibration routine. bridge: fix parsing of MLDv2 reports ipv4: Avoid crashing in ip_error net: phy: Allow EEE for all RGMII variants Linux 3.10.80 fs/binfmt_elf.c:load_elf_binary(): return -EINVAL on zero-length mappings vfs: read file_handle only once in handle_to_path ACPI / init: Fix the ordering of acpi_reserve_resources() Input: elantech - fix semi-mt protocol for v3 HW rtlwifi: rtl8192cu: Fix kernel deadlock md/raid5: don't record new size if resize_stripes fails. svcrpc: fix potential GSSX_ACCEPT_SEC_CONTEXT decoding failures ARM: fix missing syscall trace exit ARM: dts: imx27: only map 4 Kbyte for fec registers crypto: s390/ghash - Fix incorrect ghash icv buffer handling. rt2x00: add new rt2800usb device DWA 130 libata: Ignore spurious PHY event on LPM policy change libata: Add helper to determine when PHY events should be ignored ext4: check for zero length extent explicitly ext4: convert write_begin methods to stable_page_writes semantics mmc: atmel-mci: fix bad variable type for clkdiv powerpc: Align TOC to 256 bytes usb: gadget: configfs: Fix interfaces array NULL-termination usb-storage: Add NO_WP_DETECT quirk for Lacie 059f:0651 devices USB: cp210x: add ID for KCF Technologies PRN device USB: pl2303: Remove support for Samsung I330 USB: visor: Match I330 phone more precisely xhci: gracefully handle xhci_irq dead device xhci: Solve full event ring by increasing TRBS_PER_SEGMENT to 256 xhci: fix isoc endpoint dequeue from advancing too far on transaction error target/pscsi: Don't leak scsi_host if hba is VIRTUAL_HOST ASoC: wm8994: correct BCLK DIV 348 to 384 ASoC: wm8960: fix "RINPUT3" audio route error ASoC: mc13783: Fix wrong mask value used in mc13xxx_reg_rmw() calls ALSA: hda - Add headphone quirk for Lifebook E752 ALSA: hda - Add Conexant codecs CX20721, CX20722, CX20723 and CX20724 d_walk() might skip too much lib: Fix strnlen_user() to not touch memory after specified maximum hwmon: (ntc_thermistor) Ensure iio channel is of type IIO_VOLTAGE libceph: request a new osdmap if lingering request maps to no osd lguest: fix out-by-one error in address checking. fs, omfs: add NULL terminator in the end up the token list KVM: MMU: fix CR4.SMEP=1, CR0.WP=0 with shadow pages net: socket: Fix the wrong returns for recvmsg and sendmsg kernel: use the gnu89 standard explicitly staging, rtl8192e, LLVMLinux: Remove unused inline prototype staging: rtl8712, rtl8712: avoid lots of build warnings staging, rtl8192e, LLVMLinux: Change extern inline to static inline drm/i915: Fix declaration of intel_gmbus_{is_forced_bit/is_port_falid} staging: wlags49_h2: fix extern inline functions Linux 3.10.79 ACPICA: Utilities: Cleanup to enforce ACPI_PHYSADDR_TO_PTR()/ACPI_PTR_TO_PHYSADDR(). ACPICA: Tables: Change acpi_find_root_pointer() to use acpi_physical_address. revert "softirq: Add support for triggering softirq work on softirqs" sound/oss: fix deadlock in sequencer_ioctl(SNDCTL_SEQ_OUTOFBAND) mmc: card: Don't access RPMB partitions for normal read/write pinctrl: Don't just pretend to protect pinctrl_maps, do it for real drm/i915: Add missing MacBook Pro models with dual channel LVDS ARM: mvebu: armada-xp-openblocks-ax3-4: Disable internal RTC ARM: dts: imx23-olinuxino: Fix dr_mode of usb0 ARM: dts: imx28: Fix AUART4 TX-DMA interrupt name ARM: dts: imx25: Add #pwm-cells to pwm4 gpio: sysfs: fix memory leaks and device hotplug gpio: unregister gpiochip device before removing it xen/console: Update console event channel on resume mm/memory-failure: call shake_page() when error hits thp tail page nilfs2: fix sanity check of btree level in nilfs_btree_root_broken() ocfs2: dlm: fix race between purge and get lock resource Linux 3.10.78 ARC: signal handling robustify UBI: fix soft lockup in ubi_check_volume() Drivers: hv: vmbus: Don't wait after requesting offers ARM: dts: dove: Fix uart[23] reg property staging: panel: fix lcd type usb: gadget: printer: enqueue printer's response for setup request usb: host: oxu210hp: use new USB_RESUME_TIMEOUT 3w-sas: fix command completion race 3w-9xxx: fix command completion race 3w-xxxx: fix command completion race ext4: fix data corruption caused by unwritten and delayed extents rbd: end I/O the entire obj_request on error serial: of-serial: Remove device_type = "serial" registration ALSA: hda - Fix mute-LED fixed mode ALSA: emu10k1: Emu10k2 32 bit DMA mode ALSA: emu10k1: Fix card shortname string buffer overflow ALSA: emux: Fix mutex deadlock in OSS emulation ALSA: emux: Fix mutex deadlock at unloading ipv4: Missing sk_nulls_node_init() in ping_unhash(). Linux 3.10.77 s390: Fix build error nosave: consolidate __nosave_{begin,end} in <asm/sections.h> memstick: mspro_block: add missing curly braces C6x: time: Ensure consistency in __init wl18xx: show rx_frames_per_rates as an array as it really is lib: memzero_explicit: use barrier instead of OPTIMIZER_HIDE_VAR e1000: add dummy allocator to fix race condition between mtu change and netpoll ksoftirqd: Enable IRQs and call cond_resched() before poking RCU RCU pathwalk breakage when running into a symlink overmounting something drm/i915: cope with large i2c transfers drm/radeon: fix doublescan modes (v2) i2c: core: Export bus recovery functions IB/mlx4: Fix WQE LSO segment calculation IB/core: don't disallow registering region starting at 0x0 IB/core: disallow registering 0-sized memory region stk1160: Make sure current buffer is released mvsas: fix panic on expander attached SATA devices Drivers: hv: vmbus: Fix a bug in the error path in vmbus_open() xtensa: provide __NR_sync_file_range2 instead of __NR_sync_file_range xtensa: xtfpga: fix hardware lockup caused by LCD driver ACPICA: Utilities: split IO address types from data type models. drivers: parport: Kconfig: exclude arm64 for PARPORT_PC scsi: storvsc: Fix a bug in copy_from_bounce_buffer() UBI: fix check for "too many bytes" UBI: initialize LEB number variable UBI: fix out of bounds write UBI: account for bitflips in both the VID header and data tools/power turbostat: Use $(CURDIR) instead of $(PWD) and add support for O= option in Makefile powerpc/perf: Cap 64bit userspace backtraces to PERF_MAX_STACK_DEPTH ext4: make fsync to sync parent dir in no-journal for real this time arm64: kernel: compiling issue, need delete read_current_timer() video: vgacon: Don't build on arm64 console: Disable VGA text console support on cris drivers: parport: Kconfig: exclude h8300 for PARPORT_PC parport: disable PC-style parallel port support on cris rtlwifi: rtl8192cu: Add new device ID rtlwifi: rtl8192cu: Add new USB ID ptrace: fix race between ptrace_resume() and wait_task_stopped() fs/binfmt_elf.c: fix bug in loading of PIE binaries Input: elantech - fix absolute mode setting on some ASUS laptops ALSA: emu10k1: don't deadlock in proc-functions usb: core: hub: use new USB_RESUME_TIMEOUT usb: host: sl811: use new USB_RESUME_TIMEOUT usb: host: xhci: use new USB_RESUME_TIMEOUT usb: host: isp116x: use new USB_RESUME_TIMEOUT usb: host: r8a66597: use new USB_RESUME_TIMEOUT usb: define a generic USB_RESUME_TIMEOUT macro usb: phy: Find the right match in devm_usb_phy_match ARM: S3C64XX: Use fixed IRQ bases to avoid conflicts on Cragganmore ARM: 8320/1: fix integer overflow in ELF_ET_DYN_BASE power_supply: lp8788-charger: Fix leaked power supply on probe fail ring-buffer: Replace this_cpu_*() with __this_cpu_*() spi: spidev: fix possible arithmetic overflow for multi-transfer message cdc-wdm: fix endianness bug in debug statements MIPS: Hibernate: flush TLB entries earlier KVM: use slowpath for cross page cached accesses s390/hibernate: fix save and restore of kernel text section KVM: s390: Zero out current VMDB of STSI before including level3 data. usb: gadget: composite: enable BESL support Btrfs: fix inode eviction infinite loop after cloning into it Btrfs: fix log tree corruption when fs mounted with -o discard tcp: avoid looping in tcp_send_fin() tcp: fix possible deadlock in tcp_send_fin() ip_forward: Drop frames with attached skb->sk Linux 3.10.76 dcache: Fix locking bugs in backported "deal with deadlock in d_walk()" arc: mm: Fix build failure sb_edac: avoid INTERNAL ERROR message in EDAC with unspecified channel x86: mm: move mmap_sem unlock from mm_fault_error() to caller vm: make stack guard page errors return VM_FAULT_SIGSEGV rather than SIGBUS vm: add VM_FAULT_SIGSEGV handling support deal with deadlock in d_walk() move d_rcu from overlapping d_child to overlapping d_alias kconfig: Fix warning "‘jump’ may be used uninitialized" KVM: x86: SYSENTER emulation is broken netfilter: conntrack: disable generic tracking for known protocols Bluetooth: Ignore isochronous endpoints for Intel USB bootloader Bluetooth: Add support for Intel bootloader devices Bluetooth: btusb: Add IMC Networks (Broadcom based) Bluetooth: Add firmware update for Atheros 0cf3:311f Bluetooth: Enable Atheros 0cf3:311e for firmware upload mm: Fix NULL pointer dereference in madvise(MADV_WILLNEED) support splice: Apply generic position and size checks to each write jfs: fix readdir regression serial: 8250_dw: Fix deadlock in LCR workaround benet: Call dev_kfree_skby_any instead of kfree_skb. ixgb: Call dev_kfree_skby_any instead of dev_kfree_skb. tg3: Call dev_kfree_skby_any instead of dev_kfree_skb. bnx2: Call dev_kfree_skby_any instead of dev_kfree_skb. r8169: Call dev_kfree_skby_any instead of dev_kfree_skb. 8139too: Call dev_kfree_skby_any instead of dev_kfree_skb. 8139cp: Call dev_kfree_skby_any instead of kfree_skb. tcp: tcp_make_synack() should clear skb->tstamp tcp: fix FRTO undo on cumulative ACK of SACKed range ipv6: Don't reduce hop limit for an interface tcp: prevent fetching dst twice in early demux code remove extra definitions of U32_MAX conditionally define U32_MAX Linux 3.10.75 pagemap: do not leak physical addresses to non-privileged userspace console: Fix console name size mismatch IB/mlx4: Saturate RoCE port PMA counters in case of overflow kernel.h: define u8, s8, u32, etc. limits net: llc: use correct size for sysctl timeout entries net: rds: use correct size for max unacked packets and bytes ipc: fix compat msgrcv with negative msgtyp core, nfqueue, openvswitch: fix compilation warning media: s5p-mfc: fix mmap support for 64bit arch iscsi target: fix oops when adding reject pdu ocfs2: _really_ sync the right range be2iscsi: Fix kernel panic when device initialization fails cifs: fix use-after-free bug in find_writable_file usb: xhci: apply XHCI_AVOID_BEI quirk to all Intel xHCI controllers cpuidle: ACPI: do not overwrite name and description of C0 dmaengine: omap-dma: Fix memory leak when terminating running transfer iio: imu: Use iio_trigger_get for indio_dev->trig assignment iio: inv_mpu6050: Clear timestamps fifo while resetting hardware fifo Defer processing of REQ_PREEMPT requests for blocked devices USB: ftdi_sio: Use jtag quirk for SNAP Connect E10 USB: ftdi_sio: Added custom PID for Synapse Wireless product radeon: Do not directly dereference pointers to BIOS area. writeback: fix possible underflow in write bandwidth calculation writeback: add missing INITIAL_JIFFIES init in global_update_bandwidth() mm/memory hotplug: postpone the reset of obsolete pgdat nbd: fix possible memory leak iwlwifi: dvm: run INIT firmware again upon .start() IB/uverbs: Prevent integer overflow in ib_umem_get address arithmetic IB/core: Avoid leakage from kernel to user space tcp: Fix crash in TCP Fast Open selinux: fix sel_write_enforce broken return value ALSA: hda - Fix headphone pin config for Lifebook T731 ALSA: usb - Creative USB X-Fi Pro SB1095 volume knob support ALSA: hda - Add one more node in the EAPD supporting candidate list Linux 3.10.74 net: ethernet: pcnet32: Setup the SRAM and NOUFLO on Am79C97{3, 5} powerpc/mpc85xx: Add ranges to etsec2 nodes hfsplus: fix B-tree corruption after insertion at position 0 dm: hold suspend_lock while suspending device during device deletion vt6655: RFbSetPower fix missing rate RATE_12M perf: Fix irq_work 'tail' recursion Revert "iwlwifi: mvm: fix failure path when power_update fails in add_interface" mac80211: drop unencrypted frames in mesh fwding mac80211: disable u-APSD queues by default nl80211: ignore HT/VHT capabilities without QoS/WMM tcm_qla2xxx: Fix incorrect use of __transport_register_session tcm_fc: missing curly braces in ft_invl_hw_context() ASoC: wm8955: Fix wrong value references for boolean kctl ASoC: adav80x: Fix wrong value references for boolean kctl ASoC: ak4641: Fix wrong value references for boolean kctl ASoC: wm8904: Fix wrong value references for boolean kctl ASoC: wm8903: Fix wrong value references for boolean kctl ASoC: wm2000: Fix wrong value references for boolean kctl ASoC: wm8731: Fix wrong value references for boolean kctl ASoC: tas5086: Fix wrong value references for boolean kctl ASoC: wm8960: Fix wrong value references for boolean kctl ASoC: cs4271: Fix wrong value references for boolean kctl ASoC: sgtl5000: remove useless register write clearing CHRGPUMP_POWERUP Linux 3.10.73 target: Allow Write Exclusive non-reservation holders to READ target: Allow AllRegistrants to re-RESERVE existing reservation target: Fix R_HOLDER bit usage for AllRegistrants target/pscsi: Fix NULL pointer dereference in get_device_type iscsi-target: Avoid early conn_logout_comp for iser connections target: Fix reference leak in target_get_sess_cmd() error path ARM: at91: pm: fix at91rm9200 standby ipvs: rerouting to local clients is not needed anymore ipvs: add missing ip_vs_pe_put in sync code powerpc/smp: Wait until secondaries are active & online x86/vdso: Fix the build on GCC5 x86/fpu: Drop_fpu() should not assume that tsk equals current x86/fpu: Avoid math_state_restore() without used_math() in __restore_xstate_sig() crypto: aesni - fix memory usage in GCM decryption libsas: Fix Kernel Crash in smp_execute_task xen-pciback: limit guest control of command register nilfs2: fix deadlock of segment constructor during recovery regulator: core: Fix enable GPIO reference counting regulator: Only enable disabled regulators on resume ALSA: hda - Treat stereo-to-mono mix properly ALSA: hda - Add workaround for MacBook Air 5,2 built-in mic ALSA: hda - Set single_adc_amp flag for CS420x codecs ALSA: hda - Don't access stereo amps for mono channel widgets ALSA: hda - Fix built-in mic on Compaq Presario CQ60 ALSA: control: Add sanity checks for user ctl id name string spi: pl022: Fix race in giveback() leading to driver lock-up tpm/ibmvtpm: Additional LE support for tpm_ibmvtpm_send workqueue: fix hang involving racing cancel[_delayed]_work_sync()'s for PREEMPT_NONE can: add missing initialisations in CAN related skbuffs Change email address for 8250_pci virtio_console: init work unconditionally fuse: notify: don't move pages fuse: set stolen page uptodate drm/radeon: drop setting UPLL to sleep mode drm/radeon: do a posting read in rs600_set_irq drm/radeon: do a posting read in si_set_irq drm/radeon: do a posting read in r600_set_irq drm/radeon: do a posting read in r100_set_irq drm/radeon: do a posting read in evergreen_set_irq drm/radeon: fix DRM_IOCTL_RADEON_CS oops tcp: make connect() mem charging friendly net: compat: Update get_compat_msghdr() to match copy_msghdr_from_user() behaviour tcp: fix tcp fin memory accounting Revert "net: cx82310_eth: use common match macro" rxrpc: bogus MSG_PEEK test in rxrpc_recvmsg() caif: fix MSG_OOB test in caif_seqpkt_recvmsg() inet_diag: fix possible overflow in inet_diag_dump_one_icsk() rds: avoid potential stack overflow net: sysctl_net_core: check SNDBUF and RCVBUF for min length sparc64: Fix several bugs in memmove(). sparc: Touch NMI watchdog when walking cpus and calling printk sparc: perf: Make counting mode actually work sparc: perf: Remove redundant perf_pmu_{en|dis}able calls sparc: semtimedop() unreachable due to comparison error sparc32: destroy_context() and switch_mm() needs to disable interrupts. Linux 3.10.72 ath5k: fix spontaneus AR5312 freezes ACPI / video: Load the module even if ACPI is disabled drm/radeon: fix 1 RB harvest config setup for TN/RL Drivers: hv: vmbus: incorrect device name is printed when child device is unregistered HID: fixup the conflicting keyboard mappings quirk HID: input: fix confusion on conflicting mappings staging: comedi: cb_pcidas64: fix incorrect AI range code handling dm snapshot: fix a possible invalid memory access on unload dm: fix a race condition in dm_get_md dm io: reject unsupported DISCARD requests with EOPNOTSUPP dm mirror: do not degrade the mirror on discard error staging: comedi: comedi_compat32.c: fix COMEDI_CMD copy back clk: sunxi: Support factor clocks with N factor starting not from 0 fixed invalid assignment of 64bit mask to host dma_boundary for scatter gather segment boundary limit. nilfs2: fix potential memory overrun on inode IB/qib: Do not write EEPROM sg: fix read() error reporting ALSA: hda - Add pin configs for ASUS mobo with IDT 92HD73XX codec ALSA: pcm: Don't leave PREPARED state after draining tty: fix up atime/mtime mess, take four sunrpc: fix braino in ->poll() procfs: fix race between symlink removals and traversals debugfs: leave freeing a symlink body until inode eviction autofs4 copy_dev_ioctl(): keep the value of ->size we'd used for allocation USB: serial: fix potential use-after-free after failed probe TTY: fix tty_wait_until_sent on 64-bit machines USB: serial: fix infinite wait_until_sent timeout net: irda: fix wait_until_sent poll timeout xhci: fix reporting of 0-sized URBs in control endpoint xhci: Allocate correct amount of scratchpad buffers usb: ftdi_sio: Add jtag quirk support for Cyber Cortex AV boards USB: usbfs: don't leak kernel data in siginfo USB: serial: cp210x: Adding Seletek device id's KVM: MIPS: Fix trace event to save PC directly KVM: emulate: fix CMPXCHG8B on 32-bit hosts Btrfs:__add_inode_ref: out of bounds memory read when looking for extended ref. Btrfs: fix data loss in the fast fsync path btrfs: fix lost return value due to variable shadowing iio: imu: adis16400: Fix sign extension x86/asm/entry/64: Remove a bogus 'ret_from_fork' optimization PM / QoS: remove duplicate call to pm_qos_update_target target: Check for LBA + sectors wrap-around in sbc_parse_cdb mm/memory.c: actually remap enough memory mm/compaction: fix wrong order check in compact_finished() mm/nommu.c: fix arithmetic overflow in __vm_enough_memory() mm/mmap.c: fix arithmetic overflow in __vm_enough_memory() mm/hugetlb: add migration entry check in __unmap_hugepage_range team: don't traverse port list using rcu in team_set_mac_address udp: only allow UFO for packets from SOCK_DGRAM sockets usb: plusb: Add support for National Instruments host-to-host cable macvtap: make sure neighbour code can push ethernet header net: compat: Ignore MSG_CMSG_COMPAT in compat_sys_{send, recv}msg team: fix possible null pointer dereference in team_handle_frame net: reject creation of netdev names with colons ematch: Fix auto-loading of ematch modules. net: phy: Fix verification of EEE support in phy_init_eee ipv4: ip_check_defrag should not assume that skb_network_offset is zero ipv4: ip_check_defrag should correctly check return value of skb_copy_bits gen_stats.c: Duplicate xstats buffer for later use rtnetlink: call ->dellink on failure when ->newlink exists ipv6: fix ipv6_cow_metrics for non DST_HOST case rtnetlink: ifla_vf_policy: fix misuses of NLA_BINARY Linux 3.10.71 libceph: fix double __remove_osd() problem libceph: change from BUG to WARN for __remove_osd() asserts libceph: assert both regular and lingering lists in __remove_osd() MIPS: Export FP functions used by lose_fpu(1) for KVM x86, mm/ASLR: Fix stack randomization on 64-bit systems blk-throttle: check stats_cpu before reading it from sysfs jffs2: fix handling of corrupted summary length md/raid1: fix read balance when a drive is write-mostly. md/raid5: Fix livelock when array is both resyncing and degraded. metag: Fix KSTK_EIP() and KSTK_ESP() macros gpio: tps65912: fix wrong container_of arguments arm64: compat Fix siginfo_t -> compat_siginfo_t conversion on big endian hx4700: regulator: declare full constraints KVM: x86: update masterclock values on TSC writes KVM: MIPS: Don't leak FPU/DSP to guest ARC: fix page address calculation if PAGE_OFFSET != LINUX_LINK_BASE ntp: Fixup adjtimex freq validation on 32-bit systems kdb: fix incorrect counts in KDB summary command output ARM: pxa: add regulator_has_full_constraints to poodle board file ARM: pxa: add regulator_has_full_constraints to corgi board file vt: provide notifications on selection changes usb: core: buffer: smallest buffer should start at ARCH_DMA_MINALIGN USB: fix use-after-free bug in usb_hcd_unlink_urb() USB: cp210x: add ID for RUGGEDCOM USB Serial Console tty: Prevent untrappable signals from malicious program axonram: Fix bug in direct_access cfq-iosched: fix incorrect filing of rt async cfqq cfq-iosched: handle failure of cfq group allocation iscsi-target: Drop problematic active_ts_list usage NFSv4.1: Fix a kfree() of uninitialised pointers in decode_cb_sequence_args Added Little Endian support to vtpm module tpm/tpm_i2c_stm_st33: Fix potential bug in tpm_stm_i2c_send tpm: Fix NULL return in tpm_ibmvtpm_get_desired_dma tpm_tis: verify interrupt during init ARM: 8284/1: sa1100: clear RCSR_SMR on resume tracing: Fix unmapping loop in tracing_mark_write MIPS: KVM: Deliver guest interrupts after local_irq_disable() nfs: don't call blocking operations while !TASK_RUNNING mmc: sdhci-pxav3: fix setting of pdata->clk_delay_cycles power_supply: 88pm860x: Fix leaked power supply on probe fail ALSA: hdspm - Constrain periods to 2 on older cards ALSA: off by one bug in snd_riptide_joystick_probe() lmedm04: Fix usb_submit_urb BOGUS urb xfer, pipe 1 != type 3 in interrupt urb cpufreq: speedstep-smi: enable interrupts when waiting PCI: Fix infinite loop with ROM image of size 0 PCI: Generate uppercase hex for modalias var in uevent HID: i2c-hid: Limit reads to wMaxInputLength bytes for input events iwlwifi: mvm: always use mac color zero iwlwifi: mvm: fix failure path when power_update fails in add_interface iwlwifi: mvm: validate tid and sta_id in ba_notif iwlwifi: pcie: disable the SCD_BASE_ADDR when we resume from WoWLAN fsnotify: fix handling of renames in audit xfs: set superblock buffer type correctly xfs: inode unlink does not set AGI buffer type xfs: ensure buffer types are set correctly Bluetooth: ath3k: workaround the compatibility issue with xHCI controller Linux 3.10.70 rbd: drop an unsafe assertion media/rc: Send sync space information on the lirc device net: sctp: fix passing wrong parameter header to param_type2af in sctp_process_param ppp: deflate: never return len larger than output buffer ipv4: tcp: get rid of ugly unicast_sock tcp: ipv4: initialize unicast_sock sk_pacing_rate bridge: dont send notification when skb->len == 0 in rtnl_bridge_notify ipv6: replacing a rt6_info needs to purge possible propagated rt6_infos too ping: Fix race in free in receive path udp_diag: Fix socket skipping within chain ipv4: try to cache dst_entries which would cause a redirect net: sctp: fix slab corruption from use after free on INIT collisions netxen: fix netxen_nic_poll() logic ipv6: stop sending PTB packets for MTU < 1280 net: rps: fix cpu unplug ip: zero sockaddr returned on error queue Linux 3.10.69 crypto: crc32c - add missing crypto module alias x86,kvm,vmx: Preserve CR4 across VM entry kvm: vmx: handle invvpid vm exit gracefully smpboot: Add missing get_online_cpus() in smpboot_register_percpu_thread() ALSA: ak411x: Fix stall in work callback ASoC: sgtl5000: add delay before first I2C access ASoC: atmel_ssc_dai: fix start event for I2S mode lib/checksum.c: fix build for generic csum_tcpudp_nofold ext4: prevent bugon on race between write/fcntl arm64: Fix up /proc/cpuinfo nilfs2: fix deadlock of segment constructor over I_SYNC flag lib/checksum.c: fix carry in csum_tcpudp_nofold mm: pagewalk: call pte_hole() for VM_PFNMAP during walk_page_range MIPS: Fix kernel lockup or crash after CPU offline/online MIPS: IRQ: Fix disable_irq on CPU IRQs PCI: Add NEC variants to Stratus ftServer PCIe DMI check gpio: sysfs: fix memory leak in gpiod_sysfs_set_active_low gpio: sysfs: fix memory leak in gpiod_export_link Linux 3.10.68 target: Drop arbitrary maximum I/O size limit iser-target: Fix implicit termination of connections iser-target: Handle ADDR_CHANGE event for listener cm_id iser-target: Fix connected_handler + teardown flow race iser-target: Parallelize CM connection establishment iser-target: Fix flush + disconnect completion handling iscsi,iser-target: Initiate termination only once vhost-scsi: Add missing virtio-scsi -> TCM attribute conversion tcm_loop: Fix wrong I_T nexus association vhost-scsi: Take configfs group dependency during VHOST_SCSI_SET_ENDPOINT ib_isert: Add max_send_sge=2 minimum for control PDU responses IB/isert: Adjust CQ size to HW limits workqueue: fix subtle pool management issue which can stall whole worker_pool gpio: squelch a compiler warning efi-pstore: Make efi-pstore return a unique id pstore/ram: avoid atomic accesses for ioremapped regions pstore: Fix NULL pointer fault if get NULL prz in ramoops_get_next_prz pstore: skip zero size persistent ram buffer in traverse pstore: clarify clearing of _read_cnt in ramoops_context pstore: d_alloc_name() doesn't return an ERR_PTR pstore: Fail to unlink if a driver has not defined pstore_erase ARM: 8109/1: mm: Modify pte_write and pmd_write logic for LPAE ARM: 8108/1: mm: Introduce {pte,pmd}_isset and {pte,pmd}_isclear ARM: DMA: ensure that old section mappings are flushed from the TLB ARM: 7931/1: Correct virt_addr_valid ARM: fix asm/memory.h build error ARM: 7867/1: include: asm: use 'int' instead of 'unsigned long' for 'oldval' in atomic_cmpxchg(). ARM: 7866/1: include: asm: use 'long long' instead of 'u64' within atomic.h ARM: lpae: fix definition of PTE_HWTABLE_PTRS ARM: fix type of PHYS_PFN_OFFSET to unsigned long ARM: LPAE: use phys_addr_t in alloc_init_pud() ARM: LPAE: use signed arithmetic for mask definitions ARM: mm: correct pte_same behaviour for LPAE. ARM: 7829/1: Add ".text.unlikely" and ".text.hot" to arm unwind tables drivers: net: cpsw: discard dual emac default vlan configuration regulator: core: fix race condition in regulator_put() spi/pxa2xx: Clear cur_chip pointer before starting next message dm cache: fix missing ERR_PTR returns and handling dm thin: don't allow messages to be sent to a pool target in READ_ONLY or FAIL mode nl80211: fix per-station group key get/del and memory leak NFSv4.1: Fix an Oops in nfs41_walk_client_list nfs: fix dio deadlock when O_DIRECT flag is flipped Input: i8042 - add noloop quirk for Medion Akoya E7225 (MD98857) ALSA: seq-dummy: remove deadlock-causing events on close powerpc/xmon: Fix another endiannes issue in RTAS call from xmon can: kvaser_usb: Fix state handling upon BUS_ERROR events can: kvaser_usb: Retry the first bulk transfer on -ETIMEDOUT can: kvaser_usb: Send correct context to URB completion can: kvaser_usb: Do not sleep in atomic context ASoC: wm8960: Fix capture sample rate from 11250 to 11025 spi: dw-mid: fix FIFO size Linux 3.10.67 md/raid5: fetch_block must fetch all the blocks handle_stripe_dirtying wants. ext4: fix warning in ext4_da_update_reserve_space() quota: provide interface for readding allocated space into reserved space crypto: add missing crypto module aliases crypto: include crypto- module prefix in template crypto: prefix module autoloading with "crypto-" drbd: merge_bvec_fn: properly remap bvm->bi_bdev Revert "swiotlb-xen: pass dev_addr to swiotlb_tbl_unmap_single" ipvs: uninitialized data with IP_VS_IPV6 KEYS: close race between key lookup and freeing sata_dwc_460ex: fix resource leak on error path x86/asm/traps: Disable tracing and kprobes in fixup_bad_iret and sync_regs x86, tls: Interpret an all-zero struct user_desc as "no segment" x86, tls, ldt: Stop checking lm in LDT_empty x86/tsc: Change Fast TSC calibration failed from error to info x86, hyperv: Mark the Hyper-V clocksource as being continuous clocksource: exynos_mct: Fix bitmask regression for exynos4_mct_write can: dev: fix crtlmode_supported check bus: mvebu-mbus: fix support of MBus window 13 ARM: dts: imx25: Fix PWM "per" clocks time: adjtimex: Validate the ADJ_FREQUENCY values time: settimeofday: Validate the values of tv from user dm cache: share cache-metadata object across inactive and active DM tables ipr: wait for aborted command responses drm/i915: Fix mutex->owner inspection race under DEBUG_MUTEXES scripts/recordmcount.pl: There is no -m32 gcc option on Super-H anymore ALSA: usb-audio: Add mic volume fix quirk for Logitech Webcam C210 libata: prevent HSM state change race between ISR and PIO pinctrl: Fix two deadlocks gpio: sysfs: fix gpio device-attribute leak gpio: sysfs: fix gpio-chip device-attribute leak Linux 3.10.66 s390/3215: fix tty output containing tabs s390/3215: fix hanging console issue fsnotify: next_i is freed during fsnotify_unmount_inodes. netfilter: ipset: small potential read beyond the end of buffer mmc: sdhci: Fix sleep in atomic after inserting SD card LOCKD: Fix a race when initialising nlmsvc_timeout x86, um: actually mark system call tables readonly um: Skip futex_atomic_cmpxchg_inatomic() test decompress_bunzip2: off by one in get_next_block() ARM: shmobile: sh73a0 legacy: Set .control_parent for all irqpin instances ARM: omap5/dra7xx: Fix frequency typos ARM: clk-imx6q: fix video divider for rev T0 1.0 ARM: imx6q: drop unnecessary semicolon ARM: dts: imx25: Fix the SPI1 clocks Input: I8042 - add Acer Aspire 7738 to the nomux list Input: i8042 - reset keyboard to fix Elantech touchpad detection can: kvaser_usb: Don't send a RESET_CHIP for non-existing channels can: kvaser_usb: Reset all URB tx contexts upon channel close can: kvaser_usb: Don't free packets when tight on URBs USB: keyspan: fix null-deref at probe USB: cp210x: add IDs for CEL USB sticks and MeshWorks devices USB: cp210x: fix ID for production CEL MeshConnect USB Stick usb: dwc3: gadget: Stop TRB preparation after limit is reached usb: dwc3: gadget: Fix TRB preparation during SG OHCI: add a quirk for ULi M5237 blocking on reset gpiolib: of: Correct error handling in of_get_named_gpiod_flags NFSv4.1: Fix client id trunking on Linux ftrace/jprobes/x86: Fix conflict between jprobes and function graph tracing vfio-pci: Fix the check on pci device type in vfio_pci_probe() uvcvideo: Fix destruction order in uvc_delete() smiapp: Take mutex during PLL update in sensor initialisation af9005: fix kernel panic on init if compiled without IR smiapp-pll: Correct clock debug prints video/logo: prevent use of logos after they have been freed storvsc: ring buffer failures may result in I/O freeze iscsi-target: Fail connection on short sendmsg writes hp_accel: Add support for HP ZBook 15 cfg80211: Fix 160 MHz channels with 80+80 and 160 MHz drivers ARC: [nsimosci] move peripherals to match model to FPGA drm/i915: Force the CS stall for invalidate flushes drm/i915: Invalidate media caches on gen7 drm/radeon: properly filter DP1.2 4k modes on non-DP1.2 hw drm/radeon: check the right ring in radeon_evict_flags() drm/vmwgfx: Fix fence event code enic: fix rx skb checksum alx: fix alx_poll() tcp: Do not apply TSO segment limit to non-TSO packets tg3: tg3_disable_ints using uninitialized mailbox value to disable interrupts netlink: Don't reorder loads/stores before marking mmap netlink frame as available netlink: Always copy on mmap TX. Linux 3.10.65 mm: Don't count the stack guard page towards RLIMIT_STACK mm: propagate error from stack expansion even for guard page mm, vmscan: prevent kswapd livelock due to pfmemalloc-throttled process being killed perf session: Do not fail on processing out of order event perf: Fix events installation during moving group perf/x86/intel/uncore: Make sure only uncore events are collected Btrfs: don't delay inode ref updates during log replay ARM: mvebu: disable I/O coherency on non-SMP situations on Armada 370/375/38x/XP scripts/kernel-doc: don't eat struct members with __aligned nilfs2: fix the nilfs_iget() vs. nilfs_new_inode() races nfsd4: fix xdr4 inclusion of escaped char fs: nfsd: Fix signedness bug in compare_blob serial: samsung: wait for transfer completion before clock disable writeback: fix a subtle race condition in I_DIRTY clearing cdc-acm: memory leak in error case genhd: check for int overflow in disk_expand_part_tbl() USB: cdc-acm: check for valid interfaces ALSA: hda - Fix wrong gpio_dir & gpio_mask hint setups for IDT/STAC codecs ALSA: hda - using uninitialized data ALSA: usb-audio: extend KEF X300A FU 10 tweak to Arcam rPAC driver core: Fix unbalanced device reference in drivers_probe x86, vdso: Use asm volatile in __getcpu x86_64, vdso: Fix the vdso address randomization algorithm HID: Add a new id 0x501a for Genius MousePen i608X HID: add battery quirk for USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO keyboard HID: roccat: potential out of bounds in pyra_sysfs_write_settings() HID: i2c-hid: prevent buffer overflow in early IRQ HID: i2c-hid: fix race condition reading reports iommu/vt-d: Fix an off-by-one bug in __domain_mapping() UBI: Fix double free after do_sync_erase() UBI: Fix invalid vfree() pstore-ram: Allow optional mapping with pgprot_noncached pstore-ram: Fix hangs by using write-combine mappings PCI: Restore detection of read-only BARs ASoC: dwc: Ensure FIFOs are flushed to prevent channel swap ASoC: max98090: Fix ill-defined sidetone route ASoC: sigmadsp: Refuse to load firmware files with a non-supported version ath5k: fix hardware queue index assignment swiotlb-xen: pass dev_addr to swiotlb_tbl_unmap_single can: peak_usb: fix memset() usage can: peak_usb: fix cleanup sequence order in case of error during init ath9k: fix BE/BK queue order ath9k_hw: fix hardware queue allocation ocfs2: fix journal commit deadlock Linux 3.10.64 Btrfs: fix fs corruption on transaction abort if device supports discard Btrfs: do not move em to modified list when unpinning eCryptfs: Remove buggy and unnecessary write in file name decode routine eCryptfs: Force RO mount when encrypted view is enabled udf: Verify symlink size before loading it exit: pidns: alloc_pid() leaks pid_namespace if child_reaper is exiting ncpfs: return proper error from NCP_IOC_SETROOT ioctl crypto: af_alg - fix backlog handling userns: Unbreak the unprivileged remount tests userns: Allow setting gid_maps without privilege when setgroups is disabled userns: Add a knob to disable setgroups on a per user namespace basis userns: Rename id_map_mutex to userns_state_mutex userns: Only allow the creator of the userns unprivileged mappings userns: Check euid no fsuid when establishing an unprivileged uid mapping userns: Don't allow unprivileged creation of gid mappings userns: Don't allow setgroups until a gid mapping has been setablished userns: Document what the invariant required for safe unprivileged mappings. groups: Consolidate the setgroups permission checks umount: Disallow unprivileged mount force mnt: Update unprivileged remount test mnt: Implicitly add MNT_NODEV on remount when it was implicitly added by mount mac80211: free management frame keys when removing station mac80211: fix multicast LED blinking and counter KEYS: Fix stale key registration at error path isofs: Fix unchecked printing of ER records x86/tls: Don't validate lm in set_thread_area() after all dm space map metadata: fix sm_bootstrap_get_nr_blocks() dm bufio: fix memleak when using a dm_buffer's inline bio nfs41: fix nfs4_proc_layoutget error handling megaraid_sas: corrected return of wait_event from abort frame path mmc: block: add newline to sysfs display of force_ro mfd: tc6393xb: Fail ohci suspend if full state restore is required md/bitmap: always wait for writes on unplug. x86, kvm: Clear paravirt_enabled on KVM guests for espfix32's benefit x86_64, switch_to(): Load TLS descriptors before switching DS and ES x86/tls: Disallow unusual TLS segments x86/tls: Validate TLS entries to protect espfix isofs: Fix infinite looping over CE entries Linux 3.10.63 ALSA: usb-audio: Don't resubmit pending URBs at MIDI error recovery powerpc: 32 bit getcpu VDSO function uses 64 bit instructions ARM: sched_clock: Load cycle count after epoch stabilizes igb: bring link up when PHY is powered up ext2: Fix oops in ext2_get_block() called from ext2_quota_write() nEPT: Nested INVEPT net: sctp: use MAX_HEADER for headroom reserve in output path net: mvneta: fix Tx interrupt delay rtnetlink: release net refcnt on error in do_setlink() net/mlx4_core: Limit count field to 24 bits in qp_alloc_res tg3: fix ring init when there are more TX than RX channels ipv6: gre: fix wrong skb->protocol in WCCP sata_fsl: fix error handling of irq_of_parse_and_map ahci: disable MSI on SAMSUNG 0xa800 SSD AHCI: Add DeviceIDs for Sunrise Point-LP SATA controller media: smiapp: Only some selection targets are settable drm/i915: Unlock panel even when LVDS is disabled drm/radeon: kernel panic in drm_calc_vbltimestamp_from_scanoutpos with 3.18.0-rc6 i2c: davinci: generate STP always when NACK is received i2c: omap: fix i207 errata handling i2c: omap: fix NACK and Arbitration Lost irq handling xen-netfront: Remove BUGs on paged skb data which crosses a page boundary mm: fix swapoff hang after page migration and fork mm: frontswap: invalidate expired data on a dup-store failure Linux 3.10.62 nfsd: Fix ACL null pointer deref powerpc/powernv: Honor the generic "no_64bit_msi" flag bnx2fc: do not add shared skbs to the fcoe_rx_list nfsd4: fix leak of inode reference on delegation failure nfsd: Fix slot wake up race in the nfsv4.1 callback code rt2x00: do not align payload on modern H/W can: dev: avoid calling kfree_skb() from interrupt context spi: dw: Fix dynamic speed change. iser-target: Handle DEVICE_REMOVAL event on network portal listener correctly target: Don't call TFO->write_pending if data_length == 0 srp-target: Retry when QP creation fails with ENOMEM Input: xpad - use proper endpoint type ARM: 8222/1: mvebu: enable strex backoff delay ARM: 8216/1: xscale: correct auxiliary register in suspend/resume ALSA: usb-audio: Add ctrl message delay quirk for Marantz/Denon devices can: esd_usb2: fix memory leak on disconnect USB: xhci: don't start a halted endpoint before its new dequeue is set usb-quirks: Add reset-resume quirk for MS Wireless Laser Mouse 6000 usb: serial: ftdi_sio: add PIDs for Matrix Orbital products USB: serial: cp210x: add IDs for CEL MeshConnect USB Stick USB: keyspan: fix tty line-status reporting USB: keyspan: fix overrun-error reporting USB: ssu100: fix overrun-error reporting iio: Fix IIO_EVENT_CODE_EXTRACT_DIR bit mask powerpc/pseries: Fix endiannes issue in RTAS call from xmon powerpc/pseries: Honor the generic "no_64bit_msi" flag of/base: Fix PowerPC address parsing hack ASoC: wm_adsp: Avoid attempt to free buffers that might still be in use ASoC: sgtl5000: Fix SMALL_POP bit definition PCI/MSI: Add device flag indicating that 64-bit MSIs don't work ipx: fix locking regression in ipx_sendmsg and ipx_recvmsg pptp: fix stack info leak in pptp_getname() qmi_wwan: Add support for HP lt4112 LTE/HSPA+ Gobi 4G Modem ieee802154: fix error handling in ieee802154fake_probe() ipv4: Fix incorrect error code when adding an unreachable route inetdevice: fixed signed integer overflow sparc64: Fix constraints on swab helpers. uprobes, x86: Fix _TIF_UPROBE vs _TIF_NOTIFY_RESUME x86, mm: Set NX across entire PMD at boot x86: Require exact match for 'noxsave' command line option x86_64, traps: Rework bad_iret x86_64, traps: Stop using IST for #SS x86_64, traps: Fix the espfix64 #DF fixup and rewrite it in C MIPS: Loongson: Make platform serial setup always built-in. MIPS: oprofile: Fix backtrace on 64-bit kernel Linux 3.10.61 mm: memcg: handle non-error OOM situations more gracefully mm: memcg: do not trap chargers with full callstack on OOM mm: memcg: rework and document OOM waiting and wakeup mm: memcg: enable memcg OOM killer only for user faults x86: finish user fault error path with fatal signal arch: mm: pass userspace fault flag to generic fault handler arch: mm: do not invoke OOM killer on kernel fault OOM arch: mm: remove obsolete init OOM protection mm: invoke oom-killer from remaining unconverted page fault handlers net: sctp: fix skb_over_panic when receiving malformed ASCONF chunks net: sctp: fix panic on duplicate ASCONF chunks net: sctp: fix remote memory pressure from excessive queueing KVM: x86: Don't report guest userspace emulation error to userspace SCSI: hpsa: fix a race in cmd_free/scsi_done net/mlx4_en: Fix BlueFlame race ARM: Correct BUG() assembly to ensure it is endian-agnostic perf/x86/intel: Use proper dTLB-load-misses event on IvyBridge mei: bus: fix possible boundaries violation perf: Handle compat ioctl MIPS: Fix forgotten preempt_enable() when CPU has inclusive pcaches dell-wmi: Fix access out of memory ARM: probes: fix instruction fetch order with <asm/opcodes.h> br: fix use of ->rx_handler_data in code executed on non-rx_handler path netfilter: nf_nat: fix oops on netns removal netfilter: xt_bpf: add mising opaque struct sk_filter definition netfilter: nf_log: release skbuff on nlmsg put failure netfilter: nfnetlink_log: fix maximum packet length logged to userspace netfilter: nf_log: account for size of NLMSG_DONE attribute ipc: always handle a new value of auto_msgmni clocksource: Remove "weak" from clocksource_default_clock() declaration kgdb: Remove "weak" from kgdb_arch_pc() declaration media: ttusb-dec: buffer overflow in ioctl NFSv4: Fix races between nfs_remove_bad_delegation() and delegation return nfs: Fix use of uninitialized variable in nfs_getattr() NFS: Don't try to reclaim delegation open state if recovery failed NFSv4: Ensure that we remove NFSv4.0 delegations when state has expired Input: alps - allow up to 2 invalid packets without resetting device Input: alps - ignore potential bare packets when device is out of sync dm raid: ensure superblock's size matches device's logical block size dm btree: fix a recursion depth bug in btree walking code block: Fix computation of merged request priority parisc: Use compat layer for msgctl, shmat, shmctl and semtimedop syscalls scsi: only re-lock door after EH on devices that were reset nfs: fix pnfs direct write memory leak firewire: cdev: prevent kernel stack leaking into ioctl arguments arm64: __clear_user: handle exceptions on strb ARM: 8198/1: make kuser helpers depend on MMU drm/radeon: add missing crtc unlock when setting up the MC mac80211: fix use-after-free in defragmentation macvtap: Fix csum_start when VLAN tags are present iwlwifi: configure the LTR libceph: do not crash on large auth tickets xtensa: re-wire umount syscall to sys_oldumount ALSA: usb-audio: Fix memory leak in FTU quirk ahci: disable MSI instead of NCQ on Samsung pci-e SSDs on macbooks ahci: Add Device IDs for Intel Sunrise Point PCH audit: keep inode pinned x86, x32, audit: Fix x32's AUDIT_ARCH wrt audit sparc32: Implement xchg and atomic_xchg using ATOMIC_HASH locks sparc64: Do irq_{enter,exit}() around generic_smp_call_function*(). sparc64: Fix crashes in schizo_pcierr_intr_other(). sunvdc: don't call VD_OP_GET_VTOC vio: fix reuse of vio_dring slot sunvdc: limit each sg segment to a page sunvdc: compute vdisk geometry from capacity sunvdc: add cdrom and v1.1 protocol support net: sctp: fix memory leak in auth key management net: sctp: fix NULL pointer dereference in af->from_addr_param on malformed packet gre6: Move the setting of dev->iflink into the ndo_init functions. ip6_tunnel: Use ip6_tnl_dev_init as the ndo_init function. Linux 3.10.60 libceph: ceph-msgr workqueue needs a resque worker Btrfs: fix kfree on list_head in btrfs_lookup_csums_range error cleanup of: Fix overflow bug in string property parsing functions sysfs: driver core: Fix glue dir race condition by gdp_mutex i2c: at91: don't account as iowait acer-wmi: Add acpi_backlight=video quirk for the Acer KAV80 rbd: Fix error recovery in rbd_obj_read_sync() drm/radeon: remove invalid pci id usb: gadget: udc: core: fix kernel oops with soft-connect usb: gadget: function: acm: make f_acm pass USB20CV Chapter9 usb: dwc3: gadget: fix set_halt() bug with pending transfers crypto: algif - avoid excessive use of socket buffer in skcipher mm: Remove false WARN_ON from pagecache_isize_extended() x86, apic: Handle a bad TSC more gracefully posix-timers: Fix stack info leak in timer_create() mac80211: fix typo in starting baserate for rts_cts_rate_idx PM / Sleep: fix recovery during resuming from hibernation tty: Fix high cpu load if tty is unreleaseable quota: Properly return errors from dquot_writeback_dquots() ext3: Don't check quota format when there are no quota files nfsd4: fix crash on unknown operation number cpc925_edac: Report UE events properly e7xxx_edac: Report CE events properly i3200_edac: Report CE events properly i82860_edac: Report CE events properly scsi: Fix error handling in SCSI_IOCTL_SEND_COMMAND lib/bitmap.c: fix undefined shift in __bitmap_shift_{left|right}() cgroup/kmemleak: add kmemleak_free() for cgroup deallocations. usb: Do not allow usb_alloc_streams on unconfigured devices USB: opticon: fix non-atomic allocation in write path usb-storage: handle a skipped data phase spi: pxa2xx: toggle clocks on suspend if not disabled by runtime PM spi: pl022: Fix incorrect dma_unmap_sg usb: dwc3: gadget: Properly initialize LINK TRB wireless: rt2x00: add new rt2800usb device USB: option: add Haier CE81B CDMA modem usb: option: add support for Telit LE910 USB: cdc-acm: only raise DTR on transitions from B0 USB: cdc-acm: add device id for GW Instek AFG-2225 usb: serial: ftdi_sio: add "bricked" FTDI device PID usb: serial: ftdi_sio: add Awinda Station and Dongle products USB: serial: cp210x: add Silicon Labs 358x VID and PID serial: Fix divide-by-zero fault in uart_get_divisor() staging:iio:ade7758: Remove "raw" from channel name staging:iio:ade7758: Fix check if channels are enabled in prenable staging:iio:ade7758: Fix NULL pointer deref when enabling buffer staging:iio:ad5933: Drop "raw" from channel names staging:iio:ad5933: Fix NULL pointer deref when enabling buffer OOM, PM: OOM killed task shouldn't escape PM suspend freezer: Do not freeze tasks killed by OOM killer ext4: fix oops when loading block bitmap failed cpufreq: intel_pstate: Fix setting max_perf_pct in performance policy ext4: fix overflow when updating superblock backups after resize ext4: check s_chksum_driver when looking for bg csum presence ext4: fix reservation overflow in ext4_da_write_begin ext4: add ext4_iget_normal() which is to be used for dir tree lookups ext4: grab missed write_count for EXT4_IOC_SWAP_BOOT ext4: don't check quota format when there are no quota files ext4: check EA value offset when loading jbd2: free bh when descriptor block checksum fails MIPS: tlbex: Properly fix HUGE TLB Refill exception handler target: Fix APTPL metadata handling for dynamic MappedLUNs target: Fix queue full status NULL pointer for SCF_TRANSPORT_TASK_SENSE qla_target: don't delete changed nacls ARC: Update order of registers in KGDB to match GDB 7.5 ARC: [nsimosci] Allow "headless" models to boot KVM: x86: Emulator fixes for eip canonical checks on near branches KVM: x86: Fix wrong masking on relative jump/call kvm: x86: don't kill guest on unknown exit reason KVM: x86: Check non-canonical addresses upon WRMSR KVM: x86: Improve thread safety in pit KVM: x86: Prevent host from panicking on shared MSR writes. kvm: fix excessive pages un-pinning in kvm_iommu_map error path. media: tda7432: Fix setting TDA7432_MUTE bit for TDA7432_RF register media: ds3000: fix LNB supply voltage on Tevii S480 on initialization media: em28xx-v4l: give back all active video buffers to the vb2 core properly on streaming stop media: v4l2-common: fix overflow in v4l_bound_align_image() drm/nouveau/bios: memset dcb struct to zero before parsing drm/tilcdc: Fix the error path in tilcdc_load() drm/ast: Fix HW cursor image Input: i8042 - quirks for Fujitsu Lifebook A544 and Lifebook AH544 Input: i8042 - add noloop quirk for Asus X750LN framebuffer: fix border color modules, lock around setting of MODULE_STATE_UNFORMED dm log userspace: fix memory leak in dm_ulog_tfr_init failure path block: fix alignment_offset math that assumes io_min is a power-of-2 drbd: compute the end before rb_insert_augmented() dm bufio: update last_accessed when relinking a buffer virtio_pci: fix virtio spec compliance on restore selinux: fix inode security list corruption pstore: Fix duplicate {console,ftrace}-efi entries mfd: rtsx_pcr: Fix MSI enable error handling mnt: Prevent pivot_root from creating a loop in the mount tree UBI: add missing kmem_cache_free() in process_pool_aeb error path random: add and use memzero_explicit() for clearing data crypto: more robust crypto_memneq fix misuses of f_count() in ppp and netlink kill wbuf_queued/wbuf_dwork_lock ALSA: pcm: Zero-clear reserved fields of PCM status ioctl in compat mode evm: check xattr value length and type in evm_inode_setxattr() x86, pageattr: Prevent overflow in slow_virt_to_phys() for X86_PAE x86_64, entry: Fix out of bounds read on sysenter x86_64, entry: Filter RFLAGS.NT on entry from userspace x86, flags: Rename X86_EFLAGS_BIT1 to X86_EFLAGS_FIXED x86, fpu: shift drop_init_fpu() from save_xstate_sig() to handle_signal() x86, fpu: __restore_xstate_sig()->math_state_restore() needs preempt_disable() x86: Reject x32 executables if x32 ABI not supported vfs: fix data corruption when blocksize < pagesize for mmaped data UBIFS: fix free log space calculation UBIFS: fix a race condition UBIFS: remove mst_mutex fs: Fix theoretical division by 0 in super_cache_scan(). fs: make cont_expand_zero interruptible mmc: rtsx_pci_sdmmc: fix incorrect last byte in R2 response libata-sff: Fix controllers with no ctl port pata_serverworks: disable 64-KB DMA transfers on Broadcom OSB4 IDE Controller Revert "percpu: free percpu allocation info for uniprocessor system" lockd: Try to reconnect if statd has moved drivers/net: macvtap and tun depend on INET ipv4: dst_entry leak in ip_send_unicast_reply() ax88179_178a: fix bonding failure ipv4: fix nexthop attlen check in fib_nh_match tracing/syscalls: Ignore numbers outside NR_syscalls' range Linux 3.10.59 ecryptfs: avoid to access NULL pointer when write metadata in xattr ARM: at91/PMC: don't forget to write PMC_PCDR register to disable clocks ALSA: usb-audio: Add support for Steinberg UR22 USB interface ALSA: emu10k1: Fix deadlock in synth voice lookup ALSA: pcm: use the same dma mmap codepath both for arm and arm64 arm64: compat: fix compat types affecting struct compat_elf_prpsinfo spi: dw-mid: terminate ongoing transfers at exit kernel: add support for gcc 5 fanotify: enable close-on-exec on events' fd when requested in fanotify_init() mm: clear __GFP_FS when PF_MEMALLOC_NOIO is set Bluetooth: Fix issue with USB suspend in btusb driver Bluetooth: Fix HCI H5 corrupted ack value rt2800: correct BBP1_TX_POWER_CTRL mask PCI: Generate uppercase hex for modalias interface class PCI: Increase IBM ipr SAS Crocodile BARs to at least system page size iwlwifi: Add missing PCI IDs for the 7260 series NFSv4.1: Fix an NFSv4.1 state renewal regression NFSv4: fix open/lock state recovery error handling NFSv4: Fix lock recovery when CREATE_SESSION/SETCLIENTID_CONFIRM fails lzo: check for length overrun in variable length encoding. Revert "lzo: properly check for overruns" Documentation: lzo: document part of the encoding m68k: Disable/restore interrupts in hwreg_present()/hwreg_write() Drivers: hv: vmbus: Fix a bug in vmbus_open() Drivers: hv: vmbus: Cleanup vmbus_establish_gpadl() Drivers: hv: vmbus: Cleanup vmbus_teardown_gpadl() Drivers: hv: vmbus: Cleanup vmbus_post_msg() firmware_class: make sure fw requests contain a name qla2xxx: Use correct offset to req-q-out for reserve calculation mptfusion: enable no_write_same for vmware scsi disks be2iscsi: check ip buffer before copying regmap: fix NULL pointer dereference in _regmap_write/read regmap: debugfs: fix possbile NULL pointer dereference spi: dw-mid: check that DMA was inited before exit spi: dw-mid: respect 8 bit mode x86/intel/quark: Switch off CR4.PGE so TLB flush uses CR3 instead kvm: don't take vcpu mutex for obviously invalid vcpu ioctls KVM: s390: unintended fallthrough for external call kvm: x86: fix stale mmio cache bug fs: Add a missing permission check to do_umount Btrfs: fix race in WAIT_SYNC ioctl Btrfs: fix build_backref_tree issue with multiple shared blocks Btrfs: try not to ENOSPC on log replay Linux 3.10.58 USB: cp210x: add support for Seluxit USB dongle USB: serial: cp210x: added Ketra N1 wireless interface support USB: Add device quirk for ASUS T100 Base Station keyboard ipv6: reallocate addrconf router for ipv6 address when lo device up tcp: fixing TLP's FIN recovery sctp: handle association restarts when the socket is closed. ip6_gre: fix flowi6_proto value in xmit path hyperv: Fix a bug in netvsc_start_xmit() tg3: Allow for recieve of full-size 8021AD frames tg3: Work around HW/FW limitations with vlan encapsulated frames l2tp: fix race while getting PMTU on PPP pseudo-wire openvswitch: fix panic with multiple vlan headers packet: handle too big packets for PACKET_V3 tcp: fix tcp_release_cb() to dispatch via address family for mtu_reduced() sit: Fix ipip6_tunnel_lookup device matching criteria myri10ge: check for DMA mapping errors Linux 3.10.57 cpufreq: ondemand: Change the calculation of target frequency cpufreq: Fix wrong time unit conversion nl80211: clear skb cb before passing to netlink drbd: fix regression 'out of mem, failed to invoke fence-peer helper' jiffies: Fix timeval conversion to jiffies md/raid5: disable 'DISCARD' by default due to safety concerns. media: vb2: fix VBI/poll regression mm: numa: Do not mark PTEs pte_numa when splitting huge pages mm, thp: move invariant bug check out of loop in __split_huge_page_map ring-buffer: Fix infinite spin in reading buffer init/Kconfig: Fix HAVE_FUTEX_CMPXCHG to not break up the EXPERT menu perf: fix perf bug in fork() udf: Avoid infinite loop when processing indirect ICBs Linux 3.10.56 vm_is_stack: use for_each_thread() rather then buggy while_each_thread() oom_kill: add rcu_read_lock() into find_lock_task_mm() oom_kill: has_intersects_mems_allowed() needs rcu_read_lock() oom_kill: change oom_kill.c to use for_each_thread() introduce for_each_thread() to replace the buggy while_each_thread() kernel/fork.c:copy_process(): unify CLONE_THREAD-or-thread_group_leader code arm: multi_v7_defconfig: Enable Zynq UART driver ext2: Fix fs corruption in ext2_get_xip_mem() serial: 8250_dma: check the result of TX buffer mapping ARM: 7748/1: oabi: handle faults when loading swi instruction from userspace netfilter: nf_conntrack: avoid large timeout for mid-stream pickup PM / sleep: Use valid_state() for platform-dependent sleep states only PM / sleep: Add state field to pm_states[] entries ipvs: fix ipv6 hook registration for local replies ipvs: Maintain all DSCP and ECN bits for ipv6 tun forwarding ipvs: avoid netns exit crash on ip_vs_conn_drop_conntrack md/raid1: fix_read_error should act on all non-faulty devices. media: cx18: fix kernel oops with tda8290 tuner Fix nasty 32-bit overflow bug in buffer i/o code. perf kmem: Make it work again on non NUMA machines perf: Fix a race condition in perf_remove_from_context() alarmtimer: Lock k_itimer during timer callback alarmtimer: Do not signal SIGEV_NONE timers parisc: Only use -mfast-indirect-calls option for 32-bit kernel builds powerpc/perf: Fix ABIv2 kernel backtraces sched: Fix unreleased llc_shared_mask bit during CPU hotplug ocfs2/dlm: do not get resource spinlock if lockres is new nilfs2: fix data loss with mmap() fs/notify: don't show f_handle if exportfs_encode_inode_fh failed fsnotify/fdinfo: use named constants instead of hardcoded values kcmp: fix standard comparison bug Revert "mac80211: disable uAPSD if all ACs are under ACM" usb: dwc3: core: fix ordering for PHY suspend usb: dwc3: core: fix order of PM runtime calls usb: host: xhci: fix compliance mode workaround genhd: fix leftover might_sleep() in blk_free_devt() lockd: fix rpcbind crash on lockd startup failure rtlwifi: rtl8192cu: Add new ID percpu: perform tlb flush after pcpu_map_pages() failure percpu: fix pcpu_alloc_pages() failure path percpu: free percpu allocation info for uniprocessor system ata_piix: Add Device IDs for Intel 9 Series PCH Input: i8042 - add nomux quirk for Avatar AVIU-145A6 Input: i8042 - add Fujitsu U574 to no_timeout dmi table Input: atkbd - do not try 'deactivate' keyboard on any LG laptops Input: elantech - fix detection of touchpad on ASUS s301l Input: synaptics - add support for ForcePads Input: serport - add compat handling for SPIOCSTYPE ioctl dm crypt: fix access beyond the end of allocated space block: Fix dev_t minor allocation lifetime workqueue: apply __WQ_ORDERED to create_singlethread_workqueue() Revert "iwlwifi: dvm: don't enable CTS to self" SCSI: libiscsi: fix potential buffer overrun in __iscsi_conn_send_pdu NFC: microread: Potential overflows in microread_target_discovered() iscsi-target: Fix memory corruption in iscsit_logout_post_handler_diffcid iscsi-target: avoid NULL pointer in iscsi_copy_param_list failure Target/iser: Don't put isert_conn inside disconnected handler Target/iser: Get isert_conn reference once got to connected_handler iio:inkern: fix overwritten -EPROBE_DEFER in of_iio_channel_get_by_name iio:magnetometer: bugfix magnetometers gain values iio: adc: ad_sigma_delta: Fix indio_dev->trig assignment iio: st_sensors: Fix indio_dev->trig assignment iio: meter: ade7758: Fix indio_dev->trig assignment iio: inv_mpu6050: Fix indio_dev->trig assignment iio: gyro: itg3200: Fix indio_dev->trig assignment iio:trigger: modify return value for iio_trigger_get CIFS: Fix SMB2 readdir error handling CIFS: Fix directory rename error ASoC: davinci-mcasp: Correct rx format unit configuration shmem: fix nlink for rename overwrite directory x86 early_ioremap: Increase FIX_BTMAPS_SLOTS to 8 KVM: x86: handle idiv overflow at kvm_write_tsc regmap: Fix handling of volatile registers for format_write() chips ACPICA: Update to GPIO region handler interface. MIPS: mcount: Adjust stack pointer for static trace in MIPS32 MIPS: ZBOOT: add missing <linux/string.h> include ARM: 8165/1: alignment: don't break misaligned NEON load/store ARM: 7897/1: kexec: Use the right ISA for relocate_new_kernel ARM: 8133/1: use irq_set_affinity with force=false when migrating irqs ARM: 8128/1: abort: don't clear the exclusive monitors NFSv4: Fix another bug in the close/open_downgrade code NFSv4: nfs4_state_manager() vs. nfs_server_remove_lists() usb:hub set hub->change_bits when over-current happens usb: dwc3: omap: fix ordering for runtime pm calls USB: EHCI: unlink QHs even after the controller has stopped USB: storage: Add quirks for Entrega/Xircom USB to SCSI converters USB: storage: Add quirk for Ariston Technologies iConnect USB to SCSI adapter USB: storage: Add quirk for Adaptec USBConnect 2000 USB-to-SCSI Adapter storage: Add single-LUN quirk for Jaz USB Adapter usb: hub: take hub->hdev reference when processing from eventlist xhci: fix oops when xhci resumes from hibernate with hw lpm capable devices xhci: Fix null pointer dereference if xhci initialization fails USB: zte_ev: fix removed PIDs USB: ftdi_sio: add support for NOVITUS Bono E thermal printer USB: sierra: add 1199:68AA device ID USB: sierra: avoid CDC class functions on "68A3" devices USB: zte_ev: remove duplicate Qualcom PID USB: zte_ev: remove duplicate Gobi PID Revert "USB: option,zte_ev: move most ZTE CDMA devices to zte_ev" USB: option: add VIA Telecom CDS7 chipset device id USB: option: reduce interrupt-urb logging verbosity USB: serial: fix potential heap buffer overflow USB: sisusb: add device id for Magic Control USB video USB: serial: fix potential stack buffer overflow USB: serial: pl2303: add device id for ztek device xtensa: fix a6 and a7 handling in fast_syscall_xtensa xtensa: fix TLBTEMP_BASE_2 region handling in fast_second_level_miss xtensa: fix access to THREAD_RA/THREAD_SP/THREAD_DS xtensa: fix address checks in dma_{alloc,free}_coherent xtensa: replace IOCTL code definitions with constants drm/radeon: add connector quirk for fujitsu board drm/vmwgfx: Fix a potential infinite spin waiting for fifo idle drm/ast: AST2000 cannot be detected correctly drm/i915: Wait for vblank before enabling the TV encoder drm/i915: Remove bogus __init annotation from DMI callbacks HID: logitech-dj: prevent false errors to be shown HID: magicmouse: sanity check report size in raw_event() callback HID: picolcd: sanity check report size in raw_event() callback cfq-iosched: Fix wrong children_weight calculation ALSA: pcm: fix fifo_size frame calculation ALSA: hda - Fix invalid pin powermap without jack detection ALSA: hda - Fix COEF setups for ALC1150 codec ALSA: core: fix buffer overflow in snd_info_get_line() arm64: ptrace: fix compat hardware watchpoint reporting trace: Fix epoll hang when we race with new entries i2c: at91: Fix a race condition during signal handling in at91_do_twi_xfer. i2c: at91: add bound checking on SMBus block length bytes arm64: flush TLS registers during exec ibmveth: Fix endian issues with rx_no_buffer statistic ahci: add pcid for Marvel 0x9182 controller ahci: Add Device IDs for Intel 9 Series PCH pata_scc: propagate return value of scc_wait_after_reset drm/i915: read HEAD register back in init_ring_common() to enforce ordering drm/radeon: load the lm63 driver for an lm64 thermal chip. drm/ttm: Choose a pool to shrink correctly in ttm_dma_pool_shrink_scan(). drm/ttm: Fix possible division by 0 in ttm_dma_pool_shrink_scan(). drm/tilcdc: fix double kfree drm/tilcdc: fix release order on exit drm/tilcdc: panel: fix leak when unloading the module drm/tilcdc: tfp410: fix dangling sysfs connector node drm/tilcdc: slave: fix dangling sysfs connector node drm/tilcdc: panel: fix dangling sysfs connector node carl9170: fix sending URBs with wrong type when using full-speed Linux 3.10.55 libceph: gracefully handle large reply messages from the mon libceph: rename ceph_msg::front_max to front_alloc_len tpm: Provide a generic means to override the chip returned timeouts vfs: fix bad hashing of dentries dcache.c: get rid of pointless macros IB/srp: Fix deadlock between host removal and multipathd blkcg: don't call into policy draining if root_blkg is already gone mtd: nand: omap: Fix 1-bit Hamming code scheme, omap_calculate_ecc() mtd/ftl: fix the double free of the buffers allocated in build_maps() CIFS: Fix wrong restart readdir for SMB1 CIFS: Fix wrong filename length for SMB2 CIFS: Fix wrong directory attributes after rename CIFS: Possible null ptr deref in SMB2_tcon CIFS: Fix async reading on reconnects CIFS: Fix STATUS_CANNOT_DELETE error mapping for SMB2 libceph: do not hard code max auth ticket len libceph: add process_one_ticket() helper libceph: set last_piece in ceph_msg_data_pages_cursor_init() correctly md/raid1,raid10: always abort recover on write error. xfs: don't zero partial page cache pages during O_DIRECT writes xfs: don't zero partial page cache pages during O_DIRECT writes xfs: don't dirty buffers beyond EOF xfs: quotacheck leaves dquot buffers without verifiers RDMA/iwcm: Use a default listen backlog if needed md/raid10: Fix memory leak when raid10 reshape completes. md/raid10: fix memory leak when reshaping a RAID10. md/raid6: avoid data corruption during recovery of double-degraded RAID6 Bluetooth: Avoid use of session socket after the session gets freed Bluetooth: never linger on process exit mnt: Add tests for unprivileged remount cases that have found to be faulty mnt: Change the default remount atime from relatime to the existing value mnt: Correct permission checks in do_remount mnt: Move the test for MNT_LOCK_READONLY from change_mount_flags into do_remount mnt: Only change user settable mount flags in remount ring-buffer: Up rb_iter_peek() loop count to 3 ring-buffer: Always reset iterator to reader page ACPI / cpuidle: fix deadlock between cpuidle_lock and cpu_hotplug.lock ACPI: Run fixed event device notifications in process context ACPICA: Utilities: Fix memory leak in acpi_ut_copy_iobject_to_iobject bfa: Fix undefined bit shift on big-endian architectures with 32-bit DMA address ASoC: pxa-ssp: drop SNDRV_PCM_FMTBIT_S24_LE ASoC: max98090: Fix missing free_irq ASoC: samsung: Correct I2S DAI suspend/resume ops ASoC: wm_adsp: Add missing MODULE_LICENSE ASoC: pcm: fix dpcm_path_put in dpcm runtime update openrisc: Rework signal handling MIPS: Fix accessing to per-cpu data when flushing the cache MIPS: OCTEON: make get_system_type() thread-safe MIPS: asm: thread_info: Add _TIF_SECCOMP flag MIPS: Cleanup flags in syscall flags handlers. MIPS: asm/reg.h: Make 32- and 64-bit definitions available at the same time MIPS: Remove BUG_ON(!is_fpu_owner()) in do_ade() MIPS: tlbex: Fix a missing statement for HUGETLB MIPS: Prevent user from setting FCSR cause bits MIPS: GIC: Prevent array overrun drivers: scsi: storvsc: Correctly handle TEST_UNIT_READY failure Drivers: scsi: storvsc: Implement a eh_timed_out handler powerpc/pseries: Failure on removing device node powerpc/mm: Use read barrier when creating real_pte powerpc/mm/numa: Fix break placement regulator: arizona-ldo1: remove bypass functionality mfd: omap-usb-host: Fix improper mask use. kernel/smp.c:on_each_cpu_cond(): fix warning in fallback path CAPABILITIES: remove undefined caps from all processes tpm: missing tpm_chip_put in tpm_get_random() firmware: Do not use WARN_ON(!spin_is_locked()) spi: omap2-mcspi: Configure hardware when slave driver changes mode spi: orion: fix incorrect handling of cell-index DT property iommu/amd: Fix cleanup_domain for mass device removal media: media-device: Remove duplicated memset() in media_enum_entities() media: au0828: Only alt setting logic when needed media: xc4000: Fix get_frequency() media: xc5000: Fix get_frequency() Linux 3.10.54 USB: fix build error with CONFIG_PM_RUNTIME disabled NFSv4: Fix problems with close in the presence of a delegation NFSv3: Fix another acl regression svcrdma: Select NFSv4.1 backchannel transport based on forward channel NFSD: Decrease nfsd_users in nfsd_startup_generic fail usb: hub: Prevent hub autosuspend if usbcore.autosuspend is -1 USB: whiteheat: Added bounds checking for bulk command response USB: ftdi_sio: Added PID for new ekey device USB: ftdi_sio: add Basic Micro ATOM Nano USB2Serial PID ARM: OMAP2+: hwmod: Rearm wake-up interrupts for DT when MUSB is idled usb: xhci: amd chipset also needs short TX quirk xhci: Treat not finding the event_seg on COMP_STOP the same as COMP_STOP_INVAL Staging: speakup: Update __speakup_paste_selection() tty (ab)usage to match vt jbd2: fix infinite loop when recovering corrupt journal blocks mei: nfc: fix memory leak in error path mei: reset client state on queued connect request Btrfs: fix csum tree corruption, duplicate and outdated checksums hpsa: fix bad -ENOMEM return value in hpsa_big_passthru_ioctl x86/efi: Enforce CONFIG_RELOCATABLE for EFI boot stub x86_64/vsyscall: Fix warn_bad_vsyscall log output x86: don't exclude low BIOS area when allocating address space for non-PCI cards drm/radeon: add additional SI pci ids ext4: fix BUG_ON in mb_free_blocks() kvm: iommu: fix the third parameter of kvm_iommu_put_pages (CVE-2014-3601) Revert "KVM: x86: Increase the number of fixed MTRR regs to 10" KVM: nVMX: fix "acknowledge interrupt on exit" when APICv is in use KVM: x86: always exit on EOIs for interrupts listed in the IOAPIC redir table KVM: x86: Inter-privilege level ret emulation is not implemeneted crypto: ux500 - make interrupt mode plausible serial: core: Preserve termios c_cflag for console resume ext4: fix ext4_discard_allocated_blocks() if we can't allocate the pa struct drivers/i2c/busses: use correct type for dma_map/unmap hwmon: (dme1737) Prevent overflow problem when writing large limits hwmon: (ads1015) Fix out-of-bounds array access hwmon: (lm85) Fix various errors on attribute writes hwmon: (ads1015) Fix off-by-one for valid channel index checking hwmon: (gpio-fan) Prevent overflow problem when writing large limits hwmon: (lm78) Fix overflow problems seen when writing large temperature limits hwmon: (sis5595) Prevent overflow problem when writing large limits drm: omapdrm: fix compiler errors ARM: OMAP3: Fix choice of omap3_restore_es function in OMAP34XX rev3.1.2 case. mei: start disconnect request timer consistently ALSA: hda/realtek - Avoid setting wrong COEF on ALC269 & co ALSA: hda/ca0132 - Don't try loading firmware at resume when already failed ALSA: virtuoso: add Xonar Essence STX II support ALSA: hda - fix an external mic jack problem on a HP machine USB: Fix persist resume of some SS USB devices USB: ehci-pci: USB host controller support for Intel Quark X1000 USB: serial: ftdi_sio: Add support for new Xsens devices USB: serial: ftdi_sio: Annotate the current Xsens PID assignments USB: OHCI: don't lose track of EDs when a controller dies isofs: Fix unbounded recursion when processing relocated directories HID: fix a couple of off-by-ones HID: logitech: perform bounds checking on device_id early enough stable_kernel_rules: Add pointer to netdev-FAQ for network patches Linux 3.10.53 arch/sparc/math-emu/math_32.c: drop stray break operator sparc64: ldc_connect() should not return EINVAL when handshake is in progress. sunsab: Fix detection of BREAK on sunsab serial console bbc-i2c: Fix BBC I2C envctrl on SunBlade 2000 sparc64: Guard against flushing openfirmware mappings. sparc64: Do not insert non-valid PTEs into the TSB hash table. sparc64: Add membar to Niagara2 memcpy code. sparc64: Fix huge TSB mapping on pre-UltraSPARC-III cpus. sparc64: Don't bark so loudly about 32-bit tasks generating 64-bit fault addresses. sparc64: Fix top-level fault handling bugs. sparc64: Handle 32-bit tasks properly in compute_effective_address(). sparc64: Make itc_sync_lock raw sparc64: Fix argument sign extension for compat_sys_futex(). sctp: fix possible seqlock seadlock in sctp_packet_transmit() iovec: make sure the caller actually wants anything in memcpy_fromiovecend net: Correctly set segment mac_len in skb_segment(). macvlan: Initialize vlan_features to turn on offload support. net: sctp: inherit auth_capable on INIT collisions tcp: Fix integer-overflow in TCP vegas tcp: Fix integer-overflows in TCP veno net: sendmsg: fix NULL pointer dereference ip: make IP identifiers less predictable inetpeer: get rid of ip_id_count bnx2x: fix crash during TSO tunneling Linux 3.10.52 x86/espfix/xen: Fix allocation of pages for paravirt page tables lib/btree.c: fix leak of whole btree nodes net/l2tp: don't fall back on UDP [get|set]sockopt net: mvneta: replace Tx timer with a real interrupt net: mvneta: add missing bit descriptions for interrupt masks and causes net: mvneta: do not schedule in mvneta_tx_timeout net: mvneta: use per_cpu stats to fix an SMP lock up net: mvneta: increase the 64-bit rx/tx stats out of the hot path Revert "mac80211: move "bufferable MMPDU" check to fix AP mode scan" staging: vt6655: Fix Warning on boot handle_irq_event_percpu. x86_64/entry/xen: Do not invoke espfix64 on Xen x86, espfix: Make it possible to disable 16-bit support x86, espfix: Make espfix64 a Kconfig option, fix UML x86, espfix: Fix broken header guard x86, espfix: Move espfix definitions into a separate header file x86-64, espfix: Don't leak bits 31:16 of %esp returning to 16-bit stack Revert "x86-64, modify_ldt: Make support for 16-bit segments a runtime option" timer: Fix lock inversion between hrtimer_bases.lock and scheduler locks printk: rename printk_sched to printk_deferred iio: buffer: Fix demux table creation staging: vt6655: Fix disassociated messages every 10 seconds mm, thp: do not allow thp faults to avoid cpuset restrictions scsi: handle flush errors properly rapidio/tsi721_dma: fix failure to obtain transaction descriptor cfg80211: fix mic_failure tracing ARM: 8115/1: LPAE: reduce damage caused by idmap to virtual memory layout crypto: af_alg - properly label AF_ALG socket Linux 3.10.51 core, nfqueue, openvswitch: Orphan frags in skb_zerocopy and handle errors x86/efi: Include a .bss section within the PE/COFF headers s390/ptrace: fix PSW mask check Fix gcc-4.9.0 miscompilation of load_balance() in scheduler mm: hugetlb: fix copy_hugetlb_page_range() x86_32, entry: Store badsys error code in %eax hwmon: (smsc47m192) Fix temperature limit and vrm write operations parisc: Remove SA_RESTORER define coredump: fix the setting of PF_DUMPCORE Input: fix defuzzing logic slab_common: fix the check for duplicate slab names slab_common: Do not check for duplicate slab names tracing: Fix wraparound problems in "uptime" trace clock blkcg: don't call into policy draining if root_blkg is already gone ahci: add support for the Promise FastTrak TX8660 SATA HBA (ahci mode) libata: introduce ata_host->n_tags to avoid oops on SAS controllers libata: support the ata host which implements a queue depth less than 32 block: don't assume last put of shared tags is for the host block: provide compat ioctl for BLKZEROOUT media: tda10071: force modulation to QPSK on DVB-S media: hdpvr: fix two audio bugs Linux 3.10.50 ARC: Implement ptrace(PTRACE_GET_THREAD_AREA) sched: Fix possible divide by zero in avg_atom() calculation locking/mutex: Disable optimistic spinning on some architectures PM / sleep: Fix request_firmware() error at resume dm cache metadata: do not allow the data block size to change dm thin metadata: do not allow the data block size to change alarmtimer: Fix bug where relative alarm timers were treated as absolute drm/radeon: avoid leaking edid data drm/qxl: return IRQ_NONE if it was not our irq drm/radeon: set default bl level to something reasonable irqchip: gic: Fix core ID calculation when topology is read from DT irqchip: gic: Add support for cortex a7 compatible string ring-buffer: Fix polling on trace_pipe mwifiex: fix Tx timeout issue perf/x86/intel: ignore CondChgd bit to avoid false NMI handling ipv4: fix buffer overflow in ip_options_compile() dns_resolver: Null-terminate the right string dns_resolver: assure that dns_query() result is null-terminated sunvnet: clean up objects created in vnet_new() on vnet_exit() net: pppoe: use correct channel MTU when using Multilink PPP net: sctp: fix information leaks in ulpevent layer tipc: clear 'next'-pointer of message fragments before reassembly be2net: set EQ DB clear-intr bit in be_open() netlink: Fix handling of error from netlink_dump(). net: mvneta: Fix big endian issue in mvneta_txq_desc_csum() net: mvneta: fix operation in 10 Mbit/s mode appletalk: Fix socket referencing in skb tcp: fix false undo corner cases igmp: fix the problem when mc leave group net: qmi_wwan: add two Sierra Wireless/Netgear devices net: qmi_wwan: Add ID for Telewell TW-LTE 4G v2 ipv4: icmp: Fix pMTU handling for rare case tcp: Fix divide by zero when pushing during tcp-repair bnx2x: fix possible panic under memory stress net: fix sparse warning in sk_dst_set() ipv4: irq safe sk_dst_[re]set() and ipv4_sk_update_pmtu() fix ipv4: fix dst race in sk_dst_get() 8021q: fix a potential memory leak net: sctp: check proc_dointvec result in proc_sctp_do_auth tcp: fix tcp_match_skb_to_sack() for unaligned SACK at end of an skb ip_tunnel: fix ip_tunnel_lookup shmem: fix splicing from a hole while it's punched shmem: fix faulting into a hole, not taking i_mutex shmem: fix faulting into a hole while it's punched iwlwifi: dvm: don't enable CTS to self igb: do a reset on SR-IOV re-init if device is down hwmon: (adt7470) Fix writes to temperature limit registers hwmon: (da9052) Don't use dash in the name attribute hwmon: (da9055) Don't use dash in the name attribute tracing: Add ftrace_trace_stack into __trace_puts/__trace_bputs tracing: Fix graph tracer with stack tracer on other archs fuse: handle large user and group ID Bluetooth: Ignore H5 non-link packets in non-active state Drivers: hv: util: Fix a bug in the KVP code media: gspca_pac7302: Add new usb-id for Genius i-Look 317 usb: Check if port status is equal to RxDetect Change-Id: I8791794ed100d5090dc52aef615d32e816fcfa1f Signed-off-by: Ian Maund <imaund@codeaurora.org>
2049 lines
52 KiB
C
2049 lines
52 KiB
C
/*
|
|
* drivers/base/core.c - core driver model code (device registration, etc)
|
|
*
|
|
* Copyright (c) 2002-3 Patrick Mochel
|
|
* Copyright (c) 2002-3 Open Source Development Labs
|
|
* Copyright (c) 2006 Greg Kroah-Hartman <gregkh@suse.de>
|
|
* Copyright (c) 2006 Novell, Inc.
|
|
*
|
|
* This file is released under the GPLv2
|
|
*
|
|
*/
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/err.h>
|
|
#include <linux/init.h>
|
|
#include <linux/module.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/string.h>
|
|
#include <linux/kdev_t.h>
|
|
#include <linux/notifier.h>
|
|
#include <linux/of.h>
|
|
#include <linux/of_device.h>
|
|
#include <linux/genhd.h>
|
|
#include <linux/kallsyms.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/async.h>
|
|
#include <linux/pm_runtime.h>
|
|
#include <linux/netdevice.h>
|
|
|
|
#include "base.h"
|
|
#include "power/power.h"
|
|
|
|
#ifdef CONFIG_SYSFS_DEPRECATED
|
|
#ifdef CONFIG_SYSFS_DEPRECATED_V2
|
|
long sysfs_deprecated = 1;
|
|
#else
|
|
long sysfs_deprecated = 0;
|
|
#endif
|
|
static __init int sysfs_deprecated_setup(char *arg)
|
|
{
|
|
return strict_strtol(arg, 10, &sysfs_deprecated);
|
|
}
|
|
early_param("sysfs.deprecated", sysfs_deprecated_setup);
|
|
#endif
|
|
|
|
int (*platform_notify)(struct device *dev) = NULL;
|
|
int (*platform_notify_remove)(struct device *dev) = NULL;
|
|
static struct kobject *dev_kobj;
|
|
struct kobject *sysfs_dev_char_kobj;
|
|
struct kobject *sysfs_dev_block_kobj;
|
|
|
|
#ifdef CONFIG_BLOCK
|
|
static inline int device_is_not_partition(struct device *dev)
|
|
{
|
|
return !(dev->type == &part_type);
|
|
}
|
|
#else
|
|
static inline int device_is_not_partition(struct device *dev)
|
|
{
|
|
return 1;
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* dev_driver_string - Return a device's driver name, if at all possible
|
|
* @dev: struct device to get the name of
|
|
*
|
|
* Will return the device's driver's name if it is bound to a device. If
|
|
* the device is not bound to a driver, it will return the name of the bus
|
|
* it is attached to. If it is not attached to a bus either, an empty
|
|
* string will be returned.
|
|
*/
|
|
const char *dev_driver_string(const struct device *dev)
|
|
{
|
|
struct device_driver *drv;
|
|
|
|
/* dev->driver can change to NULL underneath us because of unbinding,
|
|
* so be careful about accessing it. dev->bus and dev->class should
|
|
* never change once they are set, so they don't need special care.
|
|
*/
|
|
drv = ACCESS_ONCE(dev->driver);
|
|
return drv ? drv->name :
|
|
(dev->bus ? dev->bus->name :
|
|
(dev->class ? dev->class->name : ""));
|
|
}
|
|
EXPORT_SYMBOL(dev_driver_string);
|
|
|
|
#define to_dev_attr(_attr) container_of(_attr, struct device_attribute, attr)
|
|
|
|
static ssize_t dev_attr_show(struct kobject *kobj, struct attribute *attr,
|
|
char *buf)
|
|
{
|
|
struct device_attribute *dev_attr = to_dev_attr(attr);
|
|
struct device *dev = kobj_to_dev(kobj);
|
|
ssize_t ret = -EIO;
|
|
|
|
if (dev_attr->show)
|
|
ret = dev_attr->show(dev, dev_attr, buf);
|
|
if (ret >= (ssize_t)PAGE_SIZE) {
|
|
print_symbol("dev_attr_show: %s returned bad count\n",
|
|
(unsigned long)dev_attr->show);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
static ssize_t dev_attr_store(struct kobject *kobj, struct attribute *attr,
|
|
const char *buf, size_t count)
|
|
{
|
|
struct device_attribute *dev_attr = to_dev_attr(attr);
|
|
struct device *dev = kobj_to_dev(kobj);
|
|
ssize_t ret = -EIO;
|
|
|
|
if (dev_attr->store)
|
|
ret = dev_attr->store(dev, dev_attr, buf, count);
|
|
return ret;
|
|
}
|
|
|
|
static const struct sysfs_ops dev_sysfs_ops = {
|
|
.show = dev_attr_show,
|
|
.store = dev_attr_store,
|
|
};
|
|
|
|
#define to_ext_attr(x) container_of(x, struct dev_ext_attribute, attr)
|
|
|
|
ssize_t device_store_ulong(struct device *dev,
|
|
struct device_attribute *attr,
|
|
const char *buf, size_t size)
|
|
{
|
|
struct dev_ext_attribute *ea = to_ext_attr(attr);
|
|
char *end;
|
|
unsigned long new = simple_strtoul(buf, &end, 0);
|
|
if (end == buf)
|
|
return -EINVAL;
|
|
*(unsigned long *)(ea->var) = new;
|
|
/* Always return full write size even if we didn't consume all */
|
|
return size;
|
|
}
|
|
EXPORT_SYMBOL_GPL(device_store_ulong);
|
|
|
|
ssize_t device_show_ulong(struct device *dev,
|
|
struct device_attribute *attr,
|
|
char *buf)
|
|
{
|
|
struct dev_ext_attribute *ea = to_ext_attr(attr);
|
|
return snprintf(buf, PAGE_SIZE, "%lx\n", *(unsigned long *)(ea->var));
|
|
}
|
|
EXPORT_SYMBOL_GPL(device_show_ulong);
|
|
|
|
ssize_t device_store_int(struct device *dev,
|
|
struct device_attribute *attr,
|
|
const char *buf, size_t size)
|
|
{
|
|
struct dev_ext_attribute *ea = to_ext_attr(attr);
|
|
char *end;
|
|
long new = simple_strtol(buf, &end, 0);
|
|
if (end == buf || new > INT_MAX || new < INT_MIN)
|
|
return -EINVAL;
|
|
*(int *)(ea->var) = new;
|
|
/* Always return full write size even if we didn't consume all */
|
|
return size;
|
|
}
|
|
EXPORT_SYMBOL_GPL(device_store_int);
|
|
|
|
ssize_t device_show_int(struct device *dev,
|
|
struct device_attribute *attr,
|
|
char *buf)
|
|
{
|
|
struct dev_ext_attribute *ea = to_ext_attr(attr);
|
|
|
|
return snprintf(buf, PAGE_SIZE, "%d\n", *(int *)(ea->var));
|
|
}
|
|
EXPORT_SYMBOL_GPL(device_show_int);
|
|
|
|
ssize_t device_store_bool(struct device *dev, struct device_attribute *attr,
|
|
const char *buf, size_t size)
|
|
{
|
|
struct dev_ext_attribute *ea = to_ext_attr(attr);
|
|
|
|
if (strtobool(buf, ea->var) < 0)
|
|
return -EINVAL;
|
|
|
|
return size;
|
|
}
|
|
EXPORT_SYMBOL_GPL(device_store_bool);
|
|
|
|
ssize_t device_show_bool(struct device *dev, struct device_attribute *attr,
|
|
char *buf)
|
|
{
|
|
struct dev_ext_attribute *ea = to_ext_attr(attr);
|
|
|
|
return snprintf(buf, PAGE_SIZE, "%d\n", *(bool *)(ea->var));
|
|
}
|
|
EXPORT_SYMBOL_GPL(device_show_bool);
|
|
|
|
/**
|
|
* device_release - free device structure.
|
|
* @kobj: device's kobject.
|
|
*
|
|
* This is called once the reference count for the object
|
|
* reaches 0. We forward the call to the device's release
|
|
* method, which should handle actually freeing the structure.
|
|
*/
|
|
static void device_release(struct kobject *kobj)
|
|
{
|
|
struct device *dev = kobj_to_dev(kobj);
|
|
struct device_private *p = dev->p;
|
|
|
|
/*
|
|
* Some platform devices are driven without driver attached
|
|
* and managed resources may have been acquired. Make sure
|
|
* all resources are released.
|
|
*
|
|
* Drivers still can add resources into device after device
|
|
* is deleted but alive, so release devres here to avoid
|
|
* possible memory leak.
|
|
*/
|
|
devres_release_all(dev);
|
|
|
|
if (dev->release)
|
|
dev->release(dev);
|
|
else if (dev->type && dev->type->release)
|
|
dev->type->release(dev);
|
|
else if (dev->class && dev->class->dev_release)
|
|
dev->class->dev_release(dev);
|
|
else
|
|
WARN(1, KERN_ERR "Device '%s' does not have a release() "
|
|
"function, it is broken and must be fixed.\n",
|
|
dev_name(dev));
|
|
kfree(p);
|
|
}
|
|
|
|
static const void *device_namespace(struct kobject *kobj)
|
|
{
|
|
struct device *dev = kobj_to_dev(kobj);
|
|
const void *ns = NULL;
|
|
|
|
if (dev->class && dev->class->ns_type)
|
|
ns = dev->class->namespace(dev);
|
|
|
|
return ns;
|
|
}
|
|
|
|
static struct kobj_type device_ktype = {
|
|
.release = device_release,
|
|
.sysfs_ops = &dev_sysfs_ops,
|
|
.namespace = device_namespace,
|
|
};
|
|
|
|
|
|
static int dev_uevent_filter(struct kset *kset, struct kobject *kobj)
|
|
{
|
|
struct kobj_type *ktype = get_ktype(kobj);
|
|
|
|
if (ktype == &device_ktype) {
|
|
struct device *dev = kobj_to_dev(kobj);
|
|
if (dev->bus)
|
|
return 1;
|
|
if (dev->class)
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static const char *dev_uevent_name(struct kset *kset, struct kobject *kobj)
|
|
{
|
|
struct device *dev = kobj_to_dev(kobj);
|
|
|
|
if (dev->bus)
|
|
return dev->bus->name;
|
|
if (dev->class)
|
|
return dev->class->name;
|
|
return NULL;
|
|
}
|
|
|
|
static int dev_uevent(struct kset *kset, struct kobject *kobj,
|
|
struct kobj_uevent_env *env)
|
|
{
|
|
struct device *dev = kobj_to_dev(kobj);
|
|
int retval = 0;
|
|
|
|
/* add device node properties if present */
|
|
if (MAJOR(dev->devt)) {
|
|
const char *tmp;
|
|
const char *name;
|
|
umode_t mode = 0;
|
|
kuid_t uid = GLOBAL_ROOT_UID;
|
|
kgid_t gid = GLOBAL_ROOT_GID;
|
|
|
|
add_uevent_var(env, "MAJOR=%u", MAJOR(dev->devt));
|
|
add_uevent_var(env, "MINOR=%u", MINOR(dev->devt));
|
|
name = device_get_devnode(dev, &mode, &uid, &gid, &tmp);
|
|
if (name) {
|
|
add_uevent_var(env, "DEVNAME=%s", name);
|
|
if (mode)
|
|
add_uevent_var(env, "DEVMODE=%#o", mode & 0777);
|
|
if (!uid_eq(uid, GLOBAL_ROOT_UID))
|
|
add_uevent_var(env, "DEVUID=%u", from_kuid(&init_user_ns, uid));
|
|
if (!gid_eq(gid, GLOBAL_ROOT_GID))
|
|
add_uevent_var(env, "DEVGID=%u", from_kgid(&init_user_ns, gid));
|
|
kfree(tmp);
|
|
}
|
|
}
|
|
|
|
if (dev->type && dev->type->name)
|
|
add_uevent_var(env, "DEVTYPE=%s", dev->type->name);
|
|
|
|
if (dev->driver)
|
|
add_uevent_var(env, "DRIVER=%s", dev->driver->name);
|
|
|
|
/* Add common DT information about the device */
|
|
of_device_uevent(dev, env);
|
|
|
|
/* have the bus specific function add its stuff */
|
|
if (dev->bus && dev->bus->uevent) {
|
|
retval = dev->bus->uevent(dev, env);
|
|
if (retval)
|
|
pr_debug("device: '%s': %s: bus uevent() returned %d\n",
|
|
dev_name(dev), __func__, retval);
|
|
}
|
|
|
|
/* have the class specific function add its stuff */
|
|
if (dev->class && dev->class->dev_uevent) {
|
|
retval = dev->class->dev_uevent(dev, env);
|
|
if (retval)
|
|
pr_debug("device: '%s': %s: class uevent() "
|
|
"returned %d\n", dev_name(dev),
|
|
__func__, retval);
|
|
}
|
|
|
|
/* have the device type specific function add its stuff */
|
|
if (dev->type && dev->type->uevent) {
|
|
retval = dev->type->uevent(dev, env);
|
|
if (retval)
|
|
pr_debug("device: '%s': %s: dev_type uevent() "
|
|
"returned %d\n", dev_name(dev),
|
|
__func__, retval);
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|
|
static const struct kset_uevent_ops device_uevent_ops = {
|
|
.filter = dev_uevent_filter,
|
|
.name = dev_uevent_name,
|
|
.uevent = dev_uevent,
|
|
};
|
|
|
|
static ssize_t show_uevent(struct device *dev, struct device_attribute *attr,
|
|
char *buf)
|
|
{
|
|
struct kobject *top_kobj;
|
|
struct kset *kset;
|
|
struct kobj_uevent_env *env = NULL;
|
|
int i;
|
|
size_t count = 0;
|
|
int retval;
|
|
|
|
/* search the kset, the device belongs to */
|
|
top_kobj = &dev->kobj;
|
|
while (!top_kobj->kset && top_kobj->parent)
|
|
top_kobj = top_kobj->parent;
|
|
if (!top_kobj->kset)
|
|
goto out;
|
|
|
|
kset = top_kobj->kset;
|
|
if (!kset->uevent_ops || !kset->uevent_ops->uevent)
|
|
goto out;
|
|
|
|
/* respect filter */
|
|
if (kset->uevent_ops && kset->uevent_ops->filter)
|
|
if (!kset->uevent_ops->filter(kset, &dev->kobj))
|
|
goto out;
|
|
|
|
env = kzalloc(sizeof(struct kobj_uevent_env), GFP_KERNEL);
|
|
if (!env)
|
|
return -ENOMEM;
|
|
|
|
/* let the kset specific function add its keys */
|
|
retval = kset->uevent_ops->uevent(kset, &dev->kobj, env);
|
|
if (retval)
|
|
goto out;
|
|
|
|
/* copy keys to file */
|
|
for (i = 0; i < env->envp_idx; i++)
|
|
count += sprintf(&buf[count], "%s\n", env->envp[i]);
|
|
out:
|
|
kfree(env);
|
|
return count;
|
|
}
|
|
|
|
static ssize_t store_uevent(struct device *dev, struct device_attribute *attr,
|
|
const char *buf, size_t count)
|
|
{
|
|
enum kobject_action action;
|
|
|
|
if (kobject_action_type(buf, count, &action) == 0)
|
|
kobject_uevent(&dev->kobj, action);
|
|
else
|
|
dev_err(dev, "uevent: unknown action-string\n");
|
|
return count;
|
|
}
|
|
|
|
static struct device_attribute uevent_attr =
|
|
__ATTR(uevent, S_IRUGO | S_IWUSR, show_uevent, store_uevent);
|
|
|
|
static int device_add_attributes(struct device *dev,
|
|
struct device_attribute *attrs)
|
|
{
|
|
int error = 0;
|
|
int i;
|
|
|
|
if (attrs) {
|
|
for (i = 0; attr_name(attrs[i]); i++) {
|
|
error = device_create_file(dev, &attrs[i]);
|
|
if (error)
|
|
break;
|
|
}
|
|
if (error)
|
|
while (--i >= 0)
|
|
device_remove_file(dev, &attrs[i]);
|
|
}
|
|
return error;
|
|
}
|
|
|
|
static void device_remove_attributes(struct device *dev,
|
|
struct device_attribute *attrs)
|
|
{
|
|
int i;
|
|
|
|
if (attrs)
|
|
for (i = 0; attr_name(attrs[i]); i++)
|
|
device_remove_file(dev, &attrs[i]);
|
|
}
|
|
|
|
static int device_add_bin_attributes(struct device *dev,
|
|
struct bin_attribute *attrs)
|
|
{
|
|
int error = 0;
|
|
int i;
|
|
|
|
if (attrs) {
|
|
for (i = 0; attr_name(attrs[i]); i++) {
|
|
error = device_create_bin_file(dev, &attrs[i]);
|
|
if (error)
|
|
break;
|
|
}
|
|
if (error)
|
|
while (--i >= 0)
|
|
device_remove_bin_file(dev, &attrs[i]);
|
|
}
|
|
return error;
|
|
}
|
|
|
|
static void device_remove_bin_attributes(struct device *dev,
|
|
struct bin_attribute *attrs)
|
|
{
|
|
int i;
|
|
|
|
if (attrs)
|
|
for (i = 0; attr_name(attrs[i]); i++)
|
|
device_remove_bin_file(dev, &attrs[i]);
|
|
}
|
|
|
|
static int device_add_groups(struct device *dev,
|
|
const struct attribute_group **groups)
|
|
{
|
|
int error = 0;
|
|
int i;
|
|
|
|
if (groups) {
|
|
for (i = 0; groups[i]; i++) {
|
|
error = sysfs_create_group(&dev->kobj, groups[i]);
|
|
if (error) {
|
|
while (--i >= 0)
|
|
sysfs_remove_group(&dev->kobj,
|
|
groups[i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return error;
|
|
}
|
|
|
|
static void device_remove_groups(struct device *dev,
|
|
const struct attribute_group **groups)
|
|
{
|
|
int i;
|
|
|
|
if (groups)
|
|
for (i = 0; groups[i]; i++)
|
|
sysfs_remove_group(&dev->kobj, groups[i]);
|
|
}
|
|
|
|
static int device_add_attrs(struct device *dev)
|
|
{
|
|
struct class *class = dev->class;
|
|
const struct device_type *type = dev->type;
|
|
int error;
|
|
|
|
if (class) {
|
|
error = device_add_attributes(dev, class->dev_attrs);
|
|
if (error)
|
|
return error;
|
|
error = device_add_bin_attributes(dev, class->dev_bin_attrs);
|
|
if (error)
|
|
goto err_remove_class_attrs;
|
|
}
|
|
|
|
if (type) {
|
|
error = device_add_groups(dev, type->groups);
|
|
if (error)
|
|
goto err_remove_class_bin_attrs;
|
|
}
|
|
|
|
error = device_add_groups(dev, dev->groups);
|
|
if (error)
|
|
goto err_remove_type_groups;
|
|
|
|
return 0;
|
|
|
|
err_remove_type_groups:
|
|
if (type)
|
|
device_remove_groups(dev, type->groups);
|
|
err_remove_class_bin_attrs:
|
|
if (class)
|
|
device_remove_bin_attributes(dev, class->dev_bin_attrs);
|
|
err_remove_class_attrs:
|
|
if (class)
|
|
device_remove_attributes(dev, class->dev_attrs);
|
|
|
|
return error;
|
|
}
|
|
|
|
static void device_remove_attrs(struct device *dev)
|
|
{
|
|
struct class *class = dev->class;
|
|
const struct device_type *type = dev->type;
|
|
|
|
device_remove_groups(dev, dev->groups);
|
|
|
|
if (type)
|
|
device_remove_groups(dev, type->groups);
|
|
|
|
if (class) {
|
|
device_remove_attributes(dev, class->dev_attrs);
|
|
device_remove_bin_attributes(dev, class->dev_bin_attrs);
|
|
}
|
|
}
|
|
|
|
|
|
static ssize_t show_dev(struct device *dev, struct device_attribute *attr,
|
|
char *buf)
|
|
{
|
|
return print_dev_t(buf, dev->devt);
|
|
}
|
|
|
|
static struct device_attribute devt_attr =
|
|
__ATTR(dev, S_IRUGO, show_dev, NULL);
|
|
|
|
/* /sys/devices/ */
|
|
struct kset *devices_kset;
|
|
|
|
/**
|
|
* device_create_file - create sysfs attribute file for device.
|
|
* @dev: device.
|
|
* @attr: device attribute descriptor.
|
|
*/
|
|
int device_create_file(struct device *dev,
|
|
const struct device_attribute *attr)
|
|
{
|
|
int error = 0;
|
|
|
|
if (dev) {
|
|
WARN(((attr->attr.mode & S_IWUGO) && !attr->store),
|
|
"Attribute %s: write permission without 'store'\n",
|
|
attr->attr.name);
|
|
WARN(((attr->attr.mode & S_IRUGO) && !attr->show),
|
|
"Attribute %s: read permission without 'show'\n",
|
|
attr->attr.name);
|
|
error = sysfs_create_file(&dev->kobj, &attr->attr);
|
|
}
|
|
|
|
return error;
|
|
}
|
|
|
|
/**
|
|
* device_remove_file - remove sysfs attribute file.
|
|
* @dev: device.
|
|
* @attr: device attribute descriptor.
|
|
*/
|
|
void device_remove_file(struct device *dev,
|
|
const struct device_attribute *attr)
|
|
{
|
|
if (dev)
|
|
sysfs_remove_file(&dev->kobj, &attr->attr);
|
|
}
|
|
|
|
/**
|
|
* device_create_bin_file - create sysfs binary attribute file for device.
|
|
* @dev: device.
|
|
* @attr: device binary attribute descriptor.
|
|
*/
|
|
int device_create_bin_file(struct device *dev,
|
|
const struct bin_attribute *attr)
|
|
{
|
|
int error = -EINVAL;
|
|
if (dev)
|
|
error = sysfs_create_bin_file(&dev->kobj, attr);
|
|
return error;
|
|
}
|
|
EXPORT_SYMBOL_GPL(device_create_bin_file);
|
|
|
|
/**
|
|
* device_remove_bin_file - remove sysfs binary attribute file
|
|
* @dev: device.
|
|
* @attr: device binary attribute descriptor.
|
|
*/
|
|
void device_remove_bin_file(struct device *dev,
|
|
const struct bin_attribute *attr)
|
|
{
|
|
if (dev)
|
|
sysfs_remove_bin_file(&dev->kobj, attr);
|
|
}
|
|
EXPORT_SYMBOL_GPL(device_remove_bin_file);
|
|
|
|
/**
|
|
* device_schedule_callback_owner - helper to schedule a callback for a device
|
|
* @dev: device.
|
|
* @func: callback function to invoke later.
|
|
* @owner: module owning the callback routine
|
|
*
|
|
* Attribute methods must not unregister themselves or their parent device
|
|
* (which would amount to the same thing). Attempts to do so will deadlock,
|
|
* since unregistration is mutually exclusive with driver callbacks.
|
|
*
|
|
* Instead methods can call this routine, which will attempt to allocate
|
|
* and schedule a workqueue request to call back @func with @dev as its
|
|
* argument in the workqueue's process context. @dev will be pinned until
|
|
* @func returns.
|
|
*
|
|
* This routine is usually called via the inline device_schedule_callback(),
|
|
* which automatically sets @owner to THIS_MODULE.
|
|
*
|
|
* Returns 0 if the request was submitted, -ENOMEM if storage could not
|
|
* be allocated, -ENODEV if a reference to @owner isn't available.
|
|
*
|
|
* NOTE: This routine won't work if CONFIG_SYSFS isn't set! It uses an
|
|
* underlying sysfs routine (since it is intended for use by attribute
|
|
* methods), and if sysfs isn't available you'll get nothing but -ENOSYS.
|
|
*/
|
|
int device_schedule_callback_owner(struct device *dev,
|
|
void (*func)(struct device *), struct module *owner)
|
|
{
|
|
return sysfs_schedule_callback(&dev->kobj,
|
|
(void (*)(void *)) func, dev, owner);
|
|
}
|
|
EXPORT_SYMBOL_GPL(device_schedule_callback_owner);
|
|
|
|
static void klist_children_get(struct klist_node *n)
|
|
{
|
|
struct device_private *p = to_device_private_parent(n);
|
|
struct device *dev = p->device;
|
|
|
|
get_device(dev);
|
|
}
|
|
|
|
static void klist_children_put(struct klist_node *n)
|
|
{
|
|
struct device_private *p = to_device_private_parent(n);
|
|
struct device *dev = p->device;
|
|
|
|
put_device(dev);
|
|
}
|
|
|
|
/**
|
|
* device_initialize - init device structure.
|
|
* @dev: device.
|
|
*
|
|
* This prepares the device for use by other layers by initializing
|
|
* its fields.
|
|
* It is the first half of device_register(), if called by
|
|
* that function, though it can also be called separately, so one
|
|
* may use @dev's fields. In particular, get_device()/put_device()
|
|
* may be used for reference counting of @dev after calling this
|
|
* function.
|
|
*
|
|
* All fields in @dev must be initialized by the caller to 0, except
|
|
* for those explicitly set to some other value. The simplest
|
|
* approach is to use kzalloc() to allocate the structure containing
|
|
* @dev.
|
|
*
|
|
* NOTE: Use put_device() to give up your reference instead of freeing
|
|
* @dev directly once you have called this function.
|
|
*/
|
|
void device_initialize(struct device *dev)
|
|
{
|
|
dev->kobj.kset = devices_kset;
|
|
kobject_init(&dev->kobj, &device_ktype);
|
|
INIT_LIST_HEAD(&dev->dma_pools);
|
|
mutex_init(&dev->mutex);
|
|
lockdep_set_novalidate_class(&dev->mutex);
|
|
spin_lock_init(&dev->devres_lock);
|
|
INIT_LIST_HEAD(&dev->devres_head);
|
|
device_pm_init(dev);
|
|
set_dev_node(dev, -1);
|
|
}
|
|
|
|
struct kobject *virtual_device_parent(struct device *dev)
|
|
{
|
|
static struct kobject *virtual_dir = NULL;
|
|
|
|
if (!virtual_dir)
|
|
virtual_dir = kobject_create_and_add("virtual",
|
|
&devices_kset->kobj);
|
|
|
|
return virtual_dir;
|
|
}
|
|
|
|
struct class_dir {
|
|
struct kobject kobj;
|
|
struct class *class;
|
|
};
|
|
|
|
#define to_class_dir(obj) container_of(obj, struct class_dir, kobj)
|
|
|
|
static void class_dir_release(struct kobject *kobj)
|
|
{
|
|
struct class_dir *dir = to_class_dir(kobj);
|
|
kfree(dir);
|
|
}
|
|
|
|
static const
|
|
struct kobj_ns_type_operations *class_dir_child_ns_type(struct kobject *kobj)
|
|
{
|
|
struct class_dir *dir = to_class_dir(kobj);
|
|
return dir->class->ns_type;
|
|
}
|
|
|
|
static struct kobj_type class_dir_ktype = {
|
|
.release = class_dir_release,
|
|
.sysfs_ops = &kobj_sysfs_ops,
|
|
.child_ns_type = class_dir_child_ns_type
|
|
};
|
|
|
|
static struct kobject *
|
|
class_dir_create_and_add(struct class *class, struct kobject *parent_kobj)
|
|
{
|
|
struct class_dir *dir;
|
|
int retval;
|
|
|
|
dir = kzalloc(sizeof(*dir), GFP_KERNEL);
|
|
if (!dir)
|
|
return NULL;
|
|
|
|
dir->class = class;
|
|
kobject_init(&dir->kobj, &class_dir_ktype);
|
|
|
|
dir->kobj.kset = &class->p->glue_dirs;
|
|
|
|
retval = kobject_add(&dir->kobj, parent_kobj, "%s", class->name);
|
|
if (retval < 0) {
|
|
kobject_put(&dir->kobj);
|
|
return NULL;
|
|
}
|
|
return &dir->kobj;
|
|
}
|
|
|
|
static DEFINE_MUTEX(gdp_mutex);
|
|
|
|
static struct kobject *get_device_parent(struct device *dev,
|
|
struct device *parent)
|
|
{
|
|
if (dev->class) {
|
|
struct kobject *kobj = NULL;
|
|
struct kobject *parent_kobj;
|
|
struct kobject *k;
|
|
|
|
#ifdef CONFIG_BLOCK
|
|
/* block disks show up in /sys/block */
|
|
if (sysfs_deprecated && dev->class == &block_class) {
|
|
if (parent && parent->class == &block_class)
|
|
return &parent->kobj;
|
|
return &block_class.p->subsys.kobj;
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* If we have no parent, we live in "virtual".
|
|
* Class-devices with a non class-device as parent, live
|
|
* in a "glue" directory to prevent namespace collisions.
|
|
*/
|
|
if (parent == NULL)
|
|
parent_kobj = virtual_device_parent(dev);
|
|
else if (parent->class && !dev->class->ns_type)
|
|
return &parent->kobj;
|
|
else
|
|
parent_kobj = &parent->kobj;
|
|
|
|
mutex_lock(&gdp_mutex);
|
|
|
|
/* find our class-directory at the parent and reference it */
|
|
spin_lock(&dev->class->p->glue_dirs.list_lock);
|
|
list_for_each_entry(k, &dev->class->p->glue_dirs.list, entry)
|
|
if (k->parent == parent_kobj) {
|
|
kobj = kobject_get(k);
|
|
break;
|
|
}
|
|
spin_unlock(&dev->class->p->glue_dirs.list_lock);
|
|
if (kobj) {
|
|
mutex_unlock(&gdp_mutex);
|
|
return kobj;
|
|
}
|
|
|
|
/* or create a new class-directory at the parent device */
|
|
k = class_dir_create_and_add(dev->class, parent_kobj);
|
|
/* do not emit an uevent for this simple "glue" directory */
|
|
mutex_unlock(&gdp_mutex);
|
|
return k;
|
|
}
|
|
|
|
/* subsystems can specify a default root directory for their devices */
|
|
if (!parent && dev->bus && dev->bus->dev_root)
|
|
return &dev->bus->dev_root->kobj;
|
|
|
|
if (parent)
|
|
return &parent->kobj;
|
|
return NULL;
|
|
}
|
|
|
|
static void cleanup_glue_dir(struct device *dev, struct kobject *glue_dir)
|
|
{
|
|
/* see if we live in a "glue" directory */
|
|
if (!glue_dir || !dev->class ||
|
|
glue_dir->kset != &dev->class->p->glue_dirs)
|
|
return;
|
|
|
|
mutex_lock(&gdp_mutex);
|
|
kobject_put(glue_dir);
|
|
mutex_unlock(&gdp_mutex);
|
|
}
|
|
|
|
static void cleanup_device_parent(struct device *dev)
|
|
{
|
|
cleanup_glue_dir(dev, dev->kobj.parent);
|
|
}
|
|
|
|
static int device_add_class_symlinks(struct device *dev)
|
|
{
|
|
int error;
|
|
|
|
if (!dev->class)
|
|
return 0;
|
|
|
|
error = sysfs_create_link(&dev->kobj,
|
|
&dev->class->p->subsys.kobj,
|
|
"subsystem");
|
|
if (error)
|
|
goto out;
|
|
|
|
if (dev->parent && device_is_not_partition(dev)) {
|
|
error = sysfs_create_link(&dev->kobj, &dev->parent->kobj,
|
|
"device");
|
|
if (error)
|
|
goto out_subsys;
|
|
}
|
|
|
|
#ifdef CONFIG_BLOCK
|
|
/* /sys/block has directories and does not need symlinks */
|
|
if (sysfs_deprecated && dev->class == &block_class)
|
|
return 0;
|
|
#endif
|
|
|
|
/* link in the class directory pointing to the device */
|
|
error = sysfs_create_link(&dev->class->p->subsys.kobj,
|
|
&dev->kobj, dev_name(dev));
|
|
if (error)
|
|
goto out_device;
|
|
|
|
return 0;
|
|
|
|
out_device:
|
|
sysfs_remove_link(&dev->kobj, "device");
|
|
|
|
out_subsys:
|
|
sysfs_remove_link(&dev->kobj, "subsystem");
|
|
out:
|
|
return error;
|
|
}
|
|
|
|
static void device_remove_class_symlinks(struct device *dev)
|
|
{
|
|
if (!dev->class)
|
|
return;
|
|
|
|
if (dev->parent && device_is_not_partition(dev))
|
|
sysfs_remove_link(&dev->kobj, "device");
|
|
sysfs_remove_link(&dev->kobj, "subsystem");
|
|
#ifdef CONFIG_BLOCK
|
|
if (sysfs_deprecated && dev->class == &block_class)
|
|
return;
|
|
#endif
|
|
sysfs_delete_link(&dev->class->p->subsys.kobj, &dev->kobj, dev_name(dev));
|
|
}
|
|
|
|
/**
|
|
* dev_set_name - set a device name
|
|
* @dev: device
|
|
* @fmt: format string for the device's name
|
|
*/
|
|
int dev_set_name(struct device *dev, const char *fmt, ...)
|
|
{
|
|
va_list vargs;
|
|
int err;
|
|
|
|
va_start(vargs, fmt);
|
|
err = kobject_set_name_vargs(&dev->kobj, fmt, vargs);
|
|
va_end(vargs);
|
|
return err;
|
|
}
|
|
EXPORT_SYMBOL_GPL(dev_set_name);
|
|
|
|
/**
|
|
* device_to_dev_kobj - select a /sys/dev/ directory for the device
|
|
* @dev: device
|
|
*
|
|
* By default we select char/ for new entries. Setting class->dev_obj
|
|
* to NULL prevents an entry from being created. class->dev_kobj must
|
|
* be set (or cleared) before any devices are registered to the class
|
|
* otherwise device_create_sys_dev_entry() and
|
|
* device_remove_sys_dev_entry() will disagree about the presence of
|
|
* the link.
|
|
*/
|
|
static struct kobject *device_to_dev_kobj(struct device *dev)
|
|
{
|
|
struct kobject *kobj;
|
|
|
|
if (dev->class)
|
|
kobj = dev->class->dev_kobj;
|
|
else
|
|
kobj = sysfs_dev_char_kobj;
|
|
|
|
return kobj;
|
|
}
|
|
|
|
static int device_create_sys_dev_entry(struct device *dev)
|
|
{
|
|
struct kobject *kobj = device_to_dev_kobj(dev);
|
|
int error = 0;
|
|
char devt_str[15];
|
|
|
|
if (kobj) {
|
|
format_dev_t(devt_str, dev->devt);
|
|
error = sysfs_create_link(kobj, &dev->kobj, devt_str);
|
|
}
|
|
|
|
return error;
|
|
}
|
|
|
|
static void device_remove_sys_dev_entry(struct device *dev)
|
|
{
|
|
struct kobject *kobj = device_to_dev_kobj(dev);
|
|
char devt_str[15];
|
|
|
|
if (kobj) {
|
|
format_dev_t(devt_str, dev->devt);
|
|
sysfs_remove_link(kobj, devt_str);
|
|
}
|
|
}
|
|
|
|
int device_private_init(struct device *dev)
|
|
{
|
|
dev->p = kzalloc(sizeof(*dev->p), GFP_KERNEL);
|
|
if (!dev->p)
|
|
return -ENOMEM;
|
|
dev->p->device = dev;
|
|
klist_init(&dev->p->klist_children, klist_children_get,
|
|
klist_children_put);
|
|
INIT_LIST_HEAD(&dev->p->deferred_probe);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* device_add - add device to device hierarchy.
|
|
* @dev: device.
|
|
*
|
|
* This is part 2 of device_register(), though may be called
|
|
* separately _iff_ device_initialize() has been called separately.
|
|
*
|
|
* This adds @dev to the kobject hierarchy via kobject_add(), adds it
|
|
* to the global and sibling lists for the device, then
|
|
* adds it to the other relevant subsystems of the driver model.
|
|
*
|
|
* Do not call this routine or device_register() more than once for
|
|
* any device structure. The driver model core is not designed to work
|
|
* with devices that get unregistered and then spring back to life.
|
|
* (Among other things, it's very hard to guarantee that all references
|
|
* to the previous incarnation of @dev have been dropped.) Allocate
|
|
* and register a fresh new struct device instead.
|
|
*
|
|
* NOTE: _Never_ directly free @dev after calling this function, even
|
|
* if it returned an error! Always use put_device() to give up your
|
|
* reference instead.
|
|
*/
|
|
int device_add(struct device *dev)
|
|
{
|
|
struct device *parent = NULL;
|
|
struct kobject *kobj;
|
|
struct class_interface *class_intf;
|
|
int error = -EINVAL;
|
|
|
|
dev = get_device(dev);
|
|
if (!dev)
|
|
goto done;
|
|
|
|
if (!dev->p) {
|
|
error = device_private_init(dev);
|
|
if (error)
|
|
goto done;
|
|
}
|
|
|
|
/*
|
|
* for statically allocated devices, which should all be converted
|
|
* some day, we need to initialize the name. We prevent reading back
|
|
* the name, and force the use of dev_name()
|
|
*/
|
|
if (dev->init_name) {
|
|
dev_set_name(dev, "%s", dev->init_name);
|
|
dev->init_name = NULL;
|
|
}
|
|
|
|
/* subsystems can specify simple device enumeration */
|
|
if (!dev_name(dev) && dev->bus && dev->bus->dev_name)
|
|
dev_set_name(dev, "%s%u", dev->bus->dev_name, dev->id);
|
|
|
|
if (!dev_name(dev)) {
|
|
error = -EINVAL;
|
|
goto name_error;
|
|
}
|
|
|
|
pr_debug("device: '%s': %s\n", dev_name(dev), __func__);
|
|
|
|
parent = get_device(dev->parent);
|
|
kobj = get_device_parent(dev, parent);
|
|
if (kobj)
|
|
dev->kobj.parent = kobj;
|
|
|
|
/* use parent numa_node */
|
|
if (parent)
|
|
set_dev_node(dev, dev_to_node(parent));
|
|
|
|
/* first, register with generic layer. */
|
|
/* we require the name to be set before, and pass NULL */
|
|
error = kobject_add(&dev->kobj, dev->kobj.parent, NULL);
|
|
if (error)
|
|
goto Error;
|
|
|
|
/* notify platform of device entry */
|
|
if (platform_notify)
|
|
platform_notify(dev);
|
|
|
|
error = device_create_file(dev, &uevent_attr);
|
|
if (error)
|
|
goto attrError;
|
|
|
|
if (MAJOR(dev->devt)) {
|
|
error = device_create_file(dev, &devt_attr);
|
|
if (error)
|
|
goto ueventattrError;
|
|
|
|
error = device_create_sys_dev_entry(dev);
|
|
if (error)
|
|
goto devtattrError;
|
|
|
|
devtmpfs_create_node(dev);
|
|
}
|
|
|
|
error = device_add_class_symlinks(dev);
|
|
if (error)
|
|
goto SymlinkError;
|
|
error = device_add_attrs(dev);
|
|
if (error)
|
|
goto AttrsError;
|
|
error = bus_add_device(dev);
|
|
if (error)
|
|
goto BusError;
|
|
error = dpm_sysfs_add(dev);
|
|
if (error)
|
|
goto DPMError;
|
|
if ((dev->pm_domain) || (dev->type && dev->type->pm)
|
|
|| (dev->class && (dev->class->pm || dev->class->resume))
|
|
|| (dev->bus && (dev->bus->pm || dev->bus->resume)) ||
|
|
(dev->driver && dev->driver->pm)) {
|
|
device_pm_add(dev);
|
|
}
|
|
|
|
|
|
/* Notify clients of device addition. This call must come
|
|
* after dpm_sysfs_add() and before kobject_uevent().
|
|
*/
|
|
if (dev->bus)
|
|
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
|
BUS_NOTIFY_ADD_DEVICE, dev);
|
|
|
|
kobject_uevent(&dev->kobj, KOBJ_ADD);
|
|
bus_probe_device(dev);
|
|
if (parent)
|
|
klist_add_tail(&dev->p->knode_parent,
|
|
&parent->p->klist_children);
|
|
|
|
if (dev->class) {
|
|
mutex_lock(&dev->class->p->mutex);
|
|
/* tie the class to the device */
|
|
klist_add_tail(&dev->knode_class,
|
|
&dev->class->p->klist_devices);
|
|
|
|
/* notify any interfaces that the device is here */
|
|
list_for_each_entry(class_intf,
|
|
&dev->class->p->interfaces, node)
|
|
if (class_intf->add_dev)
|
|
class_intf->add_dev(dev, class_intf);
|
|
mutex_unlock(&dev->class->p->mutex);
|
|
}
|
|
done:
|
|
put_device(dev);
|
|
return error;
|
|
DPMError:
|
|
bus_remove_device(dev);
|
|
BusError:
|
|
device_remove_attrs(dev);
|
|
AttrsError:
|
|
device_remove_class_symlinks(dev);
|
|
SymlinkError:
|
|
if (MAJOR(dev->devt))
|
|
devtmpfs_delete_node(dev);
|
|
if (MAJOR(dev->devt))
|
|
device_remove_sys_dev_entry(dev);
|
|
devtattrError:
|
|
if (MAJOR(dev->devt))
|
|
device_remove_file(dev, &devt_attr);
|
|
ueventattrError:
|
|
device_remove_file(dev, &uevent_attr);
|
|
attrError:
|
|
kobject_uevent(&dev->kobj, KOBJ_REMOVE);
|
|
kobject_del(&dev->kobj);
|
|
Error:
|
|
cleanup_device_parent(dev);
|
|
if (parent)
|
|
put_device(parent);
|
|
name_error:
|
|
kfree(dev->p);
|
|
dev->p = NULL;
|
|
goto done;
|
|
}
|
|
|
|
/**
|
|
* device_register - register a device with the system.
|
|
* @dev: pointer to the device structure
|
|
*
|
|
* This happens in two clean steps - initialize the device
|
|
* and add it to the system. The two steps can be called
|
|
* separately, but this is the easiest and most common.
|
|
* I.e. you should only call the two helpers separately if
|
|
* have a clearly defined need to use and refcount the device
|
|
* before it is added to the hierarchy.
|
|
*
|
|
* For more information, see the kerneldoc for device_initialize()
|
|
* and device_add().
|
|
*
|
|
* NOTE: _Never_ directly free @dev after calling this function, even
|
|
* if it returned an error! Always use put_device() to give up the
|
|
* reference initialized in this function instead.
|
|
*/
|
|
int device_register(struct device *dev)
|
|
{
|
|
device_initialize(dev);
|
|
return device_add(dev);
|
|
}
|
|
|
|
/**
|
|
* get_device - increment reference count for device.
|
|
* @dev: device.
|
|
*
|
|
* This simply forwards the call to kobject_get(), though
|
|
* we do take care to provide for the case that we get a NULL
|
|
* pointer passed in.
|
|
*/
|
|
struct device *get_device(struct device *dev)
|
|
{
|
|
return dev ? kobj_to_dev(kobject_get(&dev->kobj)) : NULL;
|
|
}
|
|
|
|
/**
|
|
* put_device - decrement reference count.
|
|
* @dev: device in question.
|
|
*/
|
|
void put_device(struct device *dev)
|
|
{
|
|
/* might_sleep(); */
|
|
if (dev)
|
|
kobject_put(&dev->kobj);
|
|
}
|
|
|
|
/**
|
|
* device_del - delete device from system.
|
|
* @dev: device.
|
|
*
|
|
* This is the first part of the device unregistration
|
|
* sequence. This removes the device from the lists we control
|
|
* from here, has it removed from the other driver model
|
|
* subsystems it was added to in device_add(), and removes it
|
|
* from the kobject hierarchy.
|
|
*
|
|
* NOTE: this should be called manually _iff_ device_add() was
|
|
* also called manually.
|
|
*/
|
|
void device_del(struct device *dev)
|
|
{
|
|
struct device *parent = dev->parent;
|
|
struct class_interface *class_intf;
|
|
|
|
/* Notify clients of device removal. This call must come
|
|
* before dpm_sysfs_remove().
|
|
*/
|
|
if (dev->bus)
|
|
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
|
BUS_NOTIFY_DEL_DEVICE, dev);
|
|
dpm_sysfs_remove(dev);
|
|
if (parent)
|
|
klist_del(&dev->p->knode_parent);
|
|
if (MAJOR(dev->devt)) {
|
|
devtmpfs_delete_node(dev);
|
|
device_remove_sys_dev_entry(dev);
|
|
device_remove_file(dev, &devt_attr);
|
|
}
|
|
if (dev->class) {
|
|
device_remove_class_symlinks(dev);
|
|
|
|
mutex_lock(&dev->class->p->mutex);
|
|
/* notify any interfaces that the device is now gone */
|
|
list_for_each_entry(class_intf,
|
|
&dev->class->p->interfaces, node)
|
|
if (class_intf->remove_dev)
|
|
class_intf->remove_dev(dev, class_intf);
|
|
/* remove the device from the class list */
|
|
klist_del(&dev->knode_class);
|
|
mutex_unlock(&dev->class->p->mutex);
|
|
}
|
|
device_remove_file(dev, &uevent_attr);
|
|
device_remove_attrs(dev);
|
|
bus_remove_device(dev);
|
|
device_pm_remove(dev);
|
|
driver_deferred_probe_del(dev);
|
|
|
|
/* Notify the platform of the removal, in case they
|
|
* need to do anything...
|
|
*/
|
|
if (platform_notify_remove)
|
|
platform_notify_remove(dev);
|
|
kobject_uevent(&dev->kobj, KOBJ_REMOVE);
|
|
cleanup_device_parent(dev);
|
|
kobject_del(&dev->kobj);
|
|
put_device(parent);
|
|
}
|
|
|
|
/**
|
|
* device_unregister - unregister device from system.
|
|
* @dev: device going away.
|
|
*
|
|
* We do this in two parts, like we do device_register(). First,
|
|
* we remove it from all the subsystems with device_del(), then
|
|
* we decrement the reference count via put_device(). If that
|
|
* is the final reference count, the device will be cleaned up
|
|
* via device_release() above. Otherwise, the structure will
|
|
* stick around until the final reference to the device is dropped.
|
|
*/
|
|
void device_unregister(struct device *dev)
|
|
{
|
|
pr_debug("device: '%s': %s\n", dev_name(dev), __func__);
|
|
device_del(dev);
|
|
put_device(dev);
|
|
}
|
|
|
|
static struct device *next_device(struct klist_iter *i)
|
|
{
|
|
struct klist_node *n = klist_next(i);
|
|
struct device *dev = NULL;
|
|
struct device_private *p;
|
|
|
|
if (n) {
|
|
p = to_device_private_parent(n);
|
|
dev = p->device;
|
|
}
|
|
return dev;
|
|
}
|
|
|
|
/**
|
|
* device_get_devnode - path of device node file
|
|
* @dev: device
|
|
* @mode: returned file access mode
|
|
* @uid: returned file owner
|
|
* @gid: returned file group
|
|
* @tmp: possibly allocated string
|
|
*
|
|
* Return the relative path of a possible device node.
|
|
* Non-default names may need to allocate a memory to compose
|
|
* a name. This memory is returned in tmp and needs to be
|
|
* freed by the caller.
|
|
*/
|
|
const char *device_get_devnode(struct device *dev,
|
|
umode_t *mode, kuid_t *uid, kgid_t *gid,
|
|
const char **tmp)
|
|
{
|
|
char *s;
|
|
|
|
*tmp = NULL;
|
|
|
|
/* the device type may provide a specific name */
|
|
if (dev->type && dev->type->devnode)
|
|
*tmp = dev->type->devnode(dev, mode, uid, gid);
|
|
if (*tmp)
|
|
return *tmp;
|
|
|
|
/* the class may provide a specific name */
|
|
if (dev->class && dev->class->devnode)
|
|
*tmp = dev->class->devnode(dev, mode);
|
|
if (*tmp)
|
|
return *tmp;
|
|
|
|
/* return name without allocation, tmp == NULL */
|
|
if (strchr(dev_name(dev), '!') == NULL)
|
|
return dev_name(dev);
|
|
|
|
/* replace '!' in the name with '/' */
|
|
*tmp = kstrdup(dev_name(dev), GFP_KERNEL);
|
|
if (!*tmp)
|
|
return NULL;
|
|
while ((s = strchr(*tmp, '!')))
|
|
s[0] = '/';
|
|
return *tmp;
|
|
}
|
|
|
|
/**
|
|
* device_for_each_child - device child iterator.
|
|
* @parent: parent struct device.
|
|
* @data: data for the callback.
|
|
* @fn: function to be called for each device.
|
|
*
|
|
* Iterate over @parent's child devices, and call @fn for each,
|
|
* passing it @data.
|
|
*
|
|
* We check the return of @fn each time. If it returns anything
|
|
* other than 0, we break out and return that value.
|
|
*/
|
|
int device_for_each_child(struct device *parent, void *data,
|
|
int (*fn)(struct device *dev, void *data))
|
|
{
|
|
struct klist_iter i;
|
|
struct device *child;
|
|
int error = 0;
|
|
|
|
if (!parent->p)
|
|
return 0;
|
|
|
|
klist_iter_init(&parent->p->klist_children, &i);
|
|
while ((child = next_device(&i)) && !error)
|
|
error = fn(child, data);
|
|
klist_iter_exit(&i);
|
|
return error;
|
|
}
|
|
|
|
/**
|
|
* device_find_child - device iterator for locating a particular device.
|
|
* @parent: parent struct device
|
|
* @data: Data to pass to match function
|
|
* @match: Callback function to check device
|
|
*
|
|
* This is similar to the device_for_each_child() function above, but it
|
|
* returns a reference to a device that is 'found' for later use, as
|
|
* determined by the @match callback.
|
|
*
|
|
* The callback should return 0 if the device doesn't match and non-zero
|
|
* if it does. If the callback returns non-zero and a reference to the
|
|
* current device can be obtained, this function will return to the caller
|
|
* and not iterate over any more devices.
|
|
*/
|
|
struct device *device_find_child(struct device *parent, void *data,
|
|
int (*match)(struct device *dev, void *data))
|
|
{
|
|
struct klist_iter i;
|
|
struct device *child;
|
|
|
|
if (!parent)
|
|
return NULL;
|
|
|
|
klist_iter_init(&parent->p->klist_children, &i);
|
|
while ((child = next_device(&i)))
|
|
if (match(child, data) && get_device(child))
|
|
break;
|
|
klist_iter_exit(&i);
|
|
return child;
|
|
}
|
|
|
|
int __init devices_init(void)
|
|
{
|
|
devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL);
|
|
if (!devices_kset)
|
|
return -ENOMEM;
|
|
dev_kobj = kobject_create_and_add("dev", NULL);
|
|
if (!dev_kobj)
|
|
goto dev_kobj_err;
|
|
sysfs_dev_block_kobj = kobject_create_and_add("block", dev_kobj);
|
|
if (!sysfs_dev_block_kobj)
|
|
goto block_kobj_err;
|
|
sysfs_dev_char_kobj = kobject_create_and_add("char", dev_kobj);
|
|
if (!sysfs_dev_char_kobj)
|
|
goto char_kobj_err;
|
|
|
|
return 0;
|
|
|
|
char_kobj_err:
|
|
kobject_put(sysfs_dev_block_kobj);
|
|
block_kobj_err:
|
|
kobject_put(dev_kobj);
|
|
dev_kobj_err:
|
|
kset_unregister(devices_kset);
|
|
return -ENOMEM;
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(device_for_each_child);
|
|
EXPORT_SYMBOL_GPL(device_find_child);
|
|
|
|
EXPORT_SYMBOL_GPL(device_initialize);
|
|
EXPORT_SYMBOL_GPL(device_add);
|
|
EXPORT_SYMBOL_GPL(device_register);
|
|
|
|
EXPORT_SYMBOL_GPL(device_del);
|
|
EXPORT_SYMBOL_GPL(device_unregister);
|
|
EXPORT_SYMBOL_GPL(get_device);
|
|
EXPORT_SYMBOL_GPL(put_device);
|
|
|
|
EXPORT_SYMBOL_GPL(device_create_file);
|
|
EXPORT_SYMBOL_GPL(device_remove_file);
|
|
|
|
struct root_device {
|
|
struct device dev;
|
|
struct module *owner;
|
|
};
|
|
|
|
static inline struct root_device *to_root_device(struct device *d)
|
|
{
|
|
return container_of(d, struct root_device, dev);
|
|
}
|
|
|
|
static void root_device_release(struct device *dev)
|
|
{
|
|
kfree(to_root_device(dev));
|
|
}
|
|
|
|
/**
|
|
* __root_device_register - allocate and register a root device
|
|
* @name: root device name
|
|
* @owner: owner module of the root device, usually THIS_MODULE
|
|
*
|
|
* This function allocates a root device and registers it
|
|
* using device_register(). In order to free the returned
|
|
* device, use root_device_unregister().
|
|
*
|
|
* Root devices are dummy devices which allow other devices
|
|
* to be grouped under /sys/devices. Use this function to
|
|
* allocate a root device and then use it as the parent of
|
|
* any device which should appear under /sys/devices/{name}
|
|
*
|
|
* The /sys/devices/{name} directory will also contain a
|
|
* 'module' symlink which points to the @owner directory
|
|
* in sysfs.
|
|
*
|
|
* Returns &struct device pointer on success, or ERR_PTR() on error.
|
|
*
|
|
* Note: You probably want to use root_device_register().
|
|
*/
|
|
struct device *__root_device_register(const char *name, struct module *owner)
|
|
{
|
|
struct root_device *root;
|
|
int err = -ENOMEM;
|
|
|
|
root = kzalloc(sizeof(struct root_device), GFP_KERNEL);
|
|
if (!root)
|
|
return ERR_PTR(err);
|
|
|
|
err = dev_set_name(&root->dev, "%s", name);
|
|
if (err) {
|
|
kfree(root);
|
|
return ERR_PTR(err);
|
|
}
|
|
|
|
root->dev.release = root_device_release;
|
|
|
|
err = device_register(&root->dev);
|
|
if (err) {
|
|
put_device(&root->dev);
|
|
return ERR_PTR(err);
|
|
}
|
|
|
|
#ifdef CONFIG_MODULES /* gotta find a "cleaner" way to do this */
|
|
if (owner) {
|
|
struct module_kobject *mk = &owner->mkobj;
|
|
|
|
err = sysfs_create_link(&root->dev.kobj, &mk->kobj, "module");
|
|
if (err) {
|
|
device_unregister(&root->dev);
|
|
return ERR_PTR(err);
|
|
}
|
|
root->owner = owner;
|
|
}
|
|
#endif
|
|
|
|
return &root->dev;
|
|
}
|
|
EXPORT_SYMBOL_GPL(__root_device_register);
|
|
|
|
/**
|
|
* root_device_unregister - unregister and free a root device
|
|
* @dev: device going away
|
|
*
|
|
* This function unregisters and cleans up a device that was created by
|
|
* root_device_register().
|
|
*/
|
|
void root_device_unregister(struct device *dev)
|
|
{
|
|
struct root_device *root = to_root_device(dev);
|
|
|
|
if (root->owner)
|
|
sysfs_remove_link(&root->dev.kobj, "module");
|
|
|
|
device_unregister(dev);
|
|
}
|
|
EXPORT_SYMBOL_GPL(root_device_unregister);
|
|
|
|
|
|
static void device_create_release(struct device *dev)
|
|
{
|
|
pr_debug("device: '%s': %s\n", dev_name(dev), __func__);
|
|
kfree(dev);
|
|
}
|
|
|
|
/**
|
|
* device_create_vargs - creates a device and registers it with sysfs
|
|
* @class: pointer to the struct class that this device should be registered to
|
|
* @parent: pointer to the parent struct device of this new device, if any
|
|
* @devt: the dev_t for the char device to be added
|
|
* @drvdata: the data to be added to the device for callbacks
|
|
* @fmt: string for the device's name
|
|
* @args: va_list for the device's name
|
|
*
|
|
* This function can be used by char device classes. A struct device
|
|
* will be created in sysfs, registered to the specified class.
|
|
*
|
|
* A "dev" file will be created, showing the dev_t for the device, if
|
|
* the dev_t is not 0,0.
|
|
* If a pointer to a parent struct device is passed in, the newly created
|
|
* struct device will be a child of that device in sysfs.
|
|
* The pointer to the struct device will be returned from the call.
|
|
* Any further sysfs files that might be required can be created using this
|
|
* pointer.
|
|
*
|
|
* Returns &struct device pointer on success, or ERR_PTR() on error.
|
|
*
|
|
* Note: the struct class passed to this function must have previously
|
|
* been created with a call to class_create().
|
|
*/
|
|
struct device *device_create_vargs(struct class *class, struct device *parent,
|
|
dev_t devt, void *drvdata, const char *fmt,
|
|
va_list args)
|
|
{
|
|
struct device *dev = NULL;
|
|
int retval = -ENODEV;
|
|
|
|
if (class == NULL || IS_ERR(class))
|
|
goto error;
|
|
|
|
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
|
if (!dev) {
|
|
retval = -ENOMEM;
|
|
goto error;
|
|
}
|
|
|
|
dev->devt = devt;
|
|
dev->class = class;
|
|
dev->parent = parent;
|
|
dev->release = device_create_release;
|
|
dev_set_drvdata(dev, drvdata);
|
|
|
|
retval = kobject_set_name_vargs(&dev->kobj, fmt, args);
|
|
if (retval)
|
|
goto error;
|
|
|
|
retval = device_register(dev);
|
|
if (retval)
|
|
goto error;
|
|
|
|
return dev;
|
|
|
|
error:
|
|
put_device(dev);
|
|
return ERR_PTR(retval);
|
|
}
|
|
EXPORT_SYMBOL_GPL(device_create_vargs);
|
|
|
|
/**
|
|
* device_create - creates a device and registers it with sysfs
|
|
* @class: pointer to the struct class that this device should be registered to
|
|
* @parent: pointer to the parent struct device of this new device, if any
|
|
* @devt: the dev_t for the char device to be added
|
|
* @drvdata: the data to be added to the device for callbacks
|
|
* @fmt: string for the device's name
|
|
*
|
|
* This function can be used by char device classes. A struct device
|
|
* will be created in sysfs, registered to the specified class.
|
|
*
|
|
* A "dev" file will be created, showing the dev_t for the device, if
|
|
* the dev_t is not 0,0.
|
|
* If a pointer to a parent struct device is passed in, the newly created
|
|
* struct device will be a child of that device in sysfs.
|
|
* The pointer to the struct device will be returned from the call.
|
|
* Any further sysfs files that might be required can be created using this
|
|
* pointer.
|
|
*
|
|
* Returns &struct device pointer on success, or ERR_PTR() on error.
|
|
*
|
|
* Note: the struct class passed to this function must have previously
|
|
* been created with a call to class_create().
|
|
*/
|
|
struct device *device_create(struct class *class, struct device *parent,
|
|
dev_t devt, void *drvdata, const char *fmt, ...)
|
|
{
|
|
va_list vargs;
|
|
struct device *dev;
|
|
|
|
va_start(vargs, fmt);
|
|
dev = device_create_vargs(class, parent, devt, drvdata, fmt, vargs);
|
|
va_end(vargs);
|
|
return dev;
|
|
}
|
|
EXPORT_SYMBOL_GPL(device_create);
|
|
|
|
static int __match_devt(struct device *dev, const void *data)
|
|
{
|
|
const dev_t *devt = data;
|
|
|
|
return dev->devt == *devt;
|
|
}
|
|
|
|
/**
|
|
* device_destroy - removes a device that was created with device_create()
|
|
* @class: pointer to the struct class that this device was registered with
|
|
* @devt: the dev_t of the device that was previously registered
|
|
*
|
|
* This call unregisters and cleans up a device that was created with a
|
|
* call to device_create().
|
|
*/
|
|
void device_destroy(struct class *class, dev_t devt)
|
|
{
|
|
struct device *dev;
|
|
|
|
dev = class_find_device(class, NULL, &devt, __match_devt);
|
|
if (dev) {
|
|
put_device(dev);
|
|
device_unregister(dev);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(device_destroy);
|
|
|
|
/**
|
|
* device_rename - renames a device
|
|
* @dev: the pointer to the struct device to be renamed
|
|
* @new_name: the new name of the device
|
|
*
|
|
* It is the responsibility of the caller to provide mutual
|
|
* exclusion between two different calls of device_rename
|
|
* on the same device to ensure that new_name is valid and
|
|
* won't conflict with other devices.
|
|
*
|
|
* Note: Don't call this function. Currently, the networking layer calls this
|
|
* function, but that will change. The following text from Kay Sievers offers
|
|
* some insight:
|
|
*
|
|
* Renaming devices is racy at many levels, symlinks and other stuff are not
|
|
* replaced atomically, and you get a "move" uevent, but it's not easy to
|
|
* connect the event to the old and new device. Device nodes are not renamed at
|
|
* all, there isn't even support for that in the kernel now.
|
|
*
|
|
* In the meantime, during renaming, your target name might be taken by another
|
|
* driver, creating conflicts. Or the old name is taken directly after you
|
|
* renamed it -- then you get events for the same DEVPATH, before you even see
|
|
* the "move" event. It's just a mess, and nothing new should ever rely on
|
|
* kernel device renaming. Besides that, it's not even implemented now for
|
|
* other things than (driver-core wise very simple) network devices.
|
|
*
|
|
* We are currently about to change network renaming in udev to completely
|
|
* disallow renaming of devices in the same namespace as the kernel uses,
|
|
* because we can't solve the problems properly, that arise with swapping names
|
|
* of multiple interfaces without races. Means, renaming of eth[0-9]* will only
|
|
* be allowed to some other name than eth[0-9]*, for the aforementioned
|
|
* reasons.
|
|
*
|
|
* Make up a "real" name in the driver before you register anything, or add
|
|
* some other attributes for userspace to find the device, or use udev to add
|
|
* symlinks -- but never rename kernel devices later, it's a complete mess. We
|
|
* don't even want to get into that and try to implement the missing pieces in
|
|
* the core. We really have other pieces to fix in the driver core mess. :)
|
|
*/
|
|
int device_rename(struct device *dev, const char *new_name)
|
|
{
|
|
char *old_device_name = NULL;
|
|
int error;
|
|
|
|
dev = get_device(dev);
|
|
if (!dev)
|
|
return -EINVAL;
|
|
|
|
pr_debug("device: '%s': %s: renaming to '%s'\n", dev_name(dev),
|
|
__func__, new_name);
|
|
|
|
old_device_name = kstrdup(dev_name(dev), GFP_KERNEL);
|
|
if (!old_device_name) {
|
|
error = -ENOMEM;
|
|
goto out;
|
|
}
|
|
|
|
if (dev->class) {
|
|
error = sysfs_rename_link(&dev->class->p->subsys.kobj,
|
|
&dev->kobj, old_device_name, new_name);
|
|
if (error)
|
|
goto out;
|
|
}
|
|
|
|
error = kobject_rename(&dev->kobj, new_name);
|
|
if (error)
|
|
goto out;
|
|
|
|
out:
|
|
put_device(dev);
|
|
|
|
kfree(old_device_name);
|
|
|
|
return error;
|
|
}
|
|
EXPORT_SYMBOL_GPL(device_rename);
|
|
|
|
static int device_move_class_links(struct device *dev,
|
|
struct device *old_parent,
|
|
struct device *new_parent)
|
|
{
|
|
int error = 0;
|
|
|
|
if (old_parent)
|
|
sysfs_remove_link(&dev->kobj, "device");
|
|
if (new_parent)
|
|
error = sysfs_create_link(&dev->kobj, &new_parent->kobj,
|
|
"device");
|
|
return error;
|
|
}
|
|
|
|
/**
|
|
* device_move - moves a device to a new parent
|
|
* @dev: the pointer to the struct device to be moved
|
|
* @new_parent: the new parent of the device (can by NULL)
|
|
* @dpm_order: how to reorder the dpm_list
|
|
*/
|
|
int device_move(struct device *dev, struct device *new_parent,
|
|
enum dpm_order dpm_order)
|
|
{
|
|
int error;
|
|
struct device *old_parent;
|
|
struct kobject *new_parent_kobj;
|
|
|
|
dev = get_device(dev);
|
|
if (!dev)
|
|
return -EINVAL;
|
|
|
|
device_pm_lock();
|
|
new_parent = get_device(new_parent);
|
|
new_parent_kobj = get_device_parent(dev, new_parent);
|
|
|
|
pr_debug("device: '%s': %s: moving to '%s'\n", dev_name(dev),
|
|
__func__, new_parent ? dev_name(new_parent) : "<NULL>");
|
|
error = kobject_move(&dev->kobj, new_parent_kobj);
|
|
if (error) {
|
|
cleanup_glue_dir(dev, new_parent_kobj);
|
|
put_device(new_parent);
|
|
goto out;
|
|
}
|
|
old_parent = dev->parent;
|
|
dev->parent = new_parent;
|
|
if (old_parent)
|
|
klist_remove(&dev->p->knode_parent);
|
|
if (new_parent) {
|
|
klist_add_tail(&dev->p->knode_parent,
|
|
&new_parent->p->klist_children);
|
|
set_dev_node(dev, dev_to_node(new_parent));
|
|
}
|
|
|
|
if (dev->class) {
|
|
error = device_move_class_links(dev, old_parent, new_parent);
|
|
if (error) {
|
|
/* We ignore errors on cleanup since we're hosed anyway... */
|
|
device_move_class_links(dev, new_parent, old_parent);
|
|
if (!kobject_move(&dev->kobj, &old_parent->kobj)) {
|
|
if (new_parent)
|
|
klist_remove(&dev->p->knode_parent);
|
|
dev->parent = old_parent;
|
|
if (old_parent) {
|
|
klist_add_tail(&dev->p->knode_parent,
|
|
&old_parent->p->klist_children);
|
|
set_dev_node(dev, dev_to_node(old_parent));
|
|
}
|
|
}
|
|
cleanup_glue_dir(dev, new_parent_kobj);
|
|
put_device(new_parent);
|
|
goto out;
|
|
}
|
|
}
|
|
switch (dpm_order) {
|
|
case DPM_ORDER_NONE:
|
|
break;
|
|
case DPM_ORDER_DEV_AFTER_PARENT:
|
|
device_pm_move_after(dev, new_parent);
|
|
break;
|
|
case DPM_ORDER_PARENT_BEFORE_DEV:
|
|
device_pm_move_before(new_parent, dev);
|
|
break;
|
|
case DPM_ORDER_DEV_LAST:
|
|
device_pm_move_last(dev);
|
|
break;
|
|
}
|
|
|
|
put_device(old_parent);
|
|
out:
|
|
device_pm_unlock();
|
|
put_device(dev);
|
|
return error;
|
|
}
|
|
EXPORT_SYMBOL_GPL(device_move);
|
|
|
|
/**
|
|
* device_shutdown - call ->shutdown() on each device to shutdown.
|
|
*/
|
|
void device_shutdown(void)
|
|
{
|
|
struct device *dev, *parent;
|
|
|
|
spin_lock(&devices_kset->list_lock);
|
|
/*
|
|
* Walk the devices list backward, shutting down each in turn.
|
|
* Beware that device unplug events may also start pulling
|
|
* devices offline, even as the system is shutting down.
|
|
*/
|
|
while (!list_empty(&devices_kset->list)) {
|
|
dev = list_entry(devices_kset->list.prev, struct device,
|
|
kobj.entry);
|
|
|
|
/*
|
|
* hold reference count of device's parent to
|
|
* prevent it from being freed because parent's
|
|
* lock is to be held
|
|
*/
|
|
parent = get_device(dev->parent);
|
|
get_device(dev);
|
|
/*
|
|
* Make sure the device is off the kset list, in the
|
|
* event that dev->*->shutdown() doesn't remove it.
|
|
*/
|
|
list_del_init(&dev->kobj.entry);
|
|
spin_unlock(&devices_kset->list_lock);
|
|
|
|
/* hold lock to avoid race with probe/release */
|
|
if (parent)
|
|
device_lock(parent);
|
|
device_lock(dev);
|
|
|
|
/* Don't allow any more runtime suspends */
|
|
pm_runtime_get_noresume(dev);
|
|
pm_runtime_barrier(dev);
|
|
|
|
if (dev->bus && dev->bus->shutdown) {
|
|
if (initcall_debug)
|
|
dev_info(dev, "shutdown\n");
|
|
dev->bus->shutdown(dev);
|
|
} else if (dev->driver && dev->driver->shutdown) {
|
|
if (initcall_debug)
|
|
dev_info(dev, "shutdown\n");
|
|
dev->driver->shutdown(dev);
|
|
}
|
|
|
|
device_unlock(dev);
|
|
if (parent)
|
|
device_unlock(parent);
|
|
|
|
put_device(dev);
|
|
put_device(parent);
|
|
|
|
spin_lock(&devices_kset->list_lock);
|
|
}
|
|
spin_unlock(&devices_kset->list_lock);
|
|
async_synchronize_full();
|
|
}
|
|
|
|
/*
|
|
* Device logging functions
|
|
*/
|
|
|
|
#ifdef CONFIG_PRINTK
|
|
static int
|
|
create_syslog_header(const struct device *dev, char *hdr, size_t hdrlen)
|
|
{
|
|
const char *subsys;
|
|
size_t pos = 0;
|
|
|
|
if (dev->class)
|
|
subsys = dev->class->name;
|
|
else if (dev->bus)
|
|
subsys = dev->bus->name;
|
|
else
|
|
return 0;
|
|
|
|
pos += snprintf(hdr + pos, hdrlen - pos, "SUBSYSTEM=%s", subsys);
|
|
|
|
/*
|
|
* Add device identifier DEVICE=:
|
|
* b12:8 block dev_t
|
|
* c127:3 char dev_t
|
|
* n8 netdev ifindex
|
|
* +sound:card0 subsystem:devname
|
|
*/
|
|
if (MAJOR(dev->devt)) {
|
|
char c;
|
|
|
|
if (strcmp(subsys, "block") == 0)
|
|
c = 'b';
|
|
else
|
|
c = 'c';
|
|
pos++;
|
|
pos += snprintf(hdr + pos, hdrlen - pos,
|
|
"DEVICE=%c%u:%u",
|
|
c, MAJOR(dev->devt), MINOR(dev->devt));
|
|
} else if (strcmp(subsys, "net") == 0) {
|
|
struct net_device *net = to_net_dev(dev);
|
|
|
|
pos++;
|
|
pos += snprintf(hdr + pos, hdrlen - pos,
|
|
"DEVICE=n%u", net->ifindex);
|
|
} else {
|
|
pos++;
|
|
pos += snprintf(hdr + pos, hdrlen - pos,
|
|
"DEVICE=+%s:%s", subsys, dev_name(dev));
|
|
}
|
|
|
|
return pos;
|
|
}
|
|
EXPORT_SYMBOL(create_syslog_header);
|
|
|
|
int dev_vprintk_emit(int level, const struct device *dev,
|
|
const char *fmt, va_list args)
|
|
{
|
|
char hdr[128];
|
|
size_t hdrlen;
|
|
|
|
hdrlen = create_syslog_header(dev, hdr, sizeof(hdr));
|
|
|
|
return vprintk_emit(0, level, hdrlen ? hdr : NULL, hdrlen, fmt, args);
|
|
}
|
|
EXPORT_SYMBOL(dev_vprintk_emit);
|
|
|
|
int dev_printk_emit(int level, const struct device *dev, const char *fmt, ...)
|
|
{
|
|
va_list args;
|
|
int r;
|
|
|
|
va_start(args, fmt);
|
|
|
|
r = dev_vprintk_emit(level, dev, fmt, args);
|
|
|
|
va_end(args);
|
|
|
|
return r;
|
|
}
|
|
EXPORT_SYMBOL(dev_printk_emit);
|
|
|
|
static int __dev_printk(const char *level, const struct device *dev,
|
|
struct va_format *vaf)
|
|
{
|
|
if (!dev)
|
|
return printk("%s(NULL device *): %pV", level, vaf);
|
|
|
|
return dev_printk_emit(level[1] - '0', dev,
|
|
"%s %s: %pV",
|
|
dev_driver_string(dev), dev_name(dev), vaf);
|
|
}
|
|
|
|
int dev_printk(const char *level, const struct device *dev,
|
|
const char *fmt, ...)
|
|
{
|
|
struct va_format vaf;
|
|
va_list args;
|
|
int r;
|
|
|
|
va_start(args, fmt);
|
|
|
|
vaf.fmt = fmt;
|
|
vaf.va = &args;
|
|
|
|
r = __dev_printk(level, dev, &vaf);
|
|
|
|
va_end(args);
|
|
|
|
return r;
|
|
}
|
|
EXPORT_SYMBOL(dev_printk);
|
|
|
|
#define define_dev_printk_level(func, kern_level) \
|
|
int func(const struct device *dev, const char *fmt, ...) \
|
|
{ \
|
|
struct va_format vaf; \
|
|
va_list args; \
|
|
int r; \
|
|
\
|
|
va_start(args, fmt); \
|
|
\
|
|
vaf.fmt = fmt; \
|
|
vaf.va = &args; \
|
|
\
|
|
r = __dev_printk(kern_level, dev, &vaf); \
|
|
\
|
|
va_end(args); \
|
|
\
|
|
return r; \
|
|
} \
|
|
EXPORT_SYMBOL(func);
|
|
|
|
define_dev_printk_level(dev_emerg, KERN_EMERG);
|
|
define_dev_printk_level(dev_alert, KERN_ALERT);
|
|
define_dev_printk_level(dev_crit, KERN_CRIT);
|
|
define_dev_printk_level(dev_err, KERN_ERR);
|
|
define_dev_printk_level(dev_warn, KERN_WARNING);
|
|
define_dev_printk_level(dev_notice, KERN_NOTICE);
|
|
define_dev_printk_level(_dev_info, KERN_INFO);
|
|
|
|
#endif
|