From: Jonathan Corbet <corbet@lwn.net>

Here, I believe, is a patch which should let you remove the "breaks lots of
archs" comment from the seq_file /proc/interrupts patch.  I haven't been able
to test any of these, of course, but my confidence is reasonably high.  The
ia_64 version worked first time, and the changes are truly mechanical and the
same for each - with one or two small exceptions.



 25-akpm/arch/alpha/kernel/irq.c              |   31 +++++++++++---------
 25-akpm/arch/arm/kernel/irq.c                |   12 +++----
 25-akpm/arch/arm26/kernel/irq.c              |   10 +++---
 25-akpm/arch/cris/kernel/irq.c               |    4 +-
 25-akpm/arch/h8300/platform/h8300h/ints.c    |    4 +-
 25-akpm/arch/h8300/platform/h8s/ints.c       |    4 +-
 25-akpm/arch/m68k/kernel/ints.c              |    9 ++---
 25-akpm/arch/m68knommu/platform/5307/ints.c  |    6 +--
 25-akpm/arch/m68knommu/platform/68328/ints.c |    7 ++--
 25-akpm/arch/m68knommu/platform/68360/ints.c |    7 ++--
 25-akpm/arch/mips/kernel/irq.c               |   22 +++++++-------
 25-akpm/arch/parisc/kernel/irq.c             |   21 +++++++------
 25-akpm/arch/ppc/kernel/irq.c                |   41 ++++++++++++++-------------
 25-akpm/arch/s390/kernel/setup.c             |   18 +++++------
 25-akpm/arch/sh/kernel/irq.c                 |   16 +++++-----
 25-akpm/arch/sparc/kernel/irq.c              |    4 +-
 25-akpm/arch/sparc/kernel/sun4d_irq.c        |    4 +-
 25-akpm/arch/sparc64/kernel/irq.c            |    4 +-
 25-akpm/arch/v850/kernel/irq.c               |   18 ++++++-----
 19 files changed, 128 insertions(+), 114 deletions(-)

diff -puN arch/alpha/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/alpha/kernel/irq.c
--- 25/arch/alpha/kernel/irq.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/alpha/kernel/irq.c	Fri Nov 21 10:52:50 2003
@@ -529,19 +529,21 @@ show_interrupts(struct seq_file *p, void
 #ifdef CONFIG_SMP
 	int j;
 #endif
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 	unsigned long flags;
 
 #ifdef CONFIG_SMP
-	seq_puts(p, "           ");
-	for (i = 0; i < NR_CPUS; i++)
-		if (cpu_online(i))
-			seq_printf(p, "CPU%d       ", i);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (i = 0; i < NR_CPUS; i++)
+			if (cpu_online(i))
+				seq_printf(p, "CPU%d       ", i);
+		seq_putc(p, '\n');
+	}
 #endif
 
-	for (i = 0; i < ACTUAL_NR_IRQS; i++) {
+	if (i < ACTUAL_NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if (!action) 
@@ -568,15 +570,16 @@ show_interrupts(struct seq_file *p, void
 		seq_putc(p, '\n');
 unlock:
 		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-	}
+	} else if (i == ACTUAL_NR_IRQS) {
 #ifdef CONFIG_SMP
-	seq_puts(p, "IPI: ");
-	for (i = 0; i < NR_CPUS; i++)
-		if (cpu_online(i))
-			seq_printf(p, "%10lu ", cpu_data[i].ipi_count);
-	seq_putc(p, '\n');
+		seq_puts(p, "IPI: ");
+		for (i = 0; i < NR_CPUS; i++)
+			if (cpu_online(i))
+				seq_printf(p, "%10lu ", cpu_data[i].ipi_count);
+		seq_putc(p, '\n');
 #endif
-	seq_printf(p, "ERR: %10lu\n", irq_err_count);
+		seq_printf(p, "ERR: %10lu\n", irq_err_count);
+	}
 	return 0;
 }
 
diff -puN arch/arm26/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/arm26/kernel/irq.c
--- 25/arch/arm26/kernel/irq.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/arm26/kernel/irq.c	Fri Nov 21 10:52:50 2003
@@ -135,10 +135,10 @@ void enable_irq(unsigned int irq)
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 	    	action = irq_desc[i].action;
 		if (!action)
 			continue;
