Commit cfad589f authored by Paul Mackerras's avatar Paul Mackerras

Merge branch 'linux-2.6' into for-2.6.25

parents bc625f20 437105f2
...@@ -108,6 +108,9 @@ endif ...@@ -108,6 +108,9 @@ endif
PHONY := _all PHONY := _all
_all: _all:
# Cancel implicit rules on top Makefile
$(CURDIR)/Makefile Makefile: ;
ifneq ($(KBUILD_OUTPUT),) ifneq ($(KBUILD_OUTPUT),)
# Invoke a second make in the output directory, passing relevant variables # Invoke a second make in the output directory, passing relevant variables
# check that the output directory actually exists # check that the output directory actually exists
...@@ -115,13 +118,10 @@ saved-output := $(KBUILD_OUTPUT) ...@@ -115,13 +118,10 @@ saved-output := $(KBUILD_OUTPUT)
KBUILD_OUTPUT := $(shell cd $(KBUILD_OUTPUT) && /bin/pwd) KBUILD_OUTPUT := $(shell cd $(KBUILD_OUTPUT) && /bin/pwd)
$(if $(KBUILD_OUTPUT),, \ $(if $(KBUILD_OUTPUT),, \
$(error output directory "$(saved-output)" does not exist)) $(error output directory "$(saved-output)" does not exist))
# Check that OUTPUT directory is not the same as where we have kernel src
$(if $(filter-out $(KBUILD_OUTPUT),$(shell /bin/pwd)),, \
$(error Output directory (O=...) specifies kernel src dir))
PHONY += $(MAKECMDGOALS) sub-make PHONY += $(MAKECMDGOALS) sub-make
$(filter-out _all sub-make,$(MAKECMDGOALS)) _all: sub-make $(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
$(Q)@: $(Q)@:
sub-make: FORCE sub-make: FORCE
...@@ -291,7 +291,8 @@ export quiet Q KBUILD_VERBOSE ...@@ -291,7 +291,8 @@ export quiet Q KBUILD_VERBOSE
# Look for make include files relative to root of kernel src # Look for make include files relative to root of kernel src
MAKEFLAGS += --include-dir=$(srctree) MAKEFLAGS += --include-dir=$(srctree)
# We need some generic definitions. # We need some generic definitions (do not try to remake the file).
$(srctree)/scripts/Kbuild.include: ;
include $(srctree)/scripts/Kbuild.include include $(srctree)/scripts/Kbuild.include
# Make variables (CC, etc...) # Make variables (CC, etc...)
...@@ -1560,9 +1561,6 @@ endif # skip-makefile ...@@ -1560,9 +1561,6 @@ endif # skip-makefile
PHONY += FORCE PHONY += FORCE
FORCE: FORCE:
# Cancel implicit rules on top Makefile, `-rR' will apply to sub-makes.
Makefile: ;
# Declare the contents of the .PHONY variable as phony. We keep that # Declare the contents of the .PHONY variable as phony. We keep that
# information in a variable se we can use it in if_changed and friends. # information in a variable se we can use it in if_changed and friends.
.PHONY: $(PHONY) .PHONY: $(PHONY)
...@@ -77,7 +77,7 @@ vmlinux.gz: vmlinux ...@@ -77,7 +77,7 @@ vmlinux.gz: vmlinux
$(Q)$(MAKE) $(build)=$(boot) $@ $(Q)$(MAKE) $(build)=$(boot) $@
unwcheck: vmlinux unwcheck: vmlinux
-$(Q)READELF=$(READELF) $(srctree)/arch/ia64/scripts/unwcheck.py $< -$(Q)READELF=$(READELF) python $(srctree)/arch/ia64/scripts/unwcheck.py $<
archclean: archclean:
$(Q)$(MAKE) $(clean)=$(boot) $(Q)$(MAKE) $(clean)=$(boot)
......
...@@ -33,5 +33,5 @@ $(obj)/vmlinux.bin: vmlinux FORCE ...@@ -33,5 +33,5 @@ $(obj)/vmlinux.bin: vmlinux FORCE
LDFLAGS_bootloader = -static -T LDFLAGS_bootloader = -static -T
$(obj)/bootloader: $(src)/bootloader.lds $(obj)/bootloader.o $(obj)/boot_head.o $(obj)/fw-emu.o \ $(obj)/bootloader: $(src)/bootloader.lds $(obj)/bootloader.o $(obj)/boot_head.o $(obj)/fw-emu.o \
lib/lib.a arch/ia64/lib/lib.a FORCE lib/lib.a arch/ia64/lib/built-in.o arch/ia64/lib/lib.a FORCE
$(call if_changed,ld) $(call if_changed,ld)
...@@ -22,10 +22,11 @@ SECTIONS ...@@ -22,10 +22,11 @@ SECTIONS
.sdata : { *(.sdata) } .sdata : { *(.sdata) }
_edata = .; _edata = .;
_bss = .; __bss_start = .;
.sbss : { *(.sbss) *(.scommon) } .sbss : { *(.sbss) *(.scommon) }
.bss : { *(.bss) *(COMMON) } .bss : { *(.bss) *(COMMON) }
. = ALIGN(64 / 8); . = ALIGN(64 / 8);
__bss_stop = .;
_end = . ; _end = . ;
/* Stabs debugging sections. */ /* Stabs debugging sections. */
......
...@@ -860,7 +860,7 @@ int acpi_map_lsapic(acpi_handle handle, int *pcpu) ...@@ -860,7 +860,7 @@ int acpi_map_lsapic(acpi_handle handle, int *pcpu)
lsapic = (struct acpi_madt_local_sapic *)obj->buffer.pointer; lsapic = (struct acpi_madt_local_sapic *)obj->buffer.pointer;
if ((lsapic->header.type != ACPI_MADT_TYPE_LOCAL_SAPIC) || if ((lsapic->header.type != ACPI_MADT_TYPE_LOCAL_SAPIC) ||
(!lsapic->lapic_flags & ACPI_MADT_ENABLED)) { (!(lsapic->lapic_flags & ACPI_MADT_ENABLED))) {
kfree(buffer.pointer); kfree(buffer.pointer);
return -EINVAL; return -EINVAL;
} }
......
...@@ -370,7 +370,7 @@ efi_get_pal_addr (void) ...@@ -370,7 +370,7 @@ efi_get_pal_addr (void)
continue; continue;
} }
if (md->num_pages << EFI_PAGE_SHIFT > IA64_GRANULE_SIZE) if (efi_md_size(md) > IA64_GRANULE_SIZE)
panic("Woah! PAL code size bigger than a granule!"); panic("Woah! PAL code size bigger than a granule!");
#if EFI_DEBUG #if EFI_DEBUG
...@@ -378,7 +378,7 @@ efi_get_pal_addr (void) ...@@ -378,7 +378,7 @@ efi_get_pal_addr (void)
printk(KERN_INFO "CPU %d: mapping PAL code [0x%lx-0x%lx) into [0x%lx-0x%lx)\n", printk(KERN_INFO "CPU %d: mapping PAL code [0x%lx-0x%lx) into [0x%lx-0x%lx)\n",
smp_processor_id(), md->phys_addr, smp_processor_id(), md->phys_addr,
md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT), md->phys_addr + efi_md_size(md),
vaddr & mask, (vaddr & mask) + IA64_GRANULE_SIZE); vaddr & mask, (vaddr & mask) + IA64_GRANULE_SIZE);
#endif #endif
return __va(md->phys_addr); return __va(md->phys_addr);
...@@ -523,7 +523,7 @@ efi_init (void) ...@@ -523,7 +523,7 @@ efi_init (void)
md = p; md = p;
printk("mem%02u: type=%u, attr=0x%lx, range=[0x%016lx-0x%016lx) (%luMB)\n", printk("mem%02u: type=%u, attr=0x%lx, range=[0x%016lx-0x%016lx) (%luMB)\n",
i, md->type, md->attribute, md->phys_addr, i, md->type, md->attribute, md->phys_addr,
md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT), md->phys_addr + efi_md_size(md),
md->num_pages >> (20 - EFI_PAGE_SHIFT)); md->num_pages >> (20 - EFI_PAGE_SHIFT));
} }
} }
...@@ -656,7 +656,7 @@ efi_memory_descriptor (unsigned long phys_addr) ...@@ -656,7 +656,7 @@ efi_memory_descriptor (unsigned long phys_addr)
for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) { for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) {
md = p; md = p;
if (phys_addr - md->phys_addr < (md->num_pages << EFI_PAGE_SHIFT)) if (phys_addr - md->phys_addr < efi_md_size(md))
return md; return md;
} }
return NULL; return NULL;
...@@ -1158,7 +1158,7 @@ efi_initialize_iomem_resources(struct resource *code_resource, ...@@ -1158,7 +1158,7 @@ efi_initialize_iomem_resources(struct resource *code_resource,
res->name = name; res->name = name;
res->start = md->phys_addr; res->start = md->phys_addr;
res->end = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) - 1; res->end = md->phys_addr + efi_md_size(md) - 1;
res->flags = flags; res->flags = flags;
if (insert_resource(&iomem_resource, res) < 0) if (insert_resource(&iomem_resource, res) < 0)
......
...@@ -30,7 +30,7 @@ SECTIONS ...@@ -30,7 +30,7 @@ SECTIONS
* the dynamic symbol table et al. If this amount is insufficient, * the dynamic symbol table et al. If this amount is insufficient,
* ld -shared will barf. Just increase it here. * ld -shared will barf. Just increase it here.
*/ */
. = GATE_ADDR + 0x500; . = GATE_ADDR + 0x600;
.data.patch : { .data.patch : {
__start_gate_mckinley_e9_patchlist = .; __start_gate_mckinley_e9_patchlist = .;
......
...@@ -63,6 +63,9 @@ EXPORT_SYMBOL(__udivdi3); ...@@ -63,6 +63,9 @@ EXPORT_SYMBOL(__udivdi3);
EXPORT_SYMBOL(__moddi3); EXPORT_SYMBOL(__moddi3);
EXPORT_SYMBOL(__umoddi3); EXPORT_SYMBOL(__umoddi3);
#include <asm/page.h>
EXPORT_SYMBOL(copy_page);
#if defined(CONFIG_MD_RAID456) || defined(CONFIG_MD_RAID456_MODULE) #if defined(CONFIG_MD_RAID456) || defined(CONFIG_MD_RAID456_MODULE)
extern void xor_ia64_2(void); extern void xor_ia64_2(void);
extern void xor_ia64_3(void); extern void xor_ia64_3(void);
......
...@@ -199,19 +199,6 @@ static inline int __gsi_to_irq(unsigned int gsi) ...@@ -199,19 +199,6 @@ static inline int __gsi_to_irq(unsigned int gsi)
return -1; return -1;
} }
/*
* Translate GSI number to the corresponding IA-64 interrupt vector. If no
* entry exists, return -1.
*/
inline int
gsi_to_vector (unsigned int gsi)
{
int irq = __gsi_to_irq(gsi);
if (check_irq_used(irq) < 0)
return -1;
return irq_to_vector(irq);
}
int int
gsi_to_irq (unsigned int gsi) gsi_to_irq (unsigned int gsi)
{ {
...@@ -429,7 +416,7 @@ iosapic_end_level_irq (unsigned int irq) ...@@ -429,7 +416,7 @@ iosapic_end_level_irq (unsigned int irq)
#define iosapic_disable_level_irq mask_irq #define iosapic_disable_level_irq mask_irq
#define iosapic_ack_level_irq nop #define iosapic_ack_level_irq nop
struct irq_chip irq_type_iosapic_level = { static struct irq_chip irq_type_iosapic_level = {
.name = "IO-SAPIC-level", .name = "IO-SAPIC-level",
.startup = iosapic_startup_level_irq, .startup = iosapic_startup_level_irq,
.shutdown = iosapic_shutdown_level_irq, .shutdown = iosapic_shutdown_level_irq,
...@@ -478,7 +465,7 @@ iosapic_ack_edge_irq (unsigned int irq) ...@@ -478,7 +465,7 @@ iosapic_ack_edge_irq (unsigned int irq)
#define iosapic_disable_edge_irq nop #define iosapic_disable_edge_irq nop
#define iosapic_end_edge_irq nop #define iosapic_end_edge_irq nop
struct irq_chip irq_type_iosapic_edge = { static struct irq_chip irq_type_iosapic_edge = {
.name = "IO-SAPIC-edge", .name = "IO-SAPIC-edge",
.startup = iosapic_startup_edge_irq, .startup = iosapic_startup_edge_irq,
.shutdown = iosapic_disable_edge_irq, .shutdown = iosapic_disable_edge_irq,
...@@ -491,7 +478,7 @@ struct irq_chip irq_type_iosapic_edge = { ...@@ -491,7 +478,7 @@ struct irq_chip irq_type_iosapic_edge = {
.set_affinity = iosapic_set_affinity .set_affinity = iosapic_set_affinity
}; };
unsigned int static unsigned int
iosapic_version (char __iomem *addr) iosapic_version (char __iomem *addr)
{ {
/* /*
...@@ -938,7 +925,7 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi, ...@@ -938,7 +925,7 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
case ACPI_INTERRUPT_CPEI: case ACPI_INTERRUPT_CPEI:
irq = vector = IA64_CPE_VECTOR; irq = vector = IA64_CPE_VECTOR;
BUG_ON(bind_irq_vector(irq, vector, CPU_MASK_ALL)); BUG_ON(bind_irq_vector(irq, vector, CPU_MASK_ALL));
delivery = IOSAPIC_LOWEST_PRIORITY; delivery = IOSAPIC_FIXED;
mask = 1; mask = 1;
break; break;
default: default:
......
...@@ -182,8 +182,8 @@ static int __kprobes unsupported_inst(uint template, uint slot, ...@@ -182,8 +182,8 @@ static int __kprobes unsupported_inst(uint template, uint slot,
qp = kprobe_inst & 0x3f; qp = kprobe_inst & 0x3f;
if (is_cmp_ctype_unc_inst(template, slot, major_opcode, kprobe_inst)) { if (is_cmp_ctype_unc_inst(template, slot, major_opcode, kprobe_inst)) {
if (slot == 1 && qp) { if (slot == 1 && qp) {
printk(KERN_WARNING "Kprobes on cmp unc" printk(KERN_WARNING "Kprobes on cmp unc "
"instruction on slot 1 at <0x%lx>" "instruction on slot 1 at <0x%lx> "
"is not supported\n", addr); "is not supported\n", addr);
return -EINVAL; return -EINVAL;
...@@ -221,8 +221,8 @@ static int __kprobes unsupported_inst(uint template, uint slot, ...@@ -221,8 +221,8 @@ static int __kprobes unsupported_inst(uint template, uint slot,
* bit 12 to be equal to 1 * bit 12 to be equal to 1
*/ */
if (slot == 1 && qp) { if (slot == 1 && qp) {
printk(KERN_WARNING "Kprobes on test bit" printk(KERN_WARNING "Kprobes on test bit "
"instruction on slot at <0x%lx>" "instruction on slot at <0x%lx> "
"is not supported\n", addr); "is not supported\n", addr);
return -EINVAL; return -EINVAL;
} }
...@@ -242,7 +242,7 @@ static int __kprobes unsupported_inst(uint template, uint slot, ...@@ -242,7 +242,7 @@ static int __kprobes unsupported_inst(uint template, uint slot,
*/ */
int x6=(kprobe_inst >> 27) & 0x3F; int x6=(kprobe_inst >> 27) & 0x3F;
if ((x6 == 0x10) || (x6 == 0x11)) { if ((x6 == 0x10) || (x6 == 0x11)) {
printk(KERN_WARNING "Kprobes on" printk(KERN_WARNING "Kprobes on "
"Indirect Predict is not supported\n"); "Indirect Predict is not supported\n");
return -EINVAL; return -EINVAL;
} }
...@@ -430,6 +430,23 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) ...@@ -430,6 +430,23 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
* real return address, and all the rest will point to * real return address, and all the rest will point to
* kretprobe_trampoline * kretprobe_trampoline
*/ */
hlist_for_each_entry_safe(ri, node, tmp, head, hlist) {
if (ri->task != current)
/* another task is sharing our hash bucket */
continue;
orig_ret_address = (unsigned long)ri->ret_addr;
if (orig_ret_address != trampoline_address)
/*
* This is the real return address. Any other
* instances associated with this task are for
* other calls deeper on the call stack
*/
break;
}
regs->cr_iip = orig_ret_address;
hlist_for_each_entry_safe(ri, node, tmp, head, hlist) { hlist_for_each_entry_safe(ri, node, tmp, head, hlist) {
if (ri->task != current) if (ri->task != current)
/* another task is sharing our hash bucket */ /* another task is sharing our hash bucket */
...@@ -452,8 +469,6 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) ...@@ -452,8 +469,6 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
kretprobe_assert(ri, orig_ret_address, trampoline_address); kretprobe_assert(ri, orig_ret_address, trampoline_address);
regs->cr_iip = orig_ret_address;
reset_current_kprobe(); reset_current_kprobe();
spin_unlock_irqrestore(&kretprobe_lock, flags); spin_unlock_irqrestore(&kretprobe_lock, flags);
preempt_enable_no_resched(); preempt_enable_no_resched();
......
...@@ -95,7 +95,6 @@ static struct resource bss_resource = { ...@@ -95,7 +95,6 @@ static struct resource bss_resource = {
.name = "Kernel bss", .name = "Kernel bss",
.flags = IORESOURCE_BUSY | IORESOURCE_MEM .flags = IORESOURCE_BUSY | IORESOURCE_MEM
}; };
extern char _text[], _end[], _etext[], _edata[], _bss[];
unsigned long ia64_max_cacheline_size; unsigned long ia64_max_cacheline_size;
...@@ -206,7 +205,7 @@ static int __init register_memory(void) ...@@ -206,7 +205,7 @@ static int __init register_memory(void)
code_resource.end = ia64_tpa(_etext) - 1; code_resource.end = ia64_tpa(_etext) - 1;
data_resource.start = ia64_tpa(_etext); data_resource.start = ia64_tpa(_etext);
data_resource.end = ia64_tpa(_edata) - 1; data_resource.end = ia64_tpa(_edata) - 1;
bss_resource.start = ia64_tpa(_bss); bss_resource.start = ia64_tpa(__bss_start);
bss_resource.end = ia64_tpa(_end) - 1; bss_resource.end = ia64_tpa(_end) - 1;
efi_initialize_iomem_resources(&code_resource, &data_resource, efi_initialize_iomem_resources(&code_resource, &data_resource,
&bss_resource); &bss_resource);
......
...@@ -98,7 +98,7 @@ restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr) ...@@ -98,7 +98,7 @@ restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
if ((flags & IA64_SC_FLAG_FPH_VALID) != 0) { if ((flags & IA64_SC_FLAG_FPH_VALID) != 0) {
struct ia64_psr *psr = ia64_psr(&scr->pt); struct ia64_psr *psr = ia64_psr(&scr->pt);
__copy_from_user(current->thread.fph, &sc->sc_fr[32], 96*16); err |= __copy_from_user(current->thread.fph, &sc->sc_fr[32], 96*16);
psr->mfh = 0; /* drop signal handler's fph contents... */ psr->mfh = 0; /* drop signal handler's fph contents... */
preempt_disable(); preempt_disable();
if (psr->dfh) if (psr->dfh)
...@@ -244,7 +244,7 @@ static long ...@@ -244,7 +244,7 @@ static long
setup_sigcontext (struct sigcontext __user *sc, sigset_t *mask, struct sigscratch *scr) setup_sigcontext (struct sigcontext __user *sc, sigset_t *mask, struct sigscratch *scr)
{ {
unsigned long flags = 0, ifs, cfm, nat; unsigned long flags = 0, ifs, cfm, nat;
long err; long err = 0;
ifs = scr->pt.cr_ifs; ifs = scr->pt.cr_ifs;
...@@ -257,12 +257,12 @@ setup_sigcontext (struct sigcontext __user *sc, sigset_t *mask, struct sigscratc ...@@ -257,12 +257,12 @@ setup_sigcontext (struct sigcontext __user *sc, sigset_t *mask, struct sigscratc
ia64_flush_fph(current); ia64_flush_fph(current);
if ((current->thread.flags & IA64_THREAD_FPH_VALID)) { if ((current->thread.flags & IA64_THREAD_FPH_VALID)) {
flags |= IA64_SC_FLAG_FPH_VALID; flags |= IA64_SC_FLAG_FPH_VALID;
__copy_to_user(&sc->sc_fr[32], current->thread.fph, 96*16); err = __copy_to_user(&sc->sc_fr[32], current->thread.fph, 96*16);
} }
nat = ia64_get_scratch_nat_bits(&scr->pt, scr->scratch_unat); nat = ia64_get_scratch_nat_bits(&scr->pt, scr->scratch_unat);
err = __put_user(flags, &sc->sc_flags); err |= __put_user(flags, &sc->sc_flags);
err |= __put_user(nat, &sc->sc_nat); err |= __put_user(nat, &sc->sc_nat);
err |= PUT_SIGSET(mask, &sc->sc_mask); err |= PUT_SIGSET(mask, &sc->sc_mask);
err |= __put_user(cfm, &sc->sc_cfm); err |= __put_user(cfm, &sc->sc_cfm);
......
...@@ -240,11 +240,12 @@ SECTIONS ...@@ -240,11 +240,12 @@ SECTIONS
.sdata : AT(ADDR(.sdata) - LOAD_OFFSET) .sdata : AT(ADDR(.sdata) - LOAD_OFFSET)
{ *(.sdata) *(.sdata1) *(.srdata) } { *(.sdata) *(.sdata1) *(.srdata) }
_edata = .; _edata = .;
_bss = .; __bss_start = .;
.sbss : AT(ADDR(.sbss) - LOAD_OFFSET) .sbss : AT(ADDR(.sbss) - LOAD_OFFSET)
{ *(.sbss) *(.scommon) } { *(.sbss) *(.scommon) }
.bss : AT(ADDR(.bss) - LOAD_OFFSET) .bss : AT(ADDR(.bss) - LOAD_OFFSET)
{ *(.bss) *(COMMON) } { *(.bss) *(COMMON) }
__bss_stop = .;
_end = .; _end = .;
......
...@@ -11,8 +11,8 @@ lib-y := __divsi3.o __udivsi3.o __modsi3.o __umodsi3.o \ ...@@ -11,8 +11,8 @@ lib-y := __divsi3.o __udivsi3.o __modsi3.o __umodsi3.o \
flush.o ip_fast_csum.o do_csum.o \ flush.o ip_fast_csum.o do_csum.o \
memset.o strlen.o xor.o memset.o strlen.o xor.o
lib-$(CONFIG_ITANIUM) += copy_page.o copy_user.o memcpy.o obj-$(CONFIG_ITANIUM) += copy_page.o copy_user.o memcpy.o
lib-$(CONFIG_MCKINLEY) += copy_page_mck.o memcpy_mck.o obj-$(CONFIG_MCKINLEY) += copy_page_mck.o memcpy_mck.o
lib-$(CONFIG_PERFMON) += carta_random.o lib-$(CONFIG_PERFMON) += carta_random.o
AFLAGS___divdi3.o = AFLAGS___divdi3.o =
......
...@@ -180,7 +180,7 @@ ia64_tlb_init (void) ...@@ -180,7 +180,7 @@ ia64_tlb_init (void)
long status; long status;
if ((status = ia64_pal_vm_page_size(&tr_pgbits, &purge.mask)) != 0) { if ((status = ia64_pal_vm_page_size(&tr_pgbits, &purge.mask)) != 0) {
printk(KERN_ERR "PAL_VM_PAGE_SIZE failed with status=%ld;" printk(KERN_ERR "PAL_VM_PAGE_SIZE failed with status=%ld; "
"defaulting to architected purge page-sizes.\n", status); "defaulting to architected purge page-sizes.\n", status);
purge.mask = 0x115557000UL; purge.mask = 0x115557000UL;
} }
......
File mode changed from 100755 to 100644
...@@ -347,7 +347,7 @@ sn_common_bus_fixup(struct pci_bus *bus, ...@@ -347,7 +347,7 @@ sn_common_bus_fixup(struct pci_bus *bus,
if (controller->node >= num_online_nodes()) { if (controller->node >= num_online_nodes()) {
struct pcibus_bussoft *b = SN_PCIBUS_BUSSOFT(bus); struct pcibus_bussoft *b = SN_PCIBUS_BUSSOFT(bus);
printk(KERN_WARNING "Device ASIC=%u XID=%u PBUSNUM=%u" printk(KERN_WARNING "Device ASIC=%u XID=%u PBUSNUM=%u "
"L_IO=%lx L_MEM=%lx BASE=%lx\n", "L_IO=%lx L_MEM=%lx BASE=%lx\n",
b->bs_asic_type, b->bs_xid, b->bs_persist_busnum, b->bs_asic_type, b->bs_xid, b->bs_persist_busnum,
b->bs_legacy_io, b->bs_legacy_mem, b->bs_base); b->bs_legacy_io, b->bs_legacy_mem, b->bs_base);
...@@ -545,19 +545,18 @@ sn_io_late_init(void) ...@@ -545,19 +545,18 @@ sn_io_late_init(void)
nasid = NASID_GET(bussoft->bs_base); nasid = NASID_GET(bussoft->bs_base);
cnode = nasid_to_cnodeid(nasid); cnode = nasid_to_cnodeid(nasid);
if ((bussoft->bs_asic_type == PCIIO_ASIC_TYPE_TIOCP) || if ((bussoft->bs_asic_type == PCIIO_ASIC_TYPE_TIOCP) ||
(bussoft->bs_asic_type == PCIIO_ASIC_TYPE_TIOCE)) { (bussoft->bs_asic_type == PCIIO_ASIC_TYPE_TIOCE) ||
/* TIO PCI Bridge: find nearest node with CPUs */ (bussoft->bs_asic_type == PCIIO_ASIC_TYPE_PIC)) {
/* PCI Bridge: find nearest node with CPUs */
int e = sn_hwperf_get_nearest_node(cnode, NULL, int e = sn_hwperf_get_nearest_node(cnode, NULL,
&near_cnode); &near_cnode);
if (e < 0) { if (e < 0) {
near_cnode = (cnodeid_t)-1; /* use any node */ near_cnode = (cnodeid_t)-1; /* use any node */
printk(KERN_WARNING "pcibr_bus_fixup: failed " printk(KERN_WARNING "sn_io_late_init: failed "
"to find near node with CPUs to TIO " "to find near node with CPUs for "
"node %d, err=%d\n", cnode, e); "node %d, err=%d\n", cnode, e);
} }
PCI_CONTROLLER(bus)->node = near_cnode; PCI_CONTROLLER(bus)->node = near_cnode;
} else if (bussoft->bs_asic_type == PCIIO_ASIC_TYPE_PIC) {
PCI_CONTROLLER(bus)->node = cnode;
} }
} }
......
...@@ -317,8 +317,12 @@ chrp_find_bridges(void) ...@@ -317,8 +317,12 @@ chrp_find_bridges(void)
/* SL82C105 IDE Control/Status Register */ /* SL82C105 IDE Control/Status Register */
#define SL82C105_IDECSR 0x40 #define SL82C105_IDECSR 0x40
/* Fixup for Winbond ATA quirk, required for briq */ /* Fixup for Winbond ATA quirk, required for briq mostly because the
void chrp_pci_fixup_winbond_ata(struct pci_dev *sl82c105) * 8259 is configured for level sensitive IRQ 14 and so wants the
* ATA controller to be set to fully native mode or bad things
* will happen.
*/
static void __devinit chrp_pci_fixup_winbond_ata(struct pci_dev *sl82c105)
{ {
u8 progif; u8 progif;
...@@ -334,9 +338,14 @@ void chrp_pci_fixup_winbond_ata(struct pci_dev *sl82c105) ...@@ -334,9 +338,14 @@ void chrp_pci_fixup_winbond_ata(struct pci_dev *sl82c105)
sl82c105->class |= 0x05; sl82c105->class |= 0x05;
/* Disable SL82C105 second port */ /* Disable SL82C105 second port */
pci_write_config_word(sl82c105, SL82C105_IDECSR, 0x0003); pci_write_config_word(sl82c105, SL82C105_IDECSR, 0x0003);
/* Clear IO BARs, they will be reassigned */
pci_write_config_dword(sl82c105, PCI_BASE_ADDRESS_0, 0);
pci_write_config_dword(sl82c105, PCI_BASE_ADDRESS_1, 0);
pci_write_config_dword(sl82c105, PCI_BASE_ADDRESS_2, 0);
pci_write_config_dword(sl82c105, PCI_BASE_ADDRESS_3, 0);
} }
} }
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105, DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105,
chrp_pci_fixup_winbond_ata); chrp_pci_fixup_winbond_ata);
/* Pegasos2 firmware version 20040810 configures the built-in IDE controller /* Pegasos2 firmware version 20040810 configures the built-in IDE controller
...@@ -345,7 +354,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105, ...@@ -345,7 +354,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105,
* mode as well. The same fixup must be done to the class-code property in * mode as well. The same fixup must be done to the class-code property in
* the IDE node /pci@80000000/ide@C,1 * the IDE node /pci@80000000/ide@C,1
*/ */
static void chrp_pci_fixup_vt8231_ata(struct pci_dev *viaide) static void __devinit chrp_pci_fixup_vt8231_ata(struct pci_dev *viaide)
{ {
u8 progif; u8 progif;
struct pci_dev *viaisa; struct pci_dev *viaisa;
...@@ -366,4 +375,4 @@ static void chrp_pci_fixup_vt8231_ata(struct pci_dev *viaide) ...@@ -366,4 +375,4 @@ static void chrp_pci_fixup_vt8231_ata(struct pci_dev *viaide)
pci_dev_put(viaisa); pci_dev_put(viaisa);
} }
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, chrp_pci_fixup_vt8231_ata); DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, chrp_pci_fixup_vt8231_ata);
...@@ -1243,15 +1243,22 @@ void pmac_pci_fixup_pciata(struct pci_dev* dev) ...@@ -1243,15 +1243,22 @@ void pmac_pci_fixup_pciata(struct pci_dev* dev)
good: good:
pci_read_config_byte(dev, PCI_CLASS_PROG, &progif); pci_read_config_byte(dev, PCI_CLASS_PROG, &progif);
if ((progif & 5) != 5) { if ((progif & 5) != 5) {
printk(KERN_INFO "Forcing PCI IDE into native mode: %s\n", printk(KERN_INFO "PCI: %s Forcing PCI IDE into native mode\n",
pci_name(dev)); pci_name(dev));
(void) pci_write_config_byte(dev, PCI_CLASS_PROG, progif|5); (void) pci_write_config_byte(dev, PCI_CLASS_PROG, progif|5);
if (pci_read_config_byte(dev, PCI_CLASS_PROG, &progif) || if (pci_read_config_byte(dev, PCI_CLASS_PROG, &progif) ||
(progif & 5) != 5) (progif & 5) != 5)
printk(KERN_ERR "Rewrite of PROGIF failed !\n"); printk(KERN_ERR "Rewrite of PROGIF failed !\n");
else {
/* Clear IO BARs, they will be reassigned */
pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, 0);
pci_write_config_dword(dev, PCI_BASE_ADDRESS_1, 0);
pci_write_config_dword(dev, PCI_BASE_ADDRESS_2, 0);
pci_write_config_dword(dev, PCI_BASE_ADDRESS_3, 0);
}
} }
} }
DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, pmac_pci_fixup_pciata); DECLARE_PCI_FIXUP_EARLY(PCI_ANY_ID, PCI_ANY_ID, pmac_pci_fixup_pciata);
#endif #endif
/* /*
......
...@@ -743,46 +743,22 @@ static int pci_setup_device(struct pci_dev * dev) ...@@ -743,46 +743,22 @@ static int pci_setup_device(struct pci_dev * dev)
*/ */
if (class == PCI_CLASS_STORAGE_IDE) { if (class == PCI_CLASS_STORAGE_IDE) {
u8 progif; u8 progif;
struct pci_bus_region region;
pci_read_config_byte(dev, PCI_CLASS_PROG, &progif); pci_read_config_byte(dev, PCI_CLASS_PROG, &progif);
if ((progif & 1) == 0) { if ((progif & 1) == 0) {
struct resource resource = { dev->resource[0].start = 0x1F0;
.start = 0x1F0, dev->resource[0].end = 0x1F7;
.end = 0x1F7, dev->resource[0].flags = LEGACY_IO_RESOURCE;
.flags = LEGACY_IO_RESOURCE, dev->resource[1].start = 0x3F6;
}; dev->resource[1].end = 0x3F6;
dev->resource[1].flags = LEGACY_IO_RESOURCE;
pcibios_resource_to_bus(dev, &region, &resource);
dev->resource[0].start = region.start;
dev->resource[0].end = region.end;
dev->resource[0].flags = resource.flags;
resource.start = 0x3F6;
resource.end = 0x3F6;
resource.flags = LEGACY_IO_RESOURCE;
pcibios_resource_to_bus(dev, &region, &resource);
dev->resource[1].start = region.start;
dev->resource[1].end = region.end;
dev->resource[1].flags = resource.flags;
} }
if ((progif & 4) == 0) { if ((progif & 4) == 0) {
struct resource resource = { dev->resource[2].start = 0x170;
.start = 0x170, dev->resource[2].end = 0x177;
.end = 0x177, dev->resource[2].flags = LEGACY_IO_RESOURCE;
.flags = LEGACY_IO_RESOURCE, dev->resource[3].start = 0x376;
}; dev->resource[3].end = 0x376;
dev->resource[3].flags = LEGACY_IO_RESOURCE;
pcibios_resource_to_bus(dev, &region, &resource);
dev->resource[2].start = region.start;
dev->resource[2].end = region.end;
dev->resource[2].flags = resource.flags;
resource.start = 0x376;
resource.end = 0x376;
resource.flags = LEGACY_IO_RESOURCE;
pcibios_resource_to_bus(dev, &region, &resource);
dev->resource[3].start = region.start;
dev->resource[3].end = region.end;
dev->resource[3].flags = resource.flags;
} }
} }
break; break;
......
...@@ -725,15 +725,15 @@ xfs_buf_associate_memory( ...@@ -725,15 +725,15 @@ xfs_buf_associate_memory(
{ {
int rval; int rval;
int i = 0; int i = 0;
size_t ptr; unsigned long pageaddr;
size_t end, end_cur; unsigned long offset;
off_t offset; size_t buflen;
int page_count; int page_count;
page_count = PAGE_CACHE_ALIGN(len) >> PAGE_CACHE_SHIFT; pageaddr = (unsigned long)mem & PAGE_CACHE_MASK;
offset = (off_t) mem - ((off_t)mem & PAGE_CACHE_MASK); offset = (unsigned long)mem - pageaddr;
if (offset && (len > PAGE_CACHE_SIZE)) buflen = PAGE_CACHE_ALIGN(len + offset);
page_count++; page_count = buflen >> PAGE_CACHE_SHIFT;
/* Free any previous set of page pointers */ /* Free any previous set of page pointers */
if (bp->b_pages) if (bp->b_pages)
...@@ -747,22 +747,15 @@ xfs_buf_associate_memory( ...@@ -747,22 +747,15 @@ xfs_buf_associate_memory(
return rval; return rval;
bp->b_offset = offset; bp->b_offset = offset;
ptr = (size_t) mem & PAGE_CACHE_MASK;
end = PAGE_CACHE_ALIGN((size_t) mem + len); for (i = 0; i < bp->b_page_count; i++) {
end_cur = end; bp->b_pages[i] = mem_to_page((void *)pageaddr);
/* set up first page */ pageaddr += PAGE_CACHE_SIZE;
bp->b_pages[0] = mem_to_page(mem);
ptr += PAGE_CACHE_SIZE;
bp->b_page_count = ++i;
while (ptr < end) {
bp->b_pages[i] = mem_to_page((void *)ptr);
bp->b_page_count = ++i;
ptr += PAGE_CACHE_SIZE;
} }
bp->b_locked = 0; bp->b_locked = 0;
bp->b_count_desired = bp->b_buffer_length = len; bp->b_count_desired = len;
bp->b_buffer_length = buflen;
bp->b_flags |= XBF_MAPPED; bp->b_flags |= XBF_MAPPED;
return 0; return 0;
...@@ -1032,7 +1025,7 @@ xfs_buf_ioend( ...@@ -1032,7 +1025,7 @@ xfs_buf_ioend(
xfs_buf_t *bp, xfs_buf_t *bp,
int schedule) int schedule)
{ {
bp->b_flags &= ~(XBF_READ | XBF_WRITE); bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD);
if (bp->b_error == 0) if (bp->b_error == 0)
bp->b_flags |= XBF_DONE; bp->b_flags |= XBF_DONE;
...@@ -1750,6 +1743,8 @@ xfsbufd( ...@@ -1750,6 +1743,8 @@ xfsbufd(
current->flags |= PF_MEMALLOC; current->flags |= PF_MEMALLOC;
set_freezable();
do { do {
if (unlikely(freezing(current))) { if (unlikely(freezing(current))) {
set_bit(XBT_FORCE_SLEEP, &target->bt_flags); set_bit(XBT_FORCE_SLEEP, &target->bt_flags);
......
...@@ -218,6 +218,15 @@ xfs_vm_fault( ...@@ -218,6 +218,15 @@ xfs_vm_fault(
} }
#endif /* CONFIG_XFS_DMAPI */ #endif /* CONFIG_XFS_DMAPI */
/*
* Unfortunately we can't just use the clean and simple readdir implementation
* below, because nfs might call back into ->lookup from the filldir callback
* and that will deadlock the low-level btree code.
*
* Hopefully we'll find a better workaround that allows to use the optimal
* version at least for local readdirs for 2.6.25.
*/
#if 0
STATIC int STATIC int
xfs_file_readdir( xfs_file_readdir(
struct file *filp, struct file *filp,
...@@ -249,6 +258,121 @@ xfs_file_readdir( ...@@ -249,6 +258,121 @@ xfs_file_readdir(
return -error; return -error;
return 0; return 0;
} }
#else
struct hack_dirent {
int namlen;
loff_t offset;
u64 ino;
unsigned int d_type;
char name[];
};
struct hack_callback {
char *dirent;
size_t len;
size_t used;
};
STATIC int
xfs_hack_filldir(
void *__buf,
const char *name,
int namlen,
loff_t offset,
u64 ino,
unsigned int d_type)
{
struct hack_callback *buf = __buf;
struct hack_dirent *de = (struct hack_dirent *)(buf->dirent + buf->used);
if (buf->used + sizeof(struct hack_dirent) + namlen > buf->len)
return -EINVAL;
de->namlen = namlen;
de->offset = offset;
de->ino = ino;
de->d_type = d_type;
memcpy(de->name, name, namlen);
buf->used += sizeof(struct hack_dirent) + namlen;
return 0;
}
STATIC int
xfs_file_readdir(
struct file *filp,
void *dirent,
filldir_t filldir)
{
struct inode *inode = filp->f_path.dentry->d_inode;
xfs_inode_t *ip = XFS_I(inode);
struct hack_callback buf;
struct hack_dirent *de;
int error;
loff_t size;
int eof = 0;
xfs_off_t start_offset, curr_offset, offset;
/*
* Try fairly hard to get memory
*/
buf.len = PAGE_CACHE_SIZE;
do {
buf.dirent = kmalloc(buf.len, GFP_KERNEL);
if (buf.dirent)
break;
buf.len >>= 1;
} while (buf.len >= 1024);
if (!buf.dirent)
return -ENOMEM;
curr_offset = filp->f_pos;
if (curr_offset == 0x7fffffff)
offset = 0xffffffff;
else
offset = filp->f_pos;
while (!eof) {
int reclen;
start_offset = offset;
buf.used = 0;
error = -xfs_readdir(ip, &buf, buf.len, &offset,
xfs_hack_filldir);
if (error || offset == start_offset) {
size = 0;
break;
}
size = buf.used;
de = (struct hack_dirent *)buf.dirent;
while (size > 0) {
if (filldir(dirent, de->name, de->namlen,
curr_offset & 0x7fffffff,
de->ino, de->d_type)) {
goto done;
}
reclen = sizeof(struct hack_dirent) + de->namlen;
size -= reclen;
curr_offset = de->offset /* & 0x7fffffff */;
de = (struct hack_dirent *)((char *)de + reclen);
}
}
done:
if (!error) {
if (size == 0)
filp->f_pos = offset & 0x7fffffff;
else if (de)
filp->f_pos = curr_offset;
}
kfree(buf.dirent);
return error;
}
#endif
STATIC int STATIC int
xfs_file_mmap( xfs_file_mmap(
......
...@@ -1047,24 +1047,20 @@ xfs_ioc_bulkstat( ...@@ -1047,24 +1047,20 @@ xfs_ioc_bulkstat(
if ((count = bulkreq.icount) <= 0) if ((count = bulkreq.icount) <= 0)
return -XFS_ERROR(EINVAL); return -XFS_ERROR(EINVAL);
if (bulkreq.ubuffer == NULL)
return -XFS_ERROR(EINVAL);
if (cmd == XFS_IOC_FSINUMBERS) if (cmd == XFS_IOC_FSINUMBERS)
error = xfs_inumbers(mp, &inlast, &count, error = xfs_inumbers(mp, &inlast, &count,
bulkreq.ubuffer, xfs_inumbers_fmt); bulkreq.ubuffer, xfs_inumbers_fmt);
else if (cmd == XFS_IOC_FSBULKSTAT_SINGLE) else if (cmd == XFS_IOC_FSBULKSTAT_SINGLE)
error = xfs_bulkstat_single(mp, &inlast, error = xfs_bulkstat_single(mp, &inlast,
bulkreq.ubuffer, &done); bulkreq.ubuffer, &done);
else { /* XFS_IOC_FSBULKSTAT */ else /* XFS_IOC_FSBULKSTAT */
if (count == 1 && inlast != 0) {
inlast++;
error = xfs_bulkstat_single(mp, &inlast,
bulkreq.ubuffer, &done);
} else {
error = xfs_bulkstat(mp, &inlast, &count, error = xfs_bulkstat(mp, &inlast, &count,
(bulkstat_one_pf)xfs_bulkstat_one, NULL, (bulkstat_one_pf)xfs_bulkstat_one, NULL,
sizeof(xfs_bstat_t), bulkreq.ubuffer, sizeof(xfs_bstat_t), bulkreq.ubuffer,
BULKSTAT_FG_QUICK, &done); BULKSTAT_FG_QUICK, &done);
}
}
if (error) if (error)
return -error; return -error;
......
...@@ -291,6 +291,9 @@ xfs_ioc_bulkstat_compat( ...@@ -291,6 +291,9 @@ xfs_ioc_bulkstat_compat(
if ((count = bulkreq.icount) <= 0) if ((count = bulkreq.icount) <= 0)
return -XFS_ERROR(EINVAL); return -XFS_ERROR(EINVAL);
if (bulkreq.ubuffer == NULL)
return -XFS_ERROR(EINVAL);
if (cmd == XFS_IOC_FSINUMBERS) if (cmd == XFS_IOC_FSINUMBERS)
error = xfs_inumbers(mp, &inlast, &count, error = xfs_inumbers(mp, &inlast, &count,
bulkreq.ubuffer, xfs_inumbers_fmt_compat); bulkreq.ubuffer, xfs_inumbers_fmt_compat);
......
...@@ -117,7 +117,7 @@ xfs_ichgtime( ...@@ -117,7 +117,7 @@ xfs_ichgtime(
*/ */
SYNCHRONIZE(); SYNCHRONIZE();
ip->i_update_core = 1; ip->i_update_core = 1;
if (!(inode->i_state & I_SYNC)) if (!(inode->i_state & I_NEW))
mark_inode_dirty_sync(inode); mark_inode_dirty_sync(inode);
} }
...@@ -169,7 +169,7 @@ xfs_ichgtime_fast( ...@@ -169,7 +169,7 @@ xfs_ichgtime_fast(
*/ */
SYNCHRONIZE(); SYNCHRONIZE();
ip->i_update_core = 1; ip->i_update_core = 1;
if (!(inode->i_state & I_SYNC)) if (!(inode->i_state & I_NEW))
mark_inode_dirty_sync(inode); mark_inode_dirty_sync(inode);
} }
......
...@@ -1008,6 +1008,9 @@ xfs_qm_sync( ...@@ -1008,6 +1008,9 @@ xfs_qm_sync(
boolean_t nowait; boolean_t nowait;
int error; int error;
if (! XFS_IS_QUOTA_ON(mp))
return 0;
restarts = 0; restarts = 0;
/* /*
* We won't block unless we are asked to. * We won't block unless we are asked to.
......
...@@ -267,7 +267,7 @@ xfs_iget_core( ...@@ -267,7 +267,7 @@ xfs_iget_core(
icl = NULL; icl = NULL;
if (radix_tree_gang_lookup(&pag->pag_ici_root, (void**)&iq, if (radix_tree_gang_lookup(&pag->pag_ici_root, (void**)&iq,
first_index, 1)) { first_index, 1)) {
if ((iq->i_ino & mask) == first_index) if ((XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) == first_index)
icl = iq->i_cluster; icl = iq->i_cluster;
} }
......
...@@ -316,6 +316,8 @@ xfs_bulkstat_use_dinode( ...@@ -316,6 +316,8 @@ xfs_bulkstat_use_dinode(
return 1; return 1;
} }
#define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size)
/* /*
* Return stat information in bulk (by-inode) for the filesystem. * Return stat information in bulk (by-inode) for the filesystem.
*/ */
...@@ -353,7 +355,7 @@ xfs_bulkstat( ...@@ -353,7 +355,7 @@ xfs_bulkstat(
xfs_inobt_rec_incore_t *irbp; /* current irec buffer pointer */ xfs_inobt_rec_incore_t *irbp; /* current irec buffer pointer */
xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */
xfs_inobt_rec_incore_t *irbufend; /* end of good irec buffer entries */ xfs_inobt_rec_incore_t *irbufend; /* end of good irec buffer entries */
xfs_ino_t lastino=0; /* last inode number returned */ xfs_ino_t lastino; /* last inode number returned */
int nbcluster; /* # of blocks in a cluster */ int nbcluster; /* # of blocks in a cluster */
int nicluster; /* # of inodes in a cluster */ int nicluster; /* # of inodes in a cluster */
int nimask; /* mask for inode clusters */ int nimask; /* mask for inode clusters */
...@@ -373,6 +375,7 @@ xfs_bulkstat( ...@@ -373,6 +375,7 @@ xfs_bulkstat(
* Get the last inode value, see if there's nothing to do. * Get the last inode value, see if there's nothing to do.
*/ */
ino = (xfs_ino_t)*lastinop; ino = (xfs_ino_t)*lastinop;
lastino = ino;
dip = NULL; dip = NULL;
agno = XFS_INO_TO_AGNO(mp, ino); agno = XFS_INO_TO_AGNO(mp, ino);
agino = XFS_INO_TO_AGINO(mp, ino); agino = XFS_INO_TO_AGINO(mp, ino);
...@@ -382,6 +385,9 @@ xfs_bulkstat( ...@@ -382,6 +385,9 @@ xfs_bulkstat(
*ubcountp = 0; *ubcountp = 0;
return 0; return 0;
} }
if (!ubcountp || *ubcountp <= 0) {
return EINVAL;
}
ubcount = *ubcountp; /* statstruct's */ ubcount = *ubcountp; /* statstruct's */
ubleft = ubcount * statstruct_size; /* bytes */ ubleft = ubcount * statstruct_size; /* bytes */
*ubcountp = ubelem = 0; *ubcountp = ubelem = 0;
...@@ -402,7 +408,8 @@ xfs_bulkstat( ...@@ -402,7 +408,8 @@ xfs_bulkstat(
* inode returned; 0 means start of the allocation group. * inode returned; 0 means start of the allocation group.
*/ */
rval = 0; rval = 0;
while (ubleft >= statstruct_size && agno < mp->m_sb.sb_agcount) { while (XFS_BULKSTAT_UBLEFT(ubleft) && agno < mp->m_sb.sb_agcount) {
cond_resched();
bp = NULL; bp = NULL;
down_read(&mp->m_peraglock); down_read(&mp->m_peraglock);
error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp);
...@@ -499,6 +506,7 @@ xfs_bulkstat( ...@@ -499,6 +506,7 @@ xfs_bulkstat(
break; break;
error = xfs_inobt_lookup_ge(cur, agino, 0, 0, error = xfs_inobt_lookup_ge(cur, agino, 0, 0,
&tmp); &tmp);
cond_resched();
} }
/* /*
* If ran off the end of the ag either with an error, * If ran off the end of the ag either with an error,
...@@ -542,6 +550,7 @@ xfs_bulkstat( ...@@ -542,6 +550,7 @@ xfs_bulkstat(
*/ */
agino = gino + XFS_INODES_PER_CHUNK; agino = gino + XFS_INODES_PER_CHUNK;
error = xfs_inobt_increment(cur, 0, &tmp); error = xfs_inobt_increment(cur, 0, &tmp);
cond_resched();
} }
/* /*
* Drop the btree buffers and the agi buffer. * Drop the btree buffers and the agi buffer.
...@@ -555,12 +564,12 @@ xfs_bulkstat( ...@@ -555,12 +564,12 @@ xfs_bulkstat(
*/ */
irbufend = irbp; irbufend = irbp;
for (irbp = irbuf; for (irbp = irbuf;
irbp < irbufend && ubleft >= statstruct_size; irbp++) { irbp < irbufend && XFS_BULKSTAT_UBLEFT(ubleft); irbp++) {
/* /*
* Now process this chunk of inodes. * Now process this chunk of inodes.
*/ */
for (agino = irbp->ir_startino, chunkidx = clustidx = 0; for (agino = irbp->ir_startino, chunkidx = clustidx = 0;
ubleft > 0 && XFS_BULKSTAT_UBLEFT(ubleft) &&
irbp->ir_freecount < XFS_INODES_PER_CHUNK; irbp->ir_freecount < XFS_INODES_PER_CHUNK;
chunkidx++, clustidx++, agino++) { chunkidx++, clustidx++, agino++) {
ASSERT(chunkidx < XFS_INODES_PER_CHUNK); ASSERT(chunkidx < XFS_INODES_PER_CHUNK);
...@@ -663,14 +672,12 @@ xfs_bulkstat( ...@@ -663,14 +672,12 @@ xfs_bulkstat(
ubleft, private_data, ubleft, private_data,
bno, &ubused, dip, &fmterror); bno, &ubused, dip, &fmterror);
if (fmterror == BULKSTAT_RV_NOTHING) { if (fmterror == BULKSTAT_RV_NOTHING) {
if (error == EFAULT) { if (error && error != ENOENT &&
error != EINVAL) {
ubleft = 0; ubleft = 0;
rval = error; rval = error;
break; break;
} }
else if (error == ENOMEM)
ubleft = 0;
else
lastino = ino; lastino = ino;
continue; continue;
} }
...@@ -686,6 +693,8 @@ xfs_bulkstat( ...@@ -686,6 +693,8 @@ xfs_bulkstat(
ubelem++; ubelem++;
lastino = ino; lastino = ino;
} }
cond_resched();
} }
if (bp) if (bp)
...@@ -694,11 +703,12 @@ xfs_bulkstat( ...@@ -694,11 +703,12 @@ xfs_bulkstat(
/* /*
* Set up for the next loop iteration. * Set up for the next loop iteration.
*/ */
if (ubleft > 0) { if (XFS_BULKSTAT_UBLEFT(ubleft)) {
if (end_of_ag) { if (end_of_ag) {
agno++; agno++;
agino = 0; agino = 0;
} } else
agino = XFS_INO_TO_AGINO(mp, lastino);
} else } else
break; break;
} }
...@@ -707,6 +717,11 @@ xfs_bulkstat( ...@@ -707,6 +717,11 @@ xfs_bulkstat(
*/ */
kmem_free(irbuf, irbsize); kmem_free(irbuf, irbsize);
*ubcountp = ubelem; *ubcountp = ubelem;
/*
* Found some inodes, return them now and return the error next time.
*/
if (ubelem)
rval = 0;
if (agno >= mp->m_sb.sb_agcount) { if (agno >= mp->m_sb.sb_agcount) {
/* /*
* If we ran out of filesystem, mark lastino as off * If we ran out of filesystem, mark lastino as off
......
...@@ -80,7 +80,6 @@ extern int iosapic_remove (unsigned int gsi_base); ...@@ -80,7 +80,6 @@ extern int iosapic_remove (unsigned int gsi_base);
#else #else
#define iosapic_remove(gsi_base) (-EINVAL) #define iosapic_remove(gsi_base) (-EINVAL)
#endif /* CONFIG_HOTPLUG */ #endif /* CONFIG_HOTPLUG */
extern int gsi_to_vector (unsigned int gsi);
extern int gsi_to_irq (unsigned int gsi); extern int gsi_to_irq (unsigned int gsi);
extern int iosapic_register_intr (unsigned int gsi, unsigned long polarity, extern int iosapic_register_intr (unsigned int gsi, unsigned long polarity,
unsigned long trigger); unsigned long trigger);
...@@ -94,7 +93,6 @@ extern int __init iosapic_register_platform_intr (u32 int_type, ...@@ -94,7 +93,6 @@ extern int __init iosapic_register_platform_intr (u32 int_type,
u16 eid, u16 id, u16 eid, u16 id,
unsigned long polarity, unsigned long polarity,
unsigned long trigger); unsigned long trigger);
extern unsigned int iosapic_version (char __iomem *addr);
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
extern void __devinit map_iosapic_to_node (unsigned int, int); extern void __devinit map_iosapic_to_node (unsigned int, int);
......
...@@ -330,7 +330,7 @@ static void *slob_alloc(size_t size, gfp_t gfp, int align, int node) ...@@ -330,7 +330,7 @@ static void *slob_alloc(size_t size, gfp_t gfp, int align, int node)
/* Not enough space: must allocate a new page */ /* Not enough space: must allocate a new page */
if (!b) { if (!b) {
b = slob_new_page(gfp, 0, node); b = slob_new_page(gfp & ~__GFP_ZERO, 0, node);
if (!b) if (!b)
return 0; return 0;
sp = (struct slob_page *)virt_to_page(b); sp = (struct slob_page *)virt_to_page(b);
......
...@@ -1468,6 +1468,9 @@ static void *__slab_alloc(struct kmem_cache *s, ...@@ -1468,6 +1468,9 @@ static void *__slab_alloc(struct kmem_cache *s,
void **object; void **object;
struct page *new; struct page *new;
/* We handle __GFP_ZERO in the caller */
gfpflags &= ~__GFP_ZERO;
if (!c->page) if (!c->page)
goto new_slab; goto new_slab;
......
...@@ -11,6 +11,12 @@ ...@@ -11,6 +11,12 @@
test ! -r $2/Makefile -o -O $2/Makefile || exit 0 test ! -r $2/Makefile -o -O $2/Makefile || exit 0
# Only overwrite automatically generated Makefiles
# (so we do not overwrite kernel Makefile)
if ! grep -q Automatically $2/Makefile
then
exit 0
fi
echo " GEN $2/Makefile" echo " GEN $2/Makefile"
cat << EOF > $2/Makefile cat << EOF > $2/Makefile
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment