OSDN Git Service

Merge 4.4.154 into android-4.4-p
authorGreg Kroah-Hartman <gregkh@google.com>
Wed, 5 Sep 2018 09:37:57 +0000 (11:37 +0200)
committerGreg Kroah-Hartman <gregkh@google.com>
Wed, 5 Sep 2018 09:37:57 +0000 (11:37 +0200)
Changes in 4.4.154
sched/sysctl: Check user input value of sysctl_sched_time_avg
Cipso: cipso_v4_optptr enter infinite loop
vti6: fix PMTU caching and reporting on xmit
xfrm: fix missing dst_release() after policy blocking lbcast and multicast
xfrm: free skb if nlsk pointer is NULL
mac80211: add stations tied to AP_VLANs during hw reconfig
nl80211: Add a missing break in parse_station_flags
drm/bridge: adv7511: Reset registers on hotplug
scsi: libiscsi: fix possible NULL pointer dereference in case of TMF
drm/imx: imx-ldb: disable LDB on driver bind
drm/imx: imx-ldb: check if channel is enabled before printing warning
usb: gadget: r8a66597: Fix two possible sleep-in-atomic-context bugs in init_controller()
usb: gadget: r8a66597: Fix a possible sleep-in-atomic-context bugs in r8a66597_queue()
usb/phy: fix PPC64 build errors in phy-fsl-usb.c
tools: usb: ffs-test: Fix build on big endian systems
usb: gadget: f_uac2: fix endianness of 'struct cntrl_*_lay3'
tools/power turbostat: fix -S on UP systems
net: caif: Add a missing rcu_read_unlock() in caif_flow_cb
qed: Fix possible race for the link state value.
atl1c: reserve min skb headroom
net: prevent ISA drivers from building on PPC32
can: mpc5xxx_can: check of_iomap return before use
i2c: davinci: Avoid zero value of CLKH
media: staging: omap4iss: Include asm/cacheflush.h after generic includes
bnx2x: Fix invalid memory access in rss hash config path.
net: axienet: Fix double deregister of mdio
fscache: Allow cancelled operations to be enqueued
cachefiles: Fix refcounting bug in backing-file read monitoring
cachefiles: Wait rather than BUG'ing on "Unexpected object collision"
selftests/ftrace: Add snapshot and tracing_on test case
zswap: re-check zswap_is_full() after do zswap_shrink()
tools/power turbostat: Read extended processor family from CPUID
Revert "MIPS: BCM47XX: Enable 74K Core ExternalSync for PCIe erratum"
enic: handle mtu change for vf properly
arc: fix build errors in arc/include/asm/delay.h
arc: fix type warnings in arc/mm/cache.c
drivers: net: lmc: fix case value for target abort error
scsi: fcoe: drop frames in ELS LOGO error path
scsi: vmw_pvscsi: Return DID_RESET for status SAM_STAT_COMMAND_TERMINATED
mm/memory.c: check return value of ioremap_prot
cifs: add missing debug entries for kconfig options
cifs: check kmalloc before use
smb3: Do not send SMB3 SET_INFO if nothing changed
smb3: don't request leases in symlink creation and query
btrfs: don't leak ret from do_chunk_alloc
s390/kvm: fix deadlock when killed by oom
ext4: check for NUL characters in extended attribute's name
ext4: sysfs: print ext4_super_block fields as little-endian
ext4: reset error code in ext4_find_entry in fallback
arm64: mm: check for upper PAGE_SHIFT bits in pfn_valid()
KVM: arm/arm64: Skip updating PTE entry if no change
KVM: arm/arm64: Skip updating PMD entry if no change
x86/speculation/l1tf: Fix overflow in l1tf_pfn_limit() on 32bit
x86/speculation/l1tf: Fix off-by-one error when warning that system has too much RAM
x86/speculation/l1tf: Suggest what to do on systems with too much RAM
x86/process: Re-export start_thread()
fuse: Don't access pipe->buffers without pipe_lock()
fuse: fix double request_end()
fuse: fix unlocked access to processing queue
fuse: umount should wait for all requests
fuse: Fix oops at process_init_reply()
fuse: Add missed unlock_page() to fuse_readpages_fill()
udl-kms: change down_interruptible to down
udl-kms: handle allocation failure
udl-kms: fix crash due to uninitialized memory
ASoC: dpcm: don't merge format from invalid codec dai
ASoC: sirf: Fix potential NULL pointer dereference
pinctrl: freescale: off by one in imx1_pinconf_group_dbg_show()
x86/irqflags: Mark native_restore_fl extern inline
x86/spectre: Add missing family 6 check to microcode check
s390: fix br_r1_trampoline for machines without exrl
s390/qdio: reset old sbal_state flags
s390/pci: fix out of bounds access during irq setup
kprobes: Make list and blacklist root user read only
MIPS: Correct the 64-bit DSP accumulator register size
MIPS: lib: Provide MIPS64r6 __multi3() for GCC < 7
scsi: sysfs: Introduce sysfs_{un,}break_active_protection()
scsi: core: Avoid that SCSI device removal through sysfs triggers a deadlock
iscsi target: fix session creation failure handling
cdrom: Fix info leak/OOB read in cdrom_ioctl_drive_status
Linux 4.4.154

Change-Id: I1d173ebf72efb115b4889880cc2989b0ca7d751e
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
83 files changed:
Makefile
arch/arc/include/asm/delay.h
arch/arc/mm/cache.c
arch/arm/kvm/mmu.c
arch/arm64/mm/init.c
arch/mips/bcm47xx/setup.c
arch/mips/include/asm/mipsregs.h
arch/mips/include/asm/processor.h
arch/mips/kernel/ptrace.c
arch/mips/kernel/ptrace32.c
arch/mips/lib/multi3.c
arch/s390/include/asm/qdio.h
arch/s390/mm/fault.c
arch/s390/net/bpf_jit_comp.c
arch/s390/pci/pci.c
arch/x86/include/asm/irqflags.h
arch/x86/include/asm/processor.h
arch/x86/kernel/cpu/bugs.c
arch/x86/kernel/cpu/intel.c
arch/x86/kernel/process_64.c
arch/x86/mm/init.c
arch/x86/mm/mmap.c
drivers/cdrom/cdrom.c
drivers/gpu/drm/i2c/adv7511.c
drivers/gpu/drm/imx/imx-ldb.c
drivers/gpu/drm/udl/udl_fb.c
drivers/gpu/drm/udl/udl_main.c
drivers/i2c/busses/i2c-davinci.c
drivers/net/can/mscan/mpc5xxx_can.c
drivers/net/ethernet/3com/Kconfig
drivers/net/ethernet/amd/Kconfig
drivers/net/ethernet/atheros/atl1c/atl1c_main.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
drivers/net/ethernet/cirrus/Kconfig
drivers/net/ethernet/cisco/enic/enic_main.c
drivers/net/ethernet/qlogic/qed/qed_mcp.c
drivers/net/ethernet/xilinx/xilinx_axienet_mdio.c
drivers/net/wan/lmc/lmc_main.c
drivers/pinctrl/freescale/pinctrl-imx1-core.c
drivers/s390/cio/qdio_main.c
drivers/scsi/fcoe/fcoe_ctlr.c
drivers/scsi/libiscsi.c
drivers/scsi/scsi_sysfs.c
drivers/scsi/vmw_pvscsi.c
drivers/staging/media/omap4iss/iss_video.c
drivers/target/iscsi/iscsi_target_login.c
drivers/usb/gadget/function/f_uac2.c
drivers/usb/gadget/udc/r8a66597-udc.c
drivers/usb/phy/phy-fsl-usb.c
fs/btrfs/extent-tree.c
fs/cachefiles/namei.c
fs/cachefiles/rdwr.c
fs/cifs/cifs_debug.c
fs/cifs/inode.c
fs/cifs/link.c
fs/cifs/sess.c
fs/cifs/smb2inode.c
fs/ext4/namei.c
fs/ext4/sysfs.c
fs/ext4/xattr.c
fs/fscache/operation.c
fs/fuse/dev.c
fs/fuse/file.c
fs/fuse/fuse_i.h
fs/fuse/inode.c
fs/sysfs/file.c
include/linux/sysfs.h
kernel/kprobes.c
kernel/sysctl.c
mm/memory.c
mm/zswap.c
net/caif/caif_dev.c
net/ipv4/cipso_ipv4.c
net/ipv6/ip6_vti.c
net/mac80211/util.c
net/wireless/nl80211.c
net/xfrm/xfrm_policy.c
net/xfrm/xfrm_user.c
sound/soc/sirf/sirf-usp.c
sound/soc/soc-pcm.c
tools/power/x86/turbostat/turbostat.c
tools/testing/selftests/ftrace/test.d/00basic/snapshot.tc [new file with mode: 0644]
tools/usb/ffs-test.c

index 524701e..9540b58 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 4
 PATCHLEVEL = 4
-SUBLEVEL = 153
+SUBLEVEL = 154
 EXTRAVERSION =
 NAME = Blurry Fish Butt
 
index d5da211..03d6bb0 100644 (file)
 #ifndef __ASM_ARC_UDELAY_H
 #define __ASM_ARC_UDELAY_H
 
+#include <asm-generic/types.h>
 #include <asm/param.h>         /* HZ */
 
