diff options
50 files changed, 290 insertions, 243 deletions
diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci index 428676cfa61e..25be3250f7d6 100644 --- a/Documentation/ABI/testing/sysfs-bus-pci +++ b/Documentation/ABI/testing/sysfs-bus-pci | |||
| @@ -133,46 +133,6 @@ Description: | |||
| 133 | The symbolic link points to the PCI device sysfs entry of the | 133 | The symbolic link points to the PCI device sysfs entry of the |
| 134 | Physical Function this device associates with. | 134 | Physical Function this device associates with. |
| 135 | 135 | ||
| 136 | |||
| 137 | What: /sys/bus/pci/slots/... | ||
| 138 | Date: April 2005 (possibly older) | ||
| 139 | KernelVersion: 2.6.12 (possibly older) | ||
| 140 | Contact: linux-pci@vger.kernel.org | ||
| 141 | Description: | ||
| 142 | When the appropriate driver is loaded, it will create a | ||
| 143 | directory per claimed physical PCI slot in | ||
| 144 | /sys/bus/pci/slots/. The names of these directories are | ||
| 145 | specific to the driver, which in turn, are specific to the | ||
| 146 | platform, but in general, should match the label on the | ||
| 147 | machine's physical chassis. | ||
| 148 | |||
| 149 | The drivers that can create slot directories include the | ||
| 150 | PCI hotplug drivers, and as of 2.6.27, the pci_slot driver. | ||
| 151 | |||
| 152 | The slot directories contain, at a minimum, a file named | ||
| 153 | 'address' which contains the PCI bus:device:function tuple. | ||
| 154 | Other files may appear as well, but are specific to the | ||
| 155 | driver. | ||
| 156 | |||
| 157 | What: /sys/bus/pci/slots/.../function[0-7] | ||
| 158 | Date: March 2010 | ||
| 159 | KernelVersion: 2.6.35 | ||
| 160 | Contact: linux-pci@vger.kernel.org | ||
| 161 | Description: | ||
| 162 | If PCI slot directories (as described above) are created, | ||
| 163 | and the physical slot is actually populated with a device, | ||
| 164 | symbolic links in the slot directory pointing to the | ||
| 165 | device's PCI functions are created as well. | ||
| 166 | |||
| 167 | What: /sys/bus/pci/devices/.../slot | ||
| 168 | Date: March 2010 | ||
| 169 | KernelVersion: 2.6.35 | ||
| 170 | Contact: linux-pci@vger.kernel.org | ||
| 171 | Description: | ||
| 172 | If PCI slot directories (as described above) are created, | ||
| 173 | a symbolic link pointing to the slot directory will be | ||
| 174 | created as well. | ||
| 175 | |||
| 176 | What: /sys/bus/pci/slots/.../module | 136 | What: /sys/bus/pci/slots/.../module |
| 177 | Date: June 2009 | 137 | Date: June 2009 |
| 178 | Contact: linux-pci@vger.kernel.org | 138 | Contact: linux-pci@vger.kernel.org |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 2 | 1 | VERSION = 2 |
| 2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
| 3 | SUBLEVEL = 35 | 3 | SUBLEVEL = 35 |
| 4 | EXTRAVERSION = -rc2 | 4 | EXTRAVERSION = -rc3 |
| 5 | NAME = Sheep on Meth | 5 | NAME = Sheep on Meth |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
| @@ -1095,7 +1095,7 @@ all: modules | |||
| 1095 | # using awk while concatenating to the final file. | 1095 | # using awk while concatenating to the final file. |
| 1096 | 1096 | ||
| 1097 | PHONY += modules | 1097 | PHONY += modules |
| 1098 | modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) | 1098 | modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin |
| 1099 | $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order | 1099 | $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order |
| 1100 | @$(kecho) ' Building modules, stage 2.'; | 1100 | @$(kecho) ' Building modules, stage 2.'; |
| 1101 | $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost | 1101 | $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost |
| @@ -1117,7 +1117,7 @@ PHONY += modules_install | |||
| 1117 | modules_install: _modinst_ _modinst_post | 1117 | modules_install: _modinst_ _modinst_post |
| 1118 | 1118 | ||
| 1119 | PHONY += _modinst_ | 1119 | PHONY += _modinst_ |
| 1120 | _modinst_: modules.builtin | 1120 | _modinst_: |
| 1121 | @if [ -z "`$(DEPMOD) -V 2>/dev/null | grep module-init-tools`" ]; then \ | 1121 | @if [ -z "`$(DEPMOD) -V 2>/dev/null | grep module-init-tools`" ]; then \ |
| 1122 | echo "Warning: you may need to install module-init-tools"; \ | 1122 | echo "Warning: you may need to install module-init-tools"; \ |
| 1123 | echo "See http://www.codemonkey.org.uk/docs/post-halloween-2.6.txt";\ | 1123 | echo "See http://www.codemonkey.org.uk/docs/post-halloween-2.6.txt";\ |
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index 9cb782b8e036..23be25fec4d6 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c | |||
| @@ -1277,6 +1277,7 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus) | |||
| 1277 | printk(KERN_WARNING "PCI: Cannot allocate resource region " | 1277 | printk(KERN_WARNING "PCI: Cannot allocate resource region " |
| 1278 | "%d of PCI bridge %d, will remap\n", i, bus->number); | 1278 | "%d of PCI bridge %d, will remap\n", i, bus->number); |
| 1279 | clear_resource: | 1279 | clear_resource: |
| 1280 | res->start = res->end = 0; | ||
| 1280 | res->flags = 0; | 1281 | res->flags = 0; |
| 1281 | } | 1282 | } |
| 1282 | 1283 | ||
diff --git a/arch/mn10300/unit-asb2305/pci-asb2305.c b/arch/mn10300/unit-asb2305/pci-asb2305.c index d6119b879a98..45b40ac6c464 100644 --- a/arch/mn10300/unit-asb2305/pci-asb2305.c +++ b/arch/mn10300/unit-asb2305/pci-asb2305.c | |||
| @@ -117,6 +117,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list) | |||
| 117 | * Invalidate the resource to prevent | 117 | * Invalidate the resource to prevent |
| 118 | * child resource allocations in this | 118 | * child resource allocations in this |
| 119 | * range. */ | 119 | * range. */ |
| 120 | r->start = r->end = 0; | ||
| 120 | r->flags = 0; | 121 | r->flags = 0; |
| 121 | } | 122 | } |
| 122 | } | 123 | } |
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 6646005dffb1..5b38f6ae2b29 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
| @@ -1309,6 +1309,7 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus) | |||
| 1309 | printk(KERN_WARNING "PCI: Cannot allocate resource region " | 1309 | printk(KERN_WARNING "PCI: Cannot allocate resource region " |
| 1310 | "%d of PCI bridge %d, will remap\n", i, bus->number); | 1310 | "%d of PCI bridge %d, will remap\n", i, bus->number); |
| 1311 | clear_resource: | 1311 | clear_resource: |
| 1312 | res->start = res->end = 0; | ||
| 1312 | res->flags = 0; | 1313 | res->flags = 0; |
| 1313 | } | 1314 | } |
| 1314 | 1315 | ||
diff --git a/arch/x86/include/asm/suspend_32.h b/arch/x86/include/asm/suspend_32.h index 48dcfa62ea07..fd921c3a6841 100644 --- a/arch/x86/include/asm/suspend_32.h +++ b/arch/x86/include/asm/suspend_32.h | |||
| @@ -15,6 +15,8 @@ static inline int arch_prepare_suspend(void) { return 0; } | |||
| 15 | struct saved_context { | 15 | struct saved_context { |
| 16 | u16 es, fs, gs, ss; | 16 | u16 es, fs, gs, ss; |
| 17 | unsigned long cr0, cr2, cr3, cr4; | 17 | unsigned long cr0, cr2, cr3, cr4; |
| 18 | u64 misc_enable; | ||
| 19 | bool misc_enable_saved; | ||
| 18 | struct desc_ptr gdt; | 20 | struct desc_ptr gdt; |
| 19 | struct desc_ptr idt; | 21 | struct desc_ptr idt; |
| 20 | u16 ldt; | 22 | u16 ldt; |
diff --git a/arch/x86/include/asm/suspend_64.h b/arch/x86/include/asm/suspend_64.h index 06284f42b759..8d942afae681 100644 --- a/arch/x86/include/asm/suspend_64.h +++ b/arch/x86/include/asm/suspend_64.h | |||
| @@ -27,6 +27,8 @@ struct saved_context { | |||
| 27 | u16 ds, es, fs, gs, ss; | 27 | u16 ds, es, fs, gs, ss; |
| 28 | unsigned long gs_base, gs_kernel_base, fs_base; | 28 | unsigned long gs_base, gs_kernel_base, fs_base; |
| 29 | unsigned long cr0, cr2, cr3, cr4, cr8; | 29 | unsigned long cr0, cr2, cr3, cr4, cr8; |
| 30 | u64 misc_enable; | ||
| 31 | bool misc_enable_saved; | ||
| 30 | unsigned long efer; | 32 | unsigned long efer; |
| 31 | u16 gdt_pad; | 33 | u16 gdt_pad; |
| 32 | u16 gdt_limit; | 34 | u16 gdt_limit; |
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index 97da2ba9344b..6fdb3ec30c31 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c | |||
| @@ -96,6 +96,7 @@ EXPORT_SYMBOL(pcibios_align_resource); | |||
| 96 | * the fact the PCI specs explicitly allow address decoders to be | 96 | * the fact the PCI specs explicitly allow address decoders to be |
| 97 | * shared between expansion ROMs and other resource regions, it's | 97 | * shared between expansion ROMs and other resource regions, it's |
| 98 | * at least dangerous) | 98 | * at least dangerous) |
| 99 | * - bad resource sizes or overlaps with other regions | ||
| 99 | * | 100 | * |
| 100 | * Our solution: | 101 | * Our solution: |
| 101 | * (1) Allocate resources for all buses behind PCI-to-PCI bridges. | 102 | * (1) Allocate resources for all buses behind PCI-to-PCI bridges. |
| @@ -136,6 +137,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list) | |||
| 136 | * child resource allocations in this | 137 | * child resource allocations in this |
| 137 | * range. | 138 | * range. |
| 138 | */ | 139 | */ |
| 140 | r->start = r->end = 0; | ||
| 139 | r->flags = 0; | 141 | r->flags = 0; |
| 140 | } | 142 | } |
| 141 | } | 143 | } |
diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c index 0a979f3e5b8a..1290ba54b350 100644 --- a/arch/x86/power/cpu.c +++ b/arch/x86/power/cpu.c | |||
| @@ -105,6 +105,8 @@ static void __save_processor_state(struct saved_context *ctxt) | |||
| 105 | ctxt->cr4 = read_cr4(); | 105 | ctxt->cr4 = read_cr4(); |
| 106 | ctxt->cr8 = read_cr8(); | 106 | ctxt->cr8 = read_cr8(); |
| 107 | #endif | 107 | #endif |
| 108 | ctxt->misc_enable_saved = !rdmsrl_safe(MSR_IA32_MISC_ENABLE, | ||
| 109 | &ctxt->misc_enable); | ||
| 108 | } | 110 | } |
| 109 | 111 | ||
| 110 | /* Needed by apm.c */ | 112 | /* Needed by apm.c */ |
| @@ -152,6 +154,8 @@ static void fix_processor_context(void) | |||
| 152 | */ | 154 | */ |
| 153 | static void __restore_processor_state(struct saved_context *ctxt) | 155 | static void __restore_processor_state(struct saved_context *ctxt) |
| 154 | { | 156 | { |
| 157 | if (ctxt->misc_enable_saved) | ||
| 158 | wrmsrl(MSR_IA32_MISC_ENABLE, ctxt->misc_enable); | ||
| 155 | /* | 159 | /* |
| 156 | * control registers | 160 | * control registers |
| 157 | */ | 161 | */ |
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index 70b58fe9e5b1..be7726d7686d 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c | |||
| @@ -622,6 +622,11 @@ static int sil24_exec_polled_cmd(struct ata_port *ap, int pmp, | |||
| 622 | irq_enabled = readl(port + PORT_IRQ_ENABLE_SET); | 622 | irq_enabled = readl(port + PORT_IRQ_ENABLE_SET); |
| 623 | writel(PORT_IRQ_COMPLETE | PORT_IRQ_ERROR, port + PORT_IRQ_ENABLE_CLR); | 623 | writel(PORT_IRQ_COMPLETE | PORT_IRQ_ERROR, port + PORT_IRQ_ENABLE_CLR); |
| 624 | 624 | ||
| 625 | /* | ||
| 626 | * The barrier is required to ensure that writes to cmd_block reach | ||
| 627 | * the memory before the write to PORT_CMD_ACTIVATE. | ||
| 628 | */ | ||
| 629 | wmb(); | ||
| 625 | writel((u32)paddr, port + PORT_CMD_ACTIVATE); | 630 | writel((u32)paddr, port + PORT_CMD_ACTIVATE); |
| 626 | writel((u64)paddr >> 32, port + PORT_CMD_ACTIVATE + 4); | 631 | writel((u64)paddr >> 32, port + PORT_CMD_ACTIVATE + 4); |
| 627 | 632 | ||
| @@ -865,7 +870,7 @@ static void sil24_qc_prep(struct ata_queued_cmd *qc) | |||
| 865 | } else { | 870 | } else { |
| 866 | prb = &cb->atapi.prb; | 871 | prb = &cb->atapi.prb; |
| 867 | sge = cb->atapi.sge; | 872 | sge = cb->atapi.sge; |
| 868 | memset(cb->atapi.cdb, 0, 32); | 873 | memset(cb->atapi.cdb, 0, sizeof(cb->atapi.cdb)); |
| 869 | memcpy(cb->atapi.cdb, qc->cdb, qc->dev->cdb_len); | 874 | memcpy(cb->atapi.cdb, qc->cdb, qc->dev->cdb_len); |
| 870 | 875 | ||
| 871 | if (ata_is_data(qc->tf.protocol)) { | 876 | if (ata_is_data(qc->tf.protocol)) { |
| @@ -895,6 +900,11 @@ static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc) | |||
| 895 | paddr = pp->cmd_block_dma + tag * sizeof(*pp->cmd_block); | 900 | paddr = pp->cmd_block_dma + tag * sizeof(*pp->cmd_block); |
| 896 | activate = port + PORT_CMD_ACTIVATE + tag * 8; | 901 | activate = port + PORT_CMD_ACTIVATE + tag * 8; |
| 897 | 902 | ||
| 903 | /* | ||
| 904 | * The barrier is required to ensure that writes to cmd_block reach | ||
| 905 | * the memory before the write to PORT_CMD_ACTIVATE. | ||
| 906 | */ | ||
| 907 | wmb(); | ||
| 898 | writel((u32)paddr, activate); | 908 | writel((u32)paddr, activate); |
| 899 | writel((u64)paddr >> 32, activate + 4); | 909 | writel((u64)paddr >> 32, activate + 4); |
| 900 | 910 | ||
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 6b077f93acc6..7258c95e895e 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
| @@ -1236,8 +1236,6 @@ static void after_state_ch(struct drbd_conf *mdev, union drbd_state os, | |||
| 1236 | /* Last part of the attaching process ... */ | 1236 | /* Last part of the attaching process ... */ |
| 1237 | if (ns.conn >= C_CONNECTED && | 1237 | if (ns.conn >= C_CONNECTED && |
| 1238 | os.disk == D_ATTACHING && ns.disk == D_NEGOTIATING) { | 1238 | os.disk == D_ATTACHING && ns.disk == D_NEGOTIATING) { |
| 1239 | kfree(mdev->p_uuid); /* We expect to receive up-to-date UUIDs soon. */ | ||
| 1240 | mdev->p_uuid = NULL; /* ...to not use the old ones in the mean time */ | ||
| 1241 | drbd_send_sizes(mdev, 0, 0); /* to start sync... */ | 1239 | drbd_send_sizes(mdev, 0, 0); /* to start sync... */ |
| 1242 | drbd_send_uuids(mdev); | 1240 | drbd_send_uuids(mdev); |
| 1243 | drbd_send_state(mdev); | 1241 | drbd_send_state(mdev); |
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index 632e3245d1bb..2151f18b21de 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c | |||
| @@ -1114,6 +1114,12 @@ static int drbd_nl_disk_conf(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nlp | |||
| 1114 | mdev->new_state_tmp.i = ns.i; | 1114 | mdev->new_state_tmp.i = ns.i; |
| 1115 | ns.i = os.i; | 1115 | ns.i = os.i; |
| 1116 | ns.disk = D_NEGOTIATING; | 1116 | ns.disk = D_NEGOTIATING; |
| 1117 | |||
| 1118 | /* We expect to receive up-to-date UUIDs soon. | ||
| 1119 | To avoid a race in receive_state, free p_uuid while | ||
| 1120 | holding req_lock. I.e. atomic with the state change */ | ||
| 1121 | kfree(mdev->p_uuid); | ||
| 1122 | mdev->p_uuid = NULL; | ||
| 1117 | } | 1123 | } |
| 1118 | 1124 | ||
| 1119 | rv = _drbd_set_state(mdev, ns, CS_VERBOSE, NULL); | 1125 | rv = _drbd_set_state(mdev, ns, CS_VERBOSE, NULL); |
diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c index 9c149750e2bf..284a5f4a63ac 100644 --- a/drivers/net/8139cp.c +++ b/drivers/net/8139cp.c | |||
| @@ -598,8 +598,8 @@ rx_next: | |||
| 598 | goto rx_status_loop; | 598 | goto rx_status_loop; |
| 599 | 599 | ||
| 600 | spin_lock_irqsave(&cp->lock, flags); | 600 | spin_lock_irqsave(&cp->lock, flags); |
| 601 | cpw16_f(IntrMask, cp_intr_mask); | ||
| 602 | __napi_complete(napi); | 601 | __napi_complete(napi); |
| 602 | cpw16_f(IntrMask, cp_intr_mask); | ||
| 603 | spin_unlock_irqrestore(&cp->lock, flags); | 603 | spin_unlock_irqrestore(&cp->lock, flags); |
| 604 | } | 604 | } |
| 605 | 605 | ||
diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c index 80cd074d3817..97d8068b372b 100644 --- a/drivers/net/8139too.c +++ b/drivers/net/8139too.c | |||
| @@ -2089,8 +2089,8 @@ static int rtl8139_poll(struct napi_struct *napi, int budget) | |||
| 2089 | * again when we think we are done. | 2089 | * again when we think we are done. |
| 2090 | */ | 2090 | */ |
| 2091 | spin_lock_irqsave(&tp->lock, flags); | 2091 | spin_lock_irqsave(&tp->lock, flags); |
| 2092 | RTL_W16_F(IntrMask, rtl8139_intr_mask); | ||
| 2093 | __napi_complete(napi); | 2092 | __napi_complete(napi); |
| 2093 | RTL_W16_F(IntrMask, rtl8139_intr_mask); | ||
| 2094 | spin_unlock_irqrestore(&tp->lock, flags); | 2094 | spin_unlock_irqrestore(&tp->lock, flags); |
| 2095 | } | 2095 | } |
| 2096 | spin_unlock(&tp->rx_lock); | 2096 | spin_unlock(&tp->rx_lock); |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 1830f3199cb5..46c69cd06553 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
| @@ -747,8 +747,7 @@ static int gfar_of_init(struct of_device *ofdev, struct net_device **pdev) | |||
| 747 | FSL_GIANFAR_DEV_HAS_CSUM | | 747 | FSL_GIANFAR_DEV_HAS_CSUM | |
| 748 | FSL_GIANFAR_DEV_HAS_VLAN | | 748 | FSL_GIANFAR_DEV_HAS_VLAN | |
| 749 | FSL_GIANFAR_DEV_HAS_MAGIC_PACKET | | 749 | FSL_GIANFAR_DEV_HAS_MAGIC_PACKET | |
| 750 | FSL_GIANFAR_DEV_HAS_EXTENDED_HASH | | 750 | FSL_GIANFAR_DEV_HAS_EXTENDED_HASH; |
| 751 | FSL_GIANFAR_DEV_HAS_TIMER; | ||
| 752 | 751 | ||
| 753 | ctype = of_get_property(np, "phy-connection-type", NULL); | 752 | ctype = of_get_property(np, "phy-connection-type", NULL); |
| 754 | 753 | ||
diff --git a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c index 7b6fe89f9db0..64e6a84bbbbe 100644 --- a/drivers/net/pcmcia/smc91c92_cs.c +++ b/drivers/net/pcmcia/smc91c92_cs.c | |||
| @@ -322,6 +322,7 @@ static int smc91c92_probe(struct pcmcia_device *link) | |||
| 322 | return -ENOMEM; | 322 | return -ENOMEM; |
| 323 | smc = netdev_priv(dev); | 323 | smc = netdev_priv(dev); |
| 324 | smc->p_dev = link; | 324 | smc->p_dev = link; |
| 325 | link->priv = dev; | ||
| 325 | 326 | ||
| 326 | spin_lock_init(&smc->lock); | 327 | spin_lock_init(&smc->lock); |
| 327 | link->io.NumPorts1 = 16; | 328 | link->io.NumPorts1 = 16; |
diff --git a/drivers/net/phy/lxt.c b/drivers/net/phy/lxt.c index 8ee929b796d8..dbd003453737 100644 --- a/drivers/net/phy/lxt.c +++ b/drivers/net/phy/lxt.c | |||
| @@ -53,6 +53,9 @@ | |||
| 53 | 53 | ||
| 54 | #define MII_LXT971_ISR 19 /* Interrupt Status Register */ | 54 | #define MII_LXT971_ISR 19 /* Interrupt Status Register */ |
| 55 | 55 | ||
| 56 | /* register definitions for the 973 */ | ||
| 57 | #define MII_LXT973_PCR 16 /* Port Configuration Register */ | ||
| 58 | #define PCR_FIBER_SELECT 1 | ||
| 56 | 59 | ||
| 57 | MODULE_DESCRIPTION("Intel LXT PHY driver"); | 60 | MODULE_DESCRIPTION("Intel LXT PHY driver"); |
| 58 | MODULE_AUTHOR("Andy Fleming"); | 61 | MODULE_AUTHOR("Andy Fleming"); |
| @@ -119,6 +122,33 @@ static int lxt971_config_intr(struct phy_device *phydev) | |||
| 119 | return err; | 122 | return err; |
| 120 | } | 123 | } |
| 121 | 124 | ||
| 125 | static int lxt973_probe(struct phy_device *phydev) | ||
| 126 | { | ||
| 127 | int val = phy_read(phydev, MII_LXT973_PCR); | ||
| 128 | |||
| 129 | if (val & PCR_FIBER_SELECT) { | ||
| 130 | /* | ||
| 131 | * If fiber is selected, then the only correct setting | ||
| 132 | * is 100Mbps, full duplex, and auto negotiation off. | ||
| 133 | */ | ||
| 134 | val = phy_read(phydev, MII_BMCR); | ||
| 135 | val |= (BMCR_SPEED100 | BMCR_FULLDPLX); | ||
| 136 | val &= ~BMCR_ANENABLE; | ||
| 137 | phy_write(phydev, MII_BMCR, val); | ||
| 138 | /* Remember that the port is in fiber mode. */ | ||
| 139 | phydev->priv = lxt973_probe; | ||
| 140 | } else { | ||
| 141 | phydev->priv = NULL; | ||
| 142 | } | ||
| 143 | return 0; | ||
| 144 | } | ||
| 145 | |||
| 146 | static int lxt973_config_aneg(struct phy_device *phydev) | ||
| 147 | { | ||
| 148 | /* Do nothing if port is in fiber mode. */ | ||
| 149 | return phydev->priv ? 0 : genphy_config_aneg(phydev); | ||
| 150 | } | ||
| 151 | |||
| 122 | static struct phy_driver lxt970_driver = { | 152 | static struct phy_driver lxt970_driver = { |
| 123 | .phy_id = 0x78100000, | 153 | .phy_id = 0x78100000, |
| 124 | .name = "LXT970", | 154 | .name = "LXT970", |
| @@ -146,6 +176,18 @@ static struct phy_driver lxt971_driver = { | |||
| 146 | .driver = { .owner = THIS_MODULE,}, | 176 | .driver = { .owner = THIS_MODULE,}, |
| 147 | }; | 177 | }; |
| 148 | 178 | ||
| 179 | static struct phy_driver lxt973_driver = { | ||
| 180 | .phy_id = 0x00137a10, | ||
| 181 | .name = "LXT973", | ||
| 182 | .phy_id_mask = 0xfffffff0, | ||
| 183 | .features = PHY_BASIC_FEATURES, | ||
| 184 | .flags = 0, | ||
| 185 | .probe = lxt973_probe, | ||
| 186 | .config_aneg = lxt973_config_aneg, | ||
| 187 | .read_status = genphy_read_status, | ||
| 188 | .driver = { .owner = THIS_MODULE,}, | ||
| 189 | }; | ||
| 190 | |||
| 149 | static int __init lxt_init(void) | 191 | static int __init lxt_init(void) |
| 150 | { | 192 | { |
| 151 | int ret; | 193 | int ret; |
| @@ -157,9 +199,15 @@ static int __init lxt_init(void) | |||
| 157 | ret = phy_driver_register(&lxt971_driver); | 199 | ret = phy_driver_register(&lxt971_driver); |
| 158 | if (ret) | 200 | if (ret) |
| 159 | goto err2; | 201 | goto err2; |
| 202 | |||
| 203 | ret = phy_driver_register(&lxt973_driver); | ||
| 204 | if (ret) | ||
| 205 | goto err3; | ||
| 160 | return 0; | 206 | return 0; |
| 161 | 207 | ||
| 162 | err2: | 208 | err3: |
| 209 | phy_driver_unregister(&lxt971_driver); | ||
| 210 | err2: | ||
| 163 | phy_driver_unregister(&lxt970_driver); | 211 | phy_driver_unregister(&lxt970_driver); |
| 164 | err1: | 212 | err1: |
| 165 | return ret; | 213 | return ret; |
| @@ -169,6 +217,7 @@ static void __exit lxt_exit(void) | |||
| 169 | { | 217 | { |
| 170 | phy_driver_unregister(&lxt970_driver); | 218 | phy_driver_unregister(&lxt970_driver); |
| 171 | phy_driver_unregister(&lxt971_driver); | 219 | phy_driver_unregister(&lxt971_driver); |
| 220 | phy_driver_unregister(&lxt973_driver); | ||
| 172 | } | 221 | } |
| 173 | 222 | ||
| 174 | module_init(lxt_init); | 223 | module_init(lxt_init); |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 03a8318d90a2..96b6cfbf0a3a 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
| @@ -560,10 +560,10 @@ static void mdio_write(void __iomem *ioaddr, int reg_addr, int value) | |||
| 560 | udelay(25); | 560 | udelay(25); |
| 561 | } | 561 | } |
| 562 | /* | 562 | /* |
| 563 | * Some configurations require a small delay even after the write | 563 | * According to hardware specs a 20us delay is required after write |
| 564 | * completed indication or the next write might fail. | 564 | * complete indication, but before sending next command. |
| 565 | */ | 565 | */ |
| 566 | udelay(25); | 566 | udelay(20); |
| 567 | } | 567 | } |
| 568 | 568 | ||
| 569 | static int mdio_read(void __iomem *ioaddr, int reg_addr) | 569 | static int mdio_read(void __iomem *ioaddr, int reg_addr) |
| @@ -583,6 +583,12 @@ static int mdio_read(void __iomem *ioaddr, int reg_addr) | |||
| 583 | } | 583 | } |
| 584 | udelay(25); | 584 | udelay(25); |
| 585 | } | 585 | } |
| 586 | /* | ||
| 587 | * According to hardware specs a 20us delay is required after read | ||
| 588 | * complete indication, but before sending next command. | ||
| 589 | */ | ||
| 590 | udelay(20); | ||
| 591 | |||
| 586 | return value; | 592 | return value; |
| 587 | } | 593 | } |
| 588 | 594 | ||
diff --git a/drivers/net/wimax/i2400m/fw.c b/drivers/net/wimax/i2400m/fw.c index 3f283bff0ff7..11491354e5b5 100644 --- a/drivers/net/wimax/i2400m/fw.c +++ b/drivers/net/wimax/i2400m/fw.c | |||
| @@ -1192,7 +1192,7 @@ int i2400m_fw_hdr_check(struct i2400m *i2400m, | |||
| 1192 | unsigned module_type, header_len, major_version, minor_version, | 1192 | unsigned module_type, header_len, major_version, minor_version, |
| 1193 | module_id, module_vendor, date, size; | 1193 | module_id, module_vendor, date, size; |
| 1194 | 1194 | ||
| 1195 | module_type = bcf_hdr->module_type; | 1195 | module_type = le32_to_cpu(bcf_hdr->module_type); |
| 1196 | header_len = sizeof(u32) * le32_to_cpu(bcf_hdr->header_len); | 1196 | header_len = sizeof(u32) * le32_to_cpu(bcf_hdr->header_len); |
| 1197 | major_version = (le32_to_cpu(bcf_hdr->header_version) & 0xffff0000) | 1197 | major_version = (le32_to_cpu(bcf_hdr->header_version) & 0xffff0000) |
| 1198 | >> 16; | 1198 | >> 16; |
diff --git a/drivers/pci/hotplug/cpqphp_core.c b/drivers/pci/hotplug/cpqphp_core.c index b3e5580c837b..4952c3b9379d 100644 --- a/drivers/pci/hotplug/cpqphp_core.c +++ b/drivers/pci/hotplug/cpqphp_core.c | |||
| @@ -828,7 +828,14 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 828 | pci_name(pdev), err); | 828 | pci_name(pdev), err); |
| 829 | return err; | 829 | return err; |
| 830 | } | 830 | } |
| 831 | |||
| 831 | bus = pdev->subordinate; | 832 | bus = pdev->subordinate; |
| 833 | if (!bus) { | ||
| 834 | dev_notice(&pdev->dev, "the device is not a bridge, " | ||
| 835 | "skipping\n"); | ||
| 836 | rc = -ENODEV; | ||
| 837 | goto err_disable_device; | ||
| 838 | } | ||
| 832 | 839 | ||
| 833 | /* Need to read VID early b/c it's used to differentiate CPQ and INTC | 840 | /* Need to read VID early b/c it's used to differentiate CPQ and INTC |
| 834 | * discovery | 841 | * discovery |
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index afd2fbf7d797..c9957f68ac9b 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
| @@ -1035,39 +1035,6 @@ error: | |||
| 1035 | return retval; | 1035 | return retval; |
| 1036 | } | 1036 | } |
| 1037 | 1037 | ||
| 1038 | static void pci_remove_slot_links(struct pci_dev *dev) | ||
| 1039 | { | ||
| 1040 | char func[10]; | ||
| 1041 | struct pci_slot *slot; | ||
| 1042 | |||
| 1043 | sysfs_remove_link(&dev->dev.kobj, "slot"); | ||
| 1044 | list_for_each_entry(slot, &dev->bus->slots, list) { | ||
| 1045 | if (slot->number != PCI_SLOT(dev->devfn)) | ||
| 1046 | continue; | ||
| 1047 | snprintf(func, 10, "function%d", PCI_FUNC(dev->devfn)); | ||
| 1048 | sysfs_remove_link(&slot->kobj, func); | ||
| 1049 | } | ||
| 1050 | } | ||
| 1051 | |||
| 1052 | static int pci_create_slot_links(struct pci_dev *dev) | ||
| 1053 | { | ||
| 1054 | int result = 0; | ||
| 1055 | char func[10]; | ||
| 1056 | struct pci_slot *slot; | ||
| 1057 | |||
| 1058 | list_for_each_entry(slot, &dev->bus->slots, list) { | ||
| 1059 | if (slot->number != PCI_SLOT(dev->devfn)) | ||
| 1060 | continue; | ||
| 1061 | result = sysfs_create_link(&dev->dev.kobj, &slot->kobj, "slot"); | ||
| 1062 | if (result) | ||
| 1063 | goto out; | ||
| 1064 | snprintf(func, 10, "function%d", PCI_FUNC(dev->devfn)); | ||
| 1065 | result = sysfs_create_link(&slot->kobj, &dev->dev.kobj, func); | ||
| 1066 | } | ||
| 1067 | out: | ||
| 1068 | return result; | ||
| 1069 | } | ||
| 1070 | |||
| 1071 | int __must_check pci_create_sysfs_dev_files (struct pci_dev *pdev) | 1038 | int __must_check pci_create_sysfs_dev_files (struct pci_dev *pdev) |
| 1072 | { | 1039 | { |
| 1073 | int retval; | 1040 | int retval; |
| @@ -1130,8 +1097,6 @@ int __must_check pci_create_sysfs_dev_files (struct pci_dev *pdev) | |||
| 1130 | if (retval) | 1097 | if (retval) |
| 1131 | goto err_vga_file; | 1098 | goto err_vga_file; |
| 1132 | 1099 | ||
| 1133 | pci_create_slot_links(pdev); | ||
| 1134 | |||
| 1135 | return 0; | 1100 | return 0; |
| 1136 | 1101 | ||
| 1137 | err_vga_file: | 1102 | err_vga_file: |
| @@ -1181,8 +1146,6 @@ void pci_remove_sysfs_dev_files(struct pci_dev *pdev) | |||
| 1181 | if (!sysfs_initialized) | 1146 | if (!sysfs_initialized) |
| 1182 | return; | 1147 | return; |
| 1183 | 1148 | ||
| 1184 | pci_remove_slot_links(pdev); | ||
| 1185 | |||
| 1186 | pci_remove_capabilities_sysfs(pdev); | 1149 | pci_remove_capabilities_sysfs(pdev); |
| 1187 | 1150 | ||
| 1188 | if (pdev->cfg_size < PCI_CFG_SPACE_EXP_SIZE) | 1151 | if (pdev->cfg_size < PCI_CFG_SPACE_EXP_SIZE) |
diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c index 17bed18d24ad..92379e2d37e7 100644 --- a/drivers/pci/setup-res.c +++ b/drivers/pci/setup-res.c | |||
| @@ -97,16 +97,16 @@ int pci_claim_resource(struct pci_dev *dev, int resource) | |||
| 97 | 97 | ||
| 98 | root = pci_find_parent_resource(dev, res); | 98 | root = pci_find_parent_resource(dev, res); |
| 99 | if (!root) { | 99 | if (!root) { |
| 100 | dev_err(&dev->dev, "no compatible bridge window for %pR\n", | 100 | dev_info(&dev->dev, "no compatible bridge window for %pR\n", |
| 101 | res); | 101 | res); |
| 102 | return -EINVAL; | 102 | return -EINVAL; |
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | conflict = request_resource_conflict(root, res); | 105 | conflict = request_resource_conflict(root, res); |
| 106 | if (conflict) { | 106 | if (conflict) { |
| 107 | dev_err(&dev->dev, | 107 | dev_info(&dev->dev, |
| 108 | "address space collision: %pR conflicts with %s %pR\n", | 108 | "address space collision: %pR conflicts with %s %pR\n", |
| 109 | res, conflict->name, conflict); | 109 | res, conflict->name, conflict); |
| 110 | return -EBUSY; | 110 | return -EBUSY; |
| 111 | } | 111 | } |
| 112 | 112 | ||
diff --git a/drivers/pci/slot.c b/drivers/pci/slot.c index e0189cf7c558..659eaa0fc48f 100644 --- a/drivers/pci/slot.c +++ b/drivers/pci/slot.c | |||
| @@ -97,50 +97,6 @@ static ssize_t cur_speed_read_file(struct pci_slot *slot, char *buf) | |||
| 97 | return bus_speed_read(slot->bus->cur_bus_speed, buf); | 97 | return bus_speed_read(slot->bus->cur_bus_speed, buf); |
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | static void remove_sysfs_files(struct pci_slot *slot) | ||
| 101 | { | ||
| 102 | char func[10]; | ||
| 103 | struct list_head *tmp; | ||
| 104 | |||
| 105 | list_for_each(tmp, &slot->bus->devices) { | ||
| 106 | struct pci_dev *dev = pci_dev_b(tmp); | ||
| 107 | if (PCI_SLOT(dev->devfn) != slot->number) | ||
| 108 | continue; | ||
| 109 | sysfs_remove_link(&dev->dev.kobj, "slot"); | ||
| 110 | |||
| 111 | snprintf(func, 10, "function%d", PCI_FUNC(dev->devfn)); | ||
| 112 | sysfs_remove_link(&slot->kobj, func); | ||
| 113 | } | ||
| 114 | } | ||
| 115 | |||
| 116 | static int create_sysfs_files(struct pci_slot *slot) | ||
| 117 | { | ||
| 118 | int result; | ||
| 119 | char func[10]; | ||
| 120 | struct list_head *tmp; | ||
| 121 | |||
| 122 | list_for_each(tmp, &slot->bus->devices) { | ||
| 123 | struct pci_dev *dev = pci_dev_b(tmp); | ||
| 124 | if (PCI_SLOT(dev->devfn) != slot->number) | ||
| 125 | continue; | ||
| 126 | |||
| 127 | result = sysfs_create_link(&dev->dev.kobj, &slot->kobj, "slot"); | ||
| 128 | if (result) | ||
| 129 | goto fail; | ||
| 130 | |||
| 131 | snprintf(func, 10, "function%d", PCI_FUNC(dev->devfn)); | ||
| 132 | result = sysfs_create_link(&slot->kobj, &dev->dev.kobj, func); | ||
| 133 | if (result) | ||
| 134 | goto fail; | ||
| 135 | } | ||
| 136 | |||
| 137 | return 0; | ||
| 138 | |||
| 139 | fail: | ||
| 140 | remove_sysfs_files(slot); | ||
| 141 | return result; | ||
| 142 | } | ||
| 143 | |||
| 144 | static void pci_slot_release(struct kobject *kobj) | 100 | static void pci_slot_release(struct kobject *kobj) |
| 145 | { | 101 | { |
| 146 | struct pci_dev *dev; | 102 | struct pci_dev *dev; |
| @@ -153,8 +109,6 @@ static void pci_slot_release(struct kobject *kobj) | |||
| 153 | if (PCI_SLOT(dev->devfn) == slot->number) | 109 | if (PCI_SLOT(dev->devfn) == slot->number) |
| 154 | dev->slot = NULL; | 110 | dev->slot = NULL; |
| 155 | 111 | ||
| 156 | remove_sysfs_files(slot); | ||
| 157 | |||
| 158 | list_del(&slot->list); | 112 | list_del(&slot->list); |
| 159 | 113 | ||
| 160 | kfree(slot); | 114 | kfree(slot); |
| @@ -346,8 +300,6 @@ placeholder: | |||
| 346 | INIT_LIST_HEAD(&slot->list); | 300 | INIT_LIST_HEAD(&slot->list); |
| 347 | list_add(&slot->list, &parent->slots); | 301 | list_add(&slot->list, &parent->slots); |
| 348 | 302 | ||
| 349 | create_sysfs_files(slot); | ||
| 350 | |||
| 351 | list_for_each_entry(dev, &parent->devices, bus_list) | 303 | list_for_each_entry(dev, &parent->devices, bus_list) |
| 352 | if (PCI_SLOT(dev->devfn) == slot_nr) | 304 | if (PCI_SLOT(dev->devfn) == slot_nr) |
| 353 | dev->slot = slot; | 305 | dev->slot = slot; |
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 7ef7adee5e4f..9fc339845538 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
| @@ -671,6 +671,7 @@ static void pcmcia_requery(struct pcmcia_socket *s) | |||
| 671 | if (old_funcs != new_funcs) { | 671 | if (old_funcs != new_funcs) { |
| 672 | /* we need to re-start */ | 672 | /* we need to re-start */ |
| 673 | pcmcia_card_remove(s, NULL); | 673 | pcmcia_card_remove(s, NULL); |
| 674 | s->functions = 0; | ||
| 674 | pcmcia_card_add(s); | 675 | pcmcia_card_add(s); |
| 675 | } | 676 | } |
| 676 | } | 677 | } |
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index 424e576f3acb..f1d41374eea7 100644 --- a/drivers/pcmcia/yenta_socket.c +++ b/drivers/pcmcia/yenta_socket.c | |||
| @@ -880,6 +880,12 @@ static struct cardbus_type cardbus_type[] = { | |||
| 880 | .restore_state = ti_restore_state, | 880 | .restore_state = ti_restore_state, |
| 881 | .sock_init = ti_init, | 881 | .sock_init = ti_init, |
| 882 | }, | 882 | }, |
| 883 | [CARDBUS_TYPE_ENE] = { | ||
| 884 | .override = ene_override, | ||
| 885 | .save_state = ti_save_state, | ||
| 886 | .restore_state = ti_restore_state, | ||
| 887 | .sock_init = ti_init, | ||
| 888 | }, | ||
| 883 | #endif | 889 | #endif |
| 884 | #ifdef CONFIG_YENTA_RICOH | 890 | #ifdef CONFIG_YENTA_RICOH |
| 885 | [CARDBUS_TYPE_RICOH] = { | 891 | [CARDBUS_TYPE_RICOH] = { |
| @@ -902,14 +908,6 @@ static struct cardbus_type cardbus_type[] = { | |||
| 902 | .restore_state = o2micro_restore_state, | 908 | .restore_state = o2micro_restore_state, |
| 903 | }, | 909 | }, |
| 904 | #endif | 910 | #endif |
| 905 | #ifdef CONFIG_YENTA_TI | ||
| 906 | [CARDBUS_TYPE_ENE] = { | ||
| 907 | .override = ene_override, | ||
| 908 | .save_state = ti_save_state, | ||
| 909 | .restore_state = ti_restore_state, | ||
| 910 | .sock_init = ti_init, | ||
| 911 | }, | ||
| 912 | #endif | ||
| 913 | }; | 911 | }; |
| 914 | 912 | ||
| 915 | 913 | ||
| @@ -975,7 +973,7 @@ static irqreturn_t yenta_probe_handler(int irq, void *dev_id) | |||
| 975 | /* probes the PCI interrupt, use only on override functions */ | 973 | /* probes the PCI interrupt, use only on override functions */ |
| 976 | static int yenta_probe_cb_irq(struct yenta_socket *socket) | 974 | static int yenta_probe_cb_irq(struct yenta_socket *socket) |
| 977 | { | 975 | { |
| 978 | u8 reg; | 976 | u8 reg = 0; |
| 979 | 977 | ||
| 980 | if (!socket->cb_irq) | 978 | if (!socket->cb_irq) |
| 981 | return -1; | 979 | return -1; |
| @@ -989,7 +987,8 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket) | |||
| 989 | } | 987 | } |
| 990 | 988 | ||
| 991 | /* generate interrupt, wait */ | 989 | /* generate interrupt, wait */ |
| 992 | reg = exca_readb(socket, I365_CSCINT); | 990 | if (!socket->dev->irq) |
| 991 | reg = exca_readb(socket, I365_CSCINT); | ||
| 993 | exca_writeb(socket, I365_CSCINT, reg | I365_CSC_STSCHG); | 992 | exca_writeb(socket, I365_CSCINT, reg | I365_CSC_STSCHG); |
| 994 | cb_writel(socket, CB_SOCKET_EVENT, -1); | 993 | cb_writel(socket, CB_SOCKET_EVENT, -1); |
| 995 | cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); | 994 | cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); |
diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c index 8d432cd9d580..2222d161c7b6 100644 --- a/fs/btrfs/acl.c +++ b/fs/btrfs/acl.c | |||
| @@ -60,6 +60,8 @@ static struct posix_acl *btrfs_get_acl(struct inode *inode, int type) | |||
| 60 | size = __btrfs_getxattr(inode, name, value, size); | 60 | size = __btrfs_getxattr(inode, name, value, size); |
| 61 | if (size > 0) { | 61 | if (size > 0) { |
| 62 | acl = posix_acl_from_xattr(value, size); | 62 | acl = posix_acl_from_xattr(value, size); |
| 63 | if (IS_ERR(acl)) | ||
| 64 | return acl; | ||
| 63 | set_cached_acl(inode, type, acl); | 65 | set_cached_acl(inode, type, acl); |
| 64 | } | 66 | } |
| 65 | kfree(value); | 67 | kfree(value); |
| @@ -160,6 +162,12 @@ static int btrfs_xattr_acl_set(struct dentry *dentry, const char *name, | |||
| 160 | int ret; | 162 | int ret; |
| 161 | struct posix_acl *acl = NULL; | 163 | struct posix_acl *acl = NULL; |
| 162 | 164 | ||
| 165 | if (!is_owner_or_cap(dentry->d_inode)) | ||
| 166 | return -EPERM; | ||
| 167 | |||
| 168 | if (!IS_POSIXACL(dentry->d_inode)) | ||
| 169 | return -EOPNOTSUPP; | ||
| 170 | |||
| 163 | if (value) { | 171 | if (value) { |
| 164 | acl = posix_acl_from_xattr(value, size); | 172 | acl = posix_acl_from_xattr(value, size); |
| 165 | if (acl == NULL) { | 173 | if (acl == NULL) { |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index f3b287c22caf..34f7c375567e 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -1941,8 +1941,11 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
| 1941 | btrfs_level_size(tree_root, | 1941 | btrfs_level_size(tree_root, |
| 1942 | btrfs_super_log_root_level(disk_super)); | 1942 | btrfs_super_log_root_level(disk_super)); |
| 1943 | 1943 | ||
| 1944 | log_tree_root = kzalloc(sizeof(struct btrfs_root), | 1944 | log_tree_root = kzalloc(sizeof(struct btrfs_root), GFP_NOFS); |
| 1945 | GFP_NOFS); | 1945 | if (!log_tree_root) { |
| 1946 | err = -ENOMEM; | ||
| 1947 | goto fail_trans_kthread; | ||
| 1948 | } | ||
| 1946 | 1949 | ||
| 1947 | __setup_root(nodesize, leafsize, sectorsize, stripesize, | 1950 | __setup_root(nodesize, leafsize, sectorsize, stripesize, |
| 1948 | log_tree_root, fs_info, BTRFS_TREE_LOG_OBJECTID); | 1951 | log_tree_root, fs_info, BTRFS_TREE_LOG_OBJECTID); |
| @@ -1982,6 +1985,10 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
| 1982 | fs_info->fs_root = btrfs_read_fs_root_no_name(fs_info, &location); | 1985 | fs_info->fs_root = btrfs_read_fs_root_no_name(fs_info, &location); |
| 1983 | if (!fs_info->fs_root) | 1986 | if (!fs_info->fs_root) |
| 1984 | goto fail_trans_kthread; | 1987 | goto fail_trans_kthread; |
| 1988 | if (IS_ERR(fs_info->fs_root)) { | ||
| 1989 | err = PTR_ERR(fs_info->fs_root); | ||
| 1990 | goto fail_trans_kthread; | ||
| 1991 | } | ||
| 1985 | 1992 | ||
| 1986 | if (!(sb->s_flags & MS_RDONLY)) { | 1993 | if (!(sb->s_flags & MS_RDONLY)) { |
| 1987 | down_read(&fs_info->cleanup_work_sem); | 1994 | down_read(&fs_info->cleanup_work_sem); |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index b9080d71991a..32d094002a57 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -4360,7 +4360,8 @@ void btrfs_free_tree_block(struct btrfs_trans_handle *trans, | |||
| 4360 | 4360 | ||
| 4361 | block_rsv = get_block_rsv(trans, root); | 4361 | block_rsv = get_block_rsv(trans, root); |
| 4362 | cache = btrfs_lookup_block_group(root->fs_info, buf->start); | 4362 | cache = btrfs_lookup_block_group(root->fs_info, buf->start); |
| 4363 | BUG_ON(block_rsv->space_info != cache->space_info); | 4363 | if (block_rsv->space_info != cache->space_info) |
| 4364 | goto out; | ||
| 4364 | 4365 | ||
| 4365 | if (btrfs_header_generation(buf) == trans->transid) { | 4366 | if (btrfs_header_generation(buf) == trans->transid) { |
| 4366 | if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) { | 4367 | if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) { |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 787b50a16a14..e354c33df082 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
| @@ -1140,7 +1140,7 @@ int btrfs_sync_file(struct file *file, int datasync) | |||
| 1140 | /* | 1140 | /* |
| 1141 | * ok we haven't committed the transaction yet, lets do a commit | 1141 | * ok we haven't committed the transaction yet, lets do a commit |
| 1142 | */ | 1142 | */ |
| 1143 | if (file && file->private_data) | 1143 | if (file->private_data) |
| 1144 | btrfs_ioctl_trans_end(file); | 1144 | btrfs_ioctl_trans_end(file); |
| 1145 | 1145 | ||
| 1146 | trans = btrfs_start_transaction(root, 0); | 1146 | trans = btrfs_start_transaction(root, 0); |
| @@ -1190,14 +1190,22 @@ static const struct vm_operations_struct btrfs_file_vm_ops = { | |||
| 1190 | 1190 | ||
| 1191 | static int btrfs_file_mmap(struct file *filp, struct vm_area_struct *vma) | 1191 | static int btrfs_file_mmap(struct file *filp, struct vm_area_struct *vma) |
| 1192 | { | 1192 | { |
| 1193 | vma->vm_ops = &btrfs_file_vm_ops; | 1193 | struct address_space *mapping = filp->f_mapping; |
| 1194 | |||
| 1195 | if (!mapping->a_ops->readpage) | ||
| 1196 | return -ENOEXEC; | ||
| 1197 | |||
| 1194 | file_accessed(filp); | 1198 | file_accessed(filp); |
| 1199 | vma->vm_ops = &btrfs_file_vm_ops; | ||
| 1200 | vma->vm_flags |= VM_CAN_NONLINEAR; | ||
| 1201 | |||
| 1195 | return 0; | 1202 | return 0; |
| 1196 | } | 1203 | } |
| 1197 | 1204 | ||
| 1198 | const struct file_operations btrfs_file_operations = { | 1205 | const struct file_operations btrfs_file_operations = { |
| 1199 | .llseek = generic_file_llseek, | 1206 | .llseek = generic_file_llseek, |
| 1200 | .read = do_sync_read, | 1207 | .read = do_sync_read, |
| 1208 | .write = do_sync_write, | ||
| 1201 | .aio_read = generic_file_aio_read, | 1209 | .aio_read = generic_file_aio_read, |
| 1202 | .splice_read = generic_file_splice_read, | 1210 | .splice_read = generic_file_splice_read, |
| 1203 | .aio_write = btrfs_file_aio_write, | 1211 | .aio_write = btrfs_file_aio_write, |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index fa6ccc1bfe2a..1bff92ad4744 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -2673,7 +2673,7 @@ static int check_path_shared(struct btrfs_root *root, | |||
| 2673 | struct extent_buffer *eb; | 2673 | struct extent_buffer *eb; |
| 2674 | int level; | 2674 | int level; |
| 2675 | int ret; | 2675 | int ret; |
| 2676 | u64 refs; | 2676 | u64 refs = 1; |
| 2677 | 2677 | ||
| 2678 | for (level = 0; level < BTRFS_MAX_LEVEL; level++) { | 2678 | for (level = 0; level < BTRFS_MAX_LEVEL; level++) { |
| 2679 | if (!path->nodes[level]) | 2679 | if (!path->nodes[level]) |
| @@ -6884,7 +6884,7 @@ static long btrfs_fallocate(struct inode *inode, int mode, | |||
| 6884 | if (em->block_start == EXTENT_MAP_HOLE || | 6884 | if (em->block_start == EXTENT_MAP_HOLE || |
| 6885 | (cur_offset >= inode->i_size && | 6885 | (cur_offset >= inode->i_size && |
| 6886 | !test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) { | 6886 | !test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) { |
| 6887 | ret = btrfs_prealloc_file_range(inode, 0, cur_offset, | 6887 | ret = btrfs_prealloc_file_range(inode, mode, cur_offset, |
| 6888 | last_byte - cur_offset, | 6888 | last_byte - cur_offset, |
| 6889 | 1 << inode->i_blkbits, | 6889 | 1 << inode->i_blkbits, |
| 6890 | offset + len, | 6890 | offset + len, |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 4cdb98cf26de..4dbaf89b1337 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -1280,7 +1280,7 @@ static noinline int btrfs_ioctl_snap_destroy(struct file *file, | |||
| 1280 | trans = btrfs_start_transaction(root, 0); | 1280 | trans = btrfs_start_transaction(root, 0); |
| 1281 | if (IS_ERR(trans)) { | 1281 | if (IS_ERR(trans)) { |
| 1282 | err = PTR_ERR(trans); | 1282 | err = PTR_ERR(trans); |
| 1283 | goto out; | 1283 | goto out_up_write; |
| 1284 | } | 1284 | } |
| 1285 | trans->block_rsv = &root->fs_info->global_block_rsv; | 1285 | trans->block_rsv = &root->fs_info->global_block_rsv; |
| 1286 | 1286 | ||
| @@ -1845,7 +1845,7 @@ static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp) | |||
| 1845 | dir_id = btrfs_super_root_dir(&root->fs_info->super_copy); | 1845 | dir_id = btrfs_super_root_dir(&root->fs_info->super_copy); |
| 1846 | di = btrfs_lookup_dir_item(trans, root->fs_info->tree_root, path, | 1846 | di = btrfs_lookup_dir_item(trans, root->fs_info->tree_root, path, |
| 1847 | dir_id, "default", 7, 1); | 1847 | dir_id, "default", 7, 1); |
| 1848 | if (!di) { | 1848 | if (IS_ERR_OR_NULL(di)) { |
| 1849 | btrfs_free_path(path); | 1849 | btrfs_free_path(path); |
| 1850 | btrfs_end_transaction(trans, root); | 1850 | btrfs_end_transaction(trans, root); |
| 1851 | printk(KERN_ERR "Umm, you don't have the default dir item, " | 1851 | printk(KERN_ERR "Umm, you don't have the default dir item, " |
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 05d41e569236..b37d723b9d4a 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
| @@ -784,16 +784,17 @@ again: | |||
| 784 | struct btrfs_extent_ref_v0 *ref0; | 784 | struct btrfs_extent_ref_v0 *ref0; |
| 785 | ref0 = btrfs_item_ptr(eb, path1->slots[0], | 785 | ref0 = btrfs_item_ptr(eb, path1->slots[0], |
| 786 | struct btrfs_extent_ref_v0); | 786 | struct btrfs_extent_ref_v0); |
| 787 | root = find_tree_root(rc, eb, ref0); | ||
| 788 | if (!root->ref_cows) | ||
| 789 | cur->cowonly = 1; | ||
| 790 | if (key.objectid == key.offset) { | 787 | if (key.objectid == key.offset) { |
| 788 | root = find_tree_root(rc, eb, ref0); | ||
| 791 | if (root && !should_ignore_root(root)) | 789 | if (root && !should_ignore_root(root)) |
| 792 | cur->root = root; | 790 | cur->root = root; |
| 793 | else | 791 | else |
| 794 | list_add(&cur->list, &useless); | 792 | list_add(&cur->list, &useless); |
| 795 | break; | 793 | break; |
| 796 | } | 794 | } |
| 795 | if (is_cowonly_root(btrfs_ref_root_v0(eb, | ||
| 796 | ref0))) | ||
| 797 | cur->cowonly = 1; | ||
| 797 | } | 798 | } |
| 798 | #else | 799 | #else |
| 799 | BUG_ON(key.type == BTRFS_EXTENT_REF_V0_KEY); | 800 | BUG_ON(key.type == BTRFS_EXTENT_REF_V0_KEY); |
diff --git a/fs/btrfs/root-tree.c b/fs/btrfs/root-tree.c index b91ccd972644..2d958be761c8 100644 --- a/fs/btrfs/root-tree.c +++ b/fs/btrfs/root-tree.c | |||
| @@ -330,7 +330,6 @@ int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
| 330 | { | 330 | { |
| 331 | struct btrfs_path *path; | 331 | struct btrfs_path *path; |
| 332 | int ret; | 332 | int ret; |
| 333 | u32 refs; | ||
| 334 | struct btrfs_root_item *ri; | 333 | struct btrfs_root_item *ri; |
| 335 | struct extent_buffer *leaf; | 334 | struct extent_buffer *leaf; |
| 336 | 335 | ||
| @@ -344,8 +343,6 @@ int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
| 344 | leaf = path->nodes[0]; | 343 | leaf = path->nodes[0]; |
| 345 | ri = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_item); | 344 | ri = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_item); |
| 346 | 345 | ||
| 347 | refs = btrfs_disk_root_refs(leaf, ri); | ||
| 348 | BUG_ON(refs != 0); | ||
| 349 | ret = btrfs_del_item(trans, root, path); | 346 | ret = btrfs_del_item(trans, root, path); |
| 350 | out: | 347 | out: |
| 351 | btrfs_free_path(path); | 348 | btrfs_free_path(path); |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index d34b2dfc9628..f2393b390318 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
| @@ -360,6 +360,8 @@ static struct dentry *get_default_root(struct super_block *sb, | |||
| 360 | */ | 360 | */ |
| 361 | dir_id = btrfs_super_root_dir(&root->fs_info->super_copy); | 361 | dir_id = btrfs_super_root_dir(&root->fs_info->super_copy); |
| 362 | di = btrfs_lookup_dir_item(NULL, root, path, dir_id, "default", 7, 0); | 362 | di = btrfs_lookup_dir_item(NULL, root, path, dir_id, "default", 7, 0); |
| 363 | if (IS_ERR(di)) | ||
| 364 | return ERR_CAST(di); | ||
| 363 | if (!di) { | 365 | if (!di) { |
| 364 | /* | 366 | /* |
| 365 | * Ok the default dir item isn't there. This is weird since | 367 | * Ok the default dir item isn't there. This is weird since |
| @@ -390,8 +392,8 @@ setup_root: | |||
| 390 | location.offset = 0; | 392 | location.offset = 0; |
| 391 | 393 | ||
| 392 | inode = btrfs_iget(sb, &location, new_root, &new); | 394 | inode = btrfs_iget(sb, &location, new_root, &new); |
| 393 | if (!inode) | 395 | if (IS_ERR(inode)) |
| 394 | return ERR_PTR(-ENOMEM); | 396 | return ERR_CAST(inode); |
| 395 | 397 | ||
| 396 | /* | 398 | /* |
| 397 | * If we're just mounting the root most subvol put the inode and return | 399 | * If we're just mounting the root most subvol put the inode and return |
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index ae3e3a306445..619b61655ee5 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c | |||
| @@ -981,6 +981,46 @@ static int send_cap_msg(struct ceph_mds_session *session, | |||
| 981 | return 0; | 981 | return 0; |
| 982 | } | 982 | } |
| 983 | 983 | ||
| 984 | static void __queue_cap_release(struct ceph_mds_session *session, | ||
| 985 | u64 ino, u64 cap_id, u32 migrate_seq, | ||
| 986 | u32 issue_seq) | ||
| 987 | { | ||
| 988 | struct ceph_msg *msg; | ||
| 989 | struct ceph_mds_cap_release *head; | ||
| 990 | struct ceph_mds_cap_item *item; | ||
| 991 | |||
| 992 | spin_lock(&session->s_cap_lock); | ||
| 993 | BUG_ON(!session->s_num_cap_releases); | ||
| 994 | msg = list_first_entry(&session->s_cap_releases, | ||
| 995 | struct ceph_msg, list_head); | ||
| 996 | |||
| 997 | dout(" adding %llx release to mds%d msg %p (%d left)\n", | ||
| 998 | ino, session->s_mds, msg, session->s_num_cap_releases); | ||
| 999 | |||
| 1000 | BUG_ON(msg->front.iov_len + sizeof(*item) > PAGE_CACHE_SIZE); | ||
| 1001 | head = msg->front.iov_base; | ||
| 1002 | head->num = cpu_to_le32(le32_to_cpu(head->num) + 1); | ||
| 1003 | item = msg->front.iov_base + msg->front.iov_len; | ||
| 1004 | item->ino = cpu_to_le64(ino); | ||
| 1005 | item->cap_id = cpu_to_le64(cap_id); | ||
| 1006 | item->migrate_seq = cpu_to_le32(migrate_seq); | ||
| 1007 | item->seq = cpu_to_le32(issue_seq); | ||
| 1008 | |||
| 1009 | session->s_num_cap_releases--; | ||
| 1010 | |||
| 1011 | msg->front.iov_len += sizeof(*item); | ||
| 1012 | if (le32_to_cpu(head->num) == CEPH_CAPS_PER_RELEASE) { | ||
| 1013 | dout(" release msg %p full\n", msg); | ||
| 1014 | list_move_tail(&msg->list_head, &session->s_cap_releases_done); | ||
| 1015 | } else { | ||
| 1016 | dout(" release msg %p at %d/%d (%d)\n", msg, | ||
| 1017 | (int)le32_to_cpu(head->num), | ||
| 1018 | (int)CEPH_CAPS_PER_RELEASE, | ||
| 1019 | (int)msg->front.iov_len); | ||
| 1020 | } | ||
| 1021 | spin_unlock(&session->s_cap_lock); | ||
| 1022 | } | ||
| 1023 | |||
| 984 | /* | 1024 | /* |
| 985 | * Queue cap releases when an inode is dropped from our cache. Since | 1025 | * Queue cap releases when an inode is dropped from our cache. Since |
| 986 | * inode is about to be destroyed, there is no need for i_lock. | 1026 | * inode is about to be destroyed, there is no need for i_lock. |
| @@ -994,41 +1034,9 @@ void ceph_queue_caps_release(struct inode *inode) | |||
| 994 | while (p) { | 1034 | while (p) { |
| 995 | struct ceph_cap *cap = rb_entry(p, struct ceph_cap, ci_node); | 1035 | struct ceph_cap *cap = rb_entry(p, struct ceph_cap, ci_node); |
| 996 | struct ceph_mds_session *session = cap->session; | 1036 | struct ceph_mds_session *session = cap->session; |
| 997 | struct ceph_msg *msg; | ||
| 998 | struct ceph_mds_cap_release *head; | ||
| 999 | struct ceph_mds_cap_item *item; | ||
| 1000 | 1037 | ||
| 1001 | spin_lock(&session->s_cap_lock); | 1038 | __queue_cap_release(session, ceph_ino(inode), cap->cap_id, |
| 1002 | BUG_ON(!session->s_num_cap_releases); | 1039 | cap->mseq, cap->issue_seq); |
| 1003 | msg = list_first_entry(&session->s_cap_releases, | ||
| 1004 | struct ceph_msg, list_head); | ||
| 1005 | |||
| 1006 | dout(" adding %p release to mds%d msg %p (%d left)\n", | ||
| 1007 | inode, session->s_mds, msg, session->s_num_cap_releases); | ||
| 1008 | |||
| 1009 | BUG_ON(msg->front.iov_len + sizeof(*item) > PAGE_CACHE_SIZE); | ||
| 1010 | head = msg->front.iov_base; | ||
| 1011 | head->num = cpu_to_le32(le32_to_cpu(head->num) + 1); | ||
| 1012 | item = msg->front.iov_base + msg->front.iov_len; | ||
| 1013 | item->ino = cpu_to_le64(ceph_ino(inode)); | ||
| 1014 | item->cap_id = cpu_to_le64(cap->cap_id); | ||
| 1015 | item->migrate_seq = cpu_to_le32(cap->mseq); | ||
| 1016 | item->seq = cpu_to_le32(cap->issue_seq); | ||
| 1017 | |||
| 1018 | session->s_num_cap_releases--; | ||
| 1019 | |||
| 1020 | msg->front.iov_len += sizeof(*item); | ||
| 1021 | if (le32_to_cpu(head->num) == CEPH_CAPS_PER_RELEASE) { | ||
| 1022 | dout(" release msg %p full\n", msg); | ||
| 1023 | list_move_tail(&msg->list_head, | ||
| 1024 | &session->s_cap_releases_done); | ||
| 1025 | } else { | ||
| 1026 | dout(" release msg %p at %d/%d (%d)\n", msg, | ||
| 1027 | (int)le32_to_cpu(head->num), | ||
| 1028 | (int)CEPH_CAPS_PER_RELEASE, | ||
| 1029 | (int)msg->front.iov_len); | ||
| 1030 | } | ||
| 1031 | spin_unlock(&session->s_cap_lock); | ||
| 1032 | p = rb_next(p); | 1040 | p = rb_next(p); |
| 1033 | __ceph_remove_cap(cap); | 1041 | __ceph_remove_cap(cap); |
| 1034 | } | 1042 | } |
| @@ -2655,7 +2663,7 @@ void ceph_handle_caps(struct ceph_mds_session *session, | |||
| 2655 | struct ceph_mds_caps *h; | 2663 | struct ceph_mds_caps *h; |
| 2656 | int mds = session->s_mds; | 2664 | int mds = session->s_mds; |
| 2657 | int op; | 2665 | int op; |
| 2658 | u32 seq; | 2666 | u32 seq, mseq; |
| 2659 | struct ceph_vino vino; | 2667 | struct ceph_vino vino; |
| 2660 | u64 cap_id; | 2668 | u64 cap_id; |
| 2661 | u64 size, max_size; | 2669 | u64 size, max_size; |
| @@ -2675,6 +2683,7 @@ void ceph_handle_caps(struct ceph_mds_session *session, | |||
| 2675 | vino.snap = CEPH_NOSNAP; | 2683 | vino.snap = CEPH_NOSNAP; |
| 2676 | cap_id = le64_to_cpu(h->cap_id); | 2684 | cap_id = le64_to_cpu(h->cap_id); |
| 2677 | seq = le32_to_cpu(h->seq); | 2685 | seq = le32_to_cpu(h->seq); |
| 2686 | mseq = le32_to_cpu(h->migrate_seq); | ||
| 2678 | size = le64_to_cpu(h->size); | 2687 | size = le64_to_cpu(h->size); |
| 2679 | max_size = le64_to_cpu(h->max_size); | 2688 | max_size = le64_to_cpu(h->max_size); |
| 2680 | 2689 | ||
| @@ -2689,6 +2698,18 @@ void ceph_handle_caps(struct ceph_mds_session *session, | |||
| 2689 | vino.snap, inode); | 2698 | vino.snap, inode); |
| 2690 | if (!inode) { | 2699 | if (!inode) { |
| 2691 | dout(" i don't have ino %llx\n", vino.ino); | 2700 | dout(" i don't have ino %llx\n", vino.ino); |
| 2701 | |||
| 2702 | if (op == CEPH_CAP_OP_IMPORT) | ||
| 2703 | __queue_cap_release(session, vino.ino, cap_id, | ||
| 2704 | mseq, seq); | ||
| 2705 | |||
| 2706 | /* | ||
| 2707 | * send any full release message to try to move things | ||
| 2708 | * along for the mds (who clearly thinks we still have this | ||
| 2709 | * cap). | ||
| 2710 | */ | ||
| 2711 | ceph_add_cap_releases(mdsc, session, -1); | ||
| 2712 | ceph_send_cap_releases(mdsc, session); | ||
| 2692 | goto done; | 2713 | goto done; |
| 2693 | } | 2714 | } |
| 2694 | 2715 | ||
| @@ -2714,7 +2735,7 @@ void ceph_handle_caps(struct ceph_mds_session *session, | |||
| 2714 | spin_lock(&inode->i_lock); | 2735 | spin_lock(&inode->i_lock); |
| 2715 | cap = __get_cap_for_mds(ceph_inode(inode), mds); | 2736 | cap = __get_cap_for_mds(ceph_inode(inode), mds); |
| 2716 | if (!cap) { | 2737 | if (!cap) { |
| 2717 | dout("no cap on %p ino %llx.%llx from mds%d, releasing\n", | 2738 | dout(" no cap on %p ino %llx.%llx from mds%d\n", |
| 2718 | inode, ceph_ino(inode), ceph_snap(inode), mds); | 2739 | inode, ceph_ino(inode), ceph_snap(inode), mds); |
| 2719 | spin_unlock(&inode->i_lock); | 2740 | spin_unlock(&inode->i_lock); |
| 2720 | goto done; | 2741 | goto done; |
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 226f5a50d362..ab47f46ca282 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
| @@ -827,7 +827,7 @@ static void ceph_set_dentry_offset(struct dentry *dn) | |||
| 827 | 827 | ||
| 828 | spin_lock(&dcache_lock); | 828 | spin_lock(&dcache_lock); |
| 829 | spin_lock(&dn->d_lock); | 829 | spin_lock(&dn->d_lock); |
| 830 | list_move_tail(&dir->d_subdirs, &dn->d_u.d_child); | 830 | list_move(&dn->d_u.d_child, &dir->d_subdirs); |
| 831 | dout("set_dentry_offset %p %lld (%p %p)\n", dn, di->offset, | 831 | dout("set_dentry_offset %p %lld (%p %p)\n", dn, di->offset, |
| 832 | dn->d_u.d_child.prev, dn->d_u.d_child.next); | 832 | dn->d_u.d_child.prev, dn->d_u.d_child.next); |
| 833 | spin_unlock(&dn->d_lock); | 833 | spin_unlock(&dn->d_lock); |
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index b49f12822cbc..1766947fc07a 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
| @@ -1066,9 +1066,9 @@ static int trim_caps(struct ceph_mds_client *mdsc, | |||
| 1066 | * | 1066 | * |
| 1067 | * Called under s_mutex. | 1067 | * Called under s_mutex. |
| 1068 | */ | 1068 | */ |
| 1069 | static int add_cap_releases(struct ceph_mds_client *mdsc, | 1069 | int ceph_add_cap_releases(struct ceph_mds_client *mdsc, |
| 1070 | struct ceph_mds_session *session, | 1070 | struct ceph_mds_session *session, |
| 1071 | int extra) | 1071 | int extra) |
| 1072 | { | 1072 | { |
| 1073 | struct ceph_msg *msg; | 1073 | struct ceph_msg *msg; |
| 1074 | struct ceph_mds_cap_release *head; | 1074 | struct ceph_mds_cap_release *head; |
| @@ -1176,8 +1176,8 @@ static int check_cap_flush(struct ceph_mds_client *mdsc, u64 want_flush_seq) | |||
| 1176 | /* | 1176 | /* |
| 1177 | * called under s_mutex | 1177 | * called under s_mutex |
| 1178 | */ | 1178 | */ |
| 1179 | static void send_cap_releases(struct ceph_mds_client *mdsc, | 1179 | void ceph_send_cap_releases(struct ceph_mds_client *mdsc, |
| 1180 | struct ceph_mds_session *session) | 1180 | struct ceph_mds_session *session) |
| 1181 | { | 1181 | { |
| 1182 | struct ceph_msg *msg; | 1182 | struct ceph_msg *msg; |
| 1183 | 1183 | ||
| @@ -1980,7 +1980,7 @@ out_err: | |||
| 1980 | } | 1980 | } |
| 1981 | mutex_unlock(&mdsc->mutex); | 1981 | mutex_unlock(&mdsc->mutex); |
| 1982 | 1982 | ||
| 1983 | add_cap_releases(mdsc, req->r_session, -1); | 1983 | ceph_add_cap_releases(mdsc, req->r_session, -1); |
| 1984 | mutex_unlock(&session->s_mutex); | 1984 | mutex_unlock(&session->s_mutex); |
| 1985 | 1985 | ||
| 1986 | /* kick calling process */ | 1986 | /* kick calling process */ |
| @@ -2433,6 +2433,7 @@ static void handle_lease(struct ceph_mds_client *mdsc, | |||
| 2433 | struct ceph_dentry_info *di; | 2433 | struct ceph_dentry_info *di; |
| 2434 | int mds = session->s_mds; | 2434 | int mds = session->s_mds; |
| 2435 | struct ceph_mds_lease *h = msg->front.iov_base; | 2435 | struct ceph_mds_lease *h = msg->front.iov_base; |
| 2436 | u32 seq; | ||
| 2436 | struct ceph_vino vino; | 2437 | struct ceph_vino vino; |
| 2437 | int mask; | 2438 | int mask; |
| 2438 | struct qstr dname; | 2439 | struct qstr dname; |
| @@ -2446,6 +2447,7 @@ static void handle_lease(struct ceph_mds_client *mdsc, | |||
| 2446 | vino.ino = le64_to_cpu(h->ino); | 2447 | vino.ino = le64_to_cpu(h->ino); |
| 2447 | vino.snap = CEPH_NOSNAP; | 2448 | vino.snap = CEPH_NOSNAP; |
| 2448 | mask = le16_to_cpu(h->mask); | 2449 | mask = le16_to_cpu(h->mask); |
| 2450 | seq = le32_to_cpu(h->seq); | ||
| 2449 | dname.name = (void *)h + sizeof(*h) + sizeof(u32); | 2451 | dname.name = (void *)h + sizeof(*h) + sizeof(u32); |
| 2450 | dname.len = msg->front.iov_len - sizeof(*h) - sizeof(u32); | 2452 | dname.len = msg->front.iov_len - sizeof(*h) - sizeof(u32); |
| 2451 | if (dname.len != get_unaligned_le32(h+1)) | 2453 | if (dname.len != get_unaligned_le32(h+1)) |
| @@ -2456,8 +2458,9 @@ static void handle_lease(struct ceph_mds_client *mdsc, | |||
| 2456 | 2458 | ||
| 2457 | /* lookup inode */ | 2459 | /* lookup inode */ |
| 2458 | inode = ceph_find_inode(sb, vino); | 2460 | inode = ceph_find_inode(sb, vino); |
| 2459 | dout("handle_lease '%s', mask %d, ino %llx %p\n", | 2461 | dout("handle_lease %s, mask %d, ino %llx %p %.*s\n", |
| 2460 | ceph_lease_op_name(h->action), mask, vino.ino, inode); | 2462 | ceph_lease_op_name(h->action), mask, vino.ino, inode, |
| 2463 | dname.len, dname.name); | ||
| 2461 | if (inode == NULL) { | 2464 | if (inode == NULL) { |
| 2462 | dout("handle_lease no inode %llx\n", vino.ino); | 2465 | dout("handle_lease no inode %llx\n", vino.ino); |
| 2463 | goto release; | 2466 | goto release; |
| @@ -2482,7 +2485,8 @@ static void handle_lease(struct ceph_mds_client *mdsc, | |||
| 2482 | switch (h->action) { | 2485 | switch (h->action) { |
| 2483 | case CEPH_MDS_LEASE_REVOKE: | 2486 | case CEPH_MDS_LEASE_REVOKE: |
| 2484 | if (di && di->lease_session == session) { | 2487 | if (di && di->lease_session == session) { |
| 2485 | h->seq = cpu_to_le32(di->lease_seq); | 2488 | if (ceph_seq_cmp(di->lease_seq, seq) > 0) |
| 2489 | h->seq = cpu_to_le32(di->lease_seq); | ||
| 2486 | __ceph_mdsc_drop_dentry_lease(dentry); | 2490 | __ceph_mdsc_drop_dentry_lease(dentry); |
| 2487 | } | 2491 | } |
| 2488 | release = 1; | 2492 | release = 1; |
| @@ -2496,7 +2500,7 @@ static void handle_lease(struct ceph_mds_client *mdsc, | |||
| 2496 | unsigned long duration = | 2500 | unsigned long duration = |
| 2497 | le32_to_cpu(h->duration_ms) * HZ / 1000; | 2501 | le32_to_cpu(h->duration_ms) * HZ / 1000; |
| 2498 | 2502 | ||
| 2499 | di->lease_seq = le32_to_cpu(h->seq); | 2503 | di->lease_seq = seq; |
| 2500 | dentry->d_time = di->lease_renew_from + duration; | 2504 | dentry->d_time = di->lease_renew_from + duration; |
| 2501 | di->lease_renew_after = di->lease_renew_from + | 2505 | di->lease_renew_after = di->lease_renew_from + |
| 2502 | (duration >> 1); | 2506 | (duration >> 1); |
| @@ -2686,10 +2690,10 @@ static void delayed_work(struct work_struct *work) | |||
| 2686 | send_renew_caps(mdsc, s); | 2690 | send_renew_caps(mdsc, s); |
| 2687 | else | 2691 | else |
| 2688 | ceph_con_keepalive(&s->s_con); | 2692 | ceph_con_keepalive(&s->s_con); |
| 2689 | add_cap_releases(mdsc, s, -1); | 2693 | ceph_add_cap_releases(mdsc, s, -1); |
| 2690 | if (s->s_state == CEPH_MDS_SESSION_OPEN || | 2694 | if (s->s_state == CEPH_MDS_SESSION_OPEN || |
| 2691 | s->s_state == CEPH_MDS_SESSION_HUNG) | 2695 | s->s_state == CEPH_MDS_SESSION_HUNG) |
| 2692 | send_cap_releases(mdsc, s); | 2696 | ceph_send_cap_releases(mdsc, s); |
| 2693 | mutex_unlock(&s->s_mutex); | 2697 | mutex_unlock(&s->s_mutex); |
| 2694 | ceph_put_mds_session(s); | 2698 | ceph_put_mds_session(s); |
| 2695 | 2699 | ||
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h index d9936c4f1212..b292fa42a66d 100644 --- a/fs/ceph/mds_client.h +++ b/fs/ceph/mds_client.h | |||
| @@ -322,6 +322,12 @@ static inline void ceph_mdsc_put_request(struct ceph_mds_request *req) | |||
| 322 | kref_put(&req->r_kref, ceph_mdsc_release_request); | 322 | kref_put(&req->r_kref, ceph_mdsc_release_request); |
| 323 | } | 323 | } |
| 324 | 324 | ||
| 325 | extern int ceph_add_cap_releases(struct ceph_mds_client *mdsc, | ||
| 326 | struct ceph_mds_session *session, | ||
| 327 | int extra); | ||
| 328 | extern void ceph_send_cap_releases(struct ceph_mds_client *mdsc, | ||
| 329 | struct ceph_mds_session *session); | ||
| 330 | |||
| 325 | extern void ceph_mdsc_pre_umount(struct ceph_mds_client *mdsc); | 331 | extern void ceph_mdsc_pre_umount(struct ceph_mds_client *mdsc); |
| 326 | 332 | ||
| 327 | extern char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base, | 333 | extern char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base, |
diff --git a/fs/ceph/mon_client.c b/fs/ceph/mon_client.c index 21c62e9b7d1d..07a539906e67 100644 --- a/fs/ceph/mon_client.c +++ b/fs/ceph/mon_client.c | |||
| @@ -400,6 +400,8 @@ static void release_generic_request(struct kref *kref) | |||
| 400 | ceph_msg_put(req->reply); | 400 | ceph_msg_put(req->reply); |
| 401 | if (req->request) | 401 | if (req->request) |
| 402 | ceph_msg_put(req->request); | 402 | ceph_msg_put(req->request); |
| 403 | |||
| 404 | kfree(req); | ||
| 403 | } | 405 | } |
| 404 | 406 | ||
| 405 | static void put_generic_request(struct ceph_mon_generic_request *req) | 407 | static void put_generic_request(struct ceph_mon_generic_request *req) |
diff --git a/fs/ceph/super.c b/fs/ceph/super.c index 4e0bee240b9d..fa87f51e38e1 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c | |||
| @@ -89,7 +89,7 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
| 89 | 89 | ||
| 90 | buf->f_files = le64_to_cpu(st.num_objects); | 90 | buf->f_files = le64_to_cpu(st.num_objects); |
| 91 | buf->f_ffree = -1; | 91 | buf->f_ffree = -1; |
| 92 | buf->f_namelen = PATH_MAX; | 92 | buf->f_namelen = NAME_MAX; |
| 93 | buf->f_frsize = PAGE_CACHE_SIZE; | 93 | buf->f_frsize = PAGE_CACHE_SIZE; |
| 94 | 94 | ||
| 95 | /* leave fsid little-endian, regardless of host endianness */ | 95 | /* leave fsid little-endian, regardless of host endianness */ |
| @@ -926,7 +926,7 @@ static int ceph_compare_super(struct super_block *sb, void *data) | |||
| 926 | /* | 926 | /* |
| 927 | * construct our own bdi so we can control readahead, etc. | 927 | * construct our own bdi so we can control readahead, etc. |
| 928 | */ | 928 | */ |
| 929 | static atomic_long_t bdi_seq = ATOMIC_INIT(0); | 929 | static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0); |
| 930 | 930 | ||
| 931 | static int ceph_register_bdi(struct super_block *sb, struct ceph_client *client) | 931 | static int ceph_register_bdi(struct super_block *sb, struct ceph_client *client) |
| 932 | { | 932 | { |
diff --git a/include/linux/drbd.h b/include/linux/drbd.h index 30da4ae48972..b8d2516668aa 100644 --- a/include/linux/drbd.h +++ b/include/linux/drbd.h | |||
| @@ -53,7 +53,7 @@ | |||
| 53 | 53 | ||
| 54 | 54 | ||
| 55 | extern const char *drbd_buildtag(void); | 55 | extern const char *drbd_buildtag(void); |
| 56 | #define REL_VERSION "8.3.8rc2" | 56 | #define REL_VERSION "8.3.8" |
| 57 | #define API_VERSION 88 | 57 | #define API_VERSION 88 |
| 58 | #define PRO_VERSION_MIN 86 | 58 | #define PRO_VERSION_MIN 86 |
| 59 | #define PRO_VERSION_MAX 94 | 59 | #define PRO_VERSION_MAX 94 |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index bf243fc54959..f89e7fd59a4c 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -380,7 +380,10 @@ struct sk_buff { | |||
| 380 | kmemcheck_bitfield_begin(flags2); | 380 | kmemcheck_bitfield_begin(flags2); |
| 381 | __u16 queue_mapping:16; | 381 | __u16 queue_mapping:16; |
| 382 | #ifdef CONFIG_IPV6_NDISC_NODETYPE | 382 | #ifdef CONFIG_IPV6_NDISC_NODETYPE |
| 383 | __u8 ndisc_nodetype:2; | 383 | __u8 ndisc_nodetype:2, |
| 384 | deliver_no_wcard:1; | ||
| 385 | #else | ||
| 386 | __u8 deliver_no_wcard:1; | ||
| 384 | #endif | 387 | #endif |
| 385 | kmemcheck_bitfield_end(flags2); | 388 | kmemcheck_bitfield_end(flags2); |
| 386 | 389 | ||
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c index bd537fc10254..50f58f5f1c34 100644 --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c | |||
| @@ -12,7 +12,7 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | |||
| 12 | return NET_RX_DROP; | 12 | return NET_RX_DROP; |
| 13 | 13 | ||
| 14 | if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master))) | 14 | if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master))) |
| 15 | goto drop; | 15 | skb->deliver_no_wcard = 1; |
| 16 | 16 | ||
| 17 | skb->skb_iif = skb->dev->ifindex; | 17 | skb->skb_iif = skb->dev->ifindex; |
| 18 | __vlan_hwaccel_put_tag(skb, vlan_tci); | 18 | __vlan_hwaccel_put_tag(skb, vlan_tci); |
| @@ -84,7 +84,7 @@ vlan_gro_common(struct napi_struct *napi, struct vlan_group *grp, | |||
| 84 | struct sk_buff *p; | 84 | struct sk_buff *p; |
| 85 | 85 | ||
| 86 | if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master))) | 86 | if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master))) |
| 87 | goto drop; | 87 | skb->deliver_no_wcard = 1; |
| 88 | 88 | ||
| 89 | skb->skb_iif = skb->dev->ifindex; | 89 | skb->skb_iif = skb->dev->ifindex; |
| 90 | __vlan_hwaccel_put_tag(skb, vlan_tci); | 90 | __vlan_hwaccel_put_tag(skb, vlan_tci); |
diff --git a/net/caif/cfrfml.c b/net/caif/cfrfml.c index cd2830fec935..fd27b172fb5d 100644 --- a/net/caif/cfrfml.c +++ b/net/caif/cfrfml.c | |||
| @@ -83,7 +83,7 @@ static int cfrfml_transmit(struct cflayer *layr, struct cfpkt *pkt) | |||
| 83 | if (!cfsrvl_ready(service, &ret)) | 83 | if (!cfsrvl_ready(service, &ret)) |
| 84 | return ret; | 84 | return ret; |
| 85 | 85 | ||
| 86 | if (!cfpkt_getlen(pkt) > CAIF_MAX_PAYLOAD_SIZE) { | 86 | if (cfpkt_getlen(pkt) > CAIF_MAX_PAYLOAD_SIZE) { |
| 87 | pr_err("CAIF: %s():Packet too large - size=%d\n", | 87 | pr_err("CAIF: %s():Packet too large - size=%d\n", |
| 88 | __func__, cfpkt_getlen(pkt)); | 88 | __func__, cfpkt_getlen(pkt)); |
| 89 | return -EOVERFLOW; | 89 | return -EOVERFLOW; |
diff --git a/net/caif/cfveil.c b/net/caif/cfveil.c index 0fd827f49491..e04f7d964e83 100644 --- a/net/caif/cfveil.c +++ b/net/caif/cfveil.c | |||
| @@ -84,7 +84,7 @@ static int cfvei_transmit(struct cflayer *layr, struct cfpkt *pkt) | |||
| 84 | return ret; | 84 | return ret; |
| 85 | caif_assert(layr->dn != NULL); | 85 | caif_assert(layr->dn != NULL); |
| 86 | caif_assert(layr->dn->transmit != NULL); | 86 | caif_assert(layr->dn->transmit != NULL); |
| 87 | if (!cfpkt_getlen(pkt) > CAIF_MAX_PAYLOAD_SIZE) { | 87 | if (cfpkt_getlen(pkt) > CAIF_MAX_PAYLOAD_SIZE) { |
| 88 | pr_warning("CAIF: %s(): Packet too large - size=%d\n", | 88 | pr_warning("CAIF: %s(): Packet too large - size=%d\n", |
| 89 | __func__, cfpkt_getlen(pkt)); | 89 | __func__, cfpkt_getlen(pkt)); |
| 90 | return -EOVERFLOW; | 90 | return -EOVERFLOW; |
diff --git a/net/core/dev.c b/net/core/dev.c index d03470f5260a..2b3bf53bc687 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -2253,11 +2253,9 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb, | |||
| 2253 | if (skb_rx_queue_recorded(skb)) { | 2253 | if (skb_rx_queue_recorded(skb)) { |
| 2254 | u16 index = skb_get_rx_queue(skb); | 2254 | u16 index = skb_get_rx_queue(skb); |
| 2255 | if (unlikely(index >= dev->num_rx_queues)) { | 2255 | if (unlikely(index >= dev->num_rx_queues)) { |
| 2256 | if (net_ratelimit()) { | 2256 | WARN_ONCE(dev->num_rx_queues > 1, "%s received packet " |
| 2257 | pr_warning("%s received packet on queue " | 2257 | "on queue %u, but number of RX queues is %u\n", |
| 2258 | "%u, but number of RX queues is %u\n", | 2258 | dev->name, index, dev->num_rx_queues); |
| 2259 | dev->name, index, dev->num_rx_queues); | ||
| 2260 | } | ||
| 2261 | goto done; | 2259 | goto done; |
| 2262 | } | 2260 | } |
| 2263 | rxqueue = dev->_rx + index; | 2261 | rxqueue = dev->_rx + index; |
| @@ -2812,13 +2810,24 @@ static int __netif_receive_skb(struct sk_buff *skb) | |||
| 2812 | if (!skb->skb_iif) | 2810 | if (!skb->skb_iif) |
| 2813 | skb->skb_iif = skb->dev->ifindex; | 2811 | skb->skb_iif = skb->dev->ifindex; |
| 2814 | 2812 | ||
| 2813 | /* | ||
| 2814 | * bonding note: skbs received on inactive slaves should only | ||
| 2815 | * be delivered to pkt handlers that are exact matches. Also | ||
| 2816 | * the deliver_no_wcard flag will be set. If packet handlers | ||
| 2817 | * are sensitive to duplicate packets these skbs will need to | ||
| 2818 | * be dropped at the handler. The vlan accel path may have | ||
| 2819 | * already set the deliver_no_wcard flag. | ||
| 2820 | */ | ||
| 2815 | null_or_orig = NULL; | 2821 | null_or_orig = NULL; |
| 2816 | orig_dev = skb->dev; | 2822 | orig_dev = skb->dev; |
| 2817 | master = ACCESS_ONCE(orig_dev->master); | 2823 | master = ACCESS_ONCE(orig_dev->master); |
| 2818 | if (master) { | 2824 | if (skb->deliver_no_wcard) |
| 2819 | if (skb_bond_should_drop(skb, master)) | 2825 | null_or_orig = orig_dev; |
| 2826 | else if (master) { | ||
| 2827 | if (skb_bond_should_drop(skb, master)) { | ||
| 2828 | skb->deliver_no_wcard = 1; | ||
| 2820 | null_or_orig = orig_dev; /* deliver only exact match */ | 2829 | null_or_orig = orig_dev; /* deliver only exact match */ |
| 2821 | else | 2830 | } else |
| 2822 | skb->dev = master; | 2831 | skb->dev = master; |
| 2823 | } | 2832 | } |
| 2824 | 2833 | ||
diff --git a/net/core/gen_estimator.c b/net/core/gen_estimator.c index cf8e70392fe0..785e5276a300 100644 --- a/net/core/gen_estimator.c +++ b/net/core/gen_estimator.c | |||
| @@ -107,6 +107,7 @@ static DEFINE_RWLOCK(est_lock); | |||
| 107 | 107 | ||
| 108 | /* Protects against soft lockup during large deletion */ | 108 | /* Protects against soft lockup during large deletion */ |
| 109 | static struct rb_root est_root = RB_ROOT; | 109 | static struct rb_root est_root = RB_ROOT; |
| 110 | static DEFINE_SPINLOCK(est_tree_lock); | ||
| 110 | 111 | ||
| 111 | static void est_timer(unsigned long arg) | 112 | static void est_timer(unsigned long arg) |
| 112 | { | 113 | { |
| @@ -201,7 +202,6 @@ struct gen_estimator *gen_find_node(const struct gnet_stats_basic_packed *bstats | |||
| 201 | * | 202 | * |
| 202 | * Returns 0 on success or a negative error code. | 203 | * Returns 0 on success or a negative error code. |
| 203 | * | 204 | * |
| 204 | * NOTE: Called under rtnl_mutex | ||
| 205 | */ | 205 | */ |
| 206 | int gen_new_estimator(struct gnet_stats_basic_packed *bstats, | 206 | int gen_new_estimator(struct gnet_stats_basic_packed *bstats, |
| 207 | struct gnet_stats_rate_est *rate_est, | 207 | struct gnet_stats_rate_est *rate_est, |
| @@ -232,6 +232,7 @@ int gen_new_estimator(struct gnet_stats_basic_packed *bstats, | |||
| 232 | est->last_packets = bstats->packets; | 232 | est->last_packets = bstats->packets; |
| 233 | est->avpps = rate_est->pps<<10; | 233 | est->avpps = rate_est->pps<<10; |
| 234 | 234 | ||
| 235 | spin_lock(&est_tree_lock); | ||
| 235 | if (!elist[idx].timer.function) { | 236 | if (!elist[idx].timer.function) { |
| 236 | INIT_LIST_HEAD(&elist[idx].list); | 237 | INIT_LIST_HEAD(&elist[idx].list); |
| 237 | setup_timer(&elist[idx].timer, est_timer, idx); | 238 | setup_timer(&elist[idx].timer, est_timer, idx); |
| @@ -242,6 +243,7 @@ int gen_new_estimator(struct gnet_stats_basic_packed *bstats, | |||
| 242 | 243 | ||
| 243 | list_add_rcu(&est->list, &elist[idx].list); | 244 | list_add_rcu(&est->list, &elist[idx].list); |
| 244 | gen_add_node(est); | 245 | gen_add_node(est); |
| 246 | spin_unlock(&est_tree_lock); | ||
| 245 | 247 | ||
| 246 | return 0; | 248 | return 0; |
| 247 | } | 249 | } |
| @@ -261,13 +263,13 @@ static void __gen_kill_estimator(struct rcu_head *head) | |||
| 261 | * | 263 | * |
| 262 | * Removes the rate estimator specified by &bstats and &rate_est. | 264 | * Removes the rate estimator specified by &bstats and &rate_est. |
| 263 | * | 265 | * |
| 264 | * NOTE: Called under rtnl_mutex | ||
| 265 | */ | 266 | */ |
| 266 | void gen_kill_estimator(struct gnet_stats_basic_packed *bstats, | 267 | void gen_kill_estimator(struct gnet_stats_basic_packed *bstats, |
| 267 | struct gnet_stats_rate_est *rate_est) | 268 | struct gnet_stats_rate_est *rate_est) |
| 268 | { | 269 | { |
| 269 | struct gen_estimator *e; | 270 | struct gen_estimator *e; |
| 270 | 271 | ||
| 272 | spin_lock(&est_tree_lock); | ||
| 271 | while ((e = gen_find_node(bstats, rate_est))) { | 273 | while ((e = gen_find_node(bstats, rate_est))) { |
| 272 | rb_erase(&e->node, &est_root); | 274 | rb_erase(&e->node, &est_root); |
| 273 | 275 | ||
| @@ -278,6 +280,7 @@ void gen_kill_estimator(struct gnet_stats_basic_packed *bstats, | |||
| 278 | list_del_rcu(&e->list); | 280 | list_del_rcu(&e->list); |
| 279 | call_rcu(&e->e_rcu, __gen_kill_estimator); | 281 | call_rcu(&e->e_rcu, __gen_kill_estimator); |
| 280 | } | 282 | } |
| 283 | spin_unlock(&est_tree_lock); | ||
| 281 | } | 284 | } |
| 282 | EXPORT_SYMBOL(gen_kill_estimator); | 285 | EXPORT_SYMBOL(gen_kill_estimator); |
| 283 | 286 | ||
| @@ -312,8 +315,14 @@ EXPORT_SYMBOL(gen_replace_estimator); | |||
| 312 | bool gen_estimator_active(const struct gnet_stats_basic_packed *bstats, | 315 | bool gen_estimator_active(const struct gnet_stats_basic_packed *bstats, |
| 313 | const struct gnet_stats_rate_est *rate_est) | 316 | const struct gnet_stats_rate_est *rate_est) |
| 314 | { | 317 | { |
| 318 | bool res; | ||
| 319 | |||
| 315 | ASSERT_RTNL(); | 320 | ASSERT_RTNL(); |
| 316 | 321 | ||
| 317 | return gen_find_node(bstats, rate_est) != NULL; | 322 | spin_lock(&est_tree_lock); |
| 323 | res = gen_find_node(bstats, rate_est) != NULL; | ||
| 324 | spin_unlock(&est_tree_lock); | ||
| 325 | |||
| 326 | return res; | ||
| 318 | } | 327 | } |
| 319 | EXPORT_SYMBOL(gen_estimator_active); | 328 | EXPORT_SYMBOL(gen_estimator_active); |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 2ad68da418df..1dacd7ba8dbb 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
| @@ -2170,7 +2170,7 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) | |||
| 2170 | end_time = ktime_now(); | 2170 | end_time = ktime_now(); |
| 2171 | 2171 | ||
| 2172 | pkt_dev->idle_acc += ktime_to_ns(ktime_sub(end_time, start_time)); | 2172 | pkt_dev->idle_acc += ktime_to_ns(ktime_sub(end_time, start_time)); |
| 2173 | pkt_dev->next_tx = ktime_add_ns(end_time, pkt_dev->delay); | 2173 | pkt_dev->next_tx = ktime_add_ns(spin_until, pkt_dev->delay); |
| 2174 | } | 2174 | } |
| 2175 | 2175 | ||
| 2176 | static inline void set_pkt_overhead(struct pktgen_dev *pkt_dev) | 2176 | static inline void set_pkt_overhead(struct pktgen_dev *pkt_dev) |
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index ce7992982557..03e62f94ff8e 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c | |||
| @@ -483,7 +483,7 @@ route_done: | |||
| 483 | np->tclass, NULL, &fl, (struct rt6_info*)dst, | 483 | np->tclass, NULL, &fl, (struct rt6_info*)dst, |
| 484 | MSG_DONTWAIT, np->dontfrag); | 484 | MSG_DONTWAIT, np->dontfrag); |
| 485 | if (err) { | 485 | if (err) { |
| 486 | ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTMSGS); | 486 | ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTERRORS); |
| 487 | ip6_flush_pending_frames(sk); | 487 | ip6_flush_pending_frames(sk); |
| 488 | goto out_put; | 488 | goto out_put; |
| 489 | } | 489 | } |
| @@ -565,7 +565,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb) | |||
| 565 | np->dontfrag); | 565 | np->dontfrag); |
| 566 | 566 | ||
| 567 | if (err) { | 567 | if (err) { |
| 568 | ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTMSGS); | 568 | ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTERRORS); |
| 569 | ip6_flush_pending_frames(sk); | 569 | ip6_flush_pending_frames(sk); |
| 570 | goto out_put; | 570 | goto out_put; |
| 571 | } | 571 | } |
diff --git a/scripts/Makefile.modbuiltin b/scripts/Makefile.modbuiltin index 102a276f6eea..1adb974e6950 100644 --- a/scripts/Makefile.modbuiltin +++ b/scripts/Makefile.modbuiltin | |||
| @@ -14,6 +14,11 @@ __modbuiltin: | |||
| 14 | 14 | ||
| 15 | include scripts/Kbuild.include | 15 | include scripts/Kbuild.include |
| 16 | 16 | ||
| 17 | ifneq ($(KBUILD_SRC),) | ||
| 18 | # Create output directory if not already present | ||
| 19 | _dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj)) | ||
| 20 | endif | ||
| 21 | |||
| 17 | # The filename Kbuild has precedence over Makefile | 22 | # The filename Kbuild has precedence over Makefile |
| 18 | kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) | 23 | kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) |
| 19 | kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) | 24 | kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) |
