mirror of
https://github.com/torvalds/linux.git
synced 2024-11-30 16:11:38 +00:00
Auto-update from upstream
This commit is contained in:
commit
729c80c6ff
3
CREDITS
3
CREDITS
@ -2423,8 +2423,7 @@ S: Toronto, Ontario
|
||||
S: Canada
|
||||
|
||||
N: Zwane Mwaikambo
|
||||
E: zwane@linuxpower.ca
|
||||
W: http://function.linuxpower.ca
|
||||
E: zwane@arm.linux.org.uk
|
||||
D: Various driver hacking
|
||||
D: Lowlevel x86 kernel hacking
|
||||
D: General debugging
|
||||
|
@ -1739,7 +1739,7 @@ S: Maintained
|
||||
|
||||
OPL3-SA2, SA3, and SAx DRIVER
|
||||
P: Zwane Mwaikambo
|
||||
M: zwane@commfireservices.com
|
||||
M: zwane@arm.linux.org.uk
|
||||
L: linux-sound@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
@ -1995,7 +1995,7 @@ S: Maintained
|
||||
|
||||
SC1200 WDT DRIVER
|
||||
P: Zwane Mwaikambo
|
||||
M: zwane@commfireservices.com
|
||||
M: zwane@arm.linux.org.uk
|
||||
S: Maintained
|
||||
|
||||
SCHEDULER
|
||||
|
@ -726,15 +726,11 @@ __setup("apic=", apic_set_verbosity);
|
||||
static int __init detect_init_APIC (void)
|
||||
{
|
||||
u32 h, l, features;
|
||||
extern void get_cpu_vendor(struct cpuinfo_x86*);
|
||||
|
||||
/* Disabled by kernel option? */
|
||||
if (enable_local_apic < 0)
|
||||
return -1;
|
||||
|
||||
/* Workaround for us being called before identify_cpu(). */
|
||||
get_cpu_vendor(&boot_cpu_data);
|
||||
|
||||
switch (boot_cpu_data.x86_vendor) {
|
||||
case X86_VENDOR_AMD:
|
||||
if ((boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model > 1) ||
|
||||
|
@ -195,7 +195,7 @@ static void disable_lapic_nmi_watchdog(void)
|
||||
wrmsr(MSR_P6_EVNTSEL0, 0, 0);
|
||||
break;
|
||||
case 15:
|
||||
if (boot_cpu_data.x86_model > 0x3)
|
||||
if (boot_cpu_data.x86_model > 0x4)
|
||||
break;
|
||||
|
||||
wrmsr(MSR_P4_IQ_CCCR0, 0, 0);
|
||||
@ -432,7 +432,7 @@ void setup_apic_nmi_watchdog (void)
|
||||
setup_p6_watchdog();
|
||||
break;
|
||||
case 15:
|
||||
if (boot_cpu_data.x86_model > 0x3)
|
||||
if (boot_cpu_data.x86_model > 0x4)
|
||||
return;
|
||||
|
||||
if (!setup_p4_watchdog())
|
||||
|
@ -620,6 +620,7 @@ ppc4xx_clr_dma_status(unsigned int dmanr)
|
||||
return DMA_STATUS_GOOD;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC4xx_EDMA
|
||||
/*
|
||||
* Enables the burst on the channel (BTEN bit in the control/count register)
|
||||
* Note:
|
||||
@ -685,6 +686,11 @@ ppc4xx_set_burst_size(unsigned int dmanr, unsigned int bsize)
|
||||
return DMA_STATUS_GOOD;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(ppc4xx_enable_burst);
|
||||
EXPORT_SYMBOL(ppc4xx_disable_burst);
|
||||
EXPORT_SYMBOL(ppc4xx_set_burst_size);
|
||||
#endif /* CONFIG_PPC4xx_EDMA */
|
||||
|
||||
EXPORT_SYMBOL(ppc4xx_init_dma_channel);
|
||||
EXPORT_SYMBOL(ppc4xx_get_channel_config);
|
||||
EXPORT_SYMBOL(ppc4xx_set_channel_priority);
|
||||
@ -703,6 +709,4 @@ EXPORT_SYMBOL(ppc4xx_enable_dma_interrupt);
|
||||
EXPORT_SYMBOL(ppc4xx_disable_dma_interrupt);
|
||||
EXPORT_SYMBOL(ppc4xx_get_dma_status);
|
||||
EXPORT_SYMBOL(ppc4xx_clr_dma_status);
|
||||
EXPORT_SYMBOL(ppc4xx_enable_burst);
|
||||
EXPORT_SYMBOL(ppc4xx_disable_burst);
|
||||
EXPORT_SYMBOL(ppc4xx_set_burst_size);
|
||||
|
||||
|
@ -1145,5 +1145,10 @@ ENTRY(sys_call_table)
|
||||
.long sys_add_key /* 285 */
|
||||
.long sys_request_key
|
||||
.long sys_keyctl
|
||||
.long sys_ioprio_set
|
||||
.long sys_ioprio_get
|
||||
.long sys_inotify_init /* 290 */
|
||||
.long sys_inotify_add_watch
|
||||
.long sys_inotify_rm_watch
|
||||
|
||||
/* End of entry.S */
|
||||
|
@ -342,4 +342,9 @@ sys_call_table:
|
||||
.long sys_add_key
|
||||
.long sys_request_key
|
||||
.long sys_keyctl /* 315 */
|
||||
.long sys_ioprio_set
|
||||
.long sys_ioprio_get
|
||||
.long sys_inotify_init
|
||||
.long sys_inotify_add_watch
|
||||
.long sys_inotify_rm_watch /* 320 */
|
||||
|
||||
|
@ -98,8 +98,9 @@ extern void ___rw_write_enter(void);
|
||||
* The module references will be fixed up by module_frob_arch_sections.
|
||||
*/
|
||||
#define DOT_ALIAS2(__ret, __x, __arg1, __arg2) \
|
||||
extern __ret __x(__arg1, __arg2) \
|
||||
__attribute__((weak, alias("." # __x)));
|
||||
extern __ret __x(__arg1, __arg2); \
|
||||
asm(".weak " #__x);\
|
||||
asm(#__x "=." #__x);
|
||||
|
||||
DOT_ALIAS2(int, div, int, int)
|
||||
DOT_ALIAS2(int, mul, int, int)
|
||||
|
@ -8,7 +8,7 @@ EXTRA_CFLAGS := -Werror
|
||||
extra-y := head.o init_task.o vmlinux.lds
|
||||
|
||||
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 \
|
||||
unaligned.o central.o pci.o starfire.o semaphore.o \
|
||||
power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o
|
||||
|
@ -2127,6 +2127,9 @@ void __init trap_init(void)
|
||||
TI_PRE_COUNT != offsetof(struct thread_info, preempt_count) ||
|
||||
TI_NEW_CHILD != offsetof(struct thread_info, new_child) ||
|
||||
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 & (64 - 1)))
|
||||
thread_info_offsets_are_bolixed_dave();
|
||||
|
153
arch/sparc64/kernel/una_asm.S
Normal file
153
arch/sparc64/kernel/una_asm.S
Normal 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
|
@ -180,169 +180,28 @@ static void __attribute_used__ unaligned_panic(char *str, struct pt_regs *regs)
|
||||
die_if_kernel(str, regs);
|
||||
}
|
||||
|
||||
#define do_integer_load(dest_reg, size, saddr, is_signed, asi, errh) ({ \
|
||||
__asm__ __volatile__ ( \
|
||||
"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"); \
|
||||
})
|
||||
extern void do_int_load(unsigned long *dest_reg, int size,
|
||||
unsigned long *saddr, int is_signed, int asi);
|
||||
|
||||
#define store_common(dst_addr, size, src_val, asi, errh) ({ \
|
||||
__asm__ __volatile__ ( \
|
||||
"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"); \
|
||||
})
|
||||
extern void __do_int_store(unsigned long *dst_addr, int size,
|
||||
unsigned long *src_val, int asi);
|
||||
|
||||
#define do_integer_store(reg_num, size, dst_addr, regs, asi, errh) ({ \
|
||||
unsigned long zero = 0; \
|
||||
unsigned long *src_val = &zero; \
|
||||
\
|
||||
if (size == 16) { \
|
||||
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); \
|
||||
})
|
||||
static inline void do_int_store(int reg_num, int size, unsigned long *dst_addr,
|
||||
struct pt_regs *regs, int asi)
|
||||
{
|
||||
unsigned long zero = 0;
|
||||
unsigned long *src_val = &zero;
|
||||
|
||||
extern void smp_capture(void);
|
||||
extern void smp_release(void);
|
||||
|
||||
#define do_atomic(srcdest_reg, mem, errh) ({ \
|
||||
unsigned long flags, tmp; \
|
||||
\
|
||||
smp_capture(); \
|
||||
local_irq_save(flags); \
|
||||
tmp = *srcdest_reg; \
|
||||
do_integer_load(srcdest_reg, 4, mem, 0, errh); \
|
||||
store_common(mem, 4, &tmp, errh); \
|
||||
local_irq_restore(flags); \
|
||||
smp_release(); \
|
||||
})
|
||||
if (size == 16) {
|
||||
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);
|
||||
}
|
||||
__do_int_store(dst_addr, size, src_val, asi);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
void kernel_mna_trap_fault(struct pt_regs *regs, unsigned int insn) __asm__ ("kernel_mna_trap_fault");
|
||||
|
||||
void kernel_mna_trap_fault(struct pt_regs *regs, unsigned int insn)
|
||||
void kernel_mna_trap_fault(void)
|
||||
{
|
||||
unsigned long g2 = regs->u_regs [UREG_G2];
|
||||
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 fixup = search_extables_range(regs->tpc, &g2);
|
||||
|
||||
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) {
|
||||
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
|
||||
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 "current->{mm,active_mm}->context = %016lx\n",
|
||||
printk(KERN_ALERT "current->{active_,}mm->context = %016lx\n",
|
||||
(current->mm ? CTX_HWBITS(current->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 :
|
||||
(unsigned long) current->active_mm->pgd));
|
||||
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);
|
||||
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) {
|
||||
printk("Unsupported unaligned load/store trap for kernel at <%016lx>.\n",
|
||||
regs->tpc);
|
||||
unaligned_panic("Kernel does fpu/atomic unaligned load/store.", regs);
|
||||
printk("Unsupported unaligned load/store trap for kernel "
|
||||
"at <%016lx>.\n", regs->tpc);
|
||||
unaligned_panic("Kernel does fpu/atomic "
|
||||
"unaligned load/store.", regs);
|
||||
|
||||
__asm__ __volatile__ ("\n"
|
||||
"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");
|
||||
kernel_mna_trap_fault();
|
||||
} 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
|
||||
printk("KMNA: pc=%016lx [dir=%s addr=%016lx size=%d] retpc[%016lx]\n",
|
||||
regs->tpc, dirstrings[dir], addr, size, regs->u_regs[UREG_RETPC]);
|
||||
printk("KMNA: pc=%016lx [dir=%s addr=%016lx size=%d] "
|
||||
"retpc[%016lx]\n",
|
||||
regs->tpc, dirstrings[dir], addr, size,
|
||||
regs->u_regs[UREG_RETPC]);
|
||||
#endif
|
||||
switch (dir) {
|
||||
case load:
|
||||
do_integer_load(fetch_reg_addr(((insn>>25)&0x1f), regs),
|
||||
size, (unsigned long *) addr,
|
||||
decode_signedness(insn), decode_asi(insn, regs),
|
||||
kernel_unaligned_trap_fault);
|
||||
do_int_load(fetch_reg_addr(((insn>>25)&0x1f), regs),
|
||||
size, (unsigned long *) addr,
|
||||
decode_signedness(insn),
|
||||
decode_asi(insn, regs));
|
||||
break;
|
||||
|
||||
case store:
|
||||
do_integer_store(((insn>>25)&0x1f), size,
|
||||
(unsigned long *) addr, regs,
|
||||
decode_asi(insn, regs),
|
||||
kernel_unaligned_trap_fault);
|
||||
do_int_store(((insn>>25)&0x1f), size,
|
||||
(unsigned long *) addr, regs,
|
||||
decode_asi(insn, regs));
|
||||
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:
|
||||
panic("Impossible kernel unaligned trap.");
|
||||
/* Not reached... */
|
||||
|
@ -88,7 +88,6 @@ static void frob_mem_refresh(int cpu_slowing_down,
|
||||
{
|
||||
unsigned long old_refr_count, refr_count, mctrl;
|
||||
|
||||
|
||||
refr_count = (clock_tick * MCTRL0_REFR_INTERVAL);
|
||||
refr_count /= (MCTRL0_REFR_CLKS_P_CNT * divisor * 1000000000UL);
|
||||
|
||||
@ -230,6 +229,25 @@ static unsigned long estar_to_divisor(unsigned long estar)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static unsigned int us2e_freq_get(unsigned int cpu)
|
||||
{
|
||||
cpumask_t cpus_allowed;
|
||||
unsigned long clock_tick, estar;
|
||||
|
||||
if (!cpu_online(cpu))
|
||||
return 0;
|
||||
|
||||
cpus_allowed = current->cpus_allowed;
|
||||
set_cpus_allowed(current, cpumask_of_cpu(cpu));
|
||||
|
||||
clock_tick = sparc64_get_clock_tick(cpu) / 1000;
|
||||
estar = read_hbreg(HBIRD_ESTAR_MODE_ADDR);
|
||||
|
||||
set_cpus_allowed(current, cpus_allowed);
|
||||
|
||||
return clock_tick / estar_to_divisor(estar);
|
||||
}
|
||||
|
||||
static void us2e_set_cpu_divider_index(unsigned int cpu, unsigned int index)
|
||||
{
|
||||
unsigned long new_bits, new_freq;
|
||||
@ -243,7 +261,7 @@ static void us2e_set_cpu_divider_index(unsigned int cpu, unsigned int index)
|
||||
cpus_allowed = current->cpus_allowed;
|
||||
set_cpus_allowed(current, cpumask_of_cpu(cpu));
|
||||
|
||||
new_freq = clock_tick = sparc64_get_clock_tick(cpu);
|
||||
new_freq = clock_tick = sparc64_get_clock_tick(cpu) / 1000;
|
||||
new_bits = index_to_estar_mode(index);
|
||||
divisor = index_to_divisor(index);
|
||||
new_freq /= divisor;
|
||||
@ -258,7 +276,8 @@ static void us2e_set_cpu_divider_index(unsigned int cpu, unsigned int index)
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
if (old_divisor != divisor)
|
||||
us2e_transition(estar, new_bits, clock_tick, old_divisor, divisor);
|
||||
us2e_transition(estar, new_bits, clock_tick * 1000,
|
||||
old_divisor, divisor);
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
@ -272,10 +291,8 @@ static int us2e_freq_target(struct cpufreq_policy *policy,
|
||||
unsigned int new_index = 0;
|
||||
|
||||
if (cpufreq_frequency_table_target(policy,
|
||||
&us2e_freq_table[policy->cpu].table[0],
|
||||
target_freq,
|
||||
relation,
|
||||
&new_index))
|
||||
&us2e_freq_table[policy->cpu].table[0],
|
||||
target_freq, relation, &new_index))
|
||||
return -EINVAL;
|
||||
|
||||
us2e_set_cpu_divider_index(policy->cpu, new_index);
|
||||
@ -292,7 +309,7 @@ static int us2e_freq_verify(struct cpufreq_policy *policy)
|
||||
static int __init us2e_freq_cpu_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
unsigned int cpu = policy->cpu;
|
||||
unsigned long clock_tick = sparc64_get_clock_tick(cpu);
|
||||
unsigned long clock_tick = sparc64_get_clock_tick(cpu) / 1000;
|
||||
struct cpufreq_frequency_table *table =
|
||||
&us2e_freq_table[cpu].table[0];
|
||||
|
||||
@ -351,9 +368,10 @@ static int __init us2e_freq_init(void)
|
||||
memset(us2e_freq_table, 0,
|
||||
(NR_CPUS * sizeof(struct us2e_freq_percpu_info)));
|
||||
|
||||
driver->init = us2e_freq_cpu_init;
|
||||
driver->verify = us2e_freq_verify;
|
||||
driver->target = us2e_freq_target;
|
||||
driver->init = us2e_freq_cpu_init;
|
||||
driver->get = us2e_freq_get;
|
||||
driver->exit = us2e_freq_cpu_exit;
|
||||
driver->owner = THIS_MODULE,
|
||||
strcpy(driver->name, "UltraSPARC-IIe");
|
||||
|
@ -56,7 +56,7 @@ static void write_safari_cfg(unsigned long val)
|
||||
|
||||
static unsigned long get_current_freq(unsigned int cpu, unsigned long safari_cfg)
|
||||
{
|
||||
unsigned long clock_tick = sparc64_get_clock_tick(cpu);
|
||||
unsigned long clock_tick = sparc64_get_clock_tick(cpu) / 1000;
|
||||
unsigned long ret;
|
||||
|
||||
switch (safari_cfg & SAFARI_CFG_DIV_MASK) {
|
||||
@ -76,6 +76,26 @@ static unsigned long get_current_freq(unsigned int cpu, unsigned long safari_cfg
|
||||
return ret;
|
||||
}
|
||||
|
||||
static unsigned int us3_freq_get(unsigned int cpu)
|
||||
{
|
||||
cpumask_t cpus_allowed;
|
||||
unsigned long reg;
|
||||
unsigned int ret;
|
||||
|
||||
if (!cpu_online(cpu))
|
||||
return 0;
|
||||
|
||||
cpus_allowed = current->cpus_allowed;
|
||||
set_cpus_allowed(current, cpumask_of_cpu(cpu));
|
||||
|
||||
reg = read_safari_cfg();
|
||||
ret = get_current_freq(cpu, reg);
|
||||
|
||||
set_cpus_allowed(current, cpus_allowed);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void us3_set_cpu_divider_index(unsigned int cpu, unsigned int index)
|
||||
{
|
||||
unsigned long new_bits, new_freq, reg;
|
||||
@ -88,7 +108,7 @@ static void us3_set_cpu_divider_index(unsigned int cpu, unsigned int index)
|
||||
cpus_allowed = current->cpus_allowed;
|
||||
set_cpus_allowed(current, cpumask_of_cpu(cpu));
|
||||
|
||||
new_freq = sparc64_get_clock_tick(cpu);
|
||||
new_freq = sparc64_get_clock_tick(cpu) / 1000;
|
||||
switch (index) {
|
||||
case 0:
|
||||
new_bits = SAFARI_CFG_DIV_1;
|
||||
@ -150,7 +170,7 @@ static int us3_freq_verify(struct cpufreq_policy *policy)
|
||||
static int __init us3_freq_cpu_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
unsigned int cpu = policy->cpu;
|
||||
unsigned long clock_tick = sparc64_get_clock_tick(cpu);
|
||||
unsigned long clock_tick = sparc64_get_clock_tick(cpu) / 1000;
|
||||
struct cpufreq_frequency_table *table =
|
||||
&us3_freq_table[cpu].table[0];
|
||||
|
||||
@ -206,9 +226,10 @@ static int __init us3_freq_init(void)
|
||||
memset(us3_freq_table, 0,
|
||||
(NR_CPUS * sizeof(struct us3_freq_percpu_info)));
|
||||
|
||||
driver->init = us3_freq_cpu_init;
|
||||
driver->verify = us3_freq_verify;
|
||||
driver->target = us3_freq_target;
|
||||
driver->init = us3_freq_cpu_init;
|
||||
driver->get = us3_freq_get;
|
||||
driver->exit = us3_freq_cpu_exit;
|
||||
driver->owner = THIS_MODULE,
|
||||
strcpy(driver->name, "UltraSPARC-III");
|
||||
|
@ -61,7 +61,11 @@ void wait_stub_done(int pid, int sig, char * fname)
|
||||
|
||||
CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED));
|
||||
} while((n >= 0) && WIFSTOPPED(status) &&
|
||||
(WSTOPSIG(status) == SIGVTALRM));
|
||||
((WSTOPSIG(status) == SIGVTALRM) ||
|
||||
/* running UML inside a detached screen can cause
|
||||
* SIGWINCHes
|
||||
*/
|
||||
(WSTOPSIG(status) == SIGWINCH)));
|
||||
|
||||
if((n < 0) || !WIFSTOPPED(status) ||
|
||||
(WSTOPSIG(status) != SIGUSR1 && WSTOPSIG(status) != SIGTRAP)){
|
||||
|
@ -9,7 +9,6 @@
|
||||
*/
|
||||
#include <elf.h>
|
||||
#include <stddef.h>
|
||||
#include <asm/elf.h>
|
||||
#include "init.h"
|
||||
#include "elf_user.h"
|
||||
#include "mem_user.h"
|
||||
|
@ -492,6 +492,14 @@ void __cpuinit start_secondary(void)
|
||||
*/
|
||||
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
|
||||
* 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;
|
||||
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();
|
||||
}
|
||||
|
||||
|
@ -211,9 +211,7 @@ int unhandled_signal(struct task_struct *tsk, int sig)
|
||||
{
|
||||
if (tsk->pid == 1)
|
||||
return 1;
|
||||
/* Warn for strace, but not for gdb */
|
||||
if (!test_ti_thread_flag(tsk->thread_info, TIF_SYSCALL_TRACE) &&
|
||||
(tsk->ptrace & PT_PTRACED))
|
||||
if (tsk->ptrace & PT_PTRACED)
|
||||
return 0;
|
||||
return (tsk->sighand->action[sig-1].sa.sa_handler == SIG_IGN) ||
|
||||
(tsk->sighand->action[sig-1].sa.sa_handler == SIG_DFL);
|
||||
|
@ -764,6 +764,7 @@ config BLK_DEV_IDE_PMAC_ATA100FIRST
|
||||
config BLK_DEV_IDEDMA_PMAC
|
||||
bool "PowerMac IDE DMA support"
|
||||
depends on BLK_DEV_IDE_PMAC
|
||||
select BLK_DEV_IDEDMA_PCI
|
||||
help
|
||||
This option allows the driver for the built-in IDE controller on
|
||||
Power Macintoshes and PowerBooks to use DMA (direct memory access)
|
||||
|
@ -317,7 +317,7 @@ typedef struct ide_floppy_obj {
|
||||
unsigned long flags;
|
||||
} idefloppy_floppy_t;
|
||||
|
||||
#define IDEFLOPPY_TICKS_DELAY 3 /* default delay for ZIP 100 */
|
||||
#define IDEFLOPPY_TICKS_DELAY HZ/20 /* default delay for ZIP 100 (50ms) */
|
||||
|
||||
/*
|
||||
* Floppy flag bits values.
|
||||
|
@ -173,6 +173,12 @@ static ide_pci_device_t generic_chipsets[] __devinitdata = {
|
||||
.channels = 2,
|
||||
.autodma = NOAUTODMA,
|
||||
.bootable = ON_BOARD,
|
||||
},{ /* 14 */
|
||||
.name = "Revolution",
|
||||
.init_hwif = init_hwif_generic,
|
||||
.channels = 2,
|
||||
.autodma = AUTODMA,
|
||||
.bootable = OFF_BOARD,
|
||||
}
|
||||
};
|
||||
|
||||
@ -231,6 +237,7 @@ static struct pci_device_id generic_pci_tbl[] = {
|
||||
{ PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 11},
|
||||
{ PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12},
|
||||
{ PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13},
|
||||
{ PCI_VENDOR_ID_NETCELL,PCI_DEVICE_ID_REVOLUTION, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14},
|
||||
/* Must come last. If you add entries adjust this table appropriately and the init_one code */
|
||||
{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL, 0},
|
||||
{ 0, },
|
||||
|
@ -21,6 +21,9 @@
|
||||
*
|
||||
* CSB6: `Champion South Bridge' IDE Interface (optional: third channel)
|
||||
*
|
||||
* HT1000: AKA BCM5785 - Hypertransport Southbridge for Opteron systems. IDE
|
||||
* controller same as the CSB6. Single channel ATA100 only.
|
||||
*
|
||||
* Documentation:
|
||||
* Available under NDA only. Errata info very hard to get.
|
||||
*
|
||||
@ -71,6 +74,8 @@ static u8 svwks_ratemask (ide_drive_t *drive)
|
||||
if (!svwks_revision)
|
||||
pci_read_config_byte(dev, PCI_REVISION_ID, &svwks_revision);
|
||||
|
||||
if (dev->device == PCI_DEVICE_ID_SERVERWORKS_HT1000IDE)
|
||||
return 2;
|
||||
if (dev->device == PCI_DEVICE_ID_SERVERWORKS_OSB4IDE) {
|
||||
u32 reg = 0;
|
||||
if (isa_dev)
|
||||
@ -109,6 +114,7 @@ static u8 svwks_csb_check (struct pci_dev *dev)
|
||||
case PCI_DEVICE_ID_SERVERWORKS_CSB5IDE:
|
||||
case PCI_DEVICE_ID_SERVERWORKS_CSB6IDE:
|
||||
case PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2:
|
||||
case PCI_DEVICE_ID_SERVERWORKS_HT1000IDE:
|
||||
return 1;
|
||||
default:
|
||||
break;
|
||||
@ -438,6 +444,13 @@ static unsigned int __devinit init_chipset_svwks (struct pci_dev *dev, const cha
|
||||
btr |= (svwks_revision >= SVWKS_CSB5_REVISION_NEW) ? 0x3 : 0x2;
|
||||
pci_write_config_byte(dev, 0x5A, btr);
|
||||
}
|
||||
/* Setup HT1000 SouthBridge Controller - Single Channel Only */
|
||||
else if (dev->device == PCI_DEVICE_ID_SERVERWORKS_HT1000IDE) {
|
||||
pci_read_config_byte(dev, 0x5A, &btr);
|
||||
btr &= ~0x40;
|
||||
btr |= 0x3;
|
||||
pci_write_config_byte(dev, 0x5A, btr);
|
||||
}
|
||||
|
||||
return (dev->irq) ? dev->irq : 0;
|
||||
}
|
||||
@ -629,6 +642,15 @@ static ide_pci_device_t serverworks_chipsets[] __devinitdata = {
|
||||
.channels = 1, /* 2 */
|
||||
.autodma = AUTODMA,
|
||||
.bootable = ON_BOARD,
|
||||
},{ /* 4 */
|
||||
.name = "SvrWks HT1000",
|
||||
.init_setup = init_setup_svwks,
|
||||
.init_chipset = init_chipset_svwks,
|
||||
.init_hwif = init_hwif_svwks,
|
||||
.init_dma = init_dma_svwks,
|
||||
.channels = 1, /* 2 */
|
||||
.autodma = AUTODMA,
|
||||
.bootable = ON_BOARD,
|
||||
}
|
||||
};
|
||||
|
||||
@ -653,6 +675,7 @@ static struct pci_device_id svwks_pci_tbl[] = {
|
||||
{ PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
|
||||
{ PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2},
|
||||
{ PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3},
|
||||
{ PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT1000IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4},
|
||||
{ 0, },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, svwks_pci_tbl);
|
||||
|
@ -1664,7 +1664,7 @@ static struct macio_driver pmac_ide_macio_driver =
|
||||
};
|
||||
|
||||
static struct pci_device_id pmac_ide_pci_match[] = {
|
||||
{ PCI_VENDOR_ID_APPLE, PCI_DEVIEC_ID_APPLE_UNI_N_ATA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{ PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_ATA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{ PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_IPID_ATA100, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{ PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_K2_ATA100, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{ PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_SH_ATA,
|
||||
|
@ -229,6 +229,7 @@ second_chance_to_dma:
|
||||
case PCI_DEVICE_ID_AMD_VIPER_7409:
|
||||
case PCI_DEVICE_ID_CMD_643:
|
||||
case PCI_DEVICE_ID_SERVERWORKS_CSB5IDE:
|
||||
case PCI_DEVICE_ID_REVOLUTION:
|
||||
simplex_stat = hwif->INB(dma_base + 2);
|
||||
hwif->OUTB((simplex_stat&0x60),(dma_base + 2));
|
||||
simplex_stat = hwif->INB(dma_base + 2);
|
||||
|
@ -623,6 +623,7 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev)
|
||||
mddev->raid_disks = sb->raid_disks;
|
||||
mddev->size = sb->size;
|
||||
mddev->events = md_event(sb);
|
||||
mddev->bitmap_offset = 0;
|
||||
|
||||
if (sb->state & (1<<MD_SB_CLEAN))
|
||||
mddev->recovery_cp = MaxSector;
|
||||
@ -938,6 +939,7 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev)
|
||||
mddev->raid_disks = le32_to_cpu(sb->raid_disks);
|
||||
mddev->size = le64_to_cpu(sb->size)/2;
|
||||
mddev->events = le64_to_cpu(sb->events);
|
||||
mddev->bitmap_offset = 0;
|
||||
|
||||
mddev->recovery_cp = le64_to_cpu(sb->resync_offset);
|
||||
memcpy(mddev->uuid, sb->set_uuid, 16);
|
||||
@ -1824,6 +1826,7 @@ static int do_md_stop(mddev_t * mddev, int ro)
|
||||
fput(mddev->bitmap_file);
|
||||
mddev->bitmap_file = NULL;
|
||||
}
|
||||
mddev->bitmap_offset = 0;
|
||||
|
||||
/*
|
||||
* Free resources if final stop
|
||||
|
@ -1897,6 +1897,7 @@ static int cp_resume (struct pci_dev *pdev)
|
||||
{
|
||||
struct net_device *dev;
|
||||
struct cp_private *cp;
|
||||
unsigned long flags;
|
||||
|
||||
dev = pci_get_drvdata (pdev);
|
||||
cp = netdev_priv(dev);
|
||||
@ -1910,6 +1911,12 @@ static int cp_resume (struct pci_dev *pdev)
|
||||
|
||||
cp_init_hw (cp);
|
||||
netif_start_queue (dev);
|
||||
|
||||
spin_lock_irqsave (&cp->lock, flags);
|
||||
|
||||
mii_check_media(&cp->mii_if, netif_msg_link(cp), FALSE);
|
||||
|
||||
spin_unlock_irqrestore (&cp->lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -48,6 +48,10 @@
|
||||
* net_device_stats
|
||||
* * introduced tx_timeout function
|
||||
* * reworked locking
|
||||
*
|
||||
* 01-Jul-2005 Ben Dooks <ben@simtec.co.uk>
|
||||
* * fixed spinlock call without pointer
|
||||
* * ensure spinlock is initialised
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@ -148,7 +152,6 @@ static int dm9000_probe(struct device *);
|
||||
static int dm9000_open(struct net_device *);
|
||||
static int dm9000_start_xmit(struct sk_buff *, struct net_device *);
|
||||
static int dm9000_stop(struct net_device *);
|
||||
static int dm9000_do_ioctl(struct net_device *, struct ifreq *, int);
|
||||
|
||||
|
||||
static void dm9000_timer(unsigned long);
|
||||
@ -322,7 +325,7 @@ static void dm9000_timeout(struct net_device *dev)
|
||||
|
||||
/* Save previous register address */
|
||||
reg_save = readb(db->io_addr);
|
||||
spin_lock_irqsave(db->lock,flags);
|
||||
spin_lock_irqsave(&db->lock,flags);
|
||||
|
||||
netif_stop_queue(dev);
|
||||
dm9000_reset(db);
|
||||
@ -333,7 +336,7 @@ static void dm9000_timeout(struct net_device *dev)
|
||||
|
||||
/* Restore previous register address */
|
||||
writeb(reg_save, db->io_addr);
|
||||
spin_unlock_irqrestore(db->lock,flags);
|
||||
spin_unlock_irqrestore(&db->lock,flags);
|
||||
}
|
||||
|
||||
|
||||
@ -387,8 +390,6 @@ dm9000_probe(struct device *dev)
|
||||
int i;
|
||||
u32 id_val;
|
||||
|
||||
printk(KERN_INFO "%s Ethernet Driver\n", CARDNAME);
|
||||
|
||||
/* Init network device */
|
||||
ndev = alloc_etherdev(sizeof (struct board_info));
|
||||
if (!ndev) {
|
||||
@ -405,6 +406,8 @@ dm9000_probe(struct device *dev)
|
||||
db = (struct board_info *) ndev->priv;
|
||||
memset(db, 0, sizeof (*db));
|
||||
|
||||
spin_lock_init(&db->lock);
|
||||
|
||||
if (pdev->num_resources < 2) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
@ -541,7 +544,6 @@ dm9000_probe(struct device *dev)
|
||||
ndev->stop = &dm9000_stop;
|
||||
ndev->get_stats = &dm9000_get_stats;
|
||||
ndev->set_multicast_list = &dm9000_hash_table;
|
||||
ndev->do_ioctl = &dm9000_do_ioctl;
|
||||
|
||||
#ifdef DM9000_PROGRAM_EEPROM
|
||||
program_eeprom(db);
|
||||
@ -612,7 +614,7 @@ dm9000_open(struct net_device *dev)
|
||||
|
||||
/* set and active a timer process */
|
||||
init_timer(&db->timer);
|
||||
db->timer.expires = DM9000_TIMER_WUT * 2;
|
||||
db->timer.expires = DM9000_TIMER_WUT;
|
||||
db->timer.data = (unsigned long) dev;
|
||||
db->timer.function = &dm9000_timer;
|
||||
add_timer(&db->timer);
|
||||
@ -845,15 +847,6 @@ dm9000_get_stats(struct net_device *dev)
|
||||
return &db->stats;
|
||||
}
|
||||
|
||||
/*
|
||||
* Process the upper socket ioctl command
|
||||
*/
|
||||
static int
|
||||
dm9000_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||
{
|
||||
PRINTK1("entering %s\n",__FUNCTION__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* A periodic timer routine
|
||||
@ -864,21 +857,11 @@ dm9000_timer(unsigned long data)
|
||||
{
|
||||
struct net_device *dev = (struct net_device *) data;
|
||||
board_info_t *db = (board_info_t *) dev->priv;
|
||||
u8 reg_save;
|
||||
unsigned long flags;
|
||||
|
||||
PRINTK3("dm9000_timer()\n");
|
||||
|
||||
spin_lock_irqsave(db->lock,flags);
|
||||
/* Save previous register address */
|
||||
reg_save = readb(db->io_addr);
|
||||
|
||||
mii_check_media(&db->mii, netif_msg_link(db), 0);
|
||||
|
||||
/* Restore previous register address */
|
||||
writeb(reg_save, db->io_addr);
|
||||
spin_unlock_irqrestore(db->lock,flags);
|
||||
|
||||
/* Set timer again */
|
||||
db->timer.expires = DM9000_TIMER_WUT;
|
||||
add_timer(&db->timer);
|
||||
@ -1098,9 +1081,14 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg)
|
||||
{
|
||||
board_info_t *db = (board_info_t *) dev->priv;
|
||||
unsigned long flags;
|
||||
unsigned int reg_save;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&db->lock,flags);
|
||||
|
||||
/* Save previous register address */
|
||||
reg_save = readb(db->io_addr);
|
||||
|
||||
/* Fill the phyxcer register into REG_0C */
|
||||
iow(db, DM9000_EPAR, DM9000_PHY | reg);
|
||||
|
||||
@ -1111,6 +1099,9 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg)
|
||||
/* The read data keeps on REG_0D & REG_0E */
|
||||
ret = (ior(db, DM9000_EPDRH) << 8) | ior(db, DM9000_EPDRL);
|
||||
|
||||
/* restore the previous address */
|
||||
writeb(reg_save, db->io_addr);
|
||||
|
||||
spin_unlock_irqrestore(&db->lock,flags);
|
||||
|
||||
return ret;
|
||||
@ -1124,9 +1115,13 @@ dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg, int value)
|
||||
{
|
||||
board_info_t *db = (board_info_t *) dev->priv;
|
||||
unsigned long flags;
|
||||
unsigned long reg_save;
|
||||
|
||||
spin_lock_irqsave(&db->lock,flags);
|
||||
|
||||
/* Save previous register address */
|
||||
reg_save = readb(db->io_addr);
|
||||
|
||||
/* Fill the phyxcer register into REG_0C */
|
||||
iow(db, DM9000_EPAR, DM9000_PHY | reg);
|
||||
|
||||
@ -1138,6 +1133,9 @@ dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg, int value)
|
||||
udelay(500); /* Wait write complete */
|
||||
iow(db, DM9000_EPCR, 0x0); /* Clear phyxcer write command */
|
||||
|
||||
/* restore the previous address */
|
||||
writeb(reg_save, db->io_addr);
|
||||
|
||||
spin_unlock_irqrestore(&db->lock,flags);
|
||||
}
|
||||
|
||||
@ -1202,6 +1200,8 @@ static struct device_driver dm9000_driver = {
|
||||
static int __init
|
||||
dm9000_init(void)
|
||||
{
|
||||
printk(KERN_INFO "%s Ethernet Driver\n", CARDNAME);
|
||||
|
||||
return driver_register(&dm9000_driver); /* search board and register */
|
||||
}
|
||||
|
||||
|
@ -499,7 +499,7 @@ static int ioc3_mdio_read(struct net_device *dev, int phy, int reg)
|
||||
ioc3_w_micr((phy << MICR_PHYADDR_SHIFT) | reg | MICR_READTRIG);
|
||||
while (ioc3_r_micr() & MICR_BUSY);
|
||||
|
||||
return ioc3_r_micr() & MIDR_DATA_MASK;
|
||||
return ioc3_r_midr_r() & MIDR_DATA_MASK;
|
||||
}
|
||||
|
||||
static void ioc3_mdio_write(struct net_device *dev, int phy, int reg, int data)
|
||||
@ -1291,7 +1291,6 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
dev->features = NETIF_F_IP_CSUM;
|
||||
#endif
|
||||
|
||||
ioc3_setup_duplex(ip);
|
||||
sw_physid1 = ioc3_mdio_read(dev, ip->mii.phy_id, MII_PHYSID1);
|
||||
sw_physid2 = ioc3_mdio_read(dev, ip->mii.phy_id, MII_PHYSID2);
|
||||
|
||||
@ -1300,6 +1299,7 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
goto out_stop;
|
||||
|
||||
mii_check_media(&ip->mii, 1, 1);
|
||||
ioc3_setup_duplex(ip);
|
||||
|
||||
vendor = (sw_physid1 << 12) | (sw_physid2 >> 4);
|
||||
model = (sw_physid2 >> 4) & 0x3f;
|
||||
@ -1524,7 +1524,7 @@ static void ioc3_get_drvinfo (struct net_device *dev,
|
||||
struct ethtool_drvinfo *info)
|
||||
{
|
||||
struct ioc3_private *ip = netdev_priv(dev);
|
||||
|
||||
|
||||
strcpy (info->driver, IOC3_NAME);
|
||||
strcpy (info->version, IOC3_VERSION);
|
||||
strcpy (info->bus_info, pci_name(ip->pdev));
|
||||
@ -1550,7 +1550,7 @@ static int ioc3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
||||
spin_lock_irq(&ip->ioc3_lock);
|
||||
rc = mii_ethtool_sset(&ip->mii, cmd);
|
||||
spin_unlock_irq(&ip->ioc3_lock);
|
||||
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -214,7 +214,7 @@ struct net_device loopback_dev = {
|
||||
.ethtool_ops = &loopback_ethtool_ops,
|
||||
};
|
||||
|
||||
/* Setup and register the of the LOOPBACK device. */
|
||||
/* Setup and register the loopback device. */
|
||||
int __init loopback_init(void)
|
||||
{
|
||||
struct net_device_stats *stats;
|
||||
|
@ -66,8 +66,8 @@
|
||||
|
||||
#define DRV_MODULE_NAME "tg3"
|
||||
#define PFX DRV_MODULE_NAME ": "
|
||||
#define DRV_MODULE_VERSION "3.35"
|
||||
#define DRV_MODULE_RELDATE "August 6, 2005"
|
||||
#define DRV_MODULE_VERSION "3.36"
|
||||
#define DRV_MODULE_RELDATE "August 19, 2005"
|
||||
|
||||
#define TG3_DEF_MAC_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;
|
||||
if (hw_phy_id_masked == PHY_ID_BCM8002)
|
||||
tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES;
|
||||
else
|
||||
tp->tg3_flags2 &= ~TG3_FLG2_PHY_SERDES;
|
||||
} else {
|
||||
if (tp->phy_id != PHY_ID_INVALID) {
|
||||
/* Do nothing, phy ID already set up in
|
||||
|
@ -80,7 +80,7 @@
|
||||
#include <video/radeon.h>
|
||||
#include <linux/radeonfb.h>
|
||||
|
||||
#define DEBUG 1
|
||||
#define DEBUG 0
|
||||
|
||||
#if DEBUG
|
||||
#define RTRACE printk
|
||||
|
@ -30,7 +30,7 @@ static struct dentry *afs_mntpt_lookup(struct inode *dir,
|
||||
struct dentry *dentry,
|
||||
struct nameidata *nd);
|
||||
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 = {
|
||||
.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
|
||||
*/
|
||||
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 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);
|
||||
if (IS_ERR(newmnt)) {
|
||||
path_release(nd);
|
||||
return PTR_ERR(newmnt);
|
||||
return (void *)newmnt;
|
||||
}
|
||||
|
||||
old_dentry = nd->dentry;
|
||||
@ -267,7 +267,7 @@ static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd)
|
||||
}
|
||||
|
||||
kleave(" = %d", err);
|
||||
return err;
|
||||
return ERR_PTR(err);
|
||||
} /* end afs_mntpt_follow_link() */
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -12,11 +12,12 @@
|
||||
|
||||
#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;
|
||||
nd_set_link(nd, s);
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct inode_operations autofs_symlink_inode_operations = {
|
||||
|
@ -12,11 +12,11 @@
|
||||
|
||||
#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);
|
||||
nd_set_link(nd, (char *)ino->u.symlink);
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct inode_operations autofs4_symlink_inode_operations = {
|
||||
|
@ -41,8 +41,8 @@ static struct inode *befs_alloc_inode(struct super_block *sb);
|
||||
static void befs_destroy_inode(struct inode *inode);
|
||||
static int befs_init_inodecache(void);
|
||||
static void befs_destroy_inodecache(void);
|
||||
static int befs_follow_link(struct dentry *, struct nameidata *);
|
||||
static void befs_put_link(struct dentry *, struct nameidata *);
|
||||
static void *befs_follow_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,
|
||||
char **out, int *out_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
|
||||
* flag is set.
|
||||
*/
|
||||
static int
|
||||
static void *
|
||||
befs_follow_link(struct dentry *dentry, struct nameidata *nd)
|
||||
{
|
||||
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);
|
||||
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);
|
||||
if (befs_ino->i_flags & BEFS_LONG_SYMLINK) {
|
||||
|
@ -83,8 +83,8 @@ extern int cifs_dir_notify(struct file *, unsigned long arg);
|
||||
extern struct dentry_operations cifs_dentry_ops;
|
||||
|
||||
/* Functions related to symlinks */
|
||||
extern int cifs_follow_link(struct dentry *direntry, struct nameidata *nd);
|
||||
extern void cifs_put_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, void *);
|
||||
extern int cifs_readlink(struct dentry *direntry, char __user *buffer,
|
||||
int buflen);
|
||||
extern int cifs_symlink(struct inode *inode, struct dentry *direntry,
|
||||
|
@ -92,7 +92,7 @@ cifs_hl_exit:
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
void *
|
||||
cifs_follow_link(struct dentry *direntry, struct nameidata *nd)
|
||||
{
|
||||
struct inode *inode = direntry->d_inode;
|
||||
@ -148,7 +148,7 @@ out:
|
||||
out_no_free:
|
||||
FreeXid(xid);
|
||||
nd_set_link(nd, target_path);
|
||||
return 0;
|
||||
return NULL; /* No cookie */
|
||||
}
|
||||
|
||||
int
|
||||
@ -330,7 +330,7 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
|
||||
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);
|
||||
if (!IS_ERR(p))
|
||||
|
@ -2491,11 +2491,11 @@ static int devfs_mknod(struct inode *dir, struct dentry *dentry, int mode,
|
||||
return 0;
|
||||
} /* 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);
|
||||
nd_set_link(nd, p ? p->u.symlink.linkname : ERR_PTR(-ENODEV));
|
||||
return 0;
|
||||
return NULL;
|
||||
} /* End Function devfs_follow_link */
|
||||
|
||||
static struct inode_operations devfs_iops = {
|
||||
|
@ -21,11 +21,11 @@
|
||||
#include "xattr.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);
|
||||
nd_set_link(nd, (char *)ei->i_data);
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct inode_operations ext2_symlink_inode_operations = {
|
||||
|
@ -23,11 +23,11 @@
|
||||
#include <linux/namei.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);
|
||||
nd_set_link(nd, (char*)ei->i_data);
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct inode_operations ext3_symlink_inode_operations = {
|
||||
|
@ -38,7 +38,7 @@
|
||||
#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 *);
|
||||
|
||||
@ -72,12 +72,12 @@ struct address_space_operations vxfs_immed_aops = {
|
||||
* Returns:
|
||||
* Zero on success, else a negative error code.
|
||||
*/
|
||||
static int
|
||||
static void *
|
||||
vxfs_immed_follow_link(struct dentry *dp, struct nameidata *np)
|
||||
{
|
||||
struct vxfs_inode_info *vip = VXFS_INO(dp->d_inode);
|
||||
nd_set_link(np, vip->vii_immed.vi_immed);
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -62,6 +62,8 @@ asmlinkage long sys_ioprio_set(int which, int who, int ioprio)
|
||||
|
||||
break;
|
||||
case IOPRIO_CLASS_IDLE:
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
@ -18,7 +18,7 @@
|
||||
#include <linux/namei.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 =
|
||||
{
|
||||
@ -27,9 +27,10 @@ struct inode_operations jffs2_symlink_inode_operations =
|
||||
.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);
|
||||
char *p = (char *)f->dents;
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
if (!f->dents) {
|
||||
if (!p) {
|
||||
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
|
||||
* 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.
|
||||
*/
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -22,11 +22,11 @@
|
||||
#include "jfs_inode.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;
|
||||
nd_set_link(nd, s);
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct inode_operations jfs_symlink_inode_operations = {
|
||||
|
40
fs/namei.c
40
fs/namei.c
@ -501,6 +501,7 @@ struct path {
|
||||
static inline int __do_follow_link(struct path *path, struct nameidata *nd)
|
||||
{
|
||||
int error;
|
||||
void *cookie;
|
||||
struct dentry *dentry = path->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)
|
||||
mntget(path->mnt);
|
||||
error = dentry->d_inode->i_op->follow_link(dentry, nd);
|
||||
if (!error) {
|
||||
cookie = dentry->d_inode->i_op->follow_link(dentry, nd);
|
||||
error = PTR_ERR(cookie);
|
||||
if (!IS_ERR(cookie)) {
|
||||
char *s = nd_get_link(nd);
|
||||
error = 0;
|
||||
if (s)
|
||||
error = __vfs_follow_link(nd, s);
|
||||
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);
|
||||
mntput(path->mnt);
|
||||
@ -2344,15 +2347,17 @@ out:
|
||||
int generic_readlink(struct dentry *dentry, char __user *buffer, int buflen)
|
||||
{
|
||||
struct nameidata nd;
|
||||
int res;
|
||||
void *cookie;
|
||||
|
||||
nd.depth = 0;
|
||||
res = dentry->d_inode->i_op->follow_link(dentry, &nd);
|
||||
if (!res) {
|
||||
res = vfs_readlink(dentry, buffer, buflen, nd_get_link(&nd));
|
||||
cookie = dentry->d_inode->i_op->follow_link(dentry, &nd);
|
||||
if (!IS_ERR(cookie)) {
|
||||
int res = vfs_readlink(dentry, buffer, buflen, nd_get_link(&nd));
|
||||
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)
|
||||
@ -2395,23 +2400,20 @@ int page_readlink(struct dentry *dentry, char __user *buffer, int buflen)
|
||||
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));
|
||||
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;
|
||||
page = find_get_page(dentry->d_inode->i_mapping, 0);
|
||||
if (!page)
|
||||
BUG();
|
||||
struct page *page = cookie;
|
||||
|
||||
if (page) {
|
||||
kunmap(page);
|
||||
page_cache_release(page);
|
||||
page_cache_release(page);
|
||||
}
|
||||
}
|
||||
|
||||
|
28
fs/nfs/dir.c
28
fs/nfs/dir.c
@ -182,14 +182,16 @@ int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page *page)
|
||||
/* We requested READDIRPLUS, but the server doesn't grok it */
|
||||
if (error == -ENOTSUPP && desc->plus) {
|
||||
NFS_SERVER(inode)->caps &= ~NFS_CAP_READDIRPLUS;
|
||||
NFS_FLAGS(inode) &= ~NFS_INO_ADVISE_RDPLUS;
|
||||
clear_bit(NFS_INO_ADVISE_RDPLUS, &NFS_FLAGS(inode));
|
||||
desc->plus = 0;
|
||||
goto again;
|
||||
}
|
||||
goto error;
|
||||
}
|
||||
SetPageUptodate(page);
|
||||
NFS_FLAGS(inode) |= NFS_INO_INVALID_ATIME;
|
||||
spin_lock(&inode->i_lock);
|
||||
NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATIME;
|
||||
spin_unlock(&inode->i_lock);
|
||||
/* Ensure consistent page alignment of the data.
|
||||
* Note: assumes we have exclusive access to this mapping either
|
||||
* through inode->i_sem or some other mechanism.
|
||||
@ -462,7 +464,9 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent,
|
||||
page,
|
||||
NFS_SERVER(inode)->dtsize,
|
||||
desc->plus);
|
||||
NFS_FLAGS(inode) |= NFS_INO_INVALID_ATIME;
|
||||
spin_lock(&inode->i_lock);
|
||||
NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATIME;
|
||||
spin_unlock(&inode->i_lock);
|
||||
desc->page = page;
|
||||
desc->ptr = kmap(page); /* matching kunmap in nfs_do_filldir */
|
||||
if (desc->error >= 0) {
|
||||
@ -545,7 +549,7 @@ static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
||||
break;
|
||||
}
|
||||
if (res == -ETOOSMALL && desc->plus) {
|
||||
NFS_FLAGS(inode) &= ~NFS_INO_ADVISE_RDPLUS;
|
||||
clear_bit(NFS_INO_ADVISE_RDPLUS, &NFS_FLAGS(inode));
|
||||
nfs_zap_caches(inode);
|
||||
desc->plus = 0;
|
||||
desc->entry->eof = 0;
|
||||
@ -608,7 +612,7 @@ static inline int nfs_check_verifier(struct inode *dir, struct dentry *dentry)
|
||||
{
|
||||
if (IS_ROOT(dentry))
|
||||
return 1;
|
||||
if ((NFS_FLAGS(dir) & NFS_INO_INVALID_ATTR) != 0
|
||||
if ((NFS_I(dir)->cache_validity & NFS_INO_INVALID_ATTR) != 0
|
||||
|| nfs_attribute_timeout(dir))
|
||||
return 0;
|
||||
return nfs_verify_change_attribute(dir, (unsigned long)dentry->d_fsdata);
|
||||
@ -935,6 +939,7 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry
|
||||
error = nfs_revalidate_inode(NFS_SERVER(dir), dir);
|
||||
if (error < 0) {
|
||||
res = ERR_PTR(error);
|
||||
unlock_kernel();
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -1575,11 +1580,12 @@ out:
|
||||
|
||||
int nfs_access_get_cached(struct inode *inode, struct rpc_cred *cred, struct nfs_access_entry *res)
|
||||
{
|
||||
struct nfs_access_entry *cache = &NFS_I(inode)->cache_access;
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
struct nfs_access_entry *cache = &nfsi->cache_access;
|
||||
|
||||
if (cache->cred != cred
|
||||
|| time_after(jiffies, cache->jiffies + NFS_ATTRTIMEO(inode))
|
||||
|| (NFS_FLAGS(inode) & NFS_INO_INVALID_ACCESS))
|
||||
|| (nfsi->cache_validity & NFS_INO_INVALID_ACCESS))
|
||||
return -ENOENT;
|
||||
memcpy(res, cache, sizeof(*res));
|
||||
return 0;
|
||||
@ -1587,14 +1593,18 @@ int nfs_access_get_cached(struct inode *inode, struct rpc_cred *cred, struct nfs
|
||||
|
||||
void nfs_access_add_cache(struct inode *inode, struct nfs_access_entry *set)
|
||||
{
|
||||
struct nfs_access_entry *cache = &NFS_I(inode)->cache_access;
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
struct nfs_access_entry *cache = &nfsi->cache_access;
|
||||
|
||||
if (cache->cred != set->cred) {
|
||||
if (cache->cred)
|
||||
put_rpccred(cache->cred);
|
||||
cache->cred = get_rpccred(set->cred);
|
||||
}
|
||||
NFS_FLAGS(inode) &= ~NFS_INO_INVALID_ACCESS;
|
||||
/* FIXME: replace current access_cache BKL reliance with inode->i_lock */
|
||||
spin_lock(&inode->i_lock);
|
||||
nfsi->cache_validity &= ~NFS_INO_INVALID_ACCESS;
|
||||
spin_unlock(&inode->i_lock);
|
||||
cache->jiffies = set->jiffies;
|
||||
cache->mask = set->mask;
|
||||
}
|
||||
|
@ -134,9 +134,10 @@ nfs_file_release(struct inode *inode, struct file *filp)
|
||||
*/
|
||||
static int nfs_revalidate_file(struct inode *inode, struct file *filp)
|
||||
{
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
int retval = 0;
|
||||
|
||||
if ((NFS_FLAGS(inode) & NFS_INO_REVAL_PAGECACHE) || nfs_attribute_timeout(inode))
|
||||
if ((nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE) || nfs_attribute_timeout(inode))
|
||||
retval = __nfs_revalidate_inode(NFS_SERVER(inode), inode);
|
||||
nfs_revalidate_mapping(inode, filp->f_mapping);
|
||||
return 0;
|
||||
@ -164,7 +165,7 @@ static int nfs_revalidate_file_size(struct inode *inode, struct file *filp)
|
||||
goto force_reval;
|
||||
if (nfsi->npages != 0)
|
||||
return 0;
|
||||
if (!(NFS_FLAGS(inode) & NFS_INO_REVAL_PAGECACHE) && !nfs_attribute_timeout(inode))
|
||||
if (!(nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE) && !nfs_attribute_timeout(inode))
|
||||
return 0;
|
||||
force_reval:
|
||||
return __nfs_revalidate_inode(server, inode);
|
||||
|
162
fs/nfs/inode.c
162
fs/nfs/inode.c
@ -615,14 +615,18 @@ nfs_zap_caches(struct inode *inode)
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
int mode = inode->i_mode;
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
|
||||
NFS_ATTRTIMEO(inode) = NFS_MINATTRTIMEO(inode);
|
||||
NFS_ATTRTIMEO_UPDATE(inode) = jiffies;
|
||||
|
||||
memset(NFS_COOKIEVERF(inode), 0, sizeof(NFS_COOKIEVERF(inode)));
|
||||
if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode))
|
||||
nfsi->flags |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE;
|
||||
nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE;
|
||||
else
|
||||
nfsi->flags |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE;
|
||||
nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE;
|
||||
|
||||
spin_unlock(&inode->i_lock);
|
||||
}
|
||||
|
||||
static void nfs_zap_acl_cache(struct inode *inode)
|
||||
@ -632,7 +636,9 @@ static void nfs_zap_acl_cache(struct inode *inode)
|
||||
clear_acl_cache = NFS_PROTO(inode)->clear_acl_cache;
|
||||
if (clear_acl_cache != NULL)
|
||||
clear_acl_cache(inode);
|
||||
NFS_I(inode)->flags &= ~NFS_INO_INVALID_ACL;
|
||||
spin_lock(&inode->i_lock);
|
||||
NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_ACL;
|
||||
spin_unlock(&inode->i_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -739,7 +745,7 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr)
|
||||
inode->i_fop = &nfs_dir_operations;
|
||||
if (nfs_server_capable(inode, NFS_CAP_READDIRPLUS)
|
||||
&& fattr->size <= NFS_LIMIT_READDIRPLUS)
|
||||
NFS_FLAGS(inode) |= NFS_INO_ADVISE_RDPLUS;
|
||||
set_bit(NFS_INO_ADVISE_RDPLUS, &NFS_FLAGS(inode));
|
||||
} else if (S_ISLNK(inode->i_mode))
|
||||
inode->i_op = &nfs_symlink_inode_operations;
|
||||
else
|
||||
@ -841,7 +847,9 @@ void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr)
|
||||
inode->i_uid = attr->ia_uid;
|
||||
if ((attr->ia_valid & ATTR_GID) != 0)
|
||||
inode->i_gid = attr->ia_gid;
|
||||
NFS_FLAGS(inode) |= NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
|
||||
spin_lock(&inode->i_lock);
|
||||
NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
|
||||
spin_unlock(&inode->i_lock);
|
||||
}
|
||||
if ((attr->ia_valid & ATTR_SIZE) != 0) {
|
||||
inode->i_size = attr->ia_size;
|
||||
@ -849,31 +857,47 @@ void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr)
|
||||
}
|
||||
}
|
||||
|
||||
static int nfs_wait_schedule(void *word)
|
||||
{
|
||||
if (signal_pending(current))
|
||||
return -ERESTARTSYS;
|
||||
schedule();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Wait for the inode to get unlocked.
|
||||
* (Used for NFS_INO_LOCKED and NFS_INO_REVALIDATING).
|
||||
*/
|
||||
static int
|
||||
nfs_wait_on_inode(struct inode *inode, int flag)
|
||||
static int nfs_wait_on_inode(struct inode *inode)
|
||||
{
|
||||
struct rpc_clnt *clnt = NFS_CLIENT(inode);
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
|
||||
sigset_t oldmask;
|
||||
int error;
|
||||
if (!(NFS_FLAGS(inode) & flag))
|
||||
return 0;
|
||||
|
||||
atomic_inc(&inode->i_count);
|
||||
error = nfs_wait_event(clnt, nfsi->nfs_i_wait,
|
||||
!(NFS_FLAGS(inode) & flag));
|
||||
rpc_clnt_sigmask(clnt, &oldmask);
|
||||
error = wait_on_bit_lock(&nfsi->flags, NFS_INO_REVALIDATING,
|
||||
nfs_wait_schedule, TASK_INTERRUPTIBLE);
|
||||
rpc_clnt_sigunmask(clnt, &oldmask);
|
||||
iput(inode);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static void nfs_wake_up_inode(struct inode *inode)
|
||||
{
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
|
||||
clear_bit(NFS_INO_REVALIDATING, &nfsi->flags);
|
||||
smp_mb__after_clear_bit();
|
||||
wake_up_bit(&nfsi->flags, NFS_INO_REVALIDATING);
|
||||
}
|
||||
|
||||
int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
int need_atime = nfsi->flags & NFS_INO_INVALID_ATIME;
|
||||
int need_atime = NFS_I(inode)->cache_validity & NFS_INO_INVALID_ATIME;
|
||||
int err;
|
||||
|
||||
if (__IS_FLG(inode, MS_NOATIME))
|
||||
@ -1019,7 +1043,7 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
|
||||
struct nfs_fattr fattr;
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
unsigned long verifier;
|
||||
unsigned int flags;
|
||||
unsigned long cache_validity;
|
||||
|
||||
dfprintk(PAGECACHE, "NFS: revalidating (%s/%Ld)\n",
|
||||
inode->i_sb->s_id, (long long)NFS_FILEID(inode));
|
||||
@ -1030,18 +1054,19 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
|
||||
if (NFS_STALE(inode))
|
||||
goto out_nowait;
|
||||
|
||||
while (NFS_REVALIDATING(inode)) {
|
||||
status = nfs_wait_on_inode(inode, NFS_INO_REVALIDATING);
|
||||
if (status < 0)
|
||||
goto out_nowait;
|
||||
if (NFS_ATTRTIMEO(inode) == 0)
|
||||
continue;
|
||||
if (NFS_FLAGS(inode) & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ATIME))
|
||||
continue;
|
||||
status = NFS_STALE(inode) ? -ESTALE : 0;
|
||||
goto out_nowait;
|
||||
status = nfs_wait_on_inode(inode);
|
||||
if (status < 0)
|
||||
goto out;
|
||||
if (NFS_STALE(inode)) {
|
||||
status = -ESTALE;
|
||||
/* Do we trust the cached ESTALE? */
|
||||
if (NFS_ATTRTIMEO(inode) != 0) {
|
||||
if (nfsi->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ATIME)) {
|
||||
/* no */
|
||||
} else
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
NFS_FLAGS(inode) |= NFS_INO_REVALIDATING;
|
||||
|
||||
/* Protect against RPC races by saving the change attribute */
|
||||
verifier = nfs_save_change_attribute(inode);
|
||||
@ -1053,7 +1078,7 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
|
||||
if (status == -ESTALE) {
|
||||
nfs_zap_caches(inode);
|
||||
if (!S_ISDIR(inode->i_mode))
|
||||
NFS_FLAGS(inode) |= NFS_INO_STALE;
|
||||
set_bit(NFS_INO_STALE, &NFS_FLAGS(inode));
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
@ -1065,25 +1090,30 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
|
||||
(long long)NFS_FILEID(inode), status);
|
||||
goto out;
|
||||
}
|
||||
flags = nfsi->flags;
|
||||
nfsi->flags &= ~NFS_INO_REVAL_PAGECACHE;
|
||||
spin_lock(&inode->i_lock);
|
||||
cache_validity = nfsi->cache_validity;
|
||||
nfsi->cache_validity &= ~NFS_INO_REVAL_PAGECACHE;
|
||||
|
||||
/*
|
||||
* We may need to keep the attributes marked as invalid if
|
||||
* we raced with nfs_end_attr_update().
|
||||
*/
|
||||
if (verifier == nfsi->cache_change_attribute)
|
||||
nfsi->flags &= ~(NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME);
|
||||
/* Do the page cache invalidation */
|
||||
nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME);
|
||||
spin_unlock(&inode->i_lock);
|
||||
|
||||
nfs_revalidate_mapping(inode, inode->i_mapping);
|
||||
if (flags & NFS_INO_INVALID_ACL)
|
||||
|
||||
if (cache_validity & NFS_INO_INVALID_ACL)
|
||||
nfs_zap_acl_cache(inode);
|
||||
|
||||
dfprintk(PAGECACHE, "NFS: (%s/%Ld) revalidation complete\n",
|
||||
inode->i_sb->s_id,
|
||||
(long long)NFS_FILEID(inode));
|
||||
|
||||
out:
|
||||
NFS_FLAGS(inode) &= ~NFS_INO_REVALIDATING;
|
||||
wake_up(&nfsi->nfs_i_wait);
|
||||
out:
|
||||
nfs_wake_up_inode(inode);
|
||||
|
||||
out_nowait:
|
||||
unlock_kernel();
|
||||
return status;
|
||||
@ -1107,7 +1137,7 @@ int nfs_attribute_timeout(struct inode *inode)
|
||||
*/
|
||||
int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
|
||||
{
|
||||
if (!(NFS_FLAGS(inode) & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA))
|
||||
if (!(NFS_I(inode)->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA))
|
||||
&& !nfs_attribute_timeout(inode))
|
||||
return NFS_STALE(inode) ? -ESTALE : 0;
|
||||
return __nfs_revalidate_inode(server, inode);
|
||||
@ -1122,19 +1152,23 @@ void nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping)
|
||||
{
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
|
||||
if (nfsi->flags & NFS_INO_INVALID_DATA) {
|
||||
if (nfsi->cache_validity & NFS_INO_INVALID_DATA) {
|
||||
if (S_ISREG(inode->i_mode)) {
|
||||
if (filemap_fdatawrite(mapping) == 0)
|
||||
filemap_fdatawait(mapping);
|
||||
nfs_wb_all(inode);
|
||||
}
|
||||
invalidate_inode_pages2(mapping);
|
||||
nfsi->flags &= ~NFS_INO_INVALID_DATA;
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
nfsi->cache_validity &= ~NFS_INO_INVALID_DATA;
|
||||
if (S_ISDIR(inode->i_mode)) {
|
||||
memset(nfsi->cookieverf, 0, sizeof(nfsi->cookieverf));
|
||||
/* This ensures we revalidate child dentries */
|
||||
nfsi->cache_change_attribute++;
|
||||
}
|
||||
spin_unlock(&inode->i_lock);
|
||||
|
||||
dfprintk(PAGECACHE, "NFS: (%s/%Ld) data cache invalidated\n",
|
||||
inode->i_sb->s_id,
|
||||
(long long)NFS_FILEID(inode));
|
||||
@ -1164,10 +1198,12 @@ void nfs_end_data_update(struct inode *inode)
|
||||
|
||||
if (!nfs_have_delegation(inode, FMODE_READ)) {
|
||||
/* Mark the attribute cache for revalidation */
|
||||
nfsi->flags |= NFS_INO_INVALID_ATTR;
|
||||
spin_lock(&inode->i_lock);
|
||||
nfsi->cache_validity |= NFS_INO_INVALID_ATTR;
|
||||
/* Directories and symlinks: invalidate page cache too */
|
||||
if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))
|
||||
nfsi->flags |= NFS_INO_INVALID_DATA;
|
||||
nfsi->cache_validity |= NFS_INO_INVALID_DATA;
|
||||
spin_unlock(&inode->i_lock);
|
||||
}
|
||||
nfsi->cache_change_attribute ++;
|
||||
atomic_dec(&nfsi->data_updates);
|
||||
@ -1192,6 +1228,8 @@ int nfs_refresh_inode(struct inode *inode, struct nfs_fattr *fattr)
|
||||
if (nfs_have_delegation(inode, FMODE_READ))
|
||||
return 0;
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
|
||||
/* Are we in the process of updating data on the server? */
|
||||
data_unstable = nfs_caches_unstable(inode);
|
||||
|
||||
@ -1200,19 +1238,23 @@ int nfs_refresh_inode(struct inode *inode, struct nfs_fattr *fattr)
|
||||
&& nfsi->change_attr == fattr->pre_change_attr)
|
||||
nfsi->change_attr = fattr->change_attr;
|
||||
if (nfsi->change_attr != fattr->change_attr) {
|
||||
nfsi->flags |= NFS_INO_INVALID_ATTR;
|
||||
nfsi->cache_validity |= NFS_INO_INVALID_ATTR;
|
||||
if (!data_unstable)
|
||||
nfsi->flags |= NFS_INO_REVAL_PAGECACHE;
|
||||
nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE;
|
||||
}
|
||||
}
|
||||
|
||||
if ((fattr->valid & NFS_ATTR_FATTR) == 0)
|
||||
if ((fattr->valid & NFS_ATTR_FATTR) == 0) {
|
||||
spin_unlock(&inode->i_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Has the inode gone and changed behind our back? */
|
||||
if (nfsi->fileid != fattr->fileid
|
||||
|| (inode->i_mode & S_IFMT) != (fattr->mode & S_IFMT))
|
||||
|| (inode->i_mode & S_IFMT) != (fattr->mode & S_IFMT)) {
|
||||
spin_unlock(&inode->i_lock);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
cur_size = i_size_read(inode);
|
||||
new_isize = nfs_size_to_loff_t(fattr->size);
|
||||
@ -1227,30 +1269,31 @@ int nfs_refresh_inode(struct inode *inode, struct nfs_fattr *fattr)
|
||||
|
||||
/* Verify a few of the more important attributes */
|
||||
if (!timespec_equal(&inode->i_mtime, &fattr->mtime)) {
|
||||
nfsi->flags |= NFS_INO_INVALID_ATTR;
|
||||
nfsi->cache_validity |= NFS_INO_INVALID_ATTR;
|
||||
if (!data_unstable)
|
||||
nfsi->flags |= NFS_INO_REVAL_PAGECACHE;
|
||||
nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE;
|
||||
}
|
||||
if (cur_size != new_isize) {
|
||||
nfsi->flags |= NFS_INO_INVALID_ATTR;
|
||||
nfsi->cache_validity |= NFS_INO_INVALID_ATTR;
|
||||
if (nfsi->npages == 0)
|
||||
nfsi->flags |= NFS_INO_REVAL_PAGECACHE;
|
||||
nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE;
|
||||
}
|
||||
|
||||
/* Have any file permissions changed? */
|
||||
if ((inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO)
|
||||
|| inode->i_uid != fattr->uid
|
||||
|| inode->i_gid != fattr->gid)
|
||||
nfsi->flags |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS | NFS_INO_INVALID_ACL;
|
||||
nfsi->cache_validity |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS | NFS_INO_INVALID_ACL;
|
||||
|
||||
/* Has the link count changed? */
|
||||
if (inode->i_nlink != fattr->nlink)
|
||||
nfsi->flags |= NFS_INO_INVALID_ATTR;
|
||||
nfsi->cache_validity |= NFS_INO_INVALID_ATTR;
|
||||
|
||||
if (!timespec_equal(&inode->i_atime, &fattr->atime))
|
||||
nfsi->flags |= NFS_INO_INVALID_ATIME;
|
||||
nfsi->cache_validity |= NFS_INO_INVALID_ATIME;
|
||||
|
||||
nfsi->read_cache_jiffies = fattr->timestamp;
|
||||
spin_unlock(&inode->i_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1289,11 +1332,15 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr, unsign
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
|
||||
/*
|
||||
* Make sure the inode's type hasn't changed.
|
||||
*/
|
||||
if ((inode->i_mode & S_IFMT) != (fattr->mode & S_IFMT))
|
||||
if ((inode->i_mode & S_IFMT) != (fattr->mode & S_IFMT)) {
|
||||
spin_unlock(&inode->i_lock);
|
||||
goto out_changed;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update the read time so we don't revalidate too often.
|
||||
@ -1384,8 +1431,9 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr, unsign
|
||||
|| S_ISLNK(inode->i_mode)))
|
||||
invalid &= ~NFS_INO_INVALID_DATA;
|
||||
if (!nfs_have_delegation(inode, FMODE_READ))
|
||||
nfsi->flags |= invalid;
|
||||
nfsi->cache_validity |= invalid;
|
||||
|
||||
spin_unlock(&inode->i_lock);
|
||||
return 0;
|
||||
out_changed:
|
||||
/*
|
||||
@ -1402,7 +1450,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr, unsign
|
||||
*/
|
||||
nfs_invalidate_inode(inode);
|
||||
out_err:
|
||||
NFS_FLAGS(inode) |= NFS_INO_STALE;
|
||||
set_bit(NFS_INO_STALE, &NFS_FLAGS(inode));
|
||||
return -ESTALE;
|
||||
}
|
||||
|
||||
@ -1961,7 +2009,8 @@ static struct inode *nfs_alloc_inode(struct super_block *sb)
|
||||
nfsi = (struct nfs_inode *)kmem_cache_alloc(nfs_inode_cachep, SLAB_KERNEL);
|
||||
if (!nfsi)
|
||||
return NULL;
|
||||
nfsi->flags = 0;
|
||||
nfsi->flags = 0UL;
|
||||
nfsi->cache_validity = 0UL;
|
||||
#ifdef CONFIG_NFS_V3_ACL
|
||||
nfsi->acl_access = ERR_PTR(-EAGAIN);
|
||||
nfsi->acl_default = ERR_PTR(-EAGAIN);
|
||||
@ -1993,7 +2042,6 @@ static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags)
|
||||
nfsi->ndirty = 0;
|
||||
nfsi->ncommit = 0;
|
||||
nfsi->npages = 0;
|
||||
init_waitqueue_head(&nfsi->nfs_i_wait);
|
||||
nfs4_init_once(nfsi);
|
||||
}
|
||||
}
|
||||
|
@ -308,7 +308,9 @@ static int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl,
|
||||
nfs_begin_data_update(inode);
|
||||
status = rpc_call(server->client_acl, ACLPROC3_SETACL,
|
||||
&args, &fattr, 0);
|
||||
NFS_FLAGS(inode) |= NFS_INO_INVALID_ACCESS;
|
||||
spin_lock(&inode->i_lock);
|
||||
NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ACCESS;
|
||||
spin_unlock(&inode->i_lock);
|
||||
nfs_end_data_update(inode);
|
||||
dprintk("NFS reply setacl: %d\n", status);
|
||||
|
||||
|
@ -140,7 +140,9 @@ static int nfs_readpage_sync(struct nfs_open_context *ctx, struct inode *inode,
|
||||
if (rdata->res.eof != 0 || result == 0)
|
||||
break;
|
||||
} while (count);
|
||||
NFS_FLAGS(inode) |= NFS_INO_INVALID_ATIME;
|
||||
spin_lock(&inode->i_lock);
|
||||
NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATIME;
|
||||
spin_unlock(&inode->i_lock);
|
||||
|
||||
if (count)
|
||||
memclear_highpage_flush(page, rdata->args.pgbase, count);
|
||||
@ -473,7 +475,9 @@ void nfs_readpage_result(struct rpc_task *task)
|
||||
}
|
||||
task->tk_status = -EIO;
|
||||
}
|
||||
NFS_FLAGS(data->inode) |= NFS_INO_INVALID_ATIME;
|
||||
spin_lock(&data->inode->i_lock);
|
||||
NFS_I(data->inode)->cache_validity |= NFS_INO_INVALID_ATIME;
|
||||
spin_unlock(&data->inode->i_lock);
|
||||
data->complete(data, status);
|
||||
}
|
||||
|
||||
|
@ -27,26 +27,14 @@
|
||||
|
||||
/* Symlink caching in the page cache is even more simplistic
|
||||
* 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)
|
||||
{
|
||||
const unsigned int pgbase = offsetof(struct nfs_symlink, body);
|
||||
const unsigned int pglen = PAGE_SIZE - pgbase;
|
||||
int error;
|
||||
|
||||
lock_kernel();
|
||||
error = NFS_PROTO(inode)->readlink(inode, page, pgbase, pglen);
|
||||
error = NFS_PROTO(inode)->readlink(inode, page, 0, PAGE_SIZE);
|
||||
unlock_kernel();
|
||||
if (error < 0)
|
||||
goto error;
|
||||
@ -60,11 +48,10 @@ error:
|
||||
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 page *page;
|
||||
struct nfs_symlink *p;
|
||||
void *err = ERR_PTR(nfs_revalidate_inode(NFS_SERVER(inode), inode));
|
||||
if (err)
|
||||
goto read_failed;
|
||||
@ -78,28 +65,20 @@ static int nfs_follow_link(struct dentry *dentry, struct nameidata *nd)
|
||||
err = ERR_PTR(-EIO);
|
||||
goto getlink_read_error;
|
||||
}
|
||||
p = kmap(page);
|
||||
p->page = page;
|
||||
nd_set_link(nd, p->body);
|
||||
return 0;
|
||||
nd_set_link(nd, kmap(page));
|
||||
return page;
|
||||
|
||||
getlink_read_error:
|
||||
page_cache_release(page);
|
||||
read_failed:
|
||||
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 (!IS_ERR(s)) {
|
||||
struct nfs_symlink *p;
|
||||
struct page *page;
|
||||
|
||||
p = container_of(s, struct nfs_symlink, body[0]);
|
||||
page = p->page;
|
||||
|
||||
if (cookie) {
|
||||
struct page *page = cookie;
|
||||
kunmap(page);
|
||||
page_cache_release(page);
|
||||
}
|
||||
|
@ -890,7 +890,7 @@ static struct file_operations proc_seccomp_operations = {
|
||||
};
|
||||
#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;
|
||||
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);
|
||||
nd->last_type = LAST_BIND;
|
||||
out:
|
||||
return error;
|
||||
return ERR_PTR(error);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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];
|
||||
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 = {
|
||||
|
@ -329,10 +329,10 @@ static void release_inode_number(unsigned int inum)
|
||||
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);
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct inode_operations proc_link_inode_operations = {
|
||||
|
@ -1985,7 +1985,7 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th,
|
||||
* iput doesn't deadlock in reiserfs_delete_xattrs. The locking
|
||||
* code really needs to be reworked, but this will take care of it
|
||||
* for now. -jeffm */
|
||||
if (REISERFS_I(dir)->i_acl_default) {
|
||||
if (REISERFS_I(dir)->i_acl_default && !IS_ERR(REISERFS_I(dir)->i_acl_default)) {
|
||||
reiserfs_write_unlock_xattrs(dir->i_sb);
|
||||
iput(inode);
|
||||
reiserfs_write_lock_xattrs(dir->i_sb);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
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();
|
||||
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);
|
||||
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);
|
||||
if (!IS_ERR(s))
|
||||
|
@ -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;
|
||||
unsigned long page = get_zeroed_page(GFP_KERNEL);
|
||||
if (page)
|
||||
error = sysfs_getlink(dentry, (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);
|
||||
if (!IS_ERR(page))
|
||||
|
@ -8,10 +8,10 @@
|
||||
#include "sysv.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);
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct inode_operations sysv_fast_symlink_inode_operations = {
|
||||
|
@ -29,11 +29,11 @@
|
||||
#include <linux/namei.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);
|
||||
nd_set_link(nd, (char*)p->i_u1.i_symlink);
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct inode_operations ufs_fast_symlink_inode_operations = {
|
||||
|
@ -374,7 +374,7 @@ linvfs_rename(
|
||||
* we need to be very careful about how much stack we use.
|
||||
* uio is kmalloced for this reason...
|
||||
*/
|
||||
STATIC int
|
||||
STATIC void *
|
||||
linvfs_follow_link(
|
||||
struct dentry *dentry,
|
||||
struct nameidata *nd)
|
||||
@ -391,14 +391,14 @@ linvfs_follow_link(
|
||||
link = (char *)kmalloc(MAXNAMELEN+1, GFP_KERNEL);
|
||||
if (!link) {
|
||||
nd_set_link(nd, ERR_PTR(-ENOMEM));
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
uio = (uio_t *)kmalloc(sizeof(uio_t), GFP_KERNEL);
|
||||
if (!uio) {
|
||||
kfree(link);
|
||||
nd_set_link(nd, ERR_PTR(-ENOMEM));
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
vp = LINVFS_GET_VP(dentry->d_inode);
|
||||
@ -422,10 +422,10 @@ linvfs_follow_link(
|
||||
kfree(uio);
|
||||
|
||||
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);
|
||||
if (!IS_ERR(s))
|
||||
|
@ -423,11 +423,7 @@
|
||||
#define MQ0_CONFIG_SIZE_2G 0x0000c000
|
||||
|
||||
/* Internal SRAM Controller 440GX/440SP */
|
||||
#ifdef CONFIG_440SP
|
||||
#define DCRN_SRAM0_BASE 0x100
|
||||
#else /* 440GX */
|
||||
#define DCRN_SRAM0_BASE 0x000
|
||||
#endif
|
||||
|
||||
#define DCRN_SRAM0_SB0CR (DCRN_SRAM0_BASE + 0x020)
|
||||
#define DCRN_SRAM0_SB1CR (DCRN_SRAM0_BASE + 0x021)
|
||||
|
@ -285,7 +285,7 @@ typedef uint32_t sgl_handle_t;
|
||||
|
||||
#define GET_DMA_POLARITY(chan) (DMAReq_ActiveLow(chan) | DMAAck_ActiveLow(chan) | EOT_ActiveLow(chan))
|
||||
|
||||
#elif defined(CONFIG_STBXXX_DMA) /* stb03xxx */
|
||||
#elif defined(CONFIG_STB03xxx) /* stb03xxx */
|
||||
|
||||
#define DMA_PPC4xx_SIZE 4096
|
||||
|
||||
|
@ -295,8 +295,14 @@
|
||||
#define __NR_add_key 285
|
||||
#define __NR_request_key 286
|
||||
#define __NR_keyctl 287
|
||||
#define __NR_ioprio_set 288
|
||||
#define __NR_ioprio_get 289
|
||||
#define __NR_inotify_init 290
|
||||
#define __NR_inotify_add_watch 291
|
||||
#define __NR_inotify_rm_watch 292
|
||||
|
||||
#define NR_syscalls 288
|
||||
|
||||
#define NR_syscalls 293
|
||||
|
||||
/* user-visible error numbers are in the range -1 - -124: see <asm-sh/errno.h> */
|
||||
|
||||
|
@ -338,8 +338,13 @@
|
||||
#define __NR_add_key 313
|
||||
#define __NR_request_key 314
|
||||
#define __NR_keyctl 315
|
||||
#define __NR_ioprio_set 316
|
||||
#define __NR_ioprio_get 317
|
||||
#define __NR_inotify_init 318
|
||||
#define __NR_inotify_add_watch 319
|
||||
#define __NR_inotify_rm_watch 320
|
||||
|
||||
#define NR_syscalls 316
|
||||
#define NR_syscalls 321
|
||||
|
||||
/* user-visible error numbers are in the range -1 - -125: see <asm-sh64/errno.h> */
|
||||
|
||||
|
@ -68,6 +68,9 @@ struct thread_info {
|
||||
|
||||
struct restart_block restart_block;
|
||||
|
||||
struct pt_regs *kern_una_regs;
|
||||
unsigned int kern_una_insn;
|
||||
|
||||
unsigned long fpregs[0] __attribute__ ((aligned(64)));
|
||||
};
|
||||
|
||||
@ -103,6 +106,8 @@ struct thread_info {
|
||||
#define TI_PCR 0x00000490
|
||||
#define TI_CEE_STUFF 0x00000498
|
||||
#define TI_RESTART_BLOCK 0x000004a0
|
||||
#define TI_KUNA_REGS 0x000004c8
|
||||
#define TI_KUNA_INSN 0x000004d0
|
||||
#define TI_FPREGS 0x00000500
|
||||
|
||||
/* We embed this in the uppermost byte of thread_info->flags */
|
||||
|
@ -993,8 +993,8 @@ struct inode_operations {
|
||||
int (*rename) (struct inode *, struct dentry *,
|
||||
struct inode *, struct dentry *);
|
||||
int (*readlink) (struct dentry *, char __user *,int);
|
||||
int (*follow_link) (struct dentry *, struct nameidata *);
|
||||
void (*put_link) (struct dentry *, struct nameidata *);
|
||||
void * (*follow_link) (struct dentry *, struct nameidata *);
|
||||
void (*put_link) (struct dentry *, struct nameidata *, void *);
|
||||
void (*truncate) (struct inode *);
|
||||
int (*permission) (struct inode *, int, struct nameidata *);
|
||||
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_follow_link(struct nameidata *, const char *);
|
||||
extern int page_readlink(struct dentry *, char __user *, int);
|
||||
extern int page_follow_link_light(struct dentry *, struct nameidata *);
|
||||
extern void page_put_link(struct dentry *, struct nameidata *);
|
||||
extern void *page_follow_link_light(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 struct inode_operations page_symlink_inode_operations;
|
||||
extern int generic_readlink(struct dentry *, char __user *, int);
|
||||
|
@ -112,7 +112,8 @@ struct nfs_inode {
|
||||
/*
|
||||
* Various flags
|
||||
*/
|
||||
unsigned int flags;
|
||||
unsigned long flags; /* atomic bit ops */
|
||||
unsigned long cache_validity; /* bit mask */
|
||||
|
||||
/*
|
||||
* read_cache_jiffies is when we started read-caching this inode,
|
||||
@ -174,8 +175,6 @@ struct nfs_inode {
|
||||
/* Open contexts for shared mmap writes */
|
||||
struct list_head open_files;
|
||||
|
||||
wait_queue_head_t nfs_i_wait;
|
||||
|
||||
#ifdef CONFIG_NFS_V4
|
||||
struct nfs4_cached_acl *nfs4_acl;
|
||||
/* NFSv4 state */
|
||||
@ -188,17 +187,21 @@ struct nfs_inode {
|
||||
};
|
||||
|
||||
/*
|
||||
* Legal inode flag values
|
||||
* Cache validity bit flags
|
||||
*/
|
||||
#define NFS_INO_STALE 0x0001 /* possible stale inode */
|
||||
#define NFS_INO_ADVISE_RDPLUS 0x0002 /* advise readdirplus */
|
||||
#define NFS_INO_REVALIDATING 0x0004 /* revalidating attrs */
|
||||
#define NFS_INO_INVALID_ATTR 0x0008 /* cached attrs are invalid */
|
||||
#define NFS_INO_INVALID_DATA 0x0010 /* cached data is invalid */
|
||||
#define NFS_INO_INVALID_ATIME 0x0020 /* cached atime is invalid */
|
||||
#define NFS_INO_INVALID_ACCESS 0x0040 /* cached access cred invalid */
|
||||
#define NFS_INO_INVALID_ACL 0x0080 /* cached acls are invalid */
|
||||
#define NFS_INO_REVAL_PAGECACHE 0x1000 /* must revalidate pagecache */
|
||||
#define NFS_INO_INVALID_ATTR 0x0001 /* cached attrs are invalid */
|
||||
#define NFS_INO_INVALID_DATA 0x0002 /* cached data is invalid */
|
||||
#define NFS_INO_INVALID_ATIME 0x0004 /* cached atime is invalid */
|
||||
#define NFS_INO_INVALID_ACCESS 0x0008 /* cached access cred invalid */
|
||||
#define NFS_INO_INVALID_ACL 0x0010 /* cached acls are invalid */
|
||||
#define NFS_INO_REVAL_PAGECACHE 0x0020 /* must revalidate pagecache */
|
||||
|
||||
/*
|
||||
* Bit offsets in flags field
|
||||
*/
|
||||
#define NFS_INO_REVALIDATING (0) /* revalidating attrs */
|
||||
#define NFS_INO_ADVISE_RDPLUS (1) /* advise readdirplus */
|
||||
#define NFS_INO_STALE (2) /* possible stale inode */
|
||||
|
||||
static inline struct nfs_inode *NFS_I(struct inode *inode)
|
||||
{
|
||||
@ -224,8 +227,7 @@ static inline struct nfs_inode *NFS_I(struct inode *inode)
|
||||
#define NFS_ATTRTIMEO_UPDATE(inode) (NFS_I(inode)->attrtimeo_timestamp)
|
||||
|
||||
#define NFS_FLAGS(inode) (NFS_I(inode)->flags)
|
||||
#define NFS_REVALIDATING(inode) (NFS_FLAGS(inode) & NFS_INO_REVALIDATING)
|
||||
#define NFS_STALE(inode) (NFS_FLAGS(inode) & NFS_INO_STALE)
|
||||
#define NFS_STALE(inode) (test_bit(NFS_INO_STALE, &NFS_FLAGS(inode)))
|
||||
|
||||
#define NFS_FILEID(inode) (NFS_I(inode)->fileid)
|
||||
|
||||
@ -236,8 +238,11 @@ static inline int nfs_caches_unstable(struct inode *inode)
|
||||
|
||||
static inline void NFS_CACHEINV(struct inode *inode)
|
||||
{
|
||||
if (!nfs_caches_unstable(inode))
|
||||
NFS_FLAGS(inode) |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS;
|
||||
if (!nfs_caches_unstable(inode)) {
|
||||
spin_lock(&inode->i_lock);
|
||||
NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS;
|
||||
spin_unlock(&inode->i_lock);
|
||||
}
|
||||
}
|
||||
|
||||
static inline int nfs_server_capable(struct inode *inode, int cap)
|
||||
@ -247,7 +252,7 @@ static inline int nfs_server_capable(struct inode *inode, int cap)
|
||||
|
||||
static inline int NFS_USE_READDIRPLUS(struct inode *inode)
|
||||
{
|
||||
return NFS_FLAGS(inode) & NFS_INO_ADVISE_RDPLUS;
|
||||
return test_bit(NFS_INO_ADVISE_RDPLUS, &NFS_FLAGS(inode));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -881,7 +881,7 @@
|
||||
#define PCI_DEVICE_ID_APPLE_UNI_N_PCI15 0x002e
|
||||
#define PCI_DEVICE_ID_APPLE_UNI_N_FW2 0x0030
|
||||
#define PCI_DEVICE_ID_APPLE_UNI_N_GMAC2 0x0032
|
||||
#define PCI_DEVIEC_ID_APPLE_UNI_N_ATA 0x0033
|
||||
#define PCI_DEVICE_ID_APPLE_UNI_N_ATA 0x0033
|
||||
#define PCI_DEVICE_ID_APPLE_UNI_N_AGP2 0x0034
|
||||
#define PCI_DEVICE_ID_APPLE_IPID_ATA100 0x003b
|
||||
#define PCI_DEVICE_ID_APPLE_KEYLARGO_I 0x003e
|
||||
@ -1580,6 +1580,7 @@
|
||||
#define PCI_DEVICE_ID_SERVERWORKS_OSB4IDE 0x0211
|
||||
#define PCI_DEVICE_ID_SERVERWORKS_CSB5IDE 0x0212
|
||||
#define PCI_DEVICE_ID_SERVERWORKS_CSB6IDE 0x0213
|
||||
#define PCI_DEVICE_ID_SERVERWORKS_HT1000IDE 0x0214
|
||||
#define PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2 0x0217
|
||||
#define PCI_DEVICE_ID_SERVERWORKS_OSB4USB 0x0220
|
||||
#define PCI_DEVICE_ID_SERVERWORKS_CSB5USB PCI_DEVICE_ID_SERVERWORKS_OSB4USB
|
||||
@ -2184,6 +2185,9 @@
|
||||
#define PCI_VENDOR_ID_SIBYTE 0x166d
|
||||
#define PCI_DEVICE_ID_BCM1250_HT 0x0002
|
||||
|
||||
#define PCI_VENDOR_ID_NETCELL 0x169c
|
||||
#define PCI_DEVICE_ID_REVOLUTION 0x0044
|
||||
|
||||
#define PCI_VENDOR_ID_LINKSYS 0x1737
|
||||
#define PCI_DEVICE_ID_LINKSYS_EG1032 0x1032
|
||||
#define PCI_DEVICE_ID_LINKSYS_EG1064 0x1064
|
||||
|
@ -3378,8 +3378,8 @@ EXPORT_SYMBOL(set_user_nice);
|
||||
*/
|
||||
int can_nice(const task_t *p, const int nice)
|
||||
{
|
||||
/* convert nice value [19,-20] to rlimit style value [0,39] */
|
||||
int nice_rlim = 19 - nice;
|
||||
/* convert nice value [19,-20] to rlimit style value [1,40] */
|
||||
int nice_rlim = 20 - nice;
|
||||
return (nice_rlim <= p->signal->rlim[RLIMIT_NICE].rlim_cur ||
|
||||
capable(CAP_SYS_NICE));
|
||||
}
|
||||
|
17
mm/shmem.c
17
mm/shmem.c
@ -1773,32 +1773,27 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s
|
||||
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));
|
||||
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;
|
||||
int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ, NULL);
|
||||
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))) {
|
||||
struct page *page;
|
||||
|
||||
page = find_get_page(dentry->d_inode->i_mapping, 0);
|
||||
if (!page)
|
||||
BUG();
|
||||
struct page *page = cookie;
|
||||
kunmap(page);
|
||||
mark_page_accessed(page);
|
||||
page_cache_release(page);
|
||||
page_cache_release(page);
|
||||
}
|
||||
}
|
||||
|
||||
|
22
net/802/tr.c
22
net/802/tr.c
@ -251,10 +251,11 @@ void tr_source_route(struct sk_buff *skb,struct trh_hdr *trh,struct net_device *
|
||||
unsigned int hash;
|
||||
struct rif_cache *entry;
|
||||
unsigned char *olddata;
|
||||
unsigned long flags;
|
||||
static const unsigned char mcast_func_addr[]
|
||||
= {0xC0,0x00,0x00,0x04,0x00,0x00};
|
||||
|
||||
spin_lock_bh(&rif_lock);
|
||||
spin_lock_irqsave(&rif_lock, flags);
|
||||
|
||||
/*
|
||||
* Broadcasts are single route as stated in RFC 1042
|
||||
@ -323,7 +324,7 @@ printk("source routing for %02X:%02X:%02X:%02X:%02X:%02X\n",trh->daddr[0],
|
||||
else
|
||||
slack = 18 - ((ntohs(trh->rcf) & TR_RCF_LEN_MASK)>>8);
|
||||
olddata = skb->data;
|
||||
spin_unlock_bh(&rif_lock);
|
||||
spin_unlock_irqrestore(&rif_lock, flags);
|
||||
|
||||
skb_pull(skb, slack);
|
||||
memmove(skb->data, olddata, sizeof(struct trh_hdr) - slack);
|
||||
@ -337,10 +338,11 @@ printk("source routing for %02X:%02X:%02X:%02X:%02X:%02X\n",trh->daddr[0],
|
||||
static void tr_add_rif_info(struct trh_hdr *trh, struct net_device *dev)
|
||||
{
|
||||
unsigned int hash, rii_p = 0;
|
||||
unsigned long flags;
|
||||
struct rif_cache *entry;
|
||||
|
||||
|
||||
spin_lock_bh(&rif_lock);
|
||||
spin_lock_irqsave(&rif_lock, flags);
|
||||
|
||||
/*
|
||||
* Firstly see if the entry exists
|
||||
@ -378,7 +380,7 @@ printk("adding rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
|
||||
if(!entry)
|
||||
{
|
||||
printk(KERN_DEBUG "tr.c: Couldn't malloc rif cache entry !\n");
|
||||
spin_unlock_bh(&rif_lock);
|
||||
spin_unlock_irqrestore(&rif_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -420,7 +422,7 @@ printk("updating rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
|
||||
}
|
||||
entry->last_used=jiffies;
|
||||
}
|
||||
spin_unlock_bh(&rif_lock);
|
||||
spin_unlock_irqrestore(&rif_lock, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -430,9 +432,9 @@ printk("updating rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
|
||||
static void rif_check_expire(unsigned long dummy)
|
||||
{
|
||||
int i;
|
||||
unsigned long next_interval = jiffies + sysctl_tr_rif_timeout/2;
|
||||
unsigned long flags, next_interval = jiffies + sysctl_tr_rif_timeout/2;
|
||||
|
||||
spin_lock_bh(&rif_lock);
|
||||
spin_lock_irqsave(&rif_lock, flags);
|
||||
|
||||
for(i =0; i < RIF_TABLE_SIZE; i++) {
|
||||
struct rif_cache *entry, **pentry;
|
||||
@ -454,7 +456,7 @@ static void rif_check_expire(unsigned long dummy)
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_bh(&rif_lock);
|
||||
spin_unlock_irqrestore(&rif_lock, flags);
|
||||
|
||||
mod_timer(&rif_timer, next_interval);
|
||||
|
||||
@ -485,7 +487,7 @@ static struct rif_cache *rif_get_idx(loff_t pos)
|
||||
|
||||
static void *rif_seq_start(struct seq_file *seq, loff_t *pos)
|
||||
{
|
||||
spin_lock_bh(&rif_lock);
|
||||
spin_lock_irq(&rif_lock);
|
||||
|
||||
return *pos ? rif_get_idx(*pos - 1) : SEQ_START_TOKEN;
|
||||
}
|
||||
@ -516,7 +518,7 @@ static void *rif_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||
|
||||
static void rif_seq_stop(struct seq_file *seq, void *v)
|
||||
{
|
||||
spin_unlock_bh(&rif_lock);
|
||||
spin_unlock_irq(&rif_lock);
|
||||
}
|
||||
|
||||
static int rif_seq_show(struct seq_file *seq, void *v)
|
||||
|
@ -349,12 +349,12 @@ static void icmp_push_reply(struct icmp_bxm *icmp_param,
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
ip_append_data(icmp_socket->sk, icmp_glue_bits, icmp_param,
|
||||
icmp_param->data_len+icmp_param->head_len,
|
||||
icmp_param->head_len,
|
||||
ipc, rt, MSG_DONTWAIT);
|
||||
|
||||
if ((skb = skb_peek(&icmp_socket->sk->sk_write_queue)) != NULL) {
|
||||
if (ip_append_data(icmp_socket->sk, icmp_glue_bits, icmp_param,
|
||||
icmp_param->data_len+icmp_param->head_len,
|
||||
icmp_param->head_len,
|
||||
ipc, rt, MSG_DONTWAIT) < 0)
|
||||
ip_flush_pending_frames(icmp_socket->sk);
|
||||
else if ((skb = skb_peek(&icmp_socket->sk->sk_write_queue)) != NULL) {
|
||||
struct icmphdr *icmph = skb->h.icmph;
|
||||
unsigned int csum = 0;
|
||||
struct sk_buff *skb1;
|
||||
|
@ -358,7 +358,7 @@ static struct crypto_tfm **ipcomp_alloc_tfms(const char *alg_name)
|
||||
int cpu;
|
||||
|
||||
/* This can be any valid CPU ID so we don't need locking. */
|
||||
cpu = smp_processor_id();
|
||||
cpu = raw_smp_processor_id();
|
||||
|
||||
list_for_each_entry(pos, &ipcomp_tfms_list, list) {
|
||||
struct crypto_tfm *tfm;
|
||||
|
@ -61,16 +61,20 @@ set_ect_tcp(struct sk_buff **pskb, const struct ipt_ECN_info *einfo, int inward)
|
||||
if (!tcph)
|
||||
return 0;
|
||||
|
||||
if (!(einfo->operation & IPT_ECN_OP_SET_ECE
|
||||
|| tcph->ece == einfo->proto.tcp.ece)
|
||||
&& (!(einfo->operation & IPT_ECN_OP_SET_CWR
|
||||
|| tcph->cwr == einfo->proto.tcp.cwr)))
|
||||
if ((!(einfo->operation & IPT_ECN_OP_SET_ECE) ||
|
||||
tcph->ece == einfo->proto.tcp.ece) &&
|
||||
((!(einfo->operation & IPT_ECN_OP_SET_CWR) ||
|
||||
tcph->cwr == einfo->proto.tcp.cwr)))
|
||||
return 1;
|
||||
|
||||
if (!skb_ip_make_writable(pskb, (*pskb)->nh.iph->ihl*4+sizeof(*tcph)))
|
||||
return 0;
|
||||
tcph = (void *)(*pskb)->nh.iph + (*pskb)->nh.iph->ihl*4;
|
||||
|
||||
if ((*pskb)->ip_summed == CHECKSUM_HW &&
|
||||
skb_checksum_help(*pskb, inward))
|
||||
return 0;
|
||||
|
||||
diffs[0] = ((u_int16_t *)tcph)[6];
|
||||
if (einfo->operation & IPT_ECN_OP_SET_ECE)
|
||||
tcph->ece = einfo->proto.tcp.ece;
|
||||
@ -79,13 +83,10 @@ set_ect_tcp(struct sk_buff **pskb, const struct ipt_ECN_info *einfo, int inward)
|
||||
diffs[1] = ((u_int16_t *)tcph)[6];
|
||||
diffs[0] = diffs[0] ^ 0xFFFF;
|
||||
|
||||
if ((*pskb)->ip_summed != CHECKSUM_HW)
|
||||
if ((*pskb)->ip_summed != CHECKSUM_UNNECESSARY)
|
||||
tcph->check = csum_fold(csum_partial((char *)diffs,
|
||||
sizeof(diffs),
|
||||
tcph->check^0xFFFF));
|
||||
else
|
||||
if (skb_checksum_help(*pskb, inward))
|
||||
return 0;
|
||||
(*pskb)->nfcache |= NFC_ALTERED;
|
||||
return 1;
|
||||
}
|
||||
|
@ -61,6 +61,10 @@ ipt_tcpmss_target(struct sk_buff **pskb,
|
||||
if (!skb_ip_make_writable(pskb, (*pskb)->len))
|
||||
return NF_DROP;
|
||||
|
||||
if ((*pskb)->ip_summed == CHECKSUM_HW &&
|
||||
skb_checksum_help(*pskb, out == NULL))
|
||||
return NF_DROP;
|
||||
|
||||
iph = (*pskb)->nh.iph;
|
||||
tcplen = (*pskb)->len - iph->ihl*4;
|
||||
|
||||
@ -186,9 +190,6 @@ ipt_tcpmss_target(struct sk_buff **pskb,
|
||||
newmss);
|
||||
|
||||
retmodified:
|
||||
/* We never hw checksum SYN packets. */
|
||||
BUG_ON((*pskb)->ip_summed == CHECKSUM_HW);
|
||||
|
||||
(*pskb)->nfcache |= NFC_UNKNOWN | NFC_ALTERED;
|
||||
return IPT_CONTINUE;
|
||||
}
|
||||
|
@ -354,7 +354,7 @@ static struct crypto_tfm **ipcomp6_alloc_tfms(const char *alg_name)
|
||||
int cpu;
|
||||
|
||||
/* This can be any valid CPU ID so we don't need locking. */
|
||||
cpu = smp_processor_id();
|
||||
cpu = raw_smp_processor_id();
|
||||
|
||||
list_for_each_entry(pos, &ipcomp6_tfms_list, list) {
|
||||
struct crypto_tfm *tfm;
|
||||
|
@ -359,11 +359,16 @@ handle_modversions(struct module *mod, struct elf_info *info,
|
||||
/* ignore __this_module, it will be resolved shortly */
|
||||
if (strcmp(symname, MODULE_SYMBOL_PREFIX "__this_module") == 0)
|
||||
break;
|
||||
#ifdef STT_REGISTER
|
||||
/* cope with newer glibc (2.3.4 or higher) STT_ definition in elf.h */
|
||||
#if defined(STT_REGISTER) || defined(STT_SPARC_REGISTER)
|
||||
/* add compatibility with older glibc */
|
||||
#ifndef STT_SPARC_REGISTER
|
||||
#define STT_SPARC_REGISTER STT_REGISTER
|
||||
#endif
|
||||
if (info->hdr->e_machine == EM_SPARC ||
|
||||
info->hdr->e_machine == EM_SPARCV9) {
|
||||
/* Ignore register directives. */
|
||||
if (ELF_ST_TYPE(sym->st_info) == STT_REGISTER)
|
||||
if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER)
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user