+extern unsigned long loops_per_jiffy;
+
 static inline void __delay(unsigned long loops)
 {
        __asm__ __volatile__(
index 9a84cbd..017fb44 100644 (file)
@@ -821,7 +821,7 @@ void flush_cache_mm(struct mm_struct *mm)
 void flush_cache_page(struct vm_area_struct *vma, unsigned long u_vaddr,
                      unsigned long pfn)
 {
-       unsigned int paddr = pfn << PAGE_SHIFT;
+       phys_addr_t paddr = pfn << PAGE_SHIFT;
 
        u_vaddr &= PAGE_MASK;
 
@@ -841,8 +841,9 @@ void flush_anon_page(struct vm_area_struct *vma, struct page *page,
                     unsigned long u_vaddr)
 {
        /* TBD: do we really need to clear the kernel mapping */
-       __flush_dcache_page(page_address(page), u_vaddr);
-       __flush_dcache_page(page_address(page), page_address(page));
+       __flush_dcache_page((phys_addr_t)page_address(page), u_vaddr);
+       __flush_dcache_page((phys_addr_t)page_address(page),
+                           (phys_addr_t)page_address(page));
 
 }
 
index e8835d4..e026753 100644 (file)
@@ -892,19 +892,35 @@ static int stage2_set_pmd_huge(struct kvm *kvm, struct kvm_mmu_memory_cache
        pmd = stage2_get_pmd(kvm, cache, addr);
        VM_BUG_ON(!pmd);
 
-       /*
-        * Mapping in huge pages should only happen through a fault.  If a
-        * page is merged into a transparent huge page, the individual
-        * subpages of that huge page should be unmapped through MMU
-        * notifiers before we get here.
-        *
-        * Merging of CompoundPages is not supported; they should become
-        * splitting first, unmapped, merged, and mapped back in on-demand.
-        */
-       VM_BUG_ON(pmd_present(*pmd) && pmd_pfn(*pmd) != pmd_pfn(*new_pmd));
-
        old_pmd = *pmd;
        if (pmd_present(old_pmd)) {
+               /*
+                * Multiple vcpus faulting on the same PMD entry, can
+                * lead to them sequentially updating the PMD with the
+                * same value. Following the break-before-make
+                * (pmd_clear() followed by tlb_flush()) process can
+                * hinder forward progress due to refaults generated
+                * on missing translations.
+                *
+                * Skip updating the page table if the entry is
+                * unchanged.
+                */
+               if (pmd_val(old_pmd) == pmd_val(*new_pmd))
+                       return 0;
+
+               /*
+                * Mapping in huge pages should only happen through a
+                * fault.  If a page is merged into a transparent huge
+                * page, the individual subpages of that huge page
+                * should be unmapped through MMU notifiers before we
+                * get here.
+                *
+                * Merging of CompoundPages is not supported; they
+                * should become splitting first, unmapped, merged,
+                * and mapped back in on-demand.
+                */
+               VM_BUG_ON(pmd_pfn(old_pmd) != pmd_pfn(*new_pmd));
+
                pmd_clear(pmd);
                kvm_tlb_flush_vmid_ipa(kvm, addr);
        } else {
@@ -961,6 +977,10 @@ static int stage2_set_pte(struct kvm *kvm, struct kvm_mmu_memory_cache *cache,
        /* Create 2nd stage page table mapping - Level 3 */
        old_pte = *pte;
        if (pte_present(old_pte)) {
+               /* Skip page table update if there is no change */
+               if (pte_val(old_pte) == pte_val(*new_pte))
+                       return 0;
+
                kvm_set_pte(pte, __pte(0));
                kvm_tlb_flush_vmid_ipa(kvm, addr);
        } else {
index c13a2c2..17393ba 100644 (file)
@@ -128,11 +128,13 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max)
 }
 
 #ifdef CONFIG_HAVE_ARCH_PFN_VALID
-#define PFN_MASK ((1UL << (64 - PAGE_SHIFT)) - 1)
-
 int pfn_valid(unsigned long pfn)
 {
-       return (pfn & PFN_MASK) == pfn && memblock_is_map_memory(pfn << PAGE_SHIFT);
+       phys_addr_t addr = pfn << PAGE_SHIFT;
+
+       if ((addr >> PAGE_SHIFT) != pfn)
+               return 0;
+       return memblock_is_memory(addr);
 }
 EXPORT_SYMBOL(pfn_valid);
 #endif
index 4ca3317..6d38948 100644 (file)
@@ -249,12 +249,6 @@ static int __init bcm47xx_cpu_fixes(void)
                 */
                if (bcm47xx_bus.bcma.bus.chipinfo.id == BCMA_CHIP_ID_BCM4706)
                        cpu_wait = NULL;
-
-               /*
-                * BCM47XX Erratum "R10: PCIe Transactions Periodically Fail"
-                * Enable ExternalSync for sync instruction to take effect
-                */
-               set_c0_config7(MIPS_CONF7_ES);
                break;
 #endif
        }
index 2021595..c785da1 100644 (file)
 #define MIPS_CONF7_WII         (_ULCAST_(1) << 31)
 
 #define MIPS_CONF7_RPS         (_ULCAST_(1) << 2)
-/* ExternalSync */
-#define MIPS_CONF7_ES          (_ULCAST_(1) << 8)
 
 #define MIPS_CONF7_IAR         (_ULCAST_(1) << 10)
 #define MIPS_CONF7_AR          (_ULCAST_(1) << 16)
@@ -2015,7 +2013,6 @@ __BUILD_SET_C0(status)
 __BUILD_SET_C0(cause)
 __BUILD_SET_C0(config)
 __BUILD_SET_C0(config5)
-__BUILD_SET_C0(config7)
 __BUILD_SET_C0(intcontrol)
 __BUILD_SET_C0(intctl)
 __BUILD_SET_C0(srsmap)
index 25eef1d..0f07ac3 100644 (file)
@@ -137,7 +137,7 @@ struct mips_fpu_struct {
 
 #define NUM_DSP_REGS   6
 
-typedef __u32 dspreg_t;
+typedef unsigned long dspreg_t;
 
 struct mips_dsp_state {
        dspreg_t        dspr[NUM_DSP_REGS];
index 0b70d62..9d04392 100644 (file)
@@ -878,7 +878,7 @@ long arch_ptrace(struct task_struct *child, long request,
                                goto out;
                        }
                        dregs = __get_dsp_regs(child);
-                       tmp = (unsigned long) (dregs[addr - DSP_BASE]);
+                       tmp = dregs[addr - DSP_BASE];
                        break;
                }
                case DSP_CONTROL:
index d95117e..286ec2d 100644 (file)
@@ -140,7 +140,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
                                goto out;
                        }
                        dregs = __get_dsp_regs(child);
-                       tmp = (unsigned long) (dregs[addr - DSP_BASE]);
+                       tmp = dregs[addr - DSP_BASE];
                        break;
                }
                case DSP_CONTROL:
index 111ad47..4c2483f 100644 (file)
@@ -4,12 +4,12 @@
 #include "libgcc.h"
 
 /*
- * GCC 7 suboptimally generates __multi3 calls for mips64r6, so for that
- * specific case only we'll implement it here.
+ * GCC 7 & older can suboptimally generate __multi3 calls for mips64r6, so for
+ * that specific case only we implement that intrinsic here.
  *
  * See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82981
  */
-#if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPSR6) && (__GNUC__ == 7)
+#if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPSR6) && (__GNUC__ < 8)
 
 /* multiply 64-bit values, low 64-bits returned */
 static inline long long notrace dmulu(long long a, long long b)
index 998b61c..4b39ba7 100644 (file)
@@ -261,7 +261,6 @@ struct qdio_outbuf_state {
        void *user;
 };
 
-#define QDIO_OUTBUF_STATE_FLAG_NONE    0x00
 #define QDIO_OUTBUF_STATE_FLAG_PENDING 0x01
 
 #define CHSC_AC1_INITIATE_INPUTQ       0x80
index ec1a30d..7218689 100644 (file)
@@ -459,6 +459,8 @@ retry:
        /* No reason to continue if interrupted by SIGKILL. */
        if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) {
                fault = VM_FAULT_SIGNAL;
+               if (flags & FAULT_FLAG_RETRY_NOWAIT)
+                       goto out_up;
                goto out;
        }
        if (unlikely(fault & VM_FAULT_ERROR))
index a26528a..727693e 100644 (file)
@@ -522,8 +522,6 @@ static void bpf_jit_epilogue(struct bpf_jit *jit)
                        /* br %r1 */
                        _EMIT2(0x07f1);
                } else {
-                       /* larl %r1,.+14 */
-                       EMIT6_PCREL_RILB(0xc0000000, REG_1, jit->prg + 14);
                        /* ex 0,S390_lowcore.br_r1_tampoline */
                        EMIT4_DISP(0x44000000, REG_0, REG_0,
                                   offsetof(struct _lowcore, br_r1_trampoline));
index ef0499b..9a5754d 100644 (file)
@@ -412,6 +412,8 @@ int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
        hwirq = 0;
        for_each_pci_msi_entry(msi, pdev) {
                rc = -EIO;
+               if (hwirq >= msi_vecs)
+                       break;
                irq = irq_alloc_desc(0);        /* Alloc irq on node 0 */
                if (irq < 0)
                        goto out_msi;
index cb7f049..8afbdcd 100644 (file)
@@ -28,7 +28,8 @@ extern inline unsigned long native_save_fl(void)
        return flags;
 }
 
-static inline void native_restore_fl(unsigned long flags)
+extern inline void native_restore_fl(unsigned long flags);
+extern inline void native_restore_fl(unsigned long flags)
 {
        asm volatile("push %0 ; popf"
                     : /* no output */
index a3a5395..337c521 100644 (file)
@@ -172,9 +172,9 @@ extern const struct seq_operations cpuinfo_op;
 
 extern void cpu_detect(struct cpuinfo_x86 *c);
 
-static inline unsigned long l1tf_pfn_limit(void)
+static inline unsigned long long l1tf_pfn_limit(void)
 {
-       return BIT(boot_cpu_data.x86_phys_bits - 1 - PAGE_SHIFT) - 1;
+       return BIT_ULL(boot_cpu_data.x86_phys_bits - 1 - PAGE_SHIFT);
 }
 
 extern void early_cpu_init(void);
index 34e4aaa..b9e6b60 100644 (file)
@@ -654,6 +654,10 @@ static void __init l1tf_select_mitigation(void)
        half_pa = (u64)l1tf_pfn_limit() << PAGE_SHIFT;
        if (e820_any_mapped(half_pa, ULLONG_MAX - half_pa, E820_RAM)) {
                pr_warn("System has more than MAX_PA/2 memory. L1TF mitigation not effective.\n");
+               pr_info("You may make it effective by booting the kernel with mem=%llu parameter.\n",
+                               half_pa);
+               pr_info("However, doing so will make a part of your RAM unusable.\n");
+               pr_info("Reading https://www.kernel.org/doc/html/latest/admin-guide/l1tf.html might help you decide.\n");
                return;
        }
 
index 4dce22d..b18fe3d 100644 (file)
@@ -74,6 +74,9 @@ static bool bad_spectre_microcode(struct cpuinfo_x86 *c)
        if (cpu_has(c, X86_FEATURE_HYPERVISOR))
                return false;
 
+       if (c->x86 != 6)
+               return false;
+
        for (i = 0; i < ARRAY_SIZE(spectre_bad_microcodes); i++) {
                if (c->x86_model == spectre_bad_microcodes[i].model &&
                    c->x86_mask == spectre_bad_microcodes[i].stepping)
index 4cbb60f..c7cc81e 100644 (file)
@@ -250,6 +250,7 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
        start_thread_common(regs, new_ip, new_sp,
                            __USER_CS, __USER_DS, 0);
 }
+EXPORT_SYMBOL_GPL(start_thread);
 
 #ifdef CONFIG_COMPAT
 void compat_start_thread(struct pt_regs *regs, u32 new_ip, u32 new_sp)
index 4954a6c..f00eb52 100644 (file)
@@ -779,7 +779,7 @@ unsigned long max_swapfile_size(void)
 
        if (boot_cpu_has_bug(X86_BUG_L1TF)) {
                /* Limit the swap file size to MAX_PA/2 for L1TF workaround */
-               unsigned long l1tf_limit = l1tf_pfn_limit() + 1;
+               unsigned long long l1tf_limit = l1tf_pfn_limit();
                /*
                 * We encode swap offsets also with 3 bits below those for pfn
                 * which makes the usable limit higher.
@@ -787,7 +787,7 @@ unsigned long max_swapfile_size(void)
 #if CONFIG_PGTABLE_LEVELS > 2
                l1tf_limit <<= PAGE_SHIFT - SWP_OFFSET_FIRST_BIT;
 #endif
-               pages = min_t(unsigned long, l1tf_limit, pages);
+               pages = min_t(unsigned long long, l1tf_limit, pages);
        }
        return pages;
 }
index 5aad869..74609a9 100644 (file)
@@ -138,7 +138,7 @@ bool pfn_modify_allowed(unsigned long pfn, pgprot_t prot)
        /* If it's real memory always allow */
        if (pfn_valid(pfn))
                return true;
-       if (pfn > l1tf_pfn_limit() && !capable(CAP_SYS_ADMIN))
+       if (pfn >= l1tf_pfn_limit() && !capable(CAP_SYS_ADMIN))
                return false;
        return true;
 }
index 0151039..1012b2c 100644 (file)
@@ -2526,7 +2526,7 @@ static int cdrom_ioctl_drive_status(struct cdrom_device_info *cdi,
        if (!CDROM_CAN(CDC_SELECT_DISC) ||
            (arg == CDSL_CURRENT || arg == CDSL_NONE))
                return cdi->ops->drive_status(cdi, CDSL_CURRENT);
-       if (((int)arg >= cdi->capacity))
+       if (arg >= cdi->capacity)
                return -EINVAL;
        return cdrom_slot_status(cdi, arg);
 }
index dba5c0e..c7c243e 100644 (file)
@@ -450,6 +450,18 @@ static void adv7511_hpd_work(struct work_struct *work)
        else
                status = connector_status_disconnected;
 
+       /*
+        * The bridge resets its registers on unplug. So when we get a plug
+        * event and we're already supposed to be powered, cycle the bridge to
+        * restore its state.
+        */
+       if (status == connector_status_connected &&
+           adv7511->connector.status == connector_status_disconnected &&
+           adv7511->powered) {
+               regcache_mark_dirty(adv7511->regmap);
+               adv7511_power_on(adv7511);
+       }
+
        if (adv7511->connector.status != status) {
                adv7511->connector.status = status;
                drm_kms_helper_hotplug_event(adv7511->connector.dev);
index abacc8f..31ca56e 100644 (file)
@@ -526,6 +526,9 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data)
                return PTR_ERR(imx_ldb->regmap);
        }
 
+       /* disable LDB by resetting the control register to POR default */
+       regmap_write(imx_ldb->regmap, IOMUXC_GPR2, 0);
+
        imx_ldb->dev = dev;
 
        if (of_id)
@@ -566,14 +569,14 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data)
                if (ret || i < 0 || i > 1)
                        return -EINVAL;
 
+               if (!of_device_is_available(child))
+                       continue;
+
                if (dual && i > 0) {
                        dev_warn(dev, "dual-channel mode, ignoring second output\n");
                        continue;
                }
 
-               if (!of_device_is_available(child))
-                       continue;
-
                channel = &imx_ldb->channel[i];
                channel->ldb = imx_ldb;
                channel->chno = i;
index 29bd801..0c648ef 100644 (file)
@@ -341,7 +341,7 @@ static int udl_fb_open(struct fb_info *info, int user)
 
                struct fb_deferred_io *fbdefio;
 
-               fbdefio = kmalloc(sizeof(struct fb_deferred_io), GFP_KERNEL);
+               fbdefio = kzalloc(sizeof(struct fb_deferred_io), GFP_KERNEL);
 
                if (fbdefio) {
                        fbdefio->delay = DL_DEFIO_WRITE_DELAY;
index 33dbfb2..30bfeb1 100644 (file)
@@ -141,18 +141,13 @@ static void udl_free_urb_list(struct drm_device *dev)
        struct list_head *node;
        struct urb_node *unode;
        struct urb *urb;
-       int ret;
        unsigned long flags;
 
        DRM_DEBUG("Waiting for completes and freeing all render urbs\n");
 
        /* keep waiting and freeing, until we've got 'em all */
        while (count--) {
-
-               /* Getting interrupted means a leak, but ok at shutdown*/
-               ret = down_interruptible(&udl->urbs.limit_sem);
-               if (ret)
-                       break;
+               down(&udl->urbs.limit_sem);
 
                spin_lock_irqsave(&udl->urbs.lock, flags);
 
@@ -176,17 +171,22 @@ static void udl_free_urb_list(struct drm_device *dev)
 static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size)
 {
        struct udl_device *udl = dev->dev_private;
-       int i = 0;
        struct urb *urb;
        struct urb_node *unode;
        char *buf;
+       size_t wanted_size = count * size;
 
        spin_lock_init(&udl->urbs.lock);
 
+retry:
        udl->urbs.size = size;
        INIT_LIST_HEAD(&udl->urbs.list);
 
-       while (i < count) {
+       sema_init(&udl->urbs.limit_sem, 0);
+       udl->urbs.count = 0;
+       udl->urbs.available = 0;
+
+       while (udl->urbs.count * size < wanted_size) {
                unode = kzalloc(sizeof(struct urb_node), GFP_KERNEL);
                if (!unode)
                        break;
@@ -202,11 +202,16 @@ static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size)
                }
                unode->urb = urb;
 
-               buf = usb_alloc_coherent(udl->udev, MAX_TRANSFER, GFP_KERNEL,
+               buf = usb_alloc_coherent(udl->udev, size, GFP_KERNEL,
                                         &urb->transfer_dma);
                if (!buf) {
                        kfree(unode);
                        usb_free_urb(urb);
+                       if (size > PAGE_SIZE) {
+                               size /= 2;
+                               udl_free_urb_list(dev);
+                               goto retry;
+                       }
                        break;
                }
 
@@ -217,16 +222,14 @@ static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size)
 
                list_add_tail(&unode->entry, &udl->urbs.list);
 
-               i++;
+               up(&udl->urbs.limit_sem);
+               udl->urbs.count++;
+               udl->urbs.available++;
        }
 
-       sema_init(&udl->urbs.limit_sem, i);
-       udl->urbs.count = i;
-       udl->urbs.available = i;
-
-       DRM_DEBUG("allocated %d %d byte urbs\n", i, (int) size);
+       DRM_DEBUG("allocated %d %d byte urbs\n", udl->urbs.count, (int) size);
 
-       return i;
+       return udl->urbs.count;
 }
 
 struct urb *udl_get_urb(struct drm_device *dev)
index a8bdcb5..57f6eb1 100644 (file)
@@ -234,12 +234,16 @@ static void i2c_davinci_calc_clk_dividers(struct davinci_i2c_dev *dev)
        /*
         * It's not always possible to have 1 to 2 ratio when d=7, so fall back
         * to minimal possible clkh in this case.
+        *
+        * Note:
+        * CLKH is not allowed to be 0, in this case I2C clock is not generated
+        * at all
         */
-       if (clk >= clkl + d) {
+       if (clk > clkl + d) {
                clkh = clk - clkl - d;
                clkl -= d;
        } else {
-               clkh = 0;
+               clkh = 1;
                clkl = clk - (d << 1);
        }
 
index c7427bd..2949a38 100644 (file)
@@ -86,6 +86,11 @@ static u32 mpc52xx_can_get_clock(struct platform_device *ofdev,
                return 0;
        }
        cdm = of_iomap(np_cdm, 0);
+       if (!cdm) {
+               of_node_put(np_cdm);
+               dev_err(&ofdev->dev, "can't map clock node!\n");
+               return 0;
+       }
 
        if (in_8(&cdm->ipb_clk_sel) & 0x1)
                freq *= 2;
index 5b7658b..5c3ef9f 100644 (file)
@@ -32,7 +32,7 @@ config EL3
 
 config 3C515
        tristate "3c515 ISA \"Fast EtherLink\""
-       depends on ISA && ISA_DMA_API
+       depends on ISA && ISA_DMA_API && !PPC32
        ---help---
          If you have a 3Com ISA EtherLink XL "Corkscrew" 3c515 Fast Ethernet
          network card, say Y here.
index 0038709..ec59425 100644 (file)
@@ -44,7 +44,7 @@ config AMD8111_ETH
 
 config LANCE
        tristate "AMD LANCE and PCnet (AT1500 and NE2100) support"
-       depends on ISA && ISA_DMA_API && !ARM
+       depends on ISA && ISA_DMA_API && !ARM && !PPC32
        ---help---
          If you have a network (Ethernet) card of this type, say Y here.
          Some LinkSys cards are of this type.
@@ -138,7 +138,7 @@ config PCMCIA_NMCLAN
 
 config NI65
        tristate "NI6510 support"
-       depends on ISA && ISA_DMA_API && !ARM
+       depends on ISA && ISA_DMA_API && !ARM && !PPC32
        ---help---
          If you have a network (Ethernet) card of this type, say Y here.
 
index 8b5988e..c08d34f 100644 (file)
@@ -1683,6 +1683,7 @@ static struct sk_buff *atl1c_alloc_skb(struct atl1c_adapter *adapter)
        skb = build_skb(page_address(page) + adapter->rx_page_offset,
                        adapter->rx_frag_size);
        if (likely(skb)) {
+               skb_reserve(skb, NET_SKB_PAD);
                adapter->rx_page_offset += adapter->rx_frag_size;
                if (adapter->rx_page_offset >= PAGE_SIZE)
                        adapter->rx_page = NULL;
index d84efcd..c56b61d 100644 (file)
@@ -3360,14 +3360,18 @@ static int bnx2x_set_rss_flags(struct bnx2x *bp, struct ethtool_rxnfc *info)
                        DP(BNX2X_MSG_ETHTOOL,
                           "rss re-configured, UDP 4-tupple %s\n",
                           udp_rss_requested ? "enabled" : "disabled");
-                       return bnx2x_rss(bp, &bp->rss_conf_obj, false, true);
+                       if (bp->state == BNX2X_STATE_OPEN)
+                               return bnx2x_rss(bp, &bp->rss_conf_obj, false,
+                                                true);
                } else if ((info->flow_type == UDP_V6_FLOW) &&
                           (bp->rss_conf_obj.udp_rss_v6 != udp_rss_requested)) {
                        bp->rss_conf_obj.udp_rss_v6 = udp_rss_requested;
                        DP(BNX2X_MSG_ETHTOOL,
                           "rss re-configured, UDP 4-tupple %s\n",
                           udp_rss_requested ? "enabled" : "disabled");
-                       return bnx2x_rss(bp, &bp->rss_conf_obj, false, true);
+                       if (bp->state == BNX2X_STATE_OPEN)
+                               return bnx2x_rss(bp, &bp->rss_conf_obj, false,
+                                                true);
                }
                return 0;
 
@@ -3481,7 +3485,10 @@ static int bnx2x_set_rxfh(struct net_device *dev, const u32 *indir,
                bp->rss_conf_obj.ind_table[i] = indir[i] + bp->fp->cl_id;
        }
 
-       return bnx2x_config_rss_eth(bp, false);
+       if (bp->state == BNX2X_STATE_OPEN)
+               return bnx2x_config_rss_eth(bp, false);
+
+       return 0;
 }
 
 /**
index 5ab9129..ec0b545 100644 (file)
@@ -19,6 +19,7 @@ if NET_VENDOR_CIRRUS
 config CS89x0
        tristate "CS89x0 support"
        depends on ISA || EISA || ARM
+       depends on !PPC32
        ---help---
          Support for CS89x0 chipset based Ethernet cards. If you have a
          network (Ethernet) card of this type, say Y and read the file
index 8390597..b20bce2 100644 (file)
@@ -1842,10 +1842,32 @@ static int enic_stop(struct net_device *netdev)
        return 0;
 }
 
+static int _enic_change_mtu(struct net_device *netdev, int new_mtu)
+{
+       bool running = netif_running(netdev);
+       int err = 0;
+
+       ASSERT_RTNL();
+       if (running) {
+               err = enic_stop(netdev);
+               if (err)
+                       return err;
+       }
+
+       netdev->mtu = new_mtu;
+
+       if (running) {
+               err = enic_open(netdev);
+               if (err)
+                       return err;
+       }
+
+       return 0;
+}
+
 static int enic_change_mtu(struct net_device *netdev, int new_mtu)
 {
        struct enic *enic = netdev_priv(netdev);
-       int running = netif_running(netdev);
 
        if (new_mtu < ENIC_MIN_MTU || new_mtu > ENIC_MAX_MTU)
                return -EINVAL;
@@ -1853,20 +1875,12 @@ static int enic_change_mtu(struct net_device *netdev, int new_mtu)
        if (enic_is_dynamic(enic) || enic_is_sriov_vf(enic))
                return -EOPNOTSUPP;
 
-       if (running)
-               enic_stop(netdev);
-
-       netdev->mtu = new_mtu;
-
        if (netdev->mtu > enic->port_mtu)
                netdev_warn(netdev,
-                       "interface MTU (%d) set higher than port MTU (%d)\n",
-                       netdev->mtu, enic->port_mtu);
+                           "interface MTU (%d) set higher than port MTU (%d)\n",
+                           netdev->mtu, enic->port_mtu);
 
-       if (running)
-               enic_open(netdev);
-
-       return 0;
+       return _enic_change_mtu(netdev, new_mtu);
 }
 
 static void enic_change_mtu_work(struct work_struct *work)
@@ -1874,47 +1888,9 @@ static void enic_change_mtu_work(struct work_struct *work)
        struct enic *enic = container_of(work, struct enic, change_mtu_work);
        struct net_device *netdev = enic->netdev;
        int new_mtu = vnic_dev_mtu(enic->vdev);
-       int err;
-       unsigned int i;
-
-       new_mtu = max_t(int, ENIC_MIN_MTU, min_t(int, ENIC_MAX_MTU, new_mtu));
 
        rtnl_lock();
-
-       /* Stop RQ */
-       del_timer_sync(&enic->notify_timer);
-
-       for (i = 0; i < enic->rq_count; i++)
-               napi_disable(&enic->napi[i]);
-
-       vnic_intr_mask(&enic->intr[0]);
-       enic_synchronize_irqs(enic);
-       err = vnic_rq_disable(&enic->rq[0]);
-       if (err) {
-               rtnl_unlock();
-               netdev_err(netdev, "Unable to disable RQ.\n");
-               return;
-       }
-       vnic_rq_clean(&enic->rq[0], enic_free_rq_buf);
-       vnic_cq_clean(&enic->cq[0]);
-       vnic_intr_clean(&enic->intr[0]);
-
-       /* Fill RQ with new_mtu-sized buffers */
-       netdev->mtu = new_mtu;
-       vnic_rq_fill(&enic->rq[0], enic_rq_alloc_buf);
-       /* Need at least one buffer on ring to get going */
-       if (vnic_rq_desc_used(&enic->rq[0]) == 0) {
-               rtnl_unlock();
-               netdev_err(netdev, "Unable to alloc receive buffers.\n");
-               return;
-       }
-
-       /* Start RQ */
-       vnic_rq_enable(&enic->rq[0]);
-       napi_enable(&enic->napi[0]);
-       vnic_intr_unmask(&enic->intr[0]);
-       enic_notify_timer_start(enic);
-
+       (void)_enic_change_mtu(netdev, new_mtu);
        rtnl_unlock();
 
        netdev_info(netdev, "interface MTU set as %d\n", netdev->mtu);
index 20d048c..c898006 100644 (file)
@@ -420,6 +420,7 @@ static void qed_mcp_handle_link_change(struct qed_hwfn *p_hwfn,
                break;
        default:
                p_link->speed = 0;
+               p_link->link_up = 0;
        }
 
        /* Correct speed according to bandwidth allocation */
index 507bbb0..f610841 100644 (file)
@@ -218,6 +218,7 @@ issue:
        ret = of_mdiobus_register(bus, np1);
        if (ret) {
                mdiobus_free(bus);
+               lp->mii_bus = NULL;
                return ret;
        }
        return 0;
index 317bc79..c178e12 100644 (file)
@@ -1385,7 +1385,7 @@ static irqreturn_t lmc_interrupt (int irq, void *dev_instance) /*fold00*/
             case 0x001:
                 printk(KERN_WARNING "%s: Master Abort (naughty)\n", dev->name);
                 break;
-            case 0x010:
+            case 0x002:
                 printk(KERN_WARNING "%s: Target Abort (not so naughty)\n", dev->name);
                 break;
             default:
index acaf84c..6c9420e 100644 (file)
@@ -434,7 +434,7 @@ static void imx1_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
        const char *name;
        int i, ret;
 
-       if (group > info->ngroups)
+       if (group >= info->ngroups)
                return;
 
        seq_puts(s, "\n");
index 742ca57..d64b401 100644 (file)
@@ -640,21 +640,20 @@ static inline unsigned long qdio_aob_for_buffer(struct qdio_output_q *q,
        unsigned long phys_aob = 0;
 
        if (!q->use_cq)
-               goto out;
+               return 0;
 
        if (!q->aobs[bufnr]) {
                struct qaob *aob = qdio_allocate_aob();
                q->aobs[bufnr] = aob;
        }
        if (q->aobs[bufnr]) {
-               q->sbal_state[bufnr].flags = QDIO_OUTBUF_STATE_FLAG_NONE;
                q->sbal_state[bufnr].aob = q->aobs[bufnr];
                q->aobs[bufnr]->user1 = (u64) q->sbal_state[bufnr].user;
                phys_aob = virt_to_phys(q->aobs[bufnr]);
                WARN_ON_ONCE(phys_aob & 0xFF);
        }
 
-out:
+       q->sbal_state[bufnr].flags = 0;
        return phys_aob;
 }
 
index 34a1b1f..d5184aa 100644 (file)
@@ -752,9 +752,9 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct fc_lport *lport,
        case ELS_LOGO:
                if (fip->mode == FIP_MODE_VN2VN) {
                        if (fip->state != FIP_ST_VNMP_UP)
-                               return -EINVAL;
+                               goto drop;
                        if (ntoh24(fh->fh_d_id) == FC_FID_FLOGI)
-                               return -EINVAL;
+                               goto drop;
                } else {
                        if (fip->state != FIP_ST_ENABLED)
                                return 0;
index 9f0b00c..a74f8fb 100644 (file)
@@ -283,11 +283,11 @@ static int iscsi_check_tmf_restrictions(struct iscsi_task *task, int opcode)
                 */
                if (opcode != ISCSI_OP_SCSI_DATA_OUT) {
                        iscsi_conn_printk(KERN_INFO, conn,
-                                         "task [op %x/%x itt "
+                                         "task [op %x itt "
                                          "0x%x/0x%x] "
                                          "rejected.\n",
-                                         task->hdr->opcode, opcode,
-                                         task->itt, task->hdr_itt);
+                                         opcode, task->itt,
+                                         task->hdr_itt);
                        return -EACCES;
                }
                /*
@@ -296,10 +296,10 @@ static int iscsi_check_tmf_restrictions(struct iscsi_task *task, int opcode)
                 */
                if (conn->session->fast_abort) {
                        iscsi_conn_printk(KERN_INFO, conn,
-                                         "task [op %x/%x itt "
+                                         "task [op %x itt "
                                          "0x%x/0x%x] fast abort.\n",
-                                         task->hdr->opcode, opcode,
-                                         task->itt, task->hdr_itt);
+                                         opcode, task->itt,
+                                         task->hdr_itt);
                        return -EACCES;
                }
                break;
index 4477e99..8db0c48 100644 (file)
@@ -678,8 +678,24 @@ static ssize_t
 sdev_store_delete(struct device *dev, struct device_attribute *attr,
                  const char *buf, size_t count)
 {
-       if (device_remove_file_self(dev, attr))
-               scsi_remove_device(to_scsi_device(dev));
+       struct kernfs_node *kn;
+
+       kn = sysfs_break_active_protection(&dev->kobj, &attr->attr);
+       WARN_ON_ONCE(!kn);
+       /*
+        * Concurrent writes into the "delete" sysfs attribute may trigger
+        * concurrent calls to device_remove_file() and scsi_remove_device().
+        * device_remove_file() handles concurrent removal calls by
+        * serializing these and by ignoring the second and later removal
+        * attempts.  Concurrent calls of scsi_remove_device() are
+        * serialized. The second and later calls of scsi_remove_device() are
+        * ignored because the first call of that function changes the device
+        * state into SDEV_DEL.
+        */
+       device_remove_file(dev, attr);
+       scsi_remove_device(to_scsi_device(dev));
+       if (kn)
+               sysfs_unbreak_active_protection(kn);
        return count;
 };
 static DEVICE_ATTR(delete, S_IWUSR, NULL, sdev_store_delete);
index 0f133c1..0de2f90 100644 (file)
@@ -545,9 +545,14 @@ static void pvscsi_complete_request(struct pvscsi_adapter *adapter,
            (btstat == BTSTAT_SUCCESS ||
             btstat == BTSTAT_LINKED_COMMAND_COMPLETED ||
             btstat == BTSTAT_LINKED_COMMAND_COMPLETED_WITH_FLAG)) {
-               cmd->result = (DID_OK << 16) | sdstat;
-               if (sdstat == SAM_STAT_CHECK_CONDITION && cmd->sense_buffer)
-                       cmd->result |= (DRIVER_SENSE << 24);
+               if (sdstat == SAM_STAT_COMMAND_TERMINATED) {
+                       cmd->result = (DID_RESET << 16);
+               } else {
+                       cmd->result = (DID_OK << 16) | sdstat;
+                       if (sdstat == SAM_STAT_CHECK_CONDITION &&
+                           cmd->sense_buffer)
+                               cmd->result |= (DRIVER_SENSE << 24);
+               }
        } else
                switch (btstat) {
                case BTSTAT_SUCCESS:
index 2a0158b..5a78ef0 100644 (file)
@@ -11,7 +11,6 @@
  * (at your option) any later version.
  */
 
-#include <asm/cacheflush.h>
 #include <linux/clk.h>
 #include <linux/mm.h>
 #include <linux/pagemap.h>
@@ -22,6 +21,8 @@
 #include <media/v4l2-dev.h>
 #include <media/v4l2-ioctl.h>
 
+#include <asm/cacheflush.h>
+
 #include "iss_video.h"
 #include "iss.h"
 
index bc2cbff..63e54be 100644 (file)
@@ -323,8 +323,7 @@ static int iscsi_login_zero_tsih_s1(
                pr_err("idr_alloc() for sess_idr failed\n");
                iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
                                ISCSI_LOGIN_STATUS_NO_RESOURCES);
-               kfree(sess);
-               return -ENOMEM;
+               goto free_sess;
        }
 
        sess->creation_time = get_jiffies_64();
@@ -340,20 +339,28 @@ static int iscsi_login_zero_tsih_s1(
                                ISCSI_LOGIN_STATUS_NO_RESOURCES);
                pr_err("Unable to allocate memory for"
                                " struct iscsi_sess_ops.\n");
-               kfree(sess);
-               return -ENOMEM;
+               goto remove_idr;
        }
 
        sess->se_sess = transport_init_session(TARGET_PROT_NORMAL);
        if (IS_ERR(sess->se_sess)) {
                iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
                                ISCSI_LOGIN_STATUS_NO_RESOURCES);
