mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-29 02:01:21 +00:00
1377 lines
44 KiB
Diff
1377 lines
44 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index a85d4eb..65c0d7f 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 3
|
|
PATCHLEVEL = 4
|
|
-SUBLEVEL = 47
|
|
+SUBLEVEL = 48
|
|
EXTRAVERSION =
|
|
NAME = Saber-toothed Squirrel
|
|
|
|
diff --git a/arch/arm/mach-kirkwood/ts219-setup.c b/arch/arm/mach-kirkwood/ts219-setup.c
|
|
index 73e2b6c..3a73fc7 100644
|
|
--- a/arch/arm/mach-kirkwood/ts219-setup.c
|
|
+++ b/arch/arm/mach-kirkwood/ts219-setup.c
|
|
@@ -124,7 +124,7 @@ static void __init qnap_ts219_init(void)
|
|
static int __init ts219_pci_init(void)
|
|
{
|
|
if (machine_is_ts219())
|
|
- kirkwood_pcie_init(KW_PCIE0);
|
|
+ kirkwood_pcie_init(KW_PCIE1 | KW_PCIE0);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c
|
|
index 331f8bb..4dac6e0 100644
|
|
--- a/arch/arm/plat-orion/common.c
|
|
+++ b/arch/arm/plat-orion/common.c
|
|
@@ -340,7 +340,7 @@ static struct resource orion_ge10_shared_resources[] = {
|
|
|
|
static struct platform_device orion_ge10_shared = {
|
|
.name = MV643XX_ETH_SHARED_NAME,
|
|
- .id = 1,
|
|
+ .id = 2,
|
|
.dev = {
|
|
.platform_data = &orion_ge10_shared_data,
|
|
},
|
|
@@ -355,8 +355,8 @@ static struct resource orion_ge10_resources[] = {
|
|
|
|
static struct platform_device orion_ge10 = {
|
|
.name = MV643XX_ETH_NAME,
|
|
- .id = 1,
|
|
- .num_resources = 2,
|
|
+ .id = 2,
|
|
+ .num_resources = 1,
|
|
.resource = orion_ge10_resources,
|
|
.dev = {
|
|
.coherent_dma_mask = DMA_BIT_MASK(32),
|
|
@@ -393,7 +393,7 @@ static struct resource orion_ge11_shared_resources[] = {
|
|
|
|
static struct platform_device orion_ge11_shared = {
|
|
.name = MV643XX_ETH_SHARED_NAME,
|
|
- .id = 1,
|
|
+ .id = 3,
|
|
.dev = {
|
|
.platform_data = &orion_ge11_shared_data,
|
|
},
|
|
@@ -408,8 +408,8 @@ static struct resource orion_ge11_resources[] = {
|
|
|
|
static struct platform_device orion_ge11 = {
|
|
.name = MV643XX_ETH_NAME,
|
|
- .id = 1,
|
|
- .num_resources = 2,
|
|
+ .id = 3,
|
|
+ .num_resources = 1,
|
|
.resource = orion_ge11_resources,
|
|
.dev = {
|
|
.coherent_dma_mask = DMA_BIT_MASK(32),
|
|
diff --git a/arch/avr32/kernel/module.c b/arch/avr32/kernel/module.c
|
|
index 596f730..2c94129 100644
|
|
--- a/arch/avr32/kernel/module.c
|
|
+++ b/arch/avr32/kernel/module.c
|
|
@@ -264,7 +264,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
|
|
break;
|
|
case R_AVR32_GOT18SW:
|
|
if ((relocation & 0xfffe0003) != 0
|
|
- && (relocation & 0xfffc0003) != 0xffff0000)
|
|
+ && (relocation & 0xfffc0000) != 0xfffc0000)
|
|
return reloc_overflow(module, "R_AVR32_GOT18SW",
|
|
relocation);
|
|
relocation >>= 2;
|
|
diff --git a/arch/m68k/kernel/head.S b/arch/m68k/kernel/head.S
|
|
index d197e7f..ac85f16 100644
|
|
--- a/arch/m68k/kernel/head.S
|
|
+++ b/arch/m68k/kernel/head.S
|
|
@@ -2752,11 +2752,9 @@ func_return get_new_page
|
|
#ifdef CONFIG_MAC
|
|
|
|
L(scc_initable_mac):
|
|
- .byte 9,12 /* Reset */
|
|
.byte 4,0x44 /* x16, 1 stopbit, no parity */
|
|
.byte 3,0xc0 /* receiver: 8 bpc */
|
|
.byte 5,0xe2 /* transmitter: 8 bpc, assert dtr/rts */
|
|
- .byte 9,0 /* no interrupts */
|
|
.byte 10,0 /* NRZ */
|
|
.byte 11,0x50 /* use baud rate generator */
|
|
.byte 12,1,13,0 /* 38400 baud */
|
|
@@ -2899,6 +2897,7 @@ func_start serial_init,%d0/%d1/%a0/%a1
|
|
is_not_mac(L(serial_init_not_mac))
|
|
|
|
#ifdef SERIAL_DEBUG
|
|
+
|
|
/* You may define either or both of these. */
|
|
#define MAC_USE_SCC_A /* Modem port */
|
|
#define MAC_USE_SCC_B /* Printer port */
|
|
@@ -2908,9 +2907,21 @@ func_start serial_init,%d0/%d1/%a0/%a1
|
|
#define mac_scc_cha_b_data_offset 0x4
|
|
#define mac_scc_cha_a_data_offset 0x6
|
|
|
|
+#if defined(MAC_USE_SCC_A) || defined(MAC_USE_SCC_B)
|
|
+ movel %pc@(L(mac_sccbase)),%a0
|
|
+ /* Reset SCC device */
|
|
+ moveb #9,%a0@(mac_scc_cha_a_ctrl_offset)
|
|
+ moveb #0xc0,%a0@(mac_scc_cha_a_ctrl_offset)
|
|
+ /* Wait for 5 PCLK cycles, which is about 68 CPU cycles */
|
|
+ /* 5 / 3.6864 MHz = approx. 1.36 us = 68 / 50 MHz */
|
|
+ movel #35,%d0
|
|
+5:
|
|
+ subq #1,%d0
|
|
+ jne 5b
|
|
+#endif
|
|
+
|
|
#ifdef MAC_USE_SCC_A
|
|
/* Initialize channel A */
|
|
- movel %pc@(L(mac_sccbase)),%a0
|
|
lea %pc@(L(scc_initable_mac)),%a1
|
|
5: moveb %a1@+,%d0
|
|
jmi 6f
|
|
@@ -2922,9 +2933,6 @@ func_start serial_init,%d0/%d1/%a0/%a1
|
|
|
|
#ifdef MAC_USE_SCC_B
|
|
/* Initialize channel B */
|
|
-#ifndef MAC_USE_SCC_A /* Load mac_sccbase only if needed */
|
|
- movel %pc@(L(mac_sccbase)),%a0
|
|
-#endif /* MAC_USE_SCC_A */
|
|
lea %pc@(L(scc_initable_mac)),%a1
|
|
7: moveb %a1@+,%d0
|
|
jmi 8f
|
|
@@ -2933,6 +2941,7 @@ func_start serial_init,%d0/%d1/%a0/%a1
|
|
jra 7b
|
|
8:
|
|
#endif /* MAC_USE_SCC_B */
|
|
+
|
|
#endif /* SERIAL_DEBUG */
|
|
|
|
jra L(serial_init_done)
|
|
@@ -3006,17 +3015,17 @@ func_start serial_putc,%d0/%d1/%a0/%a1
|
|
|
|
#ifdef SERIAL_DEBUG
|
|
|
|
-#ifdef MAC_USE_SCC_A
|
|
+#if defined(MAC_USE_SCC_A) || defined(MAC_USE_SCC_B)
|
|
movel %pc@(L(mac_sccbase)),%a1
|
|
+#endif
|
|
+
|
|
+#ifdef MAC_USE_SCC_A
|
|
3: btst #2,%a1@(mac_scc_cha_a_ctrl_offset)
|
|
jeq 3b
|
|
moveb %d0,%a1@(mac_scc_cha_a_data_offset)
|
|
#endif /* MAC_USE_SCC_A */
|
|
|
|
#ifdef MAC_USE_SCC_B
|
|
-#ifndef MAC_USE_SCC_A /* Load mac_sccbase only if needed */
|
|
- movel %pc@(L(mac_sccbase)),%a1
|
|
-#endif /* MAC_USE_SCC_A */
|
|
4: btst #2,%a1@(mac_scc_cha_b_ctrl_offset)
|
|
jeq 4b
|
|
moveb %d0,%a1@(mac_scc_cha_b_data_offset)
|
|
diff --git a/arch/x86/um/sys_call_table_32.c b/arch/x86/um/sys_call_table_32.c
|
|
index 416bd40..68d1dc9 100644
|
|
--- a/arch/x86/um/sys_call_table_32.c
|
|
+++ b/arch/x86/um/sys_call_table_32.c
|
|
@@ -39,9 +39,9 @@
|
|
#undef __SYSCALL_I386
|
|
#define __SYSCALL_I386(nr, sym, compat) [ nr ] = sym,
|
|
|
|
-typedef void (*sys_call_ptr_t)(void);
|
|
+typedef asmlinkage void (*sys_call_ptr_t)(void);
|
|
|
|
-extern void sys_ni_syscall(void);
|
|
+extern asmlinkage void sys_ni_syscall(void);
|
|
|
|
const sys_call_ptr_t sys_call_table[] __cacheline_aligned = {
|
|
/*
|
|
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
|
|
index f67fc41..af58f9b 100644
|
|
--- a/drivers/ata/ata_piix.c
|
|
+++ b/drivers/ata/ata_piix.c
|
|
@@ -151,6 +151,7 @@ enum piix_controller_ids {
|
|
piix_pata_vmw, /* PIIX4 for VMware, spurious DMA_ERR */
|
|
ich8_sata_snb,
|
|
ich8_2port_sata_snb,
|
|
+ ich8_2port_sata_byt,
|
|
};
|
|
|
|
struct piix_map_db {
|
|
@@ -348,6 +349,9 @@ static const struct pci_device_id piix_pci_tbl[] = {
|
|
{ 0x8086, 0x8d60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
|
|
/* SATA Controller IDE (Wellsburg) */
|
|
{ 0x8086, 0x8d68, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
|
|
+ /* SATA Controller IDE (BayTrail) */
|
|
+ { 0x8086, 0x0F20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt },
|
|
+ { 0x8086, 0x0F21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt },
|
|
|
|
{ } /* terminate list */
|
|
};
|
|
@@ -513,6 +517,7 @@ static const struct piix_map_db *piix_map_db_table[] = {
|
|
[tolapai_sata] = &tolapai_map_db,
|
|
[ich8_sata_snb] = &ich8_map_db,
|
|
[ich8_2port_sata_snb] = &ich8_2port_map_db,
|
|
+ [ich8_2port_sata_byt] = &ich8_2port_map_db,
|
|
};
|
|
|
|
static struct ata_port_info piix_port_info[] = {
|
|
@@ -663,6 +668,16 @@ static struct ata_port_info piix_port_info[] = {
|
|
.udma_mask = ATA_UDMA6,
|
|
.port_ops = &piix_sata_ops,
|
|
},
|
|
+
|
|
+ [ich8_2port_sata_byt] =
|
|
+ {
|
|
+ .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR | PIIX_FLAG_PIO16,
|
|
+ .pio_mask = ATA_PIO4,
|
|
+ .mwdma_mask = ATA_MWDMA2,
|
|
+ .udma_mask = ATA_UDMA6,
|
|
+ .port_ops = &piix_sata_ops,
|
|
+ },
|
|
+
|
|
};
|
|
|
|
static struct pci_bits piix_enable_bits[] = {
|
|
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
|
|
index 02dd34c..9cf09ae 100644
|
|
--- a/drivers/ata/libata-core.c
|
|
+++ b/drivers/ata/libata-core.c
|
|
@@ -1599,6 +1599,12 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
|
|
qc->tf = *tf;
|
|
if (cdb)
|
|
memcpy(qc->cdb, cdb, ATAPI_CDB_LEN);
|
|
+
|
|
+ /* some SATA bridges need us to indicate data xfer direction */
|
|
+ if (tf->protocol == ATAPI_PROT_DMA && (dev->flags & ATA_DFLAG_DMADIR) &&
|
|
+ dma_dir == DMA_FROM_DEVICE)
|
|
+ qc->tf.feature |= ATAPI_DMADIR;
|
|
+
|
|
qc->flags |= ATA_QCFLAG_RESULT_TF;
|
|
qc->dma_dir = dma_dir;
|
|
if (dma_dir != DMA_NONE) {
|
|
diff --git a/drivers/block/brd.c b/drivers/block/brd.c
|
|
index 531ceb3..4e8213a 100644
|
|
--- a/drivers/block/brd.c
|
|
+++ b/drivers/block/brd.c
|
|
@@ -117,13 +117,13 @@ static struct page *brd_insert_page(struct brd_device *brd, sector_t sector)
|
|
|
|
spin_lock(&brd->brd_lock);
|
|
idx = sector >> PAGE_SECTORS_SHIFT;
|
|
+ page->index = idx;
|
|
if (radix_tree_insert(&brd->brd_pages, idx, page)) {
|
|
__free_page(page);
|
|
page = radix_tree_lookup(&brd->brd_pages, idx);
|
|
BUG_ON(!page);
|
|
BUG_ON(page->index != idx);
|
|
- } else
|
|
- page->index = idx;
|
|
+ }
|
|
spin_unlock(&brd->brd_lock);
|
|
|
|
radix_tree_preload_end();
|
|
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
|
|
index 68c89db..1209f15 100644
|
|
--- a/drivers/gpu/drm/radeon/radeon_device.c
|
|
+++ b/drivers/gpu/drm/radeon/radeon_device.c
|
|
@@ -363,18 +363,17 @@ bool radeon_card_posted(struct radeon_device *rdev)
|
|
return false;
|
|
|
|
/* first check CRTCs */
|
|
- if (ASIC_IS_DCE41(rdev)) {
|
|
+ if (ASIC_IS_DCE4(rdev)) {
|
|
reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) |
|
|
RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET);
|
|
- if (reg & EVERGREEN_CRTC_MASTER_EN)
|
|
- return true;
|
|
- } else if (ASIC_IS_DCE4(rdev)) {
|
|
- reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) |
|
|
- RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) |
|
|
- RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) |
|
|
- RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET) |
|
|
- RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET) |
|
|
- RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);
|
|
+ if (rdev->num_crtc >= 4) {
|
|
+ reg |= RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) |
|
|
+ RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET);
|
|
+ }
|
|
+ if (rdev->num_crtc >= 6) {
|
|
+ reg |= RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET) |
|
|
+ RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);
|
|
+ }
|
|
if (reg & EVERGREEN_CRTC_MASTER_EN)
|
|
return true;
|
|
} else if (ASIC_IS_AVIVO(rdev)) {
|
|
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
|
|
index 0569843..99a8444 100644
|
|
--- a/drivers/iommu/amd_iommu.c
|
|
+++ b/drivers/iommu/amd_iommu.c
|
|
@@ -531,11 +531,23 @@ retry:
|
|
|
|
static void iommu_poll_events(struct amd_iommu *iommu)
|
|
{
|
|
- u32 head, tail;
|
|
+ u32 head, tail, status;
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&iommu->lock, flags);
|
|
|
|
+ /* enable event interrupts again */
|
|
+ do {
|
|
+ /*
|
|
+ * Workaround for Erratum ERBT1312
|
|
+ * Clearing the EVT_INT bit may race in the hardware, so read
|
|
+ * it again and make sure it was really cleared
|
|
+ */
|
|
+ status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET);
|
|
+ writel(MMIO_STATUS_EVT_INT_MASK,
|
|
+ iommu->mmio_base + MMIO_STATUS_OFFSET);
|
|
+ } while (status & MMIO_STATUS_EVT_INT_MASK);
|
|
+
|
|
head = readl(iommu->mmio_base + MMIO_EVT_HEAD_OFFSET);
|
|
tail = readl(iommu->mmio_base + MMIO_EVT_TAIL_OFFSET);
|
|
|
|
@@ -572,16 +584,25 @@ static void iommu_handle_ppr_entry(struct amd_iommu *iommu, u64 *raw)
|
|
static void iommu_poll_ppr_log(struct amd_iommu *iommu)
|
|
{
|
|
unsigned long flags;
|
|
- u32 head, tail;
|
|
+ u32 head, tail, status;
|
|
|
|
if (iommu->ppr_log == NULL)
|
|
return;
|
|
|
|
- /* enable ppr interrupts again */
|
|
- writel(MMIO_STATUS_PPR_INT_MASK, iommu->mmio_base + MMIO_STATUS_OFFSET);
|
|
-
|
|
spin_lock_irqsave(&iommu->lock, flags);
|
|
|
|
+ /* enable ppr interrupts again */
|
|
+ do {
|
|
+ /*
|
|
+ * Workaround for Erratum ERBT1312
|
|
+ * Clearing the PPR_INT bit may race in the hardware, so read
|
|
+ * it again and make sure it was really cleared
|
|
+ */
|
|
+ status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET);
|
|
+ writel(MMIO_STATUS_PPR_INT_MASK,
|
|
+ iommu->mmio_base + MMIO_STATUS_OFFSET);
|
|
+ } while (status & MMIO_STATUS_PPR_INT_MASK);
|
|
+
|
|
head = readl(iommu->mmio_base + MMIO_PPR_HEAD_OFFSET);
|
|
tail = readl(iommu->mmio_base + MMIO_PPR_TAIL_OFFSET);
|
|
|
|
diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h
|
|
index 2435555..c4ffacb 100644
|
|
--- a/drivers/iommu/amd_iommu_types.h
|
|
+++ b/drivers/iommu/amd_iommu_types.h
|
|
@@ -99,6 +99,7 @@
|
|
#define PASID_MASK 0x000fffff
|
|
|
|
/* MMIO status bits */
|
|
+#define MMIO_STATUS_EVT_INT_MASK (1 << 1)
|
|
#define MMIO_STATUS_COM_WAIT_INT_MASK (1 << 2)
|
|
#define MMIO_STATUS_PPR_INT_MASK (1 << 6)
|
|
|
|
diff --git a/drivers/leds/leds-ot200.c b/drivers/leds/leds-ot200.c
|
|
index c464682..676e729 100644
|
|
--- a/drivers/leds/leds-ot200.c
|
|
+++ b/drivers/leds/leds-ot200.c
|
|
@@ -47,37 +47,37 @@ static struct ot200_led leds[] = {
|
|
{
|
|
.name = "led_1",
|
|
.port = 0x49,
|
|
- .mask = BIT(7),
|
|
+ .mask = BIT(6),
|
|
},
|
|
{
|
|
.name = "led_2",
|
|
.port = 0x49,
|
|
- .mask = BIT(6),
|
|
+ .mask = BIT(5),
|
|
},
|
|
{
|
|
.name = "led_3",
|
|
.port = 0x49,
|
|
- .mask = BIT(5),
|
|
+ .mask = BIT(4),
|
|
},
|
|
{
|
|
.name = "led_4",
|
|
.port = 0x49,
|
|
- .mask = BIT(4),
|
|
+ .mask = BIT(3),
|
|
},
|
|
{
|
|
.name = "led_5",
|
|
.port = 0x49,
|
|
- .mask = BIT(3),
|
|
+ .mask = BIT(2),
|
|
},
|
|
{
|
|
.name = "led_6",
|
|
.port = 0x49,
|
|
- .mask = BIT(2),
|
|
+ .mask = BIT(1),
|
|
},
|
|
{
|
|
.name = "led_7",
|
|
.port = 0x49,
|
|
- .mask = BIT(1),
|
|
+ .mask = BIT(0),
|
|
}
|
|
};
|
|
|
|
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
|
|
index 2bdf798..0d22cff 100644
|
|
--- a/drivers/net/xen-netback/netback.c
|
|
+++ b/drivers/net/xen-netback/netback.c
|
|
@@ -914,7 +914,6 @@ static int netbk_count_requests(struct xenvif *vif,
|
|
}
|
|
|
|
static struct page *xen_netbk_alloc_page(struct xen_netbk *netbk,
|
|
- struct sk_buff *skb,
|
|
u16 pending_idx)
|
|
{
|
|
struct page *page;
|
|
@@ -948,7 +947,7 @@ static struct gnttab_copy *xen_netbk_get_requests(struct xen_netbk *netbk,
|
|
|
|
index = pending_index(netbk->pending_cons++);
|
|
pending_idx = netbk->pending_ring[index];
|
|
- page = xen_netbk_alloc_page(netbk, skb, pending_idx);
|
|
+ page = xen_netbk_alloc_page(netbk, pending_idx);
|
|
if (!page)
|
|
goto err;
|
|
|
|
@@ -1353,7 +1352,7 @@ static unsigned xen_netbk_tx_build_gops(struct xen_netbk *netbk)
|
|
}
|
|
|
|
/* XXX could copy straight to head */
|
|
- page = xen_netbk_alloc_page(netbk, skb, pending_idx);
|
|
+ page = xen_netbk_alloc_page(netbk, pending_idx);
|
|
if (!page) {
|
|
kfree_skb(skb);
|
|
netbk_tx_err(vif, &txreq, idx);
|
|
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
|
|
index d68c000..f08aee6 100644
|
|
--- a/drivers/platform/x86/thinkpad_acpi.c
|
|
+++ b/drivers/platform/x86/thinkpad_acpi.c
|
|
@@ -8662,6 +8662,13 @@ static int __must_check __init get_thinkpad_model_data(
|
|
tp->model_str = kstrdup(s, GFP_KERNEL);
|
|
if (!tp->model_str)
|
|
return -ENOMEM;
|
|
+ } else {
|
|
+ s = dmi_get_system_info(DMI_BIOS_VENDOR);
|
|
+ if (s && !(strnicmp(s, "Lenovo", 6))) {
|
|
+ tp->model_str = kstrdup(s, GFP_KERNEL);
|
|
+ if (!tp->model_str)
|
|
+ return -ENOMEM;
|
|
+ }
|
|
}
|
|
|
|
s = dmi_get_system_info(DMI_PRODUCT_NAME);
|
|
diff --git a/drivers/staging/vt6656/hostap.c b/drivers/staging/vt6656/hostap.c
|
|
index 51b5adf..df8ea25 100644
|
|
--- a/drivers/staging/vt6656/hostap.c
|
|
+++ b/drivers/staging/vt6656/hostap.c
|
|
@@ -153,7 +153,7 @@ static int hostap_disable_hostapd(PSDevice pDevice, int rtnl_locked)
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%s: Netdevice %s unregistered\n",
|
|
pDevice->dev->name, pDevice->apdev->name);
|
|
}
|
|
- kfree(pDevice->apdev);
|
|
+ free_netdev(pDevice->apdev);
|
|
pDevice->apdev = NULL;
|
|
pDevice->bEnable8021x = FALSE;
|
|
pDevice->bEnableHostWEP = FALSE;
|
|
diff --git a/drivers/target/iscsi/iscsi_target_parameters.c b/drivers/target/iscsi/iscsi_target_parameters.c
|
|
index eb05c9d..8a8ff23 100644
|
|
--- a/drivers/target/iscsi/iscsi_target_parameters.c
|
|
+++ b/drivers/target/iscsi/iscsi_target_parameters.c
|
|
@@ -713,9 +713,9 @@ static int iscsi_add_notunderstood_response(
|
|
}
|
|
INIT_LIST_HEAD(&extra_response->er_list);
|
|
|
|
- strncpy(extra_response->key, key, strlen(key) + 1);
|
|
- strncpy(extra_response->value, NOTUNDERSTOOD,
|
|
- strlen(NOTUNDERSTOOD) + 1);
|
|
+ strlcpy(extra_response->key, key, sizeof(extra_response->key));
|
|
+ strlcpy(extra_response->value, NOTUNDERSTOOD,
|
|
+ sizeof(extra_response->value));
|
|
|
|
list_add_tail(&extra_response->er_list,
|
|
¶m_list->extra_response_list);
|
|
@@ -1571,8 +1571,6 @@ int iscsi_decode_text_input(
|
|
|
|
if (phase & PHASE_SECURITY) {
|
|
if (iscsi_check_for_auth_key(key) > 0) {
|
|
- char *tmpptr = key + strlen(key);
|
|
- *tmpptr = '=';
|
|
kfree(tmpbuf);
|
|
return 1;
|
|
}
|
|
diff --git a/drivers/target/iscsi/iscsi_target_parameters.h b/drivers/target/iscsi/iscsi_target_parameters.h
|
|
index 6a37fd6..83eed65 100644
|
|
--- a/drivers/target/iscsi/iscsi_target_parameters.h
|
|
+++ b/drivers/target/iscsi/iscsi_target_parameters.h
|
|
@@ -1,8 +1,10 @@
|
|
#ifndef ISCSI_PARAMETERS_H
|
|
#define ISCSI_PARAMETERS_H
|
|
|
|
+#include <scsi/iscsi_proto.h>
|
|
+
|
|
struct iscsi_extra_response {
|
|
- char key[64];
|
|
+ char key[KEY_MAXLEN];
|
|
char value[32];
|
|
struct list_head er_list;
|
|
} ____cacheline_aligned;
|
|
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c
|
|
index 2303a02..37818fb 100644
|
|
--- a/drivers/tty/n_tty.c
|
|
+++ b/drivers/tty/n_tty.c
|
|
@@ -1529,6 +1529,14 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
|
|
tty->real_raw = 0;
|
|
}
|
|
n_tty_set_room(tty);
|
|
+ /*
|
|
+ * Fix tty hang when I_IXON(tty) is cleared, but the tty
|
|
+ * been stopped by STOP_CHAR(tty) before it.
|
|
+ */
|
|
+ if (!I_IXON(tty) && old && (old->c_iflag & IXON) && !tty->flow_stopped) {
|
|
+ start_tty(tty);
|
|
+ }
|
|
+
|
|
/* The termios change make the tty ready for I/O */
|
|
wake_up_interruptible(&tty->write_wait);
|
|
wake_up_interruptible(&tty->read_wait);
|
|
diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c
|
|
index 98b89fe..c8dbb97 100644
|
|
--- a/drivers/usb/atm/cxacru.c
|
|
+++ b/drivers/usb/atm/cxacru.c
|
|
@@ -686,7 +686,8 @@ static int cxacru_cm_get_array(struct cxacru_data *instance, enum cxacru_cm_requ
|
|
{
|
|
int ret, len;
|
|
__le32 *buf;
|
|
- int offb, offd;
|
|
+ int offb;
|
|
+ unsigned int offd;
|
|
const int stride = CMD_PACKET_SIZE / (4 * 2) - 1;
|
|
int buflen = ((size - 1) / stride + 1 + size * 2) * 4;
|
|
|
|
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
|
|
index 8b2a9d8..f88ad63 100644
|
|
--- a/drivers/usb/core/quirks.c
|
|
+++ b/drivers/usb/core/quirks.c
|
|
@@ -110,6 +110,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|
/* Edirol SD-20 */
|
|
{ USB_DEVICE(0x0582, 0x0027), .driver_info = USB_QUIRK_RESET_RESUME },
|
|
|
|
+ /* Alcor Micro Corp. Hub */
|
|
+ { USB_DEVICE(0x058f, 0x9254), .driver_info = USB_QUIRK_RESET_RESUME },
|
|
+
|
|
/* appletouch */
|
|
{ USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME },
|
|
|
|
diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c
|
|
index 768d542..c994655 100644
|
|
--- a/drivers/usb/host/uhci-hub.c
|
|
+++ b/drivers/usb/host/uhci-hub.c
|
|
@@ -222,7 +222,8 @@ static int uhci_hub_status_data(struct usb_hcd *hcd, char *buf)
|
|
/* auto-stop if nothing connected for 1 second */
|
|
if (any_ports_active(uhci))
|
|
uhci->rh_state = UHCI_RH_RUNNING;
|
|
- else if (time_after_eq(jiffies, uhci->auto_stop_time))
|
|
+ else if (time_after_eq(jiffies, uhci->auto_stop_time) &&
|
|
+ !uhci->wait_for_hp)
|
|
suspend_rh(uhci, UHCI_RH_AUTO_STOPPED);
|
|
break;
|
|
|
|
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
|
|
index b42a6fb..f059222 100644
|
|
--- a/drivers/usb/host/xhci-mem.c
|
|
+++ b/drivers/usb/host/xhci-mem.c
|
|
@@ -1443,15 +1443,17 @@ int xhci_endpoint_init(struct xhci_hcd *xhci,
|
|
ep_ctx->ep_info2 |= cpu_to_le32(xhci_get_endpoint_type(udev, ep));
|
|
|
|
/* Set the max packet size and max burst */
|
|
+ max_packet = GET_MAX_PACKET(usb_endpoint_maxp(&ep->desc));
|
|
+ max_burst = 0;
|
|
switch (udev->speed) {
|
|
case USB_SPEED_SUPER:
|
|
- max_packet = usb_endpoint_maxp(&ep->desc);
|
|
- ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet));
|
|
/* dig out max burst from ep companion desc */
|
|
- max_packet = ep->ss_ep_comp.bMaxBurst;
|
|
- ep_ctx->ep_info2 |= cpu_to_le32(MAX_BURST(max_packet));
|
|
+ max_burst = ep->ss_ep_comp.bMaxBurst;
|
|
break;
|
|
case USB_SPEED_HIGH:
|
|
+ /* Some devices get this wrong */
|
|
+ if (usb_endpoint_xfer_bulk(&ep->desc))
|
|
+ max_packet = 512;
|
|
/* bits 11:12 specify the number of additional transaction
|
|
* opportunities per microframe (USB 2.0, section 9.6.6)
|
|
*/
|
|
@@ -1459,17 +1461,16 @@ int xhci_endpoint_init(struct xhci_hcd *xhci,
|
|
usb_endpoint_xfer_int(&ep->desc)) {
|
|
max_burst = (usb_endpoint_maxp(&ep->desc)
|
|
& 0x1800) >> 11;
|
|
- ep_ctx->ep_info2 |= cpu_to_le32(MAX_BURST(max_burst));
|
|
}
|
|
- /* Fall through */
|
|
+ break;
|
|
case USB_SPEED_FULL:
|
|
case USB_SPEED_LOW:
|
|
- max_packet = GET_MAX_PACKET(usb_endpoint_maxp(&ep->desc));
|
|
- ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet));
|
|
break;
|
|
default:
|
|
BUG();
|
|
}
|
|
+ ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet) |
|
|
+ MAX_BURST(max_burst));
|
|
max_esit_payload = xhci_get_max_esit_payload(xhci, udev, ep);
|
|
ep_ctx->tx_info = cpu_to_le32(MAX_ESIT_PAYLOAD_FOR_EP(max_esit_payload));
|
|
|
|
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
|
|
index e5ccafc..c6f8e62 100644
|
|
--- a/drivers/usb/serial/ftdi_sio.c
|
|
+++ b/drivers/usb/serial/ftdi_sio.c
|
|
@@ -199,6 +199,8 @@ static struct usb_device_id id_table_combined [] = {
|
|
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) },
|
|
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_BOOST_PID) },
|
|
{ USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) },
|
|
+ { USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_CC_PID) },
|
|
+ { USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_AGP_PID) },
|
|
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
|
|
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
|
|
{ USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
|
|
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
|
|
index 9852827..6dd7925 100644
|
|
--- a/drivers/usb/serial/ftdi_sio_ids.h
|
|
+++ b/drivers/usb/serial/ftdi_sio_ids.h
|
|
@@ -772,6 +772,8 @@
|
|
*/
|
|
#define NEWPORT_VID 0x104D
|
|
#define NEWPORT_AGILIS_PID 0x3000
|
|
+#define NEWPORT_CONEX_CC_PID 0x3002
|
|
+#define NEWPORT_CONEX_AGP_PID 0x3006
|
|
|
|
/* Interbiometrics USB I/O Board */
|
|
/* Developed for Interbiometrics by Rudolf Gugler */
|
|
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c
|
|
index 7e8bb8f..b68efdc 100644
|
|
--- a/drivers/usb/serial/io_ti.c
|
|
+++ b/drivers/usb/serial/io_ti.c
|
|
@@ -550,6 +550,9 @@ static void chase_port(struct edgeport_port *port, unsigned long timeout,
|
|
wait_queue_t wait;
|
|
unsigned long flags;
|
|
|
|
+ if (!tty)
|
|
+ return;
|
|
+
|
|
if (!timeout)
|
|
timeout = (HZ * EDGE_CLOSING_WAIT)/100;
|
|
|
|
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
|
|
index 16efe0a..386b3ab 100644
|
|
--- a/drivers/usb/serial/option.c
|
|
+++ b/drivers/usb/serial/option.c
|
|
@@ -196,6 +196,7 @@ static void option_instat_callback(struct urb *urb);
|
|
|
|
#define DELL_PRODUCT_5800_MINICARD_VZW 0x8195 /* Novatel E362 */
|
|
#define DELL_PRODUCT_5800_V2_MINICARD_VZW 0x8196 /* Novatel E362 */
|
|
+#define DELL_PRODUCT_5804_MINICARD_ATT 0x819b /* Novatel E371 */
|
|
|
|
#define KYOCERA_VENDOR_ID 0x0c88
|
|
#define KYOCERA_PRODUCT_KPC650 0x17da
|
|
@@ -341,8 +342,8 @@ static void option_instat_callback(struct urb *urb);
|
|
#define CINTERION_PRODUCT_EU3_E 0x0051
|
|
#define CINTERION_PRODUCT_EU3_P 0x0052
|
|
#define CINTERION_PRODUCT_PH8 0x0053
|
|
-#define CINTERION_PRODUCT_AH6 0x0055
|
|
-#define CINTERION_PRODUCT_PLS8 0x0060
|
|
+#define CINTERION_PRODUCT_AHXX 0x0055
|
|
+#define CINTERION_PRODUCT_PLXX 0x0060
|
|
|
|
/* Olivetti products */
|
|
#define OLIVETTI_VENDOR_ID 0x0b3c
|
|
@@ -771,6 +772,7 @@ static const struct usb_device_id option_ids[] = {
|
|
{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, DELL_PRODUCT_5800_MINICARD_VZW, 0xff, 0xff, 0xff) },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, DELL_PRODUCT_5800_V2_MINICARD_VZW, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, DELL_PRODUCT_5804_MINICARD_ATT, 0xff, 0xff, 0xff) },
|
|
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */
|
|
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
|
|
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
|
|
@@ -966,6 +968,8 @@ static const struct usb_device_id option_ids[] = {
|
|
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0330, 0xff, 0xff, 0xff) },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0395, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0412, 0xff, 0xff, 0xff), /* Telewell TW-LTE 4G */
|
|
+ .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0414, 0xff, 0xff, 0xff) },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0417, 0xff, 0xff, 0xff) },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff),
|
|
@@ -1264,8 +1268,9 @@ static const struct usb_device_id option_ids[] = {
|
|
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) },
|
|
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) },
|
|
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8) },
|
|
- { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AH6) },
|
|
- { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLS8) },
|
|
+ { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AHXX) },
|
|
+ { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLXX),
|
|
+ .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
|
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) },
|
|
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) },
|
|
{ USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDM) },
|
|
diff --git a/drivers/xen/events.c b/drivers/xen/events.c
|
|
index 26c47a4..417c133 100644
|
|
--- a/drivers/xen/events.c
|
|
+++ b/drivers/xen/events.c
|
|
@@ -1258,7 +1258,7 @@ static void __xen_evtchn_do_upcall(void)
|
|
{
|
|
int start_word_idx, start_bit_idx;
|
|
int word_idx, bit_idx;
|
|
- int i;
|
|
+ int i, irq;
|
|
int cpu = get_cpu();
|
|
struct shared_info *s = HYPERVISOR_shared_info;
|
|
struct vcpu_info *vcpu_info = __this_cpu_read(xen_vcpu);
|
|
@@ -1266,6 +1266,8 @@ static void __xen_evtchn_do_upcall(void)
|
|
|
|
do {
|
|
unsigned long pending_words;
|
|
+ unsigned long pending_bits;
|
|
+ struct irq_desc *desc;
|
|
|
|
vcpu_info->evtchn_upcall_pending = 0;
|
|
|
|
@@ -1276,6 +1278,17 @@ static void __xen_evtchn_do_upcall(void)
|
|
/* Clear master flag /before/ clearing selector flag. */
|
|
wmb();
|
|
#endif
|
|
+ if ((irq = per_cpu(virq_to_irq, cpu)[VIRQ_TIMER]) != -1) {
|
|
+ int evtchn = evtchn_from_irq(irq);
|
|
+ word_idx = evtchn / BITS_PER_LONG;
|
|
+ pending_bits = evtchn % BITS_PER_LONG;
|
|
+ if (active_evtchns(cpu, s, word_idx) & (1ULL << pending_bits)) {
|
|
+ desc = irq_to_desc(irq);
|
|
+ if (desc)
|
|
+ generic_handle_irq_desc(irq, desc);
|
|
+ }
|
|
+ }
|
|
+
|
|
pending_words = xchg(&vcpu_info->evtchn_pending_sel, 0);
|
|
|
|
start_word_idx = __this_cpu_read(current_word_idx);
|
|
@@ -1284,7 +1297,6 @@ static void __xen_evtchn_do_upcall(void)
|
|
word_idx = start_word_idx;
|
|
|
|
for (i = 0; pending_words != 0; i++) {
|
|
- unsigned long pending_bits;
|
|
unsigned long words;
|
|
|
|
words = MASK_LSBS(pending_words, word_idx);
|
|
@@ -1313,8 +1325,7 @@ static void __xen_evtchn_do_upcall(void)
|
|
|
|
do {
|
|
unsigned long bits;
|
|
- int port, irq;
|
|
- struct irq_desc *desc;
|
|
+ int port;
|
|
|
|
bits = MASK_LSBS(pending_bits, bit_idx);
|
|
|
|
diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c
|
|
index 2263144..d0e5fc5 100644
|
|
--- a/fs/cifs/cifs_dfs_ref.c
|
|
+++ b/fs/cifs/cifs_dfs_ref.c
|
|
@@ -18,6 +18,7 @@
|
|
#include <linux/slab.h>
|
|
#include <linux/vfs.h>
|
|
#include <linux/fs.h>
|
|
+#include <linux/inet.h>
|
|
#include "cifsglob.h"
|
|
#include "cifsproto.h"
|
|
#include "cifsfs.h"
|
|
@@ -150,7 +151,8 @@ char *cifs_compose_mount_options(const char *sb_mountdata,
|
|
* assuming that we have 'unc=' and 'ip=' in
|
|
* the original sb_mountdata
|
|
*/
|
|
- md_len = strlen(sb_mountdata) + rc + strlen(ref->node_name) + 12;
|
|
+ md_len = strlen(sb_mountdata) + rc + strlen(ref->node_name) + 12 +
|
|
+ INET6_ADDRSTRLEN;
|
|
mountdata = kzalloc(md_len+1, GFP_KERNEL);
|
|
if (mountdata == NULL) {
|
|
rc = -ENOMEM;
|
|
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
|
|
index 745da3d..6fbfbdb 100644
|
|
--- a/fs/cifs/inode.c
|
|
+++ b/fs/cifs/inode.c
|
|
@@ -173,7 +173,8 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
|
|
|
|
if (fattr->cf_flags & CIFS_FATTR_DFS_REFERRAL)
|
|
inode->i_flags |= S_AUTOMOUNT;
|
|
- cifs_set_ops(inode);
|
|
+ if (inode->i_state & I_NEW)
|
|
+ cifs_set_ops(inode);
|
|
}
|
|
|
|
void
|
|
diff --git a/fs/fat/inode.c b/fs/fat/inode.c
|
|
index 21687e3..44ae375 100644
|
|
--- a/fs/fat/inode.c
|
|
+++ b/fs/fat/inode.c
|
|
@@ -1237,6 +1237,19 @@ static int fat_read_root(struct inode *inode)
|
|
return 0;
|
|
}
|
|
|
|
+static unsigned long calc_fat_clusters(struct super_block *sb)
|
|
+{
|
|
+ struct msdos_sb_info *sbi = MSDOS_SB(sb);
|
|
+
|
|
+ /* Divide first to avoid overflow */
|
|
+ if (sbi->fat_bits != 12) {
|
|
+ unsigned long ent_per_sec = sb->s_blocksize * 8 / sbi->fat_bits;
|
|
+ return ent_per_sec * sbi->fat_length;
|
|
+ }
|
|
+
|
|
+ return sbi->fat_length * sb->s_blocksize * 8 / sbi->fat_bits;
|
|
+}
|
|
+
|
|
/*
|
|
* Read the super block of an MS-DOS FS.
|
|
*/
|
|
@@ -1433,7 +1446,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
|
|
sbi->fat_bits = (total_clusters > MAX_FAT12) ? 16 : 12;
|
|
|
|
/* check that FAT table does not overflow */
|
|
- fat_clusters = sbi->fat_length * sb->s_blocksize * 8 / sbi->fat_bits;
|
|
+ fat_clusters = calc_fat_clusters(sb);
|
|
total_clusters = min(total_clusters, fat_clusters - FAT_START_ENT);
|
|
if (total_clusters > MAX_FAT(sb)) {
|
|
if (!silent)
|
|
diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c
|
|
index 77b69b2..13fc885 100644
|
|
--- a/fs/jfs/inode.c
|
|
+++ b/fs/jfs/inode.c
|
|
@@ -125,7 +125,7 @@ int jfs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
|
{
|
|
int wait = wbc->sync_mode == WB_SYNC_ALL;
|
|
|
|
- if (test_cflag(COMMIT_Nolink, inode))
|
|
+ if (inode->i_nlink == 0)
|
|
return 0;
|
|
/*
|
|
* If COMMIT_DIRTY is not set, the inode isn't really dirty.
|
|
diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c
|
|
index 2eb952c..cbe48ea 100644
|
|
--- a/fs/jfs/jfs_logmgr.c
|
|
+++ b/fs/jfs/jfs_logmgr.c
|
|
@@ -1058,7 +1058,8 @@ static int lmLogSync(struct jfs_log * log, int hard_sync)
|
|
*/
|
|
void jfs_syncpt(struct jfs_log *log, int hard_sync)
|
|
{ LOG_LOCK(log);
|
|
- lmLogSync(log, hard_sync);
|
|
+ if (!test_bit(log_QUIESCE, &log->flag))
|
|
+ lmLogSync(log, hard_sync);
|
|
LOG_UNLOCK(log);
|
|
}
|
|
|
|
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
|
|
index 04f449c..d121c67 100644
|
|
--- a/fs/nfs/nfs4proc.c
|
|
+++ b/fs/nfs/nfs4proc.c
|
|
@@ -1053,7 +1053,7 @@ static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata)
|
|
struct nfs4_state *state = opendata->state;
|
|
struct nfs_inode *nfsi = NFS_I(state->inode);
|
|
struct nfs_delegation *delegation;
|
|
- int open_mode = opendata->o_arg.open_flags & (O_EXCL|O_TRUNC);
|
|
+ int open_mode = opendata->o_arg.open_flags;
|
|
fmode_t fmode = opendata->o_arg.fmode;
|
|
nfs4_stateid stateid;
|
|
int ret = -EAGAIN;
|
|
diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c
|
|
index 8f7b95a..aa526be 100644
|
|
--- a/fs/nilfs2/inode.c
|
|
+++ b/fs/nilfs2/inode.c
|
|
@@ -195,13 +195,32 @@ static int nilfs_writepage(struct page *page, struct writeback_control *wbc)
|
|
|
|
static int nilfs_set_page_dirty(struct page *page)
|
|
{
|
|
- int ret = __set_page_dirty_buffers(page);
|
|
+ int ret = __set_page_dirty_nobuffers(page);
|
|
|
|
- if (ret) {
|
|
+ if (page_has_buffers(page)) {
|
|
struct inode *inode = page->mapping->host;
|
|
- unsigned nr_dirty = 1 << (PAGE_SHIFT - inode->i_blkbits);
|
|
+ unsigned nr_dirty = 0;
|
|
+ struct buffer_head *bh, *head;
|
|
|
|
- nilfs_set_file_dirty(inode, nr_dirty);
|
|
+ /*
|
|
+ * This page is locked by callers, and no other thread
|
|
+ * concurrently marks its buffers dirty since they are
|
|
+ * only dirtied through routines in fs/buffer.c in
|
|
+ * which call sites of mark_buffer_dirty are protected
|
|
+ * by page lock.
|
|
+ */
|
|
+ bh = head = page_buffers(page);
|
|
+ do {
|
|
+ /* Do not mark hole blocks dirty */
|
|
+ if (buffer_dirty(bh) || !buffer_mapped(bh))
|
|
+ continue;
|
|
+
|
|
+ set_buffer_dirty(bh);
|
|
+ nr_dirty++;
|
|
+ } while (bh = bh->b_this_page, bh != head);
|
|
+
|
|
+ if (nr_dirty)
|
|
+ nilfs_set_file_dirty(inode, nr_dirty);
|
|
}
|
|
return ret;
|
|
}
|
|
diff --git a/fs/ocfs2/extent_map.c b/fs/ocfs2/extent_map.c
|
|
index 2f5b92e..7eb1c0c 100644
|
|
--- a/fs/ocfs2/extent_map.c
|
|
+++ b/fs/ocfs2/extent_map.c
|
|
@@ -791,7 +791,7 @@ int ocfs2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
|
&hole_size, &rec, &is_last);
|
|
if (ret) {
|
|
mlog_errno(ret);
|
|
- goto out;
|
|
+ goto out_unlock;
|
|
}
|
|
|
|
if (rec.e_blkno == 0ULL) {
|
|
diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c
|
|
index 3011b87..23c79ca 100644
|
|
--- a/fs/xfs/xfs_iops.c
|
|
+++ b/fs/xfs/xfs_iops.c
|
|
@@ -457,6 +457,28 @@ xfs_vn_getattr(
|
|
return 0;
|
|
}
|
|
|
|
+static void
|
|
+xfs_setattr_mode(
|
|
+ struct xfs_trans *tp,
|
|
+ struct xfs_inode *ip,
|
|
+ struct iattr *iattr)
|
|
+{
|
|
+ struct inode *inode = VFS_I(ip);
|
|
+ umode_t mode = iattr->ia_mode;
|
|
+
|
|
+ ASSERT(tp);
|
|
+ ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
|
|
+
|
|
+ if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
|
|
+ mode &= ~S_ISGID;
|
|
+
|
|
+ ip->i_d.di_mode &= S_IFMT;
|
|
+ ip->i_d.di_mode |= mode & ~S_IFMT;
|
|
+
|
|
+ inode->i_mode &= S_IFMT;
|
|
+ inode->i_mode |= mode & ~S_IFMT;
|
|
+}
|
|
+
|
|
int
|
|
xfs_setattr_nonsize(
|
|
struct xfs_inode *ip,
|
|
@@ -608,18 +630,8 @@ xfs_setattr_nonsize(
|
|
/*
|
|
* Change file access modes.
|
|
*/
|
|
- if (mask & ATTR_MODE) {
|
|
- umode_t mode = iattr->ia_mode;
|
|
-
|
|
- if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
|
|
- mode &= ~S_ISGID;
|
|
-
|
|
- ip->i_d.di_mode &= S_IFMT;
|
|
- ip->i_d.di_mode |= mode & ~S_IFMT;
|
|
-
|
|
- inode->i_mode &= S_IFMT;
|
|
- inode->i_mode |= mode & ~S_IFMT;
|
|
- }
|
|
+ if (mask & ATTR_MODE)
|
|
+ xfs_setattr_mode(tp, ip, iattr);
|
|
|
|
/*
|
|
* Change file access or modified times.
|
|
@@ -716,9 +728,8 @@ xfs_setattr_size(
|
|
return XFS_ERROR(error);
|
|
|
|
ASSERT(S_ISREG(ip->i_d.di_mode));
|
|
- ASSERT((mask & (ATTR_MODE|ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_ATIME_SET|
|
|
- ATTR_MTIME_SET|ATTR_KILL_SUID|ATTR_KILL_SGID|
|
|
- ATTR_KILL_PRIV|ATTR_TIMES_SET)) == 0);
|
|
+ ASSERT((mask & (ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_ATIME_SET|
|
|
+ ATTR_MTIME_SET|ATTR_KILL_PRIV|ATTR_TIMES_SET)) == 0);
|
|
|
|
lock_flags = XFS_ILOCK_EXCL;
|
|
if (!(flags & XFS_ATTR_NOLOCK))
|
|
@@ -861,6 +872,12 @@ xfs_setattr_size(
|
|
xfs_iflags_set(ip, XFS_ITRUNCATED);
|
|
}
|
|
|
|
+ /*
|
|
+ * Change file access modes.
|
|
+ */
|
|
+ if (mask & ATTR_MODE)
|
|
+ xfs_setattr_mode(tp, ip, iattr);
|
|
+
|
|
if (mask & ATTR_CTIME) {
|
|
inode->i_ctime = iattr->ia_ctime;
|
|
ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec;
|
|
diff --git a/include/linux/wait.h b/include/linux/wait.h
|
|
index 1dee81c..6c6c20e 100644
|
|
--- a/include/linux/wait.h
|
|
+++ b/include/linux/wait.h
|
|
@@ -233,6 +233,8 @@ do { \
|
|
if (!ret) \
|
|
break; \
|
|
} \
|
|
+ if (!ret && (condition)) \
|
|
+ ret = 1; \
|
|
finish_wait(&wq, &__wait); \
|
|
} while (0)
|
|
|
|
@@ -249,8 +251,9 @@ do { \
|
|
* wake_up() has to be called after changing any variable that could
|
|
* change the result of the wait condition.
|
|
*
|
|
- * The function returns 0 if the @timeout elapsed, and the remaining
|
|
- * jiffies if the condition evaluated to true before the timeout elapsed.
|
|
+ * The function returns 0 if the @timeout elapsed, or the remaining
|
|
+ * jiffies (at least 1) if the @condition evaluated to %true before
|
|
+ * the @timeout elapsed.
|
|
*/
|
|
#define wait_event_timeout(wq, condition, timeout) \
|
|
({ \
|
|
@@ -318,6 +321,8 @@ do { \
|
|
ret = -ERESTARTSYS; \
|
|
break; \
|
|
} \
|
|
+ if (!ret && (condition)) \
|
|
+ ret = 1; \
|
|
finish_wait(&wq, &__wait); \
|
|
} while (0)
|
|
|
|
@@ -334,9 +339,10 @@ do { \
|
|
* wake_up() has to be called after changing any variable that could
|
|
* change the result of the wait condition.
|
|
*
|
|
- * The function returns 0 if the @timeout elapsed, -ERESTARTSYS if it
|
|
- * was interrupted by a signal, and the remaining jiffies otherwise
|
|
- * if the condition evaluated to true before the timeout elapsed.
|
|
+ * Returns:
|
|
+ * 0 if the @timeout elapsed, -%ERESTARTSYS if it was interrupted by
|
|
+ * a signal, or the remaining jiffies (at least 1) if the @condition
|
|
+ * evaluated to %true before the @timeout elapsed.
|
|
*/
|
|
#define wait_event_interruptible_timeout(wq, condition, timeout) \
|
|
({ \
|
|
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
|
|
index caf15b6..ef99c15 100644
|
|
--- a/mm/huge_memory.c
|
|
+++ b/mm/huge_memory.c
|
|
@@ -1949,7 +1949,12 @@ static void collapse_huge_page(struct mm_struct *mm,
|
|
pte_unmap(pte);
|
|
spin_lock(&mm->page_table_lock);
|
|
BUG_ON(!pmd_none(*pmd));
|
|
- set_pmd_at(mm, address, pmd, _pmd);
|
|
+ /*
|
|
+ * We can only use set_pmd_at when establishing
|
|
+ * hugepmds and never for establishing regular pmds that
|
|
+ * points to regular pagetables. Use pmd_populate for that
|
|
+ */
|
|
+ pmd_populate(mm, pmd, pmd_pgtable(_pmd));
|
|
spin_unlock(&mm->page_table_lock);
|
|
anon_vma_unlock(vma->anon_vma);
|
|
goto out;
|
|
diff --git a/mm/migrate.c b/mm/migrate.c
|
|
index 1107238..37cd07b 100644
|
|
--- a/mm/migrate.c
|
|
+++ b/mm/migrate.c
|
|
@@ -145,7 +145,7 @@ static int remove_migration_pte(struct page *new, struct vm_area_struct *vma,
|
|
if (PageHuge(new))
|
|
pte = pte_mkhuge(pte);
|
|
#endif
|
|
- flush_cache_page(vma, addr, pte_pfn(pte));
|
|
+ flush_dcache_page(new);
|
|
set_pte_at(mm, addr, ptep, pte);
|
|
|
|
if (PageHuge(new)) {
|
|
diff --git a/mm/mmu_notifier.c b/mm/mmu_notifier.c
|
|
index 8d1ca2d..c1f947b 100644
|
|
--- a/mm/mmu_notifier.c
|
|
+++ b/mm/mmu_notifier.c
|
|
@@ -37,51 +37,48 @@ static struct srcu_struct srcu;
|
|
void __mmu_notifier_release(struct mm_struct *mm)
|
|
{
|
|
struct mmu_notifier *mn;
|
|
+ struct hlist_node *node;
|
|
int id;
|
|
|
|
/*
|
|
- * srcu_read_lock() here will block synchronize_srcu() in
|
|
- * mmu_notifier_unregister() until all registered
|
|
- * ->release() callouts this function makes have
|
|
- * returned.
|
|
+ * SRCU here will block mmu_notifier_unregister until
|
|
+ * ->release returns.
|
|
*/
|
|
id = srcu_read_lock(&srcu);
|
|
+ hlist_for_each_entry_rcu(mn, node, &mm->mmu_notifier_mm->list, hlist)
|
|
+ /*
|
|
+ * If ->release runs before mmu_notifier_unregister it must be
|
|
+ * handled, as it's the only way for the driver to flush all
|
|
+ * existing sptes and stop the driver from establishing any more
|
|
+ * sptes before all the pages in the mm are freed.
|
|
+ */
|
|
+ if (mn->ops->release)
|
|
+ mn->ops->release(mn, mm);
|
|
+ srcu_read_unlock(&srcu, id);
|
|
+
|
|
spin_lock(&mm->mmu_notifier_mm->lock);
|
|
while (unlikely(!hlist_empty(&mm->mmu_notifier_mm->list))) {
|
|
mn = hlist_entry(mm->mmu_notifier_mm->list.first,
|
|
struct mmu_notifier,
|
|
hlist);
|
|
-
|
|
/*
|
|
- * Unlink. This will prevent mmu_notifier_unregister()
|
|
- * from also making the ->release() callout.
|
|
+ * We arrived before mmu_notifier_unregister so
|
|
+ * mmu_notifier_unregister will do nothing other than to wait
|
|
+ * for ->release to finish and for mmu_notifier_unregister to
|
|
+ * return.
|
|
*/
|
|
hlist_del_init_rcu(&mn->hlist);
|
|
- spin_unlock(&mm->mmu_notifier_mm->lock);
|
|
-
|
|
- /*
|
|
- * Clear sptes. (see 'release' description in mmu_notifier.h)
|
|
- */
|
|
- if (mn->ops->release)
|
|
- mn->ops->release(mn, mm);
|
|
-
|
|
- spin_lock(&mm->mmu_notifier_mm->lock);
|
|
}
|
|
spin_unlock(&mm->mmu_notifier_mm->lock);
|
|
|
|
/*
|
|
- * All callouts to ->release() which we have done are complete.
|
|
- * Allow synchronize_srcu() in mmu_notifier_unregister() to complete
|
|
- */
|
|
- srcu_read_unlock(&srcu, id);
|
|
-
|
|
- /*
|
|
- * mmu_notifier_unregister() may have unlinked a notifier and may
|
|
- * still be calling out to it. Additionally, other notifiers
|
|
- * may have been active via vmtruncate() et. al. Block here
|
|
- * to ensure that all notifier callouts for this mm have been
|
|
- * completed and the sptes are really cleaned up before returning
|
|
- * to exit_mmap().
|
|
+ * synchronize_srcu here prevents mmu_notifier_release from returning to
|
|
+ * exit_mmap (which would proceed with freeing all pages in the mm)
|
|
+ * until the ->release method returns, if it was invoked by
|
|
+ * mmu_notifier_unregister.
|
|
+ *
|
|
+ * The mmu_notifier_mm can't go away from under us because one mm_count
|
|
+ * is held by exit_mmap.
|
|
*/
|
|
synchronize_srcu(&srcu);
|
|
}
|
|
@@ -302,31 +299,34 @@ void mmu_notifier_unregister(struct mmu_notifier *mn, struct mm_struct *mm)
|
|
{
|
|
BUG_ON(atomic_read(&mm->mm_count) <= 0);
|
|
|
|
- spin_lock(&mm->mmu_notifier_mm->lock);
|
|
if (!hlist_unhashed(&mn->hlist)) {
|
|
+ /*
|
|
+ * SRCU here will force exit_mmap to wait for ->release to
|
|
+ * finish before freeing the pages.
|
|
+ */
|
|
int id;
|
|
|
|
+ id = srcu_read_lock(&srcu);
|
|
/*
|
|
- * Ensure we synchronize up with __mmu_notifier_release().
|
|
+ * exit_mmap will block in mmu_notifier_release to guarantee
|
|
+ * that ->release is called before freeing the pages.
|
|
*/
|
|
- id = srcu_read_lock(&srcu);
|
|
-
|
|
- hlist_del_rcu(&mn->hlist);
|
|
- spin_unlock(&mm->mmu_notifier_mm->lock);
|
|
-
|
|
if (mn->ops->release)
|
|
mn->ops->release(mn, mm);
|
|
+ srcu_read_unlock(&srcu, id);
|
|
|
|
+ spin_lock(&mm->mmu_notifier_mm->lock);
|
|
/*
|
|
- * Allow __mmu_notifier_release() to complete.
|
|
+ * Can not use list_del_rcu() since __mmu_notifier_release
|
|
+ * can delete it before we hold the lock.
|
|
*/
|
|
- srcu_read_unlock(&srcu, id);
|
|
- } else
|
|
+ hlist_del_init_rcu(&mn->hlist);
|
|
spin_unlock(&mm->mmu_notifier_mm->lock);
|
|
+ }
|
|
|
|
/*
|
|
- * Wait for any running method to finish, including ->release() if it
|
|
- * was run by __mmu_notifier_release() instead of us.
|
|
+ * Wait for any running method to finish, of course including
|
|
+ * ->release if it was run by mmu_notifier_relase instead of us.
|
|
*/
|
|
synchronize_srcu(&srcu);
|
|
|
|
diff --git a/mm/pagewalk.c b/mm/pagewalk.c
|
|
index aa9701e..1090e77 100644
|
|
--- a/mm/pagewalk.c
|
|
+++ b/mm/pagewalk.c
|
|
@@ -127,28 +127,7 @@ static int walk_hugetlb_range(struct vm_area_struct *vma,
|
|
return 0;
|
|
}
|
|
|
|
-static struct vm_area_struct* hugetlb_vma(unsigned long addr, struct mm_walk *walk)
|
|
-{
|
|
- struct vm_area_struct *vma;
|
|
-
|
|
- /* We don't need vma lookup at all. */
|
|
- if (!walk->hugetlb_entry)
|
|
- return NULL;
|
|
-
|
|
- VM_BUG_ON(!rwsem_is_locked(&walk->mm->mmap_sem));
|
|
- vma = find_vma(walk->mm, addr);
|
|
- if (vma && vma->vm_start <= addr && is_vm_hugetlb_page(vma))
|
|
- return vma;
|
|
-
|
|
- return NULL;
|
|
-}
|
|
-
|
|
#else /* CONFIG_HUGETLB_PAGE */
|
|
-static struct vm_area_struct* hugetlb_vma(unsigned long addr, struct mm_walk *walk)
|
|
-{
|
|
- return NULL;
|
|
-}
|
|
-
|
|
static int walk_hugetlb_range(struct vm_area_struct *vma,
|
|
unsigned long addr, unsigned long end,
|
|
struct mm_walk *walk)
|
|
@@ -199,30 +178,53 @@ int walk_page_range(unsigned long addr, unsigned long end,
|
|
if (!walk->mm)
|
|
return -EINVAL;
|
|
|
|
+ VM_BUG_ON(!rwsem_is_locked(&walk->mm->mmap_sem));
|
|
+
|
|
pgd = pgd_offset(walk->mm, addr);
|
|
do {
|
|
- struct vm_area_struct *vma;
|
|
+ struct vm_area_struct *vma = NULL;
|
|
|
|
next = pgd_addr_end(addr, end);
|
|
|
|
/*
|
|
- * handle hugetlb vma individually because pagetable walk for
|
|
- * the hugetlb page is dependent on the architecture and
|
|
- * we can't handled it in the same manner as non-huge pages.
|
|
+ * This function was not intended to be vma based.
|
|
+ * But there are vma special cases to be handled:
|
|
+ * - hugetlb vma's
|
|
+ * - VM_PFNMAP vma's
|
|
*/
|
|
- vma = hugetlb_vma(addr, walk);
|
|
+ vma = find_vma(walk->mm, addr);
|
|
if (vma) {
|
|
- if (vma->vm_end < next)
|
|
+ /*
|
|
+ * There are no page structures backing a VM_PFNMAP
|
|
+ * range, so do not allow split_huge_page_pmd().
|
|
+ */
|
|
+ if ((vma->vm_start <= addr) &&
|
|
+ (vma->vm_flags & VM_PFNMAP)) {
|
|
next = vma->vm_end;
|
|
+ pgd = pgd_offset(walk->mm, next);
|
|
+ continue;
|
|
+ }
|
|
/*
|
|
- * Hugepage is very tightly coupled with vma, so
|
|
- * walk through hugetlb entries within a given vma.
|
|
+ * Handle hugetlb vma individually because pagetable
|
|
+ * walk for the hugetlb page is dependent on the
|
|
+ * architecture and we can't handled it in the same
|
|
+ * manner as non-huge pages.
|
|
*/
|
|
- err = walk_hugetlb_range(vma, addr, next, walk);
|
|
- if (err)
|
|
- break;
|
|
- pgd = pgd_offset(walk->mm, next);
|
|
- continue;
|
|
+ if (walk->hugetlb_entry && (vma->vm_start <= addr) &&
|
|
+ is_vm_hugetlb_page(vma)) {
|
|
+ if (vma->vm_end < next)
|
|
+ next = vma->vm_end;
|
|
+ /*
|
|
+ * Hugepage is very tightly coupled with vma,
|
|
+ * so walk through hugetlb entries within a
|
|
+ * given vma.
|
|
+ */
|
|
+ err = walk_hugetlb_range(vma, addr, next, walk);
|
|
+ if (err)
|
|
+ break;
|
|
+ pgd = pgd_offset(walk->mm, next);
|
|
+ continue;
|
|
+ }
|
|
}
|
|
|
|
if (pgd_none_or_clear_bad(pgd)) {
|
|
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
|
|
index 48f937e..95a04f0 100644
|
|
--- a/net/mac80211/iface.c
|
|
+++ b/net/mac80211/iface.c
|
|
@@ -1257,6 +1257,15 @@ void ieee80211_remove_interfaces(struct ieee80211_local *local)
|
|
|
|
ASSERT_RTNL();
|
|
|
|
+ /*
|
|
+ * Close all AP_VLAN interfaces first, as otherwise they
|
|
+ * might be closed while the AP interface they belong to
|
|
+ * is closed, causing unregister_netdevice_many() to crash.
|
|
+ */
|
|
+ list_for_each_entry(sdata, &local->interfaces, list)
|
|
+ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
|
+ dev_close(sdata->dev);
|
|
+
|
|
mutex_lock(&local->iflist_mtx);
|
|
list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) {
|
|
list_del(&sdata->list);
|
|
diff --git a/tools/perf/scripts/python/net_dropmonitor.py b/tools/perf/scripts/python/net_dropmonitor.py
|
|
index a4ffc95..4c11605 100755
|
|
--- a/tools/perf/scripts/python/net_dropmonitor.py
|
|
+++ b/tools/perf/scripts/python/net_dropmonitor.py
|
|
@@ -40,9 +40,9 @@ def get_kallsyms_table():
|
|
|
|
def get_sym(sloc):
|
|
loc = int(sloc)
|
|
- for i in kallsyms:
|
|
- if (i['loc'] >= loc):
|
|
- return (i['name'], i['loc']-loc)
|
|
+ for i in kallsyms[::-1]:
|
|
+ if loc >= i['loc']:
|
|
+ return (i['name'], loc - i['loc'])
|
|
return (None, 0)
|
|
|
|
def print_drop_table():
|
|
@@ -64,7 +64,7 @@ def trace_end():
|
|
|
|
# called from perf, when it finds a correspoinding event
|
|
def skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm,
|
|
- skbaddr, protocol, location):
|
|
+ skbaddr, location, protocol):
|
|
slocation = str(location)
|
|
try:
|
|
drop_log[slocation] = drop_log[slocation] + 1
|