@@ -148,10 +148,10 @@ int show_interrupts(struct seq_file *p, 
 			seq_printf(p, ", %s", action->name);
 		}
 		seq_putc(p, '\n');
+	} else if (i == NR_IRQS) {
+		show_fiq_list(p, v);
+		seq_printf(p, "Err: %10lu\n", irq_err_count);
 	}
-
-	show_fiq_list(p, v);
-	seq_printf(p, "Err: %10lu\n", irq_err_count);
 	return 0;
 }
 
diff -puN arch/arm/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/arm/kernel/irq.c
--- 25/arch/arm/kernel/irq.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/arm/kernel/irq.c	Fri Nov 21 10:52:50 2003
@@ -169,11 +169,11 @@ void disable_irq_wake(unsigned int irq)
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 	unsigned long flags;
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		spin_lock_irqsave(&irq_controller_lock, flags);
 	    	action = irq_desc[i].action;
 		if (!action)
@@ -187,12 +187,12 @@ int show_interrupts(struct seq_file *p, 
 		seq_putc(p, '\n');
 unlock:
 		spin_unlock_irqrestore(&irq_controller_lock, flags);
-	}
-
+	} else if (i == NR_IRQS) {
 #ifdef CONFIG_ARCH_ACORN
-	show_fiq_list(p, v);
+		show_fiq_list(p, v);
 #endif
-	seq_printf(p, "Err: %10lu\n", irq_err_count);
+		seq_printf(p, "Err: %10lu\n", irq_err_count);
+	}
 	return 0;
 }
 