-               kfree(sess->sess_ops);
-               kfree(sess);
-               return -ENOMEM;
+               goto free_ops;
        }
 
        return 0;
+
+free_ops:
+       kfree(sess->sess_ops);
+remove_idr:
+       spin_lock_bh(&sess_idr_lock);
+       idr_remove(&sess_idr, sess->session_index);
+       spin_unlock_bh(&sess_idr_lock);
+free_sess:
+       kfree(sess);
+       conn->sess = NULL;
+       return -ENOMEM;
 }
 
 static int iscsi_login_zero_tsih_s2(
@@ -1142,13 +1149,13 @@ void iscsi_target_login_sess_out(struct iscsi_conn *conn,
                                   ISCSI_LOGIN_STATUS_INIT_ERR);
        if (!zero_tsih || !conn->sess)
                goto old_sess_out;
-       if (conn->sess->se_sess)
-               transport_free_session(conn->sess->se_sess);
-       if (conn->sess->session_index != 0) {
-               spin_lock_bh(&sess_idr_lock);
-               idr_remove(&sess_idr, conn->sess->session_index);
-               spin_unlock_bh(&sess_idr_lock);
-       }
+
+       transport_free_session(conn->sess->se_sess);
+
+       spin_lock_bh(&sess_idr_lock);
+       idr_remove(&sess_idr, conn->sess->session_index);
+       spin_unlock_bh(&sess_idr_lock);
+
        kfree(conn->sess->sess_ops);
        kfree(conn->sess);
        conn->sess = NULL;
index b5dab10..e931c3c 100644 (file)
@@ -941,14 +941,14 @@ static struct usb_descriptor_header *hs_audio_desc[] = {
 };
 
 struct cntrl_cur_lay3 {
-       __u32   dCUR;
+       __le32  dCUR;
 };
 
 struct cntrl_range_lay3 {
-       __u16   wNumSubRanges;
-       __u32   dMIN;
-       __u32   dMAX;
-       __u32   dRES;
+       __le16  wNumSubRanges;
+       __le32  dMIN;
+       __le32  dMAX;
+       __le32  dRES;
 } __packed;
 
 static inline void
@@ -1296,9 +1296,9 @@ in_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
                memset(&c, 0, sizeof(struct cntrl_cur_lay3));
 
                if (entity_id == USB_IN_CLK_ID)
-                       c.dCUR = p_srate;
+                       c.dCUR = cpu_to_le32(p_srate);
                else if (entity_id == USB_OUT_CLK_ID)
-                       c.dCUR = c_srate;
+                       c.dCUR = cpu_to_le32(c_srate);
 
                value = min_t(unsigned, w_length, sizeof c);
                memcpy(req->buf, &c, value);
@@ -1336,15 +1336,15 @@ in_rq_range(struct usb_function *fn, const struct usb_ctrlrequest *cr)
 
        if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
                if (entity_id == USB_IN_CLK_ID)
-                       r.dMIN = p_srate;
+                       r.dMIN = cpu_to_le32(p_srate);
                else if (entity_id == USB_OUT_CLK_ID)
-                       r.dMIN = c_srate;
+                       r.dMIN = cpu_to_le32(c_srate);
                else
                        return -EOPNOTSUPP;
 
                r.dMAX = r.dMIN;
                r.dRES = 0;
-               r.wNumSubRanges = 1;
+               r.wNumSubRanges = cpu_to_le16(1);
 
                value = min_t(unsigned, w_length, sizeof r);
                memcpy(req->buf, &r, value);
index baa0609..e340946 100644 (file)
@@ -835,11 +835,11 @@ static void init_controller(struct r8a66597 *r8a66597)
 
                r8a66597_bset(r8a66597, XCKE, SYSCFG0);
 
-               msleep(3);
+               mdelay(3);
 
                r8a66597_bset(r8a66597, PLLC, SYSCFG0);
 
-               msleep(1);
+               mdelay(1);
 
                r8a66597_bset(r8a66597, SCKE, SYSCFG0);
 
@@ -1193,7 +1193,7 @@ __acquires(r8a66597->lock)
        r8a66597->ep0_req->length = 2;
        /* AV: what happens if we get called again before that gets through? */
        spin_unlock(&r8a66597->lock);
-       r8a66597_queue(r8a66597->gadget.ep0, r8a66597->ep0_req, GFP_KERNEL);
+       r8a66597_queue(r8a66597->gadget.ep0, r8a66597->ep0_req, GFP_ATOMIC);
        spin_lock(&r8a66597->lock);
 }
 
