1754 lines
52 KiB
Groff
1754 lines
52 KiB
Groff
|
diff --git a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c
|
||
|
index b4e5f8f..45308bd 100644
|
||
|
--- a/arch/alpha/kernel/setup.c
|
||
|
+++ b/arch/alpha/kernel/setup.c
|
||
|
@@ -24,6 +24,7 @@
|
||
|
#include <linux/config.h> /* CONFIG_ALPHA_LCA etc */
|
||
|
#include <linux/mc146818rtc.h>
|
||
|
#include <linux/console.h>
|
||
|
+#include <linux/cpu.h>
|
||
|
#include <linux/errno.h>
|
||
|
#include <linux/init.h>
|
||
|
#include <linux/string.h>
|
||
|
@@ -477,6 +478,22 @@ page_is_ram(unsigned long pfn)
|
||
|
#undef PFN_PHYS
|
||
|
#undef PFN_MAX
|
||
|
|
||
|
+static int __init
|
||
|
+register_cpus(void)
|
||
|
+{
|
||
|
+ int i;
|
||
|
+
|
||
|
+ for_each_possible_cpu(i) {
|
||
|
+ struct cpu *p = kzalloc(sizeof(*p), GFP_KERNEL);
|
||
|
+ if (!p)
|
||
|
+ return -ENOMEM;
|
||
|
+ register_cpu(p, i, NULL);
|
||
|
+ }
|
||
|
+ return 0;
|
||
|
+}
|
||
|
+
|
||
|
+arch_initcall(register_cpus);
|
||
|
+
|
||
|
void __init
|
||
|
setup_arch(char **cmdline_p)
|
||
|
{
|
||
|
diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c
|
||
|
index 02c2db0..1852554 100644
|
||
|
--- a/arch/alpha/kernel/smp.c
|
||
|
+++ b/arch/alpha/kernel/smp.c
|
||
|
@@ -439,7 +439,7 @@ setup_smp(void)
|
||
|
if ((cpu->flags & 0x1cc) == 0x1cc) {
|
||
|
smp_num_probed++;
|
||
|
/* Assume here that "whami" == index */
|
||
|
- cpu_set(i, cpu_possible_map);
|
||
|
+ cpu_set(i, cpu_present_mask);
|
||
|
cpu->pal_revision = boot_cpu_palrev;
|
||
|
}
|
||
|
|
||
|
@@ -450,9 +450,8 @@ setup_smp(void)
|
||
|
}
|
||
|
} else {
|
||
|
smp_num_probed = 1;
|
||
|
- cpu_set(boot_cpuid, cpu_possible_map);
|
||
|
+ cpu_set(boot_cpuid, cpu_present_mask);
|
||
|
}
|
||
|
- cpu_present_mask = cpumask_of_cpu(boot_cpuid);
|
||
|
|
||
|
printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n",
|
||
|
smp_num_probed, cpu_possible_map.bits[0]);
|
||
|
@@ -488,9 +487,8 @@ void __devinit
|
||
|
smp_prepare_boot_cpu(void)
|
||
|
{
|
||
|
/*
|
||
|
- * Mark the boot cpu (current cpu) as both present and online
|
||
|
+ * Mark the boot cpu (current cpu) as online
|
||
|
*/
|
||
|
- cpu_set(smp_processor_id(), cpu_present_mask);
|
||
|
cpu_set(smp_processor_id(), cpu_online_map);
|
||
|
}
|
||
|
|
||
|
diff --git a/arch/m32r/kernel/m32r_ksyms.c b/arch/m32r/kernel/m32r_ksyms.c
|
||
|
index be8b711..6000950 100644
|
||
|
--- a/arch/m32r/kernel/m32r_ksyms.c
|
||
|
+++ b/arch/m32r/kernel/m32r_ksyms.c
|
||
|
@@ -38,10 +38,6 @@ EXPORT_SYMBOL(__udelay);
|
||
|
EXPORT_SYMBOL(__delay);
|
||
|
EXPORT_SYMBOL(__const_udelay);
|
||
|
|
||
|
-EXPORT_SYMBOL(__get_user_1);
|
||
|
-EXPORT_SYMBOL(__get_user_2);
|
||
|
-EXPORT_SYMBOL(__get_user_4);
|
||
|
-
|
||
|
EXPORT_SYMBOL(strpbrk);
|
||
|
EXPORT_SYMBOL(strstr);
|
||
|
|
||
|
diff --git a/arch/m32r/kernel/setup.c b/arch/m32r/kernel/setup.c
|
||
|
index d742037..542ed93 100644
|
||
|
--- a/arch/m32r/kernel/setup.c
|
||
|
+++ b/arch/m32r/kernel/setup.c
|
||
|
@@ -9,6 +9,7 @@
|
||
|
|
||
|
#include <linux/config.h>
|
||
|
#include <linux/init.h>
|
||
|
+#include <linux/kernel.h>
|
||
|
#include <linux/stddef.h>
|
||
|
#include <linux/fs.h>
|
||
|
#include <linux/sched.h>
|
||
|
@@ -218,8 +219,6 @@ static unsigned long __init setup_memory
|
||
|
extern unsigned long setup_memory(void);
|
||
|
#endif /* CONFIG_DISCONTIGMEM */
|
||
|
|
||
|
-#define M32R_PCC_PCATCR 0x00ef7014 /* will move to m32r.h */
|
||
|
-
|
||
|
void __init setup_arch(char **cmdline_p)
|
||
|
{
|
||
|
ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
|
||
|
@@ -268,15 +267,14 @@ void __init setup_arch(char **cmdline_p)
|
||
|
paging_init();
|
||
|
}
|
||
|
|
||
|
-static struct cpu cpu[NR_CPUS];
|
||
|
+static struct cpu cpu_devices[NR_CPUS];
|
||
|
|
||
|
static int __init topology_init(void)
|
||
|
{
|
||
|
- int cpu_id;
|
||
|
+ int i;
|
||
|
|
||
|
- for (cpu_id = 0; cpu_id < NR_CPUS; cpu_id++)
|
||
|
- if (cpu_possible(cpu_id))
|
||
|
- register_cpu(&cpu[cpu_id], cpu_id, NULL);
|
||
|
+ for_each_present_cpu(i)
|
||
|
+ register_cpu(&cpu_devices[i], i, NULL);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
diff --git a/arch/m32r/kernel/smpboot.c b/arch/m32r/kernel/smpboot.c
|
||
|
index d7ec16e..840b434 100644
|
||
|
--- a/arch/m32r/kernel/smpboot.c
|
||
|
+++ b/arch/m32r/kernel/smpboot.c
|
||
|
@@ -39,8 +39,10 @@
|
||
|
* Martin J. Bligh : Added support for multi-quad systems
|
||
|
*/
|
||
|
|
||
|
+#include <linux/module.h>
|
||
|
#include <linux/config.h>
|
||
|
#include <linux/init.h>
|
||
|
+#include <linux/kernel.h>
|
||
|
#include <linux/mm.h>
|
||
|
#include <linux/smp_lock.h>
|
||
|
#include <linux/irq.h>
|
||
|
@@ -72,11 +74,15 @@ physid_mask_t phys_cpu_present_map;
|
||
|
|
||
|
/* Bitmask of currently online CPUs */
|
||
|
cpumask_t cpu_online_map;
|
||
|
+EXPORT_SYMBOL(cpu_online_map);
|
||
|
|
||
|
cpumask_t cpu_bootout_map;
|
||
|
cpumask_t cpu_bootin_map;
|
||
|
-cpumask_t cpu_callout_map;
|
||
|
static cpumask_t cpu_callin_map;
|
||
|
+cpumask_t cpu_callout_map;
|
||
|
+EXPORT_SYMBOL(cpu_callout_map);
|
||
|
+cpumask_t cpu_possible_map = CPU_MASK_ALL;
|
||
|
+EXPORT_SYMBOL(cpu_possible_map);
|
||
|
|
||
|
/* Per CPU bogomips and other parameters */
|
||
|
struct cpuinfo_m32r cpu_data[NR_CPUS] __cacheline_aligned;
|
||
|
@@ -110,7 +116,6 @@ static unsigned int calibration_result;
|
||
|
|
||
|
void smp_prepare_boot_cpu(void);
|
||
|
void smp_prepare_cpus(unsigned int);
|
||
|
-static void smp_tune_scheduling(void);
|
||
|
static void init_ipi_lock(void);
|
||
|
static void do_boot_cpu(int);
|
||
|
int __cpu_up(unsigned int);
|
||
|
@@ -177,6 +182,9 @@ void __init smp_prepare_cpus(unsigned in
|
||
|
}
|
||
|
for (phys_id = 0 ; phys_id < nr_cpu ; phys_id++)
|
||
|
physid_set(phys_id, phys_cpu_present_map);
|
||
|
+#ifndef CONFIG_HOTPLUG_CPU
|
||
|
+ cpu_present_map = cpu_possible_map;
|
||
|
+#endif
|
||
|
|
||
|
show_mp_info(nr_cpu);
|
||
|
|
||
|
@@ -186,7 +194,6 @@ void __init smp_prepare_cpus(unsigned in
|
||
|
* Setup boot CPU information
|
||
|
*/
|
||
|
smp_store_cpu_info(0); /* Final full version of the data */
|
||
|
- smp_tune_scheduling();
|
||
|
|
||
|
/*
|
||
|
* If SMP should be disabled, then really disable it!
|
||
|
@@ -230,11 +237,6 @@ smp_done:
|
||
|
Dprintk("Boot done.\n");
|
||
|
}
|
||
|
|
||
|
-static void __init smp_tune_scheduling(void)
|
||
|
-{
|
||
|
- /* Nothing to do. */
|
||
|
-}
|
||
|
-
|
||
|
/*
|
||
|
* init_ipi_lock : Initialize IPI locks.
|
||
|
*/
|
||
|
@@ -629,4 +631,3 @@ static void __init unmap_cpu_to_physid(i
|
||
|
physid_2_cpu[phys_id] = -1;
|
||
|
cpu_2_physid[cpu_id] = -1;
|
||
|
}
|
||
|
-
|
||
|
diff --git a/arch/m32r/lib/Makefile b/arch/m32r/lib/Makefile
|
||
|
index e632d10..d16b4e4 100644
|
||
|
--- a/arch/m32r/lib/Makefile
|
||
|
+++ b/arch/m32r/lib/Makefile
|
||
|
@@ -2,6 +2,6 @@
|
||
|
# Makefile for M32R-specific library files..
|
||
|
#
|
||
|
|
||
|
-lib-y := checksum.o ashxdi3.o memset.o memcpy.o getuser.o \
|
||
|
- putuser.o delay.o strlen.o usercopy.o csum_partial_copy.o
|
||
|
+lib-y := checksum.o ashxdi3.o memset.o memcpy.o \
|
||
|
+ delay.o strlen.o usercopy.o csum_partial_copy.o
|
||
|
|
||
|
diff --git a/arch/m32r/lib/getuser.S b/arch/m32r/lib/getuser.S
|
||
|
deleted file mode 100644
|
||
|
index 58a0db0..0000000
|
||
|
--- a/arch/m32r/lib/getuser.S
|
||
|
+++ /dev/null
|
||
|
@@ -1,88 +0,0 @@
|
||
|
-/*
|
||
|
- * __get_user functions.
|
||
|
- *
|
||
|
- * (C) Copyright 2001 Hirokazu Takata
|
||
|
- *
|
||
|
- * These functions have a non-standard call interface
|
||
|
- * to make them more efficient, especially as they
|
||
|
- * return an error value in addition to the "real"
|
||
|
- * return value.
|
||
|
- */
|
||
|
-
|
||
|
-#include <linux/config.h>
|
||
|
-
|
||
|
-/*
|
||
|
- * __get_user_X
|
||
|
- *
|
||
|
- * Inputs: r0 contains the address
|
||
|
- *
|
||
|
- * Outputs: r0 is error code (0 or -EFAULT)
|
||
|
- * r1 contains zero-extended value
|
||
|
- *
|
||
|
- * These functions should not modify any other registers,
|
||
|
- * as they get called from within inline assembly.
|
||
|
- */
|
||
|
-
|
||
|
-#ifdef CONFIG_ISA_DUAL_ISSUE
|
||
|
-
|
||
|
- .text
|
||
|
- .balign 4
|
||
|
- .globl __get_user_1
|
||
|
-__get_user_1:
|
||
|
-1: ldub r1, @r0 || ldi r0, #0
|
||
|
- jmp r14
|
||
|
-
|
||
|
- .balign 4
|
||
|
- .globl __get_user_2
|
||
|
-__get_user_2:
|
||
|
-2: lduh r1, @r0 || ldi r0, #0
|
||
|
- jmp r14
|
||
|
-
|
||
|
- .balign 4
|
||
|
- .globl __get_user_4
|
||
|
-__get_user_4:
|
||
|
-3: ld r1, @r0 || ldi r0, #0
|
||
|
- jmp r14
|
||
|
-
|
||
|
-bad_get_user:
|
||
|
- ldi r1, #0 || ldi r0, #-14
|
||
|
- jmp r14
|
||
|
-
|
||
|
-#else /* not CONFIG_ISA_DUAL_ISSUE */
|
||
|
-
|
||
|
- .text
|
||
|
- .balign 4
|
||
|
- .globl __get_user_1
|
||
|
-__get_user_1:
|
||
|
-1: ldub r1, @r0
|
||
|
- ldi r0, #0
|
||
|
- jmp r14
|
||
|
-
|
||
|
- .balign 4
|
||
|
- .globl __get_user_2
|
||
|
-__get_user_2:
|
||
|
-2: lduh r1, @r0
|
||
|
- ldi r0, #0
|
||
|
- jmp r14
|
||
|
-
|
||
|
- .balign 4
|
||
|
- .globl __get_user_4
|
||
|
-__get_user_4:
|
||
|
-3: ld r1, @r0
|
||
|
- ldi r0, #0
|
||
|
- jmp r14
|
||
|
-
|
||
|
-bad_get_user:
|
||
|
- ldi r1, #0
|
||
|
- ldi r0, #-14
|
||
|
- jmp r14
|
||
|
-
|
||
|
-#endif /* not CONFIG_ISA_DUAL_ISSUE */
|
||
|
-
|
||
|
-.section __ex_table,"a"
|
||
|
- .long 1b,bad_get_user
|
||
|
- .long 2b,bad_get_user
|
||
|
- .long 3b,bad_get_user
|
||
|
-.previous
|
||
|
-
|
||
|
- .end
|
||
|
diff --git a/arch/m32r/lib/putuser.S b/arch/m32r/lib/putuser.S
|
||
|
deleted file mode 100644
|
||
|
index 218154c..0000000
|
||
|
--- a/arch/m32r/lib/putuser.S
|
||
|
+++ /dev/null
|
||
|
@@ -1,84 +0,0 @@
|
||
|
-/*
|
||
|
- * __put_user functions.
|
||
|
- *
|
||
|
- * (C) Copyright 1998 Linus Torvalds
|
||
|
- * (C) Copyright 2001 Hirokazu Takata
|
||
|
- *
|
||
|
- * These functions have a non-standard call interface
|
||
|
- * to make them more efficient.
|
||
|
- */
|
||
|
-
|
||
|
-#include <linux/config.h>
|
||
|
-
|
||
|
-/*
|
||
|
- * __put_user_X
|
||
|
- *
|
||
|
- * Inputs: r0 contains the address
|
||
|
- * r1 contains the value
|
||
|
- *
|
||
|
- * Outputs: r0 is error code (0 or -EFAULT)
|
||
|
- * r1 is corrupted (will contain "current_task").
|
||
|
- *
|
||
|
- * These functions should not modify any other registers,
|
||
|
- * as they get called from within inline assembly.
|
||
|
- */
|
||
|
-
|
||
|
-#ifdef CONFIG_ISA_DUAL_ISSUE
|
||
|
-
|
||
|
- .text
|
||
|
- .balign 4
|
||
|
- .globl __put_user_1
|
||
|
-__put_user_1:
|
||
|
-1: stb r1, @r0 || ldi r0, #0
|
||
|
- jmp r14
|
||
|
-
|
||
|
- .balign 4
|
||
|
- .globl __put_user_2
|
||
|
-__put_user_2:
|
||
|
-2: sth r1, @r0 || ldi r0, #0
|
||
|
- jmp r14
|
||
|
-
|
||
|
- .balign 4
|
||
|
- .globl __put_user_4
|
||
|
-__put_user_4:
|
||
|
-3: st r1, @r0 || ldi r0, #0
|
||
|
- jmp r14
|
||
|
-
|
||
|
-bad_put_user:
|
||
|
- ldi r0, #-14 || jmp r14
|
||
|
-
|
||
|
-#else /* not CONFIG_ISA_DUAL_ISSUE */
|
||
|
-
|
||
|
- .text
|
||
|
- .balign 4
|
||
|
- .globl __put_user_1
|
||
|
-__put_user_1:
|
||
|
-1: stb r1, @r0
|
||
|
- ldi r0, #0
|
||
|
- jmp r14
|
||
|
-
|
||
|
- .balign 4
|
||
|
- .globl __put_user_2
|
||
|
-__put_user_2:
|
||
|
-2: sth r1, @r0
|
||
|
- ldi r0, #0
|
||
|
- jmp r14
|
||
|
-
|
||
|
- .balign 4
|
||
|
- .globl __put_user_4
|
||
|
-__put_user_4:
|
||
|
-3: st r1, @r0
|
||
|
- ldi r0, #0
|
||
|
- jmp r14
|
||
|
-
|
||
|
-bad_put_user:
|
||
|
- ldi r0, #-14
|
||
|
- jmp r14
|
||
|
-
|
||
|
-#endif /* not CONFIG_ISA_DUAL_ISSUE */
|
||
|
-
|
||
|
-.section __ex_table,"a"
|
||
|
- .long 1b,bad_put_user
|
||
|
- .long 2b,bad_put_user
|
||
|
- .long 3b,bad_put_user
|
||
|
-.previous
|
||
|
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
|
||
|
index f96c49b..abd758f 100644
|
||
|
--- a/arch/powerpc/kernel/setup_64.c
|
||
|
+++ b/arch/powerpc/kernel/setup_64.c
|
||
|
@@ -256,12 +256,10 @@ void __init early_setup(unsigned long dt
|
||
|
/*
|
||
|
* Initialize stab / SLB management except on iSeries
|
||
|
*/
|
||
|
- if (!firmware_has_feature(FW_FEATURE_ISERIES)) {
|
||
|
- if (cpu_has_feature(CPU_FTR_SLB))
|
||
|
- slb_initialize();
|
||
|
- else
|
||
|
- stab_initialize(lpaca->stab_real);
|
||
|
- }
|
||
|
+ if (cpu_has_feature(CPU_FTR_SLB))
|
||
|
+ slb_initialize();
|
||
|
+ else if (!firmware_has_feature(FW_FEATURE_ISERIES))
|
||
|
+ stab_initialize(lpaca->stab_real);
|
||
|
|
||
|
DBG(" <- early_setup()\n");
|
||
|
}
|
||
|
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
|
||
|
index 4324f8a..096dfdc 100644
|
||
|
--- a/arch/powerpc/kernel/signal_64.c
|
||
|
+++ b/arch/powerpc/kernel/signal_64.c
|
||
|
@@ -213,7 +213,7 @@ static inline void __user * get_sigframe
|
||
|
/* Default to using normal stack */
|
||
|
newsp = regs->gpr[1];
|
||
|
|
||
|
- if (ka->sa.sa_flags & SA_ONSTACK) {
|
||
|
+ if ((ka->sa.sa_flags & SA_ONSTACK) && current->sas_ss_size) {
|
||
|
if (! on_sig_stack(regs->gpr[1]))
|
||
|
newsp = (current->sas_ss_sp + current->sas_ss_size);
|
||
|
}
|
||
|
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
|
||
|
index c149d57..71552e1 100644
|
||
|
--- a/drivers/block/cciss.c
|
||
|
+++ b/drivers/block/cciss.c
|
||
|
@@ -1181,6 +1181,53 @@ static int revalidate_allvol(ctlr_info_t
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
+static inline void complete_buffers(struct bio *bio, int status)
|
||
|
+{
|
||
|
+ while (bio) {
|
||
|
+ struct bio *xbh = bio->bi_next;
|
||
|
+ int nr_sectors = bio_sectors(bio);
|
||
|
+
|
||
|
+ bio->bi_next = NULL;
|
||
|
+ blk_finished_io(len);
|
||
|
+ bio_endio(bio, nr_sectors << 9, status ? 0 : -EIO);
|
||
|
+ bio = xbh;
|
||
|
+ }
|
||
|
+
|
||
|
+}
|
||
|
+
|
||
|
+static void cciss_softirq_done(struct request *rq)
|
||
|
+{
|
||
|
+ CommandList_struct *cmd = rq->completion_data;
|
||
|
+ ctlr_info_t *h = hba[cmd->ctlr];
|
||
|
+ unsigned long flags;
|
||
|
+ u64bit temp64;
|
||
|
+ int i, ddir;
|
||
|
+
|
||
|
+ if (cmd->Request.Type.Direction == XFER_READ)
|
||
|
+ ddir = PCI_DMA_FROMDEVICE;
|
||
|
+ else
|
||
|
+ ddir = PCI_DMA_TODEVICE;
|
||
|
+
|
||
|
+ /* command did not need to be retried */
|
||
|
+ /* unmap the DMA mapping for all the scatter gather elements */
|
||
|
+ for(i=0; i<cmd->Header.SGList; i++) {
|
||
|
+ temp64.val32.lower = cmd->SG[i].Addr.lower;
|
||
|
+ temp64.val32.upper = cmd->SG[i].Addr.upper;
|
||
|
+ pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir);
|
||
|
+ }
|
||
|
+
|
||
|
+ complete_buffers(rq->bio, rq->errors);
|
||
|
+
|
||
|
+#ifdef CCISS_DEBUG
|
||
|
+ printk("Done with %p\n", rq);
|
||
|
+#endif /* CCISS_DEBUG */
|
||
|
+
|
||
|
+ spin_lock_irqsave(&h->lock, flags);
|
||
|
+ end_that_request_last(rq, rq->errors);
|
||
|
+ cmd_free(h, cmd,1);
|
||
|
+ spin_unlock_irqrestore(&h->lock, flags);
|
||
|
+}
|
||
|
+
|
||
|
/* This function will check the usage_count of the drive to be updated/added.
|
||
|
* If the usage_count is zero then the drive information will be updated and
|
||
|
* the disk will be re-registered with the kernel. If not then it will be
|
||
|
@@ -1249,6 +1296,8 @@ static void cciss_update_drive_info(int
|
||
|
|
||
|
blk_queue_max_sectors(disk->queue, 512);
|
||
|
|
||
|
+ blk_queue_softirq_done(disk->queue, cciss_softirq_done);
|
||
|
+
|
||
|
disk->queue->queuedata = hba[ctlr];
|
||
|
|
||
|
blk_queue_hardsect_size(disk->queue,
|
||
|
@@ -2148,20 +2197,6 @@ static void start_io( ctlr_info_t *h)
|
||
|
addQ (&(h->cmpQ), c);
|
||
|
}
|
||
|
}
|
||
|
-
|
||
|
-static inline void complete_buffers(struct bio *bio, int status)
|
||
|
-{
|
||
|
- while (bio) {
|
||
|
- struct bio *xbh = bio->bi_next;
|
||
|
- int nr_sectors = bio_sectors(bio);
|
||
|
-
|
||
|
- bio->bi_next = NULL;
|
||
|
- blk_finished_io(len);
|
||
|
- bio_endio(bio, nr_sectors << 9, status ? 0 : -EIO);
|
||
|
- bio = xbh;
|
||
|
- }
|
||
|
-
|
||
|
-}
|
||
|
/* Assumes that CCISS_LOCK(h->ctlr) is held. */
|
||
|
/* Zeros out the error record and then resends the command back */
|
||
|
/* to the controller */
|
||
|
@@ -2179,39 +2214,6 @@ static inline void resend_cciss_cmd( ctl
|
||
|
start_io(h);
|
||
|
}
|
||
|
|
||
|
-static void cciss_softirq_done(struct request *rq)
|
||
|
-{
|
||
|
- CommandList_struct *cmd = rq->completion_data;
|
||
|
- ctlr_info_t *h = hba[cmd->ctlr];
|
||
|
- unsigned long flags;
|
||
|
- u64bit temp64;
|
||
|
- int i, ddir;
|
||
|
-
|
||
|
- if (cmd->Request.Type.Direction == XFER_READ)
|
||
|
- ddir = PCI_DMA_FROMDEVICE;
|
||
|
- else
|
||
|
- ddir = PCI_DMA_TODEVICE;
|
||
|
-
|
||
|
- /* command did not need to be retried */
|
||
|
- /* unmap the DMA mapping for all the scatter gather elements */
|
||
|
- for(i=0; i<cmd->Header.SGList; i++) {
|
||
|
- temp64.val32.lower = cmd->SG[i].Addr.lower;
|
||
|
- temp64.val32.upper = cmd->SG[i].Addr.upper;
|
||
|
- pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir);
|
||
|
- }
|
||
|
-
|
||
|
- complete_buffers(rq->bio, rq->errors);
|
||
|
-
|
||
|
-#ifdef CCISS_DEBUG
|
||
|
- printk("Done with %p\n", rq);
|
||
|
-#endif /* CCISS_DEBUG */
|
||
|
-
|
||
|
- spin_lock_irqsave(&h->lock, flags);
|
||
|
- end_that_request_last(rq, rq->errors);
|
||
|
- cmd_free(h, cmd,1);
|
||
|
- spin_unlock_irqrestore(&h->lock, flags);
|
||
|
-}
|
||
|
-
|
||
|
/* checks the status of the job and calls complete buffers to mark all
|
||
|
* buffers for the completed job. Note that this function does not need
|
||
|
* to hold the hba/queue lock.
|
||
|
diff --git a/drivers/char/tlclk.c b/drivers/char/tlclk.c
|
||
|
index 2546637..f58ad7f 100644
|
||
|
--- a/drivers/char/tlclk.c
|
||
|
+++ b/drivers/char/tlclk.c
|
||
|
@@ -327,7 +327,7 @@ static ssize_t store_received_ref_clk3a(
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(received_ref_clk3a, S_IWUGO, NULL,
|
||
|
+static DEVICE_ATTR(received_ref_clk3a, (S_IWUSR|S_IWGRP), NULL,
|
||
|
store_received_ref_clk3a);
|
||
|
|
||
|
|
||
|
@@ -349,7 +349,7 @@ static ssize_t store_received_ref_clk3b(
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(received_ref_clk3b, S_IWUGO, NULL,
|
||
|
+static DEVICE_ATTR(received_ref_clk3b, (S_IWUSR|S_IWGRP), NULL,
|
||
|
store_received_ref_clk3b);
|
||
|
|
||
|
|
||
|
@@ -371,7 +371,7 @@ static ssize_t store_enable_clk3b_output
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(enable_clk3b_output, S_IWUGO, NULL,
|
||
|
+static DEVICE_ATTR(enable_clk3b_output, (S_IWUSR|S_IWGRP), NULL,
|
||
|
store_enable_clk3b_output);
|
||
|
|
||
|
static ssize_t store_enable_clk3a_output(struct device *d,
|
||
|
@@ -392,7 +392,7 @@ static ssize_t store_enable_clk3a_output
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(enable_clk3a_output, S_IWUGO, NULL,
|
||
|
+static DEVICE_ATTR(enable_clk3a_output, (S_IWUSR|S_IWGRP), NULL,
|
||
|
store_enable_clk3a_output);
|
||
|
|
||
|
static ssize_t store_enable_clkb1_output(struct device *d,
|
||
|
@@ -413,7 +413,7 @@ static ssize_t store_enable_clkb1_output
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(enable_clkb1_output, S_IWUGO, NULL,
|
||
|
+static DEVICE_ATTR(enable_clkb1_output, (S_IWUSR|S_IWGRP), NULL,
|
||
|
store_enable_clkb1_output);
|
||
|
|
||
|
|
||
|
@@ -435,7 +435,7 @@ static ssize_t store_enable_clka1_output
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(enable_clka1_output, S_IWUGO, NULL,
|
||
|
+static DEVICE_ATTR(enable_clka1_output, (S_IWUSR|S_IWGRP), NULL,
|
||
|
store_enable_clka1_output);
|
||
|
|
||
|
static ssize_t store_enable_clkb0_output(struct device *d,
|
||
|
@@ -456,7 +456,7 @@ static ssize_t store_enable_clkb0_output
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(enable_clkb0_output, S_IWUGO, NULL,
|
||
|
+static DEVICE_ATTR(enable_clkb0_output, (S_IWUSR|S_IWGRP), NULL,
|
||
|
store_enable_clkb0_output);
|
||
|
|
||
|
static ssize_t store_enable_clka0_output(struct device *d,
|
||
|
@@ -477,7 +477,7 @@ static ssize_t store_enable_clka0_output
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(enable_clka0_output, S_IWUGO, NULL,
|
||
|
+static DEVICE_ATTR(enable_clka0_output, (S_IWUSR|S_IWGRP), NULL,
|
||
|
store_enable_clka0_output);
|
||
|
|
||
|
static ssize_t store_select_amcb2_transmit_clock(struct device *d,
|
||
|
@@ -519,7 +519,7 @@ static ssize_t store_select_amcb2_transm
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(select_amcb2_transmit_clock, S_IWUGO, NULL,
|
||
|
+static DEVICE_ATTR(select_amcb2_transmit_clock, (S_IWUSR|S_IWGRP), NULL,
|
||
|
store_select_amcb2_transmit_clock);
|
||
|
|
||
|
static ssize_t store_select_amcb1_transmit_clock(struct device *d,
|
||
|
@@ -560,7 +560,7 @@ static ssize_t store_select_amcb1_transm
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(select_amcb1_transmit_clock, S_IWUGO, NULL,
|
||
|
+static DEVICE_ATTR(select_amcb1_transmit_clock, (S_IWUSR|S_IWGRP), NULL,
|
||
|
store_select_amcb1_transmit_clock);
|
||
|
|
||
|
static ssize_t store_select_redundant_clock(struct device *d,
|
||
|
@@ -581,7 +581,7 @@ static ssize_t store_select_redundant_cl
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(select_redundant_clock, S_IWUGO, NULL,
|
||
|
+static DEVICE_ATTR(select_redundant_clock, (S_IWUSR|S_IWGRP), NULL,
|
||
|
store_select_redundant_clock);
|
||
|
|
||
|
static ssize_t store_select_ref_frequency(struct device *d,
|
||
|
@@ -602,7 +602,7 @@ static ssize_t store_select_ref_frequenc
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(select_ref_frequency, S_IWUGO, NULL,
|
||
|
+static DEVICE_ATTR(select_ref_frequency, (S_IWUSR|S_IWGRP), NULL,
|
||
|
store_select_ref_frequency);
|
||
|
|
||
|
static ssize_t store_filter_select(struct device *d,
|
||
|
@@ -623,7 +623,7 @@ static ssize_t store_filter_select(struc
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(filter_select, S_IWUGO, NULL, store_filter_select);
|
||
|
+static DEVICE_ATTR(filter_select, (S_IWUSR|S_IWGRP), NULL, store_filter_select);
|
||
|
|
||
|
static ssize_t store_hardware_switching_mode(struct device *d,
|
||
|
struct device_attribute *attr, const char *buf, size_t count)
|
||
|
@@ -643,7 +643,7 @@ static ssize_t store_hardware_switching_
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(hardware_switching_mode, S_IWUGO, NULL,
|
||
|
+static DEVICE_ATTR(hardware_switching_mode, (S_IWUSR|S_IWGRP), NULL,
|
||
|
store_hardware_switching_mode);
|
||
|
|
||
|
static ssize_t store_hardware_switching(struct device *d,
|
||
|
@@ -664,7 +664,7 @@ static ssize_t store_hardware_switching(
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(hardware_switching, S_IWUGO, NULL,
|
||
|
+static DEVICE_ATTR(hardware_switching, (S_IWUSR|S_IWGRP), NULL,
|
||
|
store_hardware_switching);
|
||
|
|
||
|
static ssize_t store_refalign (struct device *d,
|
||
|
@@ -684,7 +684,7 @@ static ssize_t store_refalign (struct de
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(refalign, S_IWUGO, NULL, store_refalign);
|
||
|
+static DEVICE_ATTR(refalign, (S_IWUSR|S_IWGRP), NULL, store_refalign);
|
||
|
|
||
|
static ssize_t store_mode_select (struct device *d,
|
||
|
struct device_attribute *attr, const char *buf, size_t count)
|
||
|
@@ -704,7 +704,7 @@ static ssize_t store_mode_select (struct
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(mode_select, S_IWUGO, NULL, store_mode_select);
|
||
|
+static DEVICE_ATTR(mode_select, (S_IWUSR|S_IWGRP), NULL, store_mode_select);
|
||
|
|
||
|
static ssize_t store_reset (struct device *d,
|
||
|
struct device_attribute *attr, const char *buf, size_t count)
|
||
|
@@ -724,7 +724,7 @@ static ssize_t store_reset (struct devic
|
||
|
return strnlen(buf, count);
|
||
|
}
|
||
|
|
||
|
-static DEVICE_ATTR(reset, S_IWUGO, NULL, store_reset);
|
||
|
+static DEVICE_ATTR(reset, (S_IWUSR|S_IWGRP), NULL, store_reset);
|
||
|
|
||
|
static struct attribute *tlclk_sysfs_entries[] = {
|
||
|
&dev_attr_current_ref.attr,
|
||
|
diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig
|
||
|
index 52f3eb4..7ecdb1e 100644
|
||
|
--- a/drivers/edac/Kconfig
|
||
|
+++ b/drivers/edac/Kconfig
|
||
|
@@ -71,7 +71,7 @@ config EDAC_E7XXX
|
||
|
|
||
|
config EDAC_E752X
|
||
|
tristate "Intel e752x (e7520, e7525, e7320)"
|
||
|
- depends on EDAC_MM_EDAC && PCI
|
||
|
+ depends on EDAC_MM_EDAC && PCI && HOTPLUG
|
||
|
help
|
||
|
Support for error detection and correction on the Intel
|
||
|
E7520, E7525, E7320 server chipsets.
|
||
|
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
|
||
|
index 7326036..0618cd5 100644
|
||
|
--- a/drivers/net/sky2.c
|
||
|
+++ b/drivers/net/sky2.c
|
||
|
@@ -579,8 +579,8 @@ static void sky2_mac_init(struct sky2_hw
|
||
|
reg = gma_read16(hw, port, GM_PHY_ADDR);
|
||
|
gma_write16(hw, port, GM_PHY_ADDR, reg | GM_PAR_MIB_CLR);
|
||
|
|
||
|
- for (i = 0; i < GM_MIB_CNT_SIZE; i++)
|
||
|
- gma_read16(hw, port, GM_MIB_CNT_BASE + 8 * i);
|
||
|
+ for (i = GM_MIB_CNT_BASE; i <= GM_MIB_CNT_END; i += 4)
|
||
|
+ gma_read16(hw, port, i);
|
||
|
gma_write16(hw, port, GM_PHY_ADDR, reg);
|
||
|
|
||
|
/* transmit control */
|
||
|
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h
|
||
|
index dce955c..c91e0a4 100644
|
||
|
--- a/drivers/net/sky2.h
|
||
|
+++ b/drivers/net/sky2.h
|
||
|
@@ -1380,6 +1380,7 @@ enum {
|
||
|
/* MIB Counters */
|
||
|
#define GM_MIB_CNT_BASE 0x0100 /* Base Address of MIB Counters */
|
||
|
#define GM_MIB_CNT_SIZE 44 /* Number of MIB Counters */
|
||
|
+#define GM_MIB_CNT_END 0x025C /* Last MIB counter */
|
||
|
|
||
|
/*
|
||
|
* MIB Counters base address definitions (low word) -
|
||
|
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c
|
||
|
index 167f8ec..8023bb7 100644
|
||
|
--- a/drivers/usb/serial/console.c
|
||
|
+++ b/drivers/usb/serial/console.c
|
||
|
@@ -54,7 +54,7 @@ static struct console usbcons;
|
||
|
* serial.c code, except that the specifier is "ttyUSB" instead
|
||
|
* of "ttyS".
|
||
|
*/
|
||
|
-static int __init usb_console_setup(struct console *co, char *options)
|
||
|
+static int usb_console_setup(struct console *co, char *options)
|
||
|
{
|
||
|
struct usbcons_info *info = &usbcons_info;
|
||
|
int baud = 9600;
|
||
|
diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig
|
||
|
index 92be101..be9eec2 100644
|
||
|
--- a/drivers/usb/storage/Kconfig
|
||
|
+++ b/drivers/usb/storage/Kconfig
|
||
|
@@ -48,7 +48,8 @@ config USB_STORAGE_FREECOM
|
||
|
|
||
|
config USB_STORAGE_ISD200
|
||
|
bool "ISD-200 USB/ATA Bridge support"
|
||
|
- depends on USB_STORAGE && BLK_DEV_IDE
|
||
|
+ depends on USB_STORAGE
|
||
|
+ depends on BLK_DEV_IDE=y || BLK_DEV_IDE=USB_STORAGE
|
||
|
---help---
|
||
|
Say Y here if you want to use USB Mass Store devices based
|
||
|
on the In-Systems Design ISD-200 USB/ATA bridge.
|
||
|
diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c
|
||
|
index a2c2485..3f5e38c 100644
|
||
|
--- a/fs/cifs/cifsencrypt.c
|
||
|
+++ b/fs/cifs/cifsencrypt.c
|
||
|
@@ -56,9 +56,6 @@ int cifs_sign_smb(struct smb_hdr * cifs_
|
||
|
int rc = 0;
|
||
|
char smb_signature[20];
|
||
|
|
||
|
- /* BB remember to initialize sequence number elsewhere and initialize mac_signing key elsewhere BB */
|
||
|
- /* BB remember to add code to save expected sequence number in midQ entry BB */
|
||
|
-
|
||
|
if((cifs_pdu == NULL) || (server == NULL))
|
||
|
return -EINVAL;
|
||
|
|
||
|
@@ -85,20 +82,33 @@ int cifs_sign_smb(struct smb_hdr * cifs_
|
||
|
static int cifs_calc_signature2(const struct kvec * iov, int n_vec,
|
||
|
const char * key, char * signature)
|
||
|
{
|
||
|
- struct MD5Context context;
|
||
|
-
|
||
|
- if((iov == NULL) || (signature == NULL))
|
||
|
- return -EINVAL;
|
||
|
+ struct MD5Context context;
|
||
|
+ int i;
|
||
|
|
||
|
- MD5Init(&context);
|
||
|
- MD5Update(&context,key,CIFS_SESSION_KEY_SIZE+16);
|
||
|
+ if((iov == NULL) || (signature == NULL))
|
||
|
+ return -EINVAL;
|
||
|
|
||
|
-/* MD5Update(&context,cifs_pdu->Protocol,cifs_pdu->smb_buf_length); */ /* BB FIXME BB */
|
||
|
+ MD5Init(&context);
|
||
|
+ MD5Update(&context,key,CIFS_SESSION_KEY_SIZE+16);
|
||
|
+ for(i=0;i<n_vec;i++) {
|
||
|
+ if(iov[i].iov_base == NULL) {
|
||
|
+ cERROR(1,("null iovec entry"));
|
||
|
+ return -EIO;
|
||
|
+ } else if(iov[i].iov_len == 0)
|
||
|
+ break; /* bail out if we are sent nothing to sign */
|
||
|
+ /* The first entry includes a length field (which does not get
|
||
|
+ signed that occupies the first 4 bytes before the header */
|
||
|
+ if(i==0) {
|
||
|
+ if (iov[0].iov_len <= 8 ) /* cmd field at offset 9 */
|
||
|
+ break; /* nothing to sign or corrupt header */
|
||
|
+ MD5Update(&context,iov[0].iov_base+4, iov[0].iov_len-4);
|
||
|
+ } else
|
||
|
+ MD5Update(&context,iov[i].iov_base, iov[i].iov_len);
|
||
|
+ }
|
||
|
|
||
|
- MD5Final(signature,&context);
|
||
|
+ MD5Final(signature,&context);
|
||
|
|
||
|
- return -EOPNOTSUPP;
|
||
|
-/* return 0; */
|
||
|
+ return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
diff --git a/fs/ext3/resize.c b/fs/ext3/resize.c
|
||
|
index 1041dab..14f5f6e 100644
|
||
|
--- a/fs/ext3/resize.c
|
||
|
+++ b/fs/ext3/resize.c
|
||
|
@@ -974,6 +974,7 @@ int ext3_group_extend(struct super_block
|
||
|
if (o_blocks_count != le32_to_cpu(es->s_blocks_count)) {
|
||
|
ext3_warning(sb, __FUNCTION__,
|
||
|
"multiple resizers run on filesystem!");
|
||
|
+ unlock_super(sb);
|
||
|
err = -EBUSY;
|
||
|
goto exit_put;
|
||
|
}
|
||
|
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
|
||
|
index 6f05379..ce93cf9 100644
|
||
|
--- a/fs/fuse/file.c
|
||
|
+++ b/fs/fuse/file.c
|
||
|
@@ -397,8 +397,12 @@ static int fuse_readpages(struct file *f
|
||
|
return -EINTR;
|
||
|
|
||
|
err = read_cache_pages(mapping, pages, fuse_readpages_fill, &data);
|
||
|
- if (!err)
|
||
|
- fuse_send_readpages(data.req, file, inode);
|
||
|
+ if (!err) {
|
||
|
+ if (data.req->num_pages)
|
||
|
+ fuse_send_readpages(data.req, file, inode);
|
||
|
+ else
|
||
|
+ fuse_put_request(fc, data.req);
|
||
|
+ }
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
diff --git a/fs/partitions/check.c b/fs/partitions/check.c
|
||
|
index f924f45..2ef03aa 100644
|
||
|
--- a/fs/partitions/check.c
|
||
|
+++ b/fs/partitions/check.c
|
||
|
@@ -345,6 +345,7 @@ static char *make_block_name(struct gend
|
||
|
char *name;
|
||
|
static char *block_str = "block:";
|
||
|
int size;
|
||
|
+ char *s;
|
||
|
|
||
|
size = strlen(block_str) + strlen(disk->disk_name) + 1;
|
||
|
name = kmalloc(size, GFP_KERNEL);
|
||
|
@@ -352,6 +353,10 @@ static char *make_block_name(struct gend
|
||
|
return NULL;
|
||
|
strcpy(name, block_str);
|
||
|
strcat(name, disk->disk_name);
|
||
|
+ /* ewww... some of these buggers have / in name... */
|
||
|
+ s = strchr(name, '/');
|
||
|
+ if (s)
|
||
|
+ *s = '!';
|
||
|
return name;
|
||
|
}
|
||
|
|
||
|
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c
|
||
|
index d7f6f2d..43808e2 100644
|
||
|
--- a/fs/xfs/linux-2.6/xfs_iops.c
|
||
|
+++ b/fs/xfs/linux-2.6/xfs_iops.c
|
||
|
@@ -673,8 +673,7 @@ linvfs_setattr(
|
||
|
if (ia_valid & ATTR_ATIME) {
|
||
|
vattr.va_mask |= XFS_AT_ATIME;
|
||
|
vattr.va_atime = attr->ia_atime;
|
||
|
- if (ia_valid & ATTR_ATIME_SET)
|
||
|
- inode->i_atime = attr->ia_atime;
|
||
|
+ inode->i_atime = attr->ia_atime;
|
||
|
}
|
||
|
if (ia_valid & ATTR_MTIME) {
|
||
|
vattr.va_mask |= XFS_AT_MTIME;
|
||
|
diff --git a/include/asm-m32r/smp.h b/include/asm-m32r/smp.h
|
||
|
index 7885b7d..1184293 100644
|
||
|
--- a/include/asm-m32r/smp.h
|
||
|
+++ b/include/asm-m32r/smp.h
|
||
|
@@ -67,7 +67,8 @@ extern volatile int cpu_2_physid[NR_CPUS
|
||
|
#define raw_smp_processor_id() (current_thread_info()->cpu)
|
||
|
|
||
|
extern cpumask_t cpu_callout_map;
|
||
|
-#define cpu_possible_map cpu_callout_map
|
||
|
+extern cpumask_t cpu_possible_map;
|
||
|
+extern cpumask_t cpu_present_map;
|
||
|
|
||
|
static __inline__ int hard_smp_processor_id(void)
|
||
|
{
|
||
|
diff --git a/include/asm-m32r/uaccess.h b/include/asm-m32r/uaccess.h
|
||
|
index e8ae619..819cc28 100644
|
||
|
--- a/include/asm-m32r/uaccess.h
|
||
|
+++ b/include/asm-m32r/uaccess.h
|
||
|
@@ -5,17 +5,9 @@
|
||
|
* linux/include/asm-m32r/uaccess.h
|
||
|
*
|
||
|
* M32R version.
|
||
|
- * Copyright (C) 2004 Hirokazu Takata <takata at linux-m32r.org>
|
||
|
+ * Copyright (C) 2004, 2006 Hirokazu Takata <takata at linux-m32r.org>
|
||
|
*/
|
||
|
|
||
|
-#undef UACCESS_DEBUG
|
||
|
-
|
||
|
-#ifdef UACCESS_DEBUG
|
||
|
-#define UAPRINTK(args...) printk(args)
|
||
|
-#else
|
||
|
-#define UAPRINTK(args...)
|
||
|
-#endif /* UACCESS_DEBUG */
|
||
|
-
|
||
|
/*
|
||
|
* User space memory access functions
|
||
|
*/
|
||
|
@@ -38,27 +30,29 @@
|
||
|
#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) })
|
||
|
|
||
|
#ifdef CONFIG_MMU
|
||
|
+
|
||
|
#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF)
|
||
|
#define USER_DS MAKE_MM_SEG(PAGE_OFFSET)
|
||
|
-#else
|
||
|
-#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF)
|
||
|
-#define USER_DS MAKE_MM_SEG(0xFFFFFFFF)
|
||
|
-#endif /* CONFIG_MMU */
|
||
|
-
|
||
|
#define get_ds() (KERNEL_DS)
|
||
|
-#ifdef CONFIG_MMU
|
||
|
#define get_fs() (current_thread_info()->addr_limit)
|
||
|
#define set_fs(x) (current_thread_info()->addr_limit = (x))
|
||
|
-#else
|
||
|
+
|
||
|
+#else /* not CONFIG_MMU */
|
||
|
+
|
||
|
+#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF)
|
||
|
+#define USER_DS MAKE_MM_SEG(0xFFFFFFFF)
|
||
|
+#define get_ds() (KERNEL_DS)
|
||
|
+
|
||
|
static inline mm_segment_t get_fs(void)
|
||
|
{
|
||
|
- return USER_DS;
|
||
|
+ return USER_DS;
|
||
|
}
|
||
|
|
||
|
static inline void set_fs(mm_segment_t s)
|
||
|
{
|
||
|
}
|
||
|
-#endif /* CONFIG_MMU */
|
||
|
+
|
||
|
+#endif /* not CONFIG_MMU */
|
||
|
|
||
|
#define segment_eq(a,b) ((a).seg == (b).seg)
|
||
|
|
||
|
@@ -83,9 +77,9 @@ static inline void set_fs(mm_segment_t s
|
||
|
" subx %0, %0\n" \
|
||
|
" cmpu %4, %1\n" \
|
||
|
" subx %0, %5\n" \
|
||
|
- : "=&r"(flag), "=r"(sum) \
|
||
|
- : "1"(addr), "r"((int)(size)), \
|
||
|
- "r"(current_thread_info()->addr_limit.seg), "r"(0) \
|
||
|
+ : "=&r" (flag), "=r" (sum) \
|
||
|
+ : "1" (addr), "r" ((int)(size)), \
|
||
|
+ "r" (current_thread_info()->addr_limit.seg), "r" (0) \
|
||
|
: "cbit" ); \
|
||
|
flag; })
|
||
|
|
||
|
@@ -113,10 +107,10 @@ static inline void set_fs(mm_segment_t s
|
||
|
#else
|
||
|
static inline int access_ok(int type, const void *addr, unsigned long size)
|
||
|
{
|
||
|
- extern unsigned long memory_start, memory_end;
|
||
|
- unsigned long val = (unsigned long)addr;
|
||
|
+ extern unsigned long memory_start, memory_end;
|
||
|
+ unsigned long val = (unsigned long)addr;
|
||
|
|
||
|
- return ((val >= memory_start) && ((val + size) < memory_end));
|
||
|
+ return ((val >= memory_start) && ((val + size) < memory_end));
|
||
|
}
|
||
|
#endif /* CONFIG_MMU */
|
||
|
|
||
|
@@ -155,39 +149,6 @@ extern int fixup_exception(struct pt_reg
|
||
|
* accesses to the same area of user memory).
|
||
|
*/
|
||
|
|
||
|
-extern void __get_user_1(void);
|
||
|
-extern void __get_user_2(void);
|
||
|
-extern void __get_user_4(void);
|
||
|
-
|
||
|
-#ifndef MODULE
|
||
|
-#define __get_user_x(size,ret,x,ptr) \
|
||
|
- __asm__ __volatile__( \
|
||
|
- " mv r0, %0\n" \
|
||
|
- " mv r1, %1\n" \
|
||
|
- " bl __get_user_" #size "\n" \
|
||
|
- " mv %0, r0\n" \
|
||
|
- " mv %1, r1\n" \
|
||
|
- : "=r"(ret), "=r"(x) \
|
||
|
- : "0"(ptr) \
|
||
|
- : "r0", "r1", "r14" )
|
||
|
-#else /* MODULE */
|
||
|
-/*
|
||
|
- * Use "jl" instead of "bl" for MODULE
|
||
|
- */
|
||
|
-#define __get_user_x(size,ret,x,ptr) \
|
||
|
- __asm__ __volatile__( \
|
||
|
- " mv r0, %0\n" \
|
||
|
- " mv r1, %1\n" \
|
||
|
- " seth lr, #high(__get_user_" #size ")\n" \
|
||
|
- " or3 lr, lr, #low(__get_user_" #size ")\n" \
|
||
|
- " jl lr\n" \
|
||
|
- " mv %0, r0\n" \
|
||
|
- " mv %1, r1\n" \
|
||
|
- : "=r"(ret), "=r"(x) \
|
||
|
- : "0"(ptr) \
|
||
|
- : "r0", "r1", "r14" )
|
||
|
-#endif
|
||
|
-
|
||
|
/* Careful: we have to cast the result to the type of the pointer for sign
|
||
|
reasons */
|
||
|
/**
|
||
|
@@ -208,20 +169,7 @@ extern void __get_user_4(void);
|
||
|
* On error, the variable @x is set to zero.
|
||
|
*/
|
||
|
#define get_user(x,ptr) \
|
||
|
-({ int __ret_gu; \
|
||
|
- unsigned long __val_gu; \
|
||
|
- __chk_user_ptr(ptr); \
|
||
|
- switch(sizeof (*(ptr))) { \
|
||
|
- case 1: __get_user_x(1,__ret_gu,__val_gu,ptr); break; \
|
||
|
- case 2: __get_user_x(2,__ret_gu,__val_gu,ptr); break; \
|
||
|
- case 4: __get_user_x(4,__ret_gu,__val_gu,ptr); break; \
|
||
|
- default: __get_user_x(X,__ret_gu,__val_gu,ptr); break; \
|
||
|
- } \
|
||
|
- (x) = (__typeof__(*(ptr)))__val_gu; \
|
||
|
- __ret_gu; \
|
||
|
-})
|
||
|
-
|
||
|
-extern void __put_user_bad(void);
|
||
|
+ __get_user_check((x),(ptr),sizeof(*(ptr)))
|
||
|
|
||
|
/**
|
||
|
* put_user: - Write a simple value into user space.
|
||
|
@@ -240,8 +188,7 @@ extern void __put_user_bad(void);
|
||
|
* Returns zero on success, or -EFAULT on error.
|
||
|
*/
|
||
|
#define put_user(x,ptr) \
|
||
|
- __put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
|
||
|
-
|
||
|
+ __put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
|
||
|
|
||
|
/**
|
||
|
* __get_user: - Get a simple variable from user space, with less checking.
|
||
|
@@ -264,8 +211,64 @@ extern void __put_user_bad(void);
|
||
|
* On error, the variable @x is set to zero.
|
||
|
*/
|
||
|
#define __get_user(x,ptr) \
|
||
|
- __get_user_nocheck((x),(ptr),sizeof(*(ptr)))
|
||
|
+ __get_user_nocheck((x),(ptr),sizeof(*(ptr)))
|
||
|
|
||
|
+#define __get_user_nocheck(x,ptr,size) \
|
||
|
+({ \
|
||
|
+ long __gu_err = 0; \
|
||
|
+ unsigned long __gu_val; \
|
||
|
+ might_sleep(); \
|
||
|
+ __get_user_size(__gu_val,(ptr),(size),__gu_err); \
|
||
|
+ (x) = (__typeof__(*(ptr)))__gu_val; \
|
||
|
+ __gu_err; \
|
||
|
+})
|
||
|
+
|
||
|
+#define __get_user_check(x,ptr,size) \
|
||
|
+({ \
|
||
|
+ long __gu_err = -EFAULT; \
|
||
|
+ unsigned long __gu_val = 0; \
|
||
|
+ const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
|
||
|
+ might_sleep(); \
|
||
|
+ if (access_ok(VERIFY_READ,__gu_addr,size)) \
|
||
|
+ __get_user_size(__gu_val,__gu_addr,(size),__gu_err); \
|
||
|
+ (x) = (__typeof__(*(ptr)))__gu_val; \
|
||
|
+ __gu_err; \
|
||
|
+})
|
||
|
+
|
||
|
+extern long __get_user_bad(void);
|
||
|
+
|
||
|
+#define __get_user_size(x,ptr,size,retval) \
|
||
|
+do { \
|
||
|
+ retval = 0; \
|
||
|
+ __chk_user_ptr(ptr); \
|
||
|
+ switch (size) { \
|
||
|
+ case 1: __get_user_asm(x,ptr,retval,"ub"); break; \
|
||
|
+ case 2: __get_user_asm(x,ptr,retval,"uh"); break; \
|
||
|
+ case 4: __get_user_asm(x,ptr,retval,""); break; \
|
||
|
+ default: (x) = __get_user_bad(); \
|
||
|
+ } \
|
||
|
+} while (0)
|
||
|
+
|
||
|
+#define __get_user_asm(x, addr, err, itype) \
|
||
|
+ __asm__ __volatile__( \
|
||
|
+ " .fillinsn\n" \
|
||
|
+ "1: ld"itype" %1,@%2\n" \
|
||
|
+ " .fillinsn\n" \
|
||
|
+ "2:\n" \
|
||
|
+ ".section .fixup,\"ax\"\n" \
|
||
|
+ " .balign 4\n" \
|
||
|
+ "3: ldi %0,%3\n" \
|
||
|
+ " seth r14,#high(2b)\n" \
|
||
|
+ " or3 r14,r14,#low(2b)\n" \
|
||
|
+ " jmp r14\n" \
|
||
|
+ ".previous\n" \
|
||
|
+ ".section __ex_table,\"a\"\n" \
|
||
|
+ " .balign 4\n" \
|
||
|
+ " .long 1b,3b\n" \
|
||
|
+ ".previous" \
|
||
|
+ : "=&r" (err), "=&r" (x) \
|
||
|
+ : "r" (addr), "i" (-EFAULT), "0" (err) \
|
||
|
+ : "r14", "memory")
|
||
|
|
||
|
/**
|
||
|
* __put_user: - Write a simple value into user space, with less checking.
|
||
|
@@ -287,11 +290,13 @@ extern void __put_user_bad(void);
|
||
|
* Returns zero on success, or -EFAULT on error.
|
||
|
*/
|
||
|
#define __put_user(x,ptr) \
|
||
|
- __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
|
||
|
+ __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
|
||
|
+
|
||
|
|
||
|
#define __put_user_nocheck(x,ptr,size) \
|
||
|
({ \
|
||
|
long __pu_err; \
|
||
|
+ might_sleep(); \
|
||
|
__put_user_size((x),(ptr),(size),__pu_err); \
|
||
|
__pu_err; \
|
||
|
})
|
||
|
@@ -308,28 +313,28 @@ extern void __put_user_bad(void);
|
||
|
})
|
||
|
|
||
|
#if defined(__LITTLE_ENDIAN__)
|
||
|
-#define __put_user_u64(x, addr, err) \
|
||
|
- __asm__ __volatile__( \
|
||
|
- " .fillinsn\n" \
|
||
|
- "1: st %L1,@%2\n" \
|
||
|
- " .fillinsn\n" \
|
||
|
- "2: st %H1,@(4,%2)\n" \
|
||
|
- " .fillinsn\n" \
|
||
|
- "3:\n" \
|
||
|
- ".section .fixup,\"ax\"\n" \
|
||
|
- " .balign 4\n" \
|
||
|
- "4: ldi %0,%3\n" \
|
||
|
- " seth r14,#high(3b)\n" \
|
||
|
- " or3 r14,r14,#low(3b)\n" \
|
||
|
- " jmp r14\n" \
|
||
|
- ".previous\n" \
|
||
|
- ".section __ex_table,\"a\"\n" \
|
||
|
- " .balign 4\n" \
|
||
|
- " .long 1b,4b\n" \
|
||
|
- " .long 2b,4b\n" \
|
||
|
- ".previous" \
|
||
|
- : "=&r"(err) \
|
||
|
- : "r"(x), "r"(addr), "i"(-EFAULT), "0"(err) \
|
||
|
+#define __put_user_u64(x, addr, err) \
|
||
|
+ __asm__ __volatile__( \
|
||
|
+ " .fillinsn\n" \
|
||
|
+ "1: st %L1,@%2\n" \
|
||
|
+ " .fillinsn\n" \
|
||
|
+ "2: st %H1,@(4,%2)\n" \
|
||
|
+ " .fillinsn\n" \
|
||
|
+ "3:\n" \
|
||
|
+ ".section .fixup,\"ax\"\n" \
|
||
|
+ " .balign 4\n" \
|
||
|
+ "4: ldi %0,%3\n" \
|
||
|
+ " seth r14,#high(3b)\n" \
|
||
|
+ " or3 r14,r14,#low(3b)\n" \
|
||
|
+ " jmp r14\n" \
|
||
|
+ ".previous\n" \
|
||
|
+ ".section __ex_table,\"a\"\n" \
|
||
|
+ " .balign 4\n" \
|
||
|
+ " .long 1b,4b\n" \
|
||
|
+ " .long 2b,4b\n" \
|
||
|
+ ".previous" \
|
||
|
+ : "=&r" (err) \
|
||
|
+ : "r" (x), "r" (addr), "i" (-EFAULT), "0" (err) \
|
||
|
: "r14", "memory")
|
||
|
|
||
|
#elif defined(__BIG_ENDIAN__)
|
||
|
@@ -353,13 +358,15 @@ extern void __put_user_bad(void);
|
||
|
" .long 1b,4b\n" \
|
||
|
" .long 2b,4b\n" \
|
||
|
".previous" \
|
||
|
- : "=&r"(err) \
|
||
|
- : "r"(x), "r"(addr), "i"(-EFAULT), "0"(err) \
|
||
|
+ : "=&r" (err) \
|
||
|
+ : "r" (x), "r" (addr), "i" (-EFAULT), "0" (err) \
|
||
|
: "r14", "memory")
|
||
|
#else
|
||
|
#error no endian defined
|
||
|
#endif
|
||
|
|
||
|
+extern void __put_user_bad(void);
|
||
|
+
|
||
|
#define __put_user_size(x,ptr,size,retval) \
|
||
|
do { \
|
||
|
retval = 0; \
|
||
|
@@ -398,52 +405,8 @@ struct __large_struct { unsigned long bu
|
||
|
" .balign 4\n" \
|
||
|
" .long 1b,3b\n" \
|
||
|
".previous" \
|
||
|
- : "=&r"(err) \
|
||
|
- : "r"(x), "r"(addr), "i"(-EFAULT), "0"(err) \
|
||
|
- : "r14", "memory")
|
||
|
-
|
||
|
-#define __get_user_nocheck(x,ptr,size) \
|
||
|
-({ \
|
||
|
- long __gu_err; \
|
||
|
- unsigned long __gu_val; \
|
||
|
- __get_user_size(__gu_val,(ptr),(size),__gu_err); \
|
||
|
- (x) = (__typeof__(*(ptr)))__gu_val; \
|
||
|
- __gu_err; \
|
||
|
-})
|
||
|
-
|
||
|
-extern long __get_user_bad(void);
|
||
|
-
|
||
|
-#define __get_user_size(x,ptr,size,retval) \
|
||
|
-do { \
|
||
|
- retval = 0; \
|
||
|
- __chk_user_ptr(ptr); \
|
||
|
- switch (size) { \
|
||
|
- case 1: __get_user_asm(x,ptr,retval,"ub"); break; \
|
||
|
- case 2: __get_user_asm(x,ptr,retval,"uh"); break; \
|
||
|
- case 4: __get_user_asm(x,ptr,retval,""); break; \
|
||
|
- default: (x) = __get_user_bad(); \
|
||
|
- } \
|
||
|
-} while (0)
|
||
|
-
|
||
|
-#define __get_user_asm(x, addr, err, itype) \
|
||
|
- __asm__ __volatile__( \
|
||
|
- " .fillinsn\n" \
|
||
|
- "1: ld"itype" %1,@%2\n" \
|
||
|
- " .fillinsn\n" \
|
||
|
- "2:\n" \
|
||
|
- ".section .fixup,\"ax\"\n" \
|
||
|
- " .balign 4\n" \
|
||
|
- "3: ldi %0,%3\n" \
|
||
|
- " seth r14,#high(2b)\n" \
|
||
|
- " or3 r14,r14,#low(2b)\n" \
|
||
|
- " jmp r14\n" \
|
||
|
- ".previous\n" \
|
||
|
- ".section __ex_table,\"a\"\n" \
|
||
|
- " .balign 4\n" \
|
||
|
- " .long 1b,3b\n" \
|
||
|
- ".previous" \
|
||
|
- : "=&r"(err), "=&r"(x) \
|
||
|
- : "r"(addr), "i"(-EFAULT), "0"(err) \
|
||
|
+ : "=&r" (err) \
|
||
|
+ : "r" (x), "r" (addr), "i" (-EFAULT), "0" (err) \
|
||
|
: "r14", "memory")
|
||
|
|
||
|
/*
|
||
|
@@ -453,7 +416,6 @@ do { \
|
||
|
* anything, so this is accurate.
|
||
|
*/
|
||
|
|
||
|
-
|
||
|
/*
|
||
|
* Copy To/From Userspace
|
||
|
*/
|
||
|
@@ -511,8 +473,9 @@ do { \
|
||
|
" .long 2b,9b\n" \
|
||
|
" .long 3b,9b\n" \
|
||
|
".previous\n" \
|
||
|
- : "=&r"(__dst), "=&r"(__src), "=&r"(size), "=&r"(__c) \
|
||
|
- : "0"(to), "1"(from), "2"(size), "3"(size / 4) \
|
||
|
+ : "=&r" (__dst), "=&r" (__src), "=&r" (size), \
|
||
|
+ "=&r" (__c) \
|
||
|
+ : "0" (to), "1" (from), "2" (size), "3" (size / 4) \
|
||
|
: "r14", "memory"); \
|
||
|
} while (0)
|
||
|
|
||
|
@@ -573,8 +536,9 @@ do { \
|
||
|
" .long 2b,7b\n" \
|
||
|
" .long 3b,7b\n" \
|
||
|
".previous\n" \
|
||
|
- : "=&r"(__dst), "=&r"(__src), "=&r"(size), "=&r"(__c) \
|
||
|
- : "0"(to), "1"(from), "2"(size), "3"(size / 4) \
|
||
|
+ : "=&r" (__dst), "=&r" (__src), "=&r" (size), \
|
||
|
+ "=&r" (__c) \
|
||
|
+ : "0" (to), "1" (from), "2" (size), "3" (size / 4) \
|
||
|
: "r14", "memory"); \
|
||
|
} while (0)
|
||
|
|
||
|
@@ -676,7 +640,7 @@ unsigned long __generic_copy_from_user(v
|
||
|
#define copy_from_user(to,from,n) \
|
||
|
({ \
|
||
|
might_sleep(); \
|
||
|
-__generic_copy_from_user((to),(from),(n)); \
|
||
|
+ __generic_copy_from_user((to),(from),(n)); \
|
||
|
})
|
||
|
|
||
|
long __must_check strncpy_from_user(char *dst, const char __user *src,
|
||
|
diff --git a/include/linux/mm.h b/include/linux/mm.h
|
||
|
index 498ff87..279446e 100644
|
||
|
--- a/include/linux/mm.h
|
||
|
+++ b/include/linux/mm.h
|
||
|
@@ -229,10 +229,9 @@ struct page {
|
||
|
unsigned long private; /* Mapping-private opaque data:
|
||
|
* usually used for buffer_heads
|
||
|
* if PagePrivate set; used for
|
||
|
- * swp_entry_t if PageSwapCache.
|
||
|
- * When page is free, this
|
||
|
+ * swp_entry_t if PageSwapCache;
|
||
|
* indicates order in the buddy
|
||
|
- * system.
|
||
|
+ * system if PG_buddy is set.
|
||
|
*/
|
||
|
struct address_space *mapping; /* If low bit clear, points to
|
||
|
* inode address_space, or NULL.
|
||
|
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
|
||
|
index d52999c..d7ce72e 100644
|
||
|
--- a/include/linux/page-flags.h
|
||
|
+++ b/include/linux/page-flags.h
|
||
|
@@ -74,7 +74,9 @@
|
||
|
#define PG_mappedtodisk 16 /* Has blocks allocated on-disk */
|
||
|
#define PG_reclaim 17 /* To be reclaimed asap */
|
||
|
#define PG_nosave_free 18 /* Free, should not be written */
|
||
|
-#define PG_uncached 19 /* Page has been mapped as uncached */
|
||
|
+#define PG_buddy 19 /* Page is free, on buddy lists */
|
||
|
+
|
||
|
+#define PG_uncached 20 /* Page has been mapped as uncached */
|
||
|
|
||
|
/*
|
||
|
* Global page accounting. One instance per CPU. Only unsigned longs are
|
||
|
@@ -319,6 +321,10 @@ extern void __mod_page_state_offset(unsi
|
||
|
#define SetPageNosaveFree(page) set_bit(PG_nosave_free, &(page)->flags)
|
||
|
#define ClearPageNosaveFree(page) clear_bit(PG_nosave_free, &(page)->flags)
|
||
|
|
||
|
+#define PageBuddy(page) test_bit(PG_buddy, &(page)->flags)
|
||
|
+#define __SetPageBuddy(page) __set_bit(PG_buddy, &(page)->flags)
|
||
|
+#define __ClearPageBuddy(page) __clear_bit(PG_buddy, &(page)->flags)
|
||
|
+
|
||
|
#define PageMappedToDisk(page) test_bit(PG_mappedtodisk, &(page)->flags)
|
||
|
#define SetPageMappedToDisk(page) set_bit(PG_mappedtodisk, &(page)->flags)
|
||
|
#define ClearPageMappedToDisk(page) clear_bit(PG_mappedtodisk, &(page)->flags)
|
||
|
diff --git a/include/net/ip.h b/include/net/ip.h
|
||
|
index fab3d5b..ed84d04 100644
|
||
|
--- a/include/net/ip.h
|
||
|
+++ b/include/net/ip.h
|
||
|
@@ -95,6 +95,7 @@ extern int ip_local_deliver(struct sk_b
|
||
|
extern int ip_mr_input(struct sk_buff *skb);
|
||
|
extern int ip_output(struct sk_buff *skb);
|
||
|
extern int ip_mc_output(struct sk_buff *skb);
|
||
|
+extern int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *));
|
||
|
extern int ip_do_nat(struct sk_buff *skb);
|
||
|
extern void ip_send_check(struct iphdr *ip);
|
||
|
extern int ip_queue_xmit(struct sk_buff *skb, int ipfragok);
|
||
|
diff --git a/ipc/shm.c b/ipc/shm.c
|
||
|
index 9162123..f409726 100644
|
||
|
--- a/ipc/shm.c
|
||
|
+++ b/ipc/shm.c
|
||
|
@@ -161,6 +161,8 @@ static int shm_mmap(struct file * file,
|
||
|
ret = shmem_mmap(file, vma);
|
||
|
if (ret == 0) {
|
||
|
vma->vm_ops = &shm_vm_ops;
|
||
|
+ if (!(vma->vm_flags & VM_WRITE))
|
||
|
+ vma->vm_flags &= ~VM_MAYWRITE;
|
||
|
shm_inc(file->f_dentry->d_inode->i_ino);
|
||
|
}
|
||
|
|
||
|
diff --git a/kernel/power/process.c b/kernel/power/process.c
|
||
|
index 28de118..67b2cdd 100644
|
||
|
--- a/kernel/power/process.c
|
||
|
+++ b/kernel/power/process.c
|
||
|
@@ -25,8 +25,7 @@ static inline int freezeable(struct task
|
||
|
(p->flags & PF_NOFREEZE) ||
|
||
|
(p->exit_state == EXIT_ZOMBIE) ||
|
||
|
(p->exit_state == EXIT_DEAD) ||
|
||
|
- (p->state == TASK_STOPPED) ||
|
||
|
- (p->state == TASK_TRACED))
|
||
|
+ (p->state == TASK_STOPPED))
|
||
|
return 0;
|
||
|
return 1;
|
||
|
}
|
||
|
diff --git a/kernel/ptrace.c b/kernel/ptrace.c
|
||
|
index d95a72c..b5eaeb9 100644
|
||
|
--- a/kernel/ptrace.c
|
||
|
+++ b/kernel/ptrace.c
|
||
|
@@ -57,10 +57,6 @@ void ptrace_untrace(task_t *child)
|
||
|
signal_wake_up(child, 1);
|
||
|
}
|
||
|
}
|
||
|
- if (child->signal->flags & SIGNAL_GROUP_EXIT) {
|
||
|
- sigaddset(&child->pending.signal, SIGKILL);
|
||
|
- signal_wake_up(child, 1);
|
||
|
- }
|
||
|
spin_unlock(&child->sighand->siglock);
|
||
|
}
|
||
|
|
||
|
@@ -82,7 +78,8 @@ void __ptrace_unlink(task_t *child)
|
||
|
SET_LINKS(child);
|
||
|
}
|
||
|
|
||
|
- ptrace_untrace(child);
|
||
|
+ if (child->state == TASK_TRACED)
|
||
|
+ ptrace_untrace(child);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
diff --git a/kernel/signal.c b/kernel/signal.c
|
||
|
index bc8f80b..acbccf7 100644
|
||
|
--- a/kernel/signal.c
|
||
|
+++ b/kernel/signal.c
|
||
|
@@ -1688,6 +1688,7 @@ static void ptrace_stop(int exit_code, i
|
||
|
/* Let the debugger run. */
|
||
|
set_current_state(TASK_TRACED);
|
||
|
spin_unlock_irq(¤t->sighand->siglock);
|
||
|
+ try_to_freeze();
|
||
|
read_lock(&tasklist_lock);
|
||
|
if (likely(current->ptrace & PT_PTRACED) &&
|
||
|
likely(current->parent != current->real_parent ||
|
||
|
@@ -1941,9 +1942,9 @@ relock:
|
||
|
/* Let the debugger run. */
|
||
|
ptrace_stop(signr, signr, info);
|
||
|
|
||
|
- /* We're back. Did the debugger cancel the sig or group_exit? */
|
||
|
+ /* We're back. Did the debugger cancel the sig? */
|
||
|
signr = current->exit_code;
|
||
|
- if (signr == 0 || current->signal->flags & SIGNAL_GROUP_EXIT)
|
||
|
+ if (signr == 0)
|
||
|
continue;
|
||
|
|
||
|
current->exit_code = 0;
|
||
|
diff --git a/kernel/sys.c b/kernel/sys.c
|
||
|
index f91218a..105e102 100644
|
||
|
--- a/kernel/sys.c
|
||
|
+++ b/kernel/sys.c
|
||
|
@@ -1657,7 +1657,19 @@ asmlinkage long sys_setrlimit(unsigned i
|
||
|
(cputime_eq(current->signal->it_prof_expires, cputime_zero) ||
|
||
|
new_rlim.rlim_cur <= cputime_to_secs(
|
||
|
current->signal->it_prof_expires))) {
|
||
|
- cputime_t cputime = secs_to_cputime(new_rlim.rlim_cur);
|
||
|
+ unsigned long rlim_cur = new_rlim.rlim_cur;
|
||
|
+ cputime_t cputime;
|
||
|
+
|
||
|
+ if (rlim_cur == 0) {
|
||
|
+ /*
|
||
|
+ * The caller is asking for an immediate RLIMIT_CPU
|
||
|
+ * expiry. But we use the zero value to mean "it was
|
||
|
+ * never set". So let's cheat and make it one second
|
||
|
+ * instead
|
||
|
+ */
|
||
|
+ rlim_cur = 1;
|
||
|
+ }
|
||
|
+ cputime = secs_to_cputime(rlim_cur);
|
||
|
read_lock(&tasklist_lock);
|
||
|
spin_lock_irq(¤t->sighand->siglock);
|
||
|
set_process_cpu_timer(current, CPUCLOCK_PROF,
|
||
|
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
|
||
|
index 234bd48..61de222 100644
|
||
|
--- a/mm/page_alloc.c
|
||
|
+++ b/mm/page_alloc.c
|
||
|
@@ -153,7 +153,8 @@ static void bad_page(struct page *page)
|
||
|
1 << PG_reclaim |
|
||
|
1 << PG_slab |
|
||
|
1 << PG_swapcache |
|
||
|
- 1 << PG_writeback );
|
||
|
+ 1 << PG_writeback |
|
||
|
+ 1 << PG_buddy );
|
||
|
set_page_count(page, 0);
|
||
|
reset_page_mapcount(page);
|
||
|
page->mapping = NULL;
|
||
|
@@ -224,12 +225,12 @@ static inline unsigned long page_order(s
|
||
|
|
||
|
static inline void set_page_order(struct page *page, int order) {
|
||
|
set_page_private(page, order);
|
||
|
- __SetPagePrivate(page);
|
||
|
+ __SetPageBuddy(page);
|
||
|
}
|
||
|
|
||
|
static inline void rmv_page_order(struct page *page)
|
||
|
{
|
||
|
- __ClearPagePrivate(page);
|
||
|
+ __ClearPageBuddy(page);
|
||
|
set_page_private(page, 0);
|
||
|
}
|
||
|
|
||
|
@@ -268,11 +269,13 @@ __find_combined_index(unsigned long page
|
||
|
* This function checks whether a page is free && is the buddy
|
||
|
* we can do coalesce a page and its buddy if
|
||
|
* (a) the buddy is not in a hole &&
|
||
|
- * (b) the buddy is free &&
|
||
|
- * (c) the buddy is on the buddy system &&
|
||
|
- * (d) a page and its buddy have the same order.
|
||
|
- * for recording page's order, we use page_private(page) and PG_private.
|
||
|
+ * (b) the buddy is in the buddy system &&
|
||
|
+ * (c) a page and its buddy have the same order.
|
||
|
+ *
|
||
|
+ * For recording whether a page is in the buddy system, we use PG_buddy.
|
||
|
+ * Setting, clearing, and testing PG_buddy is serialized by zone->lock.
|
||
|
*
|
||
|
+ * For recording page's order, we use page_private(page).
|
||
|
*/
|
||
|
static inline int page_is_buddy(struct page *page, int order)
|
||
|
{
|
||
|
@@ -281,10 +284,10 @@ static inline int page_is_buddy(struct p
|
||
|
return 0;
|
||
|
#endif
|
||
|
|
||
|
- if (PagePrivate(page) &&
|
||
|
- (page_order(page) == order) &&
|
||
|
- page_count(page) == 0)
|
||
|
+ if (PageBuddy(page) && page_order(page) == order) {
|
||
|
+ BUG_ON(page_count(page) != 0);
|
||
|
return 1;
|
||
|
+ }
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
@@ -301,7 +304,7 @@ static inline int page_is_buddy(struct p
|
||
|
* as necessary, plus some accounting needed to play nicely with other
|
||
|
* parts of the VM system.
|
||
|
* At each level, we keep a list of pages, which are heads of continuous
|
||
|
- * free pages of length of (1 << order) and marked with PG_Private.Page's
|
||
|
+ * free pages of length of (1 << order) and marked with PG_buddy. Page's
|
||
|
* order is recorded in page_private(page) field.
|
||
|
* So when we are allocating or freeing one, we can derive the state of the
|
||
|
* other. That is, if we allocate a small block, and both were
|
||
|
@@ -364,7 +367,8 @@ static inline int free_pages_check(struc
|
||
|
1 << PG_slab |
|
||
|
1 << PG_swapcache |
|
||
|
1 << PG_writeback |
|
||
|
- 1 << PG_reserved ))))
|
||
|
+ 1 << PG_reserved |
|
||
|
+ 1 << PG_buddy ))))
|
||
|
bad_page(page);
|
||
|
if (PageDirty(page))
|
||
|
__ClearPageDirty(page);
|
||
|
@@ -522,7 +526,8 @@ static int prep_new_page(struct page *pa
|
||
|
1 << PG_slab |
|
||
|
1 << PG_swapcache |
|
||
|
1 << PG_writeback |
|
||
|
- 1 << PG_reserved ))))
|
||
|
+ 1 << PG_reserved |
|
||
|
+ 1 << PG_buddy ))))
|
||
|
bad_page(page);
|
||
|
|
||
|
/*
|
||
|
diff --git a/net/atm/clip.c b/net/atm/clip.c
|
||
|
index 73370de..1842a4e 100644
|
||
|
--- a/net/atm/clip.c
|
||
|
+++ b/net/atm/clip.c
|
||
|
@@ -613,12 +613,19 @@ static int clip_create(int number)
|
||
|
|
||
|
|
||
|
static int clip_device_event(struct notifier_block *this,unsigned long event,
|
||
|
- void *dev)
|
||
|
+ void *arg)
|
||
|
{
|
||
|
+ struct net_device *dev = arg;
|
||
|
+
|
||
|
+ if (event == NETDEV_UNREGISTER) {
|
||
|
+ neigh_ifdown(&clip_tbl, dev);
|
||
|
+ return NOTIFY_DONE;
|
||
|
+ }
|
||
|
+
|
||
|
/* ignore non-CLIP devices */
|
||
|
- if (((struct net_device *) dev)->type != ARPHRD_ATM ||
|
||
|
- ((struct net_device *) dev)->hard_start_xmit != clip_start_xmit)
|
||
|
+ if (dev->type != ARPHRD_ATM || dev->hard_start_xmit != clip_start_xmit)
|
||
|
return NOTIFY_DONE;
|
||
|
+
|
||
|
switch (event) {
|
||
|
case NETDEV_UP:
|
||
|
DPRINTK("clip_device_event NETDEV_UP\n");
|
||
|
@@ -686,14 +693,12 @@ static struct notifier_block clip_inet_n
|
||
|
static void atmarpd_close(struct atm_vcc *vcc)
|
||
|
{
|
||
|
DPRINTK("atmarpd_close\n");
|
||
|
- atmarpd = NULL; /* assumed to be atomic */
|
||
|
- barrier();
|
||
|
- unregister_inetaddr_notifier(&clip_inet_notifier);
|
||
|
- unregister_netdevice_notifier(&clip_dev_notifier);
|
||
|
- if (skb_peek(&sk_atm(vcc)->sk_receive_queue))
|
||
|
- printk(KERN_ERR "atmarpd_close: closing with requests "
|
||
|
- "pending\n");
|
||
|
+
|
||
|
+ rtnl_lock();
|
||
|
+ atmarpd = NULL;
|
||
|
skb_queue_purge(&sk_atm(vcc)->sk_receive_queue);
|
||
|
+ rtnl_unlock();
|
||
|
+
|
||
|
DPRINTK("(done)\n");
|
||
|
module_put(THIS_MODULE);
|
||
|
}
|
||
|
@@ -714,7 +719,12 @@ static struct atm_dev atmarpd_dev = {
|
||
|
|
||
|
static int atm_init_atmarp(struct atm_vcc *vcc)
|
||
|
{
|
||
|
- if (atmarpd) return -EADDRINUSE;
|
||
|
+ rtnl_lock();
|
||
|
+ if (atmarpd) {
|
||
|
+ rtnl_unlock();
|
||
|
+ return -EADDRINUSE;
|
||
|
+ }
|
||
|
+
|
||
|
if (start_timer) {
|
||
|
start_timer = 0;
|
||
|
init_timer(&idle_timer);
|
||
|
@@ -731,10 +741,7 @@ static int atm_init_atmarp(struct atm_vc
|
||
|
vcc->push = NULL;
|
||
|
vcc->pop = NULL; /* crash */
|
||
|
vcc->push_oam = NULL; /* crash */
|
||
|
- if (register_netdevice_notifier(&clip_dev_notifier))
|
||
|
- printk(KERN_ERR "register_netdevice_notifier failed\n");
|
||
|
- if (register_inetaddr_notifier(&clip_inet_notifier))
|
||
|
- printk(KERN_ERR "register_inetaddr_notifier failed\n");
|
||
|
+ rtnl_unlock();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
@@ -992,6 +999,8 @@ static int __init atm_clip_init(void)
|
||
|
|
||
|
clip_tbl_hook = &clip_tbl;
|
||
|
register_atm_ioctl(&clip_ioctl_ops);
|
||
|
+ register_netdevice_notifier(&clip_dev_notifier);
|
||
|
+ register_inetaddr_notifier(&clip_inet_notifier);
|
||
|
|
||
|
#ifdef CONFIG_PROC_FS
|
||
|
{
|
||
|
@@ -1012,6 +1021,9 @@ static void __exit atm_clip_exit(void)
|
||
|
|
||
|
remove_proc_entry("arp", atm_proc_root);
|
||
|
|
||
|
+ unregister_inetaddr_notifier(&clip_inet_notifier);
|
||
|
+ unregister_netdevice_notifier(&clip_dev_notifier);
|
||
|
+
|
||
|
deregister_atm_ioctl(&clip_ioctl_ops);
|
||
|
|
||
|
/* First, stop the idle timer, so it stops banging
|
||
|
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
|
||
|
index e060aad..9e27373 100644
|
||
|
--- a/net/bridge/br_netfilter.c
|
||
|
+++ b/net/bridge/br_netfilter.c
|
||
|
@@ -739,6 +739,15 @@ out:
|
||
|
return NF_STOLEN;
|
||
|
}
|
||
|
|
||
|
+static int br_nf_dev_queue_xmit(struct sk_buff *skb)
|
||
|
+{
|
||
|
+ if (skb->protocol == htons(ETH_P_IP) &&
|
||
|
+ skb->len > skb->dev->mtu &&
|
||
|
+ !(skb_shinfo(skb)->ufo_size || skb_shinfo(skb)->tso_size))
|
||
|
+ return ip_fragment(skb, br_dev_queue_push_xmit);
|
||
|
+ else
|
||
|
+ return br_dev_queue_push_xmit(skb);
|
||
|
+}
|
||
|
|
||
|
/* PF_BRIDGE/POST_ROUTING ********************************************/
|
||
|
static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff **pskb,
|
||
|
@@ -798,7 +807,7 @@ static unsigned int br_nf_post_routing(u
|
||
|
realoutdev = nf_bridge->netoutdev;
|
||
|
#endif
|
||
|
NF_HOOK(pf, NF_IP_POST_ROUTING, skb, NULL, realoutdev,
|
||
|
- br_dev_queue_push_xmit);
|
||
|
+ br_nf_dev_queue_xmit);
|
||
|
|
||
|
return NF_STOLEN;
|
||
|
|
||
|
@@ -843,7 +852,7 @@ static unsigned int ip_sabotage_out(unsi
|
||
|
if ((out->hard_start_xmit == br_dev_xmit &&
|
||
|
okfn != br_nf_forward_finish &&
|
||
|
okfn != br_nf_local_out_finish &&
|
||
|
- okfn != br_dev_queue_push_xmit)
|
||
|
+ okfn != br_nf_dev_queue_xmit)
|
||
|
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
|
||
|
|| ((out->priv_flags & IFF_802_1Q_VLAN) &&
|
||
|
VLAN_DEV_INFO(out)->real_dev->hard_start_xmit == br_dev_xmit)
|
||
|
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
|
||
|
index f75ff1d..8dcba38 100644
|
||
|
--- a/net/ipv4/ip_output.c
|
||
|
+++ b/net/ipv4/ip_output.c
|
||
|
@@ -86,8 +86,6 @@
|
||
|
|
||
|
int sysctl_ip_default_ttl = IPDEFTTL;
|
||
|
|
||
|
-static int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*));
|
||
|
-
|
||
|
/* Generate a checksum for an outgoing IP datagram. */
|
||
|
__inline__ void ip_send_check(struct iphdr *iph)
|
||
|
{
|
||
|
@@ -421,7 +419,7 @@ static void ip_copy_metadata(struct sk_b
|
||
|
* single device frame, and queue such a frame for sending.
|
||
|
*/
|
||
|
|
||
|
-static int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
|
||
|
+int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
|
||
|
{
|
||
|
struct iphdr *iph;
|
||
|
int raw = 0;
|
||
|
@@ -673,6 +671,8 @@ fail:
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
+EXPORT_SYMBOL(ip_fragment);
|
||
|
+
|
||
|
int
|
||
|
ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb)
|
||
|
{
|
||
|
-
|
||
|
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
|
||
|
the body of a message to majordomo@vger.kernel.org
|
||
|
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
||
|
Please read the FAQ at http://www.tux.org/lkml/
|
||
|
|