diff -puN arch/cris/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/cris/kernel/irq.c
--- 25/arch/cris/kernel/irq.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/cris/kernel/irq.c	Fri Nov 21 10:52:50 2003
@@ -89,11 +89,11 @@ static struct irqaction *irq_action[NR_I
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 	unsigned long flags;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		local_irq_save(flags);
 		action = irq_action[i];
 		if (!action) 
diff -puN arch/h8300/platform/h8300h/ints.c~proc-interrupts-use-seq_file-2 arch/h8300/platform/h8300h/ints.c
--- 25/arch/h8300/platform/h8300h/ints.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/h8300/platform/h8300h/ints.c	Fri Nov 21 10:52:50 2003
@@ -228,9 +228,9 @@ asmlinkage void process_int(int vec, str
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		if (irq_list[i]) {
 			seq_printf(p, "%3d: %10u ",i,irq_list[i]->count);
 			seq_printf(p, "%s\n", irq_list[i]->devname);
diff -puN arch/h8300/platform/h8s/ints.c~proc-interrupts-use-seq_file-2 arch/h8300/platform/h8s/ints.c
--- 25/arch/h8300/platform/h8s/ints.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/h8300/platform/h8s/ints.c	Fri Nov 21 10:52:50 2003
@@ -280,9 +280,9 @@ asmlinkage void process_int(unsigned lon
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		if (irq_list[i]) {
 			seq_printf(p, "%3d: %10u ",i,irq_list[i]->count);
 			seq_printf(p, "%s\n", irq_list[i]->devname);
diff -puN arch/m68k/kernel/ints.c~proc-interrupts-use-seq_file-2 arch/m68k/kernel/ints.c
--- 25/arch/m68k/kernel/ints.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/m68k/kernel/ints.c	Fri Nov 21 10:52:50 2003
@@ -253,19 +253,18 @@ asmlinkage void process_int(unsigned lon
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
 	/* autovector interrupts */
 	if (mach_default_handler) {
-		for (i = 0; i < SYS_IRQS; i++) {
+		if (i < SYS_IRQS) {
 			seq_printf(p, "auto %2d: %10u ", i,
 			               i ? kstat_cpu(0).irqs[i] : num_spurious);
 			seq_puts(p, "  ");
 			seq_printf(p, "%s\n", irq_list[i].devname);
 		}
-	}
-
-	mach_get_irq_list(p, v);
+	} else if (i == SYS_IRQS)
+		mach_get_irq_list(p, v);
 	return 0;
 }
 
diff -puN arch/m68knommu/platform/5307/ints.c~proc-interrupts-use-seq_file-2 arch/m68knommu/platform/5307/ints.c
--- 25/arch/m68knommu/platform/5307/ints.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/m68knommu/platform/5307/ints.c	Fri Nov 21 10:52:50 2003
@@ -254,9 +254,9 @@ asmlinkage void process_int(unsigned lon
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		if (irq_list[i].flags & IRQ_FLG_STD)
 			continue;
 
@@ -269,7 +269,7 @@ int show_interrupts(struct seq_file *p, 
 		seq_printf(p, "%s\n", irq_list[i].devname);
 	}
 
-	if (mach_get_irq_list)
+	if (i == NR_IRQS && mach_get_irq_list)
 		mach_get_irq_list(p, v);
 	return(0);
 }
diff -puN arch/m68knommu/platform/68328/ints.c~proc-interrupts-use-seq_file-2 arch/m68knommu/platform/68328/ints.c
--- 25/arch/m68knommu/platform/68328/ints.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/m68knommu/platform/68328/ints.c	Fri Nov 21 10:52:50 2003
@@ -198,9 +198,9 @@ EXPORT_SYMBOL(free_irq);
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		if (int_irq_list[i].flags & IRQ_FLG_STD)
 			continue;
 
@@ -211,7 +211,8 @@ int show_interrupts(struct seq_file *p, 
 			seq_printf(p, "  ");
 		seq_printf(p, "%s\n", int_irq_list[i].devname);
 	}
-	seq_printf(p, "   : %10u   spurious\n", num_spurious);
+	if (i == NR_IRQS)
+		seq_printf(p, "   : %10u   spurious\n", num_spurious);
 
 	return 0;
 }
diff -puN arch/m68knommu/platform/68360/ints.c~proc-interrupts-use-seq_file-2 arch/m68knommu/platform/68360/ints.c
--- 25/arch/m68knommu/platform/68360/ints.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/m68knommu/platform/68360/ints.c	Fri Nov 21 10:52:50 2003
@@ -278,9 +278,9 @@ void M68360_disable_irq(unsigned int irq
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		if (int_irq_list[i].flags & IRQ_FLG_STD)
 			continue;
 
@@ -291,7 +291,8 @@ int show_interrupts(struct seq_file *p, 
 			seq_printf(p, "  ");
 		seq_printf(p, "%s\n", int_irq_list[i].devname);
 	}
-	seq_printf(p, "   : %10u   spurious\n", num_spurious);
+	if (i == NR_IRQS)
+		seq_printf(p, "   : %10u   spurious\n", num_spurious);
 
 	return 0;
 }
diff -puN arch/mips/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/mips/kernel/irq.c
--- 25/arch/mips/kernel/irq.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/mips/kernel/irq.c	Fri Nov 21 10:52:50 2003
@@ -85,17 +85,19 @@ atomic_t irq_err_count;
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int i = *(loff_t *) v, j;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_printf(p, "           ");
-	for (j=0; j<NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "CPU%d       ",j);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_printf(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if (!action) 
@@ -117,10 +119,10 @@ int show_interrupts(struct seq_file *p, 
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
+	} else if (i == NR_IRQS) {
+		seq_putc(p, '\n');
+		seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
 	}
-	seq_putc(p, '\n');
-	seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
-
 	return 0;
 }
 
diff -puN arch/parisc/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/parisc/kernel/irq.c
--- 25/arch/parisc/kernel/irq.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/parisc/kernel/irq.c	Fri Nov 21 10:52:50 2003
@@ -215,29 +215,30 @@ EXPORT_SYMBOL(enable_irq);
 int show_interrupts(struct seq_file *p, void *v)
 {
 #ifdef CONFIG_PROC_FS
-	unsigned int regnr = 0;
+	unsigned int regnr = *(loff_t *) v, i;
 
-	seq_puts(p, "     ");
+	if (regnr == 0) {
+		seq_puts(p, "     ");
 #ifdef CONFIG_SMP
-	for (regnr = 0; regnr < NR_CPUS; regnr++)
+		for (i = 0; i < NR_CPUS; i++)
 #endif
-		seq_printf(p, "      CPU%02d ", regnr);
+			seq_printf(p, "      CPU%02d ", i);
 
 #ifdef PARISC_IRQ_CR16_COUNTS
-	seq_printf(p, "[min/avg/max] (CPU cycle counts)");
+		seq_printf(p, "[min/avg/max] (CPU cycle counts)");
 #endif
-	seq_putc(p, '\n');
+		seq_putc(p, '\n');
+	}
 
 	/* We don't need *irqsave lock variants since this is
 	** only allowed to change while in the base context.
 	*/
 	spin_lock(&irq_lock);
-	for (regnr = 0; regnr < NR_IRQ_REGS; regnr++) {
-	    unsigned int i;
+	if (regnr < NR_IRQ_REGS) {
 	    struct irq_region *region = irq_region[regnr];
 
             if (!region || !region->action)
-		continue;
+		    goto skip;
 
 	    for (i = 0; i <= MAX_CPU_IRQ; i++) {
 		struct irqaction *action = &region->action[i];
@@ -286,9 +287,9 @@ int show_interrupts(struct seq_file *p, 
 		seq_putc(p, '\n');
 	    }
 	}
+  skip:
 	spin_unlock(&irq_lock);
 
-	seq_putc(p, '\n');
 #endif	/* CONFIG_PROC_FS */
 	return 0;
 }
diff -puN arch/ppc/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/ppc/kernel/irq.c
--- 25/arch/ppc/kernel/irq.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/ppc/kernel/irq.c	Fri Nov 21 10:52:50 2003
@@ -346,17 +346,19 @@ void enable_irq(unsigned int irq)
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int i = *(loff_t *) v, j;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_puts(p, "           ");
-	for (j=0; j<NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "CPU%d       ", j);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ", j);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if ( !action || !action->handler )
@@ -381,22 +383,23 @@ int show_interrupts(struct seq_file *p, 
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-	}
+	} else if (i == NR_IRQS) {
 #ifdef CONFIG_TAU_INT
-	if (tau_initialized){
-		seq_puts(p, "TAU: ");
-		for (j = 0; j < NR_CPUS; j++)
-			if (cpu_online(j))
-				seq_printf(p, "%10u ", tau_interrupts(j));
-		seq_puts(p, "  PowerPC             Thermal Assist (cpu temp)\n");
-	}
+		if (tau_initialized){
+			seq_puts(p, "TAU: ");
+			for (j = 0; j < NR_CPUS; j++)
+				if (cpu_online(j))
+					seq_printf(p, "%10u ", tau_interrupts(j));
+			seq_puts(p, "  PowerPC             Thermal Assist (cpu temp)\n");
+		}
 #endif
 #ifdef CONFIG_SMP
-	/* should this be per processor send/receive? */
-	seq_printf(p, "IPI (recv/sent): %10u/%u\n",
-		   atomic_read(&ipi_recv), atomic_read(&ipi_sent));
+		/* should this be per processor send/receive? */
+		seq_printf(p, "IPI (recv/sent): %10u/%u\n",
+				atomic_read(&ipi_recv), atomic_read(&ipi_sent));
 #endif
-	seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
+		seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
+	}
 	return 0;
 }
 
diff -puN arch/s390/kernel/setup.c~proc-interrupts-use-seq_file-2 arch/s390/kernel/setup.c
--- 25/arch/s390/kernel/setup.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/s390/kernel/setup.c	Fri Nov 21 10:52:50 2003
@@ -617,17 +617,17 @@ static const char *intrclass_names[] = {
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-        int i, j;
+        int i = *(loff_t *) v, j;
 	
-        seq_puts(p, "           ");
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		seq_putc(p, '\n');
+	}
 	
-        for (j=0; j<NR_CPUS; j++)
-                if (cpu_online(j))
-                        seq_printf(p, "CPU%d       ",j);
-	
-        seq_putc(p, '\n');
-	
-        for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		seq_printf(p, "%s: ", intrclass_names[i]);
 #ifndef CONFIG_SMP
 		seq_printf(p, "%10u ", kstat_irqs(i));
diff -puN arch/sh/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/sh/kernel/irq.c
--- 25/arch/sh/kernel/irq.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/sh/kernel/irq.c	Fri Nov 21 10:52:50 2003
@@ -93,17 +93,19 @@ struct hw_interrupt_type no_irq_type = {
 #if defined(CONFIG_PROC_FS)
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int i = *(loff_t *) v, j;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_puts(p, "           ");
-	for (j=0; j<NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "CPU%d       ",j);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < ACTUAL_NR_IRQS ; i++) {
+	if (i < ACTUAL_NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if (!action)
diff -puN arch/sparc64/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/sparc64/kernel/irq.c
--- 25/arch/sparc64/kernel/irq.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/sparc64/kernel/irq.c	Fri Nov 21 10:52:50 2003
@@ -128,14 +128,14 @@ static void register_irq_proc (unsigned 
 int show_interrupts(struct seq_file *p, void *v)
 {
 	unsigned long flags;
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction *action;
 #ifdef CONFIG_SMP
 	int j;
 #endif
 
 	spin_lock_irqsave(&irq_action_lock, flags);
-	for (i = 0; i < (NR_IRQS + 1); i++) {
+	if (i <= NR_IRQS) {
 		if (!(action = *(i + irq_action)))
 			continue;
 		seq_printf(p, "%3d: ", i);
diff -puN arch/sparc/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/sparc/kernel/irq.c
--- 25/arch/sparc/kernel/irq.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/sparc/kernel/irq.c	Fri Nov 21 10:52:50 2003
@@ -102,7 +102,7 @@ struct irqaction *irq_action[NR_IRQS] = 
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 	unsigned long flags;
 #ifdef CONFIG_SMP
@@ -114,7 +114,7 @@ int show_interrupts(struct seq_file *p, 
 		
 		return show_sun4d_interrupts(p, v);
 	}
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		local_irq_save(flags);
 	        action = *(i + irq_action);
 		if (!action) 
diff -puN arch/sparc/kernel/sun4d_irq.c~proc-interrupts-use-seq_file-2 arch/sparc/kernel/sun4d_irq.c
--- 25/arch/sparc/kernel/sun4d_irq.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/sparc/kernel/sun4d_irq.c	Fri Nov 21 10:52:50 2003
@@ -75,13 +75,13 @@ spinlock_t sun4d_imsk_lock = SPIN_LOCK_U
 
 int show_sun4d_interrupts(struct seq_file *p, void *v)
 {
-	int i, j = 0, k = 0, sbusl;
+	int i = *(loff_t *) v, j = 0, k = 0, sbusl;
 	struct irqaction * action;
 #ifdef CONFIG_SMP
 	int x;
 #endif
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		sbusl = pil_to_sbus[i];
 		if (!sbusl) {
 	 		action = *(i + irq_action);
diff -puN arch/v850/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/v850/kernel/irq.c
--- 25/arch/v850/kernel/irq.c~proc-interrupts-use-seq_file-2	Fri Nov 21 10:52:50 2003
+++ 25-akpm/arch/v850/kernel/irq.c	Fri Nov 21 10:52:50 2003
@@ -81,16 +81,18 @@ volatile unsigned long irq_err_count, sp
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_puts(p, "           ");
-	for (i=0; i < 1 /*smp_num_cpus*/; i++)
-		seq_printf(p, "CPU%d       ", i);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (i=0; i < 1 /*smp_num_cpus*/; i++)
+			seq_printf(p, "CPU%d       ", i);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		int j, count, num;
 		const char *type_name = irq_desc[i].handler->typename;
 		spin_lock_irqsave(&irq_desc[j].lock, flags);
@@ -121,8 +123,8 @@ int show_interrupts(struct seq_file *p, 
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&irq_desc[j].lock, flags);
-	}
-	seq_printf(p, "ERR: %10lu\n", irq_err_count);
+	} else if (i == NR_IRQS)
+		seq_printf(p, "ERR: %10lu\n", irq_err_count);
 	return 0;
 }
 

_