index 94eb292..85d031c 100644 (file)
@@ -879,6 +879,7 @@ int usb_otg_start(struct platform_device *pdev)
        if (pdata->init && pdata->init(pdev) != 0)
                return -EINVAL;
 
+#ifdef CONFIG_PPC32
        if (pdata->big_endian_mmio) {
                _fsl_readl = _fsl_readl_be;
                _fsl_writel = _fsl_writel_be;
@@ -886,6 +887,7 @@ int usb_otg_start(struct platform_device *pdev)
                _fsl_readl = _fsl_readl_le;
                _fsl_writel = _fsl_writel_le;
        }
+#endif
 
        /* request irq */
        p_otg->irq = platform_get_irq(pdev, 0);
@@ -976,7 +978,7 @@ int usb_otg_start(struct platform_device *pdev)
 /*
  * state file in sysfs
  */
-static int show_fsl_usb2_otg_state(struct device *dev,
+static ssize_t show_fsl_usb2_otg_state(struct device *dev,
                                   struct device_attribute *attr, char *buf)
 {
        struct otg_fsm *fsm = &fsl_otg_dev->fsm;
index 982a9d5..493c735 100644 (file)
@@ -4128,7 +4128,7 @@ commit_trans:
                                      data_sinfo->flags, bytes, 1);
        spin_unlock(&data_sinfo->lock);
 
-       return ret;
+       return 0;
 }
 
 /*
index c4b8934..c43b4b0 100644 (file)
@@ -194,7 +194,6 @@ wait_for_old_object:
                pr_err("\n");
                pr_err("Error: Unexpected object collision\n");
                cachefiles_printk_object(object, xobject);
-               BUG();
        }
        atomic_inc(&xobject->usage);
        write_unlock(&cache->active_lock);
index c0f3da3..5b68cf5 100644 (file)
@@ -27,6 +27,7 @@ static int cachefiles_read_waiter(wait_queue_t *wait, unsigned mode,
        struct cachefiles_one_read *monitor =
                container_of(wait, struct cachefiles_one_read, monitor);
        struct cachefiles_object *object;
+       struct fscache_retrieval *op = monitor->op;
        struct wait_bit_key *key = _key;
        struct page *page = wait->private;
 
@@ -51,16 +52,22 @@ static int cachefiles_read_waiter(wait_queue_t *wait, unsigned mode,
        list_del(&wait->task_list);
 
        /* move onto the action list and queue for FS-Cache thread pool */
