Merge upstream into 'upstream' branch of netdev-2.6.git.

Hand fix merge conflict in drivers/net/tokenring/Kconfig.
This commit is contained in:
Jeff Garzik 2005-08-24 01:03:34 -04:00
commit 75a95178da
125 changed files with 676 additions and 641 deletions

View file

@ -1,7 +1,7 @@
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 13 SUBLEVEL = 13
EXTRAVERSION =-rc6 EXTRAVERSION =-rc7
NAME=Woozy Numbat NAME=Woozy Numbat
# *DOCUMENTATION* # *DOCUMENTATION*

View file

@ -522,7 +522,7 @@ source "mm/Kconfig"
config NUMA config NUMA
bool "NUMA Support (EXPERIMENTAL)" bool "NUMA Support (EXPERIMENTAL)"
depends on DISCONTIGMEM depends on DISCONTIGMEM && BROKEN
help help
Say Y to compile the kernel to support NUMA (Non-Uniform Memory Say Y to compile the kernel to support NUMA (Non-Uniform Memory
Access). This option is for configuring high-end multiprocessor Access). This option is for configuring high-end multiprocessor

View file

@ -1036,7 +1036,7 @@ debug_spin_lock(spinlock_t * lock, const char *base_file, int line_no)
" br 1b\n" " br 1b\n"
".previous" ".previous"
: "=r" (tmp), "=m" (lock->lock), "=r" (stuck) : "=r" (tmp), "=m" (lock->lock), "=r" (stuck)
: "1" (lock->lock), "2" (stuck) : "memory"); : "m" (lock->lock), "2" (stuck) : "memory");
if (stuck < 0) { if (stuck < 0) {
printk(KERN_WARNING printk(KERN_WARNING
@ -1115,7 +1115,7 @@ void _raw_write_lock(rwlock_t * lock)
".previous" ".previous"
: "=m" (*(volatile int *)lock), "=&r" (regx), "=&r" (regy), : "=m" (*(volatile int *)lock), "=&r" (regx), "=&r" (regy),
"=&r" (stuck_lock), "=&r" (stuck_reader) "=&r" (stuck_lock), "=&r" (stuck_reader)
: "0" (*(volatile int *)lock), "3" (stuck_lock), "4" (stuck_reader) : "memory"); : "m" (*(volatile int *)lock), "3" (stuck_lock), "4" (stuck_reader) : "memory");
if (stuck_lock < 0) { if (stuck_lock < 0) {
printk(KERN_WARNING "write_lock stuck at %p\n", inline_pc); printk(KERN_WARNING "write_lock stuck at %p\n", inline_pc);
@ -1153,7 +1153,7 @@ void _raw_read_lock(rwlock_t * lock)
" br 1b\n" " br 1b\n"
".previous" ".previous"
: "=m" (*(volatile int *)lock), "=&r" (regx), "=&r" (stuck_lock) : "=m" (*(volatile int *)lock), "=&r" (regx), "=&r" (stuck_lock)
: "0" (*(volatile int *)lock), "2" (stuck_lock) : "memory"); : "m" (*(volatile int *)lock), "2" (stuck_lock) : "memory");
if (stuck_lock < 0) { if (stuck_lock < 0) {
printk(KERN_WARNING "read_lock stuck at %p\n", inline_pc); printk(KERN_WARNING "read_lock stuck at %p\n", inline_pc);

View file

@ -65,7 +65,7 @@ op_axp_setup(void)
model->reg_setup(&reg, ctr, &sys); model->reg_setup(&reg, ctr, &sys);
/* Configure the registers on all cpus. */ /* Configure the registers on all cpus. */
smp_call_function(model->cpu_setup, &reg, 0, 1); (void)smp_call_function(model->cpu_setup, &reg, 0, 1);
model->cpu_setup(&reg); model->cpu_setup(&reg);
return 0; return 0;
} }
@ -86,7 +86,7 @@ op_axp_cpu_start(void *dummy)
static int static int
op_axp_start(void) op_axp_start(void)
{ {
smp_call_function(op_axp_cpu_start, NULL, 0, 1); (void)smp_call_function(op_axp_cpu_start, NULL, 0, 1);
op_axp_cpu_start(NULL); op_axp_cpu_start(NULL);
return 0; return 0;
} }
@ -101,7 +101,7 @@ op_axp_cpu_stop(void *dummy)
static void static void
op_axp_stop(void) op_axp_stop(void)
{ {
smp_call_function(op_axp_cpu_stop, NULL, 0, 1); (void)smp_call_function(op_axp_cpu_stop, NULL, 0, 1);
op_axp_cpu_stop(NULL); op_axp_cpu_stop(NULL);
} }

View file

@ -310,7 +310,7 @@ menu "Kernel Features"
config SMP config SMP
bool "Symmetric Multi-Processing (EXPERIMENTAL)" bool "Symmetric Multi-Processing (EXPERIMENTAL)"
depends on EXPERIMENTAL #&& n depends on EXPERIMENTAL && BROKEN #&& n
help help
This enables support for systems with more than one CPU. If you have This enables support for systems with more than one CPU. If you have
a system with only one CPU, like most personal computers, say N. If a system with only one CPU, like most personal computers, say N. If

View file

@ -617,7 +617,7 @@ baddataabort(int code, unsigned long instr, struct pt_regs *regs)
notify_die("unknown data abort code", regs, &info, instr, 0); notify_die("unknown data abort code", regs, &info, instr, 0);
} }
volatile void __bug(const char *file, int line, void *data) void __attribute__((noreturn)) __bug(const char *file, int line, void *data)
{ {
printk(KERN_CRIT"kernel BUG at %s:%d!", file, line); printk(KERN_CRIT"kernel BUG at %s:%d!", file, line);
if (data) if (data)

View file

@ -370,20 +370,20 @@ TABLE 5
#define getRoundingMode(opcode) ((opcode & MASK_ROUNDING_MODE) >> 5) #define getRoundingMode(opcode) ((opcode & MASK_ROUNDING_MODE) >> 5)
#ifdef CONFIG_FPE_NWFPE_XP #ifdef CONFIG_FPE_NWFPE_XP
static inline const floatx80 getExtendedConstant(const unsigned int nIndex) static inline __attribute_pure__ floatx80 getExtendedConstant(const unsigned int nIndex)
{ {
extern const floatx80 floatx80Constant[]; extern const floatx80 floatx80Constant[];
return floatx80Constant[nIndex]; return floatx80Constant[nIndex];
} }
#endif #endif
static inline const float64 getDoubleConstant(const unsigned int nIndex) static inline __attribute_pure__ float64 getDoubleConstant(const unsigned int nIndex)
{ {
extern const float64 float64Constant[]; extern const float64 float64Constant[];
return float64Constant[nIndex]; return float64Constant[nIndex];
} }
static inline const float32 getSingleConstant(const unsigned int nIndex) static inline __attribute_pure__ float32 getSingleConstant(const unsigned int nIndex)
{ {
extern const float32 float32Constant[]; extern const float32 float32Constant[];
return float32Constant[nIndex]; return float32Constant[nIndex];

View file

@ -195,7 +195,7 @@ static void disable_lapic_nmi_watchdog(void)
wrmsr(MSR_P6_EVNTSEL0, 0, 0); wrmsr(MSR_P6_EVNTSEL0, 0, 0);
break; break;
case 15: case 15:
if (boot_cpu_data.x86_model > 0x3) if (boot_cpu_data.x86_model > 0x4)
break; break;
wrmsr(MSR_P4_IQ_CCCR0, 0, 0); wrmsr(MSR_P4_IQ_CCCR0, 0, 0);
@ -432,7 +432,7 @@ void setup_apic_nmi_watchdog (void)
setup_p6_watchdog(); setup_p6_watchdog();
break; break;
case 15: case 15:
if (boot_cpu_data.x86_model > 0x3) if (boot_cpu_data.x86_model > 0x4)
return; return;
if (!setup_p4_watchdog()) if (!setup_p4_watchdog())

View file

@ -803,15 +803,17 @@ void math_error(void __user *eip)
*/ */
cwd = get_fpu_cwd(task); cwd = get_fpu_cwd(task);
swd = get_fpu_swd(task); swd = get_fpu_swd(task);
switch (((~cwd) & swd & 0x3f) | (swd & 0x240)) { switch (swd & ~cwd & 0x3f) {
case 0x000: case 0x000:
default: default:
break; break;
case 0x001: /* Invalid Op */ case 0x001: /* Invalid Op */
case 0x041: /* Stack Fault */ /*
case 0x241: /* Stack Fault | Direction */ * swd & 0x240 == 0x040: Stack Underflow
* swd & 0x240 == 0x240: Stack Overflow
* User must clear the SF bit (0x40) if set
*/
info.si_code = FPE_FLTINV; info.si_code = FPE_FLTINV;
/* Should we clear the SF or let user space do it ???? */
break; break;
case 0x002: /* Denormalize */ case 0x002: /* Denormalize */
case 0x010: /* Underflow */ case 0x010: /* Underflow */

View file

@ -22,7 +22,7 @@ GLOBAL_ENTRY(_start)
.save rp, r0 .save rp, r0
.body .body
movl gp = __gp movl gp = __gp
movl sp = stack_mem movl sp = stack_mem+16384-16
bsw.1 bsw.1
br.call.sptk.many rp=start_bootloader br.call.sptk.many rp=start_bootloader
END(_start) END(_start)

View file

@ -323,7 +323,7 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
struct pci_controller *controller; struct pci_controller *controller;
struct pcibus_bussoft *prom_bussoft_ptr; struct pcibus_bussoft *prom_bussoft_ptr;
struct hubdev_info *hubdev_info; struct hubdev_info *hubdev_info;
void *provider_soft; void *provider_soft = NULL;
struct sn_pcibus_provider *provider; struct sn_pcibus_provider *provider;
status = sal_get_pcibus_info((u64) segment, (u64) busnum, status = sal_get_pcibus_info((u64) segment, (u64) busnum,
@ -339,7 +339,7 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
if (bus == NULL) { if (bus == NULL) {
bus = pci_scan_bus(busnum, &pci_root_ops, controller); bus = pci_scan_bus(busnum, &pci_root_ops, controller);
if (bus == NULL) if (bus == NULL)
return; /* error, or bus already scanned */ goto error_return; /* error, or bus already scanned */
bus->sysdata = NULL; bus->sysdata = NULL;
} }
@ -352,28 +352,30 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
*/ */
if (prom_bussoft_ptr->bs_asic_type >= PCIIO_ASIC_MAX_TYPES) if (prom_bussoft_ptr->bs_asic_type >= PCIIO_ASIC_MAX_TYPES)
return; /* unsupported asic type */ goto error_return; /* unsupported asic type */
if (prom_bussoft_ptr->bs_asic_type == PCIIO_ASIC_TYPE_PPB) if (prom_bussoft_ptr->bs_asic_type == PCIIO_ASIC_TYPE_PPB)
goto error_return; /* no further fixup necessary */ goto error_return; /* no further fixup necessary */
provider = sn_pci_provider[prom_bussoft_ptr->bs_asic_type]; provider = sn_pci_provider[prom_bussoft_ptr->bs_asic_type];
if (provider == NULL) if (provider == NULL)
return; /* no provider registerd for this asic */ goto error_return; /* no provider registerd for this asic */
provider_soft = NULL; bus->sysdata = controller;
if (provider->bus_fixup) if (provider->bus_fixup)
provider_soft = (*provider->bus_fixup) (prom_bussoft_ptr, controller); provider_soft = (*provider->bus_fixup) (prom_bussoft_ptr, controller);
if (provider_soft == NULL) if (provider_soft == NULL) {
return; /* fixup failed or not applicable */ /* fixup failed or not applicable */
bus->sysdata = NULL;
goto error_return;
}
/* /*
* Generic bus fixup goes here. Don't reference prom_bussoft_ptr * Generic bus fixup goes here. Don't reference prom_bussoft_ptr
* after this point. * after this point.
*/ */
bus->sysdata = controller;
PCI_CONTROLLER(bus)->platform_data = provider_soft; PCI_CONTROLLER(bus)->platform_data = provider_soft;
nasid = NASID_GET(SN_PCIBUS_BUSSOFT(bus)->bs_base); nasid = NASID_GET(SN_PCIBUS_BUSSOFT(bus)->bs_base);
cnode = nasid_to_cnodeid(nasid); cnode = nasid_to_cnodeid(nasid);

View file

@ -269,7 +269,7 @@ config NR_CPUS
# Common NUMA Features # Common NUMA Features
config NUMA config NUMA
bool "Numa Memory Allocation Support" bool "Numa Memory Allocation Support"
depends on SMP depends on SMP && BROKEN
default n default n
# turning this on wastes a bunch of space. # turning this on wastes a bunch of space.
@ -286,6 +286,7 @@ menu "Bus options (PCI, PCMCIA, EISA, MCA, ISA)"
config PCI config PCI
bool "PCI support" bool "PCI support"
depends on BROKEN
default n default n
help help
Find out whether you have a PCI motherboard. PCI is the name of a Find out whether you have a PCI motherboard. PCI is the name of a

View file

@ -20,7 +20,7 @@ config DEBUG_STACK_USAGE
config DEBUG_PAGEALLOC config DEBUG_PAGEALLOC
bool "Page alloc debugging" bool "Page alloc debugging"
depends on DEBUG_KERNEL depends on DEBUG_KERNEL && BROKEN
help help
Unmap pages from the kernel linear mapping after free_pages(). Unmap pages from the kernel linear mapping after free_pages().
This results in a large slowdown, but helps to find certain types This results in a large slowdown, but helps to find certain types

View file

@ -30,9 +30,11 @@
typedef struct { typedef struct {
unsigned long icucr; /* ICU Control Register */ unsigned long icucr; /* ICU Control Register */
} icu_data_t; } icu_data_t;
static icu_data_t icu_data[M32700UT_NUM_CPU_IRQ];
#else
icu_data_t icu_data[M32700UT_NUM_CPU_IRQ];
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
static icu_data_t icu_data[M32700UT_NUM_CPU_IRQ];
static void disable_m32700ut_irq(unsigned int irq) static void disable_m32700ut_irq(unsigned int irq)
{ {

View file

@ -31,9 +31,11 @@
typedef struct { typedef struct {
unsigned long icucr; /* ICU Control Register */ unsigned long icucr; /* ICU Control Register */
} icu_data_t; } icu_data_t;
static icu_data_t icu_data[OPSPUT_NUM_CPU_IRQ];
#else
icu_data_t icu_data[OPSPUT_NUM_CPU_IRQ];
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
static icu_data_t icu_data[OPSPUT_NUM_CPU_IRQ];
static void disable_opsput_irq(unsigned int irq) static void disable_opsput_irq(unsigned int irq)
{ {

View file

@ -91,6 +91,7 @@ extern struct {
/* which physical physical ID maps to which logical CPU number */ /* which physical physical ID maps to which logical CPU number */
static volatile int physid_2_cpu[NR_CPUS]; static volatile int physid_2_cpu[NR_CPUS];
#define physid_to_cpu(physid) physid_2_cpu[physid]
/* which logical CPU number maps to which physical ID */ /* which logical CPU number maps to which physical ID */
volatile int cpu_2_physid[NR_CPUS]; volatile int cpu_2_physid[NR_CPUS];

View file

@ -58,3 +58,4 @@ csum_partial_copy_from_user (const unsigned char __user *src,
return csum_partial(dst, len-missing, sum); return csum_partial(dst, len-missing, sum);
} }
EXPORT_SYMBOL(csum_partial_copy_from_user); EXPORT_SYMBOL(csum_partial_copy_from_user);
EXPORT_SYMBOL(csum_partial);

View file

@ -12,12 +12,14 @@
#include <linux/mmzone.h> #include <linux/mmzone.h>
#include <linux/initrd.h> #include <linux/initrd.h>
#include <linux/nodemask.h> #include <linux/nodemask.h>
#include <linux/module.h>
#include <asm/setup.h> #include <asm/setup.h>
extern char _end[]; extern char _end[];
struct pglist_data *node_data[MAX_NUMNODES]; struct pglist_data *node_data[MAX_NUMNODES];
EXPORT_SYMBOL(node_data);
static bootmem_data_t node_bdata[MAX_NUMNODES] __initdata; static bootmem_data_t node_bdata[MAX_NUMNODES] __initdata;
pg_data_t m32r_node_data[MAX_NUMNODES]; pg_data_t m32r_node_data[MAX_NUMNODES];

View file

@ -911,6 +911,7 @@ config PPCBUG_NVRAM
default y if PPC_PREP default y if PPC_PREP
config SMP config SMP
depends on PPC_STD_MMU
bool "Symmetric multi-processing support" bool "Symmetric multi-processing support"
---help--- ---help---
This enables support for systems with more than one CPU. If you have This enables support for systems with more than one CPU. If you have
@ -930,7 +931,7 @@ config SMP
config IRQ_ALL_CPUS config IRQ_ALL_CPUS
bool "Distribute interrupts on all CPUs by default" bool "Distribute interrupts on all CPUs by default"
depends on SMP depends on SMP && !MV64360
help help
This option gives the kernel permission to distribute IRQs across This option gives the kernel permission to distribute IRQs across
multiple CPUs. Saying N here will route all IRQs to the first multiple CPUs. Saying N here will route all IRQs to the first
@ -1121,7 +1122,9 @@ config PROC_HARDWARE
source "drivers/zorro/Kconfig" source "drivers/zorro/Kconfig"
if !44x || BROKEN
source kernel/power/Kconfig source kernel/power/Kconfig
endif
config SECCOMP config SECCOMP
bool "Enable seccomp to safely compute untrusted bytecode" bool "Enable seccomp to safely compute untrusted bytecode"

View file

@ -3,6 +3,11 @@ config 4xx
depends on 40x || 44x depends on 40x || 44x
default y default y
config WANT_EARLY_SERIAL
bool
select SERIAL_8250
default n
menu "IBM 4xx options" menu "IBM 4xx options"
depends on 4xx depends on 4xx
@ -18,6 +23,7 @@ config ASH
config BUBINGA config BUBINGA
bool "Bubinga" bool "Bubinga"
select WANT_EARLY_SERIAL
help help
This option enables support for the IBM 405EP evaluation board. This option enables support for the IBM 405EP evaluation board.
@ -70,21 +76,25 @@ choice
config BAMBOO config BAMBOO
bool "Bamboo" bool "Bamboo"
select WANT_EARLY_SERIAL
help help
This option enables support for the IBM PPC440EP evaluation board. This option enables support for the IBM PPC440EP evaluation board.
config EBONY config EBONY
bool "Ebony" bool "Ebony"
select WANT_EARLY_SERIAL
help help
This option enables support for the IBM PPC440GP evaluation board. This option enables support for the IBM PPC440GP evaluation board.
config LUAN config LUAN
bool "Luan" bool "Luan"
select WANT_EARLY_SERIAL
help help
This option enables support for the IBM PPC440SP evaluation board. This option enables support for the IBM PPC440SP evaluation board.
config OCOTEA config OCOTEA
bool "Ocotea" bool "Ocotea"
select WANT_EARLY_SERIAL
help help
This option enables support for the IBM PPC440GX evaluation board. This option enables support for the IBM PPC440GX evaluation board.
@ -230,10 +240,6 @@ config PPC_GEN550
depends on 4xx depends on 4xx
default y default y
config PM
bool "Power Management support (EXPERIMENTAL)"
depends on 4xx && EXPERIMENTAL
choice choice
prompt "TTYS0 device and default console" prompt "TTYS0 device and default console"
depends on 40x depends on 40x

View file

@ -46,9 +46,9 @@ int __cpcmd(const char *cmd, char *response, int rlen, int *response_code)
"lra 3,0(%4)\n" "lra 3,0(%4)\n"
"lr 5,%5\n" "lr 5,%5\n"
"diag 2,4,0x8\n" "diag 2,4,0x8\n"
"brc 8, .Litfits\n" "brc 8, 1f\n"
"ar 5, %5\n" "ar 5, %5\n"
".Litfits: \n" "1: \n"
"lr %0,4\n" "lr %0,4\n"
"lr %1,5\n" "lr %1,5\n"
: "=d" (return_code), "=d" (return_len) : "=d" (return_code), "=d" (return_len)
@ -64,9 +64,9 @@ int __cpcmd(const char *cmd, char *response, int rlen, int *response_code)
"sam31\n" "sam31\n"
"diag 2,4,0x8\n" "diag 2,4,0x8\n"
"sam64\n" "sam64\n"
"brc 8, .Litfits\n" "brc 8, 1f\n"
"agr 5, %5\n" "agr 5, %5\n"
".Litfits: \n" "1: \n"
"lgr %0,4\n" "lgr %0,4\n"
"lgr %1,5\n" "lgr %1,5\n"
: "=d" (return_code), "=d" (return_len) : "=d" (return_code), "=d" (return_len)

View file

@ -98,8 +98,9 @@ extern void ___rw_write_enter(void);
* The module references will be fixed up by module_frob_arch_sections. * The module references will be fixed up by module_frob_arch_sections.
*/ */
#define DOT_ALIAS2(__ret, __x, __arg1, __arg2) \ #define DOT_ALIAS2(__ret, __x, __arg1, __arg2) \
extern __ret __x(__arg1, __arg2) \ extern __ret __x(__arg1, __arg2); \
__attribute__((weak, alias("." # __x))); asm(".weak " #__x);\
asm(#__x "=." #__x);
DOT_ALIAS2(int, div, int, int) DOT_ALIAS2(int, div, int, int)
DOT_ALIAS2(int, mul, int, int) DOT_ALIAS2(int, mul, int, int)

View file

@ -8,7 +8,7 @@ EXTRA_CFLAGS := -Werror
extra-y := head.o init_task.o vmlinux.lds extra-y := head.o init_task.o vmlinux.lds
obj-y := process.o setup.o cpu.o idprom.o \ obj-y := process.o setup.o cpu.o idprom.o \
traps.o devices.o auxio.o \ traps.o devices.o auxio.o una_asm.o \
irq.o ptrace.o time.o sys_sparc.o signal.o \ irq.o ptrace.o time.o sys_sparc.o signal.o \
unaligned.o central.o pci.o starfire.o semaphore.o \ unaligned.o central.o pci.o starfire.o semaphore.o \
power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o

View file

@ -2127,6 +2127,9 @@ void __init trap_init(void)
TI_PRE_COUNT != offsetof(struct thread_info, preempt_count) || TI_PRE_COUNT != offsetof(struct thread_info, preempt_count) ||
TI_NEW_CHILD != offsetof(struct thread_info, new_child) || TI_NEW_CHILD != offsetof(struct thread_info, new_child) ||
TI_SYS_NOERROR != offsetof(struct thread_info, syscall_noerror) || TI_SYS_NOERROR != offsetof(struct thread_info, syscall_noerror) ||
TI_RESTART_BLOCK != offsetof(struct thread_info, restart_block) ||
TI_KUNA_REGS != offsetof(struct thread_info, kern_una_regs) ||
TI_KUNA_INSN != offsetof(struct thread_info, kern_una_insn) ||
TI_FPREGS != offsetof(struct thread_info, fpregs) || TI_FPREGS != offsetof(struct thread_info, fpregs) ||
(TI_FPREGS & (64 - 1))) (TI_FPREGS & (64 - 1)))
thread_info_offsets_are_bolixed_dave(); thread_info_offsets_are_bolixed_dave();

View file

@ -0,0 +1,153 @@
/* una_asm.S: Kernel unaligned trap assembler helpers.
*
* Copyright (C) 1996,2005 David S. Miller (davem@davemloft.net)
* Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
*/
.text
kernel_unaligned_trap_fault:
call kernel_mna_trap_fault
nop
retl
nop
.size kern_unaligned_trap_fault, .-kern_unaligned_trap_fault
.globl __do_int_store
__do_int_store:
rd %asi, %o4
wr %o3, 0, %asi
ldx [%o2], %g3
cmp %o1, 2
be,pn %icc, 2f
cmp %o1, 4
be,pt %icc, 1f
srlx %g3, 24, %g2
srlx %g3, 56, %g1
srlx %g3, 48, %g7
4: stba %g1, [%o0] %asi
srlx %g3, 40, %g1
5: stba %g7, [%o0 + 1] %asi
srlx %g3, 32, %g7
6: stba %g1, [%o0 + 2] %asi
7: stba %g7, [%o0 + 3] %asi
srlx %g3, 16, %g1
8: stba %g2, [%o0 + 4] %asi
srlx %g3, 8, %g7
9: stba %g1, [%o0 + 5] %asi
10: stba %g7, [%o0 + 6] %asi
ba,pt %xcc, 0f
11: stba %g3, [%o0 + 7] %asi
1: srl %g3, 16, %g7
12: stba %g2, [%o0] %asi
srl %g3, 8, %g2
13: stba %g7, [%o0 + 1] %asi
14: stba %g2, [%o0 + 2] %asi
ba,pt %xcc, 0f
15: stba %g3, [%o0 + 3] %asi
2: srl %g3, 8, %g2
16: stba %g2, [%o0] %asi
17: stba %g3, [%o0 + 1] %asi
0:
wr %o4, 0x0, %asi
retl
nop
.size __do_int_store, .-__do_int_store
.section __ex_table
.word 4b, kernel_unaligned_trap_fault
.word 5b, kernel_unaligned_trap_fault
.word 6b, kernel_unaligned_trap_fault
.word 7b, kernel_unaligned_trap_fault
.word 8b, kernel_unaligned_trap_fault
.word 9b, kernel_unaligned_trap_fault
.word 10b, kernel_unaligned_trap_fault
.word 11b, kernel_unaligned_trap_fault
.word 12b, kernel_unaligned_trap_fault
.word 13b, kernel_unaligned_trap_fault
.word 14b, kernel_unaligned_trap_fault
.word 15b, kernel_unaligned_trap_fault
.word 16b, kernel_unaligned_trap_fault
.word 17b, kernel_unaligned_trap_fault
.previous
.globl do_int_load
do_int_load:
rd %asi, %o5
wr %o4, 0, %asi
cmp %o1, 8
bge,pn %icc, 9f
cmp %o1, 4
be,pt %icc, 6f
4: lduba [%o2] %asi, %g2
5: lduba [%o2 + 1] %asi, %g3
sll %g2, 8, %g2
brz,pt %o3, 3f
add %g2, %g3, %g2
sllx %g2, 48, %g2
srax %g2, 48, %g2
3: ba,pt %xcc, 0f
stx %g2, [%o0]
6: lduba [%o2 + 1] %asi, %g3
sll %g2, 24, %g2
7: lduba [%o2 + 2] %asi, %g7
sll %g3, 16, %g3
8: lduba [%o2 + 3] %asi, %g1
sll %g7, 8, %g7
or %g2, %g3, %g2
or %g7, %g1, %g7
or %g2, %g7, %g2
brnz,a,pt %o3, 3f
sra %g2, 0, %g2
3: ba,pt %xcc, 0f
stx %g2, [%o0]
9: lduba [%o2] %asi, %g2
10: lduba [%o2 + 1] %asi, %g3
sllx %g2, 56, %g2
11: lduba [%o2 + 2] %asi, %g7
sllx %g3, 48, %g3
12: lduba [%o2 + 3] %asi, %g1
sllx %g7, 40, %g7
sllx %g1, 32, %g1
or %g2, %g3, %g2
or %g7, %g1, %g7
13: lduba [%o2 + 4] %asi, %g3
or %g2, %g7, %g7
14: lduba [%o2 + 5] %asi, %g1
sllx %g3, 24, %g3
15: lduba [%o2 + 6] %asi, %g2
sllx %g1, 16, %g1
or %g7, %g3, %g7
16: lduba [%o2 + 7] %asi, %g3
sllx %g2, 8, %g2
or %g7, %g1, %g7
or %g2, %g3, %g2
or %g7, %g2, %g7
cmp %o1, 8
be,a,pt %icc, 0f
stx %g7, [%o0]
srlx %g7, 32, %g2
sra %g7, 0, %g7
stx %g2, [%o0]
stx %g7, [%o0 + 8]
0:
wr %o5, 0x0, %asi
retl
nop
.size __do_int_load, .-__do_int_load
.section __ex_table
.word 4b, kernel_unaligned_trap_fault
.word 5b, kernel_unaligned_trap_fault
.word 6b, kernel_unaligned_trap_fault
.word 7b, kernel_unaligned_trap_fault
.word 8b, kernel_unaligned_trap_fault
.word 9b, kernel_unaligned_trap_fault
.word 10b, kernel_unaligned_trap_fault
.word 11b, kernel_unaligned_trap_fault
.word 12b, kernel_unaligned_trap_fault
.word 13b, kernel_unaligned_trap_fault
.word 14b, kernel_unaligned_trap_fault
.word 15b, kernel_unaligned_trap_fault
.word 16b, kernel_unaligned_trap_fault
.previous

View file

@ -180,169 +180,28 @@ static void __attribute_used__ unaligned_panic(char *str, struct pt_regs *regs)
die_if_kernel(str, regs); die_if_kernel(str, regs);
} }
#define do_integer_load(dest_reg, size, saddr, is_signed, asi, errh) ({ \ extern void do_int_load(unsigned long *dest_reg, int size,
__asm__ __volatile__ ( \ unsigned long *saddr, int is_signed, int asi);
"wr %4, 0, %%asi\n\t" \
"cmp %1, 8\n\t" \
"bge,pn %%icc, 9f\n\t" \
" cmp %1, 4\n\t" \
"be,pt %%icc, 6f\n" \
"4:\t" " lduba [%2] %%asi, %%l1\n" \
"5:\t" "lduba [%2 + 1] %%asi, %%l2\n\t" \
"sll %%l1, 8, %%l1\n\t" \
"brz,pt %3, 3f\n\t" \
" add %%l1, %%l2, %%l1\n\t" \
"sllx %%l1, 48, %%l1\n\t" \
"srax %%l1, 48, %%l1\n" \
"3:\t" "ba,pt %%xcc, 0f\n\t" \
" stx %%l1, [%0]\n" \
"6:\t" "lduba [%2 + 1] %%asi, %%l2\n\t" \
"sll %%l1, 24, %%l1\n" \
"7:\t" "lduba [%2 + 2] %%asi, %%g7\n\t" \
"sll %%l2, 16, %%l2\n" \
"8:\t" "lduba [%2 + 3] %%asi, %%g1\n\t" \
"sll %%g7, 8, %%g7\n\t" \
"or %%l1, %%l2, %%l1\n\t" \
"or %%g7, %%g1, %%g7\n\t" \
"or %%l1, %%g7, %%l1\n\t" \
"brnz,a,pt %3, 3f\n\t" \
" sra %%l1, 0, %%l1\n" \
"3:\t" "ba,pt %%xcc, 0f\n\t" \
" stx %%l1, [%0]\n" \
"9:\t" "lduba [%2] %%asi, %%l1\n" \
"10:\t" "lduba [%2 + 1] %%asi, %%l2\n\t" \
"sllx %%l1, 56, %%l1\n" \
"11:\t" "lduba [%2 + 2] %%asi, %%g7\n\t" \
"sllx %%l2, 48, %%l2\n" \
"12:\t" "lduba [%2 + 3] %%asi, %%g1\n\t" \
"sllx %%g7, 40, %%g7\n\t" \
"sllx %%g1, 32, %%g1\n\t" \
"or %%l1, %%l2, %%l1\n\t" \
"or %%g7, %%g1, %%g7\n" \
"13:\t" "lduba [%2 + 4] %%asi, %%l2\n\t" \
"or %%l1, %%g7, %%g7\n" \
"14:\t" "lduba [%2 + 5] %%asi, %%g1\n\t" \
"sllx %%l2, 24, %%l2\n" \
"15:\t" "lduba [%2 + 6] %%asi, %%l1\n\t" \
"sllx %%g1, 16, %%g1\n\t" \
"or %%g7, %%l2, %%g7\n" \
"16:\t" "lduba [%2 + 7] %%asi, %%l2\n\t" \
"sllx %%l1, 8, %%l1\n\t" \
"or %%g7, %%g1, %%g7\n\t" \
"or %%l1, %%l2, %%l1\n\t" \
"or %%g7, %%l1, %%g7\n\t" \
"cmp %1, 8\n\t" \
"be,a,pt %%icc, 0f\n\t" \
" stx %%g7, [%0]\n\t" \
"srlx %%g7, 32, %%l1\n\t" \
"sra %%g7, 0, %%g7\n\t" \
"stx %%l1, [%0]\n\t" \
"stx %%g7, [%0 + 8]\n" \
"0:\n\t" \
"wr %%g0, %5, %%asi\n\n\t" \
".section __ex_table\n\t" \
".word 4b, " #errh "\n\t" \
".word 5b, " #errh "\n\t" \
".word 6b, " #errh "\n\t" \
".word 7b, " #errh "\n\t" \
".word 8b, " #errh "\n\t" \
".word 9b, " #errh "\n\t" \
".word 10b, " #errh "\n\t" \
".word 11b, " #errh "\n\t" \
".word 12b, " #errh "\n\t" \
".word 13b, " #errh "\n\t" \
".word 14b, " #errh "\n\t" \
".word 15b, " #errh "\n\t" \
".word 16b, " #errh "\n\n\t" \
".previous\n\t" \
: : "r" (dest_reg), "r" (size), "r" (saddr), "r" (is_signed), \
"r" (asi), "i" (ASI_AIUS) \
: "l1", "l2", "g7", "g1", "cc"); \
})
#define store_common(dst_addr, size, src_val, asi, errh) ({ \ extern void __do_int_store(unsigned long *dst_addr, int size,
__asm__ __volatile__ ( \ unsigned long *src_val, int asi);
"wr %3, 0, %%asi\n\t" \
"ldx [%2], %%l1\n" \
"cmp %1, 2\n\t" \
"be,pn %%icc, 2f\n\t" \
" cmp %1, 4\n\t" \
"be,pt %%icc, 1f\n\t" \
" srlx %%l1, 24, %%l2\n\t" \
"srlx %%l1, 56, %%g1\n\t" \
"srlx %%l1, 48, %%g7\n" \
"4:\t" "stba %%g1, [%0] %%asi\n\t" \
"srlx %%l1, 40, %%g1\n" \
"5:\t" "stba %%g7, [%0 + 1] %%asi\n\t" \
"srlx %%l1, 32, %%g7\n" \
"6:\t" "stba %%g1, [%0 + 2] %%asi\n" \
"7:\t" "stba %%g7, [%0 + 3] %%asi\n\t" \
"srlx %%l1, 16, %%g1\n" \
"8:\t" "stba %%l2, [%0 + 4] %%asi\n\t" \
"srlx %%l1, 8, %%g7\n" \
"9:\t" "stba %%g1, [%0 + 5] %%asi\n" \
"10:\t" "stba %%g7, [%0 + 6] %%asi\n\t" \
"ba,pt %%xcc, 0f\n" \
"11:\t" " stba %%l1, [%0 + 7] %%asi\n" \
"1:\t" "srl %%l1, 16, %%g7\n" \
"12:\t" "stba %%l2, [%0] %%asi\n\t" \
"srl %%l1, 8, %%l2\n" \
"13:\t" "stba %%g7, [%0 + 1] %%asi\n" \
"14:\t" "stba %%l2, [%0 + 2] %%asi\n\t" \
"ba,pt %%xcc, 0f\n" \
"15:\t" " stba %%l1, [%0 + 3] %%asi\n" \
"2:\t" "srl %%l1, 8, %%l2\n" \
"16:\t" "stba %%l2, [%0] %%asi\n" \
"17:\t" "stba %%l1, [%0 + 1] %%asi\n" \
"0:\n\t" \
"wr %%g0, %4, %%asi\n\n\t" \
".section __ex_table\n\t" \
".word 4b, " #errh "\n\t" \
".word 5b, " #errh "\n\t" \
".word 6b, " #errh "\n\t" \
".word 7b, " #errh "\n\t" \
".word 8b, " #errh "\n\t" \
".word 9b, " #errh "\n\t" \
".word 10b, " #errh "\n\t" \
".word 11b, " #errh "\n\t" \
".word 12b, " #errh "\n\t" \
".word 13b, " #errh "\n\t" \
".word 14b, " #errh "\n\t" \
".word 15b, " #errh "\n\t" \
".word 16b, " #errh "\n\t" \
".word 17b, " #errh "\n\n\t" \
".previous\n\t" \
: : "r" (dst_addr), "r" (size), "r" (src_val), "r" (asi), "i" (ASI_AIUS)\
: "l1", "l2", "g7", "g1", "cc"); \
})
#define do_integer_store(reg_num, size, dst_addr, regs, asi, errh) ({ \ static inline void do_int_store(int reg_num, int size, unsigned long *dst_addr,
unsigned long zero = 0; \ struct pt_regs *regs, int asi)
unsigned long *src_val = &zero; \ {
\ unsigned long zero = 0;
if (size == 16) { \ unsigned long *src_val = &zero;
size = 8; \
zero = (((long)(reg_num ? \
(unsigned)fetch_reg(reg_num, regs) : 0)) << 32) | \
(unsigned)fetch_reg(reg_num + 1, regs); \
} else if (reg_num) src_val = fetch_reg_addr(reg_num, regs); \
store_common(dst_addr, size, src_val, asi, errh); \
})
extern void smp_capture(void); if (size == 16) {
extern void smp_release(void); size = 8;
zero = (((long)(reg_num ?
#define do_atomic(srcdest_reg, mem, errh) ({ \ (unsigned)fetch_reg(reg_num, regs) : 0)) << 32) |
unsigned long flags, tmp; \ (unsigned)fetch_reg(reg_num + 1, regs);
\ } else if (reg_num) {
smp_capture(); \ src_val = fetch_reg_addr(reg_num, regs);
local_irq_save(flags); \ }
tmp = *srcdest_reg; \ __do_int_store(dst_addr, size, src_val, asi);
do_integer_load(srcdest_reg, 4, mem, 0, errh); \ }
store_common(mem, 4, &tmp, errh); \
local_irq_restore(flags); \
smp_release(); \
})
static inline void advance(struct pt_regs *regs) static inline void advance(struct pt_regs *regs)
{ {
@ -364,24 +223,29 @@ static inline int ok_for_kernel(unsigned int insn)
return !floating_point_load_or_store_p(insn); return !floating_point_load_or_store_p(insn);
} }
void kernel_mna_trap_fault(struct pt_regs *regs, unsigned int insn) __asm__ ("kernel_mna_trap_fault"); void kernel_mna_trap_fault(void)
void kernel_mna_trap_fault(struct pt_regs *regs, unsigned int insn)
{ {
struct pt_regs *regs = current_thread_info()->kern_una_regs;
unsigned int insn = current_thread_info()->kern_una_insn;
unsigned long g2 = regs->u_regs[UREG_G2]; unsigned long g2 = regs->u_regs[UREG_G2];
unsigned long fixup = search_extables_range(regs->tpc, &g2); unsigned long fixup = search_extables_range(regs->tpc, &g2);
if (!fixup) { if (!fixup) {
unsigned long address = compute_effective_address(regs, insn, ((insn >> 25) & 0x1f)); unsigned long address;
address = compute_effective_address(regs, insn,
((insn >> 25) & 0x1f));
if (address < PAGE_SIZE) { if (address < PAGE_SIZE) {
printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference in mna handler"); printk(KERN_ALERT "Unable to handle kernel NULL "
"pointer dereference in mna handler");
} else } else
printk(KERN_ALERT "Unable to handle kernel paging request in mna handler"); printk(KERN_ALERT "Unable to handle kernel paging "
"request in mna handler");
printk(KERN_ALERT " at virtual address %016lx\n",address); printk(KERN_ALERT " at virtual address %016lx\n",address);
printk(KERN_ALERT "current->{mm,active_mm}->context = %016lx\n", printk(KERN_ALERT "current->{active_,}mm->context = %016lx\n",
(current->mm ? CTX_HWBITS(current->mm->context) : (current->mm ? CTX_HWBITS(current->mm->context) :
CTX_HWBITS(current->active_mm->context))); CTX_HWBITS(current->active_mm->context)));
printk(KERN_ALERT "current->{mm,active_mm}->pgd = %016lx\n", printk(KERN_ALERT "current->{active_,}mm->pgd = %016lx\n",
(current->mm ? (unsigned long) current->mm->pgd : (current->mm ? (unsigned long) current->mm->pgd :
(unsigned long) current->active_mm->pgd)); (unsigned long) current->active_mm->pgd));
die_if_kernel("Oops", regs); die_if_kernel("Oops", regs);
@ -400,48 +264,41 @@ asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn, u
enum direction dir = decode_direction(insn); enum direction dir = decode_direction(insn);
int size = decode_access_size(insn); int size = decode_access_size(insn);
current_thread_info()->kern_una_regs = regs;
current_thread_info()->kern_una_insn = insn;
if (!ok_for_kernel(insn) || dir == both) { if (!ok_for_kernel(insn) || dir == both) {
printk("Unsupported unaligned load/store trap for kernel at <%016lx>.\n", printk("Unsupported unaligned load/store trap for kernel "
regs->tpc); "at <%016lx>.\n", regs->tpc);
unaligned_panic("Kernel does fpu/atomic unaligned load/store.", regs); unaligned_panic("Kernel does fpu/atomic "
"unaligned load/store.", regs);
__asm__ __volatile__ ("\n" kernel_mna_trap_fault();
"kernel_unaligned_trap_fault:\n\t"
"mov %0, %%o0\n\t"
"call kernel_mna_trap_fault\n\t"
" mov %1, %%o1\n\t"
:
: "r" (regs), "r" (insn)
: "o0", "o1", "o2", "o3", "o4", "o5", "o7",
"g1", "g2", "g3", "g4", "g7", "cc");
} else { } else {
unsigned long addr = compute_effective_address(regs, insn, ((insn >> 25) & 0x1f)); unsigned long addr;
addr = compute_effective_address(regs, insn,
((insn >> 25) & 0x1f));
#ifdef DEBUG_MNA #ifdef DEBUG_MNA
printk("KMNA: pc=%016lx [dir=%s addr=%016lx size=%d] retpc[%016lx]\n", printk("KMNA: pc=%016lx [dir=%s addr=%016lx size=%d] "
regs->tpc, dirstrings[dir], addr, size, regs->u_regs[UREG_RETPC]); "retpc[%016lx]\n",
regs->tpc, dirstrings[dir], addr, size,
regs->u_regs[UREG_RETPC]);
#endif #endif
switch (dir) { switch (dir) {
case load: case load:
do_integer_load(fetch_reg_addr(((insn>>25)&0x1f), regs), do_int_load(fetch_reg_addr(((insn>>25)&0x1f), regs),
size, (unsigned long *) addr, size, (unsigned long *) addr,
decode_signedness(insn), decode_asi(insn, regs), decode_signedness(insn),
kernel_unaligned_trap_fault); decode_asi(insn, regs));
break; break;
case store: case store:
do_integer_store(((insn>>25)&0x1f), size, do_int_store(((insn>>25)&0x1f), size,
(unsigned long *) addr, regs, (unsigned long *) addr, regs,
decode_asi(insn, regs), decode_asi(insn, regs));
kernel_unaligned_trap_fault);
break; break;
#if 0 /* unsupported */
case both:
do_atomic(fetch_reg_addr(((insn>>25)&0x1f), regs),
(unsigned long *) addr,
kernel_unaligned_trap_fault);
break;
#endif
default: default:
panic("Impossible kernel unaligned trap."); panic("Impossible kernel unaligned trap.");
/* Not reached... */ /* Not reached... */

View file

@ -492,6 +492,14 @@ void __cpuinit start_secondary(void)
*/ */
set_cpu_sibling_map(smp_processor_id()); set_cpu_sibling_map(smp_processor_id());
/*
* Wait for TSC sync to not schedule things before.
* We still process interrupts, which could see an inconsistent
* time in that window unfortunately.
* Do this here because TSC sync has global unprotected state.
*/
tsc_sync_wait();
/* /*
* We need to hold call_lock, so there is no inconsistency * We need to hold call_lock, so there is no inconsistency
* between the time smp_call_function() determines number of * between the time smp_call_function() determines number of
@ -509,13 +517,6 @@ void __cpuinit start_secondary(void)
per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
unlock_ipi_call_lock(); unlock_ipi_call_lock();
mb();
/* Wait for TSC sync to not schedule things before.
We still process interrupts, which could see an inconsistent
time in that window unfortunately. */
tsc_sync_wait();
cpu_idle(); cpu_idle();
} }

View file

@ -211,9 +211,7 @@ int unhandled_signal(struct task_struct *tsk, int sig)
{ {
if (tsk->pid == 1) if (tsk->pid == 1)
return 1; return 1;
/* Warn for strace, but not for gdb */ if (tsk->ptrace & PT_PTRACED)
if (!test_ti_thread_flag(tsk->thread_info, TIF_SYSCALL_TRACE) &&
(tsk->ptrace & PT_PTRACED))
return 0; return 0;
return (tsk->sighand->action[sig-1].sa.sa_handler == SIG_IGN) || return (tsk->sighand->action[sig-1].sa.sa_handler == SIG_IGN) ||
(tsk->sighand->action[sig-1].sa.sa_handler == SIG_DFL); (tsk->sighand->action[sig-1].sa.sa_handler == SIG_DFL);

View file

@ -47,13 +47,22 @@ fill_mp_bus_to_cpumask(void)
* if there are no busses hanging off of the current * if there are no busses hanging off of the current
* ldt link then both the secondary and subordinate * ldt link then both the secondary and subordinate
* bus number fields are set to 0. * bus number fields are set to 0.
*
* RED-PEN
* This is slightly broken because it assumes
* HT node IDs == Linux node ids, which is not always
* true. However it is probably mostly true.
*/ */
if (!(SECONDARY_LDT_BUS_NUMBER(ldtbus) == 0 if (!(SECONDARY_LDT_BUS_NUMBER(ldtbus) == 0
&& SUBORDINATE_LDT_BUS_NUMBER(ldtbus) == 0)) { && SUBORDINATE_LDT_BUS_NUMBER(ldtbus) == 0)) {
for (j = SECONDARY_LDT_BUS_NUMBER(ldtbus); for (j = SECONDARY_LDT_BUS_NUMBER(ldtbus);
j <= SUBORDINATE_LDT_BUS_NUMBER(ldtbus); j <= SUBORDINATE_LDT_BUS_NUMBER(ldtbus);
j++) j++) {
pci_bus_to_node[j] = NODE_ID(nid); int node = NODE_ID(nid);
if (!node_online(node))
node = 0;
pci_bus_to_node[j] = node;
}
} }
} }
} }

View file

@ -80,7 +80,7 @@ config SERIAL_NONSTANDARD
config COMPUTONE config COMPUTONE
tristate "Computone IntelliPort Plus serial support" tristate "Computone IntelliPort Plus serial support"
depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP && (BROKEN || !SPARC32)
---help--- ---help---
This driver supports the entire family of Intelliport II/Plus This driver supports the entire family of Intelliport II/Plus
controllers with the exception of the MicroChannel controllers and controllers with the exception of the MicroChannel controllers and
@ -138,7 +138,7 @@ config CYZ_INTR
config DIGIEPCA config DIGIEPCA
tristate "Digiboard Intelligent Async Support" tristate "Digiboard Intelligent Async Support"
depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP && (!64BIT || BROKEN)
---help--- ---help---
This is a driver for Digi International's Xx, Xeve, and Xem series This is a driver for Digi International's Xx, Xeve, and Xem series
of cards which provide multiple serial ports. You would need of cards which provide multiple serial ports. You would need
@ -208,7 +208,7 @@ config SYNCLINK
config SYNCLINKMP config SYNCLINKMP
tristate "SyncLink Multiport support" tristate "SyncLink Multiport support"
depends on SERIAL_NONSTANDARD depends on SERIAL_NONSTANDARD && (BROKEN || !SPARC32)
help help
Enable support for the SyncLink Multiport (2 or 4 ports) Enable support for the SyncLink Multiport (2 or 4 ports)
serial adapter, running asynchronous and HDLC communications up serial adapter, running asynchronous and HDLC communications up
@ -735,7 +735,7 @@ config SGI_IP27_RTC
config GEN_RTC config GEN_RTC
tristate "Generic /dev/rtc emulation" tristate "Generic /dev/rtc emulation"
depends on RTC!=y && !IA64 && !ARM && !PPC64 depends on RTC!=y && !IA64 && !ARM && !PPC64 && !M32R && !SPARC32
---help--- ---help---
If you say Y here and create a character special file /dev/rtc with If you say Y here and create a character special file /dev/rtc with
major number 10 and minor number 135 using mknod ("man mknod"), you major number 10 and minor number 135 using mknod ("man mknod"), you

View file

@ -1,6 +1,7 @@
menu "InfiniBand support" menu "InfiniBand support"
config INFINIBAND config INFINIBAND
depends on PCI || BROKEN
tristate "InfiniBand support" tristate "InfiniBand support"
---help--- ---help---
Core support for InfiniBand (IB). Make sure to also select Core support for InfiniBand (IB). Make sure to also select

View file

@ -134,6 +134,7 @@ config HISAX_AVM_A1
config HISAX_FRITZPCI config HISAX_FRITZPCI
bool "AVM PnP/PCI (Fritz!PnP/PCI)" bool "AVM PnP/PCI (Fritz!PnP/PCI)"
depends on BROKEN || !PPC64
help help
This enables HiSax support for the AVM "Fritz!PnP" and "Fritz!PCI". This enables HiSax support for the AVM "Fritz!PnP" and "Fritz!PCI".
See <file:Documentation/isdn/README.HiSax> on how to configure it. See <file:Documentation/isdn/README.HiSax> on how to configure it.

View file

@ -103,7 +103,7 @@ config PMAC_MEDIABAY
# on non-powerbook machines (but only on PMU based ones AFAIK) # on non-powerbook machines (but only on PMU based ones AFAIK)
config PMAC_BACKLIGHT config PMAC_BACKLIGHT
bool "Backlight control for LCD screens" bool "Backlight control for LCD screens"
depends on ADB_PMU depends on ADB_PMU && (BROKEN || !PPC64)
help help
Say Y here to build in code to manage the LCD backlight on a Say Y here to build in code to manage the LCD backlight on a
Macintosh PowerBook. With this code, the backlight will be turned Macintosh PowerBook. With this code, the backlight will be turned

View file

@ -256,7 +256,6 @@ static inline void mddev_unlock(mddev_t * mddev)
{ {
up(&mddev->reconfig_sem); up(&mddev->reconfig_sem);
if (mddev->thread)
md_wakeup_thread(mddev->thread); md_wakeup_thread(mddev->thread);
} }
@ -1714,6 +1713,7 @@ static int do_md_run(mddev_t * mddev)
mddev->in_sync = 1; mddev->in_sync = 1;
set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
md_wakeup_thread(mddev->thread);
if (mddev->sb_dirty) if (mddev->sb_dirty)
md_update_sb(mddev); md_update_sb(mddev);
@ -2236,7 +2236,6 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
export_rdev(rdev); export_rdev(rdev);
set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
if (mddev->thread)
md_wakeup_thread(mddev->thread); md_wakeup_thread(mddev->thread);
return err; return err;
} }

View file

@ -356,7 +356,7 @@ config VIDEO_M32R_AR
config VIDEO_M32R_AR_M64278 config VIDEO_M32R_AR_M64278
tristate "Use Colour AR module M64278(VGA)" tristate "Use Colour AR module M64278(VGA)"
depends on VIDEO_M32R_AR depends on VIDEO_M32R_AR && PLAT_M32700UT
---help--- ---help---
Say Y here to use the Renesas M64278E-800 camera module, Say Y here to use the Renesas M64278E-800 camera module,
which supports VGA(640x480 pixcels) size of images. which supports VGA(640x480 pixcels) size of images.

View file

@ -1147,7 +1147,7 @@ config IBMVETH
be called ibmveth. be called ibmveth.
config IBM_EMAC config IBM_EMAC
tristate "IBM PPC4xx EMAC driver support" bool "IBM PPC4xx EMAC driver support"
depends on 4xx depends on 4xx
select CRC32 select CRC32
---help--- ---help---
@ -1156,7 +1156,7 @@ config IBM_EMAC
config IBM_EMAC_ERRMSG config IBM_EMAC_ERRMSG
bool "Verbose error messages" bool "Verbose error messages"
depends on IBM_EMAC depends on IBM_EMAC && BROKEN
config IBM_EMAC_RXB config IBM_EMAC_RXB
int "Number of receive buffers" int "Number of receive buffers"

View file

@ -1712,11 +1712,10 @@ struct mal_commac_ops emac_commac_ops = {
}; };
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
static int emac_netpoll(struct net_device *ndev) static void emac_netpoll(struct net_device *ndev)
{ {
emac_rxeob_dev((void *)ndev, 0); emac_rxeob_dev((void *)ndev, 0);
emac_txeob_dev((void *)ndev, 0); emac_txeob_dev((void *)ndev, 0);
return 0;
} }
#endif #endif

View file

@ -66,8 +66,8 @@
#define DRV_MODULE_NAME "tg3" #define DRV_MODULE_NAME "tg3"
#define PFX DRV_MODULE_NAME ": " #define PFX DRV_MODULE_NAME ": "
#define DRV_MODULE_VERSION "3.35" #define DRV_MODULE_VERSION "3.36"
#define DRV_MODULE_RELDATE "August 6, 2005" #define DRV_MODULE_RELDATE "August 19, 2005"
#define TG3_DEF_MAC_MODE 0 #define TG3_DEF_MAC_MODE 0
#define TG3_DEF_RX_MODE 0 #define TG3_DEF_RX_MODE 0
@ -8970,6 +8970,8 @@ static int __devinit tg3_phy_probe(struct tg3 *tp)
tp->phy_id = hw_phy_id; tp->phy_id = hw_phy_id;
if (hw_phy_id_masked == PHY_ID_BCM8002) if (hw_phy_id_masked == PHY_ID_BCM8002)
tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES; tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES;
else
tp->tg3_flags2 &= ~TG3_FLG2_PHY_SERDES;
} else { } else {
if (tp->phy_id != PHY_ID_INVALID) { if (tp->phy_id != PHY_ID_INVALID) {
/* Do nothing, phy ID already set up in /* Do nothing, phy ID already set up in

View file

@ -84,7 +84,7 @@ config 3C359
config TMS380TR config TMS380TR
tristate "Generic TMS380 Token Ring ISA/PCI adapter support" tristate "Generic TMS380 Token Ring ISA/PCI adapter support"
depends on TR && (PCI || ISA || MCA) depends on TR && (PCI || ISA && ISA_DMA_API || MCA)
select FW_LOADER select FW_LOADER
---help--- ---help---
This driver provides generic support for token ring adapters This driver provides generic support for token ring adapters

View file

@ -270,7 +270,7 @@ config PCMCIA_HERMES
config AIRO_CS config AIRO_CS
tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards" tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards"
depends on NET_RADIO && PCMCIA depends on NET_RADIO && PCMCIA && (BROKEN || !M32R)
---help--- ---help---
This is the standard Linux driver to support Cisco/Aironet PCMCIA This is the standard Linux driver to support Cisco/Aironet PCMCIA
802.11 wireless cards. This driver is the same as the Aironet 802.11 wireless cards. This driver is the same as the Aironet

View file

@ -34,7 +34,7 @@ config PARPORT
config PARPORT_PC config PARPORT_PC
tristate "PC-style hardware" tristate "PC-style hardware"
depends on PARPORT && (!SPARC64 || PCI) && !SPARC32 depends on PARPORT && (!SPARC64 || PCI) && !SPARC32 && !M32R
---help--- ---help---
You should say Y here if you have a PC-style parallel port. All You should say Y here if you have a PC-style parallel port. All
IBM PC compatible computers and some Alphas have PC-style IBM PC compatible computers and some Alphas have PC-style

View file

@ -41,6 +41,7 @@ module_param(io_speed, int, 0444);
#ifdef CONFIG_PCMCIA_PROBE #ifdef CONFIG_PCMCIA_PROBE
#include <asm/irq.h>
/* mask of IRQs already reserved by other cards, we should avoid using them */ /* mask of IRQs already reserved by other cards, we should avoid using them */
static u8 pcmcia_used_irq[NR_IRQS]; static u8 pcmcia_used_irq[NR_IRQS];
#endif #endif

View file

@ -230,7 +230,7 @@ qdio_siga_input(struct qdio_q *q)
} }
/* locked by the locks in qdio_activate and qdio_cleanup */ /* locked by the locks in qdio_activate and qdio_cleanup */
static __u32 * volatile static __u32 volatile *
qdio_get_indicator(void) qdio_get_indicator(void)
{ {
int i; int i;

View file

@ -35,15 +35,6 @@
#define z90crypt_RELEASE 3 // 2 = PCIXCC, 3 = rewrite for coding standards #define z90crypt_RELEASE 3 // 2 = PCIXCC, 3 = rewrite for coding standards
#define z90crypt_VARIANT 2 // 2 = added PCIXCC MCL3 and CEX2C support #define z90crypt_VARIANT 2 // 2 = added PCIXCC MCL3 and CEX2C support
/**
* If we are not using the sparse checker, __user has no use.
*/
#ifdef __CHECKER__
# define __user __attribute__((noderef, address_space(1)))
#else
# define __user
#endif
/** /**
* struct ica_rsa_modexpo * struct ica_rsa_modexpo
* *

View file

@ -1696,7 +1696,7 @@ config TT_DMA_EMUL
config MAC_SCSI config MAC_SCSI
bool "Macintosh NCR5380 SCSI" bool "Macintosh NCR5380 SCSI"
depends on MAC && SCSI depends on MAC && SCSI=y
help help
This is the NCR 5380 SCSI controller included on most of the 68030 This is the NCR 5380 SCSI controller included on most of the 68030
based Macintoshes. If you have one of these say Y and read the based Macintoshes. If you have one of these say Y and read the
@ -1717,7 +1717,7 @@ config SCSI_MAC_ESP
config MVME147_SCSI config MVME147_SCSI
bool "WD33C93 SCSI driver for MVME147" bool "WD33C93 SCSI driver for MVME147"
depends on MVME147 && SCSI depends on MVME147 && SCSI=y
help help
Support for the on-board SCSI controller on the Motorola MVME147 Support for the on-board SCSI controller on the Motorola MVME147
single-board computer. single-board computer.
@ -1758,7 +1758,7 @@ config SUN3_SCSI
config SUN3X_ESP config SUN3X_ESP
bool "Sun3x ESP SCSI" bool "Sun3x ESP SCSI"
depends on SUN3X && SCSI depends on SUN3X && SCSI=y
help help
The ESP was an on-board SCSI controller used on Sun 3/80 The ESP was an on-board SCSI controller used on Sun 3/80
machines. Say Y here to compile in support for it. machines. Say Y here to compile in support for it.

View file

@ -1105,6 +1105,7 @@ MODULE_AUTHOR("Jeff Garzik");
MODULE_DESCRIPTION("AHCI SATA low-level driver"); MODULE_DESCRIPTION("AHCI SATA low-level driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DEVICE_TABLE(pci, ahci_pci_tbl); MODULE_DEVICE_TABLE(pci, ahci_pci_tbl);
MODULE_VERSION(DRV_VERSION);
module_init(ahci_init); module_init(ahci_init);
module_exit(ahci_exit); module_exit(ahci_exit);

View file

@ -3,7 +3,7 @@
# #
config SCSI_ACORNSCSI_3 config SCSI_ACORNSCSI_3
tristate "Acorn SCSI card (aka30) support" tristate "Acorn SCSI card (aka30) support"
depends on ARCH_ACORN && SCSI depends on ARCH_ACORN && SCSI && BROKEN
help help
This enables support for the Acorn SCSI card (aka30). If you have an This enables support for the Acorn SCSI card (aka30). If you have an
Acorn system with one of these, say Y. If unsure, say N. Acorn system with one of these, say Y. If unsure, say N.

View file

@ -32,7 +32,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "ata_piix" #define DRV_NAME "ata_piix"
#define DRV_VERSION "1.03" #define DRV_VERSION "1.04"
enum { enum {
PIIX_IOCFG = 0x54, /* IDE I/O configuration register */ PIIX_IOCFG = 0x54, /* IDE I/O configuration register */

View file

@ -2268,19 +2268,6 @@ void ata_qc_prep(struct ata_queued_cmd *qc)
* spin_lock_irqsave(host_set lock) * spin_lock_irqsave(host_set lock)
*/ */
/**
* ata_sg_init_one - Prepare a one-entry scatter-gather list.
* @qc: Queued command
* @buf: transfer buffer
* @buflen: length of buf
*
* Builds a single-entry scatter-gather list to initiate a
* transfer utilizing the specified buffer.
*
* LOCKING:
*/
void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen) void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen)
{ {
struct scatterlist *sg; struct scatterlist *sg;
@ -2312,18 +2299,6 @@ void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen)
* spin_lock_irqsave(host_set lock) * spin_lock_irqsave(host_set lock)
*/ */
/**
* ata_sg_init - Assign a scatter gather list to a queued command
* @qc: Queued command
* @sg: Scatter-gather list
* @n_elem: length of sg list
*
* Attaches a scatter-gather list to a queued command.
*
* LOCKING:
*/
void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg, void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
unsigned int n_elem) unsigned int n_elem)
{ {

View file

@ -26,7 +26,7 @@
#define __LIBATA_H__ #define __LIBATA_H__
#define DRV_NAME "libata" #define DRV_NAME "libata"
#define DRV_VERSION "1.11" /* must be exactly four chars */ #define DRV_VERSION "1.12" /* must be exactly four chars */
struct ata_scsi_args { struct ata_scsi_args {
u16 *id; u16 *id;

View file

@ -40,7 +40,7 @@
#include "sata_promise.h" #include "sata_promise.h"
#define DRV_NAME "sata_promise" #define DRV_NAME "sata_promise"
#define DRV_VERSION "1.01" #define DRV_VERSION "1.02"
enum { enum {

View file

@ -211,7 +211,7 @@ comment "Non-8250 serial port support"
config SERIAL_AMBA_PL010 config SERIAL_AMBA_PL010
tristate "ARM AMBA PL010 serial port support" tristate "ARM AMBA PL010 serial port support"
depends on ARM_AMBA depends on ARM_AMBA && (BROKEN || !ARCH_VERSATILE)
select SERIAL_CORE select SERIAL_CORE
help help
This selects the ARM(R) AMBA(R) PrimeCell PL010 UART. If you have This selects the ARM(R) AMBA(R) PrimeCell PL010 UART. If you have
@ -819,7 +819,7 @@ config SERIAL_M32R_SIO_CONSOLE
config SERIAL_M32R_PLDSIO config SERIAL_M32R_PLDSIO
bool "M32R SIO I/F on a PLD" bool "M32R SIO I/F on a PLD"
depends on SERIAL_M32R_SIO=y depends on SERIAL_M32R_SIO=y && (PLAT_OPSPUT || PALT_USRV || PLAT_M32700UT)
default n default n
help help
Say Y here if you want to use the M32R serial controller Say Y here if you want to use the M32R serial controller

View file

@ -1123,7 +1123,7 @@ static int __init m32r_sio_console_setup(struct console *co, char *options)
return uart_set_options(port, co, baud, parity, bits, flow); return uart_set_options(port, co, baud, parity, bits, flow);
} }
extern struct uart_driver m32r_sio_reg; static struct uart_driver m32r_sio_reg;
static struct console m32r_sio_console = { static struct console m32r_sio_console = {
.name = "ttyS", .name = "ttyS",
.write = m32r_sio_console_write, .write = m32r_sio_console_write,

View file

@ -1922,7 +1922,7 @@ static int genelink_rx_fixup (struct usbnet *dev, struct sk_buff *skb)
// copy the packet data to the new skb // copy the packet data to the new skb
memcpy(skb_put(gl_skb, size), packet->packet_data, size); memcpy(skb_put(gl_skb, size), packet->packet_data, size);
skb_return (dev, skb); skb_return (dev, gl_skb);
} }
// advance to the next packet // advance to the next packet

View file

@ -346,8 +346,7 @@ static void zd1201_usbrx(struct urb *urb, struct pt_regs *regs)
if (datalen<14) if (datalen<14)
goto resubmit; goto resubmit;
if ((seq & IEEE802_11_SCTL_FRAG) == 0) { if ((seq & IEEE802_11_SCTL_FRAG) == 0) {
frag = kmalloc(sizeof(struct zd1201_frag*), frag = kmalloc(sizeof(*frag), GFP_ATOMIC);
GFP_ATOMIC);
if (!frag) if (!frag)
goto resubmit; goto resubmit;
skb = dev_alloc_skb(IEEE802_11_DATA_LEN +14+2); skb = dev_alloc_skb(IEEE802_11_DATA_LEN +14+2);

View file

@ -6,7 +6,7 @@ menu "Console display driver support"
config VGA_CONSOLE config VGA_CONSOLE
bool "VGA text console" if EMBEDDED || !X86 bool "VGA text console" if EMBEDDED || !X86
depends on !ARCH_ACORN && !ARCH_EBSA110 && !4xx && !8xx && !SPARC32 && !SPARC64 && !M68K && !PARISC depends on !ARCH_ACORN && !ARCH_EBSA110 && !4xx && !8xx && !SPARC32 && !SPARC64 && !M68K && !PARISC && !ARCH_VERSATILE
default y default y
help help
Saying Y here will allow you to use Linux in text mode through a Saying Y here will allow you to use Linux in text mode through a

View file

@ -30,7 +30,7 @@ static struct dentry *afs_mntpt_lookup(struct inode *dir,
struct dentry *dentry, struct dentry *dentry,
struct nameidata *nd); struct nameidata *nd);
static int afs_mntpt_open(struct inode *inode, struct file *file); static int afs_mntpt_open(struct inode *inode, struct file *file);
static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd); static void *afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd);
struct file_operations afs_mntpt_file_operations = { struct file_operations afs_mntpt_file_operations = {
.open = afs_mntpt_open, .open = afs_mntpt_open,
@ -233,7 +233,7 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt)
/* /*
* follow a link from a mountpoint directory, thus causing it to be mounted * follow a link from a mountpoint directory, thus causing it to be mounted
*/ */
static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd) static void *afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
struct vfsmount *newmnt; struct vfsmount *newmnt;
struct dentry *old_dentry; struct dentry *old_dentry;
@ -249,7 +249,7 @@ static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd)
newmnt = afs_mntpt_do_automount(dentry); newmnt = afs_mntpt_do_automount(dentry);
if (IS_ERR(newmnt)) { if (IS_ERR(newmnt)) {
path_release(nd); path_release(nd);
return PTR_ERR(newmnt); return (void *)newmnt;
} }
old_dentry = nd->dentry; old_dentry = nd->dentry;
@ -267,7 +267,7 @@ static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd)
} }
kleave(" = %d", err); kleave(" = %d", err);
return err; return ERR_PTR(err);
} /* end afs_mntpt_follow_link() */ } /* end afs_mntpt_follow_link() */
/*****************************************************************************/ /*****************************************************************************/

View file

@ -12,11 +12,12 @@
#include "autofs_i.h" #include "autofs_i.h"
static int autofs_follow_link(struct dentry *dentry, struct nameidata *nd) /* Nothing to release.. */
static void *autofs_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
char *s=((struct autofs_symlink *)dentry->d_inode->u.generic_ip)->data; char *s=((struct autofs_symlink *)dentry->d_inode->u.generic_ip)->data;
nd_set_link(nd, s); nd_set_link(nd, s);
return 0; return NULL;
} }
struct inode_operations autofs_symlink_inode_operations = { struct inode_operations autofs_symlink_inode_operations = {

View file

@ -12,11 +12,11 @@
#include "autofs_i.h" #include "autofs_i.h"
static int autofs4_follow_link(struct dentry *dentry, struct nameidata *nd) static void *autofs4_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
struct autofs_info *ino = autofs4_dentry_ino(dentry); struct autofs_info *ino = autofs4_dentry_ino(dentry);
nd_set_link(nd, (char *)ino->u.symlink); nd_set_link(nd, (char *)ino->u.symlink);
return 0; return NULL;
} }
struct inode_operations autofs4_symlink_inode_operations = { struct inode_operations autofs4_symlink_inode_operations = {

View file

@ -41,8 +41,8 @@ static struct inode *befs_alloc_inode(struct super_block *sb);
static void befs_destroy_inode(struct inode *inode); static void befs_destroy_inode(struct inode *inode);
static int befs_init_inodecache(void); static int befs_init_inodecache(void);
static void befs_destroy_inodecache(void); static void befs_destroy_inodecache(void);
static int befs_follow_link(struct dentry *, struct nameidata *); static void *befs_follow_link(struct dentry *, struct nameidata *);
static void befs_put_link(struct dentry *, struct nameidata *); static void befs_put_link(struct dentry *, struct nameidata *, void *);
static int befs_utf2nls(struct super_block *sb, const char *in, int in_len, static int befs_utf2nls(struct super_block *sb, const char *in, int in_len,
char **out, int *out_len); char **out, int *out_len);
static int befs_nls2utf(struct super_block *sb, const char *in, int in_len, static int befs_nls2utf(struct super_block *sb, const char *in, int in_len,
@ -461,7 +461,7 @@ befs_destroy_inodecache(void)
* The data stream become link name. Unless the LONG_SYMLINK * The data stream become link name. Unless the LONG_SYMLINK
* flag is set. * flag is set.
*/ */
static int static void *
befs_follow_link(struct dentry *dentry, struct nameidata *nd) befs_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
befs_inode_info *befs_ino = BEFS_I(dentry->d_inode); befs_inode_info *befs_ino = BEFS_I(dentry->d_inode);
@ -487,10 +487,10 @@ befs_follow_link(struct dentry *dentry, struct nameidata *nd)
} }
nd_set_link(nd, link); nd_set_link(nd, link);
return 0; return NULL;
} }
static void befs_put_link(struct dentry *dentry, struct nameidata *nd) static void befs_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
{ {
befs_inode_info *befs_ino = BEFS_I(dentry->d_inode); befs_inode_info *befs_ino = BEFS_I(dentry->d_inode);
if (befs_ino->i_flags & BEFS_LONG_SYMLINK) { if (befs_ino->i_flags & BEFS_LONG_SYMLINK) {

View file

@ -83,8 +83,8 @@ extern int cifs_dir_notify(struct file *, unsigned long arg);
extern struct dentry_operations cifs_dentry_ops; extern struct dentry_operations cifs_dentry_ops;
/* Functions related to symlinks */ /* Functions related to symlinks */
extern int cifs_follow_link(struct dentry *direntry, struct nameidata *nd); extern void *cifs_follow_link(struct dentry *direntry, struct nameidata *nd);
extern void cifs_put_link(struct dentry *direntry, struct nameidata *nd); extern void cifs_put_link(struct dentry *direntry, struct nameidata *nd, void *);
extern int cifs_readlink(struct dentry *direntry, char __user *buffer, extern int cifs_readlink(struct dentry *direntry, char __user *buffer,
int buflen); int buflen);
extern int cifs_symlink(struct inode *inode, struct dentry *direntry, extern int cifs_symlink(struct inode *inode, struct dentry *direntry,

View file

@ -92,7 +92,7 @@ cifs_hl_exit:
return rc; return rc;
} }
int void *
cifs_follow_link(struct dentry *direntry, struct nameidata *nd) cifs_follow_link(struct dentry *direntry, struct nameidata *nd)
{ {
struct inode *inode = direntry->d_inode; struct inode *inode = direntry->d_inode;
@ -148,7 +148,7 @@ out:
out_no_free: out_no_free:
FreeXid(xid); FreeXid(xid);
nd_set_link(nd, target_path); nd_set_link(nd, target_path);
return 0; return NULL; /* No cookie */
} }
int int
@ -330,7 +330,7 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
return rc; return rc;
} }
void cifs_put_link(struct dentry *direntry, struct nameidata *nd) void cifs_put_link(struct dentry *direntry, struct nameidata *nd, void *cookie)
{ {
char *p = nd_get_link(nd); char *p = nd_get_link(nd);
if (!IS_ERR(p)) if (!IS_ERR(p))

View file

@ -2491,11 +2491,11 @@ static int devfs_mknod(struct inode *dir, struct dentry *dentry, int mode,
return 0; return 0;
} /* End Function devfs_mknod */ } /* End Function devfs_mknod */
static int devfs_follow_link(struct dentry *dentry, struct nameidata *nd) static void *devfs_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
struct devfs_entry *p = get_devfs_entry_from_vfs_inode(dentry->d_inode); struct devfs_entry *p = get_devfs_entry_from_vfs_inode(dentry->d_inode);
nd_set_link(nd, p ? p->u.symlink.linkname : ERR_PTR(-ENODEV)); nd_set_link(nd, p ? p->u.symlink.linkname : ERR_PTR(-ENODEV));
return 0; return NULL;
} /* End Function devfs_follow_link */ } /* End Function devfs_follow_link */
static struct inode_operations devfs_iops = { static struct inode_operations devfs_iops = {

View file

@ -21,11 +21,11 @@
#include "xattr.h" #include "xattr.h"
#include <linux/namei.h> #include <linux/namei.h>
static int ext2_follow_link(struct dentry *dentry, struct nameidata *nd) static void *ext2_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
struct ext2_inode_info *ei = EXT2_I(dentry->d_inode); struct ext2_inode_info *ei = EXT2_I(dentry->d_inode);
nd_set_link(nd, (char *)ei->i_data); nd_set_link(nd, (char *)ei->i_data);
return 0; return NULL;
} }
struct inode_operations ext2_symlink_inode_operations = { struct inode_operations ext2_symlink_inode_operations = {

View file

@ -23,11 +23,11 @@
#include <linux/namei.h> #include <linux/namei.h>
#include "xattr.h" #include "xattr.h"
static int ext3_follow_link(struct dentry *dentry, struct nameidata *nd) static void * ext3_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
struct ext3_inode_info *ei = EXT3_I(dentry->d_inode); struct ext3_inode_info *ei = EXT3_I(dentry->d_inode);
nd_set_link(nd, (char*)ei->i_data); nd_set_link(nd, (char*)ei->i_data);
return 0; return NULL;
} }
struct inode_operations ext3_symlink_inode_operations = { struct inode_operations ext3_symlink_inode_operations = {

View file

@ -38,7 +38,7 @@
#include "vxfs_inode.h" #include "vxfs_inode.h"
static int vxfs_immed_follow_link(struct dentry *, struct nameidata *); static void * vxfs_immed_follow_link(struct dentry *, struct nameidata *);
static int vxfs_immed_readpage(struct file *, struct page *); static int vxfs_immed_readpage(struct file *, struct page *);
@ -72,12 +72,12 @@ struct address_space_operations vxfs_immed_aops = {
* Returns: * Returns:
* Zero on success, else a negative error code. * Zero on success, else a negative error code.
*/ */
static int static void *
vxfs_immed_follow_link(struct dentry *dp, struct nameidata *np) vxfs_immed_follow_link(struct dentry *dp, struct nameidata *np)
{ {
struct vxfs_inode_info *vip = VXFS_INO(dp->d_inode); struct vxfs_inode_info *vip = VXFS_INO(dp->d_inode);
nd_set_link(np, vip->vii_immed.vi_immed); nd_set_link(np, vip->vii_immed.vi_immed);
return 0; return NULL;
} }
/** /**

View file

@ -62,6 +62,8 @@ asmlinkage long sys_ioprio_set(int which, int who, int ioprio)
break; break;
case IOPRIO_CLASS_IDLE: case IOPRIO_CLASS_IDLE:
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
break; break;
default: default:
return -EINVAL; return -EINVAL;

View file

@ -18,7 +18,7 @@
#include <linux/namei.h> #include <linux/namei.h>
#include "nodelist.h" #include "nodelist.h"
static int jffs2_follow_link(struct dentry *dentry, struct nameidata *nd); static void *jffs2_follow_link(struct dentry *dentry, struct nameidata *nd);
struct inode_operations jffs2_symlink_inode_operations = struct inode_operations jffs2_symlink_inode_operations =
{ {
@ -27,9 +27,10 @@ struct inode_operations jffs2_symlink_inode_operations =
.setattr = jffs2_setattr .setattr = jffs2_setattr
}; };
static int jffs2_follow_link(struct dentry *dentry, struct nameidata *nd) static void *jffs2_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode); struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
char *p = (char *)f->dents;
/* /*
* We don't acquire the f->sem mutex here since the only data we * We don't acquire the f->sem mutex here since the only data we
@ -45,19 +46,20 @@ static int jffs2_follow_link(struct dentry *dentry, struct nameidata *nd)
* nd_set_link() call. * nd_set_link() call.
*/ */
if (!f->dents) { if (!p) {
printk(KERN_ERR "jffs2_follow_link(): can't find symlink taerget\n"); printk(KERN_ERR "jffs2_follow_link(): can't find symlink taerget\n");
return -EIO; p = ERR_PTR(-EIO);
} } else {
D1(printk(KERN_DEBUG "jffs2_follow_link(): target path is '%s'\n", (char *) f->dents)); D1(printk(KERN_DEBUG "jffs2_follow_link(): target path is '%s'\n", (char *) f->dents));
}
nd_set_link(nd, (char *)f->dents); nd_set_link(nd, p);
/* /*
* We unlock the f->sem mutex but VFS will use the f->dents string. This is safe * We unlock the f->sem mutex but VFS will use the f->dents string. This is safe
* since the only way that may cause f->dents to be changed is iput() operation. * since the only way that may cause f->dents to be changed is iput() operation.
* But VFS will not use f->dents after iput() has been called. * But VFS will not use f->dents after iput() has been called.
*/ */
return 0; return NULL;
} }

View file

@ -22,11 +22,11 @@
#include "jfs_inode.h" #include "jfs_inode.h"
#include "jfs_xattr.h" #include "jfs_xattr.h"
static int jfs_follow_link(struct dentry *dentry, struct nameidata *nd) static void *jfs_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
char *s = JFS_IP(dentry->d_inode)->i_inline; char *s = JFS_IP(dentry->d_inode)->i_inline;
nd_set_link(nd, s); nd_set_link(nd, s);
return 0; return NULL;
} }
struct inode_operations jfs_symlink_inode_operations = { struct inode_operations jfs_symlink_inode_operations = {

View file

@ -501,6 +501,7 @@ struct path {
static inline int __do_follow_link(struct path *path, struct nameidata *nd) static inline int __do_follow_link(struct path *path, struct nameidata *nd)
{ {
int error; int error;
void *cookie;
struct dentry *dentry = path->dentry; struct dentry *dentry = path->dentry;
touch_atime(path->mnt, dentry); touch_atime(path->mnt, dentry);
@ -508,13 +509,15 @@ static inline int __do_follow_link(struct path *path, struct nameidata *nd)
if (path->mnt == nd->mnt) if (path->mnt == nd->mnt)
mntget(path->mnt); mntget(path->mnt);
error = dentry->d_inode->i_op->follow_link(dentry, nd); cookie = dentry->d_inode->i_op->follow_link(dentry, nd);
if (!error) { error = PTR_ERR(cookie);
if (!IS_ERR(cookie)) {
char *s = nd_get_link(nd); char *s = nd_get_link(nd);
error = 0;
if (s) if (s)
error = __vfs_follow_link(nd, s); error = __vfs_follow_link(nd, s);
if (dentry->d_inode->i_op->put_link) if (dentry->d_inode->i_op->put_link)
dentry->d_inode->i_op->put_link(dentry, nd); dentry->d_inode->i_op->put_link(dentry, nd, cookie);
} }
dput(dentry); dput(dentry);
mntput(path->mnt); mntput(path->mnt);
@ -2344,15 +2347,17 @@ out:
int generic_readlink(struct dentry *dentry, char __user *buffer, int buflen) int generic_readlink(struct dentry *dentry, char __user *buffer, int buflen)
{ {
struct nameidata nd; struct nameidata nd;
int res; void *cookie;
nd.depth = 0; nd.depth = 0;
res = dentry->d_inode->i_op->follow_link(dentry, &nd); cookie = dentry->d_inode->i_op->follow_link(dentry, &nd);
if (!res) { if (!IS_ERR(cookie)) {
res = vfs_readlink(dentry, buffer, buflen, nd_get_link(&nd)); int res = vfs_readlink(dentry, buffer, buflen, nd_get_link(&nd));
if (dentry->d_inode->i_op->put_link) if (dentry->d_inode->i_op->put_link)
dentry->d_inode->i_op->put_link(dentry, &nd); dentry->d_inode->i_op->put_link(dentry, &nd, cookie);
cookie = ERR_PTR(res);
} }
return res; return PTR_ERR(cookie);
} }
int vfs_follow_link(struct nameidata *nd, const char *link) int vfs_follow_link(struct nameidata *nd, const char *link)
@ -2395,23 +2400,20 @@ int page_readlink(struct dentry *dentry, char __user *buffer, int buflen)
return res; return res;
} }
int page_follow_link_light(struct dentry *dentry, struct nameidata *nd) void *page_follow_link_light(struct dentry *dentry, struct nameidata *nd)
{ {
struct page *page; struct page *page = NULL;
nd_set_link(nd, page_getlink(dentry, &page)); nd_set_link(nd, page_getlink(dentry, &page));
return 0; return page;
} }
void page_put_link(struct dentry *dentry, struct nameidata *nd) void page_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
{ {
if (!IS_ERR(nd_get_link(nd))) { struct page *page = cookie;
struct page *page;
page = find_get_page(dentry->d_inode->i_mapping, 0); if (page) {
if (!page)
BUG();
kunmap(page); kunmap(page);
page_cache_release(page); page_cache_release(page);
page_cache_release(page);
} }
} }

View file

@ -939,6 +939,7 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry
error = nfs_revalidate_inode(NFS_SERVER(dir), dir); error = nfs_revalidate_inode(NFS_SERVER(dir), dir);
if (error < 0) { if (error < 0) {
res = ERR_PTR(error); res = ERR_PTR(error);
unlock_kernel();
goto out; goto out;
} }

View file

@ -27,26 +27,14 @@
/* Symlink caching in the page cache is even more simplistic /* Symlink caching in the page cache is even more simplistic
* and straight-forward than readdir caching. * and straight-forward than readdir caching.
*
* At the beginning of the page we store pointer to struct page in question,
* simplifying nfs_put_link() (if inode got invalidated we can't find the page
* to be freed via pagecache lookup).
* The NUL-terminated string follows immediately thereafter.
*/ */
struct nfs_symlink {
struct page *page;
char body[0];
};
static int nfs_symlink_filler(struct inode *inode, struct page *page) static int nfs_symlink_filler(struct inode *inode, struct page *page)
{ {
const unsigned int pgbase = offsetof(struct nfs_symlink, body);
const unsigned int pglen = PAGE_SIZE - pgbase;
int error; int error;
lock_kernel(); lock_kernel();
error = NFS_PROTO(inode)->readlink(inode, page, pgbase, pglen); error = NFS_PROTO(inode)->readlink(inode, page, 0, PAGE_SIZE);
unlock_kernel(); unlock_kernel();
if (error < 0) if (error < 0)
goto error; goto error;
@ -60,11 +48,10 @@ error:
return -EIO; return -EIO;
} }
static int nfs_follow_link(struct dentry *dentry, struct nameidata *nd) static void *nfs_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
struct inode *inode = dentry->d_inode; struct inode *inode = dentry->d_inode;
struct page *page; struct page *page;
struct nfs_symlink *p;
void *err = ERR_PTR(nfs_revalidate_inode(NFS_SERVER(inode), inode)); void *err = ERR_PTR(nfs_revalidate_inode(NFS_SERVER(inode), inode));
if (err) if (err)
goto read_failed; goto read_failed;
@ -78,28 +65,20 @@ static int nfs_follow_link(struct dentry *dentry, struct nameidata *nd)
err = ERR_PTR(-EIO); err = ERR_PTR(-EIO);
goto getlink_read_error; goto getlink_read_error;
} }
p = kmap(page); nd_set_link(nd, kmap(page));
p->page = page; return page;
nd_set_link(nd, p->body);
return 0;
getlink_read_error: getlink_read_error:
page_cache_release(page); page_cache_release(page);
read_failed: read_failed:
nd_set_link(nd, err); nd_set_link(nd, err);
return 0; return NULL;
} }
static void nfs_put_link(struct dentry *dentry, struct nameidata *nd) static void nfs_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
{ {
char *s = nd_get_link(nd); if (cookie) {
if (!IS_ERR(s)) { struct page *page = cookie;
struct nfs_symlink *p;
struct page *page;
p = container_of(s, struct nfs_symlink, body[0]);
page = p->page;
kunmap(page); kunmap(page);
page_cache_release(page); page_cache_release(page);
} }

View file

@ -890,7 +890,7 @@ static struct file_operations proc_seccomp_operations = {
}; };
#endif /* CONFIG_SECCOMP */ #endif /* CONFIG_SECCOMP */
static int proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd) static void *proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
struct inode *inode = dentry->d_inode; struct inode *inode = dentry->d_inode;
int error = -EACCES; int error = -EACCES;
@ -907,7 +907,7 @@ static int proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd)
error = PROC_I(inode)->op.proc_get_link(inode, &nd->dentry, &nd->mnt); error = PROC_I(inode)->op.proc_get_link(inode, &nd->dentry, &nd->mnt);
nd->last_type = LAST_BIND; nd->last_type = LAST_BIND;
out: out:
return error; return ERR_PTR(error);
} }
static int do_proc_readlink(struct dentry *dentry, struct vfsmount *mnt, static int do_proc_readlink(struct dentry *dentry, struct vfsmount *mnt,
@ -1692,11 +1692,11 @@ static int proc_self_readlink(struct dentry *dentry, char __user *buffer,
return vfs_readlink(dentry,buffer,buflen,tmp); return vfs_readlink(dentry,buffer,buflen,tmp);
} }
static int proc_self_follow_link(struct dentry *dentry, struct nameidata *nd) static void *proc_self_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
char tmp[30]; char tmp[30];
sprintf(tmp, "%d", current->tgid); sprintf(tmp, "%d", current->tgid);
return vfs_follow_link(nd,tmp); return ERR_PTR(vfs_follow_link(nd,tmp));
} }
static struct inode_operations proc_self_inode_operations = { static struct inode_operations proc_self_inode_operations = {

View file

@ -329,10 +329,10 @@ static void release_inode_number(unsigned int inum)
spin_unlock(&proc_inum_lock); spin_unlock(&proc_inum_lock);
} }
static int proc_follow_link(struct dentry *dentry, struct nameidata *nd) static void *proc_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
nd_set_link(nd, PDE(dentry->d_inode)->data); nd_set_link(nd, PDE(dentry->d_inode)->data);
return 0; return NULL;
} }
static struct inode_operations proc_link_inode_operations = { static struct inode_operations proc_link_inode_operations = {

View file

@ -34,7 +34,7 @@ int smb_symlink(struct inode *inode, struct dentry *dentry, const char *oldname)
return smb_proc_symlink(server_from_dentry(dentry), dentry, oldname); return smb_proc_symlink(server_from_dentry(dentry), dentry, oldname);
} }
static int smb_follow_link(struct dentry *dentry, struct nameidata *nd) static void *smb_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
char *link = __getname(); char *link = __getname();
DEBUG1("followlink of %s/%s\n", DENTRY_PATH(dentry)); DEBUG1("followlink of %s/%s\n", DENTRY_PATH(dentry));
@ -52,10 +52,10 @@ static int smb_follow_link(struct dentry *dentry, struct nameidata *nd)
} }
} }
nd_set_link(nd, link); nd_set_link(nd, link);
return 0; return NULL;
} }
static void smb_put_link(struct dentry *dentry, struct nameidata *nd) static void smb_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
{ {
char *s = nd_get_link(nd); char *s = nd_get_link(nd);
if (!IS_ERR(s)) if (!IS_ERR(s))

View file

@ -151,17 +151,17 @@ static int sysfs_getlink(struct dentry *dentry, char * path)
} }
static int sysfs_follow_link(struct dentry *dentry, struct nameidata *nd) static void *sysfs_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
int error = -ENOMEM; int error = -ENOMEM;
unsigned long page = get_zeroed_page(GFP_KERNEL); unsigned long page = get_zeroed_page(GFP_KERNEL);
if (page) if (page)
error = sysfs_getlink(dentry, (char *) page); error = sysfs_getlink(dentry, (char *) page);
nd_set_link(nd, error ? ERR_PTR(error) : (char *)page); nd_set_link(nd, error ? ERR_PTR(error) : (char *)page);
return 0; return NULL;
} }
static void sysfs_put_link(struct dentry *dentry, struct nameidata *nd) static void sysfs_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
{ {
char *page = nd_get_link(nd); char *page = nd_get_link(nd);
if (!IS_ERR(page)) if (!IS_ERR(page))

View file

@ -8,10 +8,10 @@
#include "sysv.h" #include "sysv.h"
#include <linux/namei.h> #include <linux/namei.h>
static int sysv_follow_link(struct dentry *dentry, struct nameidata *nd) static void *sysv_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
nd_set_link(nd, (char *)SYSV_I(dentry->d_inode)->i_data); nd_set_link(nd, (char *)SYSV_I(dentry->d_inode)->i_data);
return 0; return NULL;
} }
struct inode_operations sysv_fast_symlink_inode_operations = { struct inode_operations sysv_fast_symlink_inode_operations = {

View file

@ -29,11 +29,11 @@
#include <linux/namei.h> #include <linux/namei.h>
#include <linux/ufs_fs.h> #include <linux/ufs_fs.h>
static int ufs_follow_link(struct dentry *dentry, struct nameidata *nd) static void *ufs_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
struct ufs_inode_info *p = UFS_I(dentry->d_inode); struct ufs_inode_info *p = UFS_I(dentry->d_inode);
nd_set_link(nd, (char*)p->i_u1.i_symlink); nd_set_link(nd, (char*)p->i_u1.i_symlink);
return 0; return NULL;
} }
struct inode_operations ufs_fast_symlink_inode_operations = { struct inode_operations ufs_fast_symlink_inode_operations = {

View file

@ -374,7 +374,7 @@ linvfs_rename(
* we need to be very careful about how much stack we use. * we need to be very careful about how much stack we use.
* uio is kmalloced for this reason... * uio is kmalloced for this reason...
*/ */
STATIC int STATIC void *
linvfs_follow_link( linvfs_follow_link(
struct dentry *dentry, struct dentry *dentry,
struct nameidata *nd) struct nameidata *nd)
@ -391,14 +391,14 @@ linvfs_follow_link(
link = (char *)kmalloc(MAXNAMELEN+1, GFP_KERNEL); link = (char *)kmalloc(MAXNAMELEN+1, GFP_KERNEL);
if (!link) { if (!link) {
nd_set_link(nd, ERR_PTR(-ENOMEM)); nd_set_link(nd, ERR_PTR(-ENOMEM));
return 0; return NULL;
} }
uio = (uio_t *)kmalloc(sizeof(uio_t), GFP_KERNEL); uio = (uio_t *)kmalloc(sizeof(uio_t), GFP_KERNEL);
if (!uio) { if (!uio) {
kfree(link); kfree(link);
nd_set_link(nd, ERR_PTR(-ENOMEM)); nd_set_link(nd, ERR_PTR(-ENOMEM));
return 0; return NULL;
} }
vp = LINVFS_GET_VP(dentry->d_inode); vp = LINVFS_GET_VP(dentry->d_inode);
@ -422,10 +422,10 @@ linvfs_follow_link(
kfree(uio); kfree(uio);
nd_set_link(nd, link); nd_set_link(nd, link);
return 0; return NULL;
} }
static void linvfs_put_link(struct dentry *dentry, struct nameidata *nd) static void linvfs_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
{ {
char *s = nd_get_link(nd); char *s = nd_get_link(nd);
if (!IS_ERR(s)) if (!IS_ERR(s))

View file

@ -443,22 +443,19 @@ __xchg_u64(volatile long *m, unsigned long val)
if something tries to do an invalid xchg(). */ if something tries to do an invalid xchg(). */
extern void __xchg_called_with_bad_pointer(void); extern void __xchg_called_with_bad_pointer(void);
static inline unsigned long #define __xchg(ptr, x, size) \
__xchg(volatile void *ptr, unsigned long x, int size) ({ \
{ unsigned long __xchg__res; \
switch (size) { volatile void *__xchg__ptr = (ptr); \
case 1: switch (size) { \
return __xchg_u8(ptr, x); case 1: __xchg__res = __xchg_u8(__xchg__ptr, x); break; \
case 2: case 2: __xchg__res = __xchg_u16(__xchg__ptr, x); break; \
return __xchg_u16(ptr, x); case 4: __xchg__res = __xchg_u32(__xchg__ptr, x); break; \
case 4: case 8: __xchg__res = __xchg_u64(__xchg__ptr, x); break; \
return __xchg_u32(ptr, x); default: __xchg_called_with_bad_pointer(); __xchg__res = x; \
case 8: } \
return __xchg_u64(ptr, x); __xchg__res; \
} })
__xchg_called_with_bad_pointer();
return x;
}
#define xchg(ptr,x) \ #define xchg(ptr,x) \
({ \ ({ \

View file

@ -7,7 +7,9 @@
/* /*
* We use IXP425 General purpose timer for our timer needs, it runs at * We use IXP425 General purpose timer for our timer needs, it runs at
* 66.66... MHz * 66.66... MHz. We do a convulted calculation of CLOCK_TICK_RATE b/c the
* timer register ignores the bottom 2 bits of the LATCH value.
*/ */
#define CLOCK_TICK_RATE (66666666) #define FREQ 66666666
#define CLOCK_TICK_RATE (((FREQ / HZ & ~IXP4XX_OST_RELOAD_MASK) + 1) * HZ)

View file

@ -5,7 +5,7 @@
#ifdef CONFIG_BUG #ifdef CONFIG_BUG
#ifdef CONFIG_DEBUG_BUGVERBOSE #ifdef CONFIG_DEBUG_BUGVERBOSE
extern volatile void __bug(const char *file, int line, void *data); extern void __bug(const char *file, int line, void *data) __attribute__((noreturn));
/* give file/line information */ /* give file/line information */
#define BUG() __bug(__FILE__, __LINE__, NULL) #define BUG() __bug(__FILE__, __LINE__, NULL)

View file

@ -31,7 +31,7 @@ extern struct processor {
/* /*
* Special stuff for a reset * Special stuff for a reset
*/ */
volatile void (*reset)(unsigned long addr); void (*reset)(unsigned long addr) __attribute__((noreturn));
/* /*
* Idle the processor * Idle the processor
*/ */

View file

@ -41,4 +41,4 @@ extern int cpu_do_idle(void);
extern void cpu_dcache_clean_area(void *, int); extern void cpu_dcache_clean_area(void *, int);
extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm); extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm);
extern void cpu_set_pte(pte_t *ptep, pte_t pte); extern void cpu_set_pte(pte_t *ptep, pte_t pte);
extern volatile void cpu_reset(unsigned long addr); extern void cpu_reset(unsigned long addr) __attribute__((noreturn));

View file

@ -120,14 +120,6 @@ static inline void ___ia64_mmiowb(void)
ia64_mfa(); ia64_mfa();
} }
static inline const unsigned long
__ia64_get_io_port_base (void)
{
extern unsigned long ia64_iobase;
return ia64_iobase;
}
static inline void* static inline void*
__ia64_mk_io_addr (unsigned long port) __ia64_mk_io_addr (unsigned long port)
{ {

View file

@ -61,9 +61,7 @@ extern physid_mask_t phys_cpu_present_map;
* Some lowlevel functions might want to know about * Some lowlevel functions might want to know about
* the real CPU ID <-> CPU # mapping. * the real CPU ID <-> CPU # mapping.
*/ */
extern volatile int physid_2_cpu[NR_CPUS];
extern volatile int cpu_2_physid[NR_CPUS]; extern volatile int cpu_2_physid[NR_CPUS];
#define physid_to_cpu(physid) physid_2_cpu[physid]
#define cpu_to_physid(cpu_id) cpu_2_physid[cpu_id] #define cpu_to_physid(cpu_id) cpu_2_physid[cpu_id]
#define raw_smp_processor_id() (current_thread_info()->cpu) #define raw_smp_processor_id() (current_thread_info()->cpu)

View file

@ -58,7 +58,7 @@ static __inline__ void set_dec(unsigned int val)
/* Accessor functions for the timebase (RTC on 601) registers. */ /* Accessor functions for the timebase (RTC on 601) registers. */
/* If one day CONFIG_POWER is added just define __USE_RTC as 1 */ /* If one day CONFIG_POWER is added just define __USE_RTC as 1 */
#ifdef CONFIG_6xx #ifdef CONFIG_6xx
extern __inline__ int const __USE_RTC(void) { extern __inline__ int __attribute_pure__ __USE_RTC(void) {
return (mfspr(SPRN_PVR)>>16) == 1; return (mfspr(SPRN_PVR)>>16) == 1;
} }
#else #else

View file

@ -149,11 +149,11 @@ struct exception_table_entry
}) })
#endif #endif
#ifndef __CHECKER__
#define __put_user(x, ptr) \ #define __put_user(x, ptr) \
({ \ ({ \
__typeof__(*(ptr)) __x = (x); \ __typeof__(*(ptr)) __x = (x); \
int __pu_err; \ int __pu_err; \
__chk_user_ptr(ptr); \
switch (sizeof (*(ptr))) { \ switch (sizeof (*(ptr))) { \
case 1: \ case 1: \
case 2: \ case 2: \
@ -167,14 +167,6 @@ struct exception_table_entry
} \ } \
__pu_err; \ __pu_err; \
}) })
#else
#define __put_user(x, ptr) \
({ \
void __user *p; \
p = (ptr); \
0; \
})
#endif
#define put_user(x, ptr) \ #define put_user(x, ptr) \
({ \ ({ \
@ -213,11 +205,11 @@ extern int __put_user_bad(void) __attribute__((noreturn));
}) })
#endif #endif
#ifndef __CHECKER__
#define __get_user(x, ptr) \ #define __get_user(x, ptr) \
({ \ ({ \
__typeof__(*(ptr)) __x; \ __typeof__(*(ptr)) __x; \
int __gu_err; \ int __gu_err; \
__chk_user_ptr(ptr); \
switch (sizeof(*(ptr))) { \ switch (sizeof(*(ptr))) { \
case 1: \ case 1: \
case 2: \ case 2: \
@ -232,15 +224,6 @@ extern int __put_user_bad(void) __attribute__((noreturn));
(x) = __x; \ (x) = __x; \
__gu_err; \ __gu_err; \
}) })
#else
#define __get_user(x, ptr) \
({ \
void __user *p; \
p = (ptr); \
0; \
})
#endif
#define get_user(x, ptr) \ #define get_user(x, ptr) \
({ \ ({ \

View file

@ -68,6 +68,9 @@ struct thread_info {
struct restart_block restart_block; struct restart_block restart_block;
struct pt_regs *kern_una_regs;
unsigned int kern_una_insn;
unsigned long fpregs[0] __attribute__ ((aligned(64))); unsigned long fpregs[0] __attribute__ ((aligned(64)));
}; };
@ -103,6 +106,8 @@ struct thread_info {
#define TI_PCR 0x00000490 #define TI_PCR 0x00000490
#define TI_CEE_STUFF 0x00000498 #define TI_CEE_STUFF 0x00000498
#define TI_RESTART_BLOCK 0x000004a0 #define TI_RESTART_BLOCK 0x000004a0
#define TI_KUNA_REGS 0x000004c8
#define TI_KUNA_INSN 0x000004d0
#define TI_FPREGS 0x00000500 #define TI_FPREGS 0x00000500
/* We embed this in the uppermost byte of thread_info->flags */ /* We embed this in the uppermost byte of thread_info->flags */

View file

@ -993,8 +993,8 @@ struct inode_operations {
int (*rename) (struct inode *, struct dentry *, int (*rename) (struct inode *, struct dentry *,
struct inode *, struct dentry *); struct inode *, struct dentry *);
int (*readlink) (struct dentry *, char __user *,int); int (*readlink) (struct dentry *, char __user *,int);
int (*follow_link) (struct dentry *, struct nameidata *); void * (*follow_link) (struct dentry *, struct nameidata *);
void (*put_link) (struct dentry *, struct nameidata *); void (*put_link) (struct dentry *, struct nameidata *, void *);
void (*truncate) (struct inode *); void (*truncate) (struct inode *);
int (*permission) (struct inode *, int, struct nameidata *); int (*permission) (struct inode *, int, struct nameidata *);
int (*setattr) (struct dentry *, struct iattr *); int (*setattr) (struct dentry *, struct iattr *);
@ -1602,8 +1602,8 @@ extern struct file_operations generic_ro_fops;
extern int vfs_readlink(struct dentry *, char __user *, int, const char *); extern int vfs_readlink(struct dentry *, char __user *, int, const char *);
extern int vfs_follow_link(struct nameidata *, const char *); extern int vfs_follow_link(struct nameidata *, const char *);
extern int page_readlink(struct dentry *, char __user *, int); extern int page_readlink(struct dentry *, char __user *, int);
extern int page_follow_link_light(struct dentry *, struct nameidata *); extern void *page_follow_link_light(struct dentry *, struct nameidata *);
extern void page_put_link(struct dentry *, struct nameidata *); extern void page_put_link(struct dentry *, struct nameidata *, void *);
extern int page_symlink(struct inode *inode, const char *symname, int len); extern int page_symlink(struct inode *inode, const char *symname, int len);
extern struct inode_operations page_symlink_inode_operations; extern struct inode_operations page_symlink_inode_operations;
extern int generic_readlink(struct dentry *, char __user *, int); extern int generic_readlink(struct dentry *, char __user *, int);

View file

@ -139,11 +139,25 @@ enum {
#define AX25_DEF_DS_TIMEOUT (3 * 60 * HZ) /* DAMA timeout 3 minutes */ #define AX25_DEF_DS_TIMEOUT (3 * 60 * HZ) /* DAMA timeout 3 minutes */
typedef struct ax25_uid_assoc { typedef struct ax25_uid_assoc {
struct ax25_uid_assoc *next; struct hlist_node uid_node;
atomic_t refcount;
uid_t uid; uid_t uid;
ax25_address call; ax25_address call;
} ax25_uid_assoc; } ax25_uid_assoc;
#define ax25_uid_for_each(__ax25, node, list) \
hlist_for_each_entry(__ax25, node, list, uid_node)
#define ax25_uid_hold(ax25) \
atomic_inc(&((ax25)->refcount))
static inline void ax25_uid_put(ax25_uid_assoc *assoc)
{
if (atomic_dec_and_test(&assoc->refcount)) {
kfree(assoc);
}
}
typedef struct { typedef struct {
ax25_address calls[AX25_MAX_DIGIS]; ax25_address calls[AX25_MAX_DIGIS];
unsigned char repeated[AX25_MAX_DIGIS]; unsigned char repeated[AX25_MAX_DIGIS];
@ -376,7 +390,7 @@ extern unsigned long ax25_display_timer(struct timer_list *);
/* ax25_uid.c */ /* ax25_uid.c */
extern int ax25_uid_policy; extern int ax25_uid_policy;
extern ax25_address *ax25_findbyuid(uid_t); extern ax25_uid_assoc *ax25_findbyuid(uid_t);
extern int ax25_uid_ioctl(int, struct sockaddr_ax25 *); extern int ax25_uid_ioctl(int, struct sockaddr_ax25 *);
extern struct file_operations ax25_uid_fops; extern struct file_operations ax25_uid_fops;
extern void ax25_uid_free(void); extern void ax25_uid_free(void);

View file

@ -384,6 +384,11 @@ enum sock_flags {
SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */ SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */
}; };
static inline void sock_copy_flags(struct sock *nsk, struct sock *osk)
{
nsk->sk_flags = osk->sk_flags;
}
static inline void sock_set_flag(struct sock *sk, enum sock_flags flag) static inline void sock_set_flag(struct sock *sk, enum sock_flags flag)
{ {
__set_bit(flag, &sk->sk_flags); __set_bit(flag, &sk->sk_flags);

View file

@ -360,11 +360,13 @@ int snd_device_free_all(snd_card_t *card, snd_device_cmd_t cmd);
/* isadma.c */ /* isadma.c */
#ifdef CONFIG_ISA_DMA_API
#define DMA_MODE_NO_ENABLE 0x0100 #define DMA_MODE_NO_ENABLE 0x0100
void snd_dma_program(unsigned long dma, unsigned long addr, unsigned int size, unsigned short mode); void snd_dma_program(unsigned long dma, unsigned long addr, unsigned int size, unsigned short mode);
void snd_dma_disable(unsigned long dma); void snd_dma_disable(unsigned long dma);
unsigned int snd_dma_pointer(unsigned long dma, unsigned int size); unsigned int snd_dma_pointer(unsigned long dma, unsigned int size);
#endif
/* misc.c */ /* misc.c */

View file

@ -635,6 +635,23 @@ static void update_cpu_domains(struct cpuset *cur)
if (par == NULL || cpus_empty(cur->cpus_allowed)) if (par == NULL || cpus_empty(cur->cpus_allowed))
return; return;
/*
* Hack to avoid 2.6.13 partial node dynamic sched domain bug.
* Require the 'cpu_exclusive' cpuset to include all (or none)
* of the CPUs on each node, or return w/o changing sched domains.
* Remove this hack when dynamic sched domains fixed.
*/
{
int i, j;
for_each_cpu_mask(i, cur->cpus_allowed) {
for_each_cpu_mask(j, node_to_cpumask(cpu_to_node(i))) {
if (!cpu_isset(j, cur->cpus_allowed))
return;
}
}
}
/* /*
* Get all cpus from parent's cpus_allowed not part of exclusive * Get all cpus from parent's cpus_allowed not part of exclusive
* children * children

View file

@ -1023,7 +1023,7 @@ asmlinkage long sys_getppid(void)
parent = me->group_leader->real_parent; parent = me->group_leader->real_parent;
for (;;) { for (;;) {
pid = parent->tgid; pid = parent->tgid;
#ifdef CONFIG_SMP #if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT)
{ {
struct task_struct *old = parent; struct task_struct *old = parent;

View file

@ -269,6 +269,7 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
int qualifier; /* 'h', 'l', or 'L' for integer fields */ int qualifier; /* 'h', 'l', or 'L' for integer fields */
/* 'z' support added 23/7/1999 S.H. */ /* 'z' support added 23/7/1999 S.H. */
/* 'z' changed to 'Z' --davidm 1/25/99 */ /* 'z' changed to 'Z' --davidm 1/25/99 */
/* 't' added for ptrdiff_t */
/* Reject out-of-range values early */ /* Reject out-of-range values early */
if (unlikely((int) size < 0)) { if (unlikely((int) size < 0)) {
@ -339,7 +340,7 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
/* get the conversion qualifier */ /* get the conversion qualifier */
qualifier = -1; qualifier = -1;
if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' ||
*fmt =='Z' || *fmt == 'z') { *fmt =='Z' || *fmt == 'z' || *fmt == 't') {
qualifier = *fmt; qualifier = *fmt;
++fmt; ++fmt;
if (qualifier == 'l' && *fmt == 'l') { if (qualifier == 'l' && *fmt == 'l') {
@ -467,6 +468,8 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
num = (signed long) num; num = (signed long) num;
} else if (qualifier == 'Z' || qualifier == 'z') { } else if (qualifier == 'Z' || qualifier == 'z') {
num = va_arg(args, size_t); num = va_arg(args, size_t);
} else if (qualifier == 't') {
num = va_arg(args, ptrdiff_t);
} else if (qualifier == 'h') { } else if (qualifier == 'h') {
num = (unsigned short) va_arg(args, int); num = (unsigned short) va_arg(args, int);
if (flags & SIGN) if (flags & SIGN)

View file

@ -1773,32 +1773,27 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s
return 0; return 0;
} }
static int shmem_follow_link_inline(struct dentry *dentry, struct nameidata *nd) static void *shmem_follow_link_inline(struct dentry *dentry, struct nameidata *nd)
{ {
nd_set_link(nd, (char *)SHMEM_I(dentry->d_inode)); nd_set_link(nd, (char *)SHMEM_I(dentry->d_inode));
return 0; return NULL;
} }
static int shmem_follow_link(struct dentry *dentry, struct nameidata *nd) static void *shmem_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
struct page *page = NULL; struct page *page = NULL;
int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ, NULL); int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ, NULL);
nd_set_link(nd, res ? ERR_PTR(res) : kmap(page)); nd_set_link(nd, res ? ERR_PTR(res) : kmap(page));
return 0; return page;
} }
static void shmem_put_link(struct dentry *dentry, struct nameidata *nd) static void shmem_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
{ {
if (!IS_ERR(nd_get_link(nd))) { if (!IS_ERR(nd_get_link(nd))) {
struct page *page; struct page *page = cookie;
page = find_get_page(dentry->d_inode->i_mapping, 0);
if (!page)
BUG();
kunmap(page); kunmap(page);
mark_page_accessed(page); mark_page_accessed(page);
page_cache_release(page); page_cache_release(page);
page_cache_release(page);
} }
} }

View file

@ -875,12 +875,7 @@ struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
sk->sk_sndbuf = osk->sk_sndbuf; sk->sk_sndbuf = osk->sk_sndbuf;
sk->sk_state = TCP_ESTABLISHED; sk->sk_state = TCP_ESTABLISHED;
sk->sk_sleep = osk->sk_sleep; sk->sk_sleep = osk->sk_sleep;
sock_copy_flags(sk, osk);
if (sock_flag(osk, SOCK_DBG))
sock_set_flag(sk, SOCK_DBG);
if (sock_flag(osk, SOCK_ZAPPED))
sock_set_flag(sk, SOCK_ZAPPED);
oax25 = ax25_sk(osk); oax25 = ax25_sk(osk);
@ -1007,7 +1002,8 @@ static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr; struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
ax25_dev *ax25_dev = NULL; ax25_dev *ax25_dev = NULL;
ax25_address *call; ax25_uid_assoc *user;
ax25_address call;
ax25_cb *ax25; ax25_cb *ax25;
int err = 0; int err = 0;
@ -1026,9 +1022,15 @@ static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
if (addr->fsa_ax25.sax25_family != AF_AX25) if (addr->fsa_ax25.sax25_family != AF_AX25)
return -EINVAL; return -EINVAL;
call = ax25_findbyuid(current->euid); user = ax25_findbyuid(current->euid);
if (call == NULL && ax25_uid_policy && !capable(CAP_NET_ADMIN)) { if (user) {
call = user->call;
ax25_uid_put(user);
} else {
if (ax25_uid_policy && !capable(CAP_NET_ADMIN))
return -EACCES; return -EACCES;
call = addr->fsa_ax25.sax25_call;
} }
lock_sock(sk); lock_sock(sk);
@ -1039,10 +1041,7 @@ static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
goto out; goto out;
} }
if (call == NULL) ax25->source_addr = call;
ax25->source_addr = addr->fsa_ax25.sax25_call;
else
ax25->source_addr = *call;
/* /*
* User already set interface with SO_BINDTODEVICE * User already set interface with SO_BINDTODEVICE

View file

@ -422,8 +422,8 @@ static inline void ax25_adjust_path(ax25_address *addr, ax25_digi *digipeat)
*/ */
int ax25_rt_autobind(ax25_cb *ax25, ax25_address *addr) int ax25_rt_autobind(ax25_cb *ax25, ax25_address *addr)
{ {
ax25_uid_assoc *user;
ax25_route *ax25_rt; ax25_route *ax25_rt;
ax25_address *call;
int err; int err;
if ((ax25_rt = ax25_get_route(addr, NULL)) == NULL) if ((ax25_rt = ax25_get_route(addr, NULL)) == NULL)
@ -434,16 +434,18 @@ int ax25_rt_autobind(ax25_cb *ax25, ax25_address *addr)
goto put; goto put;
} }
if ((call = ax25_findbyuid(current->euid)) == NULL) { user = ax25_findbyuid(current->euid);
if (user) {
ax25->source_addr = user->call;
ax25_uid_put(user);
} else {
if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) { if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) {
err = -EPERM; err = -EPERM;
goto put; goto put;
} }
call = (ax25_address *)ax25->ax25_dev->dev->dev_addr; ax25->source_addr = *(ax25_address *)ax25->ax25_dev->dev->dev_addr;
} }
ax25->source_addr = *call;
if (ax25_rt->digipeat != NULL) { if (ax25_rt->digipeat != NULL) {
if ((ax25->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) { if ((ax25->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) {
err = -ENOMEM; err = -ENOMEM;

View file

@ -28,6 +28,7 @@
#include <linux/fcntl.h> #include <linux/fcntl.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/list.h>
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
@ -41,38 +42,41 @@
* Callsign/UID mapper. This is in kernel space for security on multi-amateur machines. * Callsign/UID mapper. This is in kernel space for security on multi-amateur machines.
*/ */
static ax25_uid_assoc *ax25_uid_list; HLIST_HEAD(ax25_uid_list);
static DEFINE_RWLOCK(ax25_uid_lock); static DEFINE_RWLOCK(ax25_uid_lock);
int ax25_uid_policy = 0; int ax25_uid_policy = 0;
ax25_address *ax25_findbyuid(uid_t uid) ax25_uid_assoc *ax25_findbyuid(uid_t uid)
{ {
ax25_uid_assoc *ax25_uid; ax25_uid_assoc *ax25_uid, *res = NULL;
ax25_address *res = NULL; struct hlist_node *node;
read_lock(&ax25_uid_lock); read_lock(&ax25_uid_lock);
for (ax25_uid = ax25_uid_list; ax25_uid != NULL; ax25_uid = ax25_uid->next) { ax25_uid_for_each(ax25_uid, node, &ax25_uid_list) {
if (ax25_uid->uid == uid) { if (ax25_uid->uid == uid) {
res = &ax25_uid->call; ax25_uid_hold(ax25_uid);
res = ax25_uid;
break; break;
} }
} }
read_unlock(&ax25_uid_lock); read_unlock(&ax25_uid_lock);
return NULL; return res;
} }
int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax) int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
{ {
ax25_uid_assoc *s, *ax25_uid; ax25_uid_assoc *ax25_uid;
struct hlist_node *node;
ax25_uid_assoc *user;
unsigned long res; unsigned long res;
switch (cmd) { switch (cmd) {
case SIOCAX25GETUID: case SIOCAX25GETUID:
res = -ENOENT; res = -ENOENT;
read_lock(&ax25_uid_lock); read_lock(&ax25_uid_lock);
for (ax25_uid = ax25_uid_list; ax25_uid != NULL; ax25_uid = ax25_uid->next) { ax25_uid_for_each(ax25_uid, node, &ax25_uid_list) {
if (ax25cmp(&sax->sax25_call, &ax25_uid->call) == 0) { if (ax25cmp(&sax->sax25_call, &ax25_uid->call) == 0) {
res = ax25_uid->uid; res = ax25_uid->uid;
break; break;
@ -85,19 +89,22 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
case SIOCAX25ADDUID: case SIOCAX25ADDUID:
if (!capable(CAP_NET_ADMIN)) if (!capable(CAP_NET_ADMIN))
return -EPERM; return -EPERM;
if (ax25_findbyuid(sax->sax25_uid)) user = ax25_findbyuid(sax->sax25_uid);
if (user) {
ax25_uid_put(user);
return -EEXIST; return -EEXIST;
}
if (sax->sax25_uid == 0) if (sax->sax25_uid == 0)
return -EINVAL; return -EINVAL;
if ((ax25_uid = kmalloc(sizeof(*ax25_uid), GFP_KERNEL)) == NULL) if ((ax25_uid = kmalloc(sizeof(*ax25_uid), GFP_KERNEL)) == NULL)
return -ENOMEM; return -ENOMEM;
atomic_set(&ax25_uid->refcount, 1);
ax25_uid->uid = sax->sax25_uid; ax25_uid->uid = sax->sax25_uid;
ax25_uid->call = sax->sax25_call; ax25_uid->call = sax->sax25_call;
write_lock(&ax25_uid_lock); write_lock(&ax25_uid_lock);
ax25_uid->next = ax25_uid_list; hlist_add_head(&ax25_uid->uid_node, &ax25_uid_list);
ax25_uid_list = ax25_uid;
write_unlock(&ax25_uid_lock); write_unlock(&ax25_uid_lock);
return 0; return 0;
@ -106,34 +113,21 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
if (!capable(CAP_NET_ADMIN)) if (!capable(CAP_NET_ADMIN))
return -EPERM; return -EPERM;
ax25_uid = NULL;
write_lock(&ax25_uid_lock); write_lock(&ax25_uid_lock);
for (ax25_uid = ax25_uid_list; ax25_uid != NULL; ax25_uid = ax25_uid->next) { ax25_uid_for_each(ax25_uid, node, &ax25_uid_list) {
if (ax25cmp(&sax->sax25_call, &ax25_uid->call) == 0) { if (ax25cmp(&sax->sax25_call, &ax25_uid->call) == 0)
break; break;
} }
}
if (ax25_uid == NULL) { if (ax25_uid == NULL) {
write_unlock(&ax25_uid_lock); write_unlock(&ax25_uid_lock);
return -ENOENT; return -ENOENT;
} }
if ((s = ax25_uid_list) == ax25_uid) { hlist_del_init(&ax25_uid->uid_node);
ax25_uid_list = s->next; ax25_uid_put(ax25_uid);
write_unlock(&ax25_uid_lock);
kfree(ax25_uid);
return 0;
}
while (s != NULL && s->next != NULL) {
if (s->next == ax25_uid) {
s->next = ax25_uid->next;
write_unlock(&ax25_uid_lock);
kfree(ax25_uid);
return 0;
}
s = s->next;
}
write_unlock(&ax25_uid_lock); write_unlock(&ax25_uid_lock);
return -ENOENT; return 0;
default: default:
return -EINVAL; return -EINVAL;
@ -147,13 +141,11 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
static void *ax25_uid_seq_start(struct seq_file *seq, loff_t *pos) static void *ax25_uid_seq_start(struct seq_file *seq, loff_t *pos)
{ {
struct ax25_uid_assoc *pt; struct ax25_uid_assoc *pt;
int i = 1; struct hlist_node *node;
int i = 0;
read_lock(&ax25_uid_lock); read_lock(&ax25_uid_lock);
if (*pos == 0) ax25_uid_for_each(pt, node, &ax25_uid_list) {
return SEQ_START_TOKEN;
for (pt = ax25_uid_list; pt != NULL; pt = pt->next) {
if (i == *pos) if (i == *pos)
return pt; return pt;
++i; ++i;
@ -164,8 +156,9 @@ static void *ax25_uid_seq_start(struct seq_file *seq, loff_t *pos)
static void *ax25_uid_seq_next(struct seq_file *seq, void *v, loff_t *pos) static void *ax25_uid_seq_next(struct seq_file *seq, void *v, loff_t *pos)
{ {
++*pos; ++*pos;
return (v == SEQ_START_TOKEN) ? ax25_uid_list :
((struct ax25_uid_assoc *) v)->next; return hlist_entry(((ax25_uid_assoc *)v)->uid_node.next,
ax25_uid_assoc, uid_node);
} }
static void ax25_uid_seq_stop(struct seq_file *seq, void *v) static void ax25_uid_seq_stop(struct seq_file *seq, void *v)
@ -180,7 +173,6 @@ static int ax25_uid_seq_show(struct seq_file *seq, void *v)
else { else {
struct ax25_uid_assoc *pt = v; struct ax25_uid_assoc *pt = v;
seq_printf(seq, "%6d %s\n", pt->uid, ax2asc(&pt->call)); seq_printf(seq, "%6d %s\n", pt->uid, ax2asc(&pt->call));
} }
return 0; return 0;
@ -213,16 +205,13 @@ struct file_operations ax25_uid_fops = {
*/ */
void __exit ax25_uid_free(void) void __exit ax25_uid_free(void)
{ {
ax25_uid_assoc *s, *ax25_uid; ax25_uid_assoc *ax25_uid;
struct hlist_node *node;
write_lock(&ax25_uid_lock); write_lock(&ax25_uid_lock);
ax25_uid = ax25_uid_list; ax25_uid_for_each(ax25_uid, node, &ax25_uid_list) {
while (ax25_uid != NULL) { hlist_del_init(&ax25_uid->uid_node);
s = ax25_uid; ax25_uid_put(ax25_uid);
ax25_uid = ax25_uid->next;
kfree(s);
} }
ax25_uid_list = NULL;
write_unlock(&ax25_uid_lock); write_unlock(&ax25_uid_lock);
} }

Some files were not shown because too many files have changed in this diff Show more