diff options
author | Linus Torvalds <torvalds@cc.helsinki.fi> | 1994-03-06 16:14:51 +0000 |
---|---|---|
committer | Nicolas Pitre <nico@cam.org> | 2007-08-19 14:19:35 -0400 |
commit | 73907e3b1b8e4719e039eb6b46b2f376e952356c (patch) | |
tree | 62dbdca66dc899710d49882ca023a950a33fa82c | |
parent | 61bfd4ff199f5fb360c106073461e550e2ed5f0c (diff) | |
download | archive-73907e3b1b8e4719e039eb6b46b2f376e952356c.tar.gz |
Linux 1.0-pre1v1.0-pre1
-rw-r--r-- | Makefile | 6 | ||||
-rw-r--r-- | drivers/block/Makefile | 3 | ||||
-rw-r--r-- | drivers/block/README.sbpcd | 24 | ||||
-rw-r--r-- | drivers/block/mcd.c | 5 | ||||
-rw-r--r-- | drivers/block/sbpcd.c | 114 | ||||
-rw-r--r-- | drivers/char/keyboard.c | 18 | ||||
-rw-r--r-- | drivers/net/3c501.c | 5 | ||||
-rw-r--r-- | drivers/net/3c503.c | 18 | ||||
-rw-r--r-- | drivers/net/3c507.c | 2 | ||||
-rw-r--r-- | drivers/net/at1700.c | 15 | ||||
-rw-r--r-- | drivers/net/depca.c | 10 | ||||
-rw-r--r-- | drivers/net/eexpress.c | 8 | ||||
-rw-r--r-- | drivers/net/hp.c | 33 | ||||
-rw-r--r-- | drivers/net/lance.c | 12 | ||||
-rw-r--r-- | drivers/net/ne.c | 5 | ||||
-rw-r--r-- | drivers/net/slip.c | 45 | ||||
-rw-r--r-- | fs/exec.c | 1 | ||||
-rw-r--r-- | include/linux/keyboard.h | 8 | ||||
-rw-r--r-- | include/linux/msg.h | 2 | ||||
-rw-r--r-- | include/linux/sbpcd.h | 13 | ||||
-rw-r--r-- | include/linux/sched.h | 3 | ||||
-rw-r--r-- | include/linux/timex.h | 2 | ||||
-rw-r--r-- | kernel/fork.c | 1 | ||||
-rw-r--r-- | kernel/sys.c | 49 | ||||
-rw-r--r-- | net/inet/ip.c | 2 | ||||
-rw-r--r-- | net/inet/tcp.c | 13 | ||||
-rw-r--r-- | net/unix/proc.c | 3 | ||||
-rw-r--r-- | net/unix/sock.c | 12 | ||||
-rw-r--r-- | net/unix/unix.h | 4 |
29 files changed, 218 insertions, 218 deletions
@@ -1,6 +1,6 @@ -VERSION = 0.99 -PATCHLEVEL = 15 -ALPHA = j +VERSION = pre-1 +PATCHLEVEL = 0 +ALPHA = all: Version zImage diff --git a/drivers/block/Makefile b/drivers/block/Makefile index bc0dfc5..c1e022a 100644 --- a/drivers/block/Makefile +++ b/drivers/block/Makefile @@ -37,9 +37,6 @@ endif ifdef CONFIG_SBPCD OBJS := $(OBJS) sbpcd.o SRCS := $(SRCS) sbpcd.c -ifdef PATCHLEVEL -CFLAGS := $(CFLAGS) -DPATCHLEVEL=$(PATCHLEVEL) -endif endif #CONFIG_SBPCD ifdef CONFIG_BLK_DEV_HD diff --git a/drivers/block/README.sbpcd b/drivers/block/README.sbpcd index 5b5dd1c..b34c06a 100644 --- a/drivers/block/README.sbpcd +++ b/drivers/block/README.sbpcd @@ -1,4 +1,4 @@ -This is release 1.2 of the SoundBlaster Pro (Matsushita, Kotobuki, +This is release 1.3 of the SoundBlaster Pro (Matsushita, Kotobuki, Panasonic, CreativeLabs, Aztech) CD-ROM driver for Linux. The driver is able to drive the whole family of IDE-style @@ -6,10 +6,10 @@ Matsushita/Kotobuki/Panasonic drives (the "double speed" versions like CR-562 and CR-563, too), and it will work with the soundcard interfaces (SB Pro, SB 16, Galaxy, SoundFX, ...) and/or with the "no-sound" cards (Panasonic CI-101P, LaserMate, Aztech, ...). -The interface type has to get configured, because the behavior -is different. +The interface type has to get configured in /usr/include/linux/sbpcd.h, +because the behavior is different. -The driver respects different drive firmware releases - my drive +The driver respects different drive firmware releases - my old drive is a 2.11, but it should work with "old" drives <2.01 ... >3.00 and with "new" drives (which count the releases around 0.75 or 1.00). @@ -23,20 +23,14 @@ Each drive has to get a unique minor number (0...3), corresponding to it's drive ID. The drive IDs may be selected freely from 0 to 3 - they must not be in consecutive order. -If this driver doesn't work with your equipment, mail me a -description, please. - The driver supports reading of data from the CD and playing of audio tracks. The audio part should run with WorkMan, xcdplayer, with the "non-X11" products CDplayer and WorkBone - tell me if it is not compatible with other software. MultiSession is supported, "ManySession" (see below) alternatively. -Photo CDs should work, too. At ftp.gwdg.de:/pub/linux/hpcdtoppm -is a package to convert photo CD image files. - -I did not have a chance to play with XA or mixed mode CDs yet. -Send one over, if you would like sbpcd to support that. +Photo CDs work, too. At ftp.gwdg.de:/pub/linux/hpcdtoppm/ is a package +to convert photo CD image files. The transfer rate will reach 150 kB/sec with standard drives and the full 300 kB/sec with double-speed drives. @@ -127,7 +121,7 @@ If you would like the support of reading "in-between" sessions, drop me a mail and some food for the soul. :-) Those "many-session" CDs can get made by CDROM writers like Philips CDD 521. -With this feature enabled, it is impossible to read true +If you enable this feature, it is impossible to read true multisession CDs. @@ -194,10 +188,6 @@ Known problems: Currently, the detection of disk change or removal does not work as good as it should. -Further, I do not know if this driver can live together with a -SCSI CD-ROM driver and/or device, but I hope so. - - Bug reports, comments, wishes, donations (technical information is a donation, too :-) etc. to diff --git a/drivers/block/mcd.c b/drivers/block/mcd.c index 44119ea..b3e3ccb 100644 --- a/drivers/block/mcd.c +++ b/drivers/block/mcd.c @@ -852,7 +852,10 @@ mcd_init(unsigned long mem_start, unsigned long mem_end) mcd_port); return mem_start; } - + + if (result[0] == result[1] && result[1] == result[2]) + return mem_start; + printk("mcd: Mitsumi version : %02X %c %x\n", result[0],result[1],result[2]); diff --git a/drivers/block/sbpcd.c b/drivers/block/sbpcd.c index 3312e7f..189d410 100644 --- a/drivers/block/sbpcd.c +++ b/drivers/block/sbpcd.c @@ -5,7 +5,7 @@ * and for "no-sound" interfaces like Lasermate and the * Panasonic CI-101P. * - * NOTE: This is release 1.2. + * NOTE: This is release 1.3. * It works with my SbPro & drive CR-521 V2.11 from 2/92 * and with the new CR-562-B V0.75 on a "naked" Panasonic * CI-101P interface. And vice versa. @@ -13,8 +13,8 @@ * * VERSION HISTORY * - * 0.1 initial release, April/May 93, after mcd.c - * + * 0.1 initial release, April/May 93, after mcd.c (Martin Harriss) + * * 0.2 the "repeat:"-loop in do_sbpcd_request did not check for * end-of-request_queue (resulting in kernel panic). * Flow control seems stable, but throughput is not better. @@ -60,7 +60,8 @@ * 1.2 Found the "workman with double-speed drive" bug: use the driver's * audio_state, not what the drive is reporting with ReadSubQ. * - * + * 1.3 Minor cleanups. + * Refinements regarding Workman. * * special thanks to Kai Makisara (kai.makisara@vtt.fi) for his fine * elaborated speed-up experiments (and the fabulous results!), for @@ -92,17 +93,10 @@ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ -#ifndef PATCHLEVEL -#define PATCHLEVEL 9 -#endif #include <linux/config.h> #include <linux/errno.h> -#if SBPCD_USE_IRQ -#include <linux/signal.h> -#endif SBPCD_USE_IRQ - #include <linux/sched.h> #include <linux/timer.h> #include <linux/fs.h> @@ -111,13 +105,12 @@ #include <linux/ioport.h> #include <linux/sbpcd.h> -#if PATCHLEVEL>13 +#if SBPCD_USE_IRQ +#include <linux/signal.h> +#endif SBPCD_USE_IRQ + #include <linux/ddi.h> #include <linux/major.h> -#else -#define DDIOCSDBG 0x9000 -#define MATSUSHITA_CDROM_MAJOR 25 -#endif #include <asm/system.h> #include <asm/io.h> @@ -127,14 +120,10 @@ #define MAJOR_NR MATSUSHITA_CDROM_MAJOR #include "blk.h" -#define VERSION "1.2" +#define VERSION "1.3 Eberhard Moenkeberg <emoenke@gwdg.de>" #define SBPCD_DEBUG -#ifndef CONFIG_SBPCD -#error "SBPCD: \"make config\" again. Enable Matsushita/Panasonic CDROM support" -#endif - #ifndef CONFIG_ISO9660_FS #error "SBPCD: \"make config\" again. File system iso9660 is necessary." #endif @@ -145,7 +134,7 @@ #define MANY_SESSION 0 #define CDMKE #undef FUTURE -#define WORKMAN 0 /* some testing stuff to make it better */ +#define WORKMAN 1 /* some testing stuff to make it better */ /*==========================================================================*/ /*==========================================================================*/ @@ -154,17 +143,16 @@ * inspired by Adam J. Richter from Yggdrasil * * still not good enough - can cause a hang. - * example: a NE 2000 ehernet card at 300 will cause a hang probing 310. + * example: a NE 2000 ethernet card at 300 will cause a hang probing 310. * if that happens, reboot and use the LILO (kernel) command line. - * the conflicting possible ethernet card addresses get probed last - to - * minimize the hang possibilities. + * The possibly conflicting ethernet card addresses get NOT probed + * by default - to minimize the hang possibilities. * * The SB Pro addresses get "mirrored" at 0x6xx - to avoid a type error, * the 0x2xx-addresses must get checked before 0x6xx. * - * what are other cards' default and range ??? - * what about ESCOM PowerSound??? - * what about HighScreen??? + * send mail to emoenke@gwdg.de if your interface card is not FULLY + * represented here. */ static int autoprobe[] = { @@ -181,11 +169,14 @@ static int autoprobe[] = 0x650, 0, /* "sound card #9" */ 0x670, 0, /* "sound card #9" */ 0x690, 0, /* "sound card #9" */ +#if 0 +/* some "hazardous" locations (ethernet cards) */ 0x330, 0, /* Lasermate, CI-101P */ 0x350, 0, /* Lasermate, CI-101P */ 0x370, 0, /* Lasermate, CI-101P */ 0x290, 1, /* Soundblaster 16 */ 0x310, 0, /* Lasermate, CI-101P */ +#endif }; #define NUM_AUTOPROBE (sizeof(autoprobe) / sizeof(int)) @@ -221,6 +212,8 @@ static int sbp_data(void); * (1<<DBG_DID) drive ID test * (1<<DBG_RES) drive reset info * (1<<DBG_SPI) SpinUp test info + * (1<<DBG_IOS) ioctl trace: "subchannel" + * (1<<DBG_IO2) ioctl trace: general * (1<<DBG_000) unnecessary information */ #if 1 @@ -228,6 +221,7 @@ static int sbpcd_debug = (1<<DBG_INF) | (1<<DBG_WRN); #else static int sbpcd_debug = (1<<DBG_INF) | (1<<DBG_TOC) | + (1<<DBG_IOC) | (1<<DBG_IOX); #endif static int sbpcd_ioaddr = CDROM_PORT; /* default I/O base address */ @@ -1992,9 +1986,17 @@ static int sbpcd_ioctl(struct inode *inode,struct file *file, { int i, st; - DPRINTF((DBG_IOC,"SBPCD: ioctl(%d, 0x%08lX, 0x%08lX)\n", + DPRINTF((DBG_IO2,"SBPCD: ioctl(%d, 0x%08lX, 0x%08lX)\n", MINOR(inode->i_rdev), cmd, arg)); if (!inode) return (-EINVAL); + i=MINOR(inode->i_rdev); + if ( (i<0) || (i>=NR_SBPCD) ) + { + printk("SBPCD: ioctl: bad device: %d\n", i); + return (-ENODEV); /* no such drive */ + } + switch_drive(i); + st=GetStatus(); if (st<0) return (-EIO); @@ -2004,16 +2006,7 @@ static int sbpcd_ioctl(struct inode *inode,struct file *file, if (i<0) return (-EIO); /* error reading TOC */ } - i=MINOR(inode->i_rdev); - if ( (i<0) || (i>=NR_SBPCD) ) - { - DPRINTF((DBG_INF,"SBPCD: ioctl: bad device: %d\n", i)); - return (-ENODEV); /* no such drive */ - } - switch_drive(i); - - - DPRINTF((DBG_IOC,"SBPCD: ioctl: device %d, request %04X\n",i,cmd)); + DPRINTF((DBG_IO2,"SBPCD: ioctl: device %d, request %04X\n",i,cmd)); switch (cmd) /* Sun-compatible */ { case DDIOCSDBG: /* DDI Debug */ @@ -2194,7 +2187,7 @@ static int sbpcd_ioctl(struct inode *inode,struct file *file, return (0); case CDROMSUBCHNL: /* Get subchannel info */ - DPRINTF((DBG_IOC,"SBPCD: ioctl: CDROMSUBCHNL entered.\n")); + DPRINTF((DBG_IOS,"SBPCD: ioctl: CDROMSUBCHNL entered.\n")); if ((st_spinning)||(!subq_valid)) { i=xx_ReadSubQ(); if (i<0) return (-EIO); } @@ -2235,7 +2228,7 @@ static int sbpcd_ioctl(struct inode *inode,struct file *file, SC.cdsc_reladdr.msf.frame=DS[d].SubQ_run_trk&0x00FF; } memcpy_tofs((void *) arg, &SC, sizeof(struct cdrom_subchnl)); - DPRINTF((DBG_IOC,"SBPCD: CDROMSUBCHNL: %1X %02X %08X %08X %02X %02X %06X %06X\n", + DPRINTF((DBG_IOS,"SBPCD: CDROMSUBCHNL: %1X %02X %08X %08X %02X %02X %06X %06X\n", SC.cdsc_format,SC.cdsc_audiostatus, SC.cdsc_adr,SC.cdsc_ctrl, SC.cdsc_trk,SC.cdsc_ind, @@ -2251,7 +2244,7 @@ static int sbpcd_ioctl(struct inode *inode,struct file *file, return (-EINVAL); default: - DPRINTF((DBG_IOX,"SBPCD: ioctl: unknown function request %04X\n", cmd)); + DPRINTF((DBG_IOC,"SBPCD: ioctl: unknown function request %04X\n", cmd)); return (-EINVAL); } /* end switch(cmd) */ } @@ -2353,7 +2346,7 @@ request_loop: dev = MINOR(CURRENT->dev); if ( (dev<0) || (dev>=NR_SBPCD) ) { - DPRINTF((DBG_INF,"SBPCD: do_request: bad device: %d\n", dev)); + printk("SBPCD: do_request: bad device: %d\n", dev); return; } switch_drive(dev); @@ -2364,7 +2357,7 @@ request_loop: if (CURRENT->cmd != READ) { - DPRINTF((DBG_INF,"SBPCD: bad cmd %d\n", CURRENT->cmd)); + printk("SBPCD: bad cmd %d\n", CURRENT->cmd); end_request(0); goto request_loop; } @@ -2556,8 +2549,8 @@ static int sbp_data(void) if (j&s_not_data_ready) { if ((DS[d].ored_ctl_adr&0x40)==0) - DPRINTF((DBG_INF,"SBPCD: CD contains no data tracks.\n")); - else DPRINTF((DBG_INF,"SBPCD: sbp_data: DATA_READY timeout.\n")); + printk("SBPCD: CD contains no data tracks.\n"); + else printk("SBPCD: sbp_data: DATA_READY timeout.\n"); error_flag++; break; } @@ -2665,7 +2658,7 @@ int sbpcd_open(struct inode *ip, struct file *fp) i = MINOR(ip->i_rdev); if ( (i<0) || (i>=NR_SBPCD) ) { - DPRINTF((DBG_INF,"SBPCD: open: bad device: %d\n", i)); + printk("SBPCD: open: bad device: %d\n", i); return (-ENODEV); /* no such drive */ } switch_drive(i); @@ -2683,7 +2676,7 @@ int sbpcd_open(struct inode *ip, struct file *fp) DPRINTF((DBG_STA,"SBPCD: sbpcd_open: status %02X\n", DS[d].status_byte)); if (!st_door_closed||!st_caddy_in) { - DPRINTF((DBG_INF,"SBPCD: sbpcd_open: no disk in drive\n")); + printk("SBPCD: sbpcd_open: no disk in drive\n"); return (-EIO); } @@ -2716,7 +2709,7 @@ static void sbpcd_release(struct inode * ip, struct file * file) i = MINOR(ip->i_rdev); if ( (i<0) || (i>=NR_SBPCD) ) { - DPRINTF((DBG_INF,"SBPCD: release: bad device: %d\n", i)); + printk("SBPCD: release: bad device: %d\n", i); return; } switch_drive(i); @@ -2840,19 +2833,25 @@ u_long sbpcd_init(u_long mem_start, u_long mem_end) DPRINTF((DBG_INI,"SBPCD: check_drives done.\n")); sti(); /* to avoid possible "printk" bug */ if (i>=0) break; /* drive found */ - printk ("\n"); + DPRINTF((DBG_INF,"\n")); sti(); /* to avoid possible "printk" bug */ } /* end of cycling through the set of possible I/O port addresses */ if (ndrives==0) { - DPRINTF((DBG_INF,"SBPCD: No drive found.\n")); + printk("SBPCD: No drive found.\n"); sti(); return (mem_start); } - DPRINTF((DBG_INF,"SBPCD: %d %s CD-ROM drive(s) at 0x%04X.\n", - ndrives, type, CDo_command)); + if (port_index>0) + { + printk("SBPCD: You should configure sbpcd.h for your hardware.\n"); + sti(); + } + + printk("SBPCD: %d %s CD-ROM drive(s) at 0x%04X.\n", + ndrives, type, CDo_command); sti(); /* to avoid possible "printk" bug */ check_datarate(); DPRINTF((DBG_INI,"SBPCD: check_datarate done.\n")); @@ -2908,8 +2907,8 @@ u_long sbpcd_init(u_long mem_start, u_long mem_end) if (register_blkdev(MATSUSHITA_CDROM_MAJOR, "sbpcd", &sbpcd_fops) != 0) { - DPRINTF((DBG_INF,"SBPCD: Can't get MAJOR %d for Matsushita CDROM\n", - MATSUSHITA_CDROM_MAJOR)); + printk("SBPCD: Can't get MAJOR %d for Matsushita CDROM\n", + MATSUSHITA_CDROM_MAJOR); sti(); /* to avoid possible "printk" bug */ return (mem_start); } @@ -2921,8 +2920,7 @@ u_long sbpcd_init(u_long mem_start, u_long mem_end) #if SBPCD_USE_IRQ if (irqaction(SBPCD_INTR_NR, &sbpcd_sigaction)) { - DPRINTF((DBG_INF,"SBPCD: Can't get IRQ%d for sbpcd driver\n", - SBPCD_INTR_NR)); + printk("SBPCD: Can't get IRQ%d for sbpcd driver\n", SBPCD_INTR_NR); sti(); /* to avoid possible "printk" bug */ } #endif SBPCD_USE_IRQ @@ -2954,7 +2952,7 @@ int check_sbpcd_media_change(int full_dev, int unused_minor) if (MAJOR(full_dev) != MATSUSHITA_CDROM_MAJOR) { - DPRINTF((DBG_INF,"SBPCD: media_check: invalid device.\n")); + printk("SBPCD: media_check: invalid device.\n"); return (-1); } diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c index 4ef9f62..cec5449 100644 --- a/drivers/char/keyboard.c +++ b/drivers/char/keyboard.c @@ -29,6 +29,9 @@ #define SIZE(x) (sizeof(x)/sizeof((x)[0])) +#define KBD_REPORT_ERR +#define KBD_REPORT_UNKN + #ifndef KBD_DEFMODE #define KBD_DEFMODE ((1 << VC_REPEAT) | (1 << VC_META)) #endif @@ -209,6 +212,17 @@ static void keyboard_interrupt(int int_pt_regs) } else if (scancode == 0xfe) { resend = 1; goto end_kbd_intr; + } else if (scancode == 0) { +#ifdef KBD_REPORT_ERR + printk("keyboard buffer overflow\n"); +#endif + goto end_kbd_intr; + } else if (scancode == 0xff) { +#ifdef KBD_REPORT_ERR + printk("keyboard error\n"); +#endif + prev_scancode = 0; + goto end_kbd_intr; } tty = TTY_TABLE(0); kbd = kbd_table + fg_console; @@ -267,13 +281,17 @@ static void keyboard_interrupt(int int_pt_regs) if (e0_keys[scancode]) scancode = e0_keys[scancode]; else if (!raw_mode) { +#ifdef KBD_REPORT_UNKN printk("keyboard: unknown scancode e0 %02x\n", scancode); +#endif goto end_kbd_intr; } } } else if (scancode >= E0_BASE && !raw_mode) { +#ifdef KBD_REPORT_UNKN printk("keyboard: scancode (%02x) not in range 00 - %2x\n", scancode, E0_BASE - 1); +#endif goto end_kbd_intr; } diff --git a/drivers/net/3c501.c b/drivers/net/3c501.c index d0141b0..8fadbd0 100644 --- a/drivers/net/3c501.c +++ b/drivers/net/3c501.c @@ -17,7 +17,7 @@ */ static char *version = - "3c501.c:v13.13 1993 Donald Becker (becker@super.org).\n"; + "3c501.c: 3/3/94 Donald Becker (becker@super.org).\n"; /* Braindamage remaining: @@ -302,9 +302,6 @@ el_start_xmit(struct sk_buff *skb, struct device *dev) if (skb->len <= 0) return 0; - if (el_debug > 2) - printk("%s: el_start_xmit(%d)...", dev->name, skb->len); - /* Avoid timer-based retransmission conflicts. */ if (set_bit(0, (void*)&dev->tbusy) != 0) printk("%s: Transmitter access conflict.\n", dev->name); diff --git a/drivers/net/3c503.c b/drivers/net/3c503.c index bf86c6f..f46f3b1 100644 --- a/drivers/net/3c503.c +++ b/drivers/net/3c503.c @@ -16,7 +16,7 @@ */ static char *version = - "3c503.c:v0.99.13 8/30/93 Donald Becker (becker@super.org)\n"; + "3c503.c:v0.99.15k 3/3/93 Donald Becker (becker@super.org)\n"; #include <linux/config.h> #include <linux/kernel.h> @@ -200,9 +200,6 @@ el2probe1(int ioaddr, struct device *dev) dev->mem_end = dev->rmem_end = dev->mem_start + EL2_MEMSIZE; dev->rmem_start = TX_PAGES*256 + dev->mem_start; } - if (ei_debug > 2) - printk("\n3c503: memory params start=%#5x rstart=%#5x end=%#5x rend=%#5x.\n", - dev->mem_start, dev->rmem_start, dev->mem_end, dev->rmem_end); /* Finish setting the board's parameters. */ ei_status.name = "3C503"; @@ -228,7 +225,7 @@ el2probe1(int ioaddr, struct device *dev) dev->stop = &el2_close; if (dev->mem_start) - printk("\n%s: %s with shared memory at %#6x-%#6x,\n", + printk("\n%s: %s with shared memory at %#6lx-%#6lx,\n", dev->name, ei_status.name, dev->mem_start, dev->mem_end-1); else printk("\n%s: %s using programmed I/O (REJUMPER for SHARED MEMORY).\n", @@ -352,9 +349,6 @@ el2_block_output(struct device *dev, int count, if (ei_debug > 2 && memcmp(dest_addr, buf, count)) printk("%s: 3c503 send_packet() bad memory copy @ %#5x.\n", dev->name, (int) dest_addr); - else if (ei_debug > 4) - printk("%s: 3c503 send_packet() good memory copy @ %#5x.\n", - dev->name, (int) dest_addr); return; } /* No shared memory, put the packet out the slow way. */ @@ -395,19 +389,11 @@ el2_block_input(struct device *dev, int count, char *buf, int ring_offset) if (dev->mem_start + ring_offset + count > end_of_ring) { /* We must wrap the input move. */ int semi_count = end_of_ring - (dev->mem_start + ring_offset); - if (ei_debug > 4) - printk("%s: 3c503 block_input() @ %#5x+%x=%5x.\n", - dev->name, dev->mem_start, ring_offset, - dev->mem_start + ring_offset); memcpy(buf, (char *)dev->mem_start + ring_offset, semi_count); count -= semi_count; memcpy(buf + semi_count, (char *)dev->rmem_start, count); return dev->rmem_start + count; } - if (ei_debug > 4) - printk("%s: 3c503 block_input() @ %#5x+%x=%5x.\n", - dev->name, dev->mem_start, ring_offset, - dev->mem_start + ring_offset); memcpy(buf, (char *)dev->mem_start + ring_offset, count); return ring_offset + count; } diff --git a/drivers/net/3c507.c b/drivers/net/3c507.c index 8ee16f6..4c6221e 100644 --- a/drivers/net/3c507.c +++ b/drivers/net/3c507.c @@ -394,7 +394,7 @@ int el16_probe1(struct device *dev, short ioaddr) dev->if_port = (inb(ioaddr + ROM_CONFIG) & 0x80) ? 1 : 0; dev->irq = inb(ioaddr + IRQ_CONFIG) & 0x0f; - printk(", IRQ %d, %sternal xcvr, memory %#x-%#x.\n", dev->irq, + printk(", IRQ %d, %sternal xcvr, memory %#lx-%#lx.\n", dev->irq, dev->if_port ? "ex" : "in", dev->mem_start, dev->mem_end-1); if (net_debug) diff --git a/drivers/net/at1700.c b/drivers/net/at1700.c index 288693b..f89581c 100644 --- a/drivers/net/at1700.c +++ b/drivers/net/at1700.c @@ -12,7 +12,7 @@ */ static char *version = - "at1700.c:v0.05 2/9/94 Donald Becker (becker@super.org)\n"; + "at1700.c:v0.06 3/3/94 Donald Becker (becker@super.org)\n"; #include <linux/config.h> @@ -412,7 +412,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev) /* For ethernet, fill in the header. This should really be done by a higher level, rather than duplicated for each ethernet adaptor. */ - if (!skb->arp && dev->rebuild_header(skb+1, dev)) { + if (!skb->arp && dev->rebuild_header(skb->data, dev)) { skb->dev = dev; arp_queue (skb); return 0; @@ -425,11 +425,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev) printk("%s: Transmitter access conflict.\n", dev->name); else { short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; - unsigned char *buf = (void *)(skb+1); - - if (net_debug > 4) - printk("%s: Transmitting a packet of length %d.\n", dev->name, - skb->len); + unsigned char *buf = skb->data; /* Turn off the possible Tx interrupts. */ outb(0x00, ioaddr + TX_INTR); @@ -561,14 +557,13 @@ net_rx(struct device *dev) skb->len = pkt_len; skb->dev = dev; - /* 'skb+1' points to the start of sk_buff data area. */ - insw(ioaddr + DATAPORT, (void *)(skb+1), (pkt_len + 1) >> 1); + insw(ioaddr + DATAPORT, skb->data, (pkt_len + 1) >> 1); if (net_debug > 5) { int i; printk("%s: Rxed packet of length %d: ", dev->name, pkt_len); for (i = 0; i < 14; i++) - printk(" %02x", ((unsigned char*)(skb + 1))[i]); + printk(" %02x", skb->data[i]); printk(".\n"); } diff --git a/drivers/net/depca.c b/drivers/net/depca.c index 38c779a..3178159 100644 --- a/drivers/net/depca.c +++ b/drivers/net/depca.c @@ -782,7 +782,7 @@ depca_start_xmit(struct sk_buff *skb, struct device *dev) } /* Fill in the ethernet header. */ - if (!skb->arp && dev->rebuild_header(skb+1, dev)) { + if (!skb->arp && dev->rebuild_header(skb->data, dev)) { skb->dev = dev; arp_queue (skb); return 0; @@ -814,7 +814,7 @@ depca_start_xmit(struct sk_buff *skb, struct device *dev) int entry = lp->cur_tx++; int len; long skbL = skb->len; - char *p = (char *)(skb + 1); + char *p = (char *) skb->data; entry &= lp->rmask; /* Ring around buffer number. */ buf = (unsigned char *)(lp->tx_ring[entry].base & 0x00ffffff); @@ -835,7 +835,7 @@ depca_start_xmit(struct sk_buff *skb, struct device *dev) lp->tx_ring[entry].misc = 0x0000; /* copy the data from the socket buffer to the net memory */ - memcpy((unsigned char *)(buf), (unsigned char *)(skb + 1), len); + memcpy((unsigned char *)(buf), skb->data, len); /* Hand over buffer ownership to the LANCE */ if (skbL <= 0) lp->tx_ring[entry].base |= (T_ENP); @@ -859,7 +859,7 @@ depca_start_xmit(struct sk_buff *skb, struct device *dev) dev->tbusy=0; /* Copy ethernet header to the new buffer */ - memcpy((unsigned char *)buf, (unsigned char *)(skb + 1), PKT_HDR_LEN); + memcpy((unsigned char *)buf, skb->data, PKT_HDR_LEN); /* Determine length of data buffer */ len = ((skbL > DAT_SZ) ? DAT_SZ : skbL); /* skbL too long */ @@ -998,7 +998,7 @@ depca_rx(struct device *dev) skb->mem_addr = skb; skb->len = pkt_len; skb->dev = dev; - memcpy((unsigned char *)(skb + 1), + memcpy(skb->data, (unsigned char *)(lp->rx_ring[entry].base & 0x00ffffff), pkt_len); /* diff --git a/drivers/net/eexpress.c b/drivers/net/eexpress.c index d658e50..5372fa1 100644 --- a/drivers/net/eexpress.c +++ b/drivers/net/eexpress.c @@ -278,7 +278,7 @@ static short init_words[] = { #endif /* 0x0056: A continuous transmit command, only here for testing. */ - 0, CmdTx, DUMP_DATA, DUMP_DATA+8, 0x803ff, -1, DUMP_DATA, 0, + 0, CmdTx, DUMP_DATA, DUMP_DATA+8, 0x83ff, -1, DUMP_DATA, 0, }; /* Index to functions, as function prototypes. */ @@ -513,7 +513,7 @@ eexp_send_packet(struct sk_buff *skb, struct device *dev) /* For ethernet, fill in the header. This should really be done by a higher level, rather than duplicated for each ethernet adaptor. */ - if (!skb->arp && dev->rebuild_header(skb+1, dev)) { + if (!skb->arp && dev->rebuild_header(skb->data, dev)) { skb->dev = dev; arp_queue (skb); return 0; @@ -525,7 +525,7 @@ eexp_send_packet(struct sk_buff *skb, struct device *dev) printk("%s: Transmitter access conflict.\n", dev->name); else { short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; - unsigned char *buf = (void *)(skb+1); + unsigned char *buf = skb->data; /* Disable the 82586's input to the interrupt line. */ outb(irqrmap[dev->irq], ioaddr + SET_IRQ); @@ -982,7 +982,7 @@ eexp_rx(struct device *dev) outw(data_buffer_addr + 10, ioaddr + READ_PTR); - insw(ioaddr, (void *)(skb+1), (pkt_len + 1) >> 1); + insw(ioaddr, skb->data, (pkt_len + 1) >> 1); #ifdef HAVE_NETIF_RX netif_rx(skb); diff --git a/drivers/net/hp.c b/drivers/net/hp.c index 68e4823..845226c 100644 --- a/drivers/net/hp.c +++ b/drivers/net/hp.c @@ -13,7 +13,7 @@ */ static char *version = - "hp.c:v0.99.15c 2/11/94 Donald Becker (becker@super.org)\n"; + "hp.c:v0.99.15k 3/3/94 Donald Becker (becker@super.org)\n"; #include <linux/config.h> #include <linux/kernel.h> @@ -177,31 +177,22 @@ hp_reset_8390(struct device *dev) { int hp_base = dev->base_addr - NIC_OFFSET; int saved_config = inb_p(hp_base + HP_CONFIGURE); - int reset_start_time = jiffies; - if (ei_debug > 1) printk("resetting the 8390 time=%d...", jiffies); + if (ei_debug > 1) printk("resetting the 8390 time=%ld...", jiffies); outb_p(0x00, hp_base + HP_CONFIGURE); ei_status.txing = 0; - - sti(); - /* We shouldn't use the boguscount for timing, but this hasn't been - checked yet, and you could hang your machine if jiffies break... */ - { - int boguscount = 150000; - while(jiffies - reset_start_time < 2) - if (boguscount-- < 0) { - printk("jiffy failure (t=%d)...", jiffies); - break; - } - } + /* Pause just a few cycles for the hardware reset to take place. */ + SLOW_DOWN_IO; + SLOW_DOWN_IO; outb_p(saved_config, hp_base + HP_CONFIGURE); - while ((inb_p(hp_base+NIC_OFFSET+EN0_ISR) & ENISR_RESET) == 0) - if (jiffies - reset_start_time > 2) { - printk("%s: hp_reset_8390() did not complete.\n", dev->name); - return; - } - if (ei_debug > 1) printk("8390 reset done (%d).", jiffies); + SLOW_DOWN_IO; SLOW_DOWN_IO; + + if ((inb_p(hp_base+NIC_OFFSET+EN0_ISR) & ENISR_RESET) == 0) + printk("%s: hp_reset_8390() did not complete.\n", dev->name); + + if (ei_debug > 1) printk("8390 reset done (%ld).", jiffies); + return; } /* Block input and output, similar to the Crynwr packet driver. If you diff --git a/drivers/net/lance.c b/drivers/net/lance.c index 39e6339..674011e 100644 --- a/drivers/net/lance.c +++ b/drivers/net/lance.c @@ -512,7 +512,7 @@ lance_start_xmit(struct sk_buff *skb, struct device *dev) } /* Fill in the ethernet header. */ - if (!skb->arp && dev->rebuild_header(skb+1, dev)) { + if (!skb->arp && dev->rebuild_header(skb->data, dev)) { skb->dev = dev; arp_queue (skb); return 0; @@ -553,11 +553,11 @@ lance_start_xmit(struct sk_buff *skb, struct device *dev) /* If any part of this buffer is >16M we must copy it to a low-memory buffer. */ - if ((int)(skb+1) + skb->len > 0x01000000) { + if ((int)(skb->data) + skb->len > 0x01000000) { if (lance_debug > 5) printk("%s: bouncing a high-memory packet (%#x).\n", - dev->name, (int)(skb+1)); - memcpy(&lp->tx_bounce_buffs[entry], skb+1, skb->len); + dev->name, (int)(skb->data)); + memcpy(&lp->tx_bounce_buffs[entry], skb->data, skb->len); lp->tx_ring[entry].base = (int)(lp->tx_bounce_buffs + entry) | 0x83000000; if (skb->free) @@ -567,7 +567,7 @@ lance_start_xmit(struct sk_buff *skb, struct device *dev) code that we are still using it. */ if(skb->free==0) skb_kept_by_device(skb); - lp->tx_ring[entry].base = (int)(skb+1) | 0x83000000; + lp->tx_ring[entry].base = (int)(skb->data) | 0x83000000; } lp->cur_tx++; @@ -733,7 +733,7 @@ lance_rx(struct device *dev) skb->mem_addr = skb; skb->len = pkt_len; skb->dev = dev; - memcpy((unsigned char *) (skb + 1), + memcpy(skb->data, (unsigned char *)(lp->rx_ring[entry].base & 0x00ffffff), pkt_len); #ifdef HAVE_NETIF_RX diff --git a/drivers/net/ne.c b/drivers/net/ne.c index a69754a..d37042f 100644 --- a/drivers/net/ne.c +++ b/drivers/net/ne.c @@ -17,7 +17,7 @@ /* Routines for the NatSemi-based designs (NE[12]000). */ static char *version = - "ne.c:v0.99-15b 2/8/94 Donald Becker (becker@super.org)\n"; + "ne.c:v0.99-15k 3/3/94 Donald Becker (becker@super.org)\n"; #include <linux/config.h> #include <linux/kernel.h> @@ -156,7 +156,6 @@ static int neprobe1(int ioaddr, struct device *dev, int verbose) if (wordlength == 2) { /* We must set the 8390 for word mode. */ - int tmp; outb_p(0x49, ioaddr + EN0_DCFG); /* We used to reset the ethercard here, but it doesn't seem to be necessary. */ @@ -265,7 +264,7 @@ ne_reset_8390(struct device *dev) int tmp = inb_p(NE_BASE + NE_RESET); int reset_start_time = jiffies; - if (ei_debug > 1) printk("resetting the 8390 t=%d...", jiffies); + if (ei_debug > 1) printk("resetting the 8390 t=%ld...", jiffies); ei_status.txing = 0; outb_p(tmp, NE_BASE + NE_RESET); diff --git a/drivers/net/slip.c b/drivers/net/slip.c index 863e3b6..2e9b2e1 100644 --- a/drivers/net/slip.c +++ b/drivers/net/slip.c @@ -20,6 +20,7 @@ * Alan Cox : KISS AX.25 and AXUI IP support * Michael Riepe : Automatic CSLIP recognition added * Charles Hedrick : CSLIP header length problem fix. + * Alan Cox : Corrected non-IP cases of the above. */ #include <asm/segment.h> @@ -552,37 +553,35 @@ sl_xmit(struct sk_buff *skb, struct device *dev) /* We were not, so we are now... :-) */ if (skb != NULL) { #ifdef CONFIG_AX25 - if(sl->mode & SL_MODE_AX25) - { - if(!skb->arp && dev->rebuild_header(skb->data,dev)) - { - skb->dev=dev; - arp_queue(skb); - return 0; - } - skb->arp=1; - } + if(sl->mode & SL_MODE_AX25) + { + if(!skb->arp && dev->rebuild_header(skb->data,dev)) + { + skb->dev=dev; + arp_queue(skb); + return 0; + } + skb->arp=1; + } #endif sl_lock(sl); - - size=skb->len; - if(size<sizeof(struct iphdr)) - { - printk("Runt IP frame fed to slip!\n"); + size = skb->len; + if (!(sl->mode & SL_MODE_AX25)) { + if (size < sizeof(struct iphdr)) { + printk("Runt IP frame fed to slip!\n"); + } else { + size = ((struct iphdr *)(skb->data))->tot_len; + size = ntohs(size); + } } - else - { - size=((struct iphdr *)(skb->data))->tot_len; - size=ntohs(size); /* sl_hex_dump(skb->data,skb->len);*/ - sl_encaps(sl, skb->data, size); - } - if (skb->free) kfree_skb(skb, FREE_WRITE); + sl_encaps(sl, skb->data, size); + if (skb->free) + kfree_skb(skb, FREE_WRITE); } return(0); } - /* Return the frame type ID. This is normally IP but maybe be AX.25. */ static unsigned short sl_type_trans (struct sk_buff *skb, struct device *dev) @@ -692,6 +692,7 @@ restart_interp: retval = fn(&bprm, regs); if (retval == 0) { iput(bprm.inode); + current->did_exec = 1; return 0; } fmt++; diff --git a/include/linux/keyboard.h b/include/linux/keyboard.h index b956435..583b975 100644 --- a/include/linux/keyboard.h +++ b/include/linux/keyboard.h @@ -5,6 +5,10 @@ #define KG_CTRL 2 #define KG_ALT 3 #define KG_ALTGR 1 +#define KG_SHIFTL 4 +#define KG_SHIFTR 5 +#define KG_CTRLL 6 +#define KG_CTRLR 7 #define NR_KEYS 128 #define NR_KEYMAPS 16 @@ -115,6 +119,10 @@ extern char *func_table[NR_FUNC]; #define K_CTRL K(KT_SHIFT,KG_CTRL) #define K_ALT K(KT_SHIFT,KG_ALT) #define K_ALTGR K(KT_SHIFT,KG_ALTGR) +#define K_SHIFTL K(KT_SHIFT,KG_SHIFTL) +#define K_SHIFTR K(KT_SHIFT,KG_SHIFTR) +#define K_CTRLL K(KT_SHIFT,KG_CTRLL) +#define K_CTRLR K(KT_SHIFT,KG_CTRLR) #define NR_SHIFT 4 diff --git a/include/linux/msg.h b/include/linux/msg.h index da02269..d345466 100644 --- a/include/linux/msg.h +++ b/include/linux/msg.h @@ -52,7 +52,7 @@ struct msginfo { }; #define MSGMNI 128 /* <= 1K */ /* max # of msg queue identifiers */ -#define MSGMAX 4080 /* <= 4080 */ /* max size of message (bytes) */ +#define MSGMAX 4056 /* <= 4056 */ /* max size of message (bytes) */ #define MSGMNB 16384 /* ? */ /* default max size of a message queue */ /* unused */ diff --git a/include/linux/sbpcd.h b/include/linux/sbpcd.h index 880781f..5e7513a 100644 --- a/include/linux/sbpcd.h +++ b/include/linux/sbpcd.h @@ -35,12 +35,8 @@ * LASERMATE (CI-101P) adresses typically are 0x0300, 0x0310, ... * there are some soundcards on the market with 0x0630, 0x0650, ... * - * obey! changed against v0.4 !!! - * for SBPRO cards, specify the CDROM address - no longer the audio address! * example: if your SBPRO audio address is 0x220, specify 0x230. * - * a fill-in is not always necessary - the driver does auto-probing now, - * with the here specified address first... */ #define CDROM_PORT 0x0230 @@ -73,7 +69,9 @@ #define DBG_DID 16 /* drive ID test */ #define DBG_RES 17 /* drive reset info */ #define DBG_SPI 18 /* SpinUp test */ -#define DBG_000 19 /* unnecessary information */ +#define DBG_IOS 19 /* ioctl trace: "subchannel" */ +#define DBG_IO2 20 /* ioctl trace: general */ +#define DBG_000 21 /* unnecessary information */ /*==========================================================================*/ /*==========================================================================*/ @@ -420,12 +418,7 @@ Read XA Parameter: /* * use "REP INSB" for strobing the data in: */ -#if PATCHLEVEL<15 -#define READ_DATA(port, buf, nr) \ -__asm__("cld;rep;insb": :"d" (port),"D" (buf),"c" (nr):"cx","dx","di") -#else #define READ_DATA(port, buf, nr) insb(port, buf, nr) -#endif /*==========================================================================*/ /* diff --git a/include/linux/sched.h b/include/linux/sched.h index 92aa261..2834379 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -183,6 +183,7 @@ struct task_struct { int elf_executable:1; int dumpable:1; int swappable:1; + int did_exec:1; unsigned long start_code,end_code,end_data,start_brk,brk,start_stack,start_mmap; unsigned long arg_start, arg_end, env_start, env_end; int pid,pgrp,session,leader; @@ -263,7 +264,7 @@ struct task_struct { /* schedlink */ &init_task,&init_task, \ /* signals */ {{ 0, },}, \ /* stack */ 0,(unsigned long) &init_kernel_stack, \ -/* ec,brk... */ 0,0,0,0,0,0,0,0,0,0,0,0, \ +/* ec,brk... */ 0,0,0,0,0,0,0,0,0,0,0,0,0, \ /* argv.. */ 0,0,0,0, \ /* pid etc.. */ 0,0,0,0, \ /* suppl grps*/ {NOGROUP,}, \ diff --git a/include/linux/timex.h b/include/linux/timex.h index bf4b390..565043d 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h @@ -25,8 +25,6 @@ #ifndef _LINUX_TIMEX_H #define _LINUX_TIMEX_H -#include <linux/unistd.h> - /* * The following defines establish the engineering parameters of the PLL * model. The HZ variable establishes the timer interrupt frequency, 100 Hz diff --git a/kernel/fork.c b/kernel/fork.c index 306ddab..7e4d4da 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -136,6 +136,7 @@ asmlinkage int sys_fork(struct pt_regs regs) goto bad_fork_free; task[nr] = p; *p = *current; + p->did_exec = 0; p->kernel_stack_page = 0; p->state = TASK_UNINTERRUPTIBLE; p->flags &= ~(PF_PTRACED|PF_TRACESYS); diff --git a/kernel/sys.c b/kernel/sys.c index a158393..4d3e296 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -461,32 +461,49 @@ asmlinkage int sys_brk(unsigned long brk) * OK, I think I have the protection semantics right.... this is really * only important on a multi-user system anyway, to make sure one user * can't send a signal to a process owned by another. -TYT, 12/12/91 + * + * Auch. Had to add the 'did_exec' flag to conform completely to POSIX. + * LBT 04.03.94 */ asmlinkage int sys_setpgid(pid_t pid, pid_t pgid) { - int i; + struct task_struct * p; if (!pid) pid = current->pid; if (!pgid) - pgid = current->pid; + pgid = pid; if (pgid < 0) return -EINVAL; - for (i=0 ; i<NR_TASKS ; i++) - if (task[i] && (task[i]->pid == pid) && - ((task[i]->p_pptr == current) || - (task[i]->p_opptr == current) || - (task[i] == current))) { - if (task[i]->leader) - return -EPERM; - if ((task[i]->session != current->session) || - ((pgid != pid) && - (session_of_pgrp(pgid) != current->session))) - return -EPERM; - task[i]->pgrp = pgid; - return 0; - } + for_each_task(p) { + if (p->pid == pid) + goto found_task; + } return -ESRCH; + +found_task: + if (p->p_pptr == current || p->p_opptr == current) { + if (p->session != current->session) + return -EPERM; + if (p->did_exec) + return -EACCES; + } else if (p != current) + return -ESRCH; + if (p->leader) + return -EPERM; + if (pgid != pid) { + struct task_struct * tmp; + for_each_task (tmp) { + if (tmp->pgrp == pgid && + tmp->session == current->session) + goto ok_pgid; + } + return -EPERM; + } + +ok_pgid: + p->pgrp = pgid; + return 0; } asmlinkage int sys_getpgid(pid_t pid) diff --git a/net/inet/ip.c b/net/inet/ip.c index c8954c4..944d1ed 100644 --- a/net/inet/ip.c +++ b/net/inet/ip.c @@ -36,7 +36,7 @@ * Alan Cox : Use ip_tos/ip_ttl settings * Alan Cox : Fragmentation bogosity removed * (Thanks to Mark.Bush@prg.ox.ac.uk) - * Dmitry Gordchanin : Send of a raw packet crash fix. + * Dmitry Gorodchanin : Send of a raw packet crash fix. * Alan Cox : Silly ip bug when an overlength * fragment turns up. Now frees the * queue. diff --git a/net/inet/tcp.c b/net/inet/tcp.c index faf1903..b29f444 100644 --- a/net/inet/tcp.c +++ b/net/inet/tcp.c @@ -592,14 +592,15 @@ void tcp_send_check(struct tcphdr *th, unsigned long saddr, static void tcp_send_skb(struct sock *sk, struct sk_buff *skb) { int size; + struct tcphdr * th = skb->h.th; /* length of packet (not counting length of pre-tcp headers) */ - size = skb->len - ((unsigned char *) skb->h.th - skb->data); + size = skb->len - ((unsigned char *) th - skb->data); /* sanity check it.. */ if (size < sizeof(struct tcphdr) || size > skb->len) { printk("tcp_send_skb: bad skb (skb = %p, data = %p, th = %p, len = %lu)\n", - skb, skb->data, skb->h.th, skb->len); + skb, skb->data, th, skb->len); kfree_skb(skb, FREE_WRITE); return; } @@ -607,7 +608,7 @@ static void tcp_send_skb(struct sock *sk, struct sk_buff *skb) /* If we have queued a header size packet.. */ if (size == sizeof(struct tcphdr)) { /* If its got a syn or fin its notionally included in the size..*/ - if(!skb->h.th->syn && !skb->h.th->fin) { + if(!th->syn && !th->fin) { printk("tcp_send_skb: attempt to queue a bogon.\n"); kfree_skb(skb,FREE_WRITE); return; @@ -615,10 +616,10 @@ static void tcp_send_skb(struct sock *sk, struct sk_buff *skb) } /* We need to complete and send the packet. */ - tcp_send_check(skb->h.th, sk->saddr, sk->daddr, size, sk); + tcp_send_check(th, sk->saddr, sk->daddr, size, sk); - skb->h.seq = sk->write_seq; - if (after(sk->write_seq , sk->window_seq) || + skb->h.seq = ntohl(th->seq) + size - 4*th->doff; + if (after(skb->h.seq, sk->window_seq) || (sk->retransmits && sk->timeout == TIME_WRITE) || sk->packets_out >= sk->cong_window) { DPRINTF((DBG_TCP, "sk->cong_window = %d, sk->packets_out = %d\n", diff --git a/net/unix/proc.c b/net/unix/proc.c index 8a80ad5..2ec7f8d 100644 --- a/net/unix/proc.c +++ b/net/unix/proc.c @@ -16,6 +16,7 @@ * Fred Baumgarten, <dc6iq@insu1.etec.uni-kalrsruhe.de> * * Fixes: + * Dmitry Gorodchanin : /proc locking fix * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -43,7 +44,7 @@ int unix_get_info(char *buffer) pos += sprintf(pos, "Num RefCount Protocol Flags Type St Path\n"); for(i = 0; i < NSOCKETS; i++) { - if (unix_datas[i].refcnt) { + if (unix_datas[i].refcnt>0) { pos += sprintf(pos, "%2d: %08X %08X %08lX %04X %02X", i, unix_datas[i].refcnt, unix_datas[i].protocol, diff --git a/net/unix/sock.c b/net/unix/sock.c index 6ab4e83..ae264e3 100644 --- a/net/unix/sock.c +++ b/net/unix/sock.c @@ -13,11 +13,12 @@ * Fixes: * Alan Cox : Verify Area * NET2E Team : Page fault locks + * Dmitry Gorodchanin : /proc locking * * To Do: - * - * Change to the NET2E3 code for Unix domain sockets in general. The - * read/write logic is much better and cleaner. + * Some nice person is looking into Unix sockets done properly. NET3 + * will replace all of this and include datagram sockets and socket + * options - so please stop asking me for them 8-) * * * This program is free software; you can redistribute it and/or @@ -237,7 +238,7 @@ unix_data_lookup(struct sockaddr_un *sockun, int sockaddr_len, struct unix_proto_data *upd; for(upd = unix_datas; upd <= last_unix_data; ++upd) { - if (upd->refcnt && upd->socket && + if (upd->refcnt > 0 && upd->socket && upd->socket->state == SS_UNCONNECTED && upd->sockaddr_un.sun_family == sockun->sun_family && upd->inode == inode) return(upd); @@ -254,7 +255,7 @@ unix_data_alloc(void) cli(); for(upd = unix_datas; upd <= last_unix_data; ++upd) { if (!upd->refcnt) { - upd->refcnt = 1; + upd->refcnt = -1; /* unix domain socket not yet initialised - bgm */ sti(); upd->socket = NULL; upd->sockaddr_len = 0; @@ -328,6 +329,7 @@ unix_proto_create(struct socket *sock, int protocol) upd->protocol = protocol; upd->socket = sock; UN_DATA(sock) = upd; + upd->refcnt = 1; /* Now its complete - bgm */ dprintf(1, "UNIX: create: allocated data 0x%x\n", upd); return(0); } diff --git a/net/unix/unix.h b/net/unix/unix.h index 74b1777..4ad032a 100644 --- a/net/unix/unix.h +++ b/net/unix/unix.h @@ -15,6 +15,9 @@ * Ross Biro, <bir7@leland.Stanford.Edu> * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> * + * Fixes: + * Dmitry Gorodchanin - proc locking + * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version @@ -27,6 +30,7 @@ struct unix_proto_data { int refcnt; /* cnt of reference 0=free */ + /* -1=not initialised -bgm */ struct socket *socket; /* socket we're bound to */ int protocol; struct sockaddr_un sockaddr_un; |