-       ASSERT(monitor->op);
+       ASSERT(op);
 
-       object = container_of(monitor->op->op.object,
-                             struct cachefiles_object, fscache);
+       /* We need to temporarily bump the usage count as we don't own a ref
+        * here otherwise cachefiles_read_copier() may free the op between the
+        * monitor being enqueued on the op->to_do list and the op getting
+        * enqueued on the work queue.
+        */
+       fscache_get_retrieval(op);
 
+       object = container_of(op->op.object, struct cachefiles_object, fscache);
        spin_lock(&object->work_lock);
-       list_add_tail(&monitor->op_link, &monitor->op->to_do);
+       list_add_tail(&monitor->op_link, &op->to_do);
        spin_unlock(&object->work_lock);
 
-       fscache_enqueue_retrieval(monitor->op);
+       fscache_enqueue_retrieval(op);
+       fscache_put_retrieval(op);
        return 0;
 }
 
index 0a3544f..bcbe42f 100644 (file)
@@ -123,25 +123,41 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
        seq_printf(m, "CIFS Version %s\n", CIFS_VERSION);
        seq_printf(m, "Features:");
 #ifdef CONFIG_CIFS_DFS_UPCALL
-       seq_printf(m, " dfs");
+       seq_printf(m, " DFS");
 #endif
 #ifdef CONFIG_CIFS_FSCACHE
