Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3da68493fb | |||
| 27489ba07f | |||
| fd3fb3e110 | |||
| 7d9e68d3ec | |||
| 38e00d3415 | |||
| 17d6b7c89b | |||
| 6ce0c8dfdf | |||
| 99e56fc6ee | |||
| ef1b2a3b4c | |||
| 9be78f8658 | |||
| 59a79e934f | |||
| d6d47af4c9 | |||
| 9c053068c7 | |||
| 81ddd43976 | |||
| 504b891bc7 | |||
| 6829c71237 | |||
| 0098d9c5f8 | |||
| edf3b5b336 | |||
| 2498037d5a | |||
| 98debffa91 | |||
| 8cd943eb52 | |||
| 05dbb1e557 | |||
| 0721a681c6 | |||
| c255cda2af | |||
| cf43ea0341 | |||
| 76739be851 | |||
| e381a0a116 | |||
| a49567a4db | |||
| 2811d271ee | |||
| 5163b0a323 | |||
| 7a8ad840d8 | |||
| 6532533a28 |
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 13
|
||||
EXTRAVERSION =
|
||||
EXTRAVERSION = .3
|
||||
NAME=Woozy Numbat
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@ -165,7 +165,6 @@ static int __init pcibios_init(void)
|
||||
if ((pci_probe & PCI_BIOS_SORT) && !(pci_probe & PCI_NO_SORT))
|
||||
pcibios_sort();
|
||||
#endif
|
||||
pci_assign_unassigned_resources();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -170,43 +170,26 @@ static void __init pcibios_allocate_resources(int pass)
|
||||
static int __init pcibios_assign_resources(void)
|
||||
{
|
||||
struct pci_dev *dev = NULL;
|
||||
int idx;
|
||||
struct resource *r;
|
||||
struct resource *r, *pr;
|
||||
|
||||
for_each_pci_dev(dev) {
|
||||
int class = dev->class >> 8;
|
||||
|
||||
/* Don't touch classless devices and host bridges */
|
||||
if (!class || class == PCI_CLASS_BRIDGE_HOST)
|
||||
continue;
|
||||
|
||||
for(idx=0; idx<6; idx++) {
|
||||
r = &dev->resource[idx];
|
||||
|
||||
/*
|
||||
* Don't touch IDE controllers and I/O ports of video cards!
|
||||
*/
|
||||
if ((class == PCI_CLASS_STORAGE_IDE && idx < 4) ||
|
||||
(class == PCI_CLASS_DISPLAY_VGA && (r->flags & IORESOURCE_IO)))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* We shall assign a new address to this resource, either because
|
||||
* the BIOS forgot to do so or because we have decided the old
|
||||
* address was unusable for some reason.
|
||||
*/
|
||||
if (!r->start && r->end)
|
||||
pci_assign_resource(dev, idx);
|
||||
}
|
||||
|
||||
if (pci_probe & PCI_ASSIGN_ROMS) {
|
||||
if (!(pci_probe & PCI_ASSIGN_ROMS)) {
|
||||
/* Try to use BIOS settings for ROMs, otherwise let
|
||||
pci_assign_unassigned_resources() allocate the new
|
||||
addresses. */
|
||||
for_each_pci_dev(dev) {
|
||||
r = &dev->resource[PCI_ROM_RESOURCE];
|
||||
r->end -= r->start;
|
||||
r->start = 0;
|
||||
if (r->end)
|
||||
pci_assign_resource(dev, PCI_ROM_RESOURCE);
|
||||
if (!r->flags || !r->start)
|
||||
continue;
|
||||
pr = pci_find_parent_resource(dev, r);
|
||||
if (!pr || request_resource(pr, r) < 0) {
|
||||
r->end -= r->start;
|
||||
r->start = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pci_assign_unassigned_resources();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -6,11 +6,15 @@
|
||||
#ifndef __SKAS_MMU_H
|
||||
#define __SKAS_MMU_H
|
||||
|
||||
#include "linux/config.h"
|
||||
#include "mm_id.h"
|
||||
|
||||
struct mmu_context_skas {
|
||||
struct mm_id id;
|
||||
unsigned long last_page_table;
|
||||
#ifdef CONFIG_3_LEVEL_PGTABLES
|
||||
unsigned long last_pmd;
|
||||
#endif
|
||||
};
|
||||
|
||||
extern void switch_mm_skas(struct mm_id * mm_idp);
|
||||
|
||||
@ -56,6 +56,9 @@ static int init_stub_pte(struct mm_struct *mm, unsigned long proc,
|
||||
*/
|
||||
|
||||
mm->context.skas.last_page_table = pmd_page_kernel(*pmd);
|
||||
#ifdef CONFIG_3_LEVEL_PGTABLES
|
||||
mm->context.skas.last_pmd = (unsigned long) __va(pud_val(*pud));
|
||||
#endif
|
||||
|
||||
*pte = mk_pte(virt_to_page(kernel), __pgprot(_PAGE_PRESENT));
|
||||
*pte = pte_mkexec(*pte);
|
||||
@ -140,6 +143,10 @@ void destroy_context_skas(struct mm_struct *mm)
|
||||
else {
|
||||
os_kill_ptraced_process(mmu->id.u.pid, 1);
|
||||
free_page(mmu->id.stack);
|
||||
free_page(mmu->last_page_table);
|
||||
pte_free_kernel((pte_t *) mmu->last_page_table);
|
||||
dec_page_state(nr_page_table_pages);
|
||||
#ifdef CONFIG_3_LEVEL_PGTABLES
|
||||
pmd_free((pmd_t *) mmu->last_pmd);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,17 +24,26 @@
|
||||
static int tiocgdev(unsigned fd, unsigned cmd, unsigned int __user *ptr)
|
||||
{
|
||||
|
||||
struct file *file = fget(fd);
|
||||
struct file *file;
|
||||
struct tty_struct *real_tty;
|
||||
int fput_needed, ret;
|
||||
|
||||
file = fget_light(fd, &fput_needed);
|
||||
if (!file)
|
||||
return -EBADF;
|
||||
|
||||
ret = -EINVAL;
|
||||
if (file->f_op->ioctl != tty_ioctl)
|
||||
return -EINVAL;
|
||||
goto out;
|
||||
real_tty = (struct tty_struct *)file->private_data;
|
||||
if (!real_tty)
|
||||
return -EINVAL;
|
||||
return put_user(new_encode_dev(tty_devnum(real_tty)), ptr);
|
||||
goto out;
|
||||
|
||||
ret = put_user(new_encode_dev(tty_devnum(real_tty)), ptr);
|
||||
|
||||
out:
|
||||
fput_light(file, fput_needed);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define RTC_IRQP_READ32 _IOR('p', 0x0b, unsigned int) /* Read IRQ rate */
|
||||
|
||||
@ -191,6 +191,8 @@ static unsigned int cbc_process_encrypt(const struct cipher_desc *desc,
|
||||
u8 *iv = desc->info;
|
||||
unsigned int done = 0;
|
||||
|
||||
nbytes -= bsize;
|
||||
|
||||
do {
|
||||
xor(iv, src);
|
||||
fn(crypto_tfm_ctx(tfm), dst, iv);
|
||||
@ -198,7 +200,7 @@ static unsigned int cbc_process_encrypt(const struct cipher_desc *desc,
|
||||
|
||||
src += bsize;
|
||||
dst += bsize;
|
||||
} while ((done += bsize) < nbytes);
|
||||
} while ((done += bsize) <= nbytes);
|
||||
|
||||
return done;
|
||||
}
|
||||
@ -219,6 +221,8 @@ static unsigned int cbc_process_decrypt(const struct cipher_desc *desc,
|
||||
u8 *iv = desc->info;
|
||||
unsigned int done = 0;
|
||||
|
||||
nbytes -= bsize;
|
||||
|
||||
do {
|
||||
u8 *tmp_dst = *dst_p;
|
||||
|
||||
@ -230,7 +234,7 @@ static unsigned int cbc_process_decrypt(const struct cipher_desc *desc,
|
||||
|
||||
src += bsize;
|
||||
dst += bsize;
|
||||
} while ((done += bsize) < nbytes);
|
||||
} while ((done += bsize) <= nbytes);
|
||||
|
||||
return done;
|
||||
}
|
||||
@ -243,12 +247,14 @@ static unsigned int ecb_process(const struct cipher_desc *desc, u8 *dst,
|
||||
void (*fn)(void *, u8 *, const u8 *) = desc->crfn;
|
||||
unsigned int done = 0;
|
||||
|
||||
nbytes -= bsize;
|
||||
|
||||
do {
|
||||
fn(crypto_tfm_ctx(tfm), dst, src);
|
||||
|
||||
src += bsize;
|
||||
dst += bsize;
|
||||
} while ((done += bsize) < nbytes);
|
||||
} while ((done += bsize) <= nbytes);
|
||||
|
||||
return done;
|
||||
}
|
||||
|
||||
@ -938,10 +938,9 @@ found:
|
||||
|
||||
/*
|
||||
* XXX Interrupt pin #7 in Espresso is shared between RTC and
|
||||
* PCI Slot 2 INTA# (and some INTx# in Slot 1). SA_INTERRUPT here
|
||||
* is asking for trouble with add-on boards. Change to SA_SHIRQ.
|
||||
* PCI Slot 2 INTA# (and some INTx# in Slot 1).
|
||||
*/
|
||||
if (request_irq(rtc_irq, rtc_interrupt, SA_INTERRUPT, "rtc", (void *)&rtc_port)) {
|
||||
if (request_irq(rtc_irq, rtc_interrupt, SA_SHIRQ, "rtc", (void *)&rtc_port)) {
|
||||
/*
|
||||
* Standard way for sparc to print irq's is to use
|
||||
* __irq_itoa(). I think for EBus it's ok to use %d.
|
||||
|
||||
@ -608,7 +608,7 @@ static unsigned int __devinit init_chipset_cmd64x(struct pci_dev *dev, const cha
|
||||
|
||||
#ifdef __i386__
|
||||
if (dev->resource[PCI_ROM_RESOURCE].start) {
|
||||
pci_write_config_byte(dev, PCI_ROM_ADDRESS, dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE);
|
||||
pci_write_config_dword(dev, PCI_ROM_ADDRESS, dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE);
|
||||
printk(KERN_INFO "%s: ROM enabled at 0x%08lx\n", name, dev->resource[PCI_ROM_RESOURCE].start);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -173,7 +173,7 @@ static unsigned int __devinit init_chipset_hpt34x(struct pci_dev *dev, const cha
|
||||
|
||||
if (cmd & PCI_COMMAND_MEMORY) {
|
||||
if (pci_resource_start(dev, PCI_ROM_RESOURCE)) {
|
||||
pci_write_config_byte(dev, PCI_ROM_ADDRESS,
|
||||
pci_write_config_dword(dev, PCI_ROM_ADDRESS,
|
||||
dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE);
|
||||
printk(KERN_INFO "HPT345: ROM enabled at 0x%08lx\n",
|
||||
dev->resource[PCI_ROM_RESOURCE].start);
|
||||
|
||||
@ -1334,9 +1334,13 @@ static int __devinit init_hpt366(struct pci_dev *dev)
|
||||
static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const char *name)
|
||||
{
|
||||
int ret = 0;
|
||||
/* FIXME: Not portable */
|
||||
|
||||
/*
|
||||
* FIXME: Not portable. Also, why do we enable the ROM in the first place?
|
||||
* We don't seem to be using it.
|
||||
*/
|
||||
if (dev->resource[PCI_ROM_RESOURCE].start)
|
||||
pci_write_config_byte(dev, PCI_ROM_ADDRESS,
|
||||
pci_write_config_dword(dev, PCI_ROM_ADDRESS,
|
||||
dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE);
|
||||
|
||||
pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, (L1_CACHE_BYTES / 4));
|
||||
|
||||
@ -254,6 +254,7 @@ config VIDEO_SAA7134_DVB
|
||||
select VIDEO_BUF_DVB
|
||||
select DVB_MT352
|
||||
select DVB_CX22702
|
||||
select DVB_TDA1004X
|
||||
---help---
|
||||
This adds support for DVB cards based on the
|
||||
Philips saa7134 chip.
|
||||
|
||||
@ -1888,6 +1888,9 @@ static int nv_open(struct net_device *dev)
|
||||
writel(NVREG_MIISTAT_MASK, base + NvRegMIIStatus);
|
||||
dprintk(KERN_INFO "startup: got 0x%08x.\n", miistat);
|
||||
}
|
||||
/* set linkspeed to invalid value, thus force nv_update_linkspeed
|
||||
* to init hw */
|
||||
np->linkspeed = 0;
|
||||
ret = nv_update_linkspeed(dev);
|
||||
nv_start_rx(dev);
|
||||
nv_start_tx(dev);
|
||||
|
||||
@ -2828,21 +2828,29 @@ static void skge_netpoll(struct net_device *dev)
|
||||
static int skge_set_mac_address(struct net_device *dev, void *p)
|
||||
{
|
||||
struct skge_port *skge = netdev_priv(dev);
|
||||
struct sockaddr *addr = p;
|
||||
int err = 0;
|
||||
struct skge_hw *hw = skge->hw;
|
||||
unsigned port = skge->port;
|
||||
const struct sockaddr *addr = p;
|
||||
|
||||
if (!is_valid_ether_addr(addr->sa_data))
|
||||
return -EADDRNOTAVAIL;
|
||||
|
||||
skge_down(dev);
|
||||
spin_lock_bh(&hw->phy_lock);
|
||||
memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
|
||||
memcpy_toio(skge->hw->regs + B2_MAC_1 + skge->port*8,
|
||||
memcpy_toio(hw->regs + B2_MAC_1 + port*8,
|
||||
dev->dev_addr, ETH_ALEN);
|
||||
memcpy_toio(skge->hw->regs + B2_MAC_2 + skge->port*8,
|
||||
memcpy_toio(hw->regs + B2_MAC_2 + port*8,
|
||||
dev->dev_addr, ETH_ALEN);
|
||||
if (dev->flags & IFF_UP)
|
||||
err = skge_up(dev);
|
||||
return err;
|
||||
|
||||
if (hw->chip_id == CHIP_ID_GENESIS)
|
||||
xm_outaddr(hw, port, XM_SA, dev->dev_addr);
|
||||
else {
|
||||
gma_set_addr(hw, port, GM_SRC_ADDR_1L, dev->dev_addr);
|
||||
gma_set_addr(hw, port, GM_SRC_ADDR_2L, dev->dev_addr);
|
||||
}
|
||||
spin_unlock_bh(&hw->phy_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct {
|
||||
|
||||
@ -2816,7 +2816,7 @@ static int gem_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||
|
||||
#if (!defined(__sparc__) && !defined(CONFIG_PPC_PMAC))
|
||||
/* Fetch MAC address from vital product data of PCI ROM. */
|
||||
static void find_eth_addr_in_vpd(void __iomem *rom_base, int len, unsigned char *dev_addr)
|
||||
static int find_eth_addr_in_vpd(void __iomem *rom_base, int len, unsigned char *dev_addr)
|
||||
{
|
||||
int this_offset;
|
||||
|
||||
@ -2837,35 +2837,27 @@ static void find_eth_addr_in_vpd(void __iomem *rom_base, int len, unsigned char
|
||||
|
||||
for (i = 0; i < 6; i++)
|
||||
dev_addr[i] = readb(p + i);
|
||||
break;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void get_gem_mac_nonobp(struct pci_dev *pdev, unsigned char *dev_addr)
|
||||
{
|
||||
u32 rom_reg_orig;
|
||||
void __iomem *p;
|
||||
size_t size;
|
||||
void __iomem *p = pci_map_rom(pdev, &size);
|
||||
|
||||
if (pdev->resource[PCI_ROM_RESOURCE].parent == NULL) {
|
||||
if (pci_assign_resource(pdev, PCI_ROM_RESOURCE) < 0)
|
||||
goto use_random;
|
||||
if (p) {
|
||||
int found;
|
||||
|
||||
found = readb(p) == 0x55 &&
|
||||
readb(p + 1) == 0xaa &&
|
||||
find_eth_addr_in_vpd(p, (64 * 1024), dev_addr);
|
||||
pci_unmap_rom(pdev, p);
|
||||
if (found)
|
||||
return;
|
||||
}
|
||||
|
||||
pci_read_config_dword(pdev, pdev->rom_base_reg, &rom_reg_orig);
|
||||
pci_write_config_dword(pdev, pdev->rom_base_reg,
|
||||
rom_reg_orig | PCI_ROM_ADDRESS_ENABLE);
|
||||
|
||||
p = ioremap(pci_resource_start(pdev, PCI_ROM_RESOURCE), (64 * 1024));
|
||||
if (p != NULL && readb(p) == 0x55 && readb(p + 1) == 0xaa)
|
||||
find_eth_addr_in_vpd(p, (64 * 1024), dev_addr);
|
||||
|
||||
if (p != NULL)
|
||||
iounmap(p);
|
||||
|
||||
pci_write_config_dword(pdev, pdev->rom_base_reg, rom_reg_orig);
|
||||
return;
|
||||
|
||||
use_random:
|
||||
/* Sun MAC prefix then 3 random bytes. */
|
||||
dev_addr[0] = 0x08;
|
||||
dev_addr[1] = 0x00;
|
||||
|
||||
@ -2954,7 +2954,7 @@ static int is_quattro_p(struct pci_dev *pdev)
|
||||
}
|
||||
|
||||
/* Fetch MAC address from vital product data of PCI ROM. */
|
||||
static void find_eth_addr_in_vpd(void __iomem *rom_base, int len, int index, unsigned char *dev_addr)
|
||||
static int find_eth_addr_in_vpd(void __iomem *rom_base, int len, int index, unsigned char *dev_addr)
|
||||
{
|
||||
int this_offset;
|
||||
|
||||
@ -2977,42 +2977,33 @@ static void find_eth_addr_in_vpd(void __iomem *rom_base, int len, int index, uns
|
||||
|
||||
for (i = 0; i < 6; i++)
|
||||
dev_addr[i] = readb(p + i);
|
||||
break;
|
||||
return 1;
|
||||
}
|
||||
index--;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void get_hme_mac_nonsparc(struct pci_dev *pdev, unsigned char *dev_addr)
|
||||
{
|
||||
u32 rom_reg_orig;
|
||||
void __iomem *p;
|
||||
int index;
|
||||
size_t size;
|
||||
void __iomem *p = pci_map_rom(pdev, &size);
|
||||
|
||||
index = 0;
|
||||
if (is_quattro_p(pdev))
|
||||
index = PCI_SLOT(pdev->devfn);
|
||||
if (p) {
|
||||
int index = 0;
|
||||
int found;
|
||||
|
||||
if (pdev->resource[PCI_ROM_RESOURCE].parent == NULL) {
|
||||
if (pci_assign_resource(pdev, PCI_ROM_RESOURCE) < 0)
|
||||
goto use_random;
|
||||
if (is_quattro_p(pdev))
|
||||
index = PCI_SLOT(pdev->devfn);
|
||||
|
||||
found = readb(p) == 0x55 &&
|
||||
readb(p + 1) == 0xaa &&
|
||||
find_eth_addr_in_vpd(p, (64 * 1024), index, dev_addr);
|
||||
pci_unmap_rom(pdev, p);
|
||||
if (found)
|
||||
return;
|
||||
}
|
||||
|
||||
pci_read_config_dword(pdev, pdev->rom_base_reg, &rom_reg_orig);
|
||||
pci_write_config_dword(pdev, pdev->rom_base_reg,
|
||||
rom_reg_orig | PCI_ROM_ADDRESS_ENABLE);
|
||||
|
||||
p = ioremap(pci_resource_start(pdev, PCI_ROM_RESOURCE), (64 * 1024));
|
||||
if (p != NULL && readb(p) == 0x55 && readb(p + 1) == 0xaa)
|
||||
find_eth_addr_in_vpd(p, (64 * 1024), index, dev_addr);
|
||||
|
||||
if (p != NULL)
|
||||
iounmap(p);
|
||||
|
||||
pci_write_config_dword(pdev, pdev->rom_base_reg, rom_reg_orig);
|
||||
return;
|
||||
|
||||
use_random:
|
||||
/* Sun MAC prefix then 3 random bytes. */
|
||||
dev_addr[0] = 0x08;
|
||||
dev_addr[1] = 0x00;
|
||||
|
||||
@ -21,13 +21,21 @@
|
||||
* between the ROM and other resources, so enabling it may disable access
|
||||
* to MMIO registers or other card memory.
|
||||
*/
|
||||
static void pci_enable_rom(struct pci_dev *pdev)
|
||||
static int pci_enable_rom(struct pci_dev *pdev)
|
||||
{
|
||||
struct resource *res = pdev->resource + PCI_ROM_RESOURCE;
|
||||
struct pci_bus_region region;
|
||||
u32 rom_addr;
|
||||
|
||||
if (!res->flags)
|
||||
return -1;
|
||||
|
||||
pcibios_resource_to_bus(pdev, ®ion, res);
|
||||
pci_read_config_dword(pdev, pdev->rom_base_reg, &rom_addr);
|
||||
rom_addr |= PCI_ROM_ADDRESS_ENABLE;
|
||||
rom_addr &= ~PCI_ROM_ADDRESS_MASK;
|
||||
rom_addr |= region.start | PCI_ROM_ADDRESS_ENABLE;
|
||||
pci_write_config_dword(pdev, pdev->rom_base_reg, rom_addr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -71,19 +79,21 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size)
|
||||
} else {
|
||||
if (res->flags & IORESOURCE_ROM_COPY) {
|
||||
*size = pci_resource_len(pdev, PCI_ROM_RESOURCE);
|
||||
return (void __iomem *)pci_resource_start(pdev, PCI_ROM_RESOURCE);
|
||||
return (void __iomem *)pci_resource_start(pdev,
|
||||
PCI_ROM_RESOURCE);
|
||||
} else {
|
||||
/* assign the ROM an address if it doesn't have one */
|
||||
if (res->parent == NULL)
|
||||
pci_assign_resource(pdev, PCI_ROM_RESOURCE);
|
||||
|
||||
if (res->parent == NULL &&
|
||||
pci_assign_resource(pdev,PCI_ROM_RESOURCE))
|
||||
return NULL;
|
||||
start = pci_resource_start(pdev, PCI_ROM_RESOURCE);
|
||||
*size = pci_resource_len(pdev, PCI_ROM_RESOURCE);
|
||||
if (*size == 0)
|
||||
return NULL;
|
||||
|
||||
/* Enable ROM space decodes */
|
||||
pci_enable_rom(pdev);
|
||||
if (pci_enable_rom(pdev))
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -40,7 +40,7 @@
|
||||
* FIXME: IO should be max 256 bytes. However, since we may
|
||||
* have a P2P bridge below a cardbus bridge, we need 4K.
|
||||
*/
|
||||
#define CARDBUS_IO_SIZE (256)
|
||||
#define CARDBUS_IO_SIZE (4*1024)
|
||||
#define CARDBUS_MEM_SIZE (32*1024*1024)
|
||||
|
||||
static void __devinit
|
||||
|
||||
@ -976,7 +976,18 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
|
||||
{
|
||||
struct yenta_socket *socket;
|
||||
int ret;
|
||||
|
||||
|
||||
/*
|
||||
* If we failed to assign proper bus numbers for this cardbus
|
||||
* controller during PCI probe, its subordinate pci_bus is NULL.
|
||||
* Bail out if so.
|
||||
*/
|
||||
if (!dev->subordinate) {
|
||||
printk(KERN_ERR "Yenta: no bus associated with %s! "
|
||||
"(try 'pci=assign-busses')\n", pci_name(dev));
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
socket = kmalloc(sizeof(struct yenta_socket), GFP_KERNEL);
|
||||
if (!socket)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -968,7 +968,7 @@ static int aac_read(struct scsi_cmnd * scsicmd, int cid)
|
||||
fibsize = sizeof(struct aac_read64) +
|
||||
((le32_to_cpu(readcmd->sg.count) - 1) *
|
||||
sizeof (struct sgentry64));
|
||||
BUG_ON (fibsize > (sizeof(struct hw_fib) -
|
||||
BUG_ON (fibsize > (dev->max_fib_size -
|
||||
sizeof(struct aac_fibhdr)));
|
||||
/*
|
||||
* Now send the Fib to the adapter
|
||||
|
||||
@ -874,7 +874,7 @@ static void ftdi_determine_type(struct usb_serial_port *port)
|
||||
unsigned interfaces;
|
||||
|
||||
/* Assume it is not the original SIO device for now. */
|
||||
priv->baud_base = 48000000 / 16;
|
||||
priv->baud_base = 48000000 / 2;
|
||||
priv->write_offset = 0;
|
||||
|
||||
version = le16_to_cpu(udev->descriptor.bcdDevice);
|
||||
|
||||
@ -798,13 +798,16 @@ static int routing_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
|
||||
r = (void *) &r4;
|
||||
}
|
||||
|
||||
if (ret)
|
||||
return -EFAULT;
|
||||
if (ret) {
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
set_fs (KERNEL_DS);
|
||||
ret = sys_ioctl (fd, cmd, (unsigned long) r);
|
||||
set_fs (old_fs);
|
||||
|
||||
out:
|
||||
if (mysock)
|
||||
sockfd_put(mysock);
|
||||
|
||||
|
||||
@ -745,8 +745,8 @@ static inline int de_thread(struct task_struct *tsk)
|
||||
}
|
||||
|
||||
/*
|
||||
* Now there are really no other threads at all,
|
||||
* so it's safe to stop telling them to kill themselves.
|
||||
* There may be one thread left which is just exiting,
|
||||
* but it's safe to stop telling the group to kill themselves.
|
||||
*/
|
||||
sig->flags = 0;
|
||||
|
||||
@ -785,7 +785,6 @@ no_thread_group:
|
||||
kmem_cache_free(sighand_cachep, oldsighand);
|
||||
}
|
||||
|
||||
BUG_ON(!thread_group_empty(current));
|
||||
BUG_ON(!thread_group_leader(current));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -128,21 +128,21 @@ void jfs_delete_inode(struct inode *inode)
|
||||
{
|
||||
jfs_info("In jfs_delete_inode, inode = 0x%p", inode);
|
||||
|
||||
if (is_bad_inode(inode) ||
|
||||
(JFS_IP(inode)->fileset != cpu_to_le32(FILESYSTEM_I)))
|
||||
return;
|
||||
if (!is_bad_inode(inode) &&
|
||||
(JFS_IP(inode)->fileset == cpu_to_le32(FILESYSTEM_I))) {
|
||||
|
||||
if (test_cflag(COMMIT_Freewmap, inode))
|
||||
jfs_free_zero_link(inode);
|
||||
if (test_cflag(COMMIT_Freewmap, inode))
|
||||
jfs_free_zero_link(inode);
|
||||
|
||||
diFree(inode);
|
||||
diFree(inode);
|
||||
|
||||
/*
|
||||
* Free the inode from the quota allocation.
|
||||
*/
|
||||
DQUOT_INIT(inode);
|
||||
DQUOT_FREE_INODE(inode);
|
||||
DQUOT_DROP(inode);
|
||||
/*
|
||||
* Free the inode from the quota allocation.
|
||||
*/
|
||||
DQUOT_INIT(inode);
|
||||
DQUOT_FREE_INODE(inode);
|
||||
DQUOT_DROP(inode);
|
||||
}
|
||||
|
||||
clear_inode(inode);
|
||||
}
|
||||
|
||||
@ -42,11 +42,13 @@ static inline void pte_free(struct page *pte)
|
||||
#define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte))
|
||||
|
||||
#ifdef CONFIG_3_LEVEL_PGTABLES
|
||||
/*
|
||||
* In the 3-level case we free the pmds as part of the pgd.
|
||||
*/
|
||||
#define pmd_free(x) do { } while (0)
|
||||
#define __pmd_free_tlb(tlb,x) do { } while (0)
|
||||
|
||||
extern __inline__ void pmd_free(pmd_t *pmd)
|
||||
{
|
||||
free_page((unsigned long)pmd);
|
||||
}
|
||||
|
||||
#define __pmd_free_tlb(tlb,x) tlb_remove_page((tlb),virt_to_page(x))
|
||||
#endif
|
||||
|
||||
#define check_pgt_cache() do { } while (0)
|
||||
|
||||
@ -98,14 +98,11 @@ static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
|
||||
return pmd;
|
||||
}
|
||||
|
||||
static inline void pmd_free(pmd_t *pmd){
|
||||
free_page((unsigned long) pmd);
|
||||
extern inline void pud_clear (pud_t *pud)
|
||||
{
|
||||
set_pud(pud, __pud(0));
|
||||
}
|
||||
|
||||
#define __pmd_free_tlb(tlb,x) do { } while (0)
|
||||
|
||||
static inline void pud_clear (pud_t * pud) { }
|
||||
|
||||
#define pud_page(pud) \
|
||||
((struct page *) __va(pud_val(pud) & PAGE_MASK))
|
||||
|
||||
|
||||
@ -33,7 +33,8 @@ extern asmlinkage long compat_sys_sendmsg(int,struct compat_msghdr __user *,unsi
|
||||
extern asmlinkage long compat_sys_recvmsg(int,struct compat_msghdr __user *,unsigned);
|
||||
extern asmlinkage long compat_sys_getsockopt(int, int, int, char __user *, int __user *);
|
||||
extern int put_cmsg_compat(struct msghdr*, int, int, int, void *);
|
||||
extern int cmsghdr_from_user_compat_to_kern(struct msghdr *, unsigned char *,
|
||||
int);
|
||||
|
||||
struct sock;
|
||||
extern int cmsghdr_from_user_compat_to_kern(struct msghdr *, struct sock *, unsigned char *, int);
|
||||
|
||||
#endif /* NET_COMPAT_H */
|
||||
|
||||
@ -84,6 +84,7 @@
|
||||
#define IP_VS_CONN_F_IN_SEQ 0x0400 /* must do input seq adjust */
|
||||
#define IP_VS_CONN_F_SEQ_MASK 0x0600 /* in/out sequence mask */
|
||||
#define IP_VS_CONN_F_NO_CPORT 0x0800 /* no client port set yet */
|
||||
#define IP_VS_CONN_F_TEMPLATE 0x1000 /* template, not connection */
|
||||
|
||||
/* Move it to better place one day, for now keep it unique */
|
||||
#define NFC_IPVS_PROPERTY 0x10000
|
||||
@ -740,6 +741,8 @@ enum {
|
||||
|
||||
extern struct ip_vs_conn *ip_vs_conn_in_get
|
||||
(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port);
|
||||
extern struct ip_vs_conn *ip_vs_ct_in_get
|
||||
(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port);
|
||||
extern struct ip_vs_conn *ip_vs_conn_out_get
|
||||
(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port);
|
||||
|
||||
|
||||
@ -333,8 +333,13 @@ check_range(struct mm_struct *mm, unsigned long start, unsigned long end,
|
||||
if (prev && prev->vm_end < vma->vm_start)
|
||||
return ERR_PTR(-EFAULT);
|
||||
if ((flags & MPOL_MF_STRICT) && !is_vm_hugetlb_page(vma)) {
|
||||
unsigned long endvma = vma->vm_end;
|
||||
if (endvma > end)
|
||||
endvma = end;
|
||||
if (vma->vm_start > start)
|
||||
start = vma->vm_start;
|
||||
err = check_pgd_range(vma->vm_mm,
|
||||
vma->vm_start, vma->vm_end, nodes);
|
||||
start, endvma, nodes);
|
||||
if (err) {
|
||||
first = ERR_PTR(err);
|
||||
break;
|
||||
|
||||
44
net/compat.c
44
net/compat.c
@ -135,13 +135,14 @@ static inline struct compat_cmsghdr __user *cmsg_compat_nxthdr(struct msghdr *ms
|
||||
* thus placement) of cmsg headers and length are different for
|
||||
* 32-bit apps. -DaveM
|
||||
*/
|
||||
int cmsghdr_from_user_compat_to_kern(struct msghdr *kmsg,
|
||||
int cmsghdr_from_user_compat_to_kern(struct msghdr *kmsg, struct sock *sk,
|
||||
unsigned char *stackbuf, int stackbuf_size)
|
||||
{
|
||||
struct compat_cmsghdr __user *ucmsg;
|
||||
struct cmsghdr *kcmsg, *kcmsg_base;
|
||||
compat_size_t ucmlen;
|
||||
__kernel_size_t kcmlen, tmp;
|
||||
int err = -EFAULT;
|
||||
|
||||
kcmlen = 0;
|
||||
kcmsg_base = kcmsg = (struct cmsghdr *)stackbuf;
|
||||
@ -156,6 +157,7 @@ int cmsghdr_from_user_compat_to_kern(struct msghdr *kmsg,
|
||||
|
||||
tmp = ((ucmlen - CMSG_COMPAT_ALIGN(sizeof(*ucmsg))) +
|
||||
CMSG_ALIGN(sizeof(struct cmsghdr)));
|
||||
tmp = CMSG_ALIGN(tmp);
|
||||
kcmlen += tmp;
|
||||
ucmsg = cmsg_compat_nxthdr(kmsg, ucmsg, ucmlen);
|
||||
}
|
||||
@ -167,30 +169,34 @@ int cmsghdr_from_user_compat_to_kern(struct msghdr *kmsg,
|
||||
* until we have successfully copied over all of the data
|
||||
* from the user.
|
||||
*/
|
||||
if(kcmlen > stackbuf_size)
|
||||
kcmsg_base = kcmsg = kmalloc(kcmlen, GFP_KERNEL);
|
||||
if(kcmsg == NULL)
|
||||
if (kcmlen > stackbuf_size)
|
||||
kcmsg_base = kcmsg = sock_kmalloc(sk, kcmlen, GFP_KERNEL);
|
||||
if (kcmsg == NULL)
|
||||
return -ENOBUFS;
|
||||
|
||||
/* Now copy them over neatly. */
|
||||
memset(kcmsg, 0, kcmlen);
|
||||
ucmsg = CMSG_COMPAT_FIRSTHDR(kmsg);
|
||||
while(ucmsg != NULL) {
|
||||
__get_user(ucmlen, &ucmsg->cmsg_len);
|
||||
if (__get_user(ucmlen, &ucmsg->cmsg_len))
|
||||
goto Efault;
|
||||
if (!CMSG_COMPAT_OK(ucmlen, ucmsg, kmsg))
|
||||
goto Einval;
|
||||
tmp = ((ucmlen - CMSG_COMPAT_ALIGN(sizeof(*ucmsg))) +
|
||||
CMSG_ALIGN(sizeof(struct cmsghdr)));
|
||||
if ((char *)kcmsg_base + kcmlen - (char *)kcmsg < CMSG_ALIGN(tmp))
|
||||
goto Einval;
|
||||
kcmsg->cmsg_len = tmp;
|
||||
__get_user(kcmsg->cmsg_level, &ucmsg->cmsg_level);
|
||||
__get_user(kcmsg->cmsg_type, &ucmsg->cmsg_type);
|
||||
|
||||
/* Copy over the data. */
|
||||
if(copy_from_user(CMSG_DATA(kcmsg),
|
||||
CMSG_COMPAT_DATA(ucmsg),
|
||||
(ucmlen - CMSG_COMPAT_ALIGN(sizeof(*ucmsg)))))
|
||||
goto out_free_efault;
|
||||
tmp = CMSG_ALIGN(tmp);
|
||||
if (__get_user(kcmsg->cmsg_level, &ucmsg->cmsg_level) ||
|
||||
__get_user(kcmsg->cmsg_type, &ucmsg->cmsg_type) ||
|
||||
copy_from_user(CMSG_DATA(kcmsg),
|
||||
CMSG_COMPAT_DATA(ucmsg),
|
||||
(ucmlen - CMSG_COMPAT_ALIGN(sizeof(*ucmsg)))))
|
||||
goto Efault;
|
||||
|
||||
/* Advance. */
|
||||
kcmsg = (struct cmsghdr *)((char *)kcmsg + CMSG_ALIGN(tmp));
|
||||
kcmsg = (struct cmsghdr *)((char *)kcmsg + tmp);
|
||||
ucmsg = cmsg_compat_nxthdr(kmsg, ucmsg, ucmlen);
|
||||
}
|
||||
|
||||
@ -199,10 +205,12 @@ int cmsghdr_from_user_compat_to_kern(struct msghdr *kmsg,
|
||||
kmsg->msg_controllen = kcmlen;
|
||||
return 0;
|
||||
|
||||
out_free_efault:
|
||||
if(kcmsg_base != (struct cmsghdr *)stackbuf)
|
||||
kfree(kcmsg_base);
|
||||
return -EFAULT;
|
||||
Einval:
|
||||
err = -EINVAL;
|
||||
Efault:
|
||||
if (kcmsg_base != (struct cmsghdr *)stackbuf)
|
||||
sock_kfree_s(sk, kcmsg_base, kcmlen);
|
||||
return err;
|
||||
}
|
||||
|
||||
int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *data)
|
||||
|
||||
@ -182,7 +182,7 @@ int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen)
|
||||
A = ntohl(*(u32 *)ptr);
|
||||
continue;
|
||||
}
|
||||
return 0;
|
||||
break;
|
||||
case BPF_LD|BPF_H|BPF_ABS:
|
||||
k = fentry->k;
|
||||
load_h:
|
||||
@ -191,7 +191,7 @@ int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen)
|
||||
A = ntohs(*(u16 *)ptr);
|
||||
continue;
|
||||
}
|
||||
return 0;
|
||||
break;
|
||||
case BPF_LD|BPF_B|BPF_ABS:
|
||||
k = fentry->k;
|
||||
load_b:
|
||||
@ -200,7 +200,7 @@ load_b:
|
||||
A = *(u8 *)ptr;
|
||||
continue;
|
||||
}
|
||||
return 0;
|
||||
break;
|
||||
case BPF_LD|BPF_W|BPF_LEN:
|
||||
A = skb->len;
|
||||
continue;
|
||||
|
||||
@ -457,7 +457,7 @@ static void ip_frag_queue(struct ipq *qp, struct sk_buff *skb)
|
||||
|
||||
if (pskb_pull(skb, ihl) == NULL)
|
||||
goto err;
|
||||
if (pskb_trim(skb, end-offset))
|
||||
if (pskb_trim_rcsum(skb, end-offset))
|
||||
goto err;
|
||||
|
||||
/* Find out which fragments are in front and at the back of us
|
||||
|
||||
@ -196,6 +196,7 @@ static inline struct ip_vs_conn *__ip_vs_conn_in_get
|
||||
list_for_each_entry(cp, &ip_vs_conn_tab[hash], c_list) {
|
||||
if (s_addr==cp->caddr && s_port==cp->cport &&
|
||||
d_port==cp->vport && d_addr==cp->vaddr &&
|
||||
((!s_port) ^ (!(cp->flags & IP_VS_CONN_F_NO_CPORT))) &&
|
||||
protocol==cp->protocol) {
|
||||
/* HIT */
|
||||
atomic_inc(&cp->refcnt);
|
||||
@ -227,6 +228,40 @@ struct ip_vs_conn *ip_vs_conn_in_get
|
||||
return cp;
|
||||
}
|
||||
|
||||
/* Get reference to connection template */
|
||||
struct ip_vs_conn *ip_vs_ct_in_get
|
||||
(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port)
|
||||
{
|
||||
unsigned hash;
|
||||
struct ip_vs_conn *cp;
|
||||
|
||||
hash = ip_vs_conn_hashkey(protocol, s_addr, s_port);
|
||||
|
||||
ct_read_lock(hash);
|
||||
|
||||
list_for_each_entry(cp, &ip_vs_conn_tab[hash], c_list) {
|
||||
if (s_addr==cp->caddr && s_port==cp->cport &&
|
||||
d_port==cp->vport && d_addr==cp->vaddr &&
|
||||
cp->flags & IP_VS_CONN_F_TEMPLATE &&
|
||||
protocol==cp->protocol) {
|
||||
/* HIT */
|
||||
atomic_inc(&cp->refcnt);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
cp = NULL;
|
||||
|
||||
out:
|
||||
ct_read_unlock(hash);
|
||||
|
||||
IP_VS_DBG(7, "template lookup/in %s %u.%u.%u.%u:%d->%u.%u.%u.%u:%d %s\n",
|
||||
ip_vs_proto_name(protocol),
|
||||
NIPQUAD(s_addr), ntohs(s_port),
|
||||
NIPQUAD(d_addr), ntohs(d_port),
|
||||
cp?"hit":"not hit");
|
||||
|
||||
return cp;
|
||||
}
|
||||
|
||||
/*
|
||||
* Gets ip_vs_conn associated with supplied parameters in the ip_vs_conn_tab.
|
||||
@ -367,7 +402,7 @@ ip_vs_bind_dest(struct ip_vs_conn *cp, struct ip_vs_dest *dest)
|
||||
atomic_read(&dest->refcnt));
|
||||
|
||||
/* Update the connection counters */
|
||||
if (cp->cport || (cp->flags & IP_VS_CONN_F_NO_CPORT)) {
|
||||
if (!(cp->flags & IP_VS_CONN_F_TEMPLATE)) {
|
||||
/* It is a normal connection, so increase the inactive
|
||||
connection counter because it is in TCP SYNRECV
|
||||
state (inactive) or other protocol inacive state */
|
||||
@ -406,7 +441,7 @@ static inline void ip_vs_unbind_dest(struct ip_vs_conn *cp)
|
||||
atomic_read(&dest->refcnt));
|
||||
|
||||
/* Update the connection counters */
|
||||
if (cp->cport || (cp->flags & IP_VS_CONN_F_NO_CPORT)) {
|
||||
if (!(cp->flags & IP_VS_CONN_F_TEMPLATE)) {
|
||||
/* It is a normal connection, so decrease the inactconns
|
||||
or activeconns counter */
|
||||
if (cp->flags & IP_VS_CONN_F_INACTIVE) {
|
||||
@ -776,7 +811,7 @@ void ip_vs_random_dropentry(void)
|
||||
ct_write_lock_bh(hash);
|
||||
|
||||
list_for_each_entry(cp, &ip_vs_conn_tab[hash], c_list) {
|
||||
if (!cp->cport && !(cp->flags & IP_VS_CONN_F_NO_CPORT))
|
||||
if (cp->flags & IP_VS_CONN_F_TEMPLATE)
|
||||
/* connection template */
|
||||
continue;
|
||||
|
||||
|
||||
@ -242,10 +242,10 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
||||
if (ports[1] == svc->port) {
|
||||
/* Check if a template already exists */
|
||||
if (svc->port != FTPPORT)
|
||||
ct = ip_vs_conn_in_get(iph->protocol, snet, 0,
|
||||
ct = ip_vs_ct_in_get(iph->protocol, snet, 0,
|
||||
iph->daddr, ports[1]);
|
||||
else
|
||||
ct = ip_vs_conn_in_get(iph->protocol, snet, 0,
|
||||
ct = ip_vs_ct_in_get(iph->protocol, snet, 0,
|
||||
iph->daddr, 0);
|
||||
|
||||
if (!ct || !ip_vs_check_template(ct)) {
|
||||
@ -271,14 +271,14 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
||||
iph->daddr,
|
||||
ports[1],
|
||||
dest->addr, dest->port,
|
||||
0,
|
||||
IP_VS_CONN_F_TEMPLATE,
|
||||
dest);
|
||||
else
|
||||
ct = ip_vs_conn_new(iph->protocol,
|
||||
snet, 0,
|
||||
iph->daddr, 0,
|
||||
dest->addr, 0,
|
||||
0,
|
||||
IP_VS_CONN_F_TEMPLATE,
|
||||
dest);
|
||||
if (ct == NULL)
|
||||
return NULL;
|
||||
@ -297,10 +297,10 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
||||
* port zero template: <protocol,caddr,0,vaddr,0,daddr,0>
|
||||
*/
|
||||
if (svc->fwmark)
|
||||
ct = ip_vs_conn_in_get(IPPROTO_IP, snet, 0,
|
||||
ct = ip_vs_ct_in_get(IPPROTO_IP, snet, 0,
|
||||
htonl(svc->fwmark), 0);
|
||||
else
|
||||
ct = ip_vs_conn_in_get(iph->protocol, snet, 0,
|
||||
ct = ip_vs_ct_in_get(iph->protocol, snet, 0,
|
||||
iph->daddr, 0);
|
||||
|
||||
if (!ct || !ip_vs_check_template(ct)) {
|
||||
@ -325,14 +325,14 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
||||
snet, 0,
|
||||
htonl(svc->fwmark), 0,
|
||||
dest->addr, 0,
|
||||
0,
|
||||
IP_VS_CONN_F_TEMPLATE,
|
||||
dest);
|
||||
else
|
||||
ct = ip_vs_conn_new(iph->protocol,
|
||||
snet, 0,
|
||||
iph->daddr, 0,
|
||||
dest->addr, 0,
|
||||
0,
|
||||
IP_VS_CONN_F_TEMPLATE,
|
||||
dest);
|
||||
if (ct == NULL)
|
||||
return NULL;
|
||||
|
||||
@ -297,16 +297,24 @@ static void ip_vs_process_message(const char *buffer, const size_t buflen)
|
||||
|
||||
p = (char *)buffer + sizeof(struct ip_vs_sync_mesg);
|
||||
for (i=0; i<m->nr_conns; i++) {
|
||||
unsigned flags;
|
||||
|
||||
s = (struct ip_vs_sync_conn *)p;
|
||||
cp = ip_vs_conn_in_get(s->protocol,
|
||||
s->caddr, s->cport,
|
||||
s->vaddr, s->vport);
|
||||
flags = ntohs(s->flags);
|
||||
if (!(flags & IP_VS_CONN_F_TEMPLATE))
|
||||
cp = ip_vs_conn_in_get(s->protocol,
|
||||
s->caddr, s->cport,
|
||||
s->vaddr, s->vport);
|
||||
else
|
||||
cp = ip_vs_ct_in_get(s->protocol,
|
||||
s->caddr, s->cport,
|
||||
s->vaddr, s->vport);
|
||||
if (!cp) {
|
||||
cp = ip_vs_conn_new(s->protocol,
|
||||
s->caddr, s->cport,
|
||||
s->vaddr, s->vport,
|
||||
s->daddr, s->dport,
|
||||
ntohs(s->flags), NULL);
|
||||
flags, NULL);
|
||||
if (!cp) {
|
||||
IP_VS_ERR("ip_vs_conn_new failed\n");
|
||||
return;
|
||||
@ -315,11 +323,11 @@ static void ip_vs_process_message(const char *buffer, const size_t buflen)
|
||||
} else if (!cp->dest) {
|
||||
/* it is an entry created by the synchronization */
|
||||
cp->state = ntohs(s->state);
|
||||
cp->flags = ntohs(s->flags) | IP_VS_CONN_F_HASHED;
|
||||
cp->flags = flags | IP_VS_CONN_F_HASHED;
|
||||
} /* Note that we don't touch its state and flags
|
||||
if it is a normal entry. */
|
||||
|
||||
if (ntohs(s->flags) & IP_VS_CONN_F_SEQ_MASK) {
|
||||
if (flags & IP_VS_CONN_F_SEQ_MASK) {
|
||||
opt = (struct ip_vs_sync_conn_options *)&s[1];
|
||||
memcpy(&cp->in_seq, opt, sizeof(*opt));
|
||||
p += FULL_CONN_SIZE;
|
||||
|
||||
@ -95,6 +95,12 @@ masquerade_target(struct sk_buff **pskb,
|
||||
IP_NF_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED
|
||||
|| ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY));
|
||||
|
||||
/* Source address is 0.0.0.0 - locally generated packet that is
|
||||
* probably not supposed to be masqueraded.
|
||||
*/
|
||||
if (ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip == 0)
|
||||
return NF_ACCEPT;
|
||||
|
||||
mr = targinfo;
|
||||
rt = (struct rtable *)(*pskb)->dst;
|
||||
newsrc = inet_select_addr(out, rt->rt_gateway, RT_SCOPE_UNIVERSE);
|
||||
|
||||
@ -358,7 +358,7 @@ static void raw_probe_proto_opt(struct flowi *fl, struct msghdr *msg)
|
||||
|
||||
if (type && code) {
|
||||
get_user(fl->fl_icmp_type, type);
|
||||
__get_user(fl->fl_icmp_code, code);
|
||||
get_user(fl->fl_icmp_code, code);
|
||||
probed = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
@ -350,8 +350,6 @@ static void tcp_clamp_window(struct sock *sk, struct tcp_sock *tp)
|
||||
app_win -= tp->ack.rcv_mss;
|
||||
app_win = max(app_win, 2U*tp->advmss);
|
||||
|
||||
if (!ofo_win)
|
||||
tp->window_clamp = min(tp->window_clamp, app_win);
|
||||
tp->rcv_ssthresh = min(tp->window_clamp, 2U*tp->advmss);
|
||||
}
|
||||
}
|
||||
|
||||
@ -774,7 +774,7 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req,
|
||||
newtp->frto_counter = 0;
|
||||
newtp->frto_highmark = 0;
|
||||
|
||||
newtp->ca_ops = &tcp_reno;
|
||||
newtp->ca_ops = &tcp_init_congestion_ops;
|
||||
|
||||
tcp_set_ca_state(newtp, TCP_CA_Open);
|
||||
tcp_init_xmit_timers(newsk);
|
||||
|
||||
@ -619,7 +619,7 @@ static void rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg)
|
||||
|
||||
if (type && code) {
|
||||
get_user(fl->fl_icmp_type, type);
|
||||
__get_user(fl->fl_icmp_code, code);
|
||||
get_user(fl->fl_icmp_code, code);
|
||||
probed = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
@ -404,9 +404,8 @@ static struct sock *udp_v6_mcast_next(struct sock *sk,
|
||||
continue;
|
||||
|
||||
if (!ipv6_addr_any(&np->rcv_saddr)) {
|
||||
if (ipv6_addr_equal(&np->rcv_saddr, loc_addr))
|
||||
return s;
|
||||
continue;
|
||||
if (!ipv6_addr_equal(&np->rcv_saddr, loc_addr))
|
||||
continue;
|
||||
}
|
||||
if(!inet6_mc_check(s, loc_addr, rmt_addr))
|
||||
continue;
|
||||
|
||||
@ -1739,10 +1739,11 @@ asmlinkage long sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags)
|
||||
goto out_freeiov;
|
||||
ctl_len = msg_sys.msg_controllen;
|
||||
if ((MSG_CMSG_COMPAT & flags) && ctl_len) {
|
||||
err = cmsghdr_from_user_compat_to_kern(&msg_sys, ctl, sizeof(ctl));
|
||||
err = cmsghdr_from_user_compat_to_kern(&msg_sys, sock->sk, ctl, sizeof(ctl));
|
||||
if (err)
|
||||
goto out_freeiov;
|
||||
ctl_buf = msg_sys.msg_control;
|
||||
ctl_len = msg_sys.msg_controllen;
|
||||
} else if (ctl_len) {
|
||||
if (ctl_len > sizeof(ctl))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user