3.4.108-rc1 review
Subsystems (3)
PATCH 167/172 don't bugger nd->seq on set_root_rcu() from follow_dotdot_rcu()
In reply to [email protected]From: Al Viro <[email protected]>
3.4.108-rc1 review patch. If anyone has any objections, please let me know.
------------------
commit 7bd88377d482e1eae3c5329b12e33cfd664fa6a9 upstream.
return the value instead, and have path_init() do the assignment. Broken by "vfs: Fix absolute RCU path walk failures due to uninitialized seq number", which was Cc-stable with 2.6.38+ as destination. This one should go where it went.
To avoid dummy value returned in case when root is already set (it would do no harm, actually, since the only caller that doesn't ignore the return value is guaranteed to have nd->root *not* set, but it's more obvious that way), lift the check into callers. And do the same to set_root(), to keep them in sync.
--- fs/namei.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/namei.c +2 -1
@@ -579,7 +579,8 @@ static __always_inline int __vfs_follow_link(struct nameidata *nd, const char *l goto fail;if (*link =='/' ) { -set_root (nd); +if (!nd->root.mnt) +set_root (nd);path_put (&nd->path); nd->path = nd->root;path_get (&nd->root);
Signature · 1 line
1.9.1
PATCH 168/172 cdc-acm: prevent infinite loop when parsing CDC headers.
In reply to [email protected]From: Quentin Casasnovas <[email protected]>
3.4.108-rc1 review patch. If anyone has any objections, please let me know.
------------------
commit 0d3bba0287d4e284c3ec7d3397e81eec920d5e7e upstream.
Phil and I found out a problem with commit:
7e860a6e7aa6 ("cdc-acm: add sanity checks")
It added some sanity checks to ignore potential garbage in CDC headers but also introduced a potential infinite loop. This can happen at the first loop iteration (elength = 0 in that case) if the description isn't a DT_CS_INTERFACE or later if 'buffer[0]' is zero.
It should also be noted that the wrong length was being added to 'buffer' in case 'buffer[1]' was not a DT_CS_INTERFACE descriptor, since elength was assigned after that check in the loop.
A specially crafted USB device could be used to trigger this infinite loop.
--- drivers/usb/class/cdc-acm.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/usb/class/cdc-acm.c +6 -1
@@ -1044,11 +1044,16 @@ static int acm_probe(struct usb_interface *intf, }while (buflen >0 ) { + elength = buffer[0 ]; +if (!elength) { +dev_err (&intf->dev,"skipping garbage byte\n" ); + elength =1 ; + goto next_desc; + }if (buffer[1 ] !=USB_DT_CS_INTERFACE ) {dev_err (&intf->dev,"skipping garbage\n" ); goto next_desc; } - elength = buffer[0 ];switch (buffer[2 ]) {case USB_CDC_UNION_TYPE :/* we've found it */
Signature · 1 line
1.9.1
PATCH 169/172 IB/core: don't disallow registering region starting at 0x0
In reply to [email protected]From: Yann Droneaud <[email protected]>
3.4.108-rc1 review patch. If anyone has any objections, please let me know.
------------------
commit 66578b0b2f69659f00b6169e6fe7377c4b100d18 upstream.
In a call to ib_umem_get(), if address is 0x0 and size is already page aligned, check added in commit 8494057ab5e4 ("IB/uverbs: Prevent integer overflow in ib_umem_get address arithmetic") will refuse to register a memory region that could otherwise be valid (provided vm.mmap_min_addr sysctl and mmap_low_allowed SELinux knobs allow userspace to map something at address 0x0).
This patch allows back such registration: ib_umem_get() should probably don't care of the base address provided it can be pinned with get_user_pages().
There's two possible overflows, in (addr + size) and in PAGE_ALIGN(addr + size), this patch keep ensuring none of them happen while allowing to pin memory at address 0x0. Anyway, the case of size equal 0 is no more (partially) handled as 0-length memory region are disallowed by an earlier check.
--- drivers/infiniband/core/umem.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/infiniband/core/umem.c +2 -2
@@ -98,8 +98,8 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,* If the combination of the addr and size requested for this memory * region causes an integer overflow, return error. */ -if ((PAGE_ALIGN (addr + size) <= size) || - (PAGE_ALIGN (addr + size) <= addr)) +if (((addr + size) < addr) || +PAGE_ALIGN (addr + size) < (addr + size))return ERR_PTR (-EINVAL );if (!can_do_mlock ())
Signature · 1 line
1.9.1
PATCH 170/172 writeback: use |1 instead of +1 to protect against div by zero
In reply to [email protected]From: Tejun Heo <[email protected]>
3.4.108-rc1 review patch. If anyone has any objections, please let me know.
------------------
commit 464d1387acb94dc43ba772b35242345e3d2ead1b upstream.
mm/page-writeback.c has several places where 1 is added to the divisor to prevent division by zero exceptions; however, if the original divisor is equivalent to -1, adding 1 leads to division by zero.
There are three places where +1 is used for this purpose - one in pos_ratio_polynom() and two in bdi_position_ratio(). The second one in bdi_position_ratio() actually triggered div-by-zero oops on a machine running a 3.10 kernel. The divisor is
x_intercept - bdi_setpoint + 1 == span + 1
span is confirmed to be (u32)-1. It isn't clear how it ended up that but it could be from write bandwidth calculation underflow fixed by c72efb658f7c ("writeback: fix possible underflow in write bandwidth calculation").
At any rate, +1 isn't a proper protection against div-by-zero. This patch converts all +1 protections to |1. Note that bdi_update_dirty_ratelimit() was already using |1 before this patch.
[lizf: Backported to 3.4: drop other two changes as there's only one
such statment in 3.4]
--- mm/page-writeback.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/page-writeback.c +1 -1
@@ -716,7 +716,7 @@ static unsigned long bdi_position_ratio(struct backing_dev_info *bdi,* scale global setpoint to bdi's: * bdi_setpoint = setpoint * bdi_thresh / thresh */ - x =div_u64 ((u64 )bdi_thresh <<16 , thresh +1 ); + x =div_u64 ((u64 )bdi_thresh <<16 , thresh |1 ); bdi_setpoint = setpoint * (u64 )x >>16 ;/* * Use span=(8*write_bw) in single bdi case as indicated by
Signature · 1 line
1.9.1
PATCH 171/172 xen-pciback: Add name prefix to global 'permissive' variable
In reply to [email protected]From: Ben Hutchings <[email protected]>
3.4.108-rc1 review patch. If anyone has any objections, please let me know.
------------------
commit 8014bcc86ef112eab9ee1db312dba4e6b608cf89 upstream.
The variable for the 'permissive' module parameter used to be static but was recently changed to be extern. This puts it in the kernel global namespace if the driver is built-in, so its name should begin with a prefix identifying the driver.
--- drivers/xen/xen-pciback/conf_space.c | 6 +++--- drivers/xen/xen-pciback/conf_space.h | 2 +- drivers/xen/xen-pciback/conf_space_header.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-)
drivers/xen/xen-pciback/conf_space.c +3 -3
@@ -16,8 +16,8 @@#include "conf_space.h" #include "conf_space_quirks.h" -bool permissive; -module_param (permissive, bool,0644 ); +bool xen_pcibk_permissive; +module_param_named (permissive, xen_pcibk_permissive, bool,0644 );/* This is where xen_pcibk_read_config_byte, xen_pcibk_read_config_word, * xen_pcibk_write_config_word, and xen_pcibk_write_config_byte are created. */
@@ -262,7 +262,7 @@ int xen_pcibk_config_write(struct pci_dev *dev, int offset, int size, u32 value)* This means that some fields may still be read-only because * they have entries in the config_field list that intercept * the write and do nothing. */ -if (dev_data->permissive || permissive) { +if (dev_data->permissive || xen_pcibk_permissive) {switch (size) {case 1 : err = pci_write_config_byte(dev, offset,
drivers/xen/xen-pciback/conf_space.h +1 -1
@@ -64,7 +64,7 @@ struct config_field_entry {void *data; }; -extern bool permissive; +extern bool xen_pcibk_permissive;#define OFFSET (cfg_entry) ((cfg_entry)->base_offset+(cfg_entry)->field->offset)
drivers/xen/xen-pciback/conf_space_header.c +1 -1
@@ -105,7 +105,7 @@ static int command_write(struct pci_dev *dev, int offset, u16 value, void *data) cmd->val = value; -if (!permissive && (!dev_data || !dev_data->permissive)) +if (!xen_pcibk_permissive && (!dev_data || !dev_data->permissive))return 0 ;/* Only allow the guest to control certain bits. */
Signature · 1 line
1.9.1
PATCH 172/172 slub: refactoring unfreeze_partials()
In reply to [email protected]From: Joonsoo Kim <[email protected]>
3.4.108-rc1 review patch. If anyone has any objections, please let me know.
------------------
commit 43d77867a4f333de4e4189114c480dd365133c09 upstream.
Current implementation of unfreeze_partials() is so complicated, but benefit from it is insignificant. In addition many code in
do {} while loop have a bad influence to a fail rate of cmpxchg_double_slab. Under current implementation which test status of cpu partial slab and acquire list_lock in do {} while loop,
we don't need to acquire a list_lock and gain a little benefit when front of the cpu partial slab is to be discarded, but this is a rare case. In case that add_partial is performed and cmpxchg_double_slab is failed, remove_partial should be called case by case.
I think that these are disadvantages of current implementation, so I do refactoring unfreeze_partials().
Minimizing code in do {} while loop introduce a reduced fail rate of cmpxchg_double_slab. Below is output of 'slabinfo -r kmalloc-256' when './perf stat -r 33 hackbench 50 process 4000 > /dev/null' is done.
** before **Cmpxchg_double Looping
------------------------
Locked Cmpxchg Double redos 182685
Unlocked Cmpxchg Double redos 0
** after **Cmpxchg_double Looping
------------------------
Locked Cmpxchg Double redos 177995
Unlocked Cmpxchg Double redos 1
We can see cmpxchg_double_slab fail rate is improved slightly.
Bolow is output of './perf stat -r 30 hackbench 50 process 4000 > /dev/null'.
** before **
Performance counter stats for './hackbench 50 process 4000' (30 runs):
108517.190463 task-clock # 7.926 CPUs utilized ( +- 0.24% )
2,919,550 context-switches # 0.027 M/sec ( +- 3.07% )
100,774 CPU-migrations # 0.929 K/sec ( +- 4.72% )
124,201 page-faults # 0.001 M/sec ( +- 0.15% )
401,500,234,387 cycles # 3.700 GHz ( +- 0.24% )
<not supported> stalled-cycles-frontend
<not supported> stalled-cycles-backend
250,576,913,354 instructions # 0.62 insns per cycle ( +- 0.13% )
45,934,956,860 branches # 423.297 M/sec ( +- 0.14% )
188,219,787 branch-misses # 0.41% of all branches ( +- 0.56% )13.691837307 seconds time elapsed ( +- 0.24% )
** after **
Performance counter stats for './hackbench 50 process 4000' (30 runs):
107784.479767 task-clock # 7.928 CPUs utilized ( +- 0.22% )
2,834,781 context-switches # 0.026 M/sec ( +- 2.33% )
93,083 CPU-migrations # 0.864 K/sec ( +- 3.45% )
123,967 page-faults # 0.001 M/sec ( +- 0.15% )
398,781,421,836 cycles # 3.700 GHz ( +- 0.22% )
<not supported> stalled-cycles-frontend
<not supported> stalled-cycles-backend
250,189,160,419 instructions # 0.63 insns per cycle ( +- 0.09% )
45,855,370,128 branches # 425.436 M/sec ( +- 0.10% )
169,881,248 branch-misses # 0.37% of all branches ( +- 0.43% )13.596272341 seconds time elapsed ( +- 0.22% )
No regression is found, but rather we can see slightly better result.
--- mm/slub.c | 48 ++++++++++++++---------------------------------- 1 file changed, 14 insertions(+), 34 deletions(-)
mm/slub.c +14 -34
@@ -1882,18 +1882,24 @@ redo:/* Unfreeze all the cpu partial slabs */ static void unfreeze_partials (struct kmem_cache *s) { -struct kmem_cache_node *n =NULL ; +struct kmem_cache_node *n =NULL , *n2 =NULL ;struct kmem_cache_cpu *c =this_cpu_ptr (s->cpu_slab);struct page *page, *discard_page =NULL ;while ((page = c->partial)) { -enum slab_modes {M_PARTIAL ,M_FREE }; -enum slab_modes l, m;struct page new;struct page old; c->partial = page->next; - l =M_FREE ; + + n2 =get_node (s,page_to_nid (page)); +if (n != n2) { +if (n) +spin_unlock (&n->list_lock); + + n = n2; +spin_lock (&n->list_lock); + } do {
@@ -1906,43 +1912,17 @@ static void unfreeze_partials(struct kmem_cache *s) new.frozen =0 ; -if (!new.inuse && (!n || n->nr_partial > s->min_partial)) - m =M_FREE ; -else { -struct kmem_cache_node *n2 =get_node (s, -page_to_nid (page)); - - m =M_PARTIAL ; -if (n != n2) { -if (n) -spin_unlock (&n->list_lock); - - n = n2; -spin_lock (&n->list_lock); - } - } - -if (l != m) { -if (l ==M_PARTIAL ) { -remove_partial (n, page); -stat (s,FREE_REMOVE_PARTIAL ); - }else { -add_partial (n, page, -DEACTIVATE_TO_TAIL ); -stat (s,FREE_ADD_PARTIAL ); - } - - l = m; - } - }while (!cmpxchg_double_slab (s, page, old.freelist, old.counters, new.freelist, new.counters,"unfreezing slab" )); -if (m ==M_FREE ) { +if (unlikely (!new.inuse && n->nr_partial > s->min_partial)) { page->next = discard_page; discard_page = page; + }else { +add_partial (n, page,DEACTIVATE_TO_TAIL ); +stat (s,FREE_ADD_PARTIAL ); } }
Signature · 1 line
1.9.1
From: Zefan Li <[email protected]>
This is the combined patch for 3.4.106-rc1 relative to 3.4.105.
---
Makefile +2 -2
@@ -1,7 +1,7 @@ VERSION = 3 PATCHLEVEL = 4 -SUBLEVEL = 107 -EXTRAVERSION = +SUBLEVEL = 108 +EXTRAVERSION = -rc1 NAME = Saber-toothed Squirrel # *DOCUMENTATION*
arch/alpha/kernel/pci-sysfs.c +2 -2
@@ -84,7 +84,7 @@ static int pci_mmap_resource(struct kobject *kobj,if (iomem_is_exclusive (res->start))return -EINVAL ; -pcibios_resource_to_bus (pdev, &bar, res); +pcibios_resource_to_bus (pdev->bus, &bar, res); vma->vm_pgoff += bar.start >> (PAGE_SHIFT - (sparse ?5 :0 )); mmap_type = res->flags &IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io;
@@ -140,7 +140,7 @@ static int sparse_mem_mmap_fits(struct pci_dev *pdev, int num)long dense_offset;unsigned long sparse_size; -pcibios_resource_to_bus (pdev, &bar, &pdev->resource[num]); +pcibios_resource_to_bus (pdev->bus, &bar, &pdev->resource[num]);/* All core logic chips have 4G sparse address space, except CIA which has 16G (see xxx_SPARSE_MEM and xxx_DENSE_MEM
arch/arm/mach-at91/pm.h +1 -1
@@ -38,7 +38,7 @@ static inline void at91rm9200_standby(void) " mcr p15, 0, %0, c7, c0, 4\n\t" " str %5, [%1, %2]" : - : "r" (0), "r" (AT91_BASE_SYS), "r" (AT91RM9200_SDRAMC_LPR), + : "r" (0), "r" (at91_ramc_base[0]), "r" (AT91RM9200_SDRAMC_LPR),"r" (1 ),"r" (AT91RM9200_SDRAMC_SRR ), "r" (lpr)); }
arch/arm/mach-pxa/corgi.c +3 -0
@@ -26,6 +26,7 @@#include <linux/i2c.h> #include <linux/i2c/pxa-i2c.h> #include <linux/io.h> +#include <linux/regulator/machine.h> #include <linux/spi/spi.h> #include <linux/spi/ads7846.h> #include <linux/spi/corgi_lcd.h>
@@ -711,6 +712,8 @@ static void __init corgi_init(void) sharpsl_nand_partitions[1 ].size =53 *1024 *1024 ;platform_add_devices (devices,ARRAY_SIZE (devices)); + +regulator_has_full_constraints (); } static void __init fixup_corgi(struct tag *tags, char **cmdline,
arch/arm/mach-pxa/hx4700.c +2 -0
@@ -881,6 +881,8 @@ static void __init hx4700_init(void)mdelay (10 );gpio_set_value (GPIO71_HX4700_ASIC3_nRESET,1 );mdelay (10 ); + +regulator_has_full_constraints (); }MACHINE_START (H4700 ,"HP iPAQ HX4700" )
arch/arm/mach-pxa/poodle.c +2 -0
@@ -25,6 +25,7 @@#include <linux/gpio.h> #include <linux/i2c.h> #include <linux/i2c/pxa-i2c.h> +#include <linux/regulator/machine.h> #include <linux/spi/spi.h> #include <linux/spi/ads7846.h> #include <linux/spi/pxa2xx_spi.h>
@@ -452,6 +453,7 @@ static void __init poodle_init(void)pxa_set_i2c_info (NULL );i2c_register_board_info (0 ,ARRAY_AND_SIZE (poodle_i2c_devices));poodle_init_spi (); +regulator_has_full_constraints (); } static void __init fixup_poodle(struct tag *tags, char **cmdline,
arch/arm/mach-pxa/spitz.c +2 -0
@@ -968,6 +968,8 @@ static void __init spitz_init(void)spitz_nor_init ();spitz_nand_init ();spitz_i2c_init (); + +regulator_has_full_constraints (); } static void __init spitz_fixup(struct tag *tags, char **cmdline,
arch/arm/mach-sa1100/pm.c +1 -0
@@ -80,6 +80,7 @@ static int sa11x0_pm_enter(suspend_state_t state)/* * Ensure not to come back here if it wasn't intended */ +RCSR =RCSR_SMR ;PSPR =0 ;/*
arch/powerpc/boot/dts/fsl/pq3-etsec2-0.dtsi +1 -0
@@ -50,6 +50,7 @@ ethernet@b0000 { fsl,num_tx_queues = <0x8>; fsl,magic-packet; local-mac-address = [ 00 00 00 00 00 00 ]; + ranges; queue-group@b0000 { #address-cells = <1>;
arch/powerpc/boot/dts/fsl/pq3-etsec2-1.dtsi +1 -0
@@ -50,6 +50,7 @@ ethernet@b1000 { fsl,num_tx_queues = <0x8>; fsl,magic-packet; local-mac-address = [ 00 00 00 00 00 00 ]; + ranges; queue-group@b1000 { #address-cells = <1>;
arch/powerpc/boot/dts/fsl/pq3-etsec2-2.dtsi +1 -0
@@ -49,6 +49,7 @@ ethernet@b2000 { fsl,num_tx_queues = <0x8>; fsl,magic-packet; local-mac-address = [ 00 00 00 00 00 00 ]; + ranges; queue-group@b2000 { #address-cells = <1>;
arch/powerpc/kernel/pci_of_scan.c +2 -2
@@ -111,7 +111,7 @@ static void of_pci_parse_addrs(struct device_node *node, struct pci_dev *dev) res->name =pci_name (dev); region.start = base; region.end = base + size -1 ; -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion); } }
@@ -276,7 +276,7 @@ void __devinit of_scan_pci_bridge(struct pci_dev *dev) res->flags = flags; region.start =of_read_number (&ranges[1 ],2 ); region.end = region.start + size -1 ; -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion); }sprintf (bus->name,"PCI Bus %04x:%02x" ,pci_domain_nr (bus), bus->number);
arch/powerpc/platforms/powernv/pci-ioda.c +2 -2
@@ -392,7 +392,7 @@ static void __devinit pnv_ioda_setup_pe_segments(struct pci_dev *dev)/* Setup IO segments */ if (io_res.start < io_res.end) { -pcibios_resource_to_bus (dev, ®ion, &io_res); +pcibios_resource_to_bus (dev->bus, ®ion, &io_res); pos = region.start; i = pos / phb->ioda.io_segsize;while (i < phb->ioda.total_pe && pos <= region.end) {
@@ -422,7 +422,7 @@ static void __devinit pnv_ioda_setup_pe_segments(struct pci_dev *dev)/* Setup M32 segments */ if (m32_res.start < m32_res.end) { -pcibios_resource_to_bus (dev, ®ion, &m32_res); +pcibios_resource_to_bus (dev->bus, ®ion, &m32_res); pos = region.start; i = pos / phb->ioda.m32_segsize;while (i < phb->ioda.total_pe && pos <= region.end) {
arch/powerpc/sysdev/axonram.c +1 -1
@@ -155,7 +155,7 @@ axon_ram_direct_access(struct block_device *device, sector_t sector, } *kaddr = (void *)(bank->ph_addr + offset); - *pfn =virt_to_phys (kaddr) >>PAGE_SHIFT ; + *pfn =virt_to_phys (*kaddr) >>PAGE_SHIFT ;return 0 ; }
arch/s390/kvm/kvm-s390.c +1 -1
@@ -347,7 +347,7 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) vcpu->arch.sie_block->ecb =6 ; vcpu->arch.sie_block->eca =0xC1002001U ; vcpu->arch.sie_block->fac = (int ) (long ) facilities; -hrtimer_init (&vcpu->arch.ckc_timer,CLOCK_REALTIME ,HRTIMER_MODE_ABS ); +hrtimer_init (&vcpu->arch.ckc_timer,CLOCK_MONOTONIC ,HRTIMER_MODE_REL );tasklet_init (&vcpu->arch.tasklet, kvm_s390_tasklet, (unsigned long ) vcpu); vcpu->arch.ckc_timer.function = kvm_s390_idle_wakeup;
arch/sparc/kernel/pci.c +6 -6
@@ -409,7 +409,7 @@ static void __devinit pci_cfg_fake_ranges(struct pci_dev *dev, res2.flags = res->flags; region.start = base; region.end = limit +0xfff ; -pcibios_bus_to_resource (dev, &res2, ®ion); +pcibios_bus_to_resource (dev->bus, &res2, ®ion);if (!res->start) res->start = res2.start;if (!res->end)
@@ -427,7 +427,7 @@ static void __devinit pci_cfg_fake_ranges(struct pci_dev *dev, IORESOURCE_MEM); region.start = base; region.end = limit +0xfffff ; -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion); }pci_read_config_word (dev,PCI_PREF_MEMORY_BASE , &mem_base_lo);
@@ -458,7 +458,7 @@ static void __devinit pci_cfg_fake_ranges(struct pci_dev *dev, IORESOURCE_MEM | IORESOURCE_PREFETCH); region.start = base; region.end = limit +0xfffff ; -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion); } }
@@ -480,7 +480,7 @@ static void __devinit apb_fake_ranges(struct pci_dev *dev, res->flags =IORESOURCE_IO ; region.start = (first <<21 ); region.end = (last <<21 ) + ((1 <<21 ) -1 ); -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion);pci_read_config_byte (dev,APB_MEM_ADDRESS_MAP , &map);apb_calc_first_last (map, &first, &last);
@@ -488,7 +488,7 @@ static void __devinit apb_fake_ranges(struct pci_dev *dev, res->flags =IORESOURCE_MEM ; region.start = (first <<29 ); region.end = (last <<29 ) + ((1 <<29 ) -1 ); -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion); } static void __devinit pci_of_scan_bus(struct pci_pbm_info *pbm,
@@ -579,7 +579,7 @@ static void __devinit of_scan_pci_bridge(struct pci_pbm_info *pbm, res->flags = flags; region.start =GET_64BIT (ranges,1 ); region.end = region.start + size -1 ; -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion); } after_ranges: sprintf(bus->name, "PCI Bus %04x:%02x", pci_domain_nr(bus),
arch/x86/Kconfig +1 -1
@@ -129,7 +129,7 @@ config SBUS bool config NEED_DMA_MAP_STATE - def_bool (X86_64 || INTEL_IOMMU || DMA_API_DEBUG) + def_bool (X86_64 || INTEL_IOMMU || DMA_API_DEBUG || SWIOTLB) config NEED_SG_DMA_LENGTH def_bool y
arch/x86/crypto/aesni-intel_glue.c +2 -2
@@ -1203,7 +1203,7 @@ static int __driver_rfc4106_decrypt(struct aead_request *req) src =kmalloc (req->cryptlen + req->assoclen,GFP_ATOMIC );if (!src)return -ENOMEM ; - assoc = (src + req->cryptlen + auth_tag_len); + assoc = (src + req->cryptlen);scatterwalk_map_and_copy (src, req->src,0 , req->cryptlen,0 );scatterwalk_map_and_copy (assoc, req->assoc,0 , req->assoclen,0 );
@@ -1228,7 +1228,7 @@ static int __driver_rfc4106_decrypt(struct aead_request *req)scatterwalk_done (&src_sg_walk,0 ,0 );scatterwalk_done (&assoc_sg_walk,0 ,0 ); }else { -scatterwalk_map_and_copy (dst, req->dst,0 , req->cryptlen,1 ); +scatterwalk_map_and_copy (dst, req->dst,0 , tempCipherLen,1 );kfree (src); }return retval;
arch/x86/kernel/entry_64.S +8 -5
@@ -414,11 +414,14 @@ ENTRY(ret_from_fork) testl $3, CS-ARGOFFSET(%rsp) # from kernel_thread? jz retint_restore_args - testl $_TIF_IA32, TI_flags(%rcx) # 32-bit compat task needs IRET - jnz int_ret_from_sys_call - - RESTORE_TOP_OF_STACK %rdi, -ARGOFFSET - jmp ret_from_sys_call # go to the SYSRET fastpath + /* + * By the time we get here, we have no idea whether our pt_regs, + * ti flags, and ti status came from the 64-bit SYSCALL fast path, + * the slow path, or one of the ia32entry paths. + * Use int_ret_from_sys_call to return, since it can safely handle + * all of the above. + */ + jmp int_ret_from_sys_call CFI_ENDPROC END(ret_from_fork)
arch/x86/kernel/reboot.c +16 -2
@@ -439,6 +439,17 @@ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "iMac9,1"), }, }, + +/* ASRock */ + {/* Handle problems with rebooting on ASRock Q1900DC-ITX */ + .callback = set_pci_reboot, + .ident = "ASRock Q1900DC-ITX", + .matches = { +DMI_MATCH (DMI_BOARD_VENDOR ,"ASRock" ), + DMI_MATCH(DMI_BOARD_NAME, "Q1900DC-ITX"), + }, + }, + { /* Handle problems with rebooting on the Latitude E6320. */ .callback = set_pci_reboot, .ident = "Dell Latitude E6320",
@@ -690,9 +701,12 @@ void native_machine_shutdown(void)/* Make certain I only run on the appropriate processor */ set_cpus_allowed_ptr (current,cpumask_of (reboot_cpu_id)); -/* O.K Now that I'm on the appropriate processor, -* stop all of the others. +/* +* O.K Now that I'm on the appropriate processor, stop all of the +* others. Also disable the local irq to not receive the per-cpu +* timer interrupt which may trigger scheduler's load balance. */ +local_irq_disable ();stop_other_cpus ();#endif
arch/x86/kernel/traps.c +1 -1
@@ -435,7 +435,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)* then it's very likely the result of an icebp/int01 trap. * User wants a sigtrap for that. */ -if (!dr6 &&user_mode (regs)) +if (!dr6 &&user_mode_vm (regs)) user_icebp =1 ;/* Catch kmemcheck conditions first of all! */
arch/x86/kvm/emulate.c +2 -1
@@ -4246,7 +4246,8 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt)if (rc !=X86EMUL_CONTINUE ) goto done; } - ctxt->dst.orig_val = ctxt->dst.val; +/* Copy full 64-bit value for CMPXCHG8B. */ + ctxt->dst.orig_val64 = ctxt->dst.val64; special_insn:
arch/x86/vdso/vdso32/sigreturn.S +1 -0
@@ -17,6 +17,7 @@ .text .globl __kernel_sigreturn .type __kernel_sigreturn,@function + nop /* this guy is needed for .LSTARTFDEDLSI1 below (watch for HACK) */ ALIGN __kernel_sigreturn: .LSTART_sigreturn:
drivers/acpi/video.c +11 -0
@@ -1872,6 +1872,17 @@ EXPORT_SYMBOL(acpi_video_unregister);static int __init acpi_video_init (void ) { +/* +* Let the module load even if ACPI is disabled (e.g. due to +* a broken BIOS) so that i915.ko can still be loaded on such +* old systems without an AcpiOpRegion. +* +* acpi_video_register() will report -ENODEV later as well due +* to acpi_disabled when i915.ko tries to register itself afterwards. +*/ +if (acpi_disabled) +return 0 ; +dmi_check_system (video_dmi_table);if (intel_opregion_present ())
drivers/block/nbd.c +4 -4
@@ -773,10 +773,6 @@ static int __init nbd_init(void)return -EINVAL ; } - nbd_dev =kcalloc (nbds_max,sizeof (*nbd_dev),GFP_KERNEL ); -if (!nbd_dev) -return -ENOMEM ; - part_shift =0 ;if (max_part >0 ) { part_shift =fls (max_part);
@@ -798,6 +794,10 @@ static int __init nbd_init(void)if (nbds_max >1UL << (MINORBITS - part_shift))return -EINVAL ; + nbd_dev =kcalloc (nbds_max,sizeof (*nbd_dev),GFP_KERNEL ); +if (!nbd_dev) +return -ENOMEM ; +for (i =0 ; i < nbds_max; i++) {struct gendisk *disk =alloc_disk (1 << part_shift);if (!disk)
drivers/bluetooth/ath3k.c +2 -0
@@ -101,6 +101,7 @@ static struct usb_device_id ath3k_table[] = { { USB_DEVICE(0x13d3, 0x3393) }, { USB_DEVICE(0x13d3, 0x3402) }, { USB_DEVICE(0x13d3, 0x3408) }, + { USB_DEVICE(0x13d3, 0x3423) }, { USB_DEVICE(0x13d3, 0x3432) },/* Atheros AR5BBU12 with sflash firmware */
@@ -149,6 +150,7 @@ static struct usb_device_id ath3k_blist_tbl[] = { { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },/* Atheros AR5BBU22 with sflash firmware */
drivers/bluetooth/btusb.c +1 -0
@@ -179,6 +179,7 @@ static struct usb_device_id blacklist_table[] = { { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },/* Atheros AR5BBU12 with sflash firmware */
drivers/char/virtio_console.c +18 -1
@@ -124,6 +124,7 @@ struct ports_device {* notification */ struct work_struct control_work; +struct work_struct config_work;struct list_head ports;
@@ -1555,10 +1556,21 @@ static void config_intr(struct virtio_device *vdev) portdev = vdev->priv; +if (!use_multiport (portdev)) +schedule_work (&portdev->config_work); +} + +static void config_work_handler (struct work_struct *work) +{ +struct ports_device *portdev; + + portdev = container_of(work, struct ports_device, control_work);if (!use_multiport (portdev)) { +struct virtio_device *vdev;struct port *port;u16 rows, cols; + vdev = portdev->vdev; vdev->config->get (vdev, offsetof(struct virtio_console_config , cols), &cols,sizeof (u16));
@@ -1752,12 +1764,14 @@ static int __devinit virtcons_probe(struct virtio_device *vdev)spin_lock_init (&portdev->ports_lock);INIT_LIST_HEAD (&portdev->ports); +INIT_WORK (&portdev->config_work, &config_work_handler); +INIT_WORK (&portdev->control_work, &control_work_handler); +if (multiport) {unsigned int nr_added_bufs;spin_lock_init (&portdev->c_ivq_lock);spin_lock_init (&portdev->c_ovq_lock); -INIT_WORK (&portdev->control_work, &control_work_handler); nr_added_bufs =fill_queue (portdev->c_ivq, &portdev->c_ivq_lock);
@@ -1825,6 +1839,8 @@ static void virtcons_remove(struct virtio_device *vdev)/* Finish up work that's lined up */ if (use_multiport (portdev))cancel_work_sync (&portdev->control_work); +else +cancel_work_sync (&portdev->config_work);list_for_each_entry_safe (port, port2, &portdev->ports, list)unplug_port (port);
@@ -1866,6 +1882,7 @@ static int virtcons_freeze(struct virtio_device *vdev)virtqueue_disable_cb (portdev->c_ivq);cancel_work_sync (&portdev->control_work); +cancel_work_sync (&portdev->config_work);/* * Once more: if control_work_handler() was running, it would * enable the cb as the last step.
drivers/cpufreq/speedstep-lib.c +3 -0
@@ -400,6 +400,7 @@ unsigned int speedstep_get_freqs(enum speedstep_processor processor,pr_debug ("previous speed is %u\n" , prev_speed); +preempt_disable ();local_irq_save (flags);/* switch to low state */
@@ -464,6 +465,8 @@ unsigned int speedstep_get_freqs(enum speedstep_processor processor, out:local_irq_restore (flags); +preempt_enable (); +return ret; }EXPORT_SYMBOL_GPL (speedstep_get_freqs);
drivers/cpufreq/speedstep-smi.c +12 -0
@@ -188,6 +188,7 @@ static void speedstep_set_state(unsigned int state)return ;/* Disable IRQs */ +preempt_disable ();local_irq_save (flags); command = (smi_sig &0xffffff00 ) | (smi_cmd &0xff );
@@ -198,9 +199,19 @@ static void speedstep_set_state(unsigned int state) do { if (retry) { + /* + * We need to enable interrupts, otherwise the blockage + * won't resolve. + * + * We disable preemption so that other processes don't + * run. If other processes were running, they could + * submit more DMA requests, making the blockage worse. + */ pr_debug("retry %u, previous result %u, waiting...\n", retry, result); + local_irq_enable(); mdelay(retry * 50); + local_irq_disable(); } retry++; __asm__ __volatile__(
@@ -217,6 +228,7 @@ static void speedstep_set_state(unsigned int state)/* enable IRQs */ local_irq_restore (flags); +preempt_enable ();if (new_state == state) pr_debug("change to %u MHz succeeded after %u tries "
drivers/edac/sb_edac.c +19 -19
@@ -672,7 +672,7 @@ static void get_memory_layout(const struct mem_ctl_info *mci)u32 reg;u64 limit, prv =0 ;u64 tmp_mb; -u32 mb, kb; +u32 gb, mb;u32 rir_way;/*
@@ -685,9 +685,9 @@ static void get_memory_layout(const struct mem_ctl_info *mci) pvt->tolm =GET_TOLM (reg); tmp_mb = (1 + pvt->tolm) >>20 ; - mb =div_u64_rem (tmp_mb,1000 , &kb); -debugf0 ("TOLM: %u.%03u GB (0x%016Lx)\n" , - mb, kb, (u64 )pvt->tolm); + gb =div_u64_rem (tmp_mb,1024 , &mb); +debugf0 ("TOHM: %u.%03u GB (0x%016Lx)\n" , + gb, (mb*1000 )/1024 , (u64 )pvt->tohm);/* Address range is already 45:25 */ pci_read_config_dword(pvt->pci_sad1, TOHM,
@@ -695,9 +695,9 @@ static void get_memory_layout(const struct mem_ctl_info *mci) pvt->tohm =GET_TOHM (reg); tmp_mb = (1 + pvt->tohm) >>20 ; - mb =div_u64_rem (tmp_mb,1000 , &kb); + gb =div_u64_rem (tmp_mb,1024 , &mb);debugf0 ("TOHM: %u.%03u GB (0x%016Lx)" , - mb, kb, (u64 )pvt->tohm); + gb, (mb*1000 )/1024 , (u64 )pvt->tohm);/* * Step 2) Get SAD range and SAD Interleave list
@@ -719,11 +719,11 @@ static void get_memory_layout(const struct mem_ctl_info *mci)break ; tmp_mb = (limit +1 ) >>20 ; - mb =div_u64_rem (tmp_mb,1000 , &kb); + gb =div_u64_rem (tmp_mb,1000 , &mb);debugf0 ("SAD#%d %s up to %u.%03u GB (0x%016Lx) %s reg=0x%08x\n" , n_sads,get_dram_attr (reg), - mb, kb, + gb, (mb*1000 )/1024 , ((u64 )tmp_mb) <<20L ,INTERLEAVE_MODE (reg) ?"Interleave: 8:6" :"Interleave: [8:6]XOR[18:16]" , reg);
@@ -753,9 +753,9 @@ static void get_memory_layout(const struct mem_ctl_info *mci)break ; tmp_mb = (limit +1 ) >>20 ; - mb =div_u64_rem (tmp_mb,1000 , &kb); + gb =div_u64_rem (tmp_mb,1000 , &mb); debugf0("TAD#%d: up to %u.%03u GB (0x%016Lx), socket interleave %d, memory interleave %d, TGT: %d, %d, %d, %d, reg=0x%08x\n", - n_tads, mb, kb, + n_tads, gb, (mb*1000)/1024, ((u64)tmp_mb) << 20L, (u32)TAD_SOCK(reg), (u32)TAD_CH(reg),
@@ -778,10 +778,10 @@ static void get_memory_layout(const struct mem_ctl_info *mci) tad_ch_nilv_offset[j], ®); tmp_mb =TAD_OFFSET (reg) >>20 ; - mb =div_u64_rem (tmp_mb,1000 , &kb); + gb =div_u64_rem (tmp_mb,1024 , &mb);debugf0 ("TAD CH#%d, offset #%d: %u.%03u GB (0x%016Lx), reg=0x%08x\n" , i, j, - mb, kb, + gb, (mb*1000 )/1024 , ((u64 )tmp_mb) <<20L , reg); }
@@ -803,10 +803,10 @@ static void get_memory_layout(const struct mem_ctl_info *mci) tmp_mb =RIR_LIMIT (reg) >>20 ; rir_way =1 <<RIR_WAY (reg); - mb =div_u64_rem (tmp_mb,1000 , &kb); + gb =div_u64_rem (tmp_mb,1024 , &mb);debugf0 ("CH#%d RIR#%d, limit: %u.%03u GB (0x%016Lx), way: %d, reg=0x%08x\n" , i, j, - mb, kb, + gb, (mb*1000 )/1024 , ((u64 )tmp_mb) <<20L , rir_way, reg);
@@ -817,10 +817,10 @@ static void get_memory_layout(const struct mem_ctl_info *mci) ®); tmp_mb =RIR_OFFSET (reg) <<6 ; - mb =div_u64_rem (tmp_mb,1000 , &kb); + gb =div_u64_rem (tmp_mb,1024 , &mb);debugf0 ("CH#%d RIR#%d INTL#%d, offset %u.%03u GB (0x%016Lx), tgt: %d, reg=0x%08x\n" , i, j, k, - mb, kb, + gb, (mb*1000 )/1024 , ((u64 )tmp_mb) <<20L , (u32 )RIR_RNK_TGT (reg), reg);
@@ -858,7 +858,7 @@ static int get_memory_error_data(struct mem_ctl_info *mci,u8 ch_way,sck_way;u32 tad_offset;u32 rir_way; -u32 mb, kb; +u32 gb, mb;u64 ch_addr, offset, limit, prv =0 ;
@@ -1084,10 +1084,10 @@ static int get_memory_error_data(struct mem_ctl_info *mci,continue ; limit =RIR_LIMIT (reg); - mb =div_u64_rem (limit >>20 ,1000 , &kb); + gb =div_u64_rem (limit >>20 ,1024 , &mb);debugf0 ("RIR#%d, limit: %u.%03u GB (0x%016Lx), way: %d\n" , n_rir, - mb, kb, + gb, (mb*1000 )/1024 , limit,1 <<RIR_WAY (reg));if (ch_addr <= limit)
drivers/gpio/gpio-tps65912.c +10 -4
@@ -26,9 +26,12 @@ struct tps65912_gpio_data {struct gpio_chip gpio_chip; }; +#define to_tgd (gc) container_of(gc, struct tps65912_gpio_data, gpio_chip) +static int tps65912_gpio_get (struct gpio_chip *gc,unsigned offset) { - struct tps65912 *tps65912 = container_of(gc, struct tps65912, gpio); +struct tps65912_gpio_data *tps65912_gpio =to_tgd (gc); +struct tps65912 *tps65912 = tps65912_gpio->tps65912;int val; val =tps65912_reg_read (tps65912,TPS65912_GPIO1 + offset);
@@ -42,7 +45,8 @@ static int tps65912_gpio_get(struct gpio_chip *gc, unsigned offset)static void tps65912_gpio_set (struct gpio_chip *gc,unsigned offset,int value) { - struct tps65912 *tps65912 = container_of(gc, struct tps65912, gpio); +struct tps65912_gpio_data *tps65912_gpio =to_tgd (gc); +struct tps65912 *tps65912 = tps65912_gpio->tps65912;if (value) tps65912_set_bits(tps65912, TPS65912_GPIO1 + offset,
@@ -55,7 +59,8 @@ static void tps65912_gpio_set(struct gpio_chip *gc, unsigned offset,static int tps65912_gpio_output (struct gpio_chip *gc,unsigned offset,int value) { - struct tps65912 *tps65912 = container_of(gc, struct tps65912, gpio); +struct tps65912_gpio_data *tps65912_gpio =to_tgd (gc); +struct tps65912 *tps65912 = tps65912_gpio->tps65912;/* Set the initial value */ tps65912_gpio_set (gc, offset, value);
@@ -66,7 +71,8 @@ static int tps65912_gpio_output(struct gpio_chip *gc, unsigned offset,static int tps65912_gpio_input (struct gpio_chip *gc,unsigned offset) { - struct tps65912 *tps65912 = container_of(gc, struct tps65912, gpio); +struct tps65912_gpio_data *tps65912_gpio =to_tgd (gc); +struct tps65912 *tps65912 = tps65912_gpio->tps65912;return tps65912_clear_bits (tps65912,TPS65912_GPIO1 + offset,GPIO_CFG_MASK );
drivers/gpu/drm/radeon/atombios_dp.c +1 -3
@@ -777,10 +777,8 @@ static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info)radeon_write_dpcd_reg (dp_info->radeon_connector,DP_DOWNSPREAD_CTRL ,0 ); -if ((dp_info->connector->connector_type == DRM_MODE_CONNECTOR_eDP) && - (dig->panel_mode ==DP_PANEL_MODE_INTERNAL_DP2_MODE )) { +if (dig->panel_mode ==DP_PANEL_MODE_INTERNAL_DP2_MODE )radeon_write_dpcd_reg (dp_info->radeon_connector,DP_EDP_CONFIGURATION_SET ,1 ); - }/* set the lane count on the sink */ tmp = dp_info->dp_lane_count;
drivers/gpu/drm/radeon/evergreen.c +3 -0
@@ -3474,6 +3474,9 @@ int evergreen_init(struct radeon_device *rdev) } } +/* posting read */ +RREG32 (SRBM_STATUS ); +return 0 ; }
drivers/gpu/drm/radeon/r100.c +4 -0
@@ -726,6 +726,10 @@ int r100_irq_set(struct radeon_device *rdev) tmp |=RADEON_FP2_DETECT_MASK ; }WREG32 (RADEON_GEN_INT_CNTL , tmp); + +/* read back to post the write */ +RREG32 (RADEON_GEN_INT_CNTL ); +return 0 ; }
drivers/gpu/drm/radeon/r600.c +3 -0
@@ -3184,6 +3184,9 @@ int r600_irq_set(struct radeon_device *rdev)WREG32 (DC_HOT_PLUG_DETECT3_INT_CONTROL , hpd3); } +/* posting read */ +RREG32 (R_000E50_SRBM_STATUS ); +return 0 ; }
drivers/gpu/drm/radeon/radeon_bios.c +7 -3
@@ -76,7 +76,7 @@ static bool igp_read_bios_from_vram(struct radeon_device *rdev)static bool radeon_read_bios (struct radeon_device *rdev) { -uint8_t __iomem *bios; +uint8_t __iomem *bios, val1, val2;size_t size; rdev->bios =NULL ;
@@ -86,15 +86,19 @@ static bool radeon_read_bios(struct radeon_device *rdev)return false; } -if (size ==0 || bios[0 ] !=0x55 || bios[1 ] !=0xaa ) { + val1 =readb (&bios[0 ]); + val2 =readb (&bios[1 ]); + +if (size ==0 || val1 !=0x55 || val2 !=0xaa ) {pci_unmap_rom (rdev->pdev, bios);return false; } - rdev->bios =kmemdup (bios, size,GFP_KERNEL ); + rdev->bios =kzalloc (size,GFP_KERNEL );if (rdev->bios ==NULL ) {pci_unmap_rom (rdev->pdev, bios);return false; } +memcpy_fromio (rdev->bios, bios, size);pci_unmap_rom (rdev->pdev, bios);return true; }
drivers/gpu/drm/radeon/radeon_cs.c +3 -1
@@ -167,11 +167,13 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)u32 ring =RADEON_CS_RING_GFX ;s32 priority =0 ; +INIT_LIST_HEAD (&p->validated); +if (!cs->num_chunks) {return 0 ; } +/* get chunks */ -INIT_LIST_HEAD (&p->validated); p->idx =0 ; p->chunk_ib_idx =-1 ; p->chunk_relocs_idx =-1 ;
drivers/gpu/drm/radeon/rs600.c +4 -0
@@ -585,6 +585,10 @@ int rs600_irq_set(struct radeon_device *rdev)WREG32 (R_006540_DxMODE_INT_MASK, mode_int);WREG32 (R_007D08_DC_HOT_PLUG_DETECT1_INT_CONTROL , hpd1);WREG32 (R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL , hpd2); + +/* posting read */ +RREG32 (R_000040_GEN_INT_CNTL ); +return 0 ; }
drivers/gpu/drm/radeon/si.c +3 -0
@@ -4126,6 +4126,9 @@ int si_init(struct radeon_device *rdev)return -EINVAL ; } +/* posting read */ +RREG32 (SRBM_STATUS ); +return 0 ; }
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +25 -21
82 lines not on this page · raw message
drivers/infiniband/core/umem.c +8 -0
@@ -94,6 +94,14 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,if (dmasync)dma_set_attr (DMA_ATTR_WRITE_BARRIER , &attrs); +/* +* If the combination of the addr and size requested for this memory +* region causes an integer overflow, return error. +*/ +if (((addr + size) < addr) || +PAGE_ALIGN (addr + size) < (addr + size)) +return ERR_PTR (-EINVAL ); +if (!can_do_mlock ())return ERR_PTR (-EPERM );
drivers/infiniband/core/uverbs_main.c +1 -0
@@ -451,6 +451,7 @@ static void ib_uverbs_async_handler(struct ib_uverbs_file *file, entry->desc.async.element = element; entry->desc.async.event_type = event; + entry->desc.async.reserved =0 ; entry->counter = counter;list_add_tail (&entry->list, &file->async_file->event_list);
drivers/infiniband/hw/mlx4/mad.c +16 -4
@@ -44,6 +44,14 @@ enum { MLX4_IB_VENDOR_CLASS2 = 0xa }; +/* Counters should be saturate once they reach their maximum value */ +#define ASSIGN_32BIT_COUNTER (counter, value) do {\ + if ((value) > (u32)~0U) \ + counter = cpu_to_be32((u32)~0U); \ + else \ + counter = cpu_to_be32(value); \ +} while (0) +int mlx4_MAD_IFC (struct mlx4_ib_dev *dev,int ignore_mkey,int ignore_bkey,int port,struct ib_wc *in_wc,struct ib_grh *in_grh,void *in_mad,void *response_mad)
@@ -304,10 +312,14 @@ static int ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,static void edit_counter (struct mlx4_counter *cnt,struct ib_pma_portcounters *pma_cnt) { - pma_cnt->port_xmit_data =cpu_to_be32 ((be64_to_cpu (cnt->tx_bytes)>>2 )); - pma_cnt->port_rcv_data =cpu_to_be32 ((be64_to_cpu (cnt->rx_bytes)>>2 )); - pma_cnt->port_xmit_packets =cpu_to_be32 (be64_to_cpu (cnt->tx_frames)); - pma_cnt->port_rcv_packets =cpu_to_be32 (be64_to_cpu (cnt->rx_frames)); +ASSIGN_32BIT_COUNTER (pma_cnt->port_xmit_data, + (be64_to_cpu (cnt->tx_bytes) >>2 )); +ASSIGN_32BIT_COUNTER (pma_cnt->port_rcv_data, + (be64_to_cpu (cnt->rx_bytes) >>2 )); +ASSIGN_32BIT_COUNTER (pma_cnt->port_xmit_packets, +be64_to_cpu (cnt->tx_frames)); +ASSIGN_32BIT_COUNTER (pma_cnt->port_rcv_packets, +be64_to_cpu (cnt->rx_frames)); } static int iboe_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
drivers/infiniband/hw/qib/qib.h +1 -8
@@ -1013,12 +1013,6 @@ struct qib_devdata {/* control high-level access to EEPROM */ struct mutex eep_lock;uint64_t traffic_wds; -/* active time is kept in seconds, but logged in hours */ -atomic_t active_time; -/* Below are nominal shadow of EEPROM, new since last EEPROM update */ -uint8_t eep_st_errs[QIB_EEP_LOG_CNT ]; -uint8_t eep_st_new_errs[QIB_EEP_LOG_CNT ]; -uint16_t eep_hrs;/* * masks for which bits of errs, hwerrs that cause * each of the counters to increment.
@@ -1235,8 +1229,7 @@ int qib_twsi_blk_rd(struct qib_devdata *dd, int dev, int addr, void *buffer,int qib_twsi_blk_wr (struct qib_devdata *dd,int dev,int addr,const void *buffer,int len);void qib_get_eeprom_info (struct qib_devdata *); -int qib_update_eeprom_log (struct qib_devdata *dd); -void qib_inc_eeprom_err (struct qib_devdata *dd,u32 eidx,u32 incr); +#define qib_inc_eeprom_err (dd, eidx, incr)void qib_dump_lookup_output_queue (struct qib_devdata *);void qib_force_pio_avail_update (struct qib_devdata *);void qib_clear_symerror_on_linkup (unsigned long opaque);
drivers/infiniband/hw/qib/qib_eeprom.c +0 -181
189 lines not on this page · raw message
drivers/infiniband/hw/qib/qib_iba6120.c +0 -2
@@ -2674,8 +2674,6 @@ static void qib_get_6120_faststats(unsigned long opaque)spin_lock_irqsave (&dd->eep_st_lock, flags); traffic_wds -= dd->traffic_wds; dd->traffic_wds += traffic_wds; -if (traffic_wds >=QIB_TRAFFIC_ACTIVE_THRESHOLD ) -atomic_add (5 , &dd->active_time);/* S/B #define */ spin_unlock_irqrestore (&dd->eep_st_lock, flags);qib_chk_6120_errormask (dd);
drivers/infiniband/hw/qib/qib_iba7220.c +0 -2
@@ -3292,8 +3292,6 @@ static void qib_get_7220_faststats(unsigned long opaque)spin_lock_irqsave (&dd->eep_st_lock, flags); traffic_wds -= dd->traffic_wds; dd->traffic_wds += traffic_wds; -if (traffic_wds >=QIB_TRAFFIC_ACTIVE_THRESHOLD ) -atomic_add (5 , &dd->active_time);/* S/B #define */ spin_unlock_irqrestore (&dd->eep_st_lock, flags); done:mod_timer (&dd->stats_timer, jiffies +HZ *ACTIVITY_TIMER );
drivers/infiniband/hw/qib/qib_iba7322.c +0 -2
@@ -4841,8 +4841,6 @@ static void qib_get_7322_faststats(unsigned long opaque)spin_lock_irqsave (&ppd->dd->eep_st_lock, flags); traffic_wds -= ppd->dd->traffic_wds; ppd->dd->traffic_wds += traffic_wds; -if (traffic_wds >=QIB_TRAFFIC_ACTIVE_THRESHOLD ) -atomic_add (ACTIVITY_TIMER , &ppd->dd->active_time);spin_unlock_irqrestore (&ppd->dd->eep_st_lock, flags); if (ppd->cpspec->qdr_dfe_on && (ppd->link_speed_active & QIB_IB_QDR) &&
drivers/infiniband/hw/qib/qib_init.c +0 -1
@@ -765,7 +765,6 @@ static void qib_shutdown_device(struct qib_devdata *dd) dd->f_quiet_serdes (ppd); } -qib_update_eeprom_log (dd); }/**
drivers/infiniband/hw/qib/qib_sysfs.c +0 -24
@@ -550,28 +550,6 @@ bail:return ret <0 ? ret : count; } -static ssize_t show_logged_errs (struct device *device, -struct device_attribute *attr,char *buf) -{ -struct qib_ibdev *dev = - container_of(device, struct qib_ibdev, ibdev.dev); -struct qib_devdata *dd =dd_from_dev (dev); -int idx, count; - -/* force consistency with actual EEPROM */ -if (qib_update_eeprom_log (dd) !=0 ) -return -ENXIO ; - - count =0 ; -for (idx =0 ; idx <QIB_EEP_LOG_CNT ; ++idx) { - count +=scnprintf (buf + count,PAGE_SIZE - count,"%d%c" , - dd->eep_st_errs[idx], - idx == (QIB_EEP_LOG_CNT -1 ) ?'\n' :' ' ); - } - -return count; -} -/* * Dump tempsense regs. in decimal, to ease shell-scripts. */
@@ -618,7 +596,6 @@ static DEVICE_ATTR(nctxts, S_IRUGO, show_nctxts, NULL); static DEVICE_ATTR(nfreectxts, S_IRUGO, show_nfreectxts, NULL); static DEVICE_ATTR(serial, S_IRUGO, show_serial, NULL); static DEVICE_ATTR(boardversion, S_IRUGO, show_boardversion, NULL); -static DEVICE_ATTR(logged_errors, S_IRUGO, show_logged_errs, NULL); static DEVICE_ATTR(tempsense, S_IRUGO, show_tempsense, NULL); static DEVICE_ATTR(localbus_info, S_IRUGO, show_localbus_info, NULL); static DEVICE_ATTR(chip_reset, S_IWUSR, NULL, store_chip_reset);
@@ -632,7 +609,6 @@ static struct device_attribute *qib_attributes[] = { &dev_attr_nfreectxts, &dev_attr_serial, &dev_attr_boardversion, - &dev_attr_logged_errors, &dev_attr_tempsense, &dev_attr_localbus_info, &dev_attr_chip_reset,
drivers/input/mouse/synaptics.c +47 -26
109 lines not on this page · raw message
drivers/md/dm-io.c +13 -1
@@ -298,6 +298,18 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where,sector_t remaining = where->count;struct request_queue *q =bdev_get_queue (where->bdev);sector_t discard_sectors; +unsigned int uninitialized_var (special_cmd_max_sectors ); + +/* +* Reject unsupported discard and write same requests. +*/ +if (rw &REQ_DISCARD ) { + special_cmd_max_sectors = q->limits.max_discard_sectors; +if (special_cmd_max_sectors ==0 ) { +dec_count (io, region, -EOPNOTSUPP ); +return ; + } + }/* * where->count may be zero if rw holds a flush and we need to
@@ -321,7 +333,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where,store_io_and_region_in_bio (bio, io, region);if (rw &REQ_DISCARD ) { - discard_sectors =min_t (sector_t, q->limits.max_discard_sectors, remaining); + discard_sectors =min_t (sector_t, special_cmd_max_sectors, remaining); bio->bi_size = discard_sectors <<SECTOR_SHIFT ; remaining -= discard_sectors; }else while (remaining) {
drivers/md/dm-raid1.c +9 -0
@@ -603,6 +603,15 @@ static void write_callback(unsigned long error, void *context)return ; } +/* +* If the bio is discard, return an error, but do not +* degrade the array. +*/ +if (bio->bi_rw &REQ_DISCARD ) { +bio_endio (bio, -EOPNOTSUPP ); +return ; + } +for (i =0 ; i < ms->nr_mirrors; i++)if (test_bit (i, &error))fail_mirror (ms->mirror + i,DM_RAID1_WRITE_ERROR );
drivers/md/dm-snap.c +2 -2
@@ -1444,8 +1444,6 @@ out: full_bio->bi_end_io = pe->full_bio_end_io; full_bio->bi_private = pe->full_bio_private; } -free_pending_exception (pe); -increment_pending_exceptions_done_count ();up_write (&s->lock);
@@ -1462,6 +1460,8 @@ out: }retry_origin_bios (s, origin_bios); + +free_pending_exception (pe); }static void commit_callback (void *context,int success)
drivers/md/dm.c +16 -17
@@ -2232,7 +2232,7 @@ int dm_setup_md_queue(struct mapped_device *md)return 0 ; } -static struct mapped_device *dm_find_md (dev_t dev) +struct mapped_device *dm_get_md (dev_t dev) {struct mapped_device *md;unsigned minor =MINOR (dev);
@@ -2243,12 +2243,15 @@ static struct mapped_device *dm_find_md(dev_t dev)spin_lock (&_minor_lock); md =idr_find (&_minor_idr, minor); -if (md && (md ==MINOR_ALLOCED || - (MINOR (disk_devt (dm_disk (md))) != minor) || -dm_deleting_md (md) || -test_bit (DMF_FREEING , &md->flags))) { - md =NULL ; - goto out; +if (md) { +if ((md ==MINOR_ALLOCED || + (MINOR (disk_devt (dm_disk (md))) != minor) || +dm_deleting_md (md) || +test_bit (DMF_FREEING , &md->flags))) { + md =NULL ; + goto out; + } +dm_get (md); } out:
@@ -2256,16 +2259,6 @@ out:return md; } - -struct mapped_device *dm_get_md (dev_t dev) -{ -struct mapped_device *md =dm_find_md (dev); - -if (md) -dm_get (md); - -return md; -}EXPORT_SYMBOL_GPL (dm_get_md);void *dm_get_mdptr (struct mapped_device *md)
@@ -2302,10 +2295,16 @@ static void __dm_destroy(struct mapped_device *md, bool wait)set_bit (DMF_FREEING , &md->flags);spin_unlock (&_minor_lock); +/* +* Take suspend_lock so that presuspend and postsuspend methods +* do not race with internal suspend. +*/ +mutex_lock (&md->suspend_lock);if (!dm_suspended_md (md)) {dm_table_presuspend_targets (map);dm_table_postsuspend_targets (map); } +mutex_unlock (&md->suspend_lock);/* * Rare, but there may be I/O requests still going to complete,
drivers/mtd/ubi/misc.c +2 -0
@@ -74,6 +74,8 @@ int ubi_check_volume(struct ubi_device *ubi, int vol_id)for (i =0 ; i < vol->used_ebs; i++) {int size; +cond_resched (); +if (i == vol->used_ebs -1 ) size = vol->last_eb_bytes;else
drivers/net/can/dev.c +5 -0
@@ -475,6 +475,11 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) skb->protocol =htons (ETH_P_CAN ); skb->pkt_type =PACKET_BROADCAST ; skb->ip_summed =CHECKSUM_UNNECESSARY ; + +skb_reset_mac_header (skb); +skb_reset_network_header (skb); +skb_reset_transport_header (skb); + *cf = (struct can_frame *)skb_put (skb,sizeof (struct can_frame ));memset (*cf,0 ,sizeof (struct can_frame ));
drivers/net/ethernet/amd/pcnet32.c +29 -2
@@ -1526,7 +1526,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) {struct pcnet32_private *lp;int i, media; -int fdx, mii, fset, dxsuflo; +int fdx, mii, fset, dxsuflo, sram;int chip_version;char *chipname;struct net_device *dev;
@@ -1563,7 +1563,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) }/* initialize variables */ - fdx = mii = fset = dxsuflo =0 ; + fdx = mii = fset = dxsuflo = sram =0 ; chip_version = (chip_version >>12 ) &0xffff ;switch (chip_version) {
@@ -1596,6 +1596,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) chipname ="PCnet/FAST III 79C973" ;/* PCI */ fdx =1 ; mii =1 ; + sram =1 ;break ;case 0x2626 : chipname ="PCnet/Home 79C978" ;/* PCI */
@@ -1619,6 +1620,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) chipname ="PCnet/FAST III 79C975" ;/* PCI */ fdx =1 ; mii =1 ; + sram =1 ;break ;case 0x2628 : chipname ="PCnet/PRO 79C976" ;
@@ -1647,6 +1649,31 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) dxsuflo =1 ; } +/* +* The Am79C973/Am79C975 controllers come with 12K of SRAM +* which we can use for the Tx/Rx buffers but most importantly, +* the use of SRAM allow us to use the BCR18:NOUFLO bit to avoid +* Tx fifo underflows. +*/ +if (sram) { +/* +* The SRAM is being configured in two steps. First we +* set the SRAM size in the BCR25:SRAM_SIZE bits. According +* to the datasheet, each bit corresponds to a 512-byte +* page so we can have at most 24 pages. The SRAM_SIZE +* holds the value of the upper 8 bits of the 16-bit SRAM size. +* The low 8-bits start at 0x00 and end at 0xff. So the +* address range is from 0x0000 up to 0x17ff. Therefore, +* the SRAM_SIZE is set to 0x17. The next step is to set +* the BCR26:SRAM_BND midway through so the Tx and Rx +* buffers can share the SRAM equally. +*/ + a->write_bcr (ioaddr,25 ,0x17 ); + a->write_bcr (ioaddr,26 ,0xc ); +/* And finally enable the NOUFLO bit */ + a->write_bcr (ioaddr,18 , a->read_bcr (ioaddr,18 ) | (1 <<11 )); + } + dev =alloc_etherdev (sizeof (*lp));if (!dev) { ret = -ENOMEM ;
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +4 -0
@@ -10934,6 +10934,10 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev,/* clean indirect addresses */ pci_write_config_dword (bp->pdev,PCICFG_GRC_ADDRESS ,PCICFG_VENDOR_ID_OFFSET ); + +/* Set PCIe reset type to fundamental for EEH recovery */ + pdev->needs_freset =1 ; +/* * Clean the following indirect addresses for all functions since it * is not used by the driver.
drivers/net/team/team.c +1 -3
@@ -39,9 +39,7 @@static struct team_port *team_port_get_rcu (const struct net_device *dev) { -struct team_port *port =rcu_dereference (dev->rx_handler_data); - -return team_port_exists (dev) ? port :NULL ; +return rcu_dereference (dev->rx_handler_data); }static struct team_port *team_port_get_rtnl (const struct net_device *dev)
drivers/net/wireless/ath/ath5k/reset.c +1 -1
@@ -476,7 +476,7 @@ ath5k_hw_wisoc_reset(struct ath5k_hw *ah, u32 flags) regval =ioread32 (reg);iowrite32 (regval | val, reg); regval =ioread32 (reg); -usleep_range (100 ,150 ); +udelay (100 );/* NB: should be atomic */ /* Bring BB/MAC out of reset */ iowrite32 (regval & ~val, reg);
drivers/pci/hotplug.c +1 -1
@@ -27,7 +27,7 @@ int pci_uevent(struct device *dev, struct kobj_uevent_env *env)if (add_uevent_var (env,"PCI_SLOT_NAME=%s" ,pci_name (pdev)))return -ENOMEM ; - if (add_uevent_var(env, "MODALIAS=pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02x", + if (add_uevent_var(env, "MODALIAS=pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02X", pdev->vendor, pdev->device, pdev->subsystem_vendor, pdev->subsystem_device, (u8)(pdev->class >> 16), (u8)(pdev->class >> 8),
drivers/pci/probe.c +15 -17
@@ -44,12 +44,10 @@ int no_pci_devices(void) }EXPORT_SYMBOL (no_pci_devices); -static struct pci_host_bridge *pci_host_bridge (struct pci_dev *dev) +static struct pci_host_bridge *pci_host_bridge (struct pci_bus *bus) { -struct pci_bus *bus;struct pci_host_bridge *bridge; - bus = dev->bus;while (bus->parent) bus = bus->parent;
@@ -66,10 +64,10 @@ static bool resource_contains(struct resource *res1, struct resource *res2)return res1->start <= res2->start && res1->end >= res2->end; } -void pcibios_resource_to_bus (struct pci_dev *dev,struct pci_bus_region *region, +void pcibios_resource_to_bus (struct pci_bus *bus,struct pci_bus_region *region,struct resource *res) { -struct pci_host_bridge *bridge =pci_host_bridge (dev); +struct pci_host_bridge *bridge =pci_host_bridge (bus);struct pci_host_bridge_window *window;resource_size_t offset =0 ;
@@ -94,10 +92,10 @@ static bool region_contains(struct pci_bus_region *region1,return region1->start <= region2->start && region1->end >= region2->end; } -void pcibios_bus_to_resource (struct pci_dev *dev,struct resource *res, +void pcibios_bus_to_resource (struct pci_bus *bus,struct resource *res,struct pci_bus_region *region) { -struct pci_host_bridge *bridge =pci_host_bridge (dev); +struct pci_host_bridge *bridge =pci_host_bridge (bus);struct pci_host_bridge_window *window;struct pci_bus_region bus_region;resource_size_t offset =0 ;
@@ -298,11 +296,11 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,pci_write_config_dword (dev, pos +4 ,0 ); region.start =0 ; region.end = sz64; -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion); }else { region.start = l64; region.end = l64 + sz64; -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion);dev_printk (KERN_DEBUG , &dev->dev,"reg %x: %pR\n" , pos, res); }
@@ -314,7 +312,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, region.start = l; region.end = l + sz; -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion);dev_printk (KERN_DEBUG , &dev->dev,"reg %x: %pR\n" , pos, res); }
@@ -373,7 +371,7 @@ static void __devinit pci_read_bridge_io(struct pci_bus *child) res2.flags = res->flags; region.start = base; region.end = limit +0xfff ; -pcibios_bus_to_resource (dev, &res2, ®ion); +pcibios_bus_to_resource (dev->bus, &res2, ®ion);if (!res->start) res->start = res2.start;if (!res->end)
@@ -399,7 +397,7 @@ static void __devinit pci_read_bridge_mmio(struct pci_bus *child) res->flags = (mem_base_lo &PCI_MEMORY_RANGE_TYPE_MASK ) |IORESOURCE_MEM ; region.start = base; region.end = limit +0xfffff ; -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion);dev_printk (KERN_DEBUG , &dev->dev," bridge window %pR\n" , res); } }
@@ -448,7 +446,7 @@ static void __devinit pci_read_bridge_mmio_pref(struct pci_bus *child) res->flags |=IORESOURCE_MEM_64 ; region.start = base; region.end = limit +0xfffff ; -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion);dev_printk (KERN_DEBUG , &dev->dev," bridge window %pR\n" , res); } }
@@ -1063,24 +1061,24 @@ int pci_setup_device(struct pci_dev *dev) region.end =0x1F7 ; res = &dev->resource[0 ]; res->flags =LEGACY_IO_RESOURCE ; -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion); region.start =0x3F6 ; region.end =0x3F6 ; res = &dev->resource[1 ]; res->flags =LEGACY_IO_RESOURCE ; -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion); }if ((progif &4 ) ==0 ) { region.start =0x170 ; region.end =0x177 ; res = &dev->resource[2 ]; res->flags =LEGACY_IO_RESOURCE ; -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion); region.start =0x376 ; region.end =0x376 ; res = &dev->resource[3 ]; res->flags =LEGACY_IO_RESOURCE ; -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion); } }break ;
drivers/pci/quirks.c +1 -1
@@ -393,7 +393,7 @@ static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region,/* Convert from PCI bus to resource space. */ bus_region.start = res->start; bus_region.end = res->end; -pcibios_bus_to_resource (dev, res, &bus_region); +pcibios_bus_to_resource (dev->bus, res, &bus_region);if (pci_claim_resource (dev, nr) ==0 ) dev_info(&dev->dev, "quirk: %pR claimed by %s\n",
drivers/pci/rom.c +5 -4
@@ -31,7 +31,7 @@ int pci_enable_rom(struct pci_dev *pdev)if (!res->flags)return -1 ; -pcibios_resource_to_bus (pdev, ®ion, res); +pcibios_resource_to_bus (pdev->bus, ®ion, res);pci_read_config_dword (pdev, pdev->rom_base_reg, &rom_addr); rom_addr &= ~PCI_ROM_ADDRESS_MASK ; rom_addr |= region.start |PCI_ROM_ADDRESS_ENABLE ;
@@ -69,6 +69,7 @@ size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size) {void __iomem *image;int last_image; +unsigned length; image = rom; do {
@@ -91,9 +92,9 @@ size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size)if (readb (pds +3 ) !='R' )break ; last_image =readb (pds +21 ) &0x80 ; -/* this length is reliable */ - image +=readw (pds +16 ) *512 ; - }while (!last_image); + length =readw (pds +16 ); + image += length *512 ; + }while (length && !last_image);/* never return a size larger than the PCI resource window */ /* there are known ROMs that get the size wrong */
drivers/pci/setup-bus.c +7 -7
@@ -408,7 +408,7 @@ void pci_setup_cardbus(struct pci_bus *bus) bus->secondary, bus->subordinate); res = bus->resource[0 ]; -pcibios_resource_to_bus (bridge, ®ion, res); +pcibios_resource_to_bus (bridge->bus, ®ion, res);if (res->flags &IORESOURCE_IO ) {/* * The IO resource is allocated a range twice as large as it
@@ -422,7 +422,7 @@ void pci_setup_cardbus(struct pci_bus *bus) } res = bus->resource[1 ]; -pcibios_resource_to_bus (bridge, ®ion, res); +pcibios_resource_to_bus (bridge->bus, ®ion, res);if (res->flags &IORESOURCE_IO ) {dev_info (&bridge->dev," bridge window %pR\n" , res); pci_write_config_dword(bridge, PCI_CB_IO_BASE_1,
@@ -432,7 +432,7 @@ void pci_setup_cardbus(struct pci_bus *bus) } res = bus->resource[2 ]; -pcibios_resource_to_bus (bridge, ®ion, res); +pcibios_resource_to_bus (bridge->bus, ®ion, res);if (res->flags &IORESOURCE_MEM ) {dev_info (&bridge->dev," bridge window %pR\n" , res); pci_write_config_dword(bridge, PCI_CB_MEMORY_BASE_0,
@@ -442,7 +442,7 @@ void pci_setup_cardbus(struct pci_bus *bus) } res = bus->resource[3 ]; -pcibios_resource_to_bus (bridge, ®ion, res); +pcibios_resource_to_bus (bridge->bus, ®ion, res);if (res->flags &IORESOURCE_MEM ) {dev_info (&bridge->dev," bridge window %pR\n" , res); pci_write_config_dword(bridge, PCI_CB_MEMORY_BASE_1,
@@ -473,7 +473,7 @@ static void pci_setup_bridge_io(struct pci_bus *bus)/* Set up the top and bottom of the PCI I/O segment for this bus. */ res = bus->resource[0 ]; -pcibios_resource_to_bus (bridge, ®ion, res); +pcibios_resource_to_bus (bridge->bus, ®ion, res);if (res->flags &IORESOURCE_IO ) {pci_read_config_dword (bridge,PCI_IO_BASE , &l); l &=0xffff0000 ;
@@ -504,7 +504,7 @@ static void pci_setup_bridge_mmio(struct pci_bus *bus)/* Set up the top and bottom of the PCI Memory segment for this bus. */ res = bus->resource[1 ]; -pcibios_resource_to_bus (bridge, ®ion, res); +pcibios_resource_to_bus (bridge->bus, ®ion, res);if (res->flags &IORESOURCE_MEM ) { l = (region.start >>16 ) &0xfff0 ; l |= region.end &0xfff00000 ;
@@ -530,7 +530,7 @@ static void pci_setup_bridge_mmio_pref(struct pci_bus *bus)/* Set up PREF base/limit. */ bu = lu =0 ; res = bus->resource[2 ]; -pcibios_resource_to_bus (bridge, ®ion, res); +pcibios_resource_to_bus (bridge->bus, ®ion, res);if (res->flags &IORESOURCE_PREFETCH ) { l = (region.start >>16 ) &0xfff0 ; l |= region.end &0xfff00000 ;
drivers/pci/setup-res.c +1 -1
@@ -50,7 +50,7 @@ void pci_update_resource(struct pci_dev *dev, int resno)if (res->flags &IORESOURCE_PCI_FIXED )return ; -pcibios_resource_to_bus (dev, ®ion, res); +pcibios_resource_to_bus (dev->bus, ®ion, res); new = region.start | (res->flags &PCI_REGION_FLAG_MASK );if (res->flags &IORESOURCE_IO )
drivers/pcmcia/i82092.c +1 -1
@@ -610,7 +610,7 @@ static int i82092aa_set_mem_map(struct pcmcia_socket *socket, struct pccard_mem_enter ("i82092aa_set_mem_map" ); -pcibios_resource_to_bus (sock_info->dev, ®ion, mem->res); +pcibios_resource_to_bus (sock_info->dev->bus, ®ion, mem->res); map = mem->map;if (map >4 ) {
drivers/pcmcia/yenta_socket.c +3 -3
@@ -445,7 +445,7 @@ static int yenta_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *unsigned int start, stop, card_start;unsigned short word; -pcibios_resource_to_bus (socket->dev, ®ion, mem->res); +pcibios_resource_to_bus (socket->dev->bus, ®ion, mem->res); map = mem->map; start = region.start;
@@ -709,7 +709,7 @@ static int yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned type region.start =config_readl (socket, addr_start) & mask; region.end =config_readl (socket, addr_end) | ~mask;if (region.start && region.end > region.start && !override_bios) { -pcibios_bus_to_resource (dev, res, ®ion); +pcibios_bus_to_resource (dev->bus, res, ®ion);if (pci_claim_resource (dev,PCI_BRIDGE_RESOURCES + nr) ==0 )return 0 ; dev_printk(KERN_INFO, &dev->dev,
@@ -1033,7 +1033,7 @@ static void yenta_config_init(struct yenta_socket *socket)struct pci_dev *dev = socket->dev;struct pci_bus_region region; -pcibios_resource_to_bus (socket->dev, ®ion, &dev->resource[0 ]); +pcibios_resource_to_bus (socket->dev->bus, ®ion, &dev->resource[0 ]);config_writel (socket,CB_LEGACY_MODE_BASE ,0 );config_writel (socket,PCI_BASE_ADDRESS_0 , region.start);
drivers/scsi/be2iscsi/be_main.c +1 -2
@@ -424,7 +424,6 @@ static struct beiscsi_hba *beiscsi_hba_alloc(struct pci_dev *pcidev) "iscsi_host_alloc failed\n");return NULL ; } - shost->dma_boundary = pcidev->dma_mask; shost->max_id =BE2_MAX_SESSIONS ; shost->max_channel =0 ; shost->max_cmd_len =BEISCSI_MAX_CMD_LEN ;
@@ -4399,9 +4398,9 @@ free_port: hba_free:if (phba->msix_enabled)pci_disable_msix (phba->pcidev); -iscsi_host_remove (phba->shost);pci_dev_put (phba->pcidev);iscsi_host_free (phba->shost); +pci_set_drvdata (pcidev,NULL ); disable_pci:pci_disable_device (pcidev);return ret;
drivers/scsi/hpsa.c +39 -15
100 lines not on this page · raw message
drivers/scsi/libsas/sas_discover.c +4 -2
@@ -446,6 +446,7 @@ static void sas_revalidate_domain(struct work_struct *work)struct sas_discovery_event *ev =to_sas_discovery_event (work);struct asd_sas_port *port = ev->port;struct sas_ha_struct *ha = port->ha; +struct domain_device *ddev = port->port_dev;/* prevent revalidation from finding sata links in recovery */ mutex_lock (&ha->disco_mutex);
@@ -460,8 +461,9 @@ static void sas_revalidate_domain(struct work_struct *work)SAS_DPRINTK ("REVALIDATING DOMAIN on port %d, pid:%d\n" , port->id,task_pid_nr (current)); -if (port->port_dev) - res =sas_ex_revalidate_domain (port->port_dev); +if (ddev && (ddev->dev_type ==SAS_FANOUT_EXPANDER_DEVICE || + ddev->dev_type ==SAS_EDGE_EXPANDER_DEVICE )) + res =sas_ex_revalidate_domain (ddev);SAS_DPRINTK ("done REVALIDATING DOMAIN on port %d, pid:%d, res 0x%x\n" , port->id,task_pid_nr (current), res);
drivers/scsi/scsi_lib.c +3 -1
@@ -1209,9 +1209,11 @@ int scsi_prep_state_check(struct scsi_device *sdev, struct request *req) "rejecting I/O to dead device\n"); ret =BLKPREP_KILL ;break ; -case SDEV_QUIESCE :case SDEV_BLOCK :case SDEV_CREATED_BLOCK : + ret =BLKPREP_DEFER ; +break ; +case SDEV_QUIESCE :/* * If the devices is blocked we defer normal commands. */
drivers/scsi/sg.c +3 -3
@@ -498,7 +498,7 @@ static ssize_t sg_new_read(Sg_fd * sfp, char __user *buf, size_t count, Sg_request * srp) {sg_io_hdr_t *hp = &srp->header; -int err =0 ; +int err =0 , err2;int len;if (count <SZ_SG_IO_HDR ) {
@@ -527,8 +527,8 @@ sg_new_read(Sg_fd * sfp, char __user *buf, size_t count, Sg_request * srp) goto err_out; } err_out: - err =sg_finish_rem_req (srp); -return (0 == err) ? count : err; + err2 =sg_finish_rem_req (srp); +return err ? : err2 ? : count; } static ssize_t
drivers/scsi/sym53c8xx_2/sym_glue.c +3 -2
@@ -1609,7 +1609,7 @@ sym_iomap_device(struct sym_device *device)struct pci_bus_region bus_addr;int i =2 ; -pcibios_resource_to_bus (pdev, &bus_addr, &pdev->resource[1 ]); +pcibios_resource_to_bus (pdev->bus, &bus_addr, &pdev->resource[1 ]); device->mmio_base = bus_addr.start;if (device->chip.features &FE_RAM ) {
@@ -1619,7 +1619,8 @@ sym_iomap_device(struct sym_device *device)*/ if (!pdev->resource[i].flags) i++; -pcibios_resource_to_bus (pdev, &bus_addr, &pdev->resource[i]); +pcibios_resource_to_bus (pdev->bus, &bus_addr, + &pdev->resource[i]); device->ram_base = bus_addr.start; }
drivers/spi/spidev.c +4 -1
@@ -241,7 +241,10 @@ static int spidev_message(struct spidev_data *spidev, k_tmp->len = u_tmp->len; total += k_tmp->len; -if (total > bufsiz) { +/* Check total length of transfers. Also check each +* transfer length to avoid arithmetic overflow. +*/ +if (total > bufsiz || k_tmp->len > bufsiz) { status = -EMSGSIZE ; goto done; }
drivers/staging/comedi/comedi_compat32.c +10 -2
@@ -271,7 +271,7 @@ static int compat_cmd(struct file *file, unsigned long arg) {struct comedi_cmd __user *cmd;struct comedi32_cmd_struct __user *cmd32; -int rc; +int rc, err; cmd32 =compat_ptr (arg); cmd =compat_alloc_user_space (sizeof (*cmd));
@@ -280,7 +280,15 @@ static int compat_cmd(struct file *file, unsigned long arg)if (rc)return rc; -return translated_ioctl (file,COMEDI_CMD , (unsigned long )cmd); + rc =translated_ioctl (file,COMEDI_CMD , (unsigned long )cmd); +if (rc == -EAGAIN ) { +/* Special case: copy cmd back to user. */ + err =put_compat_cmd (cmd32, cmd); +if (err) + rc = err; + } + +return rc; }/* Handle 32-bit COMEDI_CMDTEST ioctl. */
drivers/staging/vt6655/rf.c +1 -0
@@ -1029,6 +1029,7 @@ unsigned char byPwrdBm = 0;break ;case RATE_6M :case RATE_9M : +case RATE_12M :case RATE_18M : byPwr = pDevice->abyOFDMPwrTbl[uCH];if (pDevice->byRFType ==RF_UW2452 ) {
drivers/target/iscsi/iscsi_target_tq.c +5 -23
@@ -26,36 +26,22 @@#include "iscsi_target_tq.h" #include "iscsi_target.h" -static LIST_HEAD (active_ts_list);static LIST_HEAD (inactive_ts_list); -static DEFINE_SPINLOCK (active_ts_lock);static DEFINE_SPINLOCK (inactive_ts_lock);static DEFINE_SPINLOCK (ts_bitmap_lock); -static void iscsi_add_ts_to_active_list (struct iscsi_thread_set *ts) -{ -spin_lock (&active_ts_lock); -list_add_tail (&ts->ts_list, &active_ts_list); - iscsit_global->active_ts++; -spin_unlock (&active_ts_lock); -} -extern void iscsi_add_ts_to_inactive_list (struct iscsi_thread_set *ts) { +if (!list_empty (&ts->ts_list)) { +WARN_ON (1 ); +return ; + }spin_lock (&inactive_ts_lock);list_add_tail (&ts->ts_list, &inactive_ts_list); iscsit_global->inactive_ts++;spin_unlock (&inactive_ts_lock); } -static void iscsi_del_ts_from_active_list (struct iscsi_thread_set *ts) -{ -spin_lock (&active_ts_lock); -list_del (&ts->ts_list); - iscsit_global->active_ts--; -spin_unlock (&active_ts_lock); -} -static struct iscsi_thread_set *iscsi_get_ts_from_inactive_list (void ) {struct iscsi_thread_set *ts;
@@ -69,7 +55,7 @@ static struct iscsi_thread_set *iscsi_get_ts_from_inactive_list(void)list_for_each_entry (ts, &inactive_ts_list, ts_list)break ; -list_del (&ts->ts_list); +list_del_init (&ts->ts_list); iscsit_global->inactive_ts--;spin_unlock (&inactive_ts_lock);
@@ -220,8 +206,6 @@ static void iscsi_deallocate_extra_thread_sets(void)void iscsi_activate_thread_set (struct iscsi_conn *conn,struct iscsi_thread_set *ts) { -iscsi_add_ts_to_active_list (ts); -spin_lock_bh (&ts->ts_state_lock); conn->thread_set = ts; ts->conn = conn;
@@ -424,7 +408,6 @@ struct iscsi_conn *iscsi_rx_thread_pre_handler(struct iscsi_thread_set *ts)if (ts->delay_inactive && (--ts->thread_count ==0 )) {spin_unlock_bh (&ts->ts_state_lock); -iscsi_del_ts_from_active_list (ts);if (!iscsit_global->in_shutdown)iscsi_deallocate_extra_thread_sets ();
@@ -477,7 +460,6 @@ struct iscsi_conn *iscsi_tx_thread_pre_handler(struct iscsi_thread_set *ts)if (ts->delay_inactive && (--ts->thread_count ==0 )) {spin_unlock_bh (&ts->ts_state_lock); -iscsi_del_ts_from_active_list (ts);if (!iscsit_global->in_shutdown)iscsi_deallocate_extra_thread_sets ();
drivers/target/target_core_pscsi.c +1 -1
@@ -1165,7 +1165,7 @@ static u32 pscsi_get_device_type(struct se_device *dev)struct pscsi_dev_virt *pdv = dev->dev_ptr;struct scsi_device *sd = pdv->pdv_sd; -return sd->type; +return (sd) ? sd->type :TYPE_NO_LUN ; }static sector_t pscsi_get_blocks (struct se_device *dev)
drivers/target/tcm_fc/tfc_io.c +2 -1
@@ -330,7 +330,7 @@ void ft_invl_hw_context(struct ft_cmd *cmd) ep =fc_seq_exch (seq);if (ep) { lport = ep->lp; -if (lport && (ep->xid <= lport->lro_xid)) +if (lport && (ep->xid <= lport->lro_xid)) {/* * "ddp_done" trigger invalidation of HW * specific DDP context
@@ -345,6 +345,7 @@ void ft_invl_hw_context(struct ft_cmd *cmd)* identified using ep->xid) */ cmd->was_ddp_setup =0 ; + } } } }
drivers/tty/pty.c +3 -0
@@ -173,6 +173,9 @@ static int pty_signal(struct tty_struct *tty, int sig)unsigned long flags;struct pid *pgrp; +if (sig !=SIGINT && sig !=SIGQUIT && sig !=SIGTSTP ) +return -EINVAL ; +if (tty->link) {spin_lock_irqsave (&tty->link->ctrl_lock, flags); pgrp =get_pid (tty->link->pgrp);
drivers/tty/serial/8250/8250_pci.c +1 -1
@@ -67,7 +67,7 @@ static void moan_device(const char *str, struct pci_dev *dev)"Please send the output of lspci -vv, this\n" "message (0x%04x,0x%04x,0x%04x,0x%04x), the\n" "manufacturer and name of serial board or\n" -"modem board to [email protected].\n" , +"modem board to <[email protected]>.\n" ,pci_name (dev), str, dev->vendor, dev->device, dev->subsystem_vendor, dev->subsystem_device); }
drivers/tty/tty_io.c +2 -2
@@ -941,8 +941,8 @@ EXPORT_SYMBOL(start_tty);/* We limit tty time update visibility to every 8 seconds or so. */ static void tty_update_time (struct timespec *time) { -unsigned long sec =get_seconds () & ~7 ; -if ((long )(sec - time->tv_sec) >0 ) +unsigned long sec =get_seconds (); +if (abs (sec - time->tv_sec) & ~7 ) time->tv_sec = sec; }
drivers/tty/tty_ioctl.c +9 -3
@@ -153,11 +153,17 @@ void tty_wait_until_sent(struct tty_struct *tty, long timeout)#endif if (!timeout) timeout =MAX_SCHEDULE_TIMEOUT ; +if (wait_event_interruptible_timeout (tty->write_wait, - !tty_chars_in_buffer (tty), timeout) >=0 ) { -if (tty->ops->wait_until_sent) - tty->ops->wait_until_sent (tty, timeout); + !tty_chars_in_buffer (tty), timeout) <0 ) { +return ; } + +if (timeout ==MAX_SCHEDULE_TIMEOUT ) + timeout =0 ; + +if (tty->ops->wait_until_sent) + tty->ops->wait_until_sent (tty, timeout); }EXPORT_SYMBOL (tty_wait_until_sent);
drivers/tty/vt/vt.c +3 -1
@@ -498,6 +498,7 @@ void invert_screen(struct vc_data *vc, int offset, int count, int viewed)#endif if (DO_UPDATE (vc))do_update_region (vc, (unsigned long ) p, count); +notify_update (vc); }/* used by selection: complement pointer position */
@@ -514,6 +515,7 @@ void complement_pos(struct vc_data *vc, int offset)scr_writew (old,screenpos (vc, old_offset,1 ));if (DO_UPDATE (vc)) vc->vc_sw->con_putc (vc, old, oldy, oldx); +notify_update (vc); } old_offset = offset;
@@ -531,8 +533,8 @@ void complement_pos(struct vc_data *vc, int offset) oldy = (offset >>1 ) / vc->vc_cols; vc->vc_sw->con_putc (vc, new, oldy, oldx); } +notify_update (vc); } - }static void insert_char (struct vc_data *vc,unsigned int nr)
drivers/usb/class/cdc-acm.c +21 -5
@@ -1008,6 +1008,7 @@ static int acm_probe(struct usb_interface *intf,unsigned long quirks;int num_rx_buf;int i; +unsigned int elength =0 ;int combined_interfaces =0 ;/* normal quirks */
@@ -1043,6 +1044,12 @@ static int acm_probe(struct usb_interface *intf, }while (buflen >0 ) { + elength = buffer[0 ]; +if (!elength) { +dev_err (&intf->dev,"skipping garbage byte\n" ); + elength =1 ; + goto next_desc; + }if (buffer[1 ] !=USB_DT_CS_INTERFACE ) {dev_err (&intf->dev,"skipping garbage\n" ); goto next_desc;
@@ -1050,6 +1057,8 @@ static int acm_probe(struct usb_interface *intf,switch (buffer[2 ]) {case USB_CDC_UNION_TYPE :/* we've found it */ +if (elength <sizeof (struct usb_cdc_union_desc )) + goto next_desc;if (union_header) {dev_err (&intf->dev,"More than one " "union descriptor, skipping ...\n" );
@@ -1058,31 +1067,38 @@ static int acm_probe(struct usb_interface *intf, union_header = (struct usb_cdc_union_desc *)buffer;break ;case USB_CDC_COUNTRY_TYPE :/* export through sysfs*/ +if (elength <sizeof (struct usb_cdc_country_functional_desc )) + goto next_desc; cfd = (struct usb_cdc_country_functional_desc *)buffer;break ;case USB_CDC_HEADER_TYPE :/* maybe check version */ break ;/* for now we ignore it */ case USB_CDC_ACM_TYPE : +if (elength <4 ) + goto next_desc; ac_management_function = buffer[3 ];break ;case USB_CDC_CALL_MANAGEMENT_TYPE : +if (elength <5 ) + goto next_desc; call_management_function = buffer[3 ]; call_interface_num = buffer[4 ];if ( (quirks &NOT_A_MODEM ) ==0 && (call_management_function &3 ) !=3 )dev_err (&intf->dev,"This device cannot do calls on its own. It is not a modem.\n" );break ;default : -/* there are LOTS more CDC descriptors that +/* +* there are LOTS more CDC descriptors that * could legitimately be found here. */ dev_dbg (&intf->dev,"Ignoring descriptor: " -"type %02x, length %d\n" , - buffer[2 ], buffer[0 ]); +"type %02x, length %ud\n" , + buffer[2 ], elength);break ; } next_desc: - buflen -= buffer[0 ]; - buffer += buffer[0 ]; + buflen -= elength; + buffer += elength; }if (!union_header) {
drivers/usb/core/buffer.c +17 -9
@@ -22,17 +22,25 @@*/ /* FIXME tune these based on pool statistics ... */ -static const size_t pool_max[HCD_BUFFER_POOLS ] = { -/* platforms without dma-friendly caches might need to -* prevent cacheline sharing... -*/ -32 , -128 , -512 , -PAGE_SIZE /2 -/* bigger --> allocate pages */ +static size_t pool_max[HCD_BUFFER_POOLS ] = { +32 ,128 ,512 ,2048 , }; +void __init usb_init_pool_max (void ) +{ +/* +* The pool_max values must never be smaller than +* ARCH_KMALLOC_MINALIGN. +*/ +if (ARCH_KMALLOC_MINALIGN <=32 ) + ;/* Original value is okay */ +else if (ARCH_KMALLOC_MINALIGN <=64 ) + pool_max[0 ] =64 ; +else if (ARCH_KMALLOC_MINALIGN <=128 ) + pool_max[0 ] =0 ;/* Don't use this pool */ +else +BUILD_BUG ();/* We don't allow this */ +}/* SETUP primitives */
drivers/usb/core/devio.c +2 -0
@@ -444,6 +444,7 @@ static void async_completed(struct urb *urb) as->status = urb->status; signr = as->signr;if (signr) { +memset (&sinfo,0 ,sizeof (sinfo)); sinfo.si_signo = as->signr; sinfo.si_errno = as->status; sinfo.si_code =SI_ASYNCIO ;
@@ -2091,6 +2092,7 @@ static void usbdev_remove(struct usb_device *udev)wake_up_all (&ps->wait);list_del_init (&ps->list);if (ps->discsignr) { +memset (&sinfo,0 ,sizeof (sinfo)); sinfo.si_signo = ps->discsignr; sinfo.si_errno =EPIPE ; sinfo.si_code =SI_ASYNCIO ;
drivers/usb/core/driver.c +12 -0
@@ -1686,6 +1686,18 @@ static int autosuspend_check(struct usb_device *udev)dev_dbg (&udev->dev,"remote wakeup needed for autosuspend\n" );return -EOPNOTSUPP ; } + +/* +* If the device is a direct child of the root hub and the HCD +* doesn't handle wakeup requests, don't allow autosuspend when +* wakeup is needed. +*/ +if (w && udev->parent == udev->bus->root_hub && +bus_to_hcd (udev->bus)->cant_recv_wakeups) { +dev_dbg (&udev->dev,"HCD doesn't handle wakeup requests\n" ); +return -EOPNOTSUPP ; + } + udev->do_remote_wakeup = w;return 0 ; }
drivers/usb/core/hcd.c +8 -8
@@ -1528,6 +1528,7 @@ static int unlink1(struct usb_hcd *hcd, struct urb *urb, int status)int usb_hcd_unlink_urb (struct urb *urb,int status) {struct usb_hcd *hcd; +struct usb_device *udev = urb->dev;int retval = -EIDRM ;unsigned long flags;
@@ -1539,20 +1540,19 @@ int usb_hcd_unlink_urb (struct urb *urb, int status)spin_lock_irqsave (&hcd_urb_unlink_lock, flags);if (atomic_read (&urb->use_count) >0 ) { retval =0 ; -usb_get_dev (urb->dev); +usb_get_dev (udev); }spin_unlock_irqrestore (&hcd_urb_unlink_lock, flags);if (retval ==0 ) { hcd =bus_to_hcd (urb->dev->bus); retval =unlink1 (hcd, urb, status); -usb_put_dev (urb->dev); +if (retval ==0 ) + retval = -EINPROGRESS ; +else if (retval != -EIDRM && retval != -EBUSY ) +dev_dbg (&udev->dev,"hcd_unlink_urb %p fail %d\n" , + urb, retval); +usb_put_dev (udev); } - -if (retval ==0 ) - retval = -EINPROGRESS ; -else if (retval != -EIDRM && retval != -EBUSY ) -dev_dbg (&urb->dev->dev,"hcd_unlink_urb %p fail %d\n" , - urb, retval);return retval; }
drivers/usb/core/usb.c +1 -0
@@ -1010,6 +1010,7 @@ static int __init usb_init(void)pr_info ("%s: USB support disabled\n" , usbcore_name);return 0 ; } +usb_init_pool_max (); retval =usb_debugfs_init ();if (retval)
drivers/usb/gadget/inode.c +13 -2
@@ -570,6 +570,7 @@ static ssize_t ep_aio_read_retry(struct kiocb *iocb)break ; }kfree (priv->buf); +kfree (priv->iv);kfree (priv);return len; }
@@ -591,6 +592,7 @@ static void ep_aio_complete(struct usb_ep *ep, struct usb_request *req)*/ if (priv->iv ==NULL ||unlikely (req->actual ==0 )) {kfree (req->buf); +kfree (priv->iv);kfree (priv); iocb->private =NULL ;/* aio_complete() reports bytes-transferred _and_ faults */
@@ -626,7 +628,7 @@ ep_aio_rwtail(struct usb_request *req;ssize_t value; - priv =kmalloc (sizeof *priv,GFP_KERNEL ); + priv =kzalloc (sizeof *priv,GFP_KERNEL );if (!priv) { value = -ENOMEM ; fail:
@@ -634,11 +636,19 @@ fail:return value; } iocb->private = priv; - priv->iv = iv; +if (iv) { + priv->iv =kmemdup (iv, nr_segs *sizeof (struct iovec ), +GFP_KERNEL ); +if (!priv->iv) { +kfree (priv); + goto fail; + } + } priv->nr_segs = nr_segs; value =get_ready_ep (iocb->ki_filp->f_flags, epdata);if (unlikely (value <0 )) { +kfree (priv->iv);kfree (priv); goto fail; }
@@ -672,6 +682,7 @@ fail:mutex_unlock (&epdata->lock);if (unlikely (value)) { +kfree (priv->iv);kfree (priv);put_ep (epdata); }else
drivers/usb/host/isp1760-hcd.c +3 -0
@@ -2242,6 +2242,9 @@ struct usb_hcd *isp1760_register(phys_addr_t res_start, resource_size_t res_len, hcd->rsrc_start = res_start; hcd->rsrc_len = res_len; +/* This driver doesn't support wakeup requests */ + hcd->cant_recv_wakeups =1 ; + ret =usb_add_hcd (hcd, irq, irqflags);if (ret) goto err_unmap;
drivers/usb/host/xhci-hub.c +8 -1
@@ -383,6 +383,10 @@ static void xhci_clear_port_change_bit(struct xhci_hcd *xhci, u16 wValue, status =PORT_PLC ; port_change_bit ="link state" ;break ; +case USB_PORT_FEAT_C_PORT_CONFIG_ERROR : + status =PORT_CEC ; + port_change_bit ="config error" ; +break ;default :/* Should never happen */ return ;
@@ -617,6 +621,8 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, status |=USB_PORT_STAT_C_LINK_STATE <<16 ;if ((temp &PORT_WRC )) status |=USB_PORT_STAT_C_BH_RESET <<16 ; +if ((temp &PORT_CEC )) + status |=USB_PORT_STAT_C_CONFIG_ERROR <<16 ; }if (hcd->speed !=HCD_USB3 ) {
@@ -904,6 +910,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,case USB_PORT_FEAT_C_OVER_CURRENT :case USB_PORT_FEAT_C_ENABLE :case USB_PORT_FEAT_C_PORT_LINK_STATE : +case USB_PORT_FEAT_C_PORT_CONFIG_ERROR :xhci_clear_port_change_bit (xhci, wValue, wIndex, port_array[wIndex], temp);break ;
@@ -957,7 +964,7 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf)*/ status = bus_state->resuming_ports; - mask =PORT_CSC |PORT_PEC |PORT_OCC |PORT_PLC |PORT_WRC ; + mask =PORT_CSC |PORT_PEC |PORT_OCC |PORT_PLC |PORT_WRC |PORT_CEC ;spin_lock_irqsave (&xhci->lock, flags);/* For each port, did anything change? If so, set that bit in buf. */
drivers/usb/host/xhci-pci.c +32 -1
@@ -36,6 +36,9 @@#define PCI_DEVICE_ID_INTEL_LYNXPOINT_XHCI 0x8c31#define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI 0x9c31 +#define PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI 0x22b5 +#define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_XHCI 0xa12f +#define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCI 0x9d2fstatic const char hcd_name[] ="xhci_hcd" ;
@@ -102,6 +105,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)if (pdev->vendor ==PCI_VENDOR_ID_AMD ) xhci->quirks |=XHCI_TRUST_TX_LENGTH ; +if (pdev->vendor ==PCI_VENDOR_ID_INTEL ) + xhci->quirks |=XHCI_AVOID_BEI ;if (pdev->vendor ==PCI_VENDOR_ID_INTEL && pdev->device ==PCI_DEVICE_ID_INTEL_PANTHERPOINT_XHCI ) { xhci->quirks |=XHCI_EP_LIMIT_QUIRK ;
@@ -116,7 +121,12 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)* PPT chipsets. */ xhci->quirks |=XHCI_SPURIOUS_REBOOT ; - xhci->quirks |=XHCI_AVOID_BEI ; + } +if (pdev->vendor ==PCI_VENDOR_ID_INTEL && + (pdev->device ==PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCI || + pdev->device ==PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_XHCI || + pdev->device ==PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI )) { + xhci->quirks |=XHCI_PME_STUCK_QUIRK ; }if (pdev->vendor ==PCI_VENDOR_ID_ETRON && pdev->device ==PCI_DEVICE_ID_ASROCK_P67 ) {
@@ -131,6 +141,21 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) xhci->quirks |=XHCI_RESET_ON_RESUME ; } +/* +* Make sure PME works on some Intel xHCI controllers by writing 1 to clear +* the Internal PME flag bit in vendor specific PMCTRL register at offset 0x80a4 +*/ +static void xhci_pme_quirk (struct xhci_hcd *xhci) +{ +u32 val; +void __iomem *reg; + + reg = (void __iomem *) xhci->cap_regs +0x80a4 ; + val =readl (reg); +writel (val |BIT (28 ), reg); +readl (reg); +} +/* called during probe() after chip reset completes */ static int xhci_pci_setup (struct usb_hcd *hcd) {
@@ -238,6 +263,9 @@ static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup) xhci->shared_hcd->state != HC_STATE_SUSPENDED)return -EINVAL ; +if (xhci->quirks &XHCI_PME_STUCK_QUIRK ) +xhci_pme_quirk (xhci); + retval =xhci_suspend (xhci, do_wakeup);return retval;
@@ -268,6 +296,9 @@ static int xhci_pci_resume(struct usb_hcd *hcd, bool hibernated)if (usb_is_intel_switchable_xhci (pdev))usb_enable_xhci_ports (pdev); +if (xhci->quirks &XHCI_PME_STUCK_QUIRK ) +xhci_pme_quirk (xhci); + retval =xhci_resume (xhci, hibernated);return retval; }
drivers/usb/host/xhci-ring.c +8 -2
@@ -2049,7 +2049,7 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_td *td,if (event_trb != ep_ring->dequeue) {/* The event was for the status stage */ if (event_trb == td->last_trb) { -if (td->urb->actual_length !=0 ) { +if (td->urb_length_set) {/* Don't overwrite a previously set error code */ if ((*status == -EINPROGRESS || *status == 0) &&
@@ -2063,7 +2063,13 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_td *td, td->urb->transfer_buffer_length; } }else { -/* Maybe the event was for the data stage? */ +/* +* Maybe the event was for the data stage? If so, update +* already the actual_length of the URB and flag it as +* set, so that it is not overwritten in the event for +* the last TRB. +*/ + td->urb_length_set = true; td->urb->actual_length = td->urb->transfer_buffer_length -EVENT_TRB_LEN (le32_to_cpu (event->transfer_len));
drivers/usb/host/xhci.h +7 -2
@@ -1,3 +1,4 @@ +/* * xHCI host controller driver *
@@ -88,9 +89,10 @@ struct xhci_cap_regs {#define HCS_IST (p) (((p) >> 0) & 0xf)/* bits 4:7, max number of Event Ring segments */ #define HCS_ERST_MAX (p) (((p) >> 4) & 0xf) +/* bits 21:25 Hi 5 bits of Scratchpad buffers SW must allocate for the HW */ /* bit 26 Scratchpad restore - for save/restore HW state - not used yet */ -/* bits 27:31 number of Scratchpad buffers SW must allocate for the HW */ -#define HCS_MAX_SCRATCHPAD (p) (((p) >> 27) & 0x1f) +/* bits 27:31 Lo 5 bits of Scratchpad buffers SW must allocate for the HW */ +#define HCS_MAX_SCRATCHPAD (p) ((((p) >> 16) & 0x3e0) | (((p) >> 27) & 0x1f))/* HCSPARAMS3 - hcs_params3 - bitmasks */ /* bits 0:7, Max U1 to U0 latency for the roothub ports */
@@ -1254,6 +1256,8 @@ struct xhci_td {struct xhci_segment *start_seg;union xhci_trb *first_trb;union xhci_trb *last_trb; +/* actual_length of the URB has already been set */ +bool urb_length_set; };/* xHCI command default timeout value */
@@ -1511,6 +1515,7 @@ struct xhci_hcd {#define XHCI_PLAT (1 << 16)#define XHCI_SLOW_SUSPEND (1 << 17)#define XHCI_SPURIOUS_WAKEUP (1 << 18) +#define XHCI_PME_STUCK_QUIRK (1 << 20)unsigned int num_active_eps;unsigned int limit_active_eps;/* There are two roothubs to keep track of bus suspend info for */
drivers/usb/serial/bus.c +11 -2
@@ -52,6 +52,7 @@ static int usb_serial_device_probe(struct device *dev) {struct usb_serial_driver *driver;struct usb_serial_port *port; +struct device *tty_dev;int retval =0 ;int minor;
@@ -71,12 +72,20 @@ static int usb_serial_device_probe(struct device *dev) retval =device_create_file (dev, &dev_attr_port_number);if (retval) {if (driver->port_remove) - retval = driver->port_remove (port); + driver->port_remove (port); goto exit; } minor = port->number; -tty_register_device (usb_serial_tty_driver, minor, dev); + tty_dev =tty_register_device (usb_serial_tty_driver, minor, dev); +if (IS_ERR (tty_dev)) { + retval =PTR_ERR (tty_dev); +device_remove_file (dev, &dev_attr_port_number); +if (driver->port_remove) + driver->port_remove (port); + goto exit; + } +dev_info (&port->serial->dev->dev,"%s converter now attached to ttyUSB%d\n" , driver->description, minor);
drivers/usb/serial/cp210x.c +3 -0
@@ -63,6 +63,7 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(0x0846, 0x1100) }, /* NetGear Managed Switch M4100 series, M5300 series, M7100 series */ { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */ { USB_DEVICE(0x08FD, 0x000A) }, /* Digianswer A/S , ZigBee/802.15.4 MAC Device */ + { USB_DEVICE(0x0908, 0x01FF) }, /* Siemens RUGGEDCOM USB Serial Console */ { USB_DEVICE(0x0BED, 0x1100) }, /* MEI (TM) Cashflow-SC Bill/Voucher Acceptor */ { USB_DEVICE(0x0BED, 0x1101) }, /* MEI series 2000 Combo Acceptor */ { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */
@@ -152,6 +153,8 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(0x166A, 0x0305) }, /* Clipsal C-5000CT2 C-Bus Spectrum Colour Touchscreen */ { USB_DEVICE(0x166A, 0x0401) }, /* Clipsal L51xx C-Bus Architectural Dimmer */ { USB_DEVICE(0x166A, 0x0101) }, /* Clipsal 5560884 C-Bus Multi-room Audio Matrix Switcher */ + { USB_DEVICE(0x16C0, 0x09B0) }, /* Lunatico Seletek */ + { USB_DEVICE(0x16C0, 0x09B1) }, /* Lunatico Seletek */ { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */ { USB_DEVICE(0x16DC, 0x0010) }, /* W-IE-NE-R Plein & Baus GmbH PL512 Power Supply */ { USB_DEVICE(0x16DC, 0x0011) }, /* W-IE-NE-R Plein & Baus GmbH RCM Remote Control for MARATON Power Supply */
drivers/usb/serial/ftdi_sio.c +26 -2
@@ -628,6 +628,7 @@ static struct usb_device_id id_table_combined [] = { .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, { USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLXM_PID), .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, + { USB_DEVICE(FTDI_VID, FTDI_SYNAPSE_SS200_PID) }, /* * ELV devices: */
@@ -823,6 +824,8 @@ static struct usb_device_id id_table_combined [] = { { USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) }, { USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) }, { USB_DEVICE(FTDI_VID, FTDI_PROPOX_ISPCABLEIII_PID) }, + { USB_DEVICE(FTDI_VID, CYBER_CORTEX_AV_PID), + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID), .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID),
@@ -1000,6 +1003,23 @@ static struct usb_device_id id_table_combined [] = { { USB_DEVICE(FTDI_VID, FTDI_EKEY_CONV_USB_PID) },/* GE Healthcare devices */ { USB_DEVICE(GE_HEALTHCARE_VID, GE_HEALTHCARE_NEMO_TRACKER_PID) }, +/* Active Research (Actisense) devices */ + { USB_DEVICE(FTDI_VID, ACTISENSE_NDC_PID) }, + { USB_DEVICE(FTDI_VID, ACTISENSE_USG_PID) }, + { USB_DEVICE(FTDI_VID, ACTISENSE_NGT_PID) }, + { USB_DEVICE(FTDI_VID, ACTISENSE_NGW_PID) }, + { USB_DEVICE(FTDI_VID, ACTISENSE_D9AC_PID) }, + { USB_DEVICE(FTDI_VID, ACTISENSE_D9AD_PID) }, + { USB_DEVICE(FTDI_VID, ACTISENSE_D9AE_PID) }, + { USB_DEVICE(FTDI_VID, ACTISENSE_D9AF_PID) }, + { USB_DEVICE(FTDI_VID, CHETCO_SEAGAUGE_PID) }, + { USB_DEVICE(FTDI_VID, CHETCO_SEASWITCH_PID) }, + { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_NMEA2000_PID) }, + { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_ETHERNET_PID) }, + { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_WIFI_PID) }, + { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_DISPLAY_PID) }, + { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_LITE_PID) }, + { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_ANALOG_PID) }, { }, /* Optional parameter entry */ { } /* Terminating entry */ };
@@ -1930,8 +1950,12 @@ static int ftdi_8u2232c_probe(struct usb_serial *serial)dbg ("%s" , __func__); -if ((udev->manufacturer && !strcmp (udev->manufacturer,"CALAO Systems" )) || - (udev->product && !strcmp (udev->product,"BeagleBone/XDS100V2" ))) +if (udev->manufacturer && !strcmp (udev->manufacturer,"CALAO Systems" )) +return ftdi_jtag_probe (serial); + +if (udev->product && + (!strcmp (udev->product,"BeagleBone/XDS100V2" ) || + !strcmp (udev->product,"SNAP Connect E10" )))return ftdi_jtag_probe (serial);return 0 ;
drivers/usb/serial/ftdi_sio_ids.h +29 -0
@@ -38,6 +38,9 @@#define FTDI_LUMEL_PD12_PID 0x6002 +/* Cyber Cortex AV by Fabulous Silicon (http://fabuloussilicon.com) */ +#define CYBER_CORTEX_AV_PID 0x8698 +/* * Marvell OpenRD Base, Client * http://www.open-rd.org
@@ -558,6 +561,12 @@*/ #define FTDI_NT_ORIONLXM_PID 0x7c90/* OrionLXm Substation Automation Platform */ +/* +* Synapse Wireless product ids (FTDI_VID) +* http://www.synapse-wireless.com +*/ +#define FTDI_SYNAPSE_SS200_PID 0x9090/* SS200 - SNAP Stick 200 */ +/********************************/ /** third-party VID/PID combos **/
@@ -1432,3 +1441,23 @@*/ #define GE_HEALTHCARE_VID 0x1901#define GE_HEALTHCARE_NEMO_TRACKER_PID 0x0015 + +/* +* Active Research (Actisense) devices +*/ +#define ACTISENSE_NDC_PID 0xD9A8/* NDC USB Serial Adapter */ +#define ACTISENSE_USG_PID 0xD9A9/* USG USB Serial Adapter */ +#define ACTISENSE_NGT_PID 0xD9AA/* NGT NMEA2000 Interface */ +#define ACTISENSE_NGW_PID 0xD9AB/* NGW NMEA2000 Gateway */ +#define ACTISENSE_D9AC_PID 0xD9AC/* Actisense Reserved */ +#define ACTISENSE_D9AD_PID 0xD9AD/* Actisense Reserved */ +#define ACTISENSE_D9AE_PID 0xD9AE/* Actisense Reserved */ +#define ACTISENSE_D9AF_PID 0xD9AF/* Actisense Reserved */ +#define CHETCO_SEAGAUGE_PID 0xA548/* SeaGauge USB Adapter */ +#define CHETCO_SEASWITCH_PID 0xA549/* SeaSwitch USB Adapter */ +#define CHETCO_SEASMART_NMEA2000_PID 0xA54A/* SeaSmart NMEA2000 Gateway */ +#define CHETCO_SEASMART_ETHERNET_PID 0xA54B/* SeaSmart Ethernet Gateway */ +#define CHETCO_SEASMART_WIFI_PID 0xA5AC/* SeaSmart Wifi Gateway */ +#define CHETCO_SEASMART_DISPLAY_PID 0xA5AD/* SeaSmart NMEA2000 Display */ +#define CHETCO_SEASMART_LITE_PID 0xA5AE/* SeaSmart Lite USB Adapter */ +#define CHETCO_SEASMART_ANALOG_PID 0xA5AF/* SeaSmart Analog Adapter */
drivers/video/arkfb.c +1 -1
@@ -1014,7 +1014,7 @@ static int __devinit ark_pci_probe(struct pci_dev *dev, const struct pci_device_ vga_res.flags =IORESOURCE_IO ; -pcibios_bus_to_resource (dev, &vga_res, &bus_reg); +pcibios_bus_to_resource (dev->bus, &vga_res, &bus_reg); par->state.vgabase = (void __iomem *) vga_res.start;
drivers/video/s3fb.c +1 -1
@@ -1172,7 +1172,7 @@ static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_i vga_res.flags =IORESOURCE_IO ; -pcibios_bus_to_resource (dev, &vga_res, &bus_reg); +pcibios_bus_to_resource (dev->bus, &vga_res, &bus_reg); par->state.vgabase = (void __iomem *) vga_res.start;
drivers/video/vt8623fb.c +1 -1
@@ -727,7 +727,7 @@ static int __devinit vt8623_pci_probe(struct pci_dev *dev, const struct pci_devi vga_res.flags =IORESOURCE_IO ; -pcibios_bus_to_resource (dev, &vga_res, &bus_reg); +pcibios_bus_to_resource (dev->bus, &vga_res, &bus_reg); par->state.vgabase = (void __iomem *) vga_res.start;
drivers/xen/xen-pciback/conf_space.c +3 -3
@@ -16,8 +16,8 @@#include "conf_space.h" #include "conf_space_quirks.h" -static bool permissive; -module_param (permissive, bool,0644 ); +bool xen_pcibk_permissive; +module_param_named (permissive, xen_pcibk_permissive, bool,0644 );/* This is where xen_pcibk_read_config_byte, xen_pcibk_read_config_word, * xen_pcibk_write_config_word, and xen_pcibk_write_config_byte are created. */
@@ -262,7 +262,7 @@ int xen_pcibk_config_write(struct pci_dev *dev, int offset, int size, u32 value)* This means that some fields may still be read-only because * they have entries in the config_field list that intercept * the write and do nothing. */ -if (dev_data->permissive || permissive) { +if (dev_data->permissive || xen_pcibk_permissive) {switch (size) {case 1 : err = pci_write_config_byte(dev, offset,
drivers/xen/xen-pciback/conf_space.h +2 -0
@@ -64,6 +64,8 @@ struct config_field_entry {void *data; }; +extern bool xen_pcibk_permissive; +#define OFFSET (cfg_entry) ((cfg_entry)->base_offset+(cfg_entry)->field->offset)/* Add fields to a device - the add_fields macro expects to get a pointer to
drivers/xen/xen-pciback/conf_space_header.c +48 -13
94 lines not on this page · raw message
fs/autofs4/dev-ioctl.c +9 -2
@@ -95,7 +95,7 @@ static int check_dev_ioctl_version(int cmd, struct autofs_dev_ioctl *param)*/ static struct autofs_dev_ioctl *copy_dev_ioctl (struct autofs_dev_ioctl __user *in) { -struct autofs_dev_ioctl tmp; +struct autofs_dev_ioctl tmp, *res;if (copy_from_user (&tmp, in,sizeof (tmp)))return ERR_PTR (-EFAULT );
@@ -103,7 +103,14 @@ static struct autofs_dev_ioctl *copy_dev_ioctl(struct autofs_dev_ioctl __user *iif (tmp.size <sizeof (tmp))return ERR_PTR (-EINVAL ); -return memdup_user (in, tmp.size); +if (tmp.size > (PATH_MAX +sizeof (tmp))) +return ERR_PTR (-ENAMETOOLONG ); + + res =memdup_user (in, tmp.size); +if (!IS_ERR (res)) + res->size = tmp.size; + +return res; }static inline void free_dev_ioctl (struct autofs_dev_ioctl *param)
fs/cifs/file.c +1 -0
@@ -1613,6 +1613,7 @@ refind_writable:cifsFileInfo_put (inv_file);spin_lock (&cifs_file_list_lock); ++refind; + inv_file =NULL ; goto refind_writable; } }
fs/debugfs/inode.c +17 -17
@@ -238,10 +238,19 @@ static int debugfs_show_options(struct seq_file *m, struct dentry *root)return 0 ; } +static void debugfs_evict_inode (struct inode *inode) +{ +truncate_inode_pages (&inode->i_data,0 ); +end_writeback (inode); +if (S_ISLNK (inode->i_mode)) +kfree (inode->i_private); +} +static const struct super_operations debugfs_super_operations = { .statfs = simple_statfs, .remount_fs = debugfs_remount, .show_options = debugfs_show_options, + .evict_inode = debugfs_evict_inode, };static int debug_fill_super (struct super_block *sb,void *data,int silent)
@@ -459,23 +468,14 @@ static int __debugfs_remove(struct dentry *dentry, struct dentry *parent)int ret =0 ;if (debugfs_positive (dentry)) { -if (dentry->d_inode) { -dget (dentry); -switch (dentry->d_inode->i_mode &S_IFMT ) { -case S_IFDIR : - ret =simple_rmdir (parent->d_inode, dentry); -break ; -case S_IFLNK : -kfree (dentry->d_inode->i_private); -/* fall through */ -default : -simple_unlink (parent->d_inode, dentry); -break ; - } -if (!ret) -d_delete (dentry); -dput (dentry); - } +dget (dentry); +if (S_ISDIR (dentry->d_inode->i_mode)) + ret =simple_rmdir (parent->d_inode, dentry); +else +simple_unlink (parent->d_inode, dentry); +if (!ret) +d_delete (dentry); +dput (dentry); }return ret; }
fs/ecryptfs/file.c +30 -4
@@ -306,9 +306,22 @@ ecryptfs_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)if (ecryptfs_file_to_private (file)) lower_file =ecryptfs_file_to_lower (file); -if (lower_file && lower_file->f_op && lower_file->f_op->unlocked_ioctl) +if (!(lower_file && lower_file->f_op && lower_file->f_op->unlocked_ioctl)) +return rc; + +switch (cmd) { +case FITRIM : +case FS_IOC_GETFLAGS : +case FS_IOC_SETFLAGS : +case FS_IOC_GETVERSION : +case FS_IOC_SETVERSION : rc = lower_file->f_op->unlocked_ioctl (lower_file, cmd, arg); -return rc; +fsstack_copy_attr_all (file->f_path.dentry->d_inode, + lower_file->f_path.dentry->d_inode); +return rc; +default : +return rc; + } }#ifdef CONFIG_COMPAT
@@ -320,9 +333,22 @@ ecryptfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)if (ecryptfs_file_to_private (file)) lower_file =ecryptfs_file_to_lower (file); -if (lower_file && lower_file->f_op && lower_file->f_op->compat_ioctl) +if (!(lower_file && lower_file->f_op && lower_file->f_op->compat_ioctl)) +return rc; + +switch (cmd) { +case FITRIM : +case FS_IOC32_GETFLAGS : +case FS_IOC32_SETFLAGS : +case FS_IOC32_GETVERSION : +case FS_IOC32_SETVERSION : rc = lower_file->f_op->compat_ioctl (lower_file, cmd, arg); - return rc; +fsstack_copy_attr_all (file->f_path.dentry->d_inode, + lower_file->f_path.dentry->d_inode); +return rc; +default : +return rc; + } }#endif
fs/exec.c +40 -25
82 lines not on this page · raw message
fs/fuse/dev.c +5 -2
@@ -717,8 +717,8 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep) newpage = buf->page; -if (WARN_ON (!PageUptodate (newpage))) -return -EIO ; +if (!PageUptodate (newpage)) +SetPageUptodate (newpage);ClearPageMappedToDisk (newpage);
@@ -1634,6 +1634,9 @@ copy_finish: static int fuse_notify(struct fuse_conn *fc, enum fuse_notify_code code,
Lines of this file are not shown. View the raw message.
fs/nilfs2/btree.c +44 -3
47 lines not on this page · raw message
mm/hugetlb.c +46 -12
58 lines not on this page · raw message
mm/slub.c +14 -34
48 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.
Quoted 9 lines · On Tue, 2015-06-16 at 16:33 +0800, [email protected] wrote:
From: Zefan Li <[email protected]>
This is the start of the stable review cycle for the 3.4.108 release. There are 172 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Jun 18 08:30:58 UTC 2015. Anything received after that time might be too late.
Would it be possible to also include 31a418986a58 "xen: netback: read hotplug script once at start of day." which has started trickling into other stable branches already, please.
If not now then for 109.
Thanks,
Ian.
Quoted 9 lines · On Tue, 2015-06-16 at 16:33 +0800, [email protected] wrote:
From: Zefan Li <[email protected]>
This is the start of the stable review cycle for the 3.4.108 release. There are 172 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Jun 18 08:30:58 UTC 2015. Anything received after that time might be too late.
Would it be possible to also include 31a418986a58 "xen: netback: read hotplug script once at start of day." which has started trickling into other stable branches already, please.
If not now then for 109.
Thanks,
Ian.
Quoted 8 lines · Ian Campbell
Quoted 7 lines · On Tue, 2015-06-16 at 16:33 +0800, [email protected] wrote:
From: Zefan Li <[email protected]>
This is the start of the stable review cycle for the 3.4.108 release. There are 172 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 9 lines
Quoted 2 lines
Responses should be made by Thu Jun 18 08:30:58 UTC 2015. Anything received after that time might be too late.
Would it be possible to also include
31a418986a58"xen: netback: read hotplug script once at start of day." which has started trickling into other stable branches already, please.If not now then for 109.
Queued up for 3.4.108. :)
Quoted 12 lines · Zefan Li
Quoted 11 lines · Ian Campbell
Quoted 9 lines · On Tue, 2015-06-16 at 16:33 +0800, [email protected] wrote:
From: Zefan Li <[email protected]>
This is the start of the stable review cycle for the 3.4.108 release. There are 172 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Jun 18 08:30:58 UTC 2015. Anything received after that time might be too late.
Quoted 8 lines
Quoted 6 lines
Would it be possible to also include
31a418986a58"xen: netback: read hotplug script once at start of day." which has started trickling into other stable branches already, please.If not now then for 109.
Queued up for 3.4.108. :)
Smashing, thank you.
Ian.
Quoted 12 lines · Zefan Li
Quoted 11 lines · Ian Campbell
Quoted 9 lines · On Tue, 2015-06-16 at 16:33 +0800, [email protected] wrote:
From: Zefan Li <[email protected]>
This is the start of the stable review cycle for the 3.4.108 release. There are 172 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Jun 18 08:30:58 UTC 2015. Anything received after that time might be too late.
Quoted 8 lines
Quoted 6 lines
Would it be possible to also include
31a418986a58"xen: netback: read hotplug script once at start of day." which has started trickling into other stable branches already, please.If not now then for 109.
Queued up for 3.4.108. :)
Smashing, thank you.
Ian.
Quoted 8 lines · Ian Campbell
Quoted 7 lines · On Tue, 2015-06-16 at 16:33 +0800, [email protected] wrote:
From: Zefan Li <[email protected]>
This is the start of the stable review cycle for the 3.4.108 release. There are 172 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 9 lines
Quoted 2 lines
Responses should be made by Thu Jun 18 08:30:58 UTC 2015. Anything received after that time might be too late.
Would it be possible to also include
31a418986a58"xen: netback: read hotplug script once at start of day." which has started trickling into other stable branches already, please.If not now then for 109.
Queued up for 3.4.108. :)