-       seq_printf(m, " fscache");
+       seq_printf(m, ",FSCACHE");
+#endif
+#ifdef CONFIG_CIFS_SMB_DIRECT
+       seq_printf(m, ",SMB_DIRECT");
+#endif
+#ifdef CONFIG_CIFS_STATS2
+       seq_printf(m, ",STATS2");
+#elif defined(CONFIG_CIFS_STATS)
+       seq_printf(m, ",STATS");
+#endif
+#ifdef CONFIG_CIFS_DEBUG2
+       seq_printf(m, ",DEBUG2");
+#elif defined(CONFIG_CIFS_DEBUG)
+       seq_printf(m, ",DEBUG");
+#endif
+#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
+       seq_printf(m, ",ALLOW_INSECURE_LEGACY");
 #endif
 #ifdef CONFIG_CIFS_WEAK_PW_HASH
-       seq_printf(m, " lanman");
+       seq_printf(m, ",WEAK_PW_HASH");
 #endif
 #ifdef CONFIG_CIFS_POSIX
-       seq_printf(m, " posix");
+       seq_printf(m, ",CIFS_POSIX");
 #endif
 #ifdef CONFIG_CIFS_UPCALL
-       seq_printf(m, " spnego");
+       seq_printf(m, ",UPCALL(SPNEGO)");
 #endif
 #ifdef CONFIG_CIFS_XATTR
-       seq_printf(m, " xattr");
+       seq_printf(m, ",XATTR");
 #endif
 #ifdef CONFIG_CIFS_ACL
-       seq_printf(m, " acl");
+       seq_printf(m, ",ACL");
 #endif
        seq_putc(m, '\n');
        seq_printf(m, "Active VFS Requests: %d\n", GlobalTotalActiveXid);
index 9cdeb02..36c8594 100644 (file)
@@ -1063,6 +1063,8 @@ cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
        if (!server->ops->set_file_info)
                return -ENOSYS;
 
+       info_buf.Pad = 0;
+
        if (attrs->ia_valid & ATTR_ATIME) {
                set_time = true;
                info_buf.LastAccessTime =
index e3548f7..728289c 100644 (file)
@@ -419,7 +419,7 @@ smb3_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
        struct cifs_io_parms io_parms;
        int buf_type = CIFS_NO_BUFFER;
        __le16 *utf16_path;
-       __u8 oplock = SMB2_OPLOCK_LEVEL_II;
+       __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
        struct smb2_file_all_info *pfile_info = NULL;
 
        oparms.tcon = tcon;
@@ -481,7 +481,7 @@ smb3_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
        struct cifs_io_parms io_parms;
        int create_options = CREATE_NOT_DIR;
        __le16 *utf16_path;
-       __u8 oplock = SMB2_OPLOCK_LEVEL_EXCLUSIVE;
+       __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
        struct kvec iov[2];
 
        if (backup_cred(cifs_sb))
index a035d1a..9bc7a29 100644 (file)
@@ -398,6 +398,12 @@ int build_ntlmssp_auth_blob(unsigned char **pbuffer,
                goto setup_ntlmv2_ret;
        }
        *pbuffer = kmalloc(size_of_ntlmssp_blob(ses), GFP_KERNEL);
+       if (!*pbuffer) {
+               rc = -ENOMEM;
+               cifs_dbg(VFS, "Error %d during NTLMSSP allocation\n", rc);
+               *buflen = 0;
+               goto setup_ntlmv2_ret;
+       }
        sec_blob = (AUTHENTICATE_MESSAGE *)*pbuffer;
 
        memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8);
index 1238cd3..0267d8c 100644 (file)
@@ -267,7 +267,7 @@ smb2_set_file_info(struct inode *inode, const char *full_path,
        int rc;
 
        if ((buf->CreationTime == 0) && (buf->LastAccessTime == 0) &&
-           (buf->LastWriteTime == 0) && (buf->ChangeTime) &&
+           (buf->LastWriteTime == 0) && (buf->ChangeTime == 0) &&
            (buf->Attributes == 0))
                return 0; /* would be a no op, no sense sending this */
 
index 9747208..a1f1e53 100644 (file)
@@ -1401,6 +1401,7 @@ static struct buffer_head * ext4_find_entry (struct inode *dir,
                        goto cleanup_and_exit;
                dxtrace(printk(KERN_DEBUG "ext4_find_entry: dx failed, "
                               "falling back\n"));
+               ret = NULL;
        }
        nblocks = dir->i_size >> EXT4_BLOCK_SIZE_BITS(sb);
        if (!nblocks) {
index c2ee23a..ae9929d 100644 (file)
@@ -277,8 +277,12 @@ static ssize_t ext4_attr_show(struct kobject *kobj,
        case attr_pointer_ui:
                if (!ptr)
                        return 0;
-               return snprintf(buf, PAGE_SIZE, "%u\n",
-                               *((unsigned int *) ptr));
+               if (a->attr_ptr == ptr_ext4_super_block_offset)
+                       return snprintf(buf, PAGE_SIZE, "%u\n",
+                                       le32_to_cpup(ptr));
+               else
+                       return snprintf(buf, PAGE_SIZE, "%u\n",
+                                       *((unsigned int *) ptr));
        case attr_pointer_atomic:
                if (!ptr)
                        return 0;
@@ -311,7 +315,10 @@ static ssize_t ext4_attr_store(struct kobject *kobj,
                ret = kstrtoul(skip_spaces(buf), 0, &t);
                if (ret)
                        return ret;
-               *((unsigned int *) ptr) = t;
+               if (a->attr_ptr == ptr_ext4_super_block_offset)
+                       *((__le32 *) ptr) = cpu_to_le32(t);
+               else
+                       *((unsigned int *) ptr) = t;
                return len;
        case attr_inode_readahead:
                return inode_readahead_blks_store(a, sbi, buf, len);
index b16bfb5..a9b96d7 100644 (file)
@@ -197,6 +197,8 @@ ext4_xattr_check_names(struct ext4_xattr_entry *entry, void *end,
                struct ext4_xattr_entry *next = EXT4_XATTR_NEXT(e);
                if ((void *)next >= end)
                        return -EFSCORRUPTED;
+               if (strnlen(e->e_name, e->e_name_len) != e->e_name_len)
+                       return -EFSCORRUPTED;
                e = next;
        }
 
index de67745..77946d6 100644 (file)
@@ -66,7 +66,8 @@ void fscache_enqueue_operation(struct fscache_operation *op)
        ASSERT(op->processor != NULL);
        ASSERT(fscache_object_is_available(op->object));
        ASSERTCMP(atomic_read(&op->usage), >, 0);
-       ASSERTCMP(op->state, ==, FSCACHE_OP_ST_IN_PROGRESS);
+       ASSERTIFCMP(op->state != FSCACHE_OP_ST_IN_PROGRESS,
+                   op->state, ==,  FSCACHE_OP_ST_CANCELLED);
 
        fscache_stat(&fscache_n_op_enqueue);
        switch (op->flags & FSCACHE_OP_TYPE) {
@@ -481,7 +482,8 @@ void fscache_put_operation(struct fscache_operation *op)
        struct fscache_cache *cache;
 
        _enter("{OBJ%x OP%x,%d}",
-              op->object->debug_id, op->debug_id, atomic_read(&op->usage));
+              op->object ? op->object->debug_id : 0,
+              op->debug_id, atomic_read(&op->usage));
 
        ASSERTCMP(atomic_read(&op->usage), >, 0);
 
index d0ab1a3..d584bcb 100644 (file)
@@ -145,6 +145,16 @@ static bool fuse_block_alloc(struct fuse_conn *fc, bool for_background)
        return !fc->initialized || (for_background && fc->blocked);
 }
 
+static void fuse_drop_waiting(struct fuse_conn *fc)
+{
+       if (fc->connected) {
+               atomic_dec(&fc->num_waiting);
+       } else if (atomic_dec_and_test(&fc->num_waiting)) {
+               /* wake up aborters */
+               wake_up_all(&fc->blocked_waitq);
+       }
+}
+
 static struct fuse_req *__fuse_get_req(struct fuse_conn *fc, unsigned npages,
                                       bool for_background)
 {
@@ -191,7 +201,7 @@ static struct fuse_req *__fuse_get_req(struct fuse_conn *fc, unsigned npages,
        return req;
 
  out:
-       atomic_dec(&fc->num_waiting);
+       fuse_drop_waiting(fc);
        return ERR_PTR(err);
 }
 
@@ -298,7 +308,7 @@ void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req)
 
                if (test_bit(FR_WAITING, &req->flags)) {
                        __clear_bit(FR_WAITING, &req->flags);
-                       atomic_dec(&fc->num_waiting);
+                       fuse_drop_waiting(fc);
                }
 
                if (req->stolen_file)
@@ -384,7 +394,7 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req)
        struct fuse_iqueue *fiq = &fc->iq;
 
        if (test_and_set_bit(FR_FINISHED, &req->flags))
-               return;
+               goto put_request;
 
        spin_lock(&fiq->waitq.lock);
        list_del_init(&req->intr_entry);
@@ -414,6 +424,7 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req)
        wake_up(&req->waitq);
        if (req->end)
                req->end(fc, req);
+put_request:
        fuse_put_request(fc, req);
 }
 
