Commit f8c02520 authored by Linus Torvalds's avatar Linus Torvalds

Import 1.1.74

parent f7f228f4
...@@ -721,6 +721,16 @@ S: Kalevankatu 55 B 37 ...@@ -721,6 +721,16 @@ S: Kalevankatu 55 B 37
S: 00180 Helsinki S: 00180 Helsinki
S: Finland S: Finland
N: Jeff Tranter
E: Jeff_Tranter@Mitel.COM
D: Enhancements to Joystick driver
D: Author of Sound HOWTO and CD-ROM HOWTO
D: Author of several small utilities
D: (bogomips, scope, eject, statserial)
S: 1 Laurie Court
S: Kanata, Ontario
S: CANADA K2L 1S2
N: Theodore Ts'o N: Theodore Ts'o
E: tytso@mit.edu E: tytso@mit.edu
D: Random Linux hacker D: Random Linux hacker
......
VERSION = 1 VERSION = 1
PATCHLEVEL = 1 PATCHLEVEL = 1
SUBLEVEL = 73 SUBLEVEL = 74
ARCH = i386 ARCH = i386
...@@ -148,7 +148,7 @@ include/linux/version.h: $(CONFIGURE) Makefile ...@@ -148,7 +148,7 @@ include/linux/version.h: $(CONFIGURE) Makefile
@echo \#define LINUX_COMPILER \"`$(HOSTCC) -v 2>&1 | tail -1`\" >> include/linux/version.h @echo \#define LINUX_COMPILER \"`$(HOSTCC) -v 2>&1 | tail -1`\" >> include/linux/version.h
tools/build: tools/build.c $(CONFIGURE) tools/build: tools/build.c $(CONFIGURE)
$(HOSTCC) $(CFLAGS) -o $@ $< $(HOSTCC) $(CFLAGS) -o $@ $< -I$(TOPDIR)/include
boot/head.o: $(CONFIGURE) boot/head.s boot/head.o: $(CONFIGURE) boot/head.s
......
...@@ -74,7 +74,7 @@ bool 'Seagate ST-02 and Future Domain TMC-8xx SCSI support' CONFIG_SCSI_SEAGATE ...@@ -74,7 +74,7 @@ bool 'Seagate ST-02 and Future Domain TMC-8xx SCSI support' CONFIG_SCSI_SEAGATE
bool 'Trantor T128/T128F/T228 SCSI support' CONFIG_SCSI_T128 n bool 'Trantor T128/T128F/T228 SCSI support' CONFIG_SCSI_T128 n
bool 'UltraStor SCSI support' CONFIG_SCSI_ULTRASTOR n bool 'UltraStor SCSI support' CONFIG_SCSI_ULTRASTOR n
bool '7000FASST SCSI support' CONFIG_SCSI_7000FASST n bool '7000FASST SCSI support' CONFIG_SCSI_7000FASST n
bool 'EISA EATA support' CONFIG_SCSI_EATA n bool 'EATA ISA/EISA (DPT PM2011/021/012/022/122/322) support' CONFIG_SCSI_EATA n
#bool 'SCSI debugging host adapter' CONFIG_SCSI_DEBUG n #bool 'SCSI debugging host adapter' CONFIG_SCSI_DEBUG n
fi fi
...@@ -196,6 +196,7 @@ bool 'System V and Coherent filesystem support' CONFIG_SYSV_FS n ...@@ -196,6 +196,7 @@ bool 'System V and Coherent filesystem support' CONFIG_SYSV_FS n
comment 'character devices' comment 'character devices'
bool 'Cyclades async mux support' CONFIG_CYCLADES n
bool 'Parallel printer support' CONFIG_PRINTER n bool 'Parallel printer support' CONFIG_PRINTER n
bool 'Logitech busmouse support' CONFIG_BUSMOUSE n bool 'Logitech busmouse support' CONFIG_BUSMOUSE n
bool 'PS/2 mouse (aka "auxiliary device") support' CONFIG_PSMOUSE n bool 'PS/2 mouse (aka "auxiliary device") support' CONFIG_PSMOUSE n
......
/* vac.c: Routines for flushing various amount of the Sparc VAC
(virtual address cache).
Copyright (C) 1994 David S. Miller (davem@caip.rutgers.edu)
*/
#include <asm/vac-ops.h>
/* Flush all VAC entries for the current context */
extern int do_hw_vac_flushes, vac_size, vac_linesize;
extern int vac_entries_per_context, vac_entries_per_segment;
extern int vac_entries_per_page;
void
flush_vac_context()
{
register int entries_left, offset;
register char* address;
entries_left = vac_entries_per_context;
address = (char *) 0;
if(do_hw_vac_flushes)
{
while(entries_left-- >=0)
{
hw_flush_vac_context_entry(address);
address += 4096;
}
}
else
{
offset = vac_linesize;
while(entries_left-- >=0)
{
sw_flush_vac_context_entry(address);
address += offset;
}
}
}
void
flush_vac_segment(register unsigned int segment)
{
register int entries_left, offset;
register char* address;
entries_left = vac_entries_per_segment;
__asm__ __volatile__("sll %0, 18, %1\n\t"
"sra %1, 0x2, %1\n\t"
: "=r" (segment) : "0" (address));
if(do_hw_vac_flushes)
{
while(entries_left-- >=0)
{
hw_flush_vac_segment_entry(address);
address += 4096;
}
}
else
{
offset = vac_linesize;
while(entries_left-- >=0)
{
sw_flush_vac_segment_entry(address);
address += offset;
}
}
}
void
flush_vac_page(register unsigned int addr)
{
register int entries_left, offset;
if(do_hw_vac_flushes)
{
hw_flush_vac_page_entry(addr);
}
else
{
entries_left = vac_entries_per_page;
offset = vac_linesize;
while(entries_left-- >=0)
{
sw_flush_vac_page_entry(addr);
addr += offset;
}
}
}
This README belongs to release 2.8 or newer of the SoundBlaster Pro This README belongs to release 2.9 or newer of the SoundBlaster Pro
(Matsushita, Kotobuki, Panasonic, CreativeLabs) CD-ROM driver for Linux. (Matsushita, Kotobuki, Panasonic, CreativeLabs, Longshine and soon TEAC, too)
CD-ROM driver for Linux.
The driver is able to drive the whole family of "traditional" IDE-style (that The driver is able to drive the whole family of "traditional" IDE-style (that
has nothing to do with the new "Enhanced IDE" drive standard) Matsushita, has nothing to do with the new "Enhanced IDE" drive standard) Matsushita,
...@@ -7,26 +8,36 @@ Kotobuki, Panasonic drives, sometimes labelled as "CreativeLabs". The ...@@ -7,26 +8,36 @@ Kotobuki, Panasonic drives, sometimes labelled as "CreativeLabs". The
well-known drives are CR-521, CR-522, CR-523, CR-562, CR-563. well-known drives are CR-521, CR-522, CR-523, CR-562, CR-563.
The Longshine LCS-7260 is a double-speed drive which uses the "old" The Longshine LCS-7260 is a double-speed drive which uses the "old"
Matsushita command set. It should be fully supported soon, too. Matsushita command set. It is supported now - with help by Serge Robyns.
There exists an "IBM External ISA CD-ROM Drive" which in fact is a CR-562 There exists an "IBM External ISA CD-ROM Drive" which in fact is a CR-563
with a special controller board. This drive is supported (the interface is with a special controller board. This drive is supported (the interface is
of the "LaserMate" type), and it is possibly the best buy today (cheaper than of the "LaserMate" type), and it is possibly the best buy today (cheaper than
an internal drive, and you can use it as an internal, too - f.e. plug it into an internal drive, and you can use it as an internal, too - f.e. plug it into
a soundcard). If you own such a drive, please mail me the DOS driver (gzipped a soundcard).
and uuencoded) and the specifications (exact name, address range etc.) I still
have to confirm my opinion. ;-) The quad-speed TEAC CD-55A drive uses the same interface types, but has a
totally different command and flow control scheme. It is not supported yet,
but I plan to add it.
CreativeLabs has a new drive "CD-200". This drive is not supported yet, but
I plan to add it.
This driver is NOT for Mitsumi or Sony or Aztech or Philips or XXX drives. This driver is NOT for Mitsumi or Sony or Aztech or Philips or XXX drives.
The matter that some other brand's drives work with newer sound card For Aztech CDA-268 drives (and for some Wearnes, Okano and Orchid drives),
interfaces does NOT make the drives compatible. :-) Werner Zimmermann has done a driver which currently resides at ftp.gwdg.de
under /pub/linux/cdrom/drivers/aztech/.
It will work with the soundcard interfaces (SB Pro, SB 16, Galaxy, SoundFX, This driver will work with the soundcard interfaces (SB Pro, SB 16, Galaxy,
...) and/or with the "no-sound" cards (Panasonic CI-101P, LaserMate, SoundFX, ...) and/or with the "no-sound" cards (Panasonic CI-101P, LaserMate,
WDH-7001C, Longshine LCS-6853, older Aztech cards, ...). WDH-7001C, Longshine LCS-6853, older Aztech cards, ...).
It should work too now with the "configurable" interface "Sequoia S-1000", It should work too now with the "configurable" interface "Sequoia S-1000",
which is found on the Spea Media FX sound card. I still need feedback about which is found on the Spea Media FX sound card. I still need feedback about
this. this, or such a card. Anyways, the procedure "boot DOS and wait until
CONFIG.SYS is done, then use CTL-ALT-DEL to boot Linux" should make it
work.
The interface type has to get configured in /usr/include/linux/sbpcd.h, The interface type has to get configured in /usr/include/linux/sbpcd.h,
because the behavior of some sound card interfaces is different. because the behavior of some sound card interfaces is different.
...@@ -252,6 +263,70 @@ main(int argc, char *argv[]) ...@@ -252,6 +263,70 @@ main(int argc, char *argv[])
} }
/*===================== end program ========================================*/ /*===================== end program ========================================*/
There is a new ioctl CDROMMULTISESSION to obtain with a user program if
the CD is an XA disk and - if it is - where the last session starts. The
following example illustrates how to call it:
/*=================== begin program ========================================*/
/*
* ask for multisession redirection info
*
* (c) 1994 Eberhard Moenkeberg <emoenke@gwdg.de>
* may be used & enhanced freely
*
*/
#include <stdio.h>
#include <sys/ioctl.h>
#include <linux/cdrom.h>
static struct cdrom_multisession ms_info;
static int drive;
static int err;
main(int argc, char *argv[])
{
/*
* open /dev/cdrom
*/
drive=open("/dev/cdrom", 0);
if (drive<0)
{
fprintf(stderr, "can't open drive /dev/cdrom.\n");
exit (-1);
}
/*
*
*/
ms_info.addr_format=CDROM_LBA;
err=ioctl(drive, CDROMMULTISESSION, &ms_info);
if (err!=0)
{
fprintf(stderr, "CDROMMULTISESSION(lba) returns error %d.\n", err);
exit (-1);
}
else
if (ms_info.xa_flag)
fprintf(stdout, "lba: %d\n", ms_info.addr.lba);
else
fprintf(stdout, "not an XA disk.\n");
ms_info.addr_format=CDROM_MSF;
err=ioctl(drive, CDROMMULTISESSION, &ms_info);
if (err!=0)
{
fprintf(stderr, "CDROMMULTISESSION(msf) returns error %d.\n", err);
exit (-1);
}
else
if (ms_info.xa_flag)
fprintf(stdout, "msf: %02d:%02d:%02d\n",
ms_info.addr.msf.minute,
ms_info.addr.msf.second,
ms_info.addr.msf.frame);
else
fprintf(stdout, "not an XA disk.\n");
}
/*===================== end program ========================================*/
Auto-probing at boot time: Auto-probing at boot time:
......
This diff is collapsed.
...@@ -25,6 +25,11 @@ SRCS = tty_io.c n_tty.c console.c keyboard.c serial.c \ ...@@ -25,6 +25,11 @@ SRCS = tty_io.c n_tty.c console.c keyboard.c serial.c \
defkeymap.c uni_to_437.c defkeymap.c uni_to_437.c
ifdef CONFIG_CYCLADES
OBJS := $(OBJS) cyclades.o
SRCS := $(SRCS) cyclades.c
endif
ifdef CONFIG_ATIXL_BUSMOUSE ifdef CONFIG_ATIXL_BUSMOUSE
M = y M = y
OBJS := $(OBJS) atixlmouse.o OBJS := $(OBJS) atixlmouse.o
......
This diff is collapsed.
...@@ -82,8 +82,8 @@ unsigned char kbd_read_mask = 0x01; /* modified by psaux.c */ ...@@ -82,8 +82,8 @@ unsigned char kbd_read_mask = 0x01; /* modified by psaux.c */
/* /*
* global state includes the following, and various static variables * global state includes the following, and various static variables
* in this module: prev_scancode, shift_state, diacr, npadch, * in this module: prev_scancode, shift_state, diacr, npadch, dead_key_next.
* dead_key_next, last_console * (last_console is now a global variable)
*/ */
/* shift state counters.. */ /* shift state counters.. */
...@@ -91,8 +91,8 @@ static unsigned char k_down[NR_SHIFT] = {0, }; ...@@ -91,8 +91,8 @@ static unsigned char k_down[NR_SHIFT] = {0, };
/* keyboard key bitmap */ /* keyboard key bitmap */
static unsigned long key_down[8] = { 0, }; static unsigned long key_down[8] = { 0, };
extern int last_console;
static int want_console = -1; static int want_console = -1;
static int last_console = 0; /* last used VC */
static int dead_key_next = 0; static int dead_key_next = 0;
/* /*
* In order to retrieve the shift_state (for the mouse server), either * In order to retrieve the shift_state (for the mouse server), either
...@@ -190,7 +190,7 @@ void to_utf8(ushort c) { ...@@ -190,7 +190,7 @@ void to_utf8(ushort c) {
put_queue(0x80 | ((c >> 6) & 0x3f)); put_queue(0x80 | ((c >> 6) & 0x3f));
put_queue(0x80 | (c & 0x3f)); put_queue(0x80 | (c & 0x3f));
} }
/* utf-8 is defined for words of up to 36 bits, /* UTF-8 is defined for words of up to 31 bits,
but we need only 16 bits here */ but we need only 16 bits here */
} }
...@@ -1131,7 +1131,6 @@ static void kbd_bh(void * unused) ...@@ -1131,7 +1131,6 @@ static void kbd_bh(void * unused)
} }
if (want_console >= 0) { if (want_console >= 0) {
if (want_console != fg_console) { if (want_console != fg_console) {
last_console = fg_console;
change_console(want_console); change_console(want_console);
/* we only changed when the console had already /* we only changed when the console had already
been allocated - a new console is not created been allocated - a new console is not created
......
...@@ -1533,8 +1533,13 @@ static int get_modem_info(struct async_struct * info, unsigned int *value) ...@@ -1533,8 +1533,13 @@ static int get_modem_info(struct async_struct * info, unsigned int *value)
static int set_modem_info(struct async_struct * info, unsigned int cmd, static int set_modem_info(struct async_struct * info, unsigned int cmd,
unsigned int *value) unsigned int *value)
{ {
unsigned int arg = get_fs_long((unsigned long *) value); int error;
unsigned int arg;
error = verify_area(VERIFY_READ, value, sizeof(int));
if (error)
return error;
arg = get_fs_long((unsigned long *) value);
switch (cmd) { switch (cmd) {
case TIOCMBIS: case TIOCMBIS:
if (arg & TIOCM_RTS) { if (arg & TIOCM_RTS) {
......
...@@ -82,10 +82,12 @@ struct tty_ldisc ldiscs[NR_LDISCS]; /* line disc dispatch table */ ...@@ -82,10 +82,12 @@ struct tty_ldisc ldiscs[NR_LDISCS]; /* line disc dispatch table */
/* /*
* fg_console is the current virtual console, * fg_console is the current virtual console,
* last_console is the last used one
* redirect is the pseudo-tty that console output * redirect is the pseudo-tty that console output
* is redirected to if asked by TIOCCONS. * is redirected to if asked by TIOCCONS.
*/ */
int fg_console = 0; int fg_console = 0;
int last_console = 0;
struct tty_struct * redirect = NULL; struct tty_struct * redirect = NULL;
struct wait_queue * keypress_wait = NULL; struct wait_queue * keypress_wait = NULL;
...@@ -364,6 +366,7 @@ void do_tty_hangup(struct tty_struct * tty, struct file_operations *fops) ...@@ -364,6 +366,7 @@ void do_tty_hangup(struct tty_struct * tty, struct file_operations *fops)
tty->flags = 0; tty->flags = 0;
tty->session = 0; tty->session = 0;
tty->pgrp = -1; tty->pgrp = -1;
tty->ctrl_status = 0;
for_each_task(p) { for_each_task(p) {
if (p->tty == tty) if (p->tty == tty)
p->tty = NULL; p->tty = NULL;
...@@ -412,11 +415,11 @@ void disassociate_ctty(int priv) ...@@ -412,11 +415,11 @@ void disassociate_ctty(int priv)
if (!tty) if (!tty)
return; return;
if (tty->pgrp > 0) { if (tty->pgrp > 0) {
kill_pg(tty->pgrp, SIGHUP, priv); kill_pg(tty->pgrp, SIGHUP, priv);
kill_pg(tty->pgrp, SIGCONT, priv); kill_pg(tty->pgrp, SIGCONT, priv);
} }
tty->session = 0; tty->session = 0;
tty->pgrp = -1; tty->pgrp = -1;
...@@ -470,6 +473,7 @@ void complete_change_console(unsigned int new_console) ...@@ -470,6 +473,7 @@ void complete_change_console(unsigned int new_console)
return; return;
if (!vc_cons_allocated(new_console)) if (!vc_cons_allocated(new_console))
return; return;
last_console = fg_console;
/* /*
* If we're switching, we could be going from KD_GRAPHICS to * If we're switching, we could be going from KD_GRAPHICS to
...@@ -1685,6 +1689,9 @@ long tty_init(long kmem_start) ...@@ -1685,6 +1689,9 @@ long tty_init(long kmem_start)
kmem_start = kbd_init(kmem_start); kmem_start = kbd_init(kmem_start);
kmem_start = rs_init(kmem_start); kmem_start = rs_init(kmem_start);
#ifdef CONFIG_CYCLADES
kmem_start = cy_init(kmem_start);
#endif
kmem_start = pty_init(kmem_start); kmem_start = pty_init(kmem_start);
return kmem_start; return kmem_start;
} }
...@@ -190,6 +190,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -190,6 +190,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
* doesn't do a whole lot. i'm not sure if it should do any * doesn't do a whole lot. i'm not sure if it should do any
* restoration of modes or what... * restoration of modes or what...
*/ */
if (!suser())
return -EPERM;
switch (arg) { switch (arg) {
case KD_GRAPHICS: case KD_GRAPHICS:
break; break;
...@@ -230,6 +232,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -230,6 +232,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
return -EINVAL; return -EINVAL;
case KDSKBMODE: case KDSKBMODE:
if (!suser())
return -EPERM;
switch(arg) { switch(arg) {
case K_RAW: case K_RAW:
kbd->kbdmode = VC_RAW; kbd->kbdmode = VC_RAW;
...@@ -309,6 +313,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -309,6 +313,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
struct kbkeycode * const a = (struct kbkeycode *)arg; struct kbkeycode * const a = (struct kbkeycode *)arg;
unsigned int sc, kc; unsigned int sc, kc;
if (!suser())
return -EPERM;
i = verify_area(VERIFY_READ, (void *)a, sizeof(struct kbkeycode)); i = verify_area(VERIFY_READ, (void *)a, sizeof(struct kbkeycode));
if (i) if (i)
return i; return i;
...@@ -348,6 +354,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -348,6 +354,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
u_char s; u_char s;
u_short v; u_short v;
if (!suser())
return -EPERM;
i = verify_area(VERIFY_READ, (void *)a, sizeof(struct kbentry)); i = verify_area(VERIFY_READ, (void *)a, sizeof(struct kbentry));
if (i) if (i)
return i; return i;
...@@ -437,6 +445,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -437,6 +445,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
u_char *p; u_char *p;
char *q; char *q;
if (!suser())
return -EPERM;
i = verify_area(VERIFY_READ, (void *)a, sizeof(struct kbsentry)); i = verify_area(VERIFY_READ, (void *)a, sizeof(struct kbsentry));
if (i) if (i)
return i; return i;
...@@ -520,6 +530,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -520,6 +530,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
struct kbdiacrs *a = (struct kbdiacrs *)arg; struct kbdiacrs *a = (struct kbdiacrs *)arg;
unsigned int ct; unsigned int ct;
if (!suser())
return -EPERM;
i = verify_area(VERIFY_READ, (void *) a, sizeof(struct kbdiacrs)); i = verify_area(VERIFY_READ, (void *) a, sizeof(struct kbdiacrs));
if (i) if (i)
return i; return i;
...@@ -542,6 +554,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -542,6 +554,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
return 0; return 0;
case KDSKBLED: case KDSKBLED:
if (!suser())
return -EPERM;
if (arg & ~0x77) if (arg & ~0x77)
return -EINVAL; return -EINVAL;
kbd->ledflagstate = (arg & 7); kbd->ledflagstate = (arg & 7);
...@@ -559,6 +573,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -559,6 +573,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
return 0; return 0;
case KDSETLED: case KDSETLED:
/* OK, I'll let ordinary users run blinkenlights - zblaxell */
setledstate(kbd, arg); setledstate(kbd, arg);
return 0; return 0;
...@@ -567,6 +582,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -567,6 +582,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
struct vt_mode *vtmode = (struct vt_mode *)arg; struct vt_mode *vtmode = (struct vt_mode *)arg;
char mode; char mode;
if (!suser())
return -EPERM;
i = verify_area(VERIFY_WRITE, (void *)vtmode, sizeof(struct vt_mode)); i = verify_area(VERIFY_WRITE, (void *)vtmode, sizeof(struct vt_mode));
if (i) if (i)
return i; return i;
...@@ -642,6 +659,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -642,6 +659,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
* to preserve sanity). * to preserve sanity).
*/ */
case VT_ACTIVATE: case VT_ACTIVATE:
if (!suser())
return -EPERM;
if (arg == 0 || arg > MAX_NR_CONSOLES) if (arg == 0 || arg > MAX_NR_CONSOLES)
return -ENXIO; return -ENXIO;
arg--; arg--;
...@@ -655,6 +674,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -655,6 +674,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
* wait until the specified VT has been activated * wait until the specified VT has been activated
*/ */
case VT_WAITACTIVE: case VT_WAITACTIVE:
if (!suser())
return -EPERM;
if (arg == 0 || arg > MAX_NR_CONSOLES) if (arg == 0 || arg > MAX_NR_CONSOLES)
return -ENXIO; return -ENXIO;
arg--; arg--;
...@@ -676,6 +697,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -676,6 +697,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
* 2: completed switch-to OK * 2: completed switch-to OK
*/ */
case VT_RELDISP: case VT_RELDISP:
if (!suser())
return -EPERM;
if (vt_cons[console]->vt_mode.mode != VT_PROCESS) if (vt_cons[console]->vt_mode.mode != VT_PROCESS)
return -EINVAL; return -EINVAL;
...@@ -724,6 +747,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -724,6 +747,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
* Disallocate memory associated to VT (but leave VT1) * Disallocate memory associated to VT (but leave VT1)
*/ */
case VT_DISALLOCATE: case VT_DISALLOCATE:
if (!suser())
return -EPERM;
if (arg > MAX_NR_CONSOLES) if (arg > MAX_NR_CONSOLES)
return -ENXIO; return -ENXIO;
if (arg == 0) { if (arg == 0) {
...@@ -751,6 +776,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -751,6 +776,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
{ {
struct vt_sizes *vtsizes = (struct vt_sizes *) arg; struct vt_sizes *vtsizes = (struct vt_sizes *) arg;
ushort ll,cc; ushort ll,cc;
if (!suser())
return -EPERM;
i = verify_area(VERIFY_READ, (void *)vtsizes, sizeof(struct vt_sizes)); i = verify_area(VERIFY_READ, (void *)vtsizes, sizeof(struct vt_sizes));
if (i) if (i)
return i; return i;
...@@ -760,6 +787,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -760,6 +787,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
} }
case PIO_FONT: case PIO_FONT:
if (!suser())
return -EPERM;
return con_set_font((char *)arg); return con_set_font((char *)arg);
/* con_set_font() defined in console.c */ /* con_set_font() defined in console.c */
...@@ -768,6 +797,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -768,6 +797,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
/* con_get_font() defined in console.c */ /* con_get_font() defined in console.c */
case PIO_SCRNMAP: case PIO_SCRNMAP:
if (!suser())
return -EPERM;
return con_set_trans((char *)arg); return con_set_trans((char *)arg);
/* con_set_trans() defined in console.c */ /* con_set_trans() defined in console.c */
......
...@@ -75,6 +75,7 @@ dummy_init(struct device *dev) ...@@ -75,6 +75,7 @@ dummy_init(struct device *dev)
/* Fill in the fields of the device structure with ethernet-generic values. */ /* Fill in the fields of the device structure with ethernet-generic values. */
ether_setup(dev); ether_setup(dev);
dev->flags |= IFF_NOARP;
return 0; return 0;
} }
......
...@@ -686,6 +686,8 @@ eexp_get_stats(struct device *dev) ...@@ -686,6 +686,8 @@ eexp_get_stats(struct device *dev)
static void static void
set_multicast_list(struct device *dev, int num_addrs, void *addrs) set_multicast_list(struct device *dev, int num_addrs, void *addrs)
{ {
/* This doesn't work yet */
#if 0
short ioaddr = dev->base_addr; short ioaddr = dev->base_addr;
if (num_addrs < 0) { if (num_addrs < 0) {
/* Not written yet, this requires expanding the init_words config /* Not written yet, this requires expanding the init_words config
...@@ -702,6 +704,7 @@ set_multicast_list(struct device *dev, int num_addrs, void *addrs) ...@@ -702,6 +704,7 @@ set_multicast_list(struct device *dev, int num_addrs, void *addrs)
cmd. */ cmd. */
outw(99, ioaddr); /* Disable promiscuous mode, use normal mode */ outw(99, ioaddr); /* Disable promiscuous mode, use normal mode */
} }
#endif
} }
/* The horrible routine to read a word from the serial EEPROM. */ /* The horrible routine to read a word from the serial EEPROM. */
......
/* $Id: plip.c,v 1.7 1994/12/16 06:20:02 gniibe Exp $ */
/* plip.c: A parallel port "network" driver for linux. */ /* plip.c: A parallel port "network" driver for linux. */
/* This driver is for parallel port with 5-bit cable (LapLink (R) cable). */ /* This driver is for parallel port with 5-bit cable (LapLink (R) cable). */
/* /*
...@@ -31,7 +32,7 @@ static char *version = ...@@ -31,7 +32,7 @@ static char *version =
#ifdef MODULE #ifdef MODULE
"MODULAR " "MODULAR "
#endif #endif
"PLIP.014 gniibe@mri.co.jp\n"; "PLIP $Revision: 1.7 $ gniibe@mri.co.jp\n";
#include <linux/config.h> #include <linux/config.h>
...@@ -110,9 +111,9 @@ static unsigned int net_debug = NET_DEBUG; ...@@ -110,9 +111,9 @@ static unsigned int net_debug = NET_DEBUG;
/* Nibble time out = PLIP_NIBBLE_WAIT * PLIP_DELAY_UNIT usec */ /* Nibble time out = PLIP_NIBBLE_WAIT * PLIP_DELAY_UNIT usec */
#define PLIP_NIBBLE_WAIT 5000 #define PLIP_NIBBLE_WAIT 5000
#define PAR_DATA(dev) (dev->base_addr+0) #define PAR_DATA(dev) ((dev)->base_addr+0)
#define PAR_STATUS(dev) (dev->base_addr+1) #define PAR_STATUS(dev) ((dev)->base_addr+1)
#define PAR_CONTROL(dev) (dev->base_addr+2) #define PAR_CONTROL(dev) ((dev)->base_addr+2)
/* Index to functions, as function prototypes. */ /* Index to functions, as function prototypes. */
static int plip_tx_packet(struct sk_buff *skb, struct device *dev); static int plip_tx_packet(struct sk_buff *skb, struct device *dev);
...@@ -226,6 +227,8 @@ plip_init(struct device *dev) ...@@ -226,6 +227,8 @@ plip_init(struct device *dev)
} }
} }
snarf_region(PAR_DATA(dev), 3);
/* Fill in the generic fields of the device structure. */ /* Fill in the generic fields of the device structure. */
ether_setup(dev); ether_setup(dev);
...@@ -297,6 +300,8 @@ plip_bh(struct device *dev) ...@@ -297,6 +300,8 @@ plip_bh(struct device *dev)
case PLIP_CN_RECEIVE: case PLIP_CN_RECEIVE:
sti(); sti();
disable_irq(dev->irq); disable_irq(dev->irq);
outb(LP_PINITP|LP_PSELECP, PAR_CONTROL(dev));
outb(0x01, PAR_DATA(dev)); /* send ACK */
dev->interrupt = 0; dev->interrupt = 0;
result = plip_receive_packet(dev); result = plip_receive_packet(dev);
if (result == 0) { /* success */ if (result == 0) { /* success */
...@@ -307,9 +312,11 @@ plip_bh(struct device *dev) ...@@ -307,9 +312,11 @@ plip_bh(struct device *dev)
netif_rx(skb); netif_rx(skb);
if (snd->state != PLIP_PK_DONE) { if (snd->state != PLIP_PK_DONE) {
nl->connection = PLIP_CN_SEND; nl->connection = PLIP_CN_SEND;
outb(LP_PINITP|LP_PSELECP|LP_PINTEN, PAR_CONTROL(dev));
enable_irq(dev->irq); enable_irq(dev->irq);
} else { } else {
nl->connection = PLIP_CN_NONE; nl->connection = PLIP_CN_NONE;
outb(LP_PINITP|LP_PSELECP|LP_PINTEN, PAR_CONTROL(dev));
enable_irq(dev->irq); enable_irq(dev->irq);
return; return;
} }
...@@ -340,6 +347,7 @@ plip_bh(struct device *dev) ...@@ -340,6 +347,7 @@ plip_bh(struct device *dev)
snd->skb = NULL; snd->skb = NULL;
nl->connection = PLIP_CN_CLOSING; nl->connection = PLIP_CN_CLOSING;
queue_task(&nl->deferred, &tq_timer); queue_task(&nl->deferred, &tq_timer);
outb(LP_PINITP|LP_PSELECP|LP_PINTEN, PAR_CONTROL(dev));
enable_irq(dev->irq); enable_irq(dev->irq);
return; return;
} else } else
...@@ -359,6 +367,7 @@ plip_bh(struct device *dev) ...@@ -359,6 +367,7 @@ plip_bh(struct device *dev)
if (result == 0) { if (result == 0) {
nl->connection = PLIP_CN_NONE; nl->connection = PLIP_CN_NONE;
dev->tbusy = 0; dev->tbusy = 0;
outb(LP_PINITP|LP_PSELECP|LP_PINTEN, PAR_CONTROL(dev));
enable_irq(dev->irq); enable_irq(dev->irq);
return; return;
} else { } else {
...@@ -392,6 +401,7 @@ plip_bh(struct device *dev) ...@@ -392,6 +401,7 @@ plip_bh(struct device *dev)
dev_kfree_skb(rcv->skb, FREE_WRITE); dev_kfree_skb(rcv->skb, FREE_WRITE);
} }
disable_irq(dev->irq); disable_irq(dev->irq);
outb(LP_PINITP|LP_PSELECP, PAR_CONTROL(dev));
dev->tbusy = 1; dev->tbusy = 1;
nl->connection = PLIP_CN_ERROR; nl->connection = PLIP_CN_ERROR;
outb(0x00, PAR_DATA(dev)); outb(0x00, PAR_DATA(dev));
...@@ -542,6 +552,7 @@ plip_device_clear(struct device *dev) ...@@ -542,6 +552,7 @@ plip_device_clear(struct device *dev)
cli(); cli();
dev->tbusy = 0; dev->tbusy = 0;
sti(); sti();
outb(LP_PINITP|LP_PSELECP|LP_PINTEN, PAR_CONTROL(dev));
enable_irq(dev->irq); enable_irq(dev->irq);
} }
...@@ -702,7 +713,6 @@ plip_interrupt(int reg_ptr) ...@@ -702,7 +713,6 @@ plip_interrupt(int reg_ptr)
printk("plip: spurious interrupt\n"); printk("plip: spurious interrupt\n");
return; return;
} }
outb(0x01, PAR_DATA(dev)); /* send ACK */
dev->interrupt = 1; dev->interrupt = 1;
if (net_debug > 3) if (net_debug > 3)
printk("%s: interrupt.\n", dev->name); printk("%s: interrupt.\n", dev->name);
...@@ -809,6 +819,7 @@ plip_send_packet(struct device *dev) ...@@ -809,6 +819,7 @@ plip_send_packet(struct device *dev)
c0 = inb(PAR_STATUS(dev)); c0 = inb(PAR_STATUS(dev));
if (c0 & 0x08) { if (c0 & 0x08) {
disable_irq(dev->irq); disable_irq(dev->irq);
outb(LP_PINITP|LP_PSELECP, PAR_CONTROL(dev));
if (net_debug > 3) if (net_debug > 3)
printk("+"); printk("+");
/* OK, connection established! */ /* OK, connection established! */
...@@ -952,16 +963,19 @@ cleanup_module(void) ...@@ -952,16 +963,19 @@ cleanup_module(void)
else { else {
if (dev_plip0.priv) { if (dev_plip0.priv) {
unregister_netdev(&dev_plip0); unregister_netdev(&dev_plip0);
release_region(PAR_DATA(&dev_plip0), 3);
kfree_s(dev_plip0.priv, sizeof(struct net_local)); kfree_s(dev_plip0.priv, sizeof(struct net_local));
dev_plip0.priv = NULL; dev_plip0.priv = NULL;
} }
if (dev_plip1.priv) { if (dev_plip1.priv) {
unregister_netdev(&dev_plip1); unregister_netdev(&dev_plip1);
release_region(PAR_DATA(&dev_plip1), 3);
kfree_s(dev_plip1.priv, sizeof(struct net_local)); kfree_s(dev_plip1.priv, sizeof(struct net_local));
dev_plip1.priv = NULL; dev_plip1.priv = NULL;
} }
if (dev_plip2.priv) { if (dev_plip2.priv) {
unregister_netdev(&dev_plip2); unregister_netdev(&dev_plip2);
release_region(PAR_DATA(&dev_plip2), 3);
kfree_s(dev_plip2.priv, sizeof(struct net_local)); kfree_s(dev_plip2.priv, sizeof(struct net_local));
dev_plip2.priv = NULL; dev_plip2.priv = NULL;
} }
......
...@@ -262,6 +262,13 @@ int wd_probe1(struct device *dev, int ioaddr) ...@@ -262,6 +262,13 @@ int wd_probe1(struct device *dev, int ioaddr)
dev->stop = &wd_close_card; dev->stop = &wd_close_card;
NS8390_init(dev, 0); NS8390_init(dev, 0);
#if 1
/* Enable interrupt generation on softconfig cards -- M.U */
/* .. but possibly potentially unsafe - Donald */
if (inb(ioaddr+14) & 0x20)
outb(inb(ioaddr+4)|0x80, ioaddr+4);
#endif
return 0; return 0;
} }
......
This file contains brief information about the SCSI tape driver. This file contains brief information about the SCSI tape driver.
Last modified: Wed Nov 30 20:34:03 1994 by root@kai.home Last modified: Sat Dec 17 13:38:43 1994 by root@kai.home
BASICS BASICS
...@@ -11,8 +11,9 @@ variable block size (within buffer limits). Both the auto-rewind ...@@ -11,8 +11,9 @@ variable block size (within buffer limits). Both the auto-rewind
device number) are implemented. device number) are implemented.
By default the driver writes one filemark when the device is closed after By default the driver writes one filemark when the device is closed after
writing. Two filemarks can be optionally written. In both cases end writing and the last operation has been a write. Two filemarks can be
of data is signified by returning zero bytes for two consecutive reads. optionally written. In both cases end of data is signified by
returning zero bytes for two consecutive reads.
BUFFERING BUFFERING
...@@ -129,7 +130,8 @@ MTIOCGET Returns some status information. ...@@ -129,7 +130,8 @@ MTIOCGET Returns some status information.
mt_dsreg (shifts for the subfields are MT_ST_BLKSIZE_SHIFT and mt_dsreg (shifts for the subfields are MT_ST_BLKSIZE_SHIFT and
MT_ST_DENSITY_SHIFT). MT_ST_DENSITY_SHIFT).
The GMT_xxx status bits reflect the drive status. GMT_DR_OPEN The GMT_xxx status bits reflect the drive status. GMT_DR_OPEN
is set if there is no tape in the drive. is set if there is no tape in the drive. GMT_EOD means either
end of recorded data or end of tape. GMT_EOT means end of tape.
MISCELLANEOUS COMPILE OPTIONS MISCELLANEOUS COMPILE OPTIONS
......
This diff is collapsed.
/* /*
* eata.h - used by low-level scsi driver for EISA EATA controllers. * eata.h - used by the low-level driver for EATA/DMA SCSI host adapters.
* *
*/ */
#ifndef _EISA_EATA_H #ifndef _EATA_H
#define _EISA_EATA_H #define _EATA_H
#define EATA_VERSION "1.09.01" #include <linux/scsicam.h>
#define EATA_VERSION "1.11.00"
int eata_detect(Scsi_Host_Template *); int eata_detect(Scsi_Host_Template *);
int eata_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); int eata_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int eata_abort(Scsi_Cmnd *); int eata_abort(Scsi_Cmnd *);
int eata_reset(Scsi_Cmnd *); int eata_reset(Scsi_Cmnd *);
int eata_bios_param(Disk *, int, int*);
#define EATA { NULL, /* Ptr for modules */ \ #define EATA { NULL, /* Ptr for modules */ \
NULL, /* usage count for modules */ \ NULL, /* usage count for modules */ \
"EISA EATA 2.0A rev. " EATA_VERSION " by " \ "EATA/DMA 2.0A rev. " EATA_VERSION " by " \
"Dario_Ballabio@milano.europe.dg.com.", \ "Dario_Ballabio@milano.europe.dg.com.", \
eata_detect, \ eata_detect, \
NULL, /* Release */ \ NULL, /* Release */ \
...@@ -25,13 +26,13 @@ int eata_bios_param(Disk *, int, int*); ...@@ -25,13 +26,13 @@ int eata_bios_param(Disk *, int, int*);
eata_abort, \ eata_abort, \
eata_reset, \ eata_reset, \
NULL, \ NULL, \
eata_bios_param, \ scsicam_bios_param, \
0, /* can_queue, reset by detect */ \ 0, /* can_queue, reset by detect */ \
7, /* this_id, reset by detect */ \ 7, /* this_id, reset by detect */ \
0, /* sg_tablesize, reset by detect */ \ 0, /* sg_tablesize, reset by detect */ \
0, /* cmd_per_lun, reset by detect */ \ 0, /* cmd_per_lun, reset by detect */ \
0, /* number of boards present */ \ 0, /* number of boards present */ \
0, /* unchecked isa dma */ \ 0, /* unchecked isa dma, reset by detect */ \
ENABLE_CLUSTERING \ ENABLE_CLUSTERING \
} }
#endif #endif
...@@ -313,6 +313,30 @@ unsigned int scsi_init() ...@@ -313,6 +313,30 @@ unsigned int scsi_init()
} }
printk ("scsi : %d hosts.\n", count); printk ("scsi : %d hosts.\n", count);
{
int block_count = 0, index;
struct Scsi_Host * sh[128], * shpnt;
for(shpnt=scsi_hostlist; shpnt; shpnt = shpnt->next)
if (shpnt->block) sh[block_count++] = shpnt;
if (block_count == 1) sh[0]->block = NULL;
else if (block_count > 1) {
for(index = 0; index < block_count - 1; index++) {
sh[index]->block = sh[index + 1];
printk("scsi%d : added to blocked host list.\n",
sh[index]->host_no);
}
sh[block_count - 1]->block = sh[0];
printk("scsi%d : added to blocked host list.\n",
sh[index]->host_no);
}
}
/* Now attach the high level drivers */ /* Now attach the high level drivers */
#ifdef CONFIG_BLK_DEV_SD #ifdef CONFIG_BLK_DEV_SD
scsi_register_device(&sd_template); scsi_register_device(&sd_template);
......
...@@ -228,8 +228,6 @@ typedef struct SHT ...@@ -228,8 +228,6 @@ typedef struct SHT
be two Scsi_Host entries, but only 1 Scsi_Host_Template entries. be two Scsi_Host entries, but only 1 Scsi_Host_Template entries.
*/ */
#define SCSI_HOST_BLOCK 0x80
struct Scsi_Host struct Scsi_Host
{ {
struct Scsi_Host * next; struct Scsi_Host * next;
......
This diff is collapsed.
...@@ -234,8 +234,10 @@ extern const unsigned char scsi_command_size[8]; ...@@ -234,8 +234,10 @@ extern const unsigned char scsi_command_size[8];
#define TYPE_DISK 0x00 #define TYPE_DISK 0x00
#define TYPE_TAPE 0x01 #define TYPE_TAPE 0x01
#define TYPE_PROCESSOR 0x03 /* HP scanners use this */
#define TYPE_WORM 0x04 /* Treated as ROM by our system */ #define TYPE_WORM 0x04 /* Treated as ROM by our system */
#define TYPE_ROM 0x05 #define TYPE_ROM 0x05
#define TYPE_SCANNER 0x06
#define TYPE_MOD 0x07 /* Magneto-optical disk - treated as TYPE_DISK */ #define TYPE_MOD 0x07 /* Magneto-optical disk - treated as TYPE_DISK */
#define TYPE_NO_LUN 0x7f #define TYPE_NO_LUN 0x7f
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
#include "scsi_ioctl.h" #include "scsi_ioctl.h"
#define MAX_RETRIES 5 #define MAX_RETRIES 5
#define MAX_TIMEOUT 200 #define MAX_TIMEOUT 900
#define MAX_BUF 4096 #define MAX_BUF 4096
#define max(a,b) (((a) > (b)) ? (a) : (b)) #define max(a,b) (((a) > (b)) ? (a) : (b))
......
This diff is collapsed.
This diff is collapsed.
/* /*
* u14-34f.h - used by low-level scsi driver for UltraStor 14F/34F * u14-34f.h - used by the low-level driver for UltraStor 14F/34F
*/ */
#ifndef _U14_34F_H #ifndef _U14_34F_H
#define _U14_34F_H #define _U14_34F_H
...@@ -10,7 +10,7 @@ int u14_34f_abort(Scsi_Cmnd *); ...@@ -10,7 +10,7 @@ int u14_34f_abort(Scsi_Cmnd *);
int u14_34f_reset(Scsi_Cmnd *); int u14_34f_reset(Scsi_Cmnd *);
int u14_34f_biosparam(Disk *, int, int *); int u14_34f_biosparam(Disk *, int, int *);
#define U14_34F_VERSION "1.11.01" #define U14_34F_VERSION "1.12.04"
#define ULTRASTOR_14_34F { \ #define ULTRASTOR_14_34F { \
NULL, \ NULL, \
......
...@@ -777,12 +777,7 @@ void brelse(struct buffer_head * buf) ...@@ -777,12 +777,7 @@ void brelse(struct buffer_head * buf)
{ {
if (!buf) if (!buf)
return; return;
/*
* Hmm.. Leaving this in for now, as I'm a bit nervous about it..
*/
#if 0
wait_on_buffer(buf); wait_on_buffer(buf);
#endif
/* If dirty, mark the time this buffer should be written back */ /* If dirty, mark the time this buffer should be written back */
set_writetime(buf, 0); set_writetime(buf, 0);
......
...@@ -17,6 +17,11 @@ ...@@ -17,6 +17,11 @@
#include <linux/malloc.h> #include <linux/malloc.h>
#include <linux/errno.h> #include <linux/errno.h>
#define MULTISESSION /* emoenke@gwdg.de */
#ifdef MULTISESSION
#include <linux/cdrom.h>
#endif MULTISESSION
#include <asm/system.h> #include <asm/system.h>
#include <asm/segment.h> #include <asm/segment.h>
...@@ -145,6 +150,14 @@ struct super_block *isofs_read_super(struct super_block *s,void *data, ...@@ -145,6 +150,14 @@ struct super_block *isofs_read_super(struct super_block *s,void *data,
unsigned int blocksize_bits; unsigned int blocksize_bits;
int high_sierra; int high_sierra;
int dev=s->s_dev; int dev=s->s_dev;
#ifdef MULTISESSION
int i;
unsigned int vol_desc_start;
unsigned int *p_vol_desc_start=&vol_desc_start;
struct inode inode_fake;
struct file file_fake;
extern struct file_operations * get_blkfops(unsigned int);
#endif MULTISESSION
struct iso_volume_descriptor *vdp; struct iso_volume_descriptor *vdp;
struct hs_volume_descriptor *hdp; struct hs_volume_descriptor *hdp;
...@@ -184,7 +197,27 @@ struct super_block *isofs_read_super(struct super_block *s,void *data, ...@@ -184,7 +197,27 @@ struct super_block *isofs_read_super(struct super_block *s,void *data,
s->u.isofs_sb.s_high_sierra = high_sierra = 0; /* default is iso9660 */ s->u.isofs_sb.s_high_sierra = high_sierra = 0; /* default is iso9660 */
#ifdef MULTISESSION
/*
* look if the driver can tell the multi session redirection
* value; this allows to do the redirection if we are looking
* for the volume descriptor, and to avoid it during "raw" access.
*/
vol_desc_start=0;
inode_fake.i_rdev=dev;
i=get_blkfops(MAJOR(dev))->ioctl(&inode_fake,
&file_fake,
CDROMMULTISESSION_SYS,
(unsigned long) p_vol_desc_start);
if (i!=0) vol_desc_start=0;
#if 0
printk("isofs.inode: CDROMMULTISESSION_SYS rc=%d\n",i);
printk("isofs.inode: vol_desc_start = %d\n", vol_desc_start);
#endif
for (iso_blknum = vol_desc_start+16; iso_blknum < vol_desc_start+100; iso_blknum++) {
#else
for (iso_blknum = 16; iso_blknum < 100; iso_blknum++) { for (iso_blknum = 16; iso_blknum < 100; iso_blknum++) {
#endif MULTISESSION
if (!(bh = bread(dev, iso_blknum << (ISOFS_BLOCK_BITS-blocksize_bits), opt.blocksize))) { if (!(bh = bread(dev, iso_blknum << (ISOFS_BLOCK_BITS-blocksize_bits), opt.blocksize))) {
s->s_dev=0; s->s_dev=0;
printk("isofs_read_super: bread failed, dev 0x%x iso_blknum %d\n", printk("isofs_read_super: bread failed, dev 0x%x iso_blknum %d\n",
......
...@@ -147,6 +147,11 @@ asmlinkage int sys_utime(char * filename, struct utimbuf * times) ...@@ -147,6 +147,11 @@ asmlinkage int sys_utime(char * filename, struct utimbuf * times)
} }
/* Don't worry, the checks are done in inode_change_ok() */ /* Don't worry, the checks are done in inode_change_ok() */
if (times) { if (times) {
error = verify_area(VERIFY_READ, times, sizeof(*times));
if (error) {
iput(inode);
return error;
}
actime = get_fs_long((unsigned long *) &times->actime); actime = get_fs_long((unsigned long *) &times->actime);
modtime = get_fs_long((unsigned long *) &times->modtime); modtime = get_fs_long((unsigned long *) &times->modtime);
newattrs.ia_ctime = CURRENT_TIME; newattrs.ia_ctime = CURRENT_TIME;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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