Commit 5e88de04 authored by Linus Torvalds's avatar Linus Torvalds

Import 2.1.39

parent 583c226d
...@@ -733,8 +733,8 @@ S: USA ...@@ -733,8 +733,8 @@ S: USA
N: Alain L. Knaff N: Alain L. Knaff
E: Alain.Knaff@poboxes.com E: Alain.Knaff@poboxes.com
D: floppy driver D: floppy driver
S: 2a, rue de l'Acier S: 19, rue Jean l'Aveugle
S: L-4505 Differdange S: L-1148 Luxembourg-City
S: Luxembourg S: Luxembourg
N: Gerd Knorr N: Gerd Knorr
......
VERSION = 2 VERSION = 2
PATCHLEVEL = 1 PATCHLEVEL = 1
SUBLEVEL = 38 SUBLEVEL = 39
ARCH := $(shell uname -m | sed s/i.86/i386/) ARCH := $(shell uname -m | sed s/i.86/i386/)
......
...@@ -62,32 +62,8 @@ static inline void irq_exit(int cpu, int irq) ...@@ -62,32 +62,8 @@ static inline void irq_exit(int cpu, int irq)
"mov %dx,%ds\n\t" \ "mov %dx,%ds\n\t" \
"mov %dx,%es\n\t" "mov %dx,%es\n\t"
/*
* These are used just for the "bad" interrupt handlers,
* which just clear the mask and return..
*/
#define SAVE_MOST \
"cld\n\t" \
"push %es\n\t" \
"push %ds\n\t" \
"pushl %eax\n\t" \
"pushl %edx\n\t" \
"pushl %ecx\n\t" \
"movl $" STR(KERNEL_DS) ",%edx\n\t" \
"mov %dx,%ds\n\t" \
"mov %dx,%es\n\t"
#define RESTORE_MOST \
"popl %ecx\n\t" \
"popl %edx\n\t" \
"popl %eax\n\t" \
"pop %ds\n\t" \
"pop %es\n\t" \
"iret"
#define IRQ_NAME2(nr) nr##_interrupt(void) #define IRQ_NAME2(nr) nr##_interrupt(void)
#define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr) #define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr)
#define BAD_IRQ_NAME(nr) IRQ_NAME2(bad_IRQ##nr)
#define GET_CURRENT \ #define GET_CURRENT \
"movl %esp, %ebx\n\t" \ "movl %esp, %ebx\n\t" \
...@@ -150,15 +126,14 @@ static inline void x86_do_profile (unsigned long eip) ...@@ -150,15 +126,14 @@ static inline void x86_do_profile (unsigned long eip)
extern int _stext; extern int _stext;
eip -= (unsigned long) &_stext; eip -= (unsigned long) &_stext;
eip >>= prof_shift; eip >>= prof_shift;
if (eip < prof_len)
atomic_inc((atomic_t *)&prof_buffer[eip]);
else
/* /*
* Dont ignore out-of-bounds EIP values silently, * Dont ignore out-of-bounds EIP values silently,
* put them into the last histogram slot, so if * put them into the last histogram slot, so if
* present, they will show up as a sharp peak. * present, they will show up as a sharp peak.
*/ */
atomic_inc((atomic_t *)&prof_buffer[prof_len-1]); if (eip > prof_len-1)
eip = prof_len-1;
atomic_inc((atomic_t *)&prof_buffer[eip]);
} }
} }
......
...@@ -838,7 +838,7 @@ static void release_dev(struct file * filp) ...@@ -838,7 +838,7 @@ static void release_dev(struct file * filp)
{ {
struct tty_struct *tty, *o_tty; struct tty_struct *tty, *o_tty;
struct termios *tp, *o_tp, *ltp, *o_ltp; struct termios *tp, *o_tp, *ltp, *o_ltp;
struct task_struct **p; struct task_struct *p;
int idx; int idx;
tty = (struct tty_struct *)filp->private_data; tty = (struct tty_struct *)filp->private_data;
...@@ -972,14 +972,14 @@ static void release_dev(struct file * filp) ...@@ -972,14 +972,14 @@ static void release_dev(struct file * filp)
* Make sure there aren't any processes that still think this * Make sure there aren't any processes that still think this
* tty is their controlling tty. * tty is their controlling tty.
*/ */
for (p = &LAST_TASK ; p > &FIRST_TASK ; --p) { read_lock(&tasklist_lock);
if (*p == 0) for_each_task(p) {
continue; if (p->tty == tty)
if ((*p)->tty == tty) p->tty = NULL;
(*p)->tty = NULL; if (o_tty && p->tty == o_tty)
if (o_tty && (*p)->tty == o_tty) p->tty = NULL;
(*p)->tty = NULL;
} }
read_unlock(&tasklist_lock);
/* /*
* Shutdown the current line discipline, and reset it to * Shutdown the current line discipline, and reset it to
...@@ -1216,40 +1216,6 @@ static int tty_fasync(struct inode * inode, struct file * filp, int on) ...@@ -1216,40 +1216,6 @@ static int tty_fasync(struct inode * inode, struct file * filp, int on)
return 0; return 0;
} }
#if 0
/*
* XXX does anyone use this anymore?!?
*/
static int do_get_ps_info(unsigned long arg)
{
struct tstruct {
int flag;
int present[NR_TASKS];
struct task_struct tasks[NR_TASKS];
};
struct tstruct *ts = (struct tstruct *)arg;
struct task_struct **p;
char *c, *d;
int i, n = 0;
i = verify_area(VERIFY_WRITE, (void *)arg, sizeof(struct tstruct));
if (i)
return i;
for (p = &FIRST_TASK ; p <= &LAST_TASK ; p++, n++)
if (*p)
{
c = (char *)(*p);
d = (char *)(ts->tasks+n);
for (i=0 ; i<sizeof(struct task_struct) ; i++)
put_user(*c++, d++);
put_user(1, ts->present+n);
}
else
put_user(0, ts->present+n);
return(0);
}
#endif
static int tiocsti(struct tty_struct *tty, char * arg) static int tiocsti(struct tty_struct *tty, char * arg)
{ {
char ch, mbz = 0; char ch, mbz = 0;
...@@ -1495,7 +1461,7 @@ void do_SAK( struct tty_struct *tty) ...@@ -1495,7 +1461,7 @@ void do_SAK( struct tty_struct *tty)
#ifdef TTY_SOFT_SAK #ifdef TTY_SOFT_SAK
tty_hangup(tty); tty_hangup(tty);
#else #else
struct task_struct **p; struct task_struct *p;
int session; int session;
int i; int i;
struct file *filp; struct file *filp;
...@@ -1507,23 +1473,23 @@ void do_SAK( struct tty_struct *tty) ...@@ -1507,23 +1473,23 @@ void do_SAK( struct tty_struct *tty)
tty->ldisc.flush_buffer(tty); tty->ldisc.flush_buffer(tty);
if (tty->driver.flush_buffer) if (tty->driver.flush_buffer)
tty->driver.flush_buffer(tty); tty->driver.flush_buffer(tty);
for (p = &LAST_TASK ; p > &FIRST_TASK ; --p) { read_lock(&tasklist_lock);
if (!(*p)) for_each_task(p) {
continue; if ((p->tty == tty) ||
if (((*p)->tty == tty) || ((session > 0) && (p->session == session)))
((session > 0) && ((*p)->session == session))) send_sig(SIGKILL, p, 1);
send_sig(SIGKILL, *p, 1); else if (p->files) {
else if ((*p)->files) {
for (i=0; i < NR_OPEN; i++) { for (i=0; i < NR_OPEN; i++) {
filp = (*p)->files->fd[i]; filp = p->files->fd[i];
if (filp && (filp->f_op == &tty_fops) && if (filp && (filp->f_op == &tty_fops) &&
(filp->private_data == tty)) { (filp->private_data == tty)) {
send_sig(SIGKILL, *p, 1); send_sig(SIGKILL, p, 1);
break; break;
} }
} }
} }
} }
read_unlock(&tasklist_lock);
#endif #endif
} }
......
This diff is collapsed.
...@@ -12,7 +12,7 @@ int eata2x_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); ...@@ -12,7 +12,7 @@ int eata2x_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int eata2x_abort(Scsi_Cmnd *); int eata2x_abort(Scsi_Cmnd *);
int eata2x_reset(Scsi_Cmnd *, unsigned int); int eata2x_reset(Scsi_Cmnd *, unsigned int);
#define EATA_VERSION "3.00.09" #define EATA_VERSION "3.10.00"
#define EATA { \ #define EATA { \
......
/* /*
* u14-34f.c - Low-level driver for UltraStor 14F/34F SCSI host adapters. * u14-34f.c - Low-level driver for UltraStor 14F/34F SCSI host adapters.
* *
* 17 May 1997 rev. 3.10 for linux 2.0.30 and 2.1.38
* Use of serial_number_at_timeout in abort and reset processing.
* Use of the __initfunc and __initdata macro in setup code.
* Minor cleanups in the list_statistics code.
*
* 24 Feb 1997 rev. 3.00 for linux 2.0.29 and 2.1.26 * 24 Feb 1997 rev. 3.00 for linux 2.0.29 and 2.1.26
* When loading as a module, parameter passing is now supported * When loading as a module, parameter passing is now supported
* both in 2.0 and in 2.1 style. * both in 2.0 and in 2.1 style.
...@@ -220,10 +225,12 @@ ...@@ -220,10 +225,12 @@
* between increasing or decreasing by minimizing the seek distance between * between increasing or decreasing by minimizing the seek distance between
* the sector of the commands just completed and the sector of the first * the sector of the commands just completed and the sector of the first
* command in the list to be sorted. * command in the list to be sorted.
* Trivial math assures that if there are (Q-1) outstanding request for * Trivial math assures that the unsorted average seek distance when doing
* random seeks over S sectors, the unsorted average seek distance is S/2, * random seeks over S sectors is S/3.
* while the sorted average seek distance is S/(Q-1). The seek distance is * When (Q-1) requests are uniformly distributed over S sectors, the average
* hence divided by a factor (Q-1)/2. * distance between two adjacent requests is S/((Q-1) + 1), so the sorted
* average seek distance for (Q-1) random requests over S sectors is S/Q.
* The elevator sorting hence divides the seek distance by a factor Q/3.
* The above pure geometric remarks are valid in all cases and the * The above pure geometric remarks are valid in all cases and the
* driver effectively reduces the seek distance by the predicted factor * driver effectively reduces the seek distance by the predicted factor
* when there are Q concurrent read i/o operations on the device, but this * when there are Q concurrent read i/o operations on the device, but this
...@@ -273,8 +280,16 @@ MODULE_AUTHOR("Dario Ballabio"); ...@@ -273,8 +280,16 @@ MODULE_AUTHOR("Dario Ballabio");
#include <asm/dma.h> #include <asm/dma.h>
#include <asm/irq.h> #include <asm/irq.h>
#include "u14-34f.h" #include "u14-34f.h"
#include<linux/stat.h> #include <linux/stat.h>
#include<linux/config.h> #include <linux/config.h>
#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,36)
#include <linux/init.h>
#else
#define __initfunc(A) A
#define __initdata
#define __init
#endif
struct proc_dir_entry proc_scsi_u14_34f = { struct proc_dir_entry proc_scsi_u14_34f = {
PROC_SCSI_U14_34F, 6, "u14_34f", PROC_SCSI_U14_34F, 6, "u14_34f",
...@@ -419,7 +434,7 @@ static struct Scsi_Host *sh[MAX_BOARDS + 1]; ...@@ -419,7 +434,7 @@ static struct Scsi_Host *sh[MAX_BOARDS + 1];
static const char *driver_name = "Ux4F"; static const char *driver_name = "Ux4F";
static unsigned int irqlist[MAX_IRQ], calls[MAX_IRQ]; static unsigned int irqlist[MAX_IRQ], calls[MAX_IRQ];
static unsigned int io_port[] = { static unsigned int io_port[] __initdata = {
/* Space for MAX_INT_PARAM ports usable while loading as a module */ /* Space for MAX_INT_PARAM ports usable while loading as a module */
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
...@@ -534,8 +549,7 @@ static void select_queue_depths(struct Scsi_Host *host, Scsi_Device *devlist) { ...@@ -534,8 +549,7 @@ static void select_queue_depths(struct Scsi_Host *host, Scsi_Device *devlist) {
return; return;
} }
static inline int wait_on_busy(unsigned int iobase) { static inline int wait_on_busy(unsigned int iobase, unsigned int loop) {
unsigned int loop = MAXLOOP;
while (inb(iobase + REG_LCL_INTR) & BSY_ASSERTED) while (inb(iobase + REG_LCL_INTR) & BSY_ASSERTED)
if (--loop == 0) return TRUE; if (--loop == 0) return TRUE;
...@@ -556,7 +570,7 @@ static int board_inquiry(unsigned int j) { ...@@ -556,7 +570,7 @@ static int board_inquiry(unsigned int j) {
cpp->scsi_cdbs_len = 6; cpp->scsi_cdbs_len = 6;
cpp->scsi_cdbs[0] = HA_CMD_INQUIRY; cpp->scsi_cdbs[0] = HA_CMD_INQUIRY;
if (wait_on_busy(sh[j]->io_port)) { if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
printk("%s: board_inquiry, adapter busy.\n", BN(j)); printk("%s: board_inquiry, adapter busy.\n", BN(j));
return TRUE; return TRUE;
} }
...@@ -586,8 +600,8 @@ static int board_inquiry(unsigned int j) { ...@@ -586,8 +600,8 @@ static int board_inquiry(unsigned int j) {
return FALSE; return FALSE;
} }
static inline int port_detect(unsigned int port_base, unsigned int j, __initfunc (static inline int port_detect \
Scsi_Host_Template *tpnt) { (unsigned int port_base, unsigned int j, Scsi_Host_Template *tpnt)) {
unsigned char irq, dma_channel, subversion, i; unsigned char irq, dma_channel, subversion, i;
unsigned char in_byte; unsigned char in_byte;
char *bus_type, dma_name[16]; char *bus_type, dma_name[16];
...@@ -748,7 +762,7 @@ static inline int port_detect(unsigned int port_base, unsigned int j, ...@@ -748,7 +762,7 @@ static inline int port_detect(unsigned int port_base, unsigned int j,
} }
} }
if (dma_channel == NO_DMA) sprintf(dma_name, "%s", "NO DMA"); if (dma_channel == NO_DMA) sprintf(dma_name, "%s", "BMST");
else sprintf(dma_name, "DMA %u", dma_channel); else sprintf(dma_name, "DMA %u", dma_channel);
for (i = 0; i < sh[j]->can_queue; i++) for (i = 0; i < sh[j]->can_queue; i++)
...@@ -781,7 +795,7 @@ static inline int port_detect(unsigned int port_base, unsigned int j, ...@@ -781,7 +795,7 @@ static inline int port_detect(unsigned int port_base, unsigned int j,
return TRUE; return TRUE;
} }
void u14_34f_setup(char *str, int *ints) { __initfunc (void u14_34f_setup(char *str, int *ints)) {
int i, argc = ints[0]; int i, argc = ints[0];
char *cur = str, *pc; char *cur = str, *pc;
...@@ -813,7 +827,7 @@ void u14_34f_setup(char *str, int *ints) { ...@@ -813,7 +827,7 @@ void u14_34f_setup(char *str, int *ints) {
return; return;
} }
int u14_34f_detect(Scsi_Host_Template *tpnt) { __initfunc (int u14_34f_detect(Scsi_Host_Template *tpnt)) {
unsigned long flags; unsigned long flags;
unsigned int j = 0, k; unsigned int j = 0, k;
...@@ -983,12 +997,12 @@ int u14_34f_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) { ...@@ -983,12 +997,12 @@ int u14_34f_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
if (linked_comm && SCpnt->device->queue_depth > 2 if (linked_comm && SCpnt->device->queue_depth > 2
&& TLDEV(SCpnt->device->type)) { && TLDEV(SCpnt->device->type)) {
HD(j)->cp_stat[i] = READY; HD(j)->cp_stat[i] = READY;
flush_dev(SCpnt->device, 0, j, FALSE); flush_dev(SCpnt->device, SCpnt->request.sector, j, FALSE);
restore_flags(flags); restore_flags(flags);
return 0; return 0;
} }
if (wait_on_busy(sh[j]->io_port)) { if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
SCpnt->result = DID_ERROR << 16; SCpnt->result = DID_ERROR << 16;
SCpnt->host_scribble = NULL; SCpnt->host_scribble = NULL;
printk("%s: qcomm, target %d.%d:%d, pid %ld, adapter busy, DID_ERROR,"\ printk("%s: qcomm, target %d.%d:%d, pid %ld, adapter busy, DID_ERROR,"\
...@@ -1018,7 +1032,8 @@ int u14_34f_abort(Scsi_Cmnd *SCarg) { ...@@ -1018,7 +1032,8 @@ int u14_34f_abort(Scsi_Cmnd *SCarg) {
cli(); cli();
j = ((struct hostdata *) SCarg->host->hostdata)->board_number; j = ((struct hostdata *) SCarg->host->hostdata)->board_number;
if (SCarg->host_scribble == NULL) { if (SCarg->host_scribble == NULL
|| SCarg->serial_number != SCarg->serial_number_at_timeout) {
printk("%s: abort, target %d.%d:%d, pid %ld inactive.\n", printk("%s: abort, target %d.%d:%d, pid %ld inactive.\n",
BN(j), SCarg->channel, SCarg->target, SCarg->lun, SCarg->pid); BN(j), SCarg->channel, SCarg->target, SCarg->lun, SCarg->pid);
restore_flags(flags); restore_flags(flags);
...@@ -1032,7 +1047,7 @@ int u14_34f_abort(Scsi_Cmnd *SCarg) { ...@@ -1032,7 +1047,7 @@ int u14_34f_abort(Scsi_Cmnd *SCarg) {
if (i >= sh[j]->can_queue) if (i >= sh[j]->can_queue)
panic("%s: abort, invalid SCarg->host_scribble.\n", BN(j)); panic("%s: abort, invalid SCarg->host_scribble.\n", BN(j));
if (wait_on_busy(sh[j]->io_port)) { if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
printk("%s: abort, timeout error.\n", BN(j)); printk("%s: abort, timeout error.\n", BN(j));
restore_flags(flags); restore_flags(flags);
return SCSI_ABORT_ERROR; return SCSI_ABORT_ERROR;
...@@ -1101,13 +1116,19 @@ int u14_34f_reset(Scsi_Cmnd *SCarg, unsigned int reset_flags) { ...@@ -1101,13 +1116,19 @@ int u14_34f_reset(Scsi_Cmnd *SCarg, unsigned int reset_flags) {
if (SCarg->host_scribble == NULL) if (SCarg->host_scribble == NULL)
printk("%s: reset, pid %ld inactive.\n", BN(j), SCarg->pid); printk("%s: reset, pid %ld inactive.\n", BN(j), SCarg->pid);
if (SCarg->serial_number != SCarg->serial_number_at_timeout) {
printk("%s: reset, pid %ld, reset not running.\n", BN(j), SCarg->pid);
restore_flags(flags);
return SCSI_RESET_NOT_RUNNING;
}
if (HD(j)->in_reset) { if (HD(j)->in_reset) {
printk("%s: reset, exit, already in reset.\n", BN(j)); printk("%s: reset, exit, already in reset.\n", BN(j));
restore_flags(flags); restore_flags(flags);
return SCSI_RESET_ERROR; return SCSI_RESET_ERROR;
} }
if (wait_on_busy(sh[j]->io_port)) { if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
printk("%s: reset, exit, timeout error.\n", BN(j)); printk("%s: reset, exit, timeout error.\n", BN(j));
restore_flags(flags); restore_flags(flags);
return SCSI_RESET_ERROR; return SCSI_RESET_ERROR;
...@@ -1158,7 +1179,7 @@ int u14_34f_reset(Scsi_Cmnd *SCarg, unsigned int reset_flags) { ...@@ -1158,7 +1179,7 @@ int u14_34f_reset(Scsi_Cmnd *SCarg, unsigned int reset_flags) {
if (SCpnt == SCarg) arg_done = TRUE; if (SCpnt == SCarg) arg_done = TRUE;
} }
if (wait_on_busy(sh[j]->io_port)) { if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
printk("%s: reset, cannot reset, timeout error.\n", BN(j)); printk("%s: reset, cannot reset, timeout error.\n", BN(j));
restore_flags(flags); restore_flags(flags);
return SCSI_RESET_ERROR; return SCSI_RESET_ERROR;
...@@ -1271,7 +1292,7 @@ static inline void reorder(unsigned int j, unsigned long cursec, ...@@ -1271,7 +1292,7 @@ static inline void reorder(unsigned int j, unsigned long cursec,
unsigned int rev = FALSE, s = TRUE, r = TRUE; unsigned int rev = FALSE, s = TRUE, r = TRUE;
unsigned int input_only = TRUE, overlap = FALSE; unsigned int input_only = TRUE, overlap = FALSE;
unsigned long sl[n_ready], pl[n_ready], ll[n_ready]; unsigned long sl[n_ready], pl[n_ready], ll[n_ready];
unsigned long maxsec = 0, minsec = ULONG_MAX, seek = 0; unsigned long maxsec = 0, minsec = ULONG_MAX, seek = 0, iseek = 0;
static unsigned int flushcount = 0, batchcount = 0, sortcount = 0; static unsigned int flushcount = 0, batchcount = 0, sortcount = 0;
static unsigned int readycount = 0, ovlcount = 0, inputcount = 0; static unsigned int readycount = 0, ovlcount = 0, inputcount = 0;
...@@ -1282,8 +1303,8 @@ static inline void reorder(unsigned int j, unsigned long cursec, ...@@ -1282,8 +1303,8 @@ static inline void reorder(unsigned int j, unsigned long cursec,
printk("fc %d bc %d ic %d oc %d rc %d rs %d sc %d re %d"\ printk("fc %d bc %d ic %d oc %d rc %d rs %d sc %d re %d"\
" av %ldK as %ldK.\n", flushcount, batchcount, inputcount, " av %ldK as %ldK.\n", flushcount, batchcount, inputcount,
ovlcount, readycount, readysorted, sortcount, revcount, ovlcount, readycount, readysorted, sortcount, revcount,
seeknosort / (readycount - batchcount + 1), seeknosort / (readycount + 1),
seeksorted / (readycount - batchcount + 1)); seeksorted / (readycount + 1));
if (n_ready <= 1) return; if (n_ready <= 1) return;
...@@ -1311,6 +1332,10 @@ static inline void reorder(unsigned int j, unsigned long cursec, ...@@ -1311,6 +1332,10 @@ static inline void reorder(unsigned int j, unsigned long cursec,
} }
if (link_statistics) {
if (cursec > sl[0]) seek += cursec - sl[0]; else seek += sl[0] - cursec;
}
if (cursec > ((maxsec + minsec) / 2)) rev = TRUE; if (cursec > ((maxsec + minsec) / 2)) rev = TRUE;
if (!((rev && r) || (!rev && s))) sort(sl, il, n_ready, rev); if (!((rev && r) || (!rev && s))) sort(sl, il, n_ready, rev);
...@@ -1328,10 +1353,11 @@ static inline void reorder(unsigned int j, unsigned long cursec, ...@@ -1328,10 +1353,11 @@ static inline void reorder(unsigned int j, unsigned long cursec,
if (overlap) sort(pl, il, n_ready, FALSE); if (overlap) sort(pl, il, n_ready, FALSE);
if (link_statistics) { if (link_statistics) {
if (cursec > sl[0]) iseek = cursec - sl[0]; else iseek = sl[0] - cursec;
batchcount++; readycount += n_ready, seeknosort += seek / 1024; batchcount++; readycount += n_ready, seeknosort += seek / 1024;
if (input_only) inputcount++; if (input_only) inputcount++;
if (overlap) { ovlcount++; seeksorted += seek / 1024; } if (overlap) { ovlcount++; seeksorted += seek / 1024; }
else seeksorted += (maxsec - minsec) / 1024; else seeksorted += (iseek + maxsec - minsec) / 1024;
if (rev && !r) { revcount++; readysorted += n_ready; } if (rev && !r) { revcount++; readysorted += n_ready; }
if (!rev && !s) { sortcount++; readysorted += n_ready; } if (!rev && !s) { sortcount++; readysorted += n_ready; }
} }
...@@ -1375,7 +1401,7 @@ static void flush_dev(Scsi_Device *dev, unsigned long cursec, unsigned int j, ...@@ -1375,7 +1401,7 @@ static void flush_dev(Scsi_Device *dev, unsigned long cursec, unsigned int j,
for (n = 0; n < n_ready; n++) { for (n = 0; n < n_ready; n++) {
k = il[n]; cpp = &HD(j)->cp[k]; SCpnt = cpp->SCpnt; k = il[n]; cpp = &HD(j)->cp[k]; SCpnt = cpp->SCpnt;
if (wait_on_busy(sh[j]->io_port)) { if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
printk("%s: %s, target %d.%d:%d, pid %ld, Mbox %d, adapter"\ printk("%s: %s, target %d.%d:%d, pid %ld, Mbox %d, adapter"\
" busy, will abort.\n", BN(j), (ihdlr ? "ihdlr" : "qcomm"), " busy, will abort.\n", BN(j), (ihdlr ? "ihdlr" : "qcomm"),
SCpnt->channel, SCpnt->target, SCpnt->lun, SCpnt->pid, k); SCpnt->channel, SCpnt->target, SCpnt->lun, SCpnt->pid, k);
......
...@@ -11,7 +11,7 @@ int u14_34f_abort(Scsi_Cmnd *); ...@@ -11,7 +11,7 @@ int u14_34f_abort(Scsi_Cmnd *);
int u14_34f_reset(Scsi_Cmnd *, unsigned int); int u14_34f_reset(Scsi_Cmnd *, unsigned int);
int u14_34f_biosparam(Disk *, kdev_t, int *); int u14_34f_biosparam(Disk *, kdev_t, int *);
#define U14_34F_VERSION "3.00.09" #define U14_34F_VERSION "3.10.00"
#define ULTRASTOR_14_34F { \ #define ULTRASTOR_14_34F { \
NULL, /* Ptr for modules */ \ NULL, /* Ptr for modules */ \
......
...@@ -280,7 +280,6 @@ static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex, ...@@ -280,7 +280,6 @@ static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex,
/* Real error */ /* Real error */
sys_close(elf_exec_fileno); sys_close(elf_exec_fileno);
kfree(elf_phdata); kfree(elf_phdata);
printk("%d", error);
return ~0UL; return ~0UL;
} }
......
...@@ -591,8 +591,9 @@ void set_blocksize(kdev_t dev, int size) ...@@ -591,8 +591,9 @@ void set_blocksize(kdev_t dev, int size)
continue; continue;
if (bh->b_size == size) if (bh->b_size == size)
continue; continue;
bhnext->b_count++;
wait_on_buffer(bh); wait_on_buffer(bh);
bhnext->b_count--;
if (bh->b_dev == dev && bh->b_size != size) { if (bh->b_dev == dev && bh->b_size != size) {
clear_bit(BH_Dirty, &bh->b_state); clear_bit(BH_Dirty, &bh->b_state);
clear_bit(BH_Uptodate, &bh->b_state); clear_bit(BH_Uptodate, &bh->b_state);
...@@ -1606,6 +1607,7 @@ asmlinkage int sync_old_buffers(void) ...@@ -1606,6 +1607,7 @@ asmlinkage int sync_old_buffers(void)
ndirty++; ndirty++;
if(bh->b_flushtime > jiffies) continue; if(bh->b_flushtime > jiffies) continue;
nwritten++; nwritten++;
next->b_count++;
bh->b_count++; bh->b_count++;
bh->b_flushtime = 0; bh->b_flushtime = 0;
#ifdef DEBUG #ifdef DEBUG
...@@ -1613,6 +1615,7 @@ asmlinkage int sync_old_buffers(void) ...@@ -1613,6 +1615,7 @@ asmlinkage int sync_old_buffers(void)
#endif #endif
ll_rw_block(WRITE, 1, &bh); ll_rw_block(WRITE, 1, &bh);
bh->b_count--; bh->b_count--;
next->b_count--;
} }
} }
#ifdef DEBUG #ifdef DEBUG
...@@ -1751,6 +1754,7 @@ int bdflush(void * unused) ...@@ -1751,6 +1754,7 @@ int bdflush(void * unused)
currently dirty buffers are not shared, so it does not matter */ currently dirty buffers are not shared, so it does not matter */
if (refilled && major == LOOP_MAJOR) if (refilled && major == LOOP_MAJOR)
continue; continue;
next->b_count++;
bh->b_count++; bh->b_count++;
ndirty++; ndirty++;
bh->b_flushtime = 0; bh->b_flushtime = 0;
...@@ -1766,6 +1770,7 @@ int bdflush(void * unused) ...@@ -1766,6 +1770,7 @@ int bdflush(void * unused)
if(nlist != BUF_DIRTY) ncount++; if(nlist != BUF_DIRTY) ncount++;
#endif #endif
bh->b_count--; bh->b_count--;
next->b_count--;
} }
} }
#ifdef DEBUG #ifdef DEBUG
......
...@@ -121,6 +121,11 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, ...@@ -121,6 +121,11 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
char *name; char *name;
struct iso_directory_record *de; struct iso_directory_record *de;
if( filp->f_pos >= inode->i_size ) {
return 0;
}
offset = filp->f_pos & (bufsize - 1); offset = filp->f_pos & (bufsize - 1);
block = isofs_bmap(inode, filp->f_pos >> bufbits); block = isofs_bmap(inode, filp->f_pos >> bufbits);
......
...@@ -65,7 +65,6 @@ static struct buffer_head * isofs_find_entry(struct inode * dir, ...@@ -65,7 +65,6 @@ static struct buffer_head * isofs_find_entry(struct inode * dir,
unsigned char bufbits = ISOFS_BUFFER_BITS(dir); unsigned char bufbits = ISOFS_BUFFER_BITS(dir);
unsigned int block, i, f_pos, offset, inode_number; unsigned int block, i, f_pos, offset, inode_number;
struct buffer_head * bh; struct buffer_head * bh;
void * cpnt = NULL;
unsigned int old_offset; unsigned int old_offset;
unsigned int backlink; unsigned int backlink;
int dlen, rrflag, match; int dlen, rrflag, match;
...@@ -117,21 +116,8 @@ static struct buffer_head * isofs_find_entry(struct inode * dir, ...@@ -117,21 +116,8 @@ static struct buffer_head * isofs_find_entry(struct inode * dir,
/* Handle case where the directory entry spans two blocks. /* Handle case where the directory entry spans two blocks.
Usually 1024 byte boundaries */ Usually 1024 byte boundaries */
if (offset >= bufsize) { if (offset >= bufsize) {
unsigned int frag1; printk("Directory entry extends past end of iso9660 block\n");
frag1 = bufsize - old_offset;
cpnt = kmalloc(*((unsigned char *) de),GFP_KERNEL);
if (!cpnt) return 0;
memcpy(cpnt, bh->b_data + old_offset, frag1);
de = (struct iso_directory_record *) cpnt;
brelse(bh);
offset = f_pos & (bufsize - 1);
block = isofs_bmap(dir,f_pos>>bufbits);
if (!block || !(bh = bread(dir->i_dev,block,bufsize))) {
kfree(cpnt);
return 0; return 0;
};
memcpy((char *)cpnt+frag1, bh->b_data, offset);
} }
/* Handle the '.' case */ /* Handle the '.' case */
...@@ -190,12 +176,6 @@ static struct buffer_head * isofs_find_entry(struct inode * dir, ...@@ -190,12 +176,6 @@ static struct buffer_head * isofs_find_entry(struct inode * dir,
match = isofs_match(namelen,name,dpnt,dlen); match = isofs_match(namelen,name,dpnt,dlen);
} }
if (cpnt)
{
kfree(cpnt);
cpnt = NULL;
}
if(rrflag) kfree(dpnt); if(rrflag) kfree(dpnt);
if (match) { if (match) {
if(inode_number == -1) { if(inode_number == -1) {
...@@ -217,8 +197,6 @@ static struct buffer_head * isofs_find_entry(struct inode * dir, ...@@ -217,8 +197,6 @@ static struct buffer_head * isofs_find_entry(struct inode * dir,
} }
} }
out: out:
if (cpnt)
kfree(cpnt);
brelse(bh); brelse(bh);
return NULL; return NULL;
} }
......
...@@ -60,21 +60,6 @@ ...@@ -60,21 +60,6 @@
block = cont_extent; \ block = cont_extent; \
offset = cont_offset; \ offset = cont_offset; \
offset1 = 0; \ offset1 = 0; \
if(ISOFS_BUFFER_SIZE(DEV) == 1024) { \
block <<= 1; \
if (offset >= 1024) block++; \
offset &= 1023; \
if(offset + cont_size >= 1024) { \
bh = bread(DEV->i_dev, block++, ISOFS_BUFFER_SIZE(DEV)); \
if(!bh) {printk("Unable to read continuation Rock Ridge record\n"); \
kfree(buffer); \
buffer = NULL; } else { \
memcpy(buffer, bh->b_data + offset, 1024 - offset); \
brelse(bh); \
offset1 = 1024 - offset; \
offset = 0;} \
} \
}; \
if(buffer) { \ if(buffer) { \
bh = bread(DEV->i_dev, block, ISOFS_BUFFER_SIZE(DEV)); \ bh = bread(DEV->i_dev, block, ISOFS_BUFFER_SIZE(DEV)); \
if(bh){ \ if(bh){ \
...@@ -429,7 +414,6 @@ char * get_rock_ridge_symlink(struct inode * inode) ...@@ -429,7 +414,6 @@ char * get_rock_ridge_symlink(struct inode * inode)
unsigned char bufbits = ISOFS_BUFFER_BITS(inode); unsigned char bufbits = ISOFS_BUFFER_BITS(inode);
struct buffer_head * bh; struct buffer_head * bh;
unsigned char * pnt; unsigned char * pnt;
void * cpnt = NULL;
char * rpnt; char * rpnt;
struct iso_directory_record * raw_inode; struct iso_directory_record * raw_inode;
CONTINUE_DECLS; CONTINUE_DECLS;
...@@ -455,25 +439,13 @@ char * get_rock_ridge_symlink(struct inode * inode) ...@@ -455,25 +439,13 @@ char * get_rock_ridge_symlink(struct inode * inode)
raw_inode = ((struct iso_directory_record *) pnt); raw_inode = ((struct iso_directory_record *) pnt);
/*
* If we go past the end of the buffer, there is some sort of error.
*/
if ((inode->i_ino & (bufsize - 1)) + *pnt > bufsize){ if ((inode->i_ino & (bufsize - 1)) + *pnt > bufsize){
int frag1, offset; printk("symlink spans iso9660 blocks\n");
offset = (inode->i_ino & (bufsize - 1));
frag1 = bufsize - offset;
cpnt = kmalloc(*pnt,GFP_KERNEL);
if(!cpnt) return NULL;
memcpy(cpnt, bh->b_data + offset, frag1);
brelse(bh);
if (!(bh = bread(inode->i_dev,++block, bufsize))) {
kfree(cpnt);
printk("unable to read i-node block");
return NULL; return NULL;
}; };
offset += *pnt - bufsize;
memcpy((char *)cpnt+frag1, bh->b_data, offset);
pnt = ((unsigned char *) cpnt);
raw_inode = ((struct iso_directory_record *) pnt);
};
/* Now test for possible Rock Ridge extensions which will override some of /* Now test for possible Rock Ridge extensions which will override some of
these numbers in the inode structure. */ these numbers in the inode structure. */
...@@ -558,11 +530,6 @@ char * get_rock_ridge_symlink(struct inode * inode) ...@@ -558,11 +530,6 @@ char * get_rock_ridge_symlink(struct inode * inode)
MAYBE_CONTINUE(repeat,inode); MAYBE_CONTINUE(repeat,inode);
brelse(bh); brelse(bh);
if (cpnt) {
kfree(cpnt);
cpnt = NULL;
};
return rpnt; return rpnt;
out: out:
if(buffer) kfree(buffer); if(buffer) kfree(buffer);
......
...@@ -58,9 +58,6 @@ extern unsigned long avenrun[]; /* Load averages */ ...@@ -58,9 +58,6 @@ extern unsigned long avenrun[]; /* Load averages */
extern int nr_running, nr_tasks; extern int nr_running, nr_tasks;
extern int last_pid; extern int last_pid;
#define FIRST_TASK task[0]
#define LAST_TASK task[NR_TASKS-1]
#include <linux/head.h> #include <linux/head.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/signal.h> #include <linux/signal.h>
......
...@@ -23,7 +23,7 @@ struct rpc_portmap { ...@@ -23,7 +23,7 @@ struct rpc_portmap {
__u32 pm_prog; __u32 pm_prog;
__u32 pm_vers; __u32 pm_vers;
__u32 pm_prot; __u32 pm_prot;
__u32 pm_port; __u16 pm_port;
}; };
/* /*
......
...@@ -725,7 +725,7 @@ void vmtruncate(struct inode * inode, unsigned long offset) ...@@ -725,7 +725,7 @@ void vmtruncate(struct inode * inode, unsigned long offset)
flush_cache_range(mm, start, end); flush_cache_range(mm, start, end);
zap_page_range(mm, start, len); zap_page_range(mm, start, len);
flush_tlb_range(mm, start, end); flush_tlb_range(mm, start, end);
} while ((mpnt = mpnt->vm_next_share) != inode->i_mmap); } while ((mpnt = mpnt->vm_next_share) != NULL);
} }
......
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