@@ -2001,11 +2012,14 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe,
        if (!fud)
                return -EPERM;
 
+       pipe_lock(pipe);
+
        bufs = kmalloc(pipe->buffers * sizeof(struct pipe_buffer), GFP_KERNEL);
-       if (!bufs)
+       if (!bufs) {
+               pipe_unlock(pipe);
                return -ENOMEM;
+       }
 
-       pipe_lock(pipe);
        nbuf = 0;
        rem = 0;
        for (idx = 0; idx < pipe->nrbufs && rem < len; idx++)
@@ -2161,6 +2175,7 @@ void fuse_abort_conn(struct fuse_conn *fc)
                                set_bit(FR_ABORTED, &req->flags);
                                if (!test_bit(FR_LOCKED, &req->flags)) {
                                        set_bit(FR_PRIVATE, &req->flags);
+                                       __fuse_get_request(req);
                                        list_move(&req->list, &to_end1);
                                }
                                spin_unlock(&req->waitq.lock);
@@ -2187,7 +2202,6 @@ void fuse_abort_conn(struct fuse_conn *fc)
 
                while (!list_empty(&to_end1)) {
                        req = list_first_entry(&to_end1, struct fuse_req, list);
-                       __fuse_get_request(req);
                        list_del_init(&req->list);
                        request_end(fc, req);
                }
@@ -2198,6 +2212,11 @@ void fuse_abort_conn(struct fuse_conn *fc)
 }
 EXPORT_SYMBOL_GPL(fuse_abort_conn);
 
+void fuse_wait_aborted(struct fuse_conn *fc)
+{
+       wait_event(fc->blocked_waitq, atomic_read(&fc->num_waiting) == 0);
+}
+
 int fuse_dev_release(struct inode *inode, struct file *file)
 {
        struct fuse_dev *fud = fuse_get_dev(file);
@@ -2205,9 +2224,15 @@ int fuse_dev_release(struct inode *inode, struct file *file)
        if (fud) {
                struct fuse_conn *fc = fud->fc;
                struct fuse_pqueue *fpq = &fud->pq;
+               LIST_HEAD(to_end);
 
+               spin_lock(&fpq->lock);
                WARN_ON(!list_empty(&fpq->io));
-               end_requests(fc, &fpq->processing);
+               list_splice_init(&fpq->processing, &to_end);
+               spin_unlock(&fpq->lock);
+
+               end_requests(fc, &to_end);
+
                /* Are we the last open device? */
                if (atomic_dec_and_test(&fc->dev_count)) {
                        WARN_ON(fc->iq.fasync != NULL);
index 1a063cb..8577f3b 100644 (file)
@@ -879,6 +879,7 @@ static int fuse_readpages_fill(void *_data, struct page *page)
        }
 
        if (WARN_ON(req->num_pages >= req->max_pages)) {
+               unlock_page(page);
                fuse_put_request(fc, req);
                return -EIO;
        }
index 644687a..d88340e 100644 (file)
@@ -845,6 +845,7 @@ void fuse_request_send_background_locked(struct fuse_conn *fc,
 
 /* Abort all requests */
 void fuse_abort_conn(struct fuse_conn *fc);
+void fuse_wait_aborted(struct fuse_conn *fc);
 
 /**
  * Invalidate inode attributes
index f0b73e0..4b2eb65 100644 (file)
@@ -379,9 +379,6 @@ static void fuse_put_super(struct super_block *sb)
 {
        struct fuse_conn *fc = get_fuse_conn_super(sb);
 
-       fuse_send_destroy(fc);
-
-       fuse_abort_conn(fc);
        mutex_lock(&fuse_mutex);
        list_del(&fc->entry);
        fuse_ctl_remove_conn(fc);
@@ -1172,16 +1169,25 @@ static struct dentry *fuse_mount(struct file_system_type *fs_type,
        return mount_nodev(fs_type, flags, raw_data, fuse_fill_super);
 }
 
-static void fuse_kill_sb_anon(struct super_block *sb)
+static void fuse_sb_destroy(struct super_block *sb)
 {
        struct fuse_conn *fc = get_fuse_conn_super(sb);
 
        if (fc) {
+               fuse_send_destroy(fc);
+
+               fuse_abort_conn(fc);
+               fuse_wait_aborted(fc);
+
                down_write(&fc->killsb);
                fc->sb = NULL;
                up_write(&fc->killsb);
        }
+}
 
+static void fuse_kill_sb_anon(struct super_block *sb)
+{
+       fuse_sb_destroy(sb);
        kill_anon_super(sb);
 }
 
@@ -1204,14 +1210,7 @@ static struct dentry *fuse_mount_blk(struct file_system_type *fs_type,
 
 static void fuse_kill_sb_blk(struct super_block *sb)
 {
-       struct fuse_conn *fc = get_fuse_conn_super(sb);
-
-       if (fc) {
-               down_write(&fc->killsb);
-               fc->sb = NULL;
-               up_write(&fc->killsb);
-       }
-
+       fuse_sb_destroy(sb);
        kill_block_super(sb);
 }
 
index 39c75a8..666986b 100644 (file)
@@ -408,6 +408,50 @@ int sysfs_chmod_file(struct kobject *kobj, const struct attribute *attr,
 EXPORT_SYMBOL_GPL(sysfs_chmod_file);
 
 /**
+ * sysfs_break_active_protection - break "active" protection
+ * @kobj: The kernel object @attr is associated with.
+ * @attr: The attribute to break the "active" protection for.
+ *
+ * With sysfs, just like kernfs, deletion of an attribute is postponed until
+ * all active .show() and .store() callbacks have finished unless this function
+ * is called. Hence this function is useful in methods that implement self
+ * deletion.
+ */
+struct kernfs_node *sysfs_break_active_protection(struct kobject *kobj,
+                                                 const struct attribute *attr)
+{
+       struct kernfs_node *kn;
+
+       kobject_get(kobj);
+       kn = kernfs_find_and_get(kobj->sd, attr->name);
+       if (kn)
+               kernfs_break_active_protection(kn);
+       return kn;
+}
+EXPORT_SYMBOL_GPL(sysfs_break_active_protection);
+
+/**
+ * sysfs_unbreak_active_protection - restore "active" protection
+ * @kn: Pointer returned by sysfs_break_active_protection().
+ *
+ * Undo the effects of sysfs_break_active_protection(). Since this function
+ * calls kernfs_put() on the kernfs node that corresponds to the 'attr'
+ * argument passed to sysfs_break_active_protection() that attribute may have
+ * been removed between the sysfs_break_active_protection() and
+ * sysfs_unbreak_active_protection() calls, it is not safe to access @kn after
+ * this function has returned.
+ */
+void sysfs_unbreak_active_protection(struct kernfs_node *kn)
+{
+       struct kobject *kobj = kn->parent->priv;
+
+       kernfs_unbreak_active_protection(kn);
+       kernfs_put(kn);
+       kobject_put(kobj);
+}
+EXPORT_SYMBOL_GPL(sysfs_unbreak_active_protection);
+
+/**
  * sysfs_remove_file_ns - remove an object attribute with a custom ns tag
  * @kobj: object we're acting for
  * @attr: attribute descriptor
index 9c452f6..2839d62 100644 (file)
@@ -238,6 +238,9 @@ int __must_check sysfs_create_files(struct kobject *kobj,
                                   const struct attribute **attr);
 int __must_check sysfs_chmod_file(struct kobject *kobj,
                                  const struct attribute *attr, umode_t mode);
+struct kernfs_node *sysfs_break_active_protection(struct kobject *kobj,
+                                                 const struct attribute *attr);
+void sysfs_unbreak_active_protection(struct kernfs_node *kn);
 void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
                          const void *ns);
 bool sysfs_remove_file_self(struct kobject *kobj, const struct attribute *attr);
@@ -351,6 +354,17 @@ static inline int sysfs_chmod_file(struct kobject *kobj,
        return 0;
 }
 
+static inline struct kernfs_node *
+sysfs_break_active_protection(struct kobject *kobj,
+                             const struct attribute *attr)
+{
+       return NULL;
+}
+
+static inline void sysfs_unbreak_active_protection(struct kernfs_node *kn)
+{
+}
+
 static inline void sysfs_remove_file_ns(struct kobject *kobj,
                                        const struct attribute *attr,
                                        const void *ns)
index bbe9dd0..388bcac 100644 (file)
@@ -2441,7 +2441,7 @@ static int __init debugfs_kprobe_init(void)
        if (!dir)
                return -ENOMEM;
 
-       file = debugfs_create_file("list", 0444, dir, NULL,
+       file = debugfs_create_file("list", 0400, dir, NULL,
                                &debugfs_kprobes_operations);
        if (!file)
                goto error;
@@ -2451,7 +2451,7 @@ static int __init debugfs_kprobe_init(void)
        if (!file)
                goto error;
 
-       file = debugfs_create_file("blacklist", 0444, dir, NULL,
+       file = debugfs_create_file("blacklist", 0400, dir, NULL,
                                &debugfs_kprobe_blacklist_ops);
        if (!file)
                goto error;
index 4e2f98d..1464cab 100644 (file)
@@ -387,7 +387,8 @@ static struct ctl_table kern_table[] = {
                .data           = &sysctl_sched_time_avg,
                .maxlen         = sizeof(unsigned int),
                .mode           = 0644,
-               .proc_handler   = proc_dointvec,
+               .proc_handler   = proc_dointvec_minmax,
+               .extra1         = &one,
        },
        {
                .procname       = "sched_shares_window_ns",
index d5bb146..42db644 100644 (file)
@@ -3701,6 +3701,9 @@ int generic_access_phys(struct vm_area_struct *vma, unsigned long addr,
                return -EINVAL;
 
        maddr = ioremap_prot(phys_addr, PAGE_ALIGN(len + offset), prot);
+       if (!maddr)
+               return -ENOMEM;
+
        if (write)
                memcpy_toio(maddr + offset, buf, len);
        else
index 568015e..87a8491 100644 (file)
@@ -1018,6 +1018,15 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset,
                        ret = -ENOMEM;
                        goto reject;
                }
+
+               /* A second zswap_is_full() check after
+                * zswap_shrink() to make sure it's now
+                * under the max_pool_percent
+                */
+               if (zswap_is_full()) {
+                       ret = -ENOMEM;
+                       goto reject;
+               }
        }
 
        /* allocate entry */
index d730a0f..a0443d4 100644 (file)
@@ -131,8 +131,10 @@ static void caif_flow_cb(struct sk_buff *skb)
        caifd = caif_get(skb->dev);
 
        WARN_ON(caifd == NULL);
-       if (caifd == NULL)
+       if (!caifd) {
+               rcu_read_unlock();
                return;
+       }
 
        caifd_hold(caifd);
        rcu_read_unlock();
index 5f3b819..5169b9b 100644 (file)
@@ -1593,9 +1593,17 @@ unsigned char *cipso_v4_optptr(const struct sk_buff *skb)
        int taglen;
 
        for (optlen = iph->ihl*4 - sizeof(struct iphdr); optlen > 0; ) {
-               if (optptr[0] == IPOPT_CIPSO)
+               switch (optptr[0]) {
+               case IPOPT_CIPSO:
                        return optptr;
-               taglen = optptr[1];
+               case IPOPT_END:
+                       return NULL;
+               case IPOPT_NOOP:
+                       taglen = 1;
+                       break;
+               default:
+                       taglen = optptr[1];
+               }
                optlen -= taglen;
                optptr += taglen;
        }
index b8bf123..060862a 100644 (file)
@@ -469,10 +469,6 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)
                goto tx_err_dst_release;
        }
 
-       skb_scrub_packet(skb, !net_eq(t->net, dev_net(dev)));
-       skb_dst_set(skb, dst);
-       skb->dev = skb_dst(skb)->dev;
-
        mtu = dst_mtu(dst);
        if (!skb->ignore_df && skb->len > mtu) {
                skb_dst(skb)->ops->update_pmtu(dst, NULL, skb, mtu);
@@ -487,9 +483,14 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)
                                  htonl(mtu));
                }
 
-               return -EMSGSIZE;
+               err = -EMSGSIZE;
+               goto tx_err_dst_release;
        }
 
+       skb_scrub_packet(skb, !net_eq(t->net, dev_net(dev)));
+       skb_dst_set(skb, dst);
+       skb->dev = skb_dst(skb)->dev;
+
        err = dst_output(t->net, skb->sk, skb);
        if (net_xmit_eval(err) == 0) {
                struct pcpu_sw_netstats *tstats = this_cpu_ptr(dev->tstats);
index ec26a84..2214c77 100644 (file)
@@ -2006,7 +2006,8 @@ int ieee80211_reconfig(struct ieee80211_local *local)
                if (!sta->uploaded)
                        continue;
 
-               if (sta->sdata->vif.type != NL80211_IFTYPE_AP)
+               if (sta->sdata->vif.type != NL80211_IFTYPE_AP &&
+                   sta->sdata->vif.type != NL80211_IFTYPE_AP_VLAN)
                        continue;
 
                for (state = IEEE80211_STA_NOTEXIST;
index f20aa7c..fc92c8e 100644 (file)
@@ -3578,6 +3578,7 @@ static int parse_station_flags(struct genl_info *info,
                params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
                                         BIT(NL80211_STA_FLAG_MFP) |
                                         BIT(NL80211_STA_FLAG_AUTHORIZED);
+               break;
        default:
                return -EINVAL;
        }
index 6173a55..4615138 100644 (file)
@@ -2327,6 +2327,9 @@ struct dst_entry *xfrm_lookup_route(struct net *net, struct dst_entry *dst_orig,
        if (IS_ERR(dst) && PTR_ERR(dst) == -EREMOTE)
                return make_blackhole(net, dst_orig->ops->family, dst_orig);
 
+       if (IS_ERR(dst))
+               dst_release(dst_orig);
+
        return dst;
 }
 EXPORT_SYMBOL(xfrm_lookup_route);
index 8efc7c3..ee6037d 100644 (file)
@@ -988,10 +988,12 @@ static inline int xfrm_nlmsg_multicast(struct net *net, struct sk_buff *skb,
 {
        struct sock *nlsk = rcu_dereference(net->xfrm.nlsk);
 
-       if (nlsk)
-               return nlmsg_multicast(nlsk, skb, pid, group, GFP_ATOMIC);
-       else
-               return -1;
+       if (!nlsk) {
+               kfree_skb(skb);
+               return -EPIPE;
+       }
+
+       return nlmsg_multicast(nlsk, skb, pid, group, GFP_ATOMIC);
 }
 
 static inline size_t xfrm_spdinfo_msgsize(void)
index 45fc06c..6b504f4 100644 (file)
@@ -367,10 +367,9 @@ static int sirf_usp_pcm_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, usp);
 
        mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       base = devm_ioremap(&pdev->dev, mem_res->start,
-               resource_size(mem_res));
-       if (base == NULL)
-               return -ENOMEM;
+       base = devm_ioremap_resource(&pdev->dev, mem_res);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
        usp->regmap = devm_regmap_init_mmio(&pdev->dev, base,
                                            &sirf_usp_regmap_config);
        if (IS_ERR(usp->regmap))
index 43b80db..f99eb8f 100644 (file)
@@ -1570,6 +1570,14 @@ static u64 dpcm_runtime_base_format(struct snd_pcm_substream *substream)
                int i;
 
                for (i = 0; i < be->num_codecs; i++) {
+                       /*
+                        * Skip CODECs which don't support the current stream
+                        * type. See soc_pcm_init_runtime_hw() for more details
+                        */
+                       if (!snd_soc_dai_stream_valid(be->codec_dais[i],
+                                                     stream))
+                               continue;
+
                        codec_dai_drv = be->codec_dais[i]->driver;
                        if (stream == SNDRV_PCM_STREAM_PLAYBACK)
                                codec_stream = &codec_dai_drv->playback;
index 0dac7e0..33c79e4 100644 (file)
@@ -663,9 +663,7 @@ void format_all_counters(struct thread_data *t, struct core_data *c, struct pkg_
        if (!printed || !summary_only)
                print_header();
 
-       if (topo.num_cpus > 1)
-               format_counters(&average.threads, &average.cores,
-                       &average.packages);
+       format_counters(&average.threads, &average.cores, &average.packages);
 
        printed = 1;
 
@@ -2693,7 +2691,9 @@ void process_cpuid()
        family = (fms >> 8) & 0xf;
        model = (fms >> 4) & 0xf;
        stepping = fms & 0xf;
-       if (family == 6 || family == 0xf)
+       if (family == 0xf)
+               family += (fms >> 20) & 0xff;
+       if (family >= 6)
                model += ((fms >> 16) & 0xf) << 4;
 
        if (debug)
diff --git a/tools/testing/selftests/ftrace/test.d/00basic/snapshot.tc b/tools/testing/selftests/ftrace/test.d/00basic/snapshot.tc
new file mode 100644 (file)
index 0000000..3b1f45e
--- /dev/null
@@ -0,0 +1,28 @@
+#!/bin/sh
+# description: Snapshot and tracing setting
+# flags: instance
+
+[ ! -f snapshot ] && exit_unsupported
+
+echo "Set tracing off"
+echo 0 > tracing_on
+
+echo "Allocate and take a snapshot"
+echo 1 > snapshot
+
+# Since trace buffer is empty, snapshot is also empty, but allocated
+grep -q "Snapshot is allocated" snapshot
+
+echo "Ensure keep tracing off"
+test `cat tracing_on` -eq 0
+
+echo "Set tracing on"
+echo 1 > tracing_on
+
+echo "Take a snapshot again"
+echo 1 > snapshot
+
+echo "Ensure keep tracing on"
+test `cat tracing_on` -eq 1
+
+exit 0
index 88d5e71..47dfa0b 100644 (file)
 
 /******************** Little Endian Handling ********************************/
 
-#define cpu_to_le16(x)  htole16(x)
-#define cpu_to_le32(x)  htole32(x)
+/*
+ * cpu_to_le16/32 are used when initializing structures, a context where a
+ * function call is not allowed. To solve this, we code cpu_to_le16/32 in a way
+ * that allows them to be used when initializing structures.
+ */
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define cpu_to_le16(x)  (x)
+#define cpu_to_le32(x)  (x)
+#else
+#define cpu_to_le16(x)  ((((x) >> 8) & 0xffu) | (((x) & 0xffu) << 8))
+#define cpu_to_le32(x)  \
+       ((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >>  8) | \
+       (((x) & 0x0000ff00u) <<  8) | (((x) & 0x000000ffu) << 24))
+#endif
+
 #define le32_to_cpu(x)  le32toh(x)
 #define le16_to_cpu(x)  le16toh(x)
 
-
 /******************** Messages and Errors ***********************************/
 
 static const char argv0[] = "ffs-test";