diff -u --recursive --new-file linux-2.0.38/CREDITS linux-2.0.39/CREDITS
--- linux-2.0.38/CREDITS	Sun Jun 13 19:20:59 1999
+++ linux-2.0.39/CREDITS	Wed Feb  2 09:25:57 2000
@@ -10,7 +10,7 @@
 ----------
 
 N: Matti Aarnio
-E: mea@utu.fi
+E: mea@nic.funet.fi
 D: LILO for AHA1542, modularized several of drivers/net/,
 D: dynamic SLIP devices, dynamic /proc/net/, true size /proc/ksyms,
 D: and other hacks..
@@ -61,10 +61,11 @@
 D: Adaptec 274x driver
 S: Department of Computer Science
 S: University of Calgary
-S: Calgary, Alberta, Canada
+S: Calgary, Alberta
+S: Canada
 
 N: Ralf Baechle
-E: ralf@gnu.ai.mit.edu
+E: ralf@gnu.org
 P: 1024/AF7B30C1 CF 97 C2 CC 6D AE A7 FE  C8 BA 9C FC 88 DE 32 C3
 D: Linux/MIPS port
 D: Linux/68k hacker
@@ -93,12 +94,8 @@
 S: USA
 
 N: James Banks
-E: james.banks@caldera.com
+E: james@sovereign.org
 D: TLAN network driver
-S: Caldera, Inc.
-S: 633 South 550 East
-S: Provo, UT 84606
-S: USA
 
 N: Peter Bauer
 E: 100136.3530@compuserve.com
@@ -156,18 +153,19 @@
 D: Original author of the Linux networking code
 
 N: Philip Blundell
-E: Philip.Blundell@pobox.com
+E: philb@gnu.org
 D: Device driver hacking (especially EtherExpress16/3C505 net cards)
 D: Some Linux/ARM stuff
-S: 201 Gilbert Road
-S: Cambridge, UK. CB4 3PA
+S: Nexus Eletronics Ltd
+S: 10 St Barnabas Road, Cambridge CB1 2BY
+S: United Kingdom
 
-N: Thomas Bogendoerfer
+N: Thomas Bogendörfer
 E: tsbogend@alpha.franken.de
 D: Lance32 driver
 D: strace for Linux/Alpha
-S: Baumgartenweg 5
-S: 91452 Wilhermsdorf
+S: Schafhofstr. 40
+S: 90556 Cadolzburg
 S: Germany
 
 N: Bill Bogstad
@@ -227,11 +225,11 @@
 S: USA
 
 N: Gordon Chaffee
-E: chaffee@plateau.cs.berkeley.edu
+E: chaffee@cs.berkeley.edu
 W: http://bmrc.berkeley.edu/people/chaffee/
 D: vfat, fat32, joliet, native language support
-S: 3674 Oakwood Terrace #201
-S: Fremont, California 94536
+S: 3700 Warwick Road
+S: Fremont, California 94555
 S: USA
 
 N: Chih-Jen Chang
@@ -240,7 +238,8 @@
 D: IGMP(Internet Group Management Protocol) version 2
 S: 3F, 65 Tajen street
 S: Tamsui town, Taipei county,
-S: Taiwan 251, Republic of China
+S: Taiwan 251
+S: Republic of China
 
 N: Raymond Chen
 E: raymondc@microsoft.com
@@ -259,8 +258,9 @@
 S: USA
 
 N: Juan Jose Ciarlante
+W: http://juanjox.linuxhq.com/
 E: jjciarla@raiz.uncu.edu.ar
-E: juanjo@irriga.uncu.edu.ar
+E: jjo@mendoza.gov.ar
 D: Network driver alias support
 D: IP masq hashing and app modules
 D: IP ip_dynaddr bits 
@@ -276,9 +276,9 @@
 S: Australia
 
 N: Alan Cox
-E: alan@lxorguk.ukuu.org.uk (linux related - except big patches)
-E: iialan@www.uk.linux.org (linux.org.uk/big patches)
-E: alan@cymru.net (commercial CymruNET stuff)
+W: http://roadrunner.swansea.linux.org.uk/alan.shtml
+E: alan@lxorguk.ukuu.org.uk
+E: alan@www.linux.org.uk (linux.org.uk stuff)
 E: Alan.Cox@linux.org (if others fail)
 D: NET2Debugged/NET3 author
 D: Network layer debugging
@@ -287,11 +287,11 @@
 D: Current 3c501 hacker. >>More 3c501 info/tricks wanted<<.
 D: Watchdog timer drivers
 D: Linux/SMP
-S: CymruNet Limited
-S: The Innovation Centre
-S: Singleton Park
-S: Swansea, SA2 8PP
-S: Wales, United Kingdom
+S: c/o Red Hat UK Ltd
+S: Alexandra House
+S: Alexandra Terrace
+S: Guildford, GU1 3DA
+S: United Kingdom
 
 N: Laurence Culhane
 E: loz@holmes.demon.co.uk
@@ -340,7 +340,7 @@
 N: Eddie C. Dost
 E: ecd@skynet.be
 D: Linux/Sparc kernel hacker
-D: New Linux/Sparc maintainer (while davem is at SGI)
+D: Linux/Sparc maintainer
 S: Rue de la Chapelle 51
 S: 4850 Moresnet
 S: Belgium
@@ -398,11 +398,11 @@
 S: Germany
 
 N: Paal-Kristian Engstad
-E: engstad@funcom.com
+E: engstad@intermetrics.com
 D: Kernel smbfs (to mount WfW, NT and OS/2 network drives.)
-S: Oscars gt. 35
-S: N-0258 OSLO
-S: Norway
+S: 17101 Springdale Street #225
+S: Huntington Beach, California 92649
+S: USA
 
 N: Doug Evans
 E: dje@cygnus.com
@@ -410,13 +410,13 @@
 
 N: Rik Faith
 E: faith@cs.unc.edu
-E: r.faith@ieee.org
+E: faith@acm.org
 D: Author: Future Domain TMC-16x0 SCSI driver
 D: Debugging: SCSI code; Cyclades serial driver; APM driver
 D: Debugging: XFree86 Mach 32 server, accelerated server code
 
 N: Jürgen Fischer
-E: fischer@et-inf.fho-emden.de (=?iso-8859-1?q?J=FCrgen?= Fischer)
+E: fischer@norbit.de (=?iso-8859-1?q?J=FCrgen?= Fischer)
 D: Author of Adaptec AHA-152x scsi driver
 S: Schulstraße 18
 S: 26506 Norden
@@ -503,8 +503,7 @@
 S: USA
 
 N: Paul Gortmaker
-E: gpg109@rsphy1.anu.edu.au
-W: http://rsphy1.anu.edu.au/~gpg109
+E: p_gortmaker@yahoo.com
 D: Real Time Clock driver author.
 D: 8390 net driver hacker (ne2000, wd8013, smc-ultra, 3c503, etc.) 
 D: Ethernet-HowTo and BootPrompt-HowTo author.
@@ -513,7 +512,7 @@
 D: Various other random hacks, patches and utilities.
 
 N: John E. Gotts
-E: jgotts@engin.umich.edu
+E: jgotts@linuxsavvy.com
 D: kernel hacker
 S: 8124 Constitution Apt. 7
 S: Sterling Heights, Michigan 48313
@@ -530,9 +529,10 @@
 
 N: Grant Guenther
 E: grant@torque.net
+W: http://www.torque.net/linux-pp.html
 D: Iomega PPA / ZIP driver
-S: 906-1001 Bay St.
-S: Toronto, Ontario, M5S 3A6 
+S: 44 St. Joseph Street, Suite 506
+S: Toronto, Ontario, M4Y 2W4 
 S: Canada
 
 N: Danny ter Haar
@@ -566,19 +566,16 @@
 S: USA
 
 N: Angelo Haritsis
-E: ah@doc.ic.ac.uk
+E: ah@computer.org
 D: kernel patches (serial, watchdog)
 D: xringd, vuzkern, greekXfonts
-S: 58 Henfield Close
-S: London N19 3UL
+S: 77 Clarence Mews
+S: London SE16 1GD
 S: United Kingdom
 
 N: Kai Harrekilde-Petersen
-E: khp@dolphinics.no
+E: khp@olicom.dk
 D: Original author of the ftape-HOWTO, i82078 fdc detection code.
-S: Peder Holters vei 13
-S: 1168 Oslo
-S: Norway
 
 N: Andrew Haylett
 E: ajh@primag.co.uk
@@ -595,9 +592,12 @@
 S: Germany
 
 N: Richard Henderson
-E: richard@gnu.ai.mit.edu
+E: rth@twiddle.net
 E: rth@cygnus.com
 D: Alpha/ELF, gcc, binutils, and glibc
+S: 50 E. Middlefield #10
+S: Mountain View, California 94043
+S: USA
 
 N: Sebastian Hetze
 E: she@lunetix.de
@@ -615,24 +615,23 @@
 S: Germany
 
 N: Dirk Hohndel
-E: hohndel@aib.com
+E: hohndel@suse.de
 D: The XFree86[tm] Project
-S: AIB Software Corporation
-S: 46030 Manekin Plaza, Suite 160
-S: Dulles, Virginia 20166
-S: USA
+S: SuSE Rhein/Main AG
+S: Mergenthalerallee 45-47
+S: 65760 Eschborn
+S: Germany
 
-N: Kenji Tsutomu Hollis
+N: Kenji Hollis
 E: khollis@bitgate.com
-W: http://www.nurk.org/
+W: http://www.bitgate.com/
 D: Berkshire PC Watchdog Driver
-S: PO Box 15
-S: Grants Pass, Oregon 97526
-S: USA
 
 N: Nick Holloway
 E: Nick.Holloway@alfie.demon.co.uk
 E: Nick.Holloway@parallax.co.uk
+W: http://www.alfie.demon.co.uk/
+P: 1024/75C49395 3A F0 E3 4E B7 9F E0 7E  47 A3 B0 D5 68 6A C2 FB
 D: Small patches for kernel, libc
 D: MAKEDEV
 S: 15 Duke Street
@@ -642,14 +641,14 @@
 S: United Kingdom
 
 N: Ron Holt
-E: ron@caldera.com
+E: ron@holt.org
 W: http://www.holt.org/
-P: 1024/1FD44539 DF 4B EB 9F 5B 68 38 9A  40 E3 FB 71 D1 C8 0B 56
+W: http://www.ronholt.com/
 D: Kernel development
 D: Minor kernel modifications to support Wabi and Wine
-S: Caldera, Inc.
-S: 240 West Center St.
-S: Orem, Utah 84059-1920
+S: Holtron Internetics, Inc.
+S: 998 East 900 South, Suite 26
+S: Provo, Utah 84606-5607
 S: USA
 
 N: Rob W. W. Hooft
@@ -708,7 +707,7 @@
 S: USA
 
 N: Bernhard Kaindl
-E: bernhard.kaindl@gmx.net
+E: bkaindl@netway.at
 E: edv@bartelt.via.at
 D: Author of a menu based configuration tool, kmenu, which 
 D: is the predecessor of 'make menuconfig' and 'make xconfig'.
@@ -717,21 +716,22 @@
 S: Austria
 
 N: Fred N. van Kempen
-E: waltje@uwalt.nl.mugnet.org
+E: waltje@linux.com
 D: NET-2
 D: Drivers
 D: Kernel cleanups
-S: Hoefbladhof 27
-S: 2215 DV Voorhout
+S: Korte Heul 95
+S: 1403 ND  BUSSUM
 S: The Netherlands
 
 N: Karl Keyte
-E: kkeyte@koft.rhein-main.de
-E: kkeyte@esoc.esa.de
+E: kkeyte@koft.com
 D: Disk usage statistics and modifications to line printer driver
-S: Erbacher Strasse 6
-S: D-64283 Darmstadt
-S: Germany
+S: 26a Sheen Road
+S: Richmond
+S: Surrey
+S: TW9 1AE
+S: United Kingdom
 
 N: Olaf Kirch
 E: okir@monad.swb.de
@@ -839,9 +839,10 @@
 N: Jamie Lokier
 E: jamie@imbolc.ucc.ie
 D: Reboot-through-BIOS for broken 486 motherboards
-S: 26 Oatlands Road
+S: 11 Goodson Walk
+S: Marston
 S: Oxford
-S: OX2 0ET
+S: OX3 0HX
 S: United Kingdom
 
 N: Mark Lord
@@ -872,16 +873,12 @@
 S: 00200 Helsinki
 S: Finland
 
-N: Kai Mäkisara
-E: Kai.Makisara@metla.fi
-D: SCSI Tape Driver
-
 N: Hamish Macdonald
-E: hamish@border.ocunix.on.ca
+E: hamishm@lucent.com
 D: Linux/68k port
-S: 102-B Valleystream Drive
-S: Nepean, Ontario
-S: Canada K2H-9E1
+S: 32 Clydesdale Avenue
+S: Kanata, Ontario
+S: Canada K2M-2G7
 
 N: Peter MacDonald
 D: SLS distribution
@@ -904,6 +901,10 @@
 S: Halifax, Nova Scotia
 S: Canada B3J 3C8
 
+N: Kai Mäkisara
+E: Kai.Makisara@metla.fi
+D: SCSI Tape Driver
+
 N: Martin Mares
 E: mj@k332.feld.cvut.cz
 W: http://atrey.karlin.mff.cuni.cz/~mj/
@@ -957,13 +958,12 @@
 S: Germany
 
 N: Michael Meskes
-E: meskes@topsystem.de
+E: meskes@debian.org
 P: 1024/04B6E8F5 6C 77 33 CA CC D6 22 03  AB AB 15 A3 AE AD 39 7D
 D: Kernel hacker. Software watchdog daemon.
 D: Maintainer of several Debian packages
-S: topsystem Systemhaus GmbH
-S: Europark A2, Adenauerstr. 20
-S: D-52146 Wuerselen
+S: Th.-Heuss-Str. 61 
+S: D-41812 Erkelenz
 S: Germany
 
 N: Nigel Metheringham
@@ -988,20 +988,21 @@
 S: Australia
 
 N: Pauline Middelink
-E: middelin@polyware.iaf.nl
+E: middelin@polyware.nl
 D: General low-level bug fixes, /proc fixes, identd support
 S: Boterkorfhoek 34
 S: 7546 JA  Enschede
 S: Netherlands
 
 N: David S. Miller
-E: davem@caip.rutgers.edu
+E: davem@redhat.com
 D: Sparc hacker
 D: New Linux-Activists maintainer
 D: Linux Emacs elf/qmagic support + other libc/gcc things
 D: Yee bore de yee bore! ;-)
-S: 2 Bristol Court
-S: East Brunswick, New Jersey 08816
+S: 750 N. Shoreline Blvd.
+S: Apt. #111
+S: Mountain View, California 94043
 S: USA
 
 N: Rick Miller
@@ -1038,6 +1039,7 @@
 S: Germany
 
 N: David Mosberger-Tang
+E: davidm@hpl.hp.com (IA-64 related)
 E: David.Mosberger@acm.org
 D: Linux/Alpha
 S: 35706 Runckel Lane
@@ -1052,7 +1054,7 @@
 S: USA
 
 N: Johan Myreen
-E: jem@vipunen.hut.fi
+E: jem@iki.fi
 D: PS/2 mouse driver writer etc.
 S: Dragonvagen 1 A 13
 S: FIN-00330 Helsingfors
@@ -1104,7 +1106,8 @@
 D: IPX development and support
 
 N: Avery Pennarun
-E: apenwarr@bond.net
+E: apenwarr@worldvisions.ca
+W: http://www.worldvisions.ca/~apenwarr/
 D: ARCnet driver
 D: "make xconfig" improvements
 D: Various minor hacking
@@ -1158,28 +1161,29 @@
 
 N: Eric S. Raymond
 E: esr@thyrsus.com
-W: http://www.ccil.org/~esr/home.html
+W: http://www.tuxedo.org/~esr/
 D: ncurses library co-maintainer
 D: terminfo master file maintainer
 D: Distributions HOWTO editor
 D: Instigator, FHS standard
 D: Keeper of the Jargon File and curator of the Retrocomputing Museum
 D: Author, Emacs VC and GUD modes
-S: 22 South Warren Avenue
+S: 6 Karen Drive
 S: Malvern, Pennsylvania 19355
 S: USA
 
 N: Stefan Reinauer
-E: stepan@home.culture.mipt.ru
-W: http://home.culture.mipt.ru/~stepan
+E: stepan@linux.de
+W: http://www.freiburg.linux.de/~stepan/
 D: Modularized affs and ufs. Minor fixes.
-S: Rebmannsweg 34h
-S: 79539 Loerrach
+S: Schlossbergring 9
+S: 79098 Freiburg
 S: Germany
 
 N: Joerg Reuter
-E: jreuter@lykos.oche.de
-E: dl1bke@db0pra.ampr.org (amateur radio)
+E: jreuter@poboxes.com
+W: http://poboxes.com/jreuter/
+W: http://qsl.net/dl1bke/
 D: Z8530 SCC driver and DAMA Slave for AX.25
 
 N: William E. Roadcap
@@ -1199,8 +1203,8 @@
 S: Germany
 
 N: Stephen Rothwell
-E: Stephen.Rothwell@canb.auug.org.au
-W: http://www.canb.auug.org.au/~sfr
+E: sfr@linuxcare.com
+W: http://linuxcare.com.au/sfr
 P: 1024/BD8C7805 CD A4 9D 01 10 6E 7E 3B  91 88 FA D9 C8 40 AA 02
 D: Boot/setup/build work for setup > 2K
 D: Author, APM driver
@@ -1248,6 +1252,11 @@
 S: S-226 64 LUND
 S: Sweden
 
+N: Henning P. Schmiedehausen
+E: hps@tanstaafl.de
+D: added PCI support to the serial driver
+S: Buckenhof, Germany
+
 N: Peter De Schrijver
 E: stud11@cc4.kuleuven.ac.be
 D: Mitsumi CD-ROM driver patches March version
@@ -1255,11 +1264,6 @@
 S: B2240 Zandhoven
 S: Belgium
 
-N: Henning P. Schmiedehausen
-E: hps@tanstaafl.de
-D: added PCI support to the serial driver
-S: Buckenhof, Germany
-
 N: Martin Schulze
 E: joey@linux.de
 W: http://home.pages.de/~joey/
@@ -1267,12 +1271,13 @@
 D: CD-List, Books-List, Ex-FAQ
 D: Linux-Support, -Mailbox, -Stammtisch
 D: several improvements to system programs
-S: Oldenburg, Germany
+S: Oldenburg
+S: Germany
 
 N: Darren Senn
 E: sinster@darkwater.com
 D: Whatever I notice needs doing (so far: itimers, /proc)
-S: POB 64132
+S: Post Office Box 64132
 S: Sunnyvale, California 94088-4132
 S: USA
 
@@ -1286,14 +1291,12 @@
 S: USA
 
 N: Mike Shaver
-E: shaver@ingenia.com
-W: http://neon.ingenia.com/~shaver/
+E: shaver@hungry.org
+W: http://www.hungry.org/~shaver/
 D: Network hacking, /proc/sys/net
-S: c/o Ingenia Communications Corporation
-S: Suite 4200, CTTC Building
-S: 1125 Colonel By Drive
-S: Ottawa, Ontario
-S: Canada K1S 5R1
+S: 149 Union St.
+S: Kingston, Ontario
+S: Canada K7L 2P4
 
 N: John Shifflett
 E: john@geolog.com
@@ -1315,11 +1318,11 @@
 N: Craig Small
 E: csmall@triode.apana.org.au
 E: vk2xlz@gonzo.vk2xlz.ampr.org (packet radio)
+D: Gracilis PackeTwin device driver
+D: RSPF daemon 
 S: 10 Stockalls Place
 S: Minto, NSW, 2566
 S: Australia
-D: Gracilis PackeTwin device driver
-D: RSPF daemon 
 
 N: Chris Smith
 E: csmith@convex.com
@@ -1351,9 +1354,9 @@
 S: USA
 
 N: Henrik Storner
-E: storner@osiris.ping.dk
-E: storner@olicom.dk
-W: http://eolicom.olicom.dk/~storner/
+E: storner@image.dk
+W: http://www.image.dk/~storner/
+W: http://www.sslug.dk/
 D: Configure script: tristate, bugfixes
 D: vfat/msdos integration, kerneld docs, Linux promotion
 S: Chr. Winthersvej 1 B, st.th.
@@ -1380,11 +1383,12 @@
 S: France
 
 N: Jon Tombs
-E: jon@gtex02.us.es
+E: jon@gte.esi.us.es
+W: http://www.esi.us.es/~jon
 D: NFS mmap()
 D: XF86_S3
 D: Kernel modules
-S: C/ Carlos de Cepeda 36 2-5
+S: C/ Federico Garcia Lorca 1 10-A
 S: Sevilla 41005
 S: Spain
 
@@ -1393,7 +1397,7 @@
 W: http://www.cs.helsinki.fi/~torvalds/
 P: 1024/A86B35C5 96 54 50 29 EC 11 44 7A  BE 67 3C 24 03 13 62 C8
 D: Original kernel hacker
-S: 3665 Benton Street #36
+S: 1050 Woodduck Avenue
 S: Santa Clara, California 95051
 S: USA
 
@@ -1408,11 +1412,12 @@
 S: CANADA K2L 1S2
 
 N: Andrew Tridgell
-E: Andrew.Tridgell@anu.edu.au
+E: tridge@samba.org
+W: http://linuxcare.com.au/tridge/
 D: dosemu, networking, samba
 S: 3 Ballow Crescent
-S: MacGregor A.C.T
-S: 2615 Australia
+S: MacGregor A.C.T 2615
+S: Australia
 
 N: Winfried Trümper
 E: winni@xpilot.org
@@ -1423,6 +1428,17 @@
 S: Tacitusstr. 6
 S: D-50968 Köln
 
+N: Tsu-Sheng Tsao
+E: tsusheng@scf.usc.edu
+D: IGMP(Internet Group Management Protocol) version 2
+S: 2F 14 ALY 31 LN 166 SEC 1 SHIH-PEI RD
+S: Taipei 
+S: Taiwan 112
+S: Republic of China
+S: 24335 Delta Drive
+S: Diamond Bar, California 91765
+S: USA
+
 N: Theodore Ts'o
 E: tytso@mit.edu
 D: Random Linux hacker
@@ -1438,16 +1454,6 @@
 S: Cambridge, Massachusetts 02139
 S: USA
 
-N: Tsu-Sheng Tsao
-E: tsusheng@scf.usc.edu
-D: IGMP(Internet Group Management Protocol) version 2
-S: 2F 14 ALY 31 LN 166 SEC 1 SHIH-PEI RD
-S: Taipei 
-S: Taiwan 112, Republic of China
-S: 24335 Delta Drive
-S: Diamond Bar, California 91765
-S: USA
-
 N: Simmule Turner
 E: sturner@tele-tv.com
 D: Added swapping to filesystem
@@ -1487,7 +1493,7 @@
 S: Australia
 
 N: Jeffrey A. Uphoff
-E: juphoff@nrao.edu
+E: juphoff@transmeta.com
 E: jeff.uphoff@linux.org
 P: 1024/9ED505C5 D7 BB CA AA 10 45 40 1B  16 19 0A C0 38 A0 3E CB
 D: Linux Security/Alert mailing lists' moderator/maintainer.
@@ -1495,9 +1501,9 @@
 D: PAM S/Key module developer.
 D: 'dip' contributor.
 D: AIPS port, astronomical community support.
-S: National Radio Astronomy Observatory
-S: 520 Edgemont Road
-S: Charlottesville, Virginia 22903
+S: Transmeta Corporation
+S: 2540 Mission College Blvd.
+S: Santa Clara, CA 95054
 S: USA
 
 N: Matthias Urlichs
@@ -1534,6 +1540,16 @@
 E: jnweiger@immd4.informatik.uni-erlangen.de
 D: The Linux Support Team Erlangen
 
+N: David Weinehall
+E: tao@acc.umu.se
+W: http://www.acc.umu.se/~tao/
+W: http://www.acc.umu.se/~mcalinux/
+D: Miscellaneous fixes
+D: Cleanup of the Config-files
+S: Axtorpsvagen 40:20
+S: S-903 37  UMEA
+S: Sweden
+
 N: Matt Welsh
 E: mdw@sunsite.unc.edu
 D: Linux Documentation Project coordinator
@@ -1541,10 +1557,9 @@
 D: Linuxdoc-SGML formatting system
 D: Keithley DAS1200 device driver
 D: Maintainer of sunsite WWW and FTP, moderator c.o.l.answers
-S: Cornell University Computer Science Department
-S: Robotics and Vision Laboratory
-S: 4130 Upson Hall
-S: Ithaca, New York 14850
+S: Computer Science Division
+S: UC Berkeley
+S: Berkeley, CA 94720-1776
 S: USA
 
 N: Greg Wettstein
@@ -1569,8 +1584,8 @@
 S: Germany
 
 N: Marco van Wieringen
-E: mvw@mercury.mcs.nl.mugnet.org
-D: Author of acct and quota
+E: mvw@planets.elm.net
+D: Author of process accounting and diskquota
 S: Breeburgsingel 12
 S: 2135 CN Hoofddorp
 S: The Netherlands
@@ -1646,7 +1661,7 @@
 S: USA
 
 N: Werner Zimmermann
-E: zimmerma@rz.fht-esslingen.de
+E: Werner.Zimmermann@fht-esslingen.de
 D: CDROM driver "aztcd" (Aztech/Okano/Orchid/Wearnes)
 S: Flandernstrasse 101
 S: D-73732 Esslingen
@@ -1663,7 +1678,7 @@
 S: USA
 
 N: Marc Zyngier
-E: maz@gloups.fdn.fr
+E: maz@wild-wind.fr.eu.org
 D: MD driver
 S: 11 rue Victor HUGO
 S: 95560 Montsoult
diff -u --recursive --new-file linux-2.0.38/Documentation/Changes linux-2.0.39/Documentation/Changes
--- linux-2.0.38/Documentation/Changes	Sun Jun 13 19:20:59 1999
+++ linux-2.0.39/Documentation/Changes	Thu Dec 16 08:57:42 1999
@@ -44,7 +44,7 @@
    The most current version should always be available from
 http://cyberbuzz.gatech.edu/kaboom/linux/ as well.
 
-Last updated: February 16, 1998.
+Last updated: December 16, 1999.
 Current Author: Chris Ricker (kaboom@gatech.edu).
 
 Current Releases (the latest necessary for basic functionality, not
@@ -56,7 +56,7 @@
 - PPP daemon		 2.2.0f
 - Dynamic linker (ld.so) 1.7.14
 - GNU CC		 2.7.2.1
-- Binutils		 2.7.0.3
+- Binutils		 2.8.1.0.23
 - Linux C Library	 Stable:  5.2.18, Beta:  5.4.33
 - Linux C++ Library	 2.7.2.1
 - Termcap		 2.0.8
diff -u --recursive --new-file linux-2.0.38/Documentation/CodingStyle linux-2.0.39/Documentation/CodingStyle
--- linux-2.0.38/Documentation/CodingStyle	Tue Dec 29 20:57:33 1998
+++ linux-2.0.39/Documentation/CodingStyle	Thu Dec 30 20:36:13 1999
@@ -8,7 +8,7 @@
 at least consider the points made here. 
 
 First off, I'd suggest printing out a copy of the GNU coding standards,
-and NOT reading it.  Burn them, it's a great symbolic gesture. 
+and NOT read it.  Burn them, it's a great symbolic gesture. 
 
 Anyway, here goes:
 
@@ -59,8 +59,7 @@
 Heretic people all over the world have claimed that this inconsistency
 is ...  well ...  inconsistent, but all right-thinking people know that
 (a) K&R are _right_ and (b) K&R are right.  Besides, functions are
-special anyway (you can't nest them in C (well, you can in gcc, actually,
-but this is horribly nonstandard, so we will ignore it)). 
+special anyway (you can't nest them in C). 
 
 Note that the closing brace is empty on a line of its own, _except_ in
 the cases where it is followed by a continuation of the same statement,
@@ -184,14 +183,8 @@
   "C mode with adjusted defaults for use with the Linux kernel."
   (interactive)
   (c-mode)
-  (setq c-indent-level 8)
-  (setq c-brace-imaginary-offset 0)
-  (setq c-brace-offset -8)
-  (setq c-argdecl-indent 8)
-  (setq c-label-offset -8)
-  (setq c-continued-statement-offset 8)
-  (setq indent-tabs-mode nil)
-  (setq tab-width 8))
+  (c-set-style "K&R")
+  (setq c-basic-offset 8))
 
 This will define the M-x linux-c-mode command.  When hacking on a
 module, if you put the string -*- linux-c -*- somewhere on the first
@@ -217,3 +210,26 @@
 "indent" has a lot of options, and especially when it comes to comment
 re-formatting you may want to take a look at the manual page.  But
 remember: "indent" is not a fix for bad programming. 
+
+
+		Chapter 7: Configuration-files
+
+For configuration options (arch/xxx/config.in, and all the Config.in files),
+somewhat different indentation is used.
+
+An indention level of 3 is used in the code, while the text in the config-
+options should have an indention-level of 2 to indicate dependencies. The
+latter only applies to bool/tristate options. For other options, just use
+common sense. An example:
+
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+   tristate 'Apply nitroglycerine inside the keyboard (DANGEROUS)' CONFIG_BOOM
+   if [ "$CONFIG_BOOM" != "n" ]; then
+      bool '  Output nice messages when you explode' CONFIG_CHEER
+   fi
+fi
+
+Generally, CONFIG_EXPERIMENTAL should surround all options not considered
+stable. All options that are known to trash data (experimental write-
+support for file-systems, for instance) should be denoted (DANGEROUS), other
+Experimental options should be denoted (EXPERIMENTAL).
diff -u --recursive --new-file linux-2.0.38/Documentation/Configure.help linux-2.0.39/Documentation/Configure.help
--- linux-2.0.38/Documentation/Configure.help	Sun Jun 13 19:20:59 1999
+++ linux-2.0.39/Documentation/Configure.help	Thu Dec 30 02:06:38 1999
@@ -878,7 +878,7 @@
   boot time ("man dmesg"), please follow the instructions at the top
   of include/linux/pci.h.
 
-PCI bridge optimization (experimental)
+PCI bridge optimization (EXPERIMENTAL)
 CONFIG_PCI_OPTIMIZE
   This can improve access times for some hardware devices under
   certain BIOSes if your computer uses a PCI bus system. This is
@@ -2513,7 +2513,7 @@
   running kernel whenever you want), say M here and read
   Documentation/modules.txt.
 
-BAYCOM ser12 and par96 driver for AX.25
+BAYCOM ser12 and par96 driver for AX.25 (EXPERIMENTAL)
 CONFIG_BAYCOM
   This is an experimental driver for Baycom style simple amateur radio
   modems that connect to either a serial interface or a parallel
@@ -2525,7 +2525,7 @@
   inserted in and removed from the running kernel whenever you want),
   say M here and read Documentation/modules.txt. This is recommended.
 
-Sound card modem driver for AX.25
+Sound card modem driver for AX.25 (EXPERIMENTAL)
 CONFIG_SOUNDMODEM
   This experimental driver allows a standard SoundBlaster or
   WindowsSoundSystem compatible sound card to be used as a packet
@@ -2591,13 +2591,13 @@
   with many transceiver designs and the fact that the TCM3105 (if
   used) is operated widely outside its specifications.
 
-Sound card modem support for 2666 baud AFSK modulation
+Sound card modem support for 2666 baud AFSK modulation (EXPERIMENTAL)
 CONFIG_SOUNDMODEM_AFSK2666
   This option enables the soundmodem driver 2666 baud AFSK modem.
   This modem is experimental, and not compatible to anything
   else I know of.
 
-Sound card modem support for 4800 baud 8PSK modulation
+Sound card modem support for 4800 baud 8PSK modulation (EXPERIMENTAL)
 CONFIG_SOUNDMODEM_PSK4800
   This option enables the soundmodem driver 4800 baud 8PSK modem.
   This modem is experimental, and not compatible to anything
@@ -3042,7 +3042,7 @@
   If you use FMV-183 or FMV-184 and it is not working, you may need
   to disable Plug & Play mode of the card.
 
-Intel EtherExpress/Pro 100B support'
+Intel EtherExpress/Pro 100B support (EXPERIMENTAL)
 CONFIG_EEXPRESS_PRO100B
   If you have an Intel EtherExpress Pro 100 10/100Mbps PCI Ethernet
   card, answer yes.  As of kernel release 2.0.31 this driver was
@@ -3975,7 +3975,7 @@
   whenever you want), say M here and read Documentation/modules.txt.
   If you haven't heard about all of this before, it's safe to say N.
 
-Kernel automounter support (experimental)
+Kernel automounter support (EXPERIMENTAL)
 CONFIG_AUTOFS_FS
   The automounter is a tool to automatically mount remote filesystems
   on demand.  This implementation is partially kernel-based to reduce
diff -u --recursive --new-file linux-2.0.38/Documentation/isdn/README linux-2.0.39/Documentation/isdn/README
--- linux-2.0.38/Documentation/isdn/README	Sun Jun 13 19:20:59 1999
+++ linux-2.0.39/Documentation/isdn/README	Mon Dec 27 22:32:01 1999
@@ -335,7 +335,7 @@
       "manual" is a dial mode created to prevent the unexpected dialouts.
         In this mode, the interface will never make any connections on its
         own. You must explicitly initiate a connection with "isdnctrl dial
-        sdn0". However, after an idle time of no traffic as configured for 
+        isdn0". However, after an idle time of no traffic as configured for 
         the huptimeout value with isdnctrl, the connection _will_ be ended.
         If you don't want any automatic hangup, set the huptimeout value to 0.
         "manual" is the default.
diff -u --recursive --new-file linux-2.0.38/Documentation/oops-tracing.txt linux-2.0.39/Documentation/oops-tracing.txt
--- linux-2.0.38/Documentation/oops-tracing.txt	Wed Sep 11 16:57:13 1996
+++ linux-2.0.39/Documentation/oops-tracing.txt	Wed Dec 29 12:36:45 1999
@@ -1,4 +1,4 @@
-From: Linus Torvalds <torvalds@cs.helsinki.fi>
+From: Linus Torvalds <torvalds@transmeta.com>
 
 How to track down an Oops.. [originally a mail to linux-kernel]
 
diff -u --recursive --new-file linux-2.0.38/MAINTAINERS linux-2.0.39/MAINTAINERS
--- linux-2.0.38/MAINTAINERS	Sun Jun 13 19:20:59 1999
+++ linux-2.0.39/MAINTAINERS	Thu Dec 30 20:18:18 1999
@@ -16,7 +16,8 @@
 	SMC etherpower for that.)
 
 3.	Make sure your changes compile correctly in multiple
-	configurations.
+	configurations. In particular check that changes work both as a
+	module and built into the kernel.
 
 4.	When you are happy with a change make it generally available for
 	testing and await feedback.
@@ -28,7 +29,8 @@
 	job the maintainers (and especially Linus) do is to keep things
 	looking the same. Sometimes this means that the clever hack in
 	your driver to get around a problem actual needs to become a
-	generalised kernel feature ready for next time.
+	generalised kernel feature ready for next time. See
+	Documentation/CodingStyle for guidance here.
 
 	PLEASE try to include any credit lines you want added with the
 	patch. It avoids people being missed off by mistake and makes
@@ -68,93 +70,67 @@
 			it has been replaced by a better system and you
 			should be using that.
 
-EXT2 FILE SYSTEM
-P:	Remy Card
-M:	Remy.Card@linux.org
-L:	linux-kernel@vger.rutgers.edu
-S:	Maintained
-
 3C501 NETWORK DRIVER
 P:	Alan Cox
-M:	net-patches@lxorguk.ukuu.org.uk
-L:	linux-net@vger.rutgers.edu
-S:	Maintained
-
-8390 NETWORK DRIVERS [WD80x3/SMC-ELITE, SMC-ULTRA, NE2000, 3C503, etc.]
-P:	Paul Gortmaker
-M:	gpg109@rsphy1.anu.edu.au
-L:	linux-net@vger.rutgers.edu
-S:	Maintained
-
-ETHEREXPRESS-16 NETWORK DRIVER
-P:	Philip Blundell
-M:	pjb27@cam.ac.uk
+M:	alan@the.3c501.cabal.tm
 L:	linux-net@vger.rutgers.edu
 S:	Maintained
 
 3C505 NETWORK DRIVER
 P:	Philip Blundell
-M:	phil@tazenda.demon.co.uk
+M:	Philip.Blundell@pobox.com
 L:	linux-net@vger.rutgers.edu
 S:	Maintained
 
-TLAN NETWORK DRIVER
-P:	James Banks
-M:	james.banks@caldera.com
-L:	linux-net@vger.rutgers.edu
-S:	Supported
-
-DIGI RIGHTSWITCH NETWORK DRIVER
-P:	Rick Richardson
-M:	rick@dgii.com
+8390 NETWORK DRIVERS [WD80x3/SMC-ELITE, SMC-ULTRA, NE2000, 3C503, etc.]
+P:	Paul Gortmaker
+M:	gpg109@rsphy1.anu.edu.au
 L:	linux-net@vger.rutgers.edu
-W:	http://www.dgii.com/linux/
 S:	Maintained
 
-WAVELAN NETWORK DRIVER & WIRELESS EXTENSIONS
-P:	Jean Tourrilhes
-M:	jt@hplb.hpl.hp.com
+ADVANSYS SCSI DRIVER
+P:	Bob Frey
+M:	linux@advansys.com
+W:	http://www.advansys.com/linux.html
+L:	linux-scsi@vger.rutgers.edu
 S:	Maintained
 
-TOKEN-RING NETWORK DRIVER
-P:      Paul Norton
-M:      pnorton@cts.com
-L:      linux-net@vger.rutgers.edu
-S:      Maintained
+AHA152X SCSI DRIVER
+P:	Juergen E. Fischer
+M:	Juergen Fischer <fischer@et-inf.fho-emden.de>
+L:	linux-scsi@vger.rutgers.edu
+S:	Maintained
 
 APM DRIVER
 P:	Stephen Rothwell
-M:	Stephen.Rothwell@canb.auug.org.au
+M:	apm@linuxcare.com.au
 L:	linux-laptop@vger.rutgers.edu
+W:	http://linuxcare.com.au/apm/
 S:	Maintained
 
 APPLETALK NETWORK LAYER
-P:	Alan Cox & University Of Michigan
-M:	net-patches@lxorguk.ukuu.org.uk, Cc: netatalk@umich.edu
-L:	[Someone fill in the netatalk list here]
+P:	Jay Schulist
+M:	Jay.Schulist@spacs.k12.wi.us
+L:	linux-atalk@netspace.org
 S:	Maintained
 
-AX.25 NETWORK LAYER
-P:	Jon Naylor
-M:	jsn@cs.nott.ac.uk
-L:	linux-hams@vger.rutgers.edu
-S:	Maintained
-
-IP MASQUERADING (IPV4)
-P:	Nigel Metheringham
-M:	Nigel.Metheringham@ThePLAnet.net
-L:	masq@indyramp.com
+ARPD SUPPORT
+P:	Jonathan Layes
+M:	layes@loran.com
+L:	linux-net@vger.rutgers.edu
 S:	Maintained
 
 AX.25 DAMA SLAVE
 P:	Joerg Reuter
 M:	jreuter@poboxes.com
+W:	http://poboxes.com/jreuter/
+W:	http://qsl.net/dl1bke/
 L:	linux-hams@vger.rutgers.edu
 S:	Maintained
 
-Z8530 SCC DRIVER FOR AX.25
-P:	Joerg Reuter
-M:	jreuter@poboxes.com
+AX.25 NETWORK LAYER
+P:	Matthias Welwarsky
+M:	dg2fef@afthd.tu-darmstadt.de
 L:	linux-hams@vger.rutgers.edu
 S:	Maintained
 
@@ -162,6 +138,12 @@
 P:	Leonard N. Zubkoff
 M:	Leonard N. Zubkoff <lnz@dandelion.com>
 L:	linux-scsi@vger.rutgers.edu
+W:	http://www.dandelion.com/Linux/
+S:	Maintained
+
+CREDITS FILE
+P:	John A. Martin
+M:	jam@acm.org
 S:	Maintained
 
 CYCLADES ASYNC MUX DRIVER
@@ -170,28 +152,35 @@
 W:	http://www.cyclades.com/
 S:	Supported
 
+DAC960 RAID DRIVER
+P:	Leonard N. Zubkoff
+M:	Leonard N. Zubkoff <lnz@dandelion.com>
+L:	linux-raid@vger.rutgers.edu
+S:	Maintained
+
 DC390/AM53C974 SCSI driver
 P:	Kurt Garloff
 M:	kurt@garloff.de
 W:	http://www.garloff.de/kurt/linux/dc390/
 S:	Maintained
 
-DAC960 RAID DRIVER
-P:	Leonard N. Zubkoff
-M:	Leonard N. Zubkoff <lnz@dandelion.com>
-L:	linux-raid@vger.rutgers.edu
+DEVICE NUMBER REGISTRY
+P:	H. Peter Anvin
+M:	hpa@zytor.com
+L:	linux-kernel@vger.rutgers.edu
 S:	Maintained
 
-EATA ISA/EISA/PCI SCSI DRIVER
-P:	Dario Ballabio
-M:	dario@milano.europe.dg.com
-L:	linux-scsi@vger.rutgers.edu
+DIGIBOARD DRIVER
+P:	Christoph Lameter
+M:	clameter@fuller.edu
+L:	digiboard@list.fuller.edu
 S:	Maintained
 
-U14-34F SCSI DRIVER
-P:	Dario Ballabio
-M:	dario@milano.europe.dg.com
-L:	linux-scsi@vger.rutgers.edu
+DIGI RIGHTSWITCH NETWORK DRIVER
+P:	Rick Richardson
+M:	rick@dgii.com
+L:	linux-net@vger.rutgers.edu
+W:	http://www.dgii.com/linux/
 S:	Maintained
 
 EATA-DMA SCSI DRIVER
@@ -200,46 +189,65 @@
 L:	linux-eata@i-connect.net, linux-scsi@vger.rutgers.edu
 S:	Maintained
 
+EATA ISA/EISA/PCI SCSI DRIVER
+P:	Dario Ballabio
+M:	dario@milano.europe.dg.com
+L:	linux-scsi@vger.rutgers.edu
+S:	Maintained
+
 EATA-PIO SCSI DRIVER
 P:	Michael Neuffer
 M:	mike@i-Connect.Net
 L:	linux-eata@i-connect.net, linux-scsi@vger.rutgers.edu
 S:	Maintained
 
+ETHEREXPRESS-16 NETWORK DRIVER
+P:	Philip Blundell
+M:	Philip.Blundell@pobox.com
+L:	linux-net@vger.rutgers.edu
+S:	Maintained
+
+EXT2 FILE SYSTEM
+P:	Remy Card
+M:	Remy.Card@linux.org
+L:	linux-kernel@vger.rutgers.edu
+S:	Maintained
+
 FILE LOCKING (flock() and fcntl()/lockf())
 P:	Andy Walker
 M:	andy@lysaker.kvaerner.no
 L:	linux-kernel@vger.rutgers.edu
 S:	Maintained
 
+FPU EMULATOR
+P:	Bill Metzenthen
+M:	billm@suburbia.net
+W:	http://suburbia.net/~billm/floating-point/emulator/
+S:	Maintained
+
 FRAME RELAY DLCI/FRAD (Sangoma drivers too)
 P:	Mike McLagan
 M:	mike.mclagan@linux.org
 L:	linux-net@vger.rutgers.edu
 S:	Maintained
 
+FTAPE/QIC-117
+P:	Claus-Justus Heine
+M:	claus@momo.math.rwth-aachen.de
+L:	linux-tape@vger.rutgers.edu
+W:	http://www-math.math.rwth-aachen.de/~LBFM/claus/ftape/
+S:	Maintained
+
 FUTURE DOMAIN TMC-16x0 SCSI DRIVER (16-bit)
 P:	Rik Faith
 M:	faith@cs.unc.edu
 L:	linux-scsi@vger.rutgers.edu
 S:	Odd fixes (e.g., new signatures)
 
-SCSI TAPE DRIVER
-P:	Kai Mäkisara
-M:	Kai.Makisara@metla.fi
-L:	linux-scsi@vger.rutgers.edu
-S:	Maintained
-
-FTAPE/QIC-117:
-P:	Claus-Justus Heine
-M:	claus@momo.math.rwth-aachen.de
-L:	linux-tape@vger.rutgers.edu
-S:	Maintained
-
-IPX NETWORK LAYER
-P:	Alan Cox [for the moment]
-M:	net-patches@lxorguk.ukuu.org.uk
-L:	linux-ipx@vger.rutgers.edu [will change]
+GSCD CDROM DRIVER
+P:	Oliver Raupach
+M:	oliver@mm.gop.de
+L:	linux-kernel@vger.rutgers.edu
 S:	Maintained
 
 IDE DRIVER [GENERAL]
@@ -251,9 +259,8 @@
 IDE/ATAPI CDROM DRIVER 
 P:	Jens Axboe
 M:	axboe@image.dk
-P:	Chris Zwilling
-M:	chris@cloudnet.com
 L:	linux-kernel@vger.rutgers.edu
+W:	http://www.kernel.dk
 S:	Maintained
 
 IDE/ATAPI TAPE/FLOPPY DRIVERS
@@ -262,20 +269,50 @@
 L:	linux-kernel@vger.rutgers.edu
 S:	Maintained
 
+IP MASQUERADING (IPV4)
+P:	Nigel Metheringham
+M:	Nigel.Metheringham@ThePLAnet.net
+L:	masq@indyramp.com
+S:	Maintained
+
+IPX NETWORK LAYER
+P:	Alan Cox [for the moment]
+M:	net-patches@lxorguk.ukuu.org.uk
+L:	linux-ipx@vger.rutgers.edu [will change]
+S:	Maintained
+
 ISDN SUBSYSTEM [GENERAL]
 P:	Fritz Elfert
 M:	fritz@isdn4linux.de
-L:	isdn4linux@hub-wue.franken.de
+L:	isdn4linux@listserv.isdn4linux.de
 W:	http://www.isdn4linux.de
 S:	Maintained
 
 ISDN SUBSYSTEM HISAX
 P:	Karsten Keil
 M:	keil@isdn4linux.de
-L:	isdn4linux@hub-wue.franken.de
+L:	isdn4linux@listserv.isdn4linux.de
 W:	http://www.isdn4linux.de
 S:	Maintained
 
+KERNEL AUTOMOUNTER (AUTOFS)
+P:	H. Peter Anvin
+M:	hpa@zytor.com
+L:	autofs@linux.kernel.org
+S:	Maintained
+
+LANCE AND LANCE32 NETWORK DRIVER
+P:	Thomas Bogendoerfer
+M:	tsbogend@bigbug.franken.de
+L:	linux-net@vger.rutgers.edu
+S:	Maintained
+
+MENUCONFIG
+P:	William Roadcap
+M:	roadcapw@titus.org
+L:	linux-kernel@vger.rutgers.edu
+S:	Maintained
+
 MODULE SUPPORT [GENERAL], KERNELD
 P:	Bjorn Ekwall
 M:	bj0rn@blox.se
@@ -283,13 +320,13 @@
 L:	linux-kernel@vger.rutgers.edu
 S:	Maintained
 
-ARPD SUPPORT
-P:	Jonathan Layes
-M:	layes@loran.com
-L:	linux-net@vger.rutgers.edu
+MOUSE AND MISC DEVICES [GENERAL]
+P:	Alessandro Rubini
+M:	rubini@ipvvis.unipv.it
+L:	linux-kernel@vger.rutgers.edu
 S:	Maintained
 
-NCP FILESYSTEM:
+NCP FILESYSTEM
 P:	Volker Lendecke
 M:	vl@kki.org
 L:	linware@sh.cvut.cz
@@ -301,77 +338,69 @@
 L:	linux-hams@vger.rutgers.edu
 S:	Maintained
 
-NETWORKING [GENERAL]:
+NETWORKING [GENERAL]
 P:	Alan Cox
 M:	net-patches@lxorguk.ukuu.org.uk
 L:	linux-net@vger.rutgers.edu
 S:	Odd Fixes <-> Maintained subject to workloads
 
+NON-IDE/NON-SCSI CDROM DRIVERS [GENERAL] (come on, crew - mark your responsibility)
+P:	Eberhard Moenkeberg
+M:	emoenke@gwdg.de
+L:	linux-kernel@vger.rutgers.edu
+S:	Maintained
+
 PPP PROTOCOL DRIVERS AND COMPRESSORS
 P:	Al Longyear
-M:	longyear@netcom.com, Cc: longyear@sii.com
+M:	longyear@pobox.com
 L:	linux-ppp@vger.rutgers.edu
 S:	Maintained
 
 REAL TIME CLOCK DRIVER
 P:	Paul Gortmaker
-M	gpg109@rsphy1.anu.edu.au
+M:	p_gortmaker@yahoo.com
 L:	linux-kernel@vger.rutgers.edu
 S:	Maintained
 
-STARMODE RADIO IP (STRIP) PROTOCOL DRIVER
-P:	Stuart Cheshire
-M:	cheshire@cs.stanford.edu
-W:	http://mosquitonet.Stanford.EDU/strip.html
-S:	Maintained
-
-SMB FILESYSTEM:
-P:	Volker Lendecke
-M:	vl@kki.org
-L:	samba@listproc.anu.edu.au
-S:	Odd Fixes
-
-SMP: (except SPARC)
-P:	Alan Cox
-M:	smp-patches@lxorguk.ukuu.org.uk
-L:	linux-smp@vger.rutgers.edu
+RISCOM8 DRIVER
+P:	Dmitry Gorodchanin
+M:	pgmdsg@ibi.com
+L:	linux-kernel@vger.rutgers.edu
 S:	Maintained
 
-SPARC:
-P:	David S. Miller
-M:	davem@caip.rutgers.edu
-L:	sparclinux@vger.rutgers.edu
+SBPCD CDROM DRIVER
+P:	Eberhard Moenkeberg
+M:	emoenke@gwdg.de
+L:	linux-kernel@vger.rutgers.edu
 S:	Maintained
 
 SCSI SUBSYSTEM
-P:	Leonard N. Zubkoff
-M:	Leonard N. Zubkoff <lnz@dandelion.com>
 L:	linux-scsi@vger.rutgers.edu
-S:	Maintained
+S:	Unmaintained
 
-SVGA HANDLING:
-P:	Martin Mares
-M:	mj@k332.feld.cvut.cz
-L:	linux-video@atrey.karlin.mff.cuni.cz
+SCSI TAPE DRIVER
+P:	Kai Mäkisara
+M:	Kai.Makisara@metla.fi
+L:	linux-scsi@vger.rutgers.edu
 S:	Maintained
 
-VFAT FILESYSTEM:
-P:	Gordon Chaffee
-M:	chaffee@plateau.cs.berkeley.edu
-L:	linux-kernel@vger.rutgers.edu
-W:	http://www-plateau.cs.berkeley.edu/people/chaffee
+SMB FILESYSTEM
+P:	Andrew Tridgell
+M:	tridge@samba.org
+W:	http://samba.org/
+L:	samba@samba.org
 S:	Maintained
 
-DIGIBOARD DRIVER:
-P:	Christoph Lameter
-M:	clameter@fuller.edu
-L:	digiboard@list.fuller.edu
+SMP (except SPARC)
+P:	Alan Cox
+M:	smp-patches@lxorguk.ukuu.org.uk
+L:	linux-smp@vger.rutgers.edu
 S:	Maintained
 
-RISCOM8 DRIVER:
-P:	Dmitry Gorodchanin
-M:	pgmdsg@ibi.com
-L:	linux-kernel@vger.rutgers.edu
+SPARC
+P:	David S. Miller
+M:	davem@redhat.com
+L:	sparclinux@vger.rutgers.edu
 S:	Maintained
 
 SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER
@@ -381,75 +410,52 @@
 L:	linux-kernel@vger.rutgers.edu ?
 S:	Supported
 
-MOUSE AND MISC DEVICES [GENERAL]
-P:	Alessandro Rubini
-M:	rubini@ipvvis.unipv.it
-L:	linux-kernel@vger.rutgers.edu
+STARMODE RADIO IP (STRIP) PROTOCOL DRIVER
+W:	http://mosquitonet.Stanford.EDU/strip.html
+S:	Unsupported ?
+
+SVGA HANDLING
+P:	Martin Mares
+M:	mj@atrey.karlin.mff.cuni.cz
+L:	linux-video@atrey.karlin.mff.cuni.cz
 S:	Maintained
 
-MENUCONFIG:
-P:	William Roadcap
-M:	roadcapw@titus.org
+THE V2.0 KERNEL IN GENERAL
+P:	David Weinehall
+M:	tao@acc.umu.se
 L:	linux-kernel@vger.rutgers.edu
 S:	Maintained
 
-LANCE AND LANCE32 NETWORK DRIVER
-P:	Thomas Bogendoerfer
-M:	tsbogend@bigbug.franken.de
-L:	linux-net@vger.rutgers.edu
+TLAN NETWORK DRIVER
+P:	Torben Mathiasen
+M:	torben.mathiasen@compaq.com
+L:	tlan@vuser.vu.union.edu
 S:	Maintained
 
-ADVANSYS SCSI DRIVER
-P:	Bob Frey
-M:	Bob Frey <bobf@advansys.com>
-W:	http://www.advansys.com/linux
-S:	Maintained
+TOKEN-RING NETWORK DRIVER
+P:      Paul Norton
+M:	pnorton@ieee.org
+L:      linux-net@vger.rutgers.edu
+L:	linux-tr@linuxtr.net
+S:      Maintained
 
-AHA152X SCSI DRIVER
-P:	Juergen E. Fischer
-M:	Juergen Fischer <fischer@et-inf.fho-emden.de>
+U14-34F SCSI DRIVER
+P:	Dario Ballabio
+M:	dario@milano.europe.dg.com
 L:	linux-scsi@vger.rutgers.edu
 S:	Maintained
 
-GSCD CDROM DRIVER
-P:	Oliver Raupach
-M:	oliver@mm.gop.de
-L:	linux-kernel@vger.rutgers.edu
-S:	Maintained
-
-SBPCD CDROM DRIVER
-P:	Eberhard Moenkeberg
-M:	emoenke@gwdg.de
-L:	linux-kernel@vger.rutgers.edu
-S:	Maintained
-
-NON-IDE/NON-SCSI CDROM DRIVERS [GENERAL] (come on, crew - mark your responsibility)
-P:	Eberhard Moenkeberg
-M:	emoenke@gwdg.de
+VFAT FILESYSTEM
+P:	Gordon Chaffee
+M:	chaffee@plateau.cs.berkeley.edu
 L:	linux-kernel@vger.rutgers.edu
+W:	http://bmrc.berkeley.edu/people/chaffee
 S:	Maintained
 
-FPU EMULATOR
-P:	Bill Metzenthen
-M:	billm@suburbia.net
-W:	http://suburbia.net/~billm/floating-point/emulator/
-S:	Maintained
-
-CREDITS FILE
-P:	John A. Martin
-M:	jam@acm.org
-S:	Maintained
-
-KERNEL AUTOMOUNTER (AUTOFS)
-P:	H. Peter Anvin
-M:	hpa@zytor.com
-L:	autofs@linux.kernel.org
-S:	Maintained
-
-DEVICE NUMBER REGISTRY
-P:	H. Peter Anvin
-M:	hpa@zytor.com
-L:	linux-kernel@vger.rutgers.edu
+WAVELAN NETWORK DRIVER & WIRELESS EXTENSIONS
+P:	Jean Tourrilhes
+M:	jt@hpl.hp.com
+W:	http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/
 S:	Maintained
 
 WD7000 SCSI DRIVER
@@ -458,6 +464,14 @@
 L:	linux-scsi@vger.rutgers.edu
 S:	Maintained
 
-REST:
+Z8530 SCC DRIVER FOR AX.25
+P:	Joerg Reuter
+M:	jreuter@poboxes.com
+W:	http://poboxes.com/jreuter/
+W:	http://qsl.net/dl1bke/
+L:	linux-hams@vger.rutgers.edu
+S:	Maintained
+
+THE REST
 P:	Linus Torvalds
 S:	Buried alive in email
diff -u --recursive --new-file linux-2.0.38/Makefile linux-2.0.39/Makefile
--- linux-2.0.38/Makefile	Thu Aug 26 00:08:27 1999
+++ linux-2.0.39/Makefile	Wed Dec 15 12:22:10 1999
@@ -1,6 +1,6 @@
 VERSION = 2
 PATCHLEVEL = 0
-SUBLEVEL = 38
+SUBLEVEL = 39
 
 ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
 
diff -u --recursive --new-file linux-2.0.38/arch/alpha/config.in linux-2.0.39/arch/alpha/config.in
--- linux-2.0.38/arch/alpha/config.in	Thu Jun  4 00:17:46 1998
+++ linux-2.0.39/arch/alpha/config.in	Thu Dec 30 00:08:26 1999
@@ -22,9 +22,9 @@
 comment 'Loadable module support'
 bool 'Enable loadable module support' CONFIG_MODULES
 if [ "$CONFIG_MODULES" = "y" ]; then
-  MODULES=y
-  bool 'Set version information on all symbols for modules' CONFIG_MODVERSIONS
-  bool 'Kernel daemon support (e.g. autoload of modules)' CONFIG_KERNELD
+   MODULES=y
+   bool 'Set version information on all module symbols' CONFIG_MODVERSIONS
+   bool 'Kernel daemon support (e.g. autoload of modules)' CONFIG_KERNELD
 fi
 endmenu
 
@@ -32,9 +32,9 @@
 comment 'General setup'
 
 if [ "`uname`" != "Linux" ]; then
-  define_bool CONFIG_CROSSCOMPILE y
+   define_bool CONFIG_CROSSCOMPILE y
 else
-  define_bool CONFIG_NATIVE y
+   define_bool CONFIG_NATIVE y
 fi
 
 choice 'Alpha system type' \
@@ -61,72 +61,61 @@
 	 Ruffian	CONFIG_ALPHA_RUFFIAN		\
 	 Platform2000	CONFIG_ALPHA_P2K" Cabriolet
 
-if [ "$CONFIG_ALPHA_BOOK1" = "y" ]
-then
-	define_bool CONFIG_ALPHA_NONAME y
+if [ "$CONFIG_ALPHA_BOOK1" = "y" ]; then
+   define_bool CONFIG_ALPHA_NONAME y
 fi
 if [ "$CONFIG_ALPHA_NONAME" = "y" -o "$CONFIG_ALPHA_EB66" = "y" \
-	-o "$CONFIG_ALPHA_EB66P" = "y" -o "$CONFIG_ALPHA_P2K" = "y" ]
-then
-	define_bool CONFIG_PCI y
-	define_bool CONFIG_ALPHA_EV4 y
-	define_bool CONFIG_ALPHA_LCA y
+	-o "$CONFIG_ALPHA_EB66P" = "y" -o "$CONFIG_ALPHA_P2K" = "y" ]; then
+   define_bool CONFIG_PCI y
+   define_bool CONFIG_ALPHA_EV4 y
+   define_bool CONFIG_ALPHA_LCA y
 fi
 if [ "$CONFIG_ALPHA_CABRIOLET" = "y" -o "$CONFIG_ALPHA_AVANTI" = "y" \
-	-o "$CONFIG_ALPHA_EB64P" = "y" -o "$CONFIG_ALPHA_XL" = "y" ]
-then
-	define_bool CONFIG_PCI y
-	define_bool CONFIG_ALPHA_EV4 y
-	define_bool CONFIG_ALPHA_APECS y
+	-o "$CONFIG_ALPHA_EB64P" = "y" -o "$CONFIG_ALPHA_XL" = "y" ]; then
+   define_bool CONFIG_PCI y
+   define_bool CONFIG_ALPHA_EV4 y
+   define_bool CONFIG_ALPHA_APECS y
 fi
 if [ "$CONFIG_ALPHA_EB164" = "y" -o "$CONFIG_ALPHA_PC164" = "y" \
 	-o "$CONFIG_ALPHA_ALCOR" = "y" -o "$CONFIG_ALPHA_XLT" = "y" \
-	-o "$CONFIG_ALPHA_TAKARA" = "y" ]
-then
-	define_bool CONFIG_PCI y
-	define_bool CONFIG_ALPHA_EV5 y
-	define_bool CONFIG_ALPHA_CIA y
-fi
-if [ "$CONFIG_ALPHA_MIKASA" = "y" -o "$CONFIG_ALPHA_NORITAKE" = "y" ]
-then
-	bool 'Pinnacle or Primo CPU daughtercard?' CONFIG_ALPHA_PRIMO
-	if [ "$CONFIG_ALPHA_PRIMO" = "y" ]
-	then
-		define_bool CONFIG_ALPHA_EV5 y
-		define_bool CONFIG_ALPHA_CIA y
-else
-		define_bool CONFIG_ALPHA_EV4 y
-		define_bool CONFIG_ALPHA_APECS y
-	fi
-	define_bool CONFIG_PCI y
-fi
-if [ "$CONFIG_ALPHA_SABLE" = "y" ]
-then
-	bool 'EV5 or EV56 CPU daughtercard?' CONFIG_ALPHA_GAMMA
-	if [ "$CONFIG_ALPHA_GAMMA" = "y" ]
-	then
-		define_bool CONFIG_ALPHA_EV5 y
-else
-		define_bool CONFIG_ALPHA_EV4 y
-	fi
-	define_bool CONFIG_PCI y
-	define_bool CONFIG_ALPHA_T2 y
+	-o "$CONFIG_ALPHA_TAKARA" = "y" ]; then
+   define_bool CONFIG_PCI y
+   define_bool CONFIG_ALPHA_EV5 y
+   define_bool CONFIG_ALPHA_CIA y
+fi
+if [ "$CONFIG_ALPHA_MIKASA" = "y" -o "$CONFIG_ALPHA_NORITAKE" = "y" ]; then
+   bool 'Pinnacle or Primo CPU daughtercard?' CONFIG_ALPHA_PRIMO
+   if [ "$CONFIG_ALPHA_PRIMO" = "y" ]; then
+      define_bool CONFIG_ALPHA_EV5 y
+      define_bool CONFIG_ALPHA_CIA y
+   else
+      define_bool CONFIG_ALPHA_EV4 y
+      define_bool CONFIG_ALPHA_APECS y
+   fi
+   define_bool CONFIG_PCI y
+fi
+if [ "$CONFIG_ALPHA_SABLE" = "y" ]; then
+   bool 'EV5 or EV56 CPU daughtercard?' CONFIG_ALPHA_GAMMA
+   if [ "$CONFIG_ALPHA_GAMMA" = "y" ]; then
+      define_bool CONFIG_ALPHA_EV5 y
+   else
+      define_bool CONFIG_ALPHA_EV4 y
+   fi
+   define_bool CONFIG_PCI y
+   define_bool CONFIG_ALPHA_T2 y
 fi
 if [ "$CONFIG_ALPHA_MIATA" = "y" -o "$CONFIG_ALPHA_LX164" = "y" \
-	 -o "$CONFIG_ALPHA_SX164" = "y" -o "$CONFIG_ALPHA_RUFFIAN" = "y" ]
-then
-	define_bool CONFIG_PCI y
-	define_bool CONFIG_ALPHA_EV5 y
-	define_bool CONFIG_ALPHA_PYXIS y
-fi
-if [ "$CONFIG_ALPHA_JENSEN" = "y" ]
-then
-	define_bool CONFIG_ALPHA_EV4 y
-fi
-if [ "$CONFIG_ALPHA_EV4" = "y" ]
-then
-	# EV45 and older do not support all rounding modes in hw:
-	define_bool CONFIG_ALPHA_NEED_ROUNDING_EMULATION y
+	 -o "$CONFIG_ALPHA_SX164" = "y" -o "$CONFIG_ALPHA_RUFFIAN" = "y" ]; then
+   define_bool CONFIG_PCI y
+   define_bool CONFIG_ALPHA_EV5 y
+   define_bool CONFIG_ALPHA_PYXIS y
+fi
+if [ "$CONFIG_ALPHA_JENSEN" = "y" ]; then
+   define_bool CONFIG_ALPHA_EV4 y
+fi
+if [ "$CONFIG_ALPHA_EV4" = "y" ]; then
+   # EV45 and older do not support all rounding modes in hw:
+   define_bool CONFIG_ALPHA_NEED_ROUNDING_EMULATION y
 fi
 
 if [ "$CONFIG_ALPHA_CABRIOLET" = "y" -o "$CONFIG_ALPHA_AVANTI" = "y" \
@@ -134,39 +123,36 @@
 	-o "$CONFIG_ALPHA_MIKASA" = "y" -o "$CONFIG_ALPHA_ALCOR" = "y" \
 	-o "$CONFIG_ALPHA_SABLE" = "y" -o "$CONFIG_ALPHA_MIATA" = "y" \
 	-o "$CONFIG_ALPHA_NORITAKE" = "y" -o "$CONFIG_ALPHA_PC164" = "y" \
-	-o "$CONFIG_ALPHA_LX164" = "y" -o "$CONFIG_ALPHA_SX164" = "y" ]
-then
-  bool 'Use SRM as bootloader' CONFIG_ALPHA_SRM
-  if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-    if [ "$CONFIG_ALPHA_SRM" = "y" ]; then
-      bool '  Use SRM PCI setup' CONFIG_ALPHA_SRM_SETUP
-    fi
-  fi
+	-o "$CONFIG_ALPHA_LX164" = "y" -o "$CONFIG_ALPHA_SX164" = "y" ]; then
+   bool 'Use SRM as bootloader' CONFIG_ALPHA_SRM
+   if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+      if [ "$CONFIG_ALPHA_SRM" = "y" ]; then
+	 bool '  Use SRM PCI setup (EXPERIMENTAL)' CONFIG_ALPHA_SRM_SETUP
+      fi
+   fi
 fi
 if [ "$CONFIG_ALPHA_ALCOR" = "y" -o "$CONFIG_ALPHA_MIKASA" = "y" \
-	-o "$CONFIG_ALPHA_SABLE" = "y" -o "$CONFIG_ALPHA_NORITAKE" = "y" ]
-then
-	define_bool CONFIG_ALPHA_EISA y
-fi
-if [ "$CONFIG_ALPHA_XL" = "y" ]
-then
-	define_bool CONFIG_ALPHA_AVANTI y
+    -o "$CONFIG_ALPHA_SABLE" = "y" -o "$CONFIG_ALPHA_NORITAKE" = "y" ]; then
+   define_bool CONFIG_ALPHA_EISA y
+fi
+if [ "$CONFIG_ALPHA_XL" = "y" ]; then
+   define_bool CONFIG_ALPHA_AVANTI y
 fi
 
 bool 'Kernel GDB support' CONFIG_KGDB
 if [ "$CONFIG_KGDB" = "y" ]; then
-  bool 'Kernel tracing support?' CONFIG_KGDB_TRACING
+   bool '  Kernel tracing support' CONFIG_KGDB_TRACING
 fi
 
 bool 'Echo console messages on /dev/ttyS0 (COM1)' CONFIG_SERIAL_ECHO
 if [ "$CONFIG_PCI" = "y" ]; then
-  bool 'TGA Console Support' CONFIG_TGA_CONSOLE
-  if [ "$CONFIG_TGA_CONSOLE" = "y" ]; then
-    bool 'VGA Console Support' CONFIG_VGA_CONSOLE
-  fi
-  if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-    bool 'PCI bridge optimization (experimental)' CONFIG_PCI_OPTIMIZE
-  fi
+   bool 'TGA Console Support' CONFIG_TGA_CONSOLE
+   if [ "$CONFIG_TGA_CONSOLE" = "y" ]; then
+      bool '  VGA Console Support' CONFIG_VGA_CONSOLE
+   fi
+   if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+      bool 'PCI bridge optimization (EXPERIMENTAL)' CONFIG_PCI_OPTIMIZE
+   fi
 fi
 bool 'Networking support' CONFIG_NET
 bool 'System V IPC' CONFIG_SYSVIPC
@@ -178,7 +164,7 @@
 source drivers/block/Config.in
 
 if [ "$CONFIG_NET" = "y" ]; then
-  source net/Config.in
+   source net/Config.in
 fi
 
 mainmenu_option next_comment
@@ -187,19 +173,19 @@
 tristate 'SCSI support' CONFIG_SCSI
 
 if [ "$CONFIG_SCSI" != "n" ]; then
-  source drivers/scsi/Config.in
+   source drivers/scsi/Config.in
 fi
 endmenu
 
 if [ "$CONFIG_NET" = "y" ]; then
-  mainmenu_option next_comment
-  comment 'Network device support'
+   mainmenu_option next_comment
+   comment 'Network device support'
 
-  bool 'Network device support' CONFIG_NETDEVICES
-  if [ "$CONFIG_NETDEVICES" = "y" ]; then
-    source drivers/net/Config.in
-  fi
-  endmenu
+   bool 'Network device support' CONFIG_NETDEVICES
+   if [ "$CONFIG_NETDEVICES" = "y" ]; then
+      source drivers/net/Config.in
+   fi
+   endmenu
 fi
 
 mainmenu_option next_comment
@@ -207,7 +193,7 @@
 
 tristate 'ISDN support' CONFIG_ISDN
 if [ "$CONFIG_ISDN" != "n" ]; then
-  source drivers/isdn/Config.in
+   source drivers/isdn/Config.in
 fi
 endmenu
 
@@ -216,7 +202,7 @@
 
 bool 'Support non-SCSI/IDE/ATAPI drives' CONFIG_CD_NO_IDESCSI
 if [ "$CONFIG_CD_NO_IDESCSI" != "n" ]; then
-  source drivers/cdrom/Config.in
+   source drivers/cdrom/Config.in
 fi
 endmenu
 
@@ -229,7 +215,7 @@
 
 tristate 'Sound card support' CONFIG_SOUND
 if [ "$CONFIG_SOUND" != "n" ]; then
-  source drivers/sound/Config.in
+   source drivers/sound/Config.in
 fi
 endmenu
 
@@ -239,10 +225,10 @@
 #bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC
 bool 'Kernel profiling support' CONFIG_PROFILE
 if [ "$CONFIG_PROFILE" = "y" ]; then
-  int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
+   int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
 fi
 endmenu
 
 if [ "$CONFIG_TGA_CONSOLE" = "n" ]; then
-  define_bool CONFIG_VGA_CONSOLE y
+   define_bool CONFIG_VGA_CONSOLE y
 fi
diff -u --recursive --new-file linux-2.0.38/arch/i386/config.in linux-2.0.39/arch/i386/config.in
--- linux-2.0.38/arch/i386/config.in	Thu Aug 26 00:08:27 1999
+++ linux-2.0.39/arch/i386/config.in	Wed Dec 29 13:54:15 1999
@@ -13,8 +13,8 @@
 comment 'Loadable module support'
 bool 'Enable loadable module support' CONFIG_MODULES
 if [ "$CONFIG_MODULES" = "y" ]; then
-  bool 'Set version information on all symbols for modules' CONFIG_MODVERSIONS
-  bool 'Kernel daemon support (e.g. autoload of modules)' CONFIG_KERNELD
+   bool '  Set version information on all module symbols' CONFIG_MODVERSIONS
+   bool '  Kernel daemon support (e.g. autoload of modules)' CONFIG_KERNELD
 fi
 endmenu
 
@@ -28,27 +28,27 @@
 	 Custom		CONFIG_MEM_SPECIAL" Standard
 
 if [ "$CONFIG_MEM_SPECIAL" = "y" ]; then
-	int ' Max physical memory in MB (must be a multiple of 4)' CONFIG_MAX_MEMSIZE 1024
+   int ' Max physical memory in MB (must be a multiple of 4)' CONFIG_MAX_MEMSIZE 1024
 fi
 if [ "$CONFIG_MEM_ENT" = "y" ]; then
-	define_int CONFIG_MAX_MEMSIZE 2048
+   define_int CONFIG_MAX_MEMSIZE 2048
 fi
 if [ "$CONFIG_MEM_STD" = "y" ]; then
-	define_int CONFIG_MAX_MEMSIZE 1024
+   define_int CONFIG_MAX_MEMSIZE 1024
 fi
 bool 'Networking support' CONFIG_NET
 bool 'Limit memory to low 16MB' CONFIG_MAX_16M
 bool 'PCI bios support' CONFIG_PCI
 if [ "$CONFIG_PCI" = "y" ]; then
-  if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-    bool '   PCI bridge optimization (experimental)' CONFIG_PCI_OPTIMIZE
-  fi
+   if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+      bool '  PCI bridge optimization (EXPERIMENTAL)' CONFIG_PCI_OPTIMIZE
+   fi
 fi
 bool 'System V IPC' CONFIG_SYSVIPC
 tristate 'Kernel support for a.out binaries' CONFIG_BINFMT_AOUT
 tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  tristate 'Kernel support for JAVA binaries' CONFIG_BINFMT_JAVA
+   tristate 'Kernel support for JAVA binaries (EXPERIMENTAL)' CONFIG_BINFMT_JAVA
 fi
 bool 'Compile kernel as ELF - if your GCC is ELF-GCC' CONFIG_KERNEL_ELF
 
@@ -60,17 +60,17 @@
 
 # Conditionally compile MTRR manipulation support
 if [ "$CONFIG_M686" = "y" -o "$CONFIG_M586" = "y" ]; then
-  bool 'Handle buggy SMP BIOSes with bad MTRR setup' CONFIG_MTRR
+   bool 'Handle buggy SMP BIOSes with bad MTRR setup' CONFIG_MTRR
 fi
 
 bool 'Advanced Power Management BIOS support' CONFIG_APM
 if [ "$CONFIG_APM" = "y" ]; then
-  bool '   Ignore USER SUSPEND' CONFIG_APM_IGNORE_USER_SUSPEND
-  bool '   Enable PM at boot time' CONFIG_APM_DO_ENABLE
-  bool '   Make CPU Idle calls when idle' CONFIG_APM_CPU_IDLE
-  bool '   Enable console blanking using APM' CONFIG_APM_DISPLAY_BLANK
-  bool '   Power off on shutdown' CONFIG_APM_POWER_OFF
-  bool '   Ignore multiple suspend' CONFIG_APM_IGNORE_MULTIPLE_SUSPEND
+   bool '  Ignore USER SUSPEND' CONFIG_APM_IGNORE_USER_SUSPEND
+   bool '  Enable PM at boot time' CONFIG_APM_DO_ENABLE
+   bool '  Make CPU Idle calls when idle' CONFIG_APM_CPU_IDLE
+   bool '  Enable console blanking using APM' CONFIG_APM_DISPLAY_BLANK
+   bool '  Power off on shutdown' CONFIG_APM_POWER_OFF
+   bool '  Ignore multiple suspend' CONFIG_APM_IGNORE_MULTIPLE_SUSPEND
 fi
 
 endmenu
@@ -78,7 +78,7 @@
 source drivers/block/Config.in
 
 if [ "$CONFIG_NET" = "y" ]; then
-  source net/Config.in
+   source net/Config.in
 fi
 
 mainmenu_option next_comment
@@ -87,19 +87,19 @@
 tristate 'SCSI support' CONFIG_SCSI
 
 if [ "$CONFIG_SCSI" != "n" ]; then
-  source drivers/scsi/Config.in
+   source drivers/scsi/Config.in
 fi
 endmenu
 
 if [ "$CONFIG_NET" = "y" ]; then
-  mainmenu_option next_comment
-  comment 'Network device support'
+   mainmenu_option next_comment
+   comment 'Network device support'
 
-  bool 'Network device support' CONFIG_NETDEVICES
-  if [ "$CONFIG_NETDEVICES" = "y" ]; then
-    source drivers/net/Config.in
-  fi
-  endmenu
+   bool 'Network device support' CONFIG_NETDEVICES
+   if [ "$CONFIG_NETDEVICES" = "y" ]; then
+      source drivers/net/Config.in
+   fi
+   endmenu
 fi
 
 mainmenu_option next_comment
@@ -107,7 +107,7 @@
 
 tristate 'ISDN support' CONFIG_ISDN
 if [ "$CONFIG_ISDN" != "n" ]; then
-  source drivers/isdn/Config.in
+   source drivers/isdn/Config.in
 fi
 endmenu
 
@@ -116,7 +116,7 @@
 
 bool 'Support non-SCSI/IDE/ATAPI CDROM drives' CONFIG_CD_NO_IDESCSI
 if [ "$CONFIG_CD_NO_IDESCSI" != "n" ]; then
-  source drivers/cdrom/Config.in
+   source drivers/cdrom/Config.in
 fi
 endmenu
 
@@ -129,7 +129,7 @@
 
 tristate 'Sound card support' CONFIG_SOUND
 if [ "$CONFIG_SOUND" != "n" ]; then
-  source drivers/sound/Config.in
+   source drivers/sound/Config.in
 fi
 endmenu
 
@@ -139,6 +139,6 @@
 #bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC
 bool 'Kernel profiling support' CONFIG_PROFILE
 if [ "$CONFIG_PROFILE" = "y" ]; then
-  int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
+   int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
 fi
 endmenu
diff -u --recursive --new-file linux-2.0.38/arch/m68k/config.in linux-2.0.39/arch/m68k/config.in
--- linux-2.0.38/arch/m68k/config.in	Mon May 20 06:54:26 1996
+++ linux-2.0.39/arch/m68k/config.in	Thu Dec 30 01:54:06 1999
@@ -8,8 +8,8 @@
 comment 'Loadable module support'
 bool 'Enable loadable module support' CONFIG_MODULES
 if [ "$CONFIG_MODULES" = "y" ]; then
-  bool 'Set version information on all symbols for modules' CONFIG_MODVERSIONS
-  bool 'Kernel daemon support (e.g. autoload of modules)' CONFIG_KERNELD
+   bool '  Set version information on all module symbols' CONFIG_MODVERSIONS
+   bool '  Kernel daemon support (e.g. autoload of modules)' CONFIG_KERNELD
 fi
 endmenu
 
@@ -17,6 +17,9 @@
 comment 'General setup'
 
 bool 'Amiga support' CONFIG_AMIGA
+if [ "$CONFIG_AMIGA" = "y" ]; then
+   bool '  Amiga AutoConfig Identification' CONFIG_ZORRO
+fi
 bool 'Atari support' CONFIG_ATARI
 bool 'Macintosh support' CONFIG_MAC
 bool '68040 floating point software package' CONFIG_FPSP_040
@@ -26,10 +29,7 @@
 tristate 'Kernel support for a.out binaries' CONFIG_BINFMT_AOUT
 tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF
 if [ "$CONFIG_BINFMT_ELF" = "y" ]; then
-  bool 'Compile kernel as ELF - if your GCC is ELF-GCC' CONFIG_KERNEL_ELF
-fi
-if [ "$CONFIG_AMIGA" = "y" ]; then
-  bool 'Amiga AutoConfig Identification' CONFIG_ZORRO
+   bool '  Compile kernel as ELF - if your GCC is ELF-GCC' CONFIG_KERNEL_ELF
 fi
 endmenu
 
@@ -42,23 +42,23 @@
 tristate 'Normal floppy disk support' CONFIG_BLK_DEV_FD
 bool 'IDE harddisk support' CONFIG_BLK_DEV_IDE
 if [ "$CONFIG_AMIGA" = "y" ]; then
-bool 'Amiga Cybervision support' CONFIG_FB_CYBER
-bool 'Amiga Zorro II ramdisk support' CONFIG_AMIGA_Z2RAM
+   bool 'Amiga Cybervision support' CONFIG_FB_CYBER
+   bool 'Amiga Zorro II ramdisk support' CONFIG_AMIGA_Z2RAM
 fi
 if [ "$CONFIG_ATARI" = "y" ]; then
-bool 'Atari ACSI support' CONFIG_ATARI_ACSI
+   bool 'Atari ACSI support' CONFIG_ATARI_ACSI
 fi
 
 tristate 'RAM disk support' CONFIG_BLK_DEV_RAM
 if [ "$CONFIG_BLK_DEV_RAM" = "y" ]; then
-  bool '   Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD
+   bool '  Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD
 fi
 
 tristate 'Loopback device support' CONFIG_BLK_DEV_LOOP
 endmenu
 
 if [ "$CONFIG_NET" = "y" ]; then
-  source net/Config.in
+   source net/Config.in
 fi
 
 mainmenu_option next_comment
@@ -67,32 +67,31 @@
 tristate 'SCSI support' CONFIG_SCSI
 
 if [ "$CONFIG_SCSI" != "n" ]; then
+   comment 'SCSI support type (disk, tape, CDrom)'
 
-comment 'SCSI support type (disk, tape, CDrom)'
-
-dep_tristate 'SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI
-dep_tristate 'SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI
-dep_tristate 'SCSI CDROM support' CONFIG_BLK_DEV_SR $CONFIG_SCSI
-dep_tristate 'SCSI generic support' CONFIG_CHR_DEV_SG $CONFIG_SCSI
-
-comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs'
-
-bool 'Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN
-
-bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS
-
-mainmenu_option next_comment
-comment 'SCSI low-level drivers'
-
-if [ "$CONFIG_AMIGA" = "y" ]; then
-bool 'A3000 WD33C93A support' CONFIG_A3000_SCSI
-bool 'A2091 WD33C93A support' CONFIG_A2091_SCSI
-bool 'GVP Series II WD33C93A support' CONFIG_GVP11_SCSI
-fi
-if [ "$CONFIG_ATARI" = "y" ]; then
-dep_tristate 'Atari native SCSI support' CONFIG_ATARI_SCSI $CONFIG_SCSI
-fi
-#dep_tristate 'SCSI debugging host adapter' CONFIG_SCSI_DEBUG $CONFIG_SCSI
+   dep_tristate '  SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI
+   dep_tristate '  SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI
+   dep_tristate '  SCSI CDROM support' CONFIG_BLK_DEV_SR $CONFIG_SCSI
+   dep_tristate '  SCSI generic support' CONFIG_CHR_DEV_SG $CONFIG_SCSI
+
+   comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs'
+
+   bool '  Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN
+
+   bool '  Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS
+
+   mainmenu_option next_comment
+   comment 'SCSI low-level drivers'
+
+  if [ "$CONFIG_AMIGA" = "y" ]; then
+     bool 'A3000 WD33C93A support' CONFIG_A3000_SCSI
+     bool 'A2091 WD33C93A support' CONFIG_A2091_SCSI
+     bool 'GVP Series II WD33C93A support' CONFIG_GVP11_SCSI
+  fi
+  if [ "$CONFIG_ATARI" = "y" ]; then
+     dep_tristate 'Atari native SCSI support' CONFIG_ATARI_SCSI $CONFIG_SCSI
+  fi
+  #dep_tristate 'SCSI debugging host adapter' CONFIG_SCSI_DEBUG $CONFIG_SCSI
 endmenu
 
 fi
@@ -105,27 +104,27 @@
 
 bool 'Network device support' CONFIG_NETDEVICES
 if [ "$CONFIG_NETDEVICES" = "y" ]; then
-#
-# Network device configuration
-#
-tristate 'Dummy net driver support' CONFIG_DUMMY
-tristate 'SLIP (serial line) support' CONFIG_SLIP
-if [ "$CONFIG_SLIP" != "n" ]; then
-  bool ' CSLIP compressed headers' CONFIG_SLIP_COMPRESSED
-fi
-tristate 'PPP (point-to-point) support' CONFIG_PPP
-if [ ! "$CONFIG_PPP" = "n" ]; then
-  comment 'CCP compressors for PPP are only built as modules.'
-fi
-tristate 'EQL (serial line load balancing) support' CONFIG_EQUALIZER
-if [ "$CONFIG_AMIGA" = "y" ]; then
-  tristate 'Ariadne support' CONFIG_ARIADNE
-  tristate 'A2065 support' CONFIG_A2065
-  tristate 'Hydra support' CONFIG_HYDRA
-fi
-if [ "$CONFIG_ATARI" = "y" ]; then
-  bool 'Atari Lance support' CONFIG_ATARILANCE
-fi
+   #
+   # Network device configuration
+   #
+   tristate '  Dummy net driver support' CONFIG_DUMMY
+   tristate '  SLIP (serial line) support' CONFIG_SLIP
+   if [ "$CONFIG_SLIP" != "n" ]; then
+      bool '    CSLIP compressed headers' CONFIG_SLIP_COMPRESSED
+   fi
+   tristate '  PPP (point-to-point) support' CONFIG_PPP
+   if [ ! "$CONFIG_PPP" = "n" ]; then
+      comment 'CCP compressors for PPP are only built as modules.'
+   fi
+   tristate '  EQL (serial line load balancing) support' CONFIG_EQUALIZER
+   if [ "$CONFIG_AMIGA" = "y" ]; then
+      tristate '  Ariadne support' CONFIG_ARIADNE
+      tristate '  A2065 support' CONFIG_A2065
+      tristate '  Hydra support' CONFIG_HYDRA
+   fi
+   if [ "$CONFIG_ATARI" = "y" ]; then
+      bool '  Atari Lance support' CONFIG_ATARILANCE
+   fi
 fi
 endmenu
 
@@ -138,26 +137,26 @@
 
 bool 'Parallel printer support' CONFIG_PRINTER
 if [ "$CONFIG_AMIGA" = "y" ]; then
-  tristate 'Amiga mouse support' CONFIG_AMIGAMOUSE
+   tristate 'Amiga mouse support' CONFIG_AMIGAMOUSE
 fi
 if [ "$CONFIG_ATARI" = "y" ]; then
-  tristate 'Atari mouse support' CONFIG_ATARIMOUSE
+   tristate 'Atari mouse support' CONFIG_ATARIMOUSE
 fi
 if [ "$CONFIG_ATARI" = y ]; then
-  tristate 'Atari MFP serial support' CONFIG_ATARI_MFPSER
-  tristate 'Atari SCC serial support' CONFIG_ATARI_SCC
-  tristate 'Atari MIDI serial support' CONFIG_ATARI_MIDI
+   tristate 'Atari MFP serial support' CONFIG_ATARI_MFPSER
+   tristate 'Atari SCC serial support' CONFIG_ATARI_SCC
+   tristate 'Atari MIDI serial support' CONFIG_ATARI_MIDI
 fi
 if [ "$CONFIG_AMIGA" = y ]; then
-  tristate 'Amiga builtin serial support' CONFIG_AMIGA_BUILTIN_SERIAL
-  bool 'GVP IO-Extender support' CONFIG_GVPIOEXT
-  tristate 'Multiface Card III serial support' CONFIG_MULTIFACE_III_TTY
+   tristate 'Amiga builtin serial support' CONFIG_AMIGA_BUILTIN_SERIAL
+   bool 'GVP IO-Extender support' CONFIG_GVPIOEXT
+   tristate 'Multiface Card III serial support' CONFIG_MULTIFACE_III_TTY
 fi
 bool 'Support for user serial device modules' CONFIG_USERIAL
 bool 'Watchdog Timer Support'	CONFIG_WATCHDOG
 if [ "$CONFIG_WATCHDOG" != "n" ]; then
-  bool '   Disable watchdog shutdown on close' CONFIG_WATCHDOG_NOWAYOUT
-  bool '   Software Watchdog' CONFIG_SOFT_WATCHDOG
+   bool '  Disable watchdog shutdown on close' CONFIG_WATCHDOG_NOWAYOUT
+   bool '  Software Watchdog' CONFIG_SOFT_WATCHDOG
 fi
 bool 'Support for user misc device modules' CONFIG_UMISC
 endmenu
@@ -167,7 +166,7 @@
 
 bool 'Sound support' CONFIG_SOUND y
 if [ "$CONFIG_SOUND" != "n" ]; then
-  bool 'Amiga or Atari DMA sound support' CONFIG_DMASOUND y
+   bool '  Amiga or Atari DMA sound support' CONFIG_DMASOUND y
 fi
 endmenu
 
@@ -177,6 +176,6 @@
 #bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC
 bool 'Kernel profiling support' CONFIG_PROFILE
 if [ "$CONFIG_PROFILE" = "y" ]; then
-  int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
+   int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
 fi
 endmenu
diff -u --recursive --new-file linux-2.0.38/arch/mips/config.in linux-2.0.39/arch/mips/config.in
--- linux-2.0.38/arch/mips/config.in	Sun May  5 08:05:58 1996
+++ linux-2.0.39/arch/mips/config.in	Thu Dec 30 01:57:14 1999
@@ -17,7 +17,7 @@
 if [ "$CONFIG_ACER_PICA_61" = "y" -o \
      "$CONFIG_MIPS_MAGNUM_4000" = "y" -o \
      "$CONFIG_OLIVETTI_M700" = "y" ]; then
-	define_bool CONFIG_MIPS_JAZZ y
+   define_bool CONFIG_MIPS_JAZZ y
 fi
 
 choice 'CPU type' \
@@ -32,35 +32,35 @@
      "$CONFIG_CPU_R4X00" = "y" -o \
      "$CONFIG_CPU_R4600" = "y" -o \
      "$CONFIG_CPU_R8000" = "y" ]; then
-	define_bool CONFIG_TLB_SHUTDOWN y
+   define_bool CONFIG_TLB_SHUTDOWN y
 fi
 
 define_bool CONFIG_BINFMT_ELF y
 define_bool CONFIG_BINFMT_AOUT y
 bool 'Compile the kernel into the ELF object format' CONFIG_ELF_KERNEL
 if [ "$CONFIG_ELF_KERNEL" = "y" ]; then
-  bool 'Is your ELF compiler an extra compiler' CONFIG_EXTRA_ELF_COMPILER
+   bool '  Is your ELF compiler an extra compiler' CONFIG_EXTRA_ELF_COMPILER
 fi
 bool 'Generate little endian code' CONFIG_CPU_LITTLE_ENDIAN
 bool 'Networking support' CONFIG_NET
 #bool 'PCI bios support' CONFIG_PCI
 #if [ "$CONFIG_PCI" = "y" ]; then
-#  if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-#    bool '   PCI bridge optimization (experimental)' CONFIG_PCI_OPTIMIZE
-#  fi
+#   if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+#      bool '  PCI bridge optimization (EXPERIMENTAL)' CONFIG_PCI_OPTIMIZE
+#   fi
 #fi
 bool 'System V IPC' CONFIG_SYSVIPC
 endmenu
 
 mainmenu_option next_comment
 comment 'Loadable module support'
-bool 'Set version information on all symbols for modules' CONFIG_MODVERSIONS
+bool 'Set version information on all module symbols' CONFIG_MODVERSIONS
 endmenu
 
 source drivers/block/Config.in
 
 if [ "$CONFIG_NET" = "y" ]; then
-  source net/Config.in
+   source net/Config.in
 fi
 
 mainmenu_option next_comment
@@ -69,19 +69,19 @@
 tristate 'SCSI support' CONFIG_SCSI
 
 if [ "$CONFIG_SCSI" != "n" ]; then
-  source drivers/scsi/Config.in
+   source drivers/scsi/Config.in
 fi
 endmenu
 
 if [ "$CONFIG_NET" = "y" ]; then
-  mainmenu_option next_comment
-  comment 'Network device support'
+   mainmenu_option next_comment
+   comment 'Network device support'
 
-  bool 'Network device support' CONFIG_NETDEVICES
-  if [ "$CONFIG_NETDEVICES" = "y" ]; then
-    source drivers/net/Config.in
-  fi
-  endmenu
+   bool 'Network device support' CONFIG_NETDEVICES
+   if [ "$CONFIG_NETDEVICES" = "y" ]; then
+      source drivers/net/Config.in
+   fi
+   endmenu
 fi
 
 mainmenu_option next_comment
@@ -89,7 +89,7 @@
 
 bool 'Support non-SCSI/IDE/ATAPI drives' CONFIG_CD_NO_IDESCSI
 if [ "$CONFIG_CD_NO_IDESCSI" != "n" ]; then
-  source drivers/cdrom/Config.in
+   source drivers/cdrom/Config.in
 fi
 endmenu
 
@@ -103,7 +103,7 @@
 
 tristate 'Sound card support' CONFIG_SOUND
 if [ "$CONFIG_SOUND" != "n" ]; then
-  source drivers/sound/Config.in
+   source drivers/sound/Config.in
 fi
 endmenu
 
@@ -113,6 +113,6 @@
 #bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC
 bool 'Kernel profiling support' CONFIG_PROFILE
 if [ "$CONFIG_PROFILE" = "y" ]; then
-  int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
+   int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
 fi
 endmenu
diff -u --recursive --new-file linux-2.0.38/arch/ppc/config.in linux-2.0.39/arch/ppc/config.in
--- linux-2.0.38/arch/ppc/config.in	Mon May 27 11:00:57 1996
+++ linux-2.0.39/arch/ppc/config.in	Thu Dec 30 01:58:56 1999
@@ -13,8 +13,8 @@
 comment 'Loadable module support'
 bool 'Enable loadable module support' CONFIG_MODULES
 if [ "$CONFIG_MODULES" = "y" ]; then
-  bool 'Set version information on all symbols for modules' CONFIG_MODVERSIONS
-  bool 'Kernel daemon support (e.g. autoload of modules)' CONFIG_KERNELD
+   bool '  Set version information on all module symbols' CONFIG_MODVERSIONS
+   bool '  Kernel daemon support (e.g. autoload of modules)' CONFIG_KERNELD
 fi
 endmenu
 
@@ -26,22 +26,22 @@
 bool 'Limit memory to low 16MB' CONFIG_MAX_16M
 bool 'PCI bios support' CONFIG_PCI
 if [ "$CONFIG_PCI" = "y" ]; then
-  if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-    bool '   PCI bridge optimization (experimental)' CONFIG_PCI_OPTIMIZE
-  fi
+   if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+      bool '  PCI bridge optimization (EXPERIMENTAL)' CONFIG_PCI_OPTIMIZE
+   fi
 fi
 bool 'System V IPC' CONFIG_SYSVIPC
 tristate 'Kernel support for a.out binaries' CONFIG_BINFMT_AOUT
 tristate 'Kernel support for JAVA binaries' CONFIG_BINFMT_JAVA
 tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF
 if [ "$CONFIG_BINFMT_ELF" = "y" ]; then
-  bool 'Compile kernel as ELF - if your GCC is ELF-GCC' CONFIG_KERNEL_ELF
+   bool '  Compile kernel as ELF - if your GCC is ELF-GCC' CONFIG_KERNEL_ELF
 fi
 
 source drivers/block/Config.in
 
 if [ "$CONFIG_NET" = "y" ]; then
-  source net/Config.in
+   source net/Config.in
 fi
 
 mainmenu_option next_comment
@@ -50,19 +50,19 @@
 tristate 'SCSI support' CONFIG_SCSI
 
 if [ "$CONFIG_SCSI" != "n" ]; then
-  source drivers/scsi/Config.in
+   source drivers/scsi/Config.in
 fi
 endmenu
 
 if [ "$CONFIG_NET" = "y" ]; then
-  mainmenu_option next_comment
-  comment 'Network device support'
+   mainmenu_option next_comment
+   comment 'Network device support'
 
-  bool 'Network device support' CONFIG_NETDEVICES
-  if [ "$CONFIG_NETDEVICES" = "y" ]; then
-    source drivers/net/Config.in
-  fi
-  endmenu
+   bool 'Network device support' CONFIG_NETDEVICES
+   if [ "$CONFIG_NETDEVICES" = "y" ]; then
+      source drivers/net/Config.in
+   fi
+   endmenu
 fi
 
 mainmenu_option next_comment
@@ -70,7 +70,7 @@
 
 tristate 'ISDN support' CONFIG_ISDN
 if [ "$CONFIG_ISDN" != "n" ]; then
-  source drivers/isdn/Config.in
+   source drivers/isdn/Config.in
 fi
 endmenu
 
@@ -79,7 +79,7 @@
 
 bool 'Support non-SCSI/IDE/ATAPI CDROM drives' CONFIG_CD_NO_IDESCSI
 if [ "$CONFIG_CD_NO_IDESCSI" != "n" ]; then
-  source drivers/cdrom/Config.in
+   source drivers/cdrom/Config.in
 fi
 endmenu
 
@@ -92,7 +92,7 @@
 
 tristate 'Sound card support' CONFIG_SOUND
 if [ "$CONFIG_SOUND" != "n" ]; then
-  source drivers/sound/Config.in
+   source drivers/sound/Config.in
 fi
 endmenu
 
@@ -102,6 +102,6 @@
 #bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC
 bool 'Kernel profiling support' CONFIG_PROFILE
 if [ "$CONFIG_PROFILE" = "y" ]; then
-  int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
+   int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
 fi
 endmenu
diff -u --recursive --new-file linux-2.0.38/arch/sparc/config.in linux-2.0.39/arch/sparc/config.in
--- linux-2.0.38/arch/sparc/config.in	Mon Jul 13 22:47:27 1998
+++ linux-2.0.39/arch/sparc/config.in	Thu Dec 30 02:02:58 1999
@@ -10,16 +10,16 @@
 bool 'Support for AP1000 multicomputer' CONFIG_AP1000
 
 if [ "$CONFIG_AP1000" = "n" ]; then
-	# Global things across all Sun machines.
-	define_bool CONFIG_SBUS y
-	define_bool CONFIG_SBUSCHAR y
-	define_bool CONFIG_SUN_MOUSE y
-	define_bool CONFIG_SERIAL y
-	define_bool CONFIG_SUN_SERIAL y
-	define_bool CONFIG_SUN_KEYBOARD y
-	define_bool CONFIG_SUN_CONSOLE y
-	define_bool CONFIG_SUN_AUXIO y
-	define_bool CONFIG_SUN_IO y
+   # Global things across all Sun machines.
+   define_bool CONFIG_SBUS y
+   define_bool CONFIG_SBUSCHAR y
+   define_bool CONFIG_SUN_MOUSE y
+   define_bool CONFIG_SERIAL y
+   define_bool CONFIG_SUN_SERIAL y
+   define_bool CONFIG_SUN_KEYBOARD y
+   define_bool CONFIG_SUN_CONSOLE y
+   define_bool CONFIG_SUN_AUXIO y
+   define_bool CONFIG_SUN_IO y
 fi
 
 define_bool CONFIG_NET_ALIAS n
@@ -38,21 +38,21 @@
 
 bool 'Multiple devices driver support' CONFIG_BLK_DEV_MD
 if [ "$CONFIG_BLK_DEV_MD" = "y" ]; then
-  tristate '   Linear (append) mode' CONFIG_MD_LINEAR
-  tristate '   RAID-0 (striping) mode' CONFIG_MD_STRIPED
-  tristate '   RAID-1 (mirroring) mode' CONFIG_MD_MIRRORING
-  tristate '   RAID-4/RAID-5 mode' CONFIG_MD_RAID5
+   tristate '  Linear (append) mode' CONFIG_MD_LINEAR
+   tristate '  RAID-0 (striping) mode' CONFIG_MD_STRIPED
+   tristate '  RAID-1 (mirroring) mode' CONFIG_MD_MIRRORING
+   tristate '  RAID-4/RAID-5 mode' CONFIG_MD_RAID5
 fi
 
 tristate 'RAM disk support' CONFIG_BLK_DEV_RAM
 if [ "$CONFIG_BLK_DEV_RAM" = "y" ]; then
-  bool '   Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD
+   bool '  Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD
 fi
 
 tristate 'Loopback device support' CONFIG_BLK_DEV_LOOP
 
 if [ "$CONFIG_NET" = "y" ]; then
-	source net/Config.in
+   source net/Config.in
 fi
 
 mainmenu_option next_comment
@@ -61,45 +61,45 @@
 tristate 'SCSI support' CONFIG_SCSI
 
 if [ "$CONFIG_SCSI" != "n" ]; then
-	comment 'SCSI support type (disk, tape, CDrom)'
+   comment 'SCSI support type (disk, tape, CDrom)'
 
-	dep_tristate 'SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI
-	dep_tristate 'SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI
-	dep_tristate 'SCSI CDROM support' CONFIG_BLK_DEV_SR $CONFIG_SCSI
-	dep_tristate 'SCSI generic support' CONFIG_CHR_DEV_SG $CONFIG_SCSI
+   dep_tristate '  SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI
+   dep_tristate '  SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI
+   dep_tristate '  SCSI CDROM support' CONFIG_BLK_DEV_SR $CONFIG_SCSI
+   dep_tristate '  SCSI generic support' CONFIG_CHR_DEV_SG $CONFIG_SCSI
 
-	comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs'
+   comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs'
 
-	bool 'Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN
+   bool '  Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN
 
-	bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS
+   bool '  Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS
 
-	mainmenu_option next_comment
-	comment 'SCSI low-level drivers'
+   mainmenu_option next_comment
+   comment 'SCSI low-level drivers'
 
-	dep_tristate 'Sparc ESP Scsi Driver' CONFIG_SCSI_SUNESP $CONFIG_SCSI
+   dep_tristate 'Sparc ESP Scsi Driver' CONFIG_SCSI_SUNESP $CONFIG_SCSI
 fi
 endmenu
 
 if [ "$CONFIG_NET" = "y" ]; then
-	mainmenu_option next_comment
-	comment 'Network device support'
+   mainmenu_option next_comment
+   comment 'Network device support'
 
-	bool 'Network device support' CONFIG_NETDEVICES
-	if [ "$CONFIG_NETDEVICES" = "y" ]; then
-		tristate 'Dummy net driver support' CONFIG_DUMMY
-		tristate 'SLIP (serial line) support' CONFIG_SLIP
-		if [ "$CONFIG_SLIP" != "n" ]; then
-		  bool ' CSLIP compressed headers' CONFIG_SLIP_COMPRESSED
-		  bool ' Keepalive and linefill' CONFIG_SLIP_SMART
-		fi
-		tristate 'PPP (point-to-point) support' CONFIG_PPP
-		if [ ! "$CONFIG_PPP" = "n" ]; then
-		  comment 'CCP compressors for PPP are only built as modules.'
-		fi
-		bool 'Sun LANCE support' CONFIG_SUNLANCE
-	fi
-	endmenu
+   bool 'Network device support' CONFIG_NETDEVICES
+   if [ "$CONFIG_NETDEVICES" = "y" ]; then
+      tristate '  Dummy net driver support' CONFIG_DUMMY
+      tristate '  SLIP (serial line) support' CONFIG_SLIP
+      if [ "$CONFIG_SLIP" != "n" ]; then
+	 bool '    CSLIP compressed headers' CONFIG_SLIP_COMPRESSED
+	 bool '    Keepalive and linefill' CONFIG_SLIP_SMART
+      fi
+      tristate '  PPP (point-to-point) support' CONFIG_PPP
+      if [ ! "$CONFIG_PPP" = "n" ]; then
+         comment 'CCP compressors for PPP are only built as modules.'
+      fi
+      bool '  Sun LANCE support' CONFIG_SUNLANCE
+   fi
+   endmenu
 fi
 
 source fs/Config.in
@@ -109,5 +109,5 @@
 
 bool 'Kernel profiling support' CONFIG_PROFILE
 if [ "$CONFIG_PROFILE" = "y" ]; then
-	int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
+   int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
 fi
diff -u --recursive --new-file linux-2.0.38/drivers/block/Config.in linux-2.0.39/drivers/block/Config.in
--- linux-2.0.38/drivers/block/Config.in	Sun Jun 13 19:21:00 1999
+++ linux-2.0.39/drivers/block/Config.in	Thu Dec 30 19:10:33 1999
@@ -8,40 +8,40 @@
 bool 'Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support' CONFIG_BLK_DEV_IDE
 comment 'Please see Documentation/ide.txt for help/info on IDE drives'
 if [ "$CONFIG_BLK_DEV_IDE" = "n" ]; then
-  bool 'Old harddisk (MFM/RLL/IDE) driver' CONFIG_BLK_DEV_HD_ONLY
+   bool 'Old harddisk (MFM/RLL/IDE) driver' CONFIG_BLK_DEV_HD_ONLY
 else
-  bool '   Use old disk-only driver on primary interface' CONFIG_BLK_DEV_HD_IDE
-  if [ "$CONFIG_BLK_DEV_HD_IDE" != "n" ]; then
-    bool '     Use multi-mode by default' CONFIG_IDEDISK_MULTI_MODE
-  fi
-  bool '   Include IDE/ATAPI CDROM support' CONFIG_BLK_DEV_IDECD
-  bool '   Include IDE/ATAPI TAPE support' CONFIG_BLK_DEV_IDETAPE
-  bool '   Include IDE/ATAPI FLOPPY support (new)' CONFIG_BLK_DEV_IDEFLOPPY
-  bool '   SCSI emulation support' CONFIG_BLK_DEV_IDESCSI
-  bool '   Support removable IDE interfaces (PCMCIA)' CONFIG_BLK_DEV_IDE_PCMCIA
-  bool '   CMD640 chipset bugfix/support' CONFIG_BLK_DEV_CMD640
-  if [ "$CONFIG_BLK_DEV_CMD640" = "y" ]; then
-    bool '     CMD640 enhanced support' CONFIG_BLK_DEV_CMD640_ENHANCED
-  fi
-  if [ "$CONFIG_PCI" = "y" ]; then
-    bool '   RZ1000 chipset bugfix/support' CONFIG_BLK_DEV_RZ1000
-    bool '   Intel 82371 PIIX (Triton I/II) DMA support' CONFIG_BLK_DEV_TRITON
-    if [ "$CONFIG_BLK_DEV_TRITON" = "y" ]; then
-      bool '     Boot off-board chipsets first support' CONFIG_BLK_DEV_OFFBOARD
-    fi
-  fi
-  bool '   Other IDE chipset support' CONFIG_IDE_CHIPSETS
-  if [ "$CONFIG_IDE_CHIPSETS" = "y" ]; then
-    comment 'Note: most of these also require special kernel boot parameters'
-    bool '      ALI M14xx       support' CONFIG_BLK_DEV_ALI14XX
-    bool '      DTC-2278        support' CONFIG_BLK_DEV_DTC2278
-    bool '      Holtek HT6560B  support' CONFIG_BLK_DEV_HT6560B
-    if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-      bool '      PROMISE DC4030  support (EXPERIMENTAL)' CONFIG_BLK_DEV_PROMISE
-    fi
-    bool '      QDI QD6580      support' CONFIG_BLK_DEV_QD6580
-    bool '      UMC 8672        support' CONFIG_BLK_DEV_UMC8672
-  fi
+   bool '  Use old disk-only driver on primary interface' CONFIG_BLK_DEV_HD_IDE
+   if [ "$CONFIG_BLK_DEV_HD_IDE" != "n" ]; then
+      bool '    Use multi-mode by default' CONFIG_IDEDISK_MULTI_MODE
+   fi
+   bool '  Include IDE/ATAPI CDROM support' CONFIG_BLK_DEV_IDECD
+   bool '  Include IDE/ATAPI TAPE support' CONFIG_BLK_DEV_IDETAPE
+   bool '  Include IDE/ATAPI FLOPPY support (new)' CONFIG_BLK_DEV_IDEFLOPPY
+   bool '  SCSI emulation support' CONFIG_BLK_DEV_IDESCSI
+   bool '  Support removable IDE interfaces (PCMCIA)' CONFIG_BLK_DEV_IDE_PCMCIA
+   bool '  CMD640 chipset bugfix/support' CONFIG_BLK_DEV_CMD640
+   if [ "$CONFIG_BLK_DEV_CMD640" = "y" ]; then
+      bool '    CMD640 enhanced support' CONFIG_BLK_DEV_CMD640_ENHANCED
+   fi
+   if [ "$CONFIG_PCI" = "y" ]; then
+      bool '  RZ1000 chipset bugfix/support' CONFIG_BLK_DEV_RZ1000
+      bool '  Intel 82371 PIIX (Triton I/II) DMA support' CONFIG_BLK_DEV_TRITON
+      if [ "$CONFIG_BLK_DEV_TRITON" = "y" ]; then
+	 bool '    Boot off-board chipsets first support' CONFIG_BLK_DEV_OFFBOARD
+      fi
+   fi
+   bool '  Other IDE chipset support' CONFIG_IDE_CHIPSETS
+   if [ "$CONFIG_IDE_CHIPSETS" = "y" ]; then
+      comment 'Note: most of these also require special kernel boot parameters'
+      bool '    ALI M14xx       support' CONFIG_BLK_DEV_ALI14XX
+      bool '    DTC-2278        support' CONFIG_BLK_DEV_DTC2278
+      bool '    Holtek HT6560B  support' CONFIG_BLK_DEV_HT6560B
+      if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+	 bool '    PROMISE DC4030  support (EXPERIMENTAL)' CONFIG_BLK_DEV_PROMISE
+      fi
+      bool '    QDI QD6580      support' CONFIG_BLK_DEV_QD6580
+      bool '    UMC 8672        support' CONFIG_BLK_DEV_UMC8672
+   fi
 fi
 
 comment 'Additional Block Devices'
@@ -49,35 +49,35 @@
 tristate 'Loopback device support' CONFIG_BLK_DEV_LOOP
 bool 'Multiple devices driver support' CONFIG_BLK_DEV_MD
 if [ "$CONFIG_BLK_DEV_MD" = "y" ]; then
-  tristate '   Linear (append) mode' CONFIG_MD_LINEAR
-  tristate '   RAID-0 (striping) mode' CONFIG_MD_STRIPED
-  tristate '   RAID-1 (mirroring) mode' CONFIG_MD_MIRRORING
-  tristate '   RAID-4/RAID-5 mode' CONFIG_MD_RAID5
+   tristate '  Linear (append) mode' CONFIG_MD_LINEAR
+   tristate '  RAID-0 (striping) mode' CONFIG_MD_STRIPED
+   tristate '  RAID-1 (mirroring) mode' CONFIG_MD_MIRRORING
+   tristate '  RAID-4/RAID-5 mode' CONFIG_MD_RAID5
 fi
 tristate 'RAM disk support' CONFIG_BLK_DEV_RAM
 if [ "$CONFIG_BLK_DEV_RAM" = "y" ]; then
-  bool '   Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD
+   bool '  Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD
 fi
 tristate 'XT harddisk support' CONFIG_BLK_DEV_XD
 if [ "$CONFIG_PCI" = "y" ]; then
-  bool 'Mylex DAC960 PCI RAID Controller support' CONFIG_BLK_DEV_DAC960
+   bool 'Mylex DAC960 PCI RAID Controller support' CONFIG_BLK_DEV_DAC960
 fi
 
 tristate 'Compaq SMART2 support' CONFIG_BLK_CPQ_DA
 if [ "$CONFIG_BLK_CPQ_DA" = "y" -o "$CONFIG_BLK_CPQ_DA" = "m" ]; then
-  bool '   Support for PCI SMART-2 Controllers' CONFIG_BLK_CPQ_DA_PCI
-  bool '   Support for EISA SMART-2 Controllers' CONFIG_BLK_CPQ_DA_EISA
+   bool '  Support for PCI SMART-2 Controllers' CONFIG_BLK_CPQ_DA_PCI
+   bool '  Support for EISA SMART-2 Controllers' CONFIG_BLK_CPQ_DA_EISA
 fi
 
 tristate 'Parallel port IDE device support' CONFIG_PARIDE 
 if [ "$CONFIG_PARIDE" = "y" -o "$CONFIG_PARIDE" = "m" ]; then
-  source drivers/block/paride/Config.in
+   source drivers/block/paride/Config.in
 fi
 
 if [ "$CONFIG_BLK_DEV_HD_IDE" = "y" -o "$CONFIG_BLK_DEV_HD_ONLY" = "y" ]; then
-  define_bool CONFIG_BLK_DEV_HD y
+   define_bool CONFIG_BLK_DEV_HD y
 else
-  define_bool CONFIG_BLK_DEV_HD n
+   define_bool CONFIG_BLK_DEV_HD n
 fi
 
 endmenu
diff -u --recursive --new-file linux-2.0.38/drivers/block/paride/pseudo.h linux-2.0.39/drivers/block/paride/pseudo.h
--- linux-2.0.38/drivers/block/paride/pseudo.h	Sun Jun 13 19:21:00 1999
+++ linux-2.0.39/drivers/block/paride/pseudo.h	Mon Dec 27 10:59:21 1999
@@ -76,7 +76,7 @@
 
         if (!ps_timer_active) {
 		ps_timer_active = 1;
-                ps_timer.expires = jiffies + (ps_nice>0)?(ps_nice-1):0;
+                ps_timer.expires = jiffies + ((ps_nice>0)?(ps_nice-1):0);
                 add_timer(&ps_timer);
         }
 
diff -u --recursive --new-file linux-2.0.38/drivers/block/proc_array.c linux-2.0.39/drivers/block/proc_array.c
--- linux-2.0.38/drivers/block/proc_array.c	Sun Jun 13 19:21:00 1999
+++ linux-2.0.39/drivers/block/proc_array.c	Wed Dec 29 12:50:32 1999
@@ -15,11 +15,11 @@
  *            quite a bit, modularized the code.
  * fvk 4/'93  waltje@uwalt.nl.mugnet.org (Fred N. van Kempen)
  *	      Renamed "route_get_info()" to "rt_get_info()" for consistency.
- * Alan Cox (gw4pts@gw4pts.ampr.org) 4/94
+ * Alan Cox (alan@lxorguk.ukuu.org.uk) 4/94
  *	      Dusted off the code and added IPX. Fixed the 4K limit.
  * Erik Schoenfelder (schoenfr@ibr.cs.tu-bs.de)
  *	      /proc/net/snmp.
- * Alan Cox (gw4pts@gw4pts.ampr.org) 1/95
+ * Alan Cox (alan@lxorguk.ukuu.org.uk) 1/95
  *	      Added Appletalk slots
  *
  *  proc diskarray directory handling functions
diff -u --recursive --new-file linux-2.0.38/drivers/cdrom/Config.in linux-2.0.39/drivers/cdrom/Config.in
--- linux-2.0.38/drivers/cdrom/Config.in	Thu May 16 15:35:39 1996
+++ linux-2.0.39/drivers/cdrom/Config.in	Thu Dec 30 02:22:25 1999
@@ -5,13 +5,13 @@
 tristate 'Goldstar R420 CDROM support' CONFIG_GSCD
 tristate 'Matsushita/Panasonic/Creative, Longshine, TEAC CDROM support' CONFIG_SBPCD
 if [ "$CONFIG_SBPCD" = "y" ]; then
-  bool 'Matsushita/Panasonic, ... second CDROM controller support' CONFIG_SBPCD2
-  if [ "$CONFIG_SBPCD2" = "y" ]; then
-    bool 'Matsushita/Panasonic, ... third CDROM controller support' CONFIG_SBPCD3
-    if [ "$CONFIG_SBPCD3" = "y" ]; then
-      bool 'Matsushita/Panasonic, ... fourth CDROM controller support' CONFIG_SBPCD4
-    fi
-  fi
+   bool '  Matsushita/Panasonic, ... second CDROM controller support' CONFIG_SBPCD2
+   if [ "$CONFIG_SBPCD2" = "y" ]; then
+      bool '    Matsushita/Panasonic, ... third CDROM controller support' CONFIG_SBPCD3
+      if [ "$CONFIG_SBPCD3" = "y" ]; then
+	 bool '      Matsushita/Panasonic, ... fourth CDROM controller support' CONFIG_SBPCD4
+      fi
+   fi
 fi
 tristate 'Mitsumi (standard) [no XA/Multisession] CDROM support' CONFIG_MCD
 tristate 'Mitsumi [XA/MultiSession] CDROM support' CONFIG_MCDX
@@ -20,7 +20,7 @@
 tristate 'Sanyo CDR-H94A CDROM support' CONFIG_SJCD
 bool 'Soft configurable cdrom interface card support' CONFIG_CDI_INIT
 if [ "$CONFIG_CDI_INIT" = "y" ]; then
-  tristate 'ISP16/MAD16/Mozart soft configurable cdrom interface support' CONFIG_ISP16_CDI
+   tristate '  ISP16/MAD16/Mozart soft configurable cdrom interface support' CONFIG_ISP16_CDI
 fi
 tristate 'Sony CDU31A/CDU33A CDROM support' CONFIG_CDU31A
 tristate 'Sony CDU535 CDROM support' CONFIG_CDU535
diff -u --recursive --new-file linux-2.0.38/drivers/char/Config.in linux-2.0.39/drivers/char/Config.in
--- linux-2.0.38/drivers/char/Config.in	Sun Jun 13 19:21:00 1999
+++ linux-2.0.39/drivers/char/Config.in	Thu Dec 30 18:52:27 1999
@@ -6,73 +6,73 @@
 
 tristate 'Standard/generic serial support' CONFIG_SERIAL
 if [ "$CONFIG_SERIAL" != "n" ]; then
-	if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-		bool '  PCI serial support' CONFIG_SERIAL_PCI
-	fi
+   if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+      bool '  PCI serial support (EXPERIMENTAL)' CONFIG_SERIAL_PCI
+   fi
 fi
 bool 'Digiboard PC/Xx Support' CONFIG_DIGI
 tristate 'Cyclades async mux support' CONFIG_CYCLADES
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-	dep_tristate 'Multi-Tech multiport card support' CONFIG_ISI m
+   dep_tristate 'Multi-Tech multiport card support (EXPERIMENTAL)' CONFIG_ISI m
 fi
 bool 'Stallion multiport serial support' CONFIG_STALDRV
 if [ "$CONFIG_STALDRV" = "y" ]; then
-  tristate '  Stallion EasyIO or EC8/32 support' CONFIG_STALLION
-  tristate '  Stallion EC8/64, ONboard, Brumby support' CONFIG_ISTALLION
+   tristate '  Stallion EasyIO or EC8/32 support' CONFIG_STALLION
+   tristate '  Stallion EC8/64, ONboard, Brumby support' CONFIG_ISTALLION
 fi
 tristate 'SDL RISCom/8 card support' CONFIG_RISCOM8
 tristate 'Parallel printer support' CONFIG_PRINTER
 tristate 'Specialix IO8+ card support' CONFIG_SPECIALIX
-if [ "$CONFIG_SPECIALIX" = "y" -o  "$CONFIG_SPECIALIX" = "m" ]; then
-  bool 'Specialix DTR/RTS pin is RTS' CONFIG_SPECIALIX_RTSCTS
+if [ "$CONFIG_SPECIALIX" = "y" -o "$CONFIG_SPECIALIX" = "m" ]; then
+   bool '  Specialix DTR/RTS pin is RTS' CONFIG_SPECIALIX_RTSCTS
 fi 
 
 
 bool 'Mouse Support (not serial mice)' CONFIG_MOUSE
 if [ "$CONFIG_MOUSE" = "y" ]; then
-	tristate 'ATIXL busmouse support' CONFIG_ATIXL_BUSMOUSE
-	tristate 'Logitech busmouse support' CONFIG_BUSMOUSE
-	tristate 'Microsoft busmouse support' CONFIG_MS_BUSMOUSE
-	tristate 'PS/2 mouse (aka "auxiliary device") support' CONFIG_PSMOUSE
-	if [ "$CONFIG_PSMOUSE" != "n" ]; then
-	  bool 'C&T 82C710 mouse port support (as on TI Travelmate)' CONFIG_82C710_MOUSE
-	fi
+   tristate '  ATIXL busmouse support' CONFIG_ATIXL_BUSMOUSE
+   tristate '  Logitech busmouse support' CONFIG_BUSMOUSE
+   tristate '  Microsoft busmouse support' CONFIG_MS_BUSMOUSE
+   tristate '  PS/2 mouse (aka "auxiliary device") support' CONFIG_PSMOUSE
+   if [ "$CONFIG_PSMOUSE" != "n" ]; then
+      bool '    C&T 82C710 mouse port support (as on TI Travelmate)' CONFIG_82C710_MOUSE
+   fi
 fi
 
 bool 'Support for user misc device modules' CONFIG_UMISC
 
 bool 'QIC-02 tape support' CONFIG_QIC02_TAPE
 if [ "$CONFIG_QIC02_TAPE" = "y" ]; then
-  bool 'Do you want runtime configuration for QIC-02' CONFIG_QIC02_DYNCONF
-  if [ "$CONFIG_QIC02_DYNCONF" != "y" ]; then
-    comment 'Edit configuration parameters in ./include/linux/tpqic02.h!'
-  else
-    comment 'Setting runtime QIC-02 configuration is done with qic02conf'
-    comment 'from the tpqic02-support package.  It is available at'
-    comment 'ftp://titus.cfw.com/pub/Linux/util/'
-fi
+   bool '  Do you want runtime configuration for QIC-02' CONFIG_QIC02_DYNCONF
+   if [ "$CONFIG_QIC02_DYNCONF" != "y" ]; then
+      comment 'Edit configuration parameters in ./include/linux/tpqic02.h!'
+   else
+      comment 'Setting runtime QIC-02 configuration is done with qic02conf'
+      comment 'from the tpqic02-support package.  It is available at'
+      comment 'ftp://titus.cfw.com/pub/Linux/util/'
+   fi
 fi
 
 tristate 'Ftape (QIC-80/Travan) support' CONFIG_FTAPE
 if [ "$CONFIG_FTAPE" != "n" ]; then
-  comment 'Set IObase/IRQ/DMA for ftape in ./drivers/char/ftape/Makefile'
+   comment 'Set IObase/IRQ/DMA for ftape in ./drivers/char/ftape/Makefile'
 fi
 
 if [ "$CONFIG_ALPHA_BOOK1" = "y" ]; then
-  bool 'Tadpole ANA H8 Support'	CONFIG_H8
+   bool 'Tadpole ANA H8 Support' CONFIG_H8
 fi
 bool 'Watchdog Timer Support'	CONFIG_WATCHDOG
 if [ "$CONFIG_WATCHDOG" != "n" ]; then
-  bool '   Disable watchdog shutdown on close' CONFIG_WATCHDOG_NOWAYOUT
-  tristate '   WDT Watchdog timer' CONFIG_WDT
-  if [ "$CONFIG_WDT" != "n" ]; then
-     bool '       WDT501 features' CONFIG_WDT_501
-     if [ "$CONFIG_WDT_501" = "y" ]; then
-         bool '       Fan Tachometer' CONFIG_WDT_501_FAN
-     fi
-  fi
-  tristate '   Software Watchdog' CONFIG_SOFT_WATCHDOG
-  tristate '   Berkshire Products PC Watchdog' CONFIG_PCWATCHDOG
+   bool '  Disable watchdog shutdown on close' CONFIG_WATCHDOG_NOWAYOUT
+   tristate '  WDT Watchdog timer' CONFIG_WDT
+   if [ "$CONFIG_WDT" != "n" ]; then
+      bool '    WDT501 features' CONFIG_WDT_501
+      if [ "$CONFIG_WDT_501" = "y" ]; then
+	 bool '      Fan Tachometer' CONFIG_WDT_501_FAN
+      fi
+   fi
+   tristate '  Software Watchdog' CONFIG_SOFT_WATCHDOG
+   tristate '  Berkshire Products PC Watchdog' CONFIG_PCWATCHDOG
 fi
 bool 'Enhanced Real Time Clock Support' CONFIG_RTC
 endmenu
diff -u --recursive --new-file linux-2.0.38/drivers/isdn/Config.in linux-2.0.39/drivers/isdn/Config.in
--- linux-2.0.38/drivers/isdn/Config.in	Sun Nov 15 19:32:56 1998
+++ linux-2.0.39/drivers/isdn/Config.in	Mon Feb  7 22:09:39 2000
@@ -2,53 +2,53 @@
 # ISDN device configuration
 #
 if [ "$CONFIG_INET" != "n" ]; then
-  bool 'Support synchronous PPP' CONFIG_ISDN_PPP
-  if [ "$CONFIG_ISDN_PPP" != "n" ]; then
-    bool 'Use VJ-compression with synchronous PPP' CONFIG_ISDN_PPP_VJ
-    bool 'Support generic MP (RFC 1717)' CONFIG_ISDN_MPP
-  fi
-  #bool 'Support dynamic timeout-rules' CONFIG_ISDN_TIMEOUT_RULES
-  #if [ "$CONFIG_ISDN_TIMEOUT_RULES" != "n" ]; then
-  #  bool 'Use masqueraded addresses for rule-matching' CONFIG_ISDN_TIMRU_USE_MASQ
-  #fi
-  #bool 'Support budget-accounting' CONFIG_ISDN_BUDGET
+   bool '  Support synchronous PPP' CONFIG_ISDN_PPP
+   if [ "$CONFIG_ISDN_PPP" != "n" ]; then
+      bool '    Use VJ-compression with synchronous PPP' CONFIG_ISDN_PPP_VJ
+      bool '    Support generic MP (RFC 1717)' CONFIG_ISDN_MPP
+   fi
+#   bool '  Support dynamic timeout-rules' CONFIG_ISDN_TIMEOUT_RULES
+#   if [ "$CONFIG_ISDN_TIMEOUT_RULES" != "n" ]; then
+#      bool '    Use masqueraded addresses for rule-matching' CONFIG_ISDN_TIMRU_USE_MASQ
+#   fi
+#   bool '  Support budget-accounting' CONFIG_ISDN_BUDGET
 fi
-bool 'Support audio via ISDN' CONFIG_ISDN_AUDIO
-dep_tristate 'ICN 2B and 4B support' CONFIG_ISDN_DRV_ICN $CONFIG_ISDN
-dep_tristate 'isdnloop support' CONFIG_ISDN_DRV_LOOP $CONFIG_ISDN
-dep_tristate 'PCBIT-D support' CONFIG_ISDN_DRV_PCBIT $CONFIG_ISDN
-dep_tristate 'HiSax SiemensChipSet driver support' CONFIG_ISDN_DRV_HISAX $CONFIG_ISDN
+bool '  Support audio via ISDN' CONFIG_ISDN_AUDIO
+dep_tristate '  ICN 2B and 4B support' CONFIG_ISDN_DRV_ICN $CONFIG_ISDN
+dep_tristate '  isdnloop support' CONFIG_ISDN_DRV_LOOP $CONFIG_ISDN
+dep_tristate '  PCBIT-D support' CONFIG_ISDN_DRV_PCBIT $CONFIG_ISDN
+dep_tristate '  HiSax SiemensChipSet driver support' CONFIG_ISDN_DRV_HISAX $CONFIG_ISDN
 if [ "$CONFIG_ISDN_DRV_HISAX" != "n" ]; then
-    bool 'HiSax Support for EURO/DSS1' CONFIG_HISAX_EURO
-    if [ "$CONFIG_HISAX_EURO" != "n" ]; then
-	    bool 'Support for german chargeinfo' CONFIG_DE_AOC
-	    bool 'Disable sending complete' CONFIG_HISAX_NO_SENDCOMPLETE
-	    bool 'Disable sending low layer compatibility' CONFIG_HISAX_NO_LLC
-    fi
-    bool 'HiSax Support for german 1TR6' CONFIG_HISAX_1TR6
-    bool 'HiSax Support for Teles 16.0/8.0' CONFIG_HISAX_16_0
-    bool 'HiSax Support for Teles 16.3 or PNP or PCMCIA' CONFIG_HISAX_16_3
-    bool 'HiSax Support for Teles 16.3c' CONFIG_HISAX_TELES3C 
-    bool 'HiSax Support for Teles PCI' CONFIG_HISAX_TELESPCI 
-    bool 'HiSax Support for Teles S0Box' CONFIG_HISAX_S0BOX 
-    bool 'HiSax Support for AVM A1 (Fritz)' CONFIG_HISAX_AVM_A1
-    bool 'HiSax Support for AVM PnP/PCI (Fritz!PnP/PCI)' CONFIG_HISAX_FRITZPCI
-    bool 'HiSax Support for AVM A1 PCMCIA (Fritz)' CONFIG_HISAX_AVM_A1_PCMCIA
-    bool 'HiSax Support for Elsa cards' CONFIG_HISAX_ELSA
-    bool 'HiSax Support for ITK ix1-micro Revision 2' CONFIG_HISAX_IX1MICROR2
-    bool 'HiSax Support for Eicon.Diehl Diva cards' CONFIG_HISAX_DIEHLDIVA
-    bool 'HiSax Support for ASUSCOM cards' CONFIG_HISAX_ASUSCOM
-    bool 'HiSax Support for TELEINT cards' CONFIG_HISAX_TELEINT
-    bool 'HiSax Support for Sedlbauer cards' CONFIG_HISAX_SEDLBAUER
-    bool 'HiSax Support for USR Sportster internal TA' CONFIG_HISAX_SPORTSTER
-    bool 'HiSax Support for MIC card' CONFIG_HISAX_MIC
-    bool 'HiSax Support for NETjet card' CONFIG_HISAX_NETJET
-    bool 'HiSax Support for Niccy PnP/PCI card' CONFIG_HISAX_NICCY
+   bool '  HiSax Support for EURO/DSS1' CONFIG_HISAX_EURO
+   if [ "$CONFIG_HISAX_EURO" != "n" ]; then
+      bool '    Support for german chargeinfo' CONFIG_DE_AOC
+      bool '    Disable sending complete' CONFIG_HISAX_NO_SENDCOMPLETE
+      bool '    Disable sending low layer compatibility' CONFIG_HISAX_NO_LLC
+   fi
+   bool '  HiSax Support for german 1TR6' CONFIG_HISAX_1TR6
+   bool '  HiSax Support for Teles 16.0/8.0' CONFIG_HISAX_16_0
+   bool '  HiSax Support for Teles 16.3 or PNP or PCMCIA' CONFIG_HISAX_16_3
+   bool '  HiSax Support for Teles 16.3c' CONFIG_HISAX_TELES3C 
+   bool '  HiSax Support for Teles PCI' CONFIG_HISAX_TELESPCI 
+   bool '  HiSax Support for Teles S0Box' CONFIG_HISAX_S0BOX 
+   bool '  HiSax Support for AVM A1 (Fritz)' CONFIG_HISAX_AVM_A1
+   bool '  HiSax Support for AVM PnP/PCI (Fritz!PnP/PCI)' CONFIG_HISAX_FRITZPCI
+   bool '  HiSax Support for AVM A1 PCMCIA (Fritz)' CONFIG_HISAX_AVM_A1_PCMCIA
+   bool '  HiSax Support for Elsa cards' CONFIG_HISAX_ELSA
+   bool '  HiSax Support for ITK ix1-micro Revision 2' CONFIG_HISAX_IX1MICROR2
+   bool '  HiSax Support for Eicon.Diehl Diva cards' CONFIG_HISAX_DIEHLDIVA
+   bool '  HiSax Support for ASUSCOM cards' CONFIG_HISAX_ASUSCOM
+   bool '  HiSax Support for TELEINT cards' CONFIG_HISAX_TELEINT
+   bool '  HiSax Support for Sedlbauer cards' CONFIG_HISAX_SEDLBAUER
+   bool '  HiSax Support for USR Sportster internal TA' CONFIG_HISAX_SPORTSTER
+   bool '  HiSax Support for MIC card' CONFIG_HISAX_MIC
+   bool '  HiSax Support for NETjet card' CONFIG_HISAX_NETJET
+   bool '  HiSax Support for Niccy PnP/PCI card' CONFIG_HISAX_NICCY
 fi
 if [ "$CONFIG_EXPERIMENTAL" != "n" ]; then
-	dep_tristate 'Spellcaster support (EXPERIMENTAL)' CONFIG_ISDN_DRV_SC $CONFIG_ISDN
+   dep_tristate '  Spellcaster support (EXPERIMENTAL)' CONFIG_ISDN_DRV_SC $CONFIG_ISDN
 fi
-dep_tristate 'AVM-B1 with CAPI2.0 support' CONFIG_ISDN_DRV_AVMB1 $CONFIG_ISDN
+dep_tristate '  AVM-B1 with CAPI2.0 support' CONFIG_ISDN_DRV_AVMB1 $CONFIG_ISDN
 if [ "$CONFIG_ISDN_DRV_AVMB1" != "n" ]; then
-    bool 'Verbose reason code reporting (kernel size +=7K)' CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON
+   bool '    Verbose reason code reporting (kernel size +=7K)' CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON
 fi
diff -u --recursive --new-file linux-2.0.38/drivers/net/Config.in linux-2.0.39/drivers/net/Config.in
--- linux-2.0.38/drivers/net/Config.in	Sun Nov 15 19:33:02 1998
+++ linux-2.0.39/drivers/net/Config.in	Mon Feb  7 22:09:17 2000
@@ -4,148 +4,146 @@
 tristate 'Dummy net driver support' CONFIG_DUMMY
 tristate 'EQL (serial line load balancing) support' CONFIG_EQUALIZER
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  tristate 'Frame relay DLCI support (EXPERIMENTAL)' CONFIG_DLCI
-  if [ "$CONFIG_DLCI" = "y" -o "$CONFIG_DLCI" = "m" ]; then
-    int '  Max open DLCI' CONFIG_DLCI_COUNT 24
-    int '  Max DLCI per device' CONFIG_DLCI_MAX 8
-    dep_tristate '  SDLA (Sangoma S502/S508) support' CONFIG_SDLA $CONFIG_DLCI
-  fi
+   tristate 'Frame relay DLCI support (EXPERIMENTAL)' CONFIG_DLCI
+   if [ "$CONFIG_DLCI" = "y" -o "$CONFIG_DLCI" = "m" ]; then
+      int '  Max open DLCI' CONFIG_DLCI_COUNT 24
+      int '  Max DLCI per device' CONFIG_DLCI_MAX 8
+      dep_tristate '  SDLA (Sangoma S502/S508) support' CONFIG_SDLA $CONFIG_DLCI
+   fi
 fi
 tristate 'PLIP (parallel port) support' CONFIG_PLIP
 tristate 'PPP (point-to-point) support' CONFIG_PPP
-if [ ! "$CONFIG_PPP" = "n" ]; then
-  comment 'CCP compressors for PPP are only built as modules.'
+if [ "$CONFIG_PPP" != "n" ]; then
+   comment '  CCP compressors for PPP are only built as modules.'
 fi
 tristate 'SLIP (serial line) support' CONFIG_SLIP
 if [ "$CONFIG_SLIP" != "n" ]; then
-  bool ' CSLIP compressed headers' CONFIG_SLIP_COMPRESSED
-  bool ' Keepalive and linefill' CONFIG_SLIP_SMART
-  bool ' Six bit SLIP encapsulation' CONFIG_SLIP_MODE_SLIP6
+   bool '  CSLIP compressed headers' CONFIG_SLIP_COMPRESSED
+   bool '  Keepalive and linefill' CONFIG_SLIP_SMART
+   bool '  Six bit SLIP encapsulation' CONFIG_SLIP_MODE_SLIP6
 fi
 bool 'Radio network interfaces' CONFIG_NET_RADIO
 if [ "$CONFIG_NET_RADIO" != "n" ]; then
-  if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-    tristate 'BAYCOM ser12 and par96 driver for AX.25' CONFIG_BAYCOM
-    tristate 'Soundcard modem driver for AX.25' CONFIG_SOUNDMODEM
-    if [ "$CONFIG_SOUNDMODEM" != "n" ]; then
-      bool 'Soundmodem support for Soundblaster and compatible cards' CONFIG_SOUNDMODEM_SBC
-      bool 'Soundmodem support for WSS and Crystal cards' CONFIG_SOUNDMODEM_WSS
-      bool 'Soundmodem support for 1200 baud AFSK modulation' CONFIG_SOUNDMODEM_AFSK1200
-      bool 'Soundmodem support for 2400 baud AFSK modulation (7.3728MHz crystal)' CONFIG_SOUNDMODEM_AFSK2400_7
-      bool 'Soundmodem support for 2400 baud AFSK modulation (8MHz crystal)' CONFIG_SOUNDMODEM_AFSK2400_8
-      bool 'Soundmodem support for 2666 baud AFSK modulation' CONFIG_SOUNDMODEM_AFSK2666
-      bool 'Soundmodem support for 4800 baud HAPN-1 modulation' CONFIG_SOUNDMODEM_HAPN4800
-      bool 'Soundmodem support for 4800 baud PSK modulation' CONFIG_SOUNDMODEM_PSK4800
-      bool 'Soundmodem support for 9600 baud FSK G3RUH modulation' CONFIG_SOUNDMODEM_FSK9600
-    fi
-  fi
-  tristate 'Serial port KISS driver for AX.25' CONFIG_MKISS
-  tristate 'BPQ Ethernet driver for AX.25' CONFIG_BPQETHER
-  tristate 'Gracilis PackeTwin support for AX.25' CONFIG_PT
-  tristate 'Ottawa PI and PI/2 support for AX.25' CONFIG_PI
-  tristate 'Z8530 SCC KISS emulation driver for AX.25' CONFIG_SCC
-  tristate 'STRIP (Metricom starmode radio IP)' CONFIG_STRIP
-  tristate 'AT&T WaveLAN & DEC RoamAbout DS support' CONFIG_WAVELAN
+   if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+      tristate '  BAYCOM ser12 and par96 driver for AX.25 (EXPERIMENTAL)' CONFIG_BAYCOM
+      tristate '  Soundcard modem driver for AX.25 (EXPERIMENTAL)' CONFIG_SOUNDMODEM
+      if [ "$CONFIG_SOUNDMODEM" != "n" ]; then
+	 bool '    Soundmodem support for Soundblaster and compatible cards' CONFIG_SOUNDMODEM_SBC
+	 bool '    Soundmodem support for WSS and Crystal cards' CONFIG_SOUNDMODEM_WSS
+	 bool '    Soundmodem support for 1200 baud AFSK modulation' CONFIG_SOUNDMODEM_AFSK1200
+	 bool '    Soundmodem support for 2400 baud AFSK modulation (7.3728MHz crystal)' CONFIG_SOUNDMODEM_AFSK2400_7
+	 bool '    Soundmodem support for 2400 baud AFSK modulation (8MHz crystal)' CONFIG_SOUNDMODEM_AFSK2400_8
+	 bool '    Soundmodem support for 2666 baud AFSK modulation' CONFIG_SOUNDMODEM_AFSK2666
+	 bool '    Soundmodem support for 4800 baud HAPN-1 modulation' CONFIG_SOUNDMODEM_HAPN4800
+	 bool '    Soundmodem support for 4800 baud PSK modulation' CONFIG_SOUNDMODEM_PSK4800
+	 bool '    Soundmodem support for 9600 baud FSK G3RUH modulation' CONFIG_SOUNDMODEM_FSK9600
+      fi
+   fi
+   tristate '  Serial port KISS driver for AX.25' CONFIG_MKISS
+   tristate '  BPQ Ethernet driver for AX.25' CONFIG_BPQETHER
+   tristate '  Gracilis PackeTwin support for AX.25' CONFIG_PT
+   tristate '  Ottawa PI and PI/2 support for AX.25' CONFIG_PI
+   tristate '  Z8530 SCC KISS emulation driver for AX.25' CONFIG_SCC
+   tristate '  STRIP (Metricom starmode radio IP)' CONFIG_STRIP
+   tristate '  AT&T WaveLAN & DEC RoamAbout DS support' CONFIG_WAVELAN
 fi
 #
 #	Ethernet
 #
 bool 'Ethernet (10 or 100Mbit)' CONFIG_NET_ETHERNET
 if [ "$CONFIG_NET_ETHERNET" = "y" ]; then
-  bool '3COM ISA, EISA and PCI cards' CONFIG_NET_VENDOR_3COM
-  if [ "$CONFIG_NET_VENDOR_3COM" = "y" ]; then
-    tristate '3c501 support' CONFIG_EL1
-    tristate '3c503 support' CONFIG_EL2
-    if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-      tristate '3c505 support' CONFIG_ELPLUS
-      tristate '3c507 support' CONFIG_EL16
-    fi
-    tristate '3c509/3c579 support' CONFIG_EL3
-    tristate '3c515 ISA Fast EtherLink' CONFIG_3C515
-    tristate '3c590/3c900 series (592/595/597/900/905) "Vortex/Boomerang" support' CONFIG_VORTEX
-  fi
-  bool 'Western Digital/SMC ISA and EISA cards' CONFIG_NET_VENDOR_SMC
-  if [ "$CONFIG_NET_VENDOR_SMC" = "y" ]; then
-    tristate 'WD80*3 support' CONFIG_WD80x3
-    tristate 'SMC Ultra support' CONFIG_ULTRA
-    tristate 'SMC Ultra32 support' CONFIG_ULTRA32
-    tristate 'SMC 9194 support' CONFIG_SMC9194
-  fi
-  bool 'PCI Ethernet adapters' CONFIG_NET_PCI
-  if [ "$CONFIG_NET_PCI" = "y" ]; then
-    tristate 'AMD PCI PCnet32 (PCI bus NE2100 cards) support' CONFIG_PCNET32
-    tristate 'Intel EtherExpressPro PCI 10+/100B/100+ support' CONFIG_EEXPRESS_PRO100B
-    tristate 'DE425, DE434, DE435, DE450, DE500 support' CONFIG_DE4X5
-    tristate 'DECchip Tulip (dc21x4x) PCI support' CONFIG_DEC_ELCP
-    tristate 'Digi Intl. RightSwitch SE-X support' CONFIG_DGRS
-    tristate 'PCI NE2000 support' CONFIG_NE2K_PCI
-    tristate 'Packet Engines Yellowfin Gigabit-NIC support' CONFIG_YELLOWFIN
-    tristate 'RealTek 8129/8139 (not 8019/8029!) support' CONFIG_RTL8139
-    tristate 'SMC EPIC/100 (EtherPower II) support' CONFIG_EPIC
-    tristate 'TI ThunderLAN support' CONFIG_TLAN
-    tristate 'VIA Rhine support' CONFIG_VIA_RHINE
-  fi
-  bool 'Other ISA cards' CONFIG_NET_ISA
-  if [ "$CONFIG_NET_ISA" = "y" ]; then
-    tristate 'AMD LANCE and PCnet (AT1500 and NE2100) support' CONFIG_LANCE
-    tristate 'AT1700 (Fujitsu 86965) support' CONFIG_AT1700
-    tristate 'Cabletron E21xx support' CONFIG_E2100
-    tristate 'DEPCA, DE10x, DE200, DE201, DE202, DE422 support' CONFIG_DEPCA
-    tristate 'EtherWORKS 3 (DE203, DE204, DE205) support' CONFIG_EWRK3
-    tristate 'EtherExpress 16 support' CONFIG_EEXPRESS
-    if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-      tristate 'EtherExpressPro support' CONFIG_EEXPRESS_PRO
-      tristate 'FMV-181/182/183/184 support' CONFIG_FMV18X
-    fi
-    tristate 'HP PCLAN+ (27247B and 27252A) support' CONFIG_HPLAN_PLUS
-    tristate 'HP PCLAN (27245 and other 27xxx series) support' CONFIG_HPLAN
-    tristate 'HP 10/100VG PCLAN (ISA, EISA, PCI) support' CONFIG_HP100
-    if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-      tristate 'ICL EtherTeam 16i/32 support' CONFIG_ETH16I
-    fi
-    tristate 'NE2000/NE1000 ISA support' CONFIG_NE2000
-    if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-      tristate 'NI5210 support' CONFIG_NI52
-      tristate 'NI6510 support' CONFIG_NI65
-    fi
-    if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-      bool 'SEEQ8005 support (EXPERIMENTAL)' CONFIG_SEEQ8005
-    fi
-    bool 'SK_G16 support' CONFIG_SK_G16
-  fi
-  bool 'EISA, VLB and other board controllers' CONFIG_NET_EISA
-  if [ "$CONFIG_NET_EISA" = "y" ]; then
-    if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-      tristate 'Ansel Communications EISA 3200 support (EXPERIMENTAL)' CONFIG_AC3200
-    fi
-    tristate 'Apricot Xen-II on board ethernet' CONFIG_APRICOT
-    if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-      bool 'Zenith Z-Note support (EXPERIMENTAL)' CONFIG_ZNET
-    fi
-  fi
-  bool 'Pocket and portable adaptors' CONFIG_NET_POCKET
-  if [ "$CONFIG_NET_POCKET" = "y" ]; then
-    tristate 'AT-LAN-TEC/RealTek pocket adaptor support' CONFIG_ATP
-    tristate 'D-Link DE600 pocket adaptor support' CONFIG_DE600
-    tristate 'D-Link DE620 pocket adaptor support' CONFIG_DE620
-  fi
+   bool '  3COM ISA, EISA and PCI cards' CONFIG_NET_VENDOR_3COM
+   if [ "$CONFIG_NET_VENDOR_3COM" = "y" ]; then
+      tristate '    3c501 support' CONFIG_EL1
+      tristate '    3c503 support' CONFIG_EL2
+      if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+	 tristate '    3c505 (EXPERIMENTAL) support' CONFIG_ELPLUS
+	 tristate '    3c507 (EXPERIMENTAL) support' CONFIG_EL16
+      fi
+      tristate '    3c509/3c579 support' CONFIG_EL3
+      tristate '    3c515 ISA Fast EtherLink' CONFIG_3C515
+      tristate '    3c590/3c900 series (592/595/597/900/905) "Vortex/Boomerang" support' CONFIG_VORTEX
+   fi
+   bool '  Western Digital/SMC ISA and EISA cards' CONFIG_NET_VENDOR_SMC
+   if [ "$CONFIG_NET_VENDOR_SMC" = "y" ]; then
+      tristate '    WD80*3 support' CONFIG_WD80x3
+      tristate '    SMC Ultra support' CONFIG_ULTRA
+      tristate '    SMC Ultra32 support' CONFIG_ULTRA32
+      tristate '    SMC 9194 support' CONFIG_SMC9194
+   fi
+   bool '  PCI Ethernet adapters' CONFIG_NET_PCI
+   if [ "$CONFIG_NET_PCI" = "y" ]; then
+      tristate '    AMD PCI PCnet32 (PCI bus NE2100 cards) support' CONFIG_PCNET32
+      tristate '    Intel EtherExpressPro PCI 10+/100B/100+ support' CONFIG_EEXPRESS_PRO100B
+      tristate '    DE425, DE434, DE435, DE450, DE500 support' CONFIG_DE4X5
+      tristate '    DECchip Tulip (dc21x4x) PCI support' CONFIG_DEC_ELCP
+      tristate '    Digi Intl. RightSwitch SE-X support' CONFIG_DGRS
+      tristate '    PCI NE2000 support' CONFIG_NE2K_PCI
+      tristate '    Packet Engines Yellowfin Gigabit-NIC support' CONFIG_YELLOWFIN
+      tristate '    RealTek 8129/8139 (not 8019/8029!) support' CONFIG_RTL8139
+      tristate '    SMC EPIC/100 (EtherPower II) support' CONFIG_EPIC
+      tristate '    TI ThunderLAN support' CONFIG_TLAN
+      tristate '    VIA Rhine support' CONFIG_VIA_RHINE
+   fi
+   bool '  Other ISA cards' CONFIG_NET_ISA
+   if [ "$CONFIG_NET_ISA" = "y" ]; then
+      tristate '    AMD LANCE and PCnet (AT1500 and NE2100) support' CONFIG_LANCE
+      tristate '    AT1700 (Fujitsu 86965) support' CONFIG_AT1700
+      tristate '    Cabletron E21xx support' CONFIG_E2100
+      tristate '    DEPCA, DE10x, DE200, DE201, DE202, DE422 support' CONFIG_DEPCA
+      tristate '    EtherWORKS 3 (DE203, DE204, DE205) support' CONFIG_EWRK3
+      tristate '    EtherExpress 16 support' CONFIG_EEXPRESS
+      if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+	 tristate '    EtherExpressPro support (EXPERIMENTAL)' CONFIG_EEXPRESS_PRO
+	 tristate '    FMV-181/182/183/184 support (EXPERIMENTAL)' CONFIG_FMV18X
+      fi
+      tristate '    HP PCLAN+ (27247B and 27252A) support' CONFIG_HPLAN_PLUS
+      tristate '    HP PCLAN (27245 and other 27xxx series) support' CONFIG_HPLAN
+      tristate '    HP 10/100VG PCLAN (ISA, EISA, PCI) support' CONFIG_HP100
+      if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+	 tristate '    ICL EtherTeam 16i/32 support (EXPERIMENTAL)' CONFIG_ETH16I
+      fi
+      tristate '    NE2000/NE1000 ISA support' CONFIG_NE2000
+      if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+	 tristate '    NI5210 support (EXPERIMENTAL)' CONFIG_NI52
+	 tristate '    NI6510 support (EXPERIMENTAL)' CONFIG_NI65
+	 bool '    SEEQ8005 support (EXPERIMENTAL)' CONFIG_SEEQ8005
+      fi
+      bool '    SK_G16 support' CONFIG_SK_G16
+   fi
+   bool '  EISA, VLB and other board controllers' CONFIG_NET_EISA
+   if [ "$CONFIG_NET_EISA" = "y" ]; then
+      if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+	 tristate '    Ansel Communications EISA 3200 support (EXPERIMENTAL)' CONFIG_AC3200
+      fi
+      tristate '    Apricot Xen-II on board ethernet' CONFIG_APRICOT
+      if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+	 bool '    Zenith Z-Note support (EXPERIMENTAL)' CONFIG_ZNET
+      fi
+   fi
+   bool '  Pocket and portable adaptors' CONFIG_NET_POCKET
+   if [ "$CONFIG_NET_POCKET" = "y" ]; then
+      tristate '    AT-LAN-TEC/RealTek pocket adaptor support' CONFIG_ATP
+      tristate '    D-Link DE600 pocket adaptor support' CONFIG_DE600
+      tristate '    D-Link DE620 pocket adaptor support' CONFIG_DE620
+   fi
 fi
 
 bool 'Token Ring driver support' CONFIG_TR
 if [ "$CONFIG_TR" = "y" ]; then
-  tristate 'IBM Tropic chipset based adaptor support' CONFIG_IBMTR
+   tristate '  IBM Tropic chipset based adaptor support' CONFIG_IBMTR
 fi
 bool 'FDDI driver support' CONFIG_FDDI
 if [ "$CONFIG_FDDI" = "y" ]; then
-  bool 'Digital DEFEA and DEFPA adapter support' CONFIG_DEFXX
+   bool '  Digital DEFEA and DEFPA adapter support' CONFIG_DEFXX
 fi
 tristate 'ARCnet support' CONFIG_ARCNET
 if [ "$CONFIG_ARCNET" != "n" ]; then
-  bool '  Enable arc0e (ARCnet "Ether-Encap" packet format)' CONFIG_ARCNET_ETH
-  bool '  Enable arc0s (ARCnet RFC1051 packet format)' CONFIG_ARCNET_1051
+   bool '  Enable arc0e (ARCnet "Ether-Encap" packet format)' CONFIG_ARCNET_ETH
+   bool '  Enable arc0s (ARCnet RFC1051 packet format)' CONFIG_ARCNET_1051
 fi
 
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  tristate 'Traffic Shaper (EXPERIMENTAL)' CONFIG_SHAPER
-  tristate 'Red Creek Hardware VPN (EXPERIMENTAL)' CONFIG_RCPCI
+   tristate 'Traffic Shaper (EXPERIMENTAL)' CONFIG_SHAPER
+   tristate 'Red Creek Hardware VPN (EXPERIMENTAL)' CONFIG_RCPCI
 fi
diff -u --recursive --new-file linux-2.0.38/drivers/net/plip.c linux-2.0.39/drivers/net/plip.c
--- linux-2.0.38/drivers/net/plip.c	Sun Nov 15 19:33:03 1998
+++ linux-2.0.39/drivers/net/plip.c	Wed Dec 29 12:49:38 1999
@@ -5,7 +5,7 @@
  * Authors:	Donald Becker,  <becker@super.org>
  *		Tommy Thorn, <thorn@daimi.aau.dk>
  *		Tanabe Hiroyasu, <hiro@sanpo.t.u-tokyo.ac.jp>
- *		Alan Cox, <gw4pts@gw4pts.ampr.org>
+ *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
  *		Peter Bauer, <100136.3530@compuserve.com>
  *		Niibe Yutaka, <gniibe@mri.co.jp>
  *
diff -u --recursive --new-file linux-2.0.38/drivers/scsi/Config.in linux-2.0.39/drivers/scsi/Config.in
--- linux-2.0.38/drivers/scsi/Config.in	Sun Jun 13 19:21:02 1999
+++ linux-2.0.39/drivers/scsi/Config.in	Thu Dec 30 18:57:45 1999
@@ -1,15 +1,15 @@
 comment 'SCSI support type (disk, tape, CD-ROM)'
 
-dep_tristate 'SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI
-dep_tristate 'SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI
-dep_tristate 'SCSI CD-ROM support' CONFIG_BLK_DEV_SR $CONFIG_SCSI
-dep_tristate 'SCSI generic support' CONFIG_CHR_DEV_SG $CONFIG_SCSI
+dep_tristate '  SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI
+dep_tristate '  SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI
+dep_tristate '  SCSI CD-ROM support' CONFIG_BLK_DEV_SR $CONFIG_SCSI
+dep_tristate '  SCSI generic support' CONFIG_CHR_DEV_SG $CONFIG_SCSI
 
 comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs'
 
-bool 'Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN
+bool '  Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN
 
-bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS
+bool '  Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS
 
 mainmenu_option next_comment
 comment 'SCSI low-level drivers'
@@ -21,10 +21,10 @@
 dep_tristate 'Adaptec AHA1740 support' CONFIG_SCSI_AHA1740 $CONFIG_SCSI
 dep_tristate 'Adaptec AIC7xxx support' CONFIG_SCSI_AIC7XXX $CONFIG_SCSI
 if [ "$CONFIG_SCSI_AIC7XXX" != "n" ]; then
-    bool '   Enable Tagged Command Queueing (TCQ) by default' CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT
-    int  '   Maximum number of TCQ commands per device' CONFIG_AIC7XXX_CMDS_PER_DEVICE 8
-    bool '   Collect statistics to report in /proc' CONFIG_AIC7XXX_PROC_STATS N
-    int  '   Delay in seconds after SCSI bus reset' CONFIG_AIC7XXX_RESET_DELAY 5
+   bool '  Enable Tagged Command Queueing (TCQ) by default' CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT
+   int  '  Maximum number of TCQ commands per device' CONFIG_AIC7XXX_CMDS_PER_DEVICE 8
+   bool '  Collect statistics to report in /proc' CONFIG_AIC7XXX_PROC_STATS N
+   int  '  Delay in seconds after SCSI bus reset' CONFIG_AIC7XXX_RESET_DELAY 5
 fi
 dep_tristate 'AdvanSys SCSI support' CONFIG_SCSI_ADVANSYS $CONFIG_SCSI
 dep_tristate 'Always IN2000 SCSI support' CONFIG_SCSI_IN2000 $CONFIG_SCSI
@@ -32,56 +32,56 @@
 dep_tristate 'AMI MegaRAID support' CONFIG_SCSI_MEGARAID $CONFIG_SCSI
 dep_tristate 'BusLogic SCSI support' CONFIG_SCSI_BUSLOGIC $CONFIG_SCSI
 if [ "$CONFIG_SCSI_BUSLOGIC" != "n" ]; then
-    bool '  Omit FlashPoint support' CONFIG_SCSI_OMIT_FLASHPOINT
+   bool '  Omit FlashPoint support' CONFIG_SCSI_OMIT_FLASHPOINT
 fi
 dep_tristate 'DTC3180/3280 SCSI support' CONFIG_SCSI_DTC3280 $CONFIG_SCSI
 dep_tristate 'EATA-DMA (DPT, NEC, AT&T, SNI, AST, Olivetti, Alphatronix) support' CONFIG_SCSI_EATA_DMA $CONFIG_SCSI
 dep_tristate 'EATA-PIO (old DPT PM2001, PM2012A) support' CONFIG_SCSI_EATA_PIO $CONFIG_SCSI
 dep_tristate 'EATA ISA/EISA/PCI (DPT and generic EATA/DMA-compliant boards) support' CONFIG_SCSI_EATA $CONFIG_SCSI
-  if [ "$CONFIG_SCSI_EATA" != "n" ]; then
-    bool '  enable tagged command queueing' CONFIG_SCSI_EATA_TAGGED_QUEUE
-    bool '  enable elevator sorting' CONFIG_SCSI_EATA_LINKED_COMMANDS
-    int  '  maximum number of queued commands' CONFIG_SCSI_EATA_MAX_TAGS 16
-  fi
+if [ "$CONFIG_SCSI_EATA" != "n" ]; then
+   bool '  enable tagged command queueing' CONFIG_SCSI_EATA_TAGGED_QUEUE
+   bool '  enable elevator sorting' CONFIG_SCSI_EATA_LINKED_COMMANDS
+   int  '  maximum number of queued commands' CONFIG_SCSI_EATA_MAX_TAGS 16
+fi
 dep_tristate 'Future Domain 16xx SCSI support' CONFIG_SCSI_FUTURE_DOMAIN $CONFIG_SCSI
 dep_tristate 'Generic NCR5380/53c400 SCSI support' CONFIG_SCSI_GENERIC_NCR5380 $CONFIG_SCSI
 if [ "$CONFIG_SCSI_GENERIC_NCR5380" != "n" ]; then
-	bool '   Enable NCR53c400 extensions' CONFIG_SCSI_GENERIC_NCR53C400
-	choice 'NCR5380/53c400 mapping method (use Port for T130B)' \
-		"Port CONFIG_SCSI_G_NCR5380_PORT \
-		Memory CONFIG_SCSI_G_NCR5380_MEM" Port
+   bool '   Enable NCR53c400 extensions' CONFIG_SCSI_GENERIC_NCR53C400
+   choice 'NCR5380/53c400 mapping method (use Port for T130B)' \
+	"Port CONFIG_SCSI_G_NCR5380_PORT \
+	Memory CONFIG_SCSI_G_NCR5380_MEM" Port
 fi
 dep_tristate 'Initio 91XX support' CONFIG_SCSI_INITIO $CONFIG_SCSI
 dep_tristate 'Initio INI-A100U2W support' CONFIG_SCSI_INIA100 $CONFIG_SCSI
 dep_tristate 'NCR53c406a SCSI support' CONFIG_SCSI_NCR53C406A $CONFIG_SCSI
 dep_tristate 'symbios 53c416 SCSI support' CONFIG_SCSI_SYM53C416 $CONFIG_SCSI
 if [ "$CONFIG_PCI" = "y" ]; then
-  dep_tristate 'NCR53c7,8xx SCSI support'  CONFIG_SCSI_NCR53C7xx $CONFIG_SCSI
-  if [ "$CONFIG_SCSI_NCR53C7xx" != "n" ]; then
-    bool '   always negotiate synchronous transfers' CONFIG_SCSI_NCR53C7xx_sync
-    bool '   allow FAST-SCSI [10MHz]' CONFIG_SCSI_NCR53C7xx_FAST
-    bool '   allow DISCONNECT' CONFIG_SCSI_NCR53C7xx_DISCONNECT
-  fi
+   dep_tristate 'NCR53c7,8xx SCSI support'  CONFIG_SCSI_NCR53C7xx $CONFIG_SCSI
+   if [ "$CONFIG_SCSI_NCR53C7xx" != "n" ]; then
+      bool '  always negotiate synchronous transfers' CONFIG_SCSI_NCR53C7xx_sync
+      bool '  allow FAST-SCSI [10MHz]' CONFIG_SCSI_NCR53C7xx_FAST
+      bool '  allow DISCONNECT' CONFIG_SCSI_NCR53C7xx_DISCONNECT
+   fi
 fi
 if [ "$CONFIG_PCI" = "y" -a "$CONFIG_SCSI_NCR53C7xx" != "y" ]; then
-  dep_tristate 'NCR53C8XX SCSI support' CONFIG_SCSI_NCR53C8XX $CONFIG_SCSI
-  if [ "$CONFIG_SCSI_NCR53C8XX" != "n" ]; then
-    int  '  default tagged command queue depth' CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS 8
-    int  '  maximum number of queued commands' CONFIG_SCSI_NCR53C8XX_MAX_TAGS 32
-    int  '  synchronous transfers frequency in MHz' CONFIG_SCSI_NCR53C8XX_SYNC 20
-    bool '  enable profiling' CONFIG_SCSI_NCR53C8XX_PROFILE
-    bool '  use normal IO' CONFIG_SCSI_NCR53C8XX_IOMAPPED
-    if [ "$CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS" = "0" ]; then
-      bool '  not allow targets to disconnect' CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
-    fi
-    if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-      bool '  assume boards are SYMBIOS compatible' CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT
-    fi
-  fi
+   dep_tristate 'NCR53C8XX SCSI support' CONFIG_SCSI_NCR53C8XX $CONFIG_SCSI
+   if [ "$CONFIG_SCSI_NCR53C8XX" != "n" ]; then
+      int  '  default tagged command queue depth' CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS 8
+      int  '  maximum number of queued commands' CONFIG_SCSI_NCR53C8XX_MAX_TAGS 32
+      int  '  synchronous transfers frequency in MHz' CONFIG_SCSI_NCR53C8XX_SYNC 20
+      bool '  enable profiling' CONFIG_SCSI_NCR53C8XX_PROFILE
+      bool '  use normal IO' CONFIG_SCSI_NCR53C8XX_IOMAPPED
+      if [ "$CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS" = "0" ]; then
+	 bool '  not allow targets to disconnect' CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
+      fi
+      if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+	 bool '  assume boards are SYMBIOS compatible (EXPERIMENTAL)' CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT
+      fi
+   fi
 fi
 dep_tristate 'IOMEGA Parallel Port ZIP drive SCSI support' CONFIG_SCSI_PPA $CONFIG_SCSI
 if [ "$CONFIG_SCSI_PPA" != "n" ]; then
-    bool '  Buggy EPP chipset support' CONFIG_SCSI_PPA_HAVE_PEDANTIC
+   bool '  Buggy EPP chipset support' CONFIG_SCSI_PPA_HAVE_PEDANTIC
 fi
 dep_tristate 'PAS16 SCSI support' CONFIG_SCSI_PAS16 $CONFIG_SCSI
 dep_tristate 'PCI-2000 support' CONFIG_SCSI_PCI2000 $CONFIG_SCSI
@@ -89,22 +89,22 @@
 dep_tristate 'PSI240I support' CONFIG_SCSI_PSI240I $CONFIG_SCSI
 dep_tristate 'Qlogic FAS SCSI support' CONFIG_SCSI_QLOGIC_FAS $CONFIG_SCSI
 if [ "$CONFIG_PCI" = "y" ]; then
-  dep_tristate 'Qlogic ISP SCSI support' CONFIG_SCSI_QLOGIC_ISP $CONFIG_SCSI
+   dep_tristate 'Qlogic ISP SCSI support' CONFIG_SCSI_QLOGIC_ISP $CONFIG_SCSI
 fi
 dep_tristate 'Seagate ST-02 and Future Domain TMC-8xx SCSI support' CONFIG_SCSI_SEAGATE $CONFIG_SCSI
 if [ "$CONFIG_PCI" = "y" ]; then
-  dep_tristate 'Tekram DC390(T) and Am53/79C974 SCSI support' CONFIG_SCSI_DC390T $CONFIG_SCSI
-  if [ "$CONFIG_SCSI_DC390T" != "n" ]; then
-    bool '  _omit_ support for non-DC390 adapters' CONFIG_SCSI_DC390T_NOGENSUPP
-  fi
+   dep_tristate 'Tekram DC390(T) and Am53/79C974 SCSI support' CONFIG_SCSI_DC390T $CONFIG_SCSI
+   if [ "$CONFIG_SCSI_DC390T" != "n" ]; then
+      bool '  _omit_ support for non-DC390 adapters' CONFIG_SCSI_DC390T_NOGENSUPP
+   fi
 fi
 dep_tristate 'Trantor T128/T128F/T228 SCSI support' CONFIG_SCSI_T128 $CONFIG_SCSI
 dep_tristate 'Tripace TC-2550x SCSI support' CONFIG_SCSI_TC2550 $CONFIG_SCSI
 dep_tristate 'UltraStor 14F/34F support' CONFIG_SCSI_U14_34F $CONFIG_SCSI
-  if [ "$CONFIG_SCSI_U14_34F" != "n" ]; then
-    bool '  enable elevator sorting' CONFIG_SCSI_U14_34F_LINKED_COMMANDS
-    int  '  maximum number of queued commands' CONFIG_SCSI_U14_34F_MAX_TAGS 8
-  fi
+if [ "$CONFIG_SCSI_U14_34F" != "n" ]; then
+   bool '  enable elevator sorting' CONFIG_SCSI_U14_34F_LINKED_COMMANDS
+   int  '  maximum number of queued commands' CONFIG_SCSI_U14_34F_MAX_TAGS 8
+fi
 dep_tristate 'UltraStor SCSI support' CONFIG_SCSI_ULTRASTOR $CONFIG_SCSI
 dep_tristate 'GDT SCSI Disk Array Controller support' CONFIG_SCSI_GDTH $CONFIG_SCSI
 #dep_tristate 'SCSI debugging host adapter' CONFIG_SCSI_DEBUG $CONFIG_SCSI
diff -u --recursive --new-file linux-2.0.38/fs/Config.in linux-2.0.39/fs/Config.in
--- linux-2.0.38/fs/Config.in	Sun Jun 13 19:21:03 1999
+++ linux-2.0.39/fs/Config.in	Thu Dec 30 15:26:41 1999
@@ -12,80 +12,81 @@
 
 tristate 'Native language support (Needed for FAT and ISO9660)' CONFIG_NLS
 if [ "$CONFIG_NLS" = "y" -o "$CONFIG_NLS" = "m" ]; then
-  dep_tristate 'ISO9660 cdrom filesystem support' CONFIG_ISO9660_FS $CONFIG_NLS
+   dep_tristate '  ISO9660 cdrom filesystem support' CONFIG_ISO9660_FS $CONFIG_NLS
 
-  # msdos filesystems
-  dep_tristate 'DOS FAT fs support' CONFIG_FAT_FS $CONFIG_NLS
-  dep_tristate 'MSDOS fs support' CONFIG_MSDOS_FS $CONFIG_FAT_FS
-  dep_tristate 'umsdos: Unix like fs on top of std MSDOS FAT fs' CONFIG_UMSDOS_FS $CONFIG_MSDOS_FS
-  dep_tristate 'VFAT (Windows-95) fs support' CONFIG_VFAT_FS $CONFIG_FAT_FS
-  mainmenu_option next_comment
-  comment 'Select available code pages'
-  dep_tristate 'Codepage 437 (United States, Canada)'	CONFIG_NLS_CODEPAGE_437 $CONFIG_NLS
-  dep_tristate 'Codepage 737 (Greek)'			CONFIG_NLS_CODEPAGE_737 $CONFIG_NLS
-  dep_tristate 'Codepage 775 (Baltic Rim)'		CONFIG_NLS_CODEPAGE_775 $CONFIG_NLS
-  dep_tristate 'Codepage 850 (Europe)'			CONFIG_NLS_CODEPAGE_850 $CONFIG_NLS
-  dep_tristate 'Codepage 852 (Central/Eastern Europe)'	CONFIG_NLS_CODEPAGE_852 $CONFIG_NLS
-  dep_tristate 'Codepage 855 (Cyrillic)'		CONFIG_NLS_CODEPAGE_855 $CONFIG_NLS
-  dep_tristate 'Codepage 857 (Turkish)'			CONFIG_NLS_CODEPAGE_857 $CONFIG_NLS
-  dep_tristate 'Codepage 860 (Portugese)'		CONFIG_NLS_CODEPAGE_860 $CONFIG_NLS
-  dep_tristate 'Codepage 861 (Icelandic)'		CONFIG_NLS_CODEPAGE_861 $CONFIG_NLS
-  dep_tristate 'Codepage 862 (Hebrew)'			CONFIG_NLS_CODEPAGE_862 $CONFIG_NLS
-  dep_tristate 'Codepage 863 (Canadian French)'		CONFIG_NLS_CODEPAGE_863 $CONFIG_NLS
-  dep_tristate 'Codepage 864 (Arabic)'			CONFIG_NLS_CODEPAGE_864 $CONFIG_NLS
-  dep_tristate 'Codepage 865 (Nordic European)'		CONFIG_NLS_CODEPAGE_865 $CONFIG_NLS
-  dep_tristate 'Codepage 866 (Cyrillic/Russian)'	CONFIG_NLS_CODEPAGE_866 $CONFIG_NLS
-  dep_tristate 'Codepage 869 (Greek)'			CONFIG_NLS_CODEPAGE_869 $CONFIG_NLS
-  dep_tristate 'Codepage 874 (Thai)'			CONFIG_NLS_CODEPAGE_874 $CONFIG_NLS
-  dep_tristate 'NLS ISO 8859-1 (Latin 1; Western Europe)'    CONFIG_NLS_ISO8859_1    $CONFIG_NLS 
-  dep_tristate 'NLS ISO 8859-2 (Latin 2; Slavic/Central European)'    CONFIG_NLS_ISO8859_2    $CONFIG_NLS
-  dep_tristate 'NLS ISO 8859-3 (Latin 3; Esperanto, Galician, Maltese, Turkish)'    CONFIG_NLS_ISO8859_3    $CONFIG_NLS
-  dep_tristate 'NLS ISO 8859-4 (Latin 4; Estonian, Latvian, Lithuanian)'    CONFIG_NLS_ISO8859_4    $CONFIG_NLS
-  dep_tristate 'NLS ISO 8859-5 (Cyrillic)'    CONFIG_NLS_ISO8859_5    $CONFIG_NLS
-  dep_tristate 'NLS ISO 8859-6 (Arabic)'    CONFIG_NLS_ISO8859_6    $CONFIG_NLS
-  dep_tristate 'NLS ISO 8859-7 (Modern Greek)'    CONFIG_NLS_ISO8859_7    $CONFIG_NLS
-  dep_tristate 'NLS ISO 8859-8 (Hebrew)'    CONFIG_NLS_ISO8859_8    $CONFIG_NLS
-  dep_tristate 'NLS ISO 8859-9 (Latin 5; Turkey)'    CONFIG_NLS_ISO8859_9    $CONFIG_NLS
-  dep_tristate 'NLS ISO 8859-15 (Latin 9; Western European Languages with Euro)' CONFIG_NLS_ISO8859_15 $CONFIG_NLS
-  dep_tristate 'NLS KOI8-R (Russian)'        CONFIG_NLS_KOI8_R       $CONFIG_NLS
-  endmenu
+   # msdos filesystems
+   dep_tristate '  DOS FAT fs support' CONFIG_FAT_FS $CONFIG_NLS
+   dep_tristate '    MSDOS fs support' CONFIG_MSDOS_FS $CONFIG_FAT_FS
+   dep_tristate '      umsdos: Unix like fs on top of std MSDOS FAT fs' CONFIG_UMSDOS_FS $CONFIG_MSDOS_FS
+   dep_tristate '      VFAT (Windows-95) fs support' CONFIG_VFAT_FS $CONFIG_FAT_FS
+   mainmenu_option next_comment
+   comment 'Select available code pages'
+   dep_tristate 'Codepage 437 (United States, Canada)'	CONFIG_NLS_CODEPAGE_437 $CONFIG_NLS
+   dep_tristate 'Codepage 737 (Greek)'			CONFIG_NLS_CODEPAGE_737 $CONFIG_NLS
+   dep_tristate 'Codepage 775 (Baltic Rim)'		CONFIG_NLS_CODEPAGE_775 $CONFIG_NLS
+   dep_tristate 'Codepage 850 (Europe)'			CONFIG_NLS_CODEPAGE_850 $CONFIG_NLS
+   dep_tristate 'Codepage 852 (Central/Eastern Europe)'	CONFIG_NLS_CODEPAGE_852 $CONFIG_NLS
+   dep_tristate 'Codepage 855 (Cyrillic)'		CONFIG_NLS_CODEPAGE_855 $CONFIG_NLS
+   dep_tristate 'Codepage 857 (Turkish)'		CONFIG_NLS_CODEPAGE_857 $CONFIG_NLS
+   dep_tristate 'Codepage 860 (Portugese)'		CONFIG_NLS_CODEPAGE_860 $CONFIG_NLS
+   dep_tristate 'Codepage 861 (Icelandic)'		CONFIG_NLS_CODEPAGE_861 $CONFIG_NLS
+   dep_tristate 'Codepage 862 (Hebrew)'			CONFIG_NLS_CODEPAGE_862 $CONFIG_NLS
+   dep_tristate 'Codepage 863 (Canadian French)'	CONFIG_NLS_CODEPAGE_863 $CONFIG_NLS
+   dep_tristate 'Codepage 864 (Arabic)'			CONFIG_NLS_CODEPAGE_864 $CONFIG_NLS
+   dep_tristate 'Codepage 865 (Nordic European)'	CONFIG_NLS_CODEPAGE_865 $CONFIG_NLS
+   dep_tristate 'Codepage 866 (Cyrillic/Russian)'	CONFIG_NLS_CODEPAGE_866 $CONFIG_NLS
+   dep_tristate 'Codepage 869 (Greek)'			CONFIG_NLS_CODEPAGE_869 $CONFIG_NLS
+   dep_tristate 'Codepage 874 (Thai)'			CONFIG_NLS_CODEPAGE_874 $CONFIG_NLS
+   dep_tristate 'NLS ISO 8859-1 (Latin 1; Western Europe)'    CONFIG_NLS_ISO8859_1    $CONFIG_NLS 
+   dep_tristate 'NLS ISO 8859-2 (Latin 2; Slavic/Central European)'    CONFIG_NLS_ISO8859_2    $CONFIG_NLS
+   dep_tristate 'NLS ISO 8859-3 (Latin 3; Esperanto, Galician, Maltese, Turkish)'    CONFIG_NLS_ISO8859_3    $CONFIG_NLS
+   dep_tristate 'NLS ISO 8859-4 (Latin 4; Estonian, Latvian, Lithuanian)'    CONFIG_NLS_ISO8859_4    $CONFIG_NLS
+   dep_tristate 'NLS ISO 8859-5 (Cyrillic)'    CONFIG_NLS_ISO8859_5    $CONFIG_NLS
+   dep_tristate 'NLS ISO 8859-6 (Arabic)'    CONFIG_NLS_ISO8859_6    $CONFIG_NLS
+   dep_tristate 'NLS ISO 8859-7 (Modern Greek)'    CONFIG_NLS_ISO8859_7    $CONFIG_NLS
+   dep_tristate 'NLS ISO 8859-8 (Hebrew)'    CONFIG_NLS_ISO8859_8    $CONFIG_NLS
+   dep_tristate 'NLS ISO 8859-9 (Latin 5; Turkey)'    CONFIG_NLS_ISO8859_9    $CONFIG_NLS
+   dep_tristate 'NLS ISO 8859-14 (Latin 8; Celtic)'      CONFIG_NLS_ISO8859_14 $CONFIG_NLS
+   dep_tristate 'NLS ISO 8859-15 (Latin 9; Western European Languages with Euro)' CONFIG_NLS_ISO8859_15 $CONFIG_NLS
+   dep_tristate 'NLS KOI8-R (Russian)'        CONFIG_NLS_KOI8_R       $CONFIG_NLS
+   endmenu
 fi
 
 bool '/proc filesystem support' CONFIG_PROC_FS
 if [ "$CONFIG_INET" = "y" ]; then
-  tristate 'NFS filesystem support' CONFIG_NFS_FS
-  if [ "$CONFIG_NFS_FS" = "y" ]; then
-    bool '   Root file system on NFS' CONFIG_ROOT_NFS
-    if [ "$CONFIG_ROOT_NFS" = "y" ]; then
-      bool '      BOOTP support' CONFIG_RNFS_BOOTP
-      bool '      RARP support' CONFIG_RNFS_RARP
-    fi
-  fi
-  tristate 'SMB filesystem support (to mount WfW shares etc..)' CONFIG_SMB_FS
-  if [ "$CONFIG_SMB_FS" != "n" ]; then
-    bool 'SMB Win95 bug work-around' CONFIG_SMB_WIN95
-  fi
+   tristate 'NFS filesystem support' CONFIG_NFS_FS
+   if [ "$CONFIG_NFS_FS" = "y" ]; then
+      bool '  Root file system on NFS' CONFIG_ROOT_NFS
+      if [ "$CONFIG_ROOT_NFS" = "y" ]; then
+	 bool '    BOOTP support' CONFIG_RNFS_BOOTP
+	 bool '    RARP support' CONFIG_RNFS_RARP
+      fi
+   fi
+   tristate 'SMB filesystem support (to mount WfW shares etc..)' CONFIG_SMB_FS
+   if [ "$CONFIG_SMB_FS" != "n" ]; then
+      bool '  SMB Win95 bug work-around' CONFIG_SMB_WIN95
+   fi
 fi
 if [ "$CONFIG_IPX" != "n" ]; then
-  tristate 'NCP filesystem support (to mount NetWare volumes)' CONFIG_NCP_FS
-  if [ "$CONFIG_NCP_FS" != "n" ]; then
-    source fs/ncpfs/Config.in
-  fi
+   tristate 'NCP filesystem support (to mount NetWare volumes)' CONFIG_NCP_FS
+   if [ "$CONFIG_NCP_FS" != "n" ]; then
+      source fs/ncpfs/Config.in
+   fi
 fi
 tristate 'OS/2 HPFS filesystem support (read only)' CONFIG_HPFS_FS
 tristate 'System V and Coherent filesystem support' CONFIG_SYSV_FS
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  tristate 'Kernel automounter support (experimental)' CONFIG_AUTOFS_FS
+   tristate 'Kernel automounter support (EXPERIMENTAL)' CONFIG_AUTOFS_FS
 fi
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  tristate 'Amiga FFS filesystem support (EXPERIMENTAL)' CONFIG_AFFS_FS
-  if [ "$CONFIG_AFFS_FS" != "n" ]; then
-    define_bool CONFIG_AMIGA_PARTITION y
-  fi
+   tristate 'Amiga FFS filesystem support (EXPERIMENTAL)' CONFIG_AFFS_FS
+   if [ "$CONFIG_AFFS_FS" != "n" ]; then
+      define_bool CONFIG_AMIGA_PARTITION y
+   fi
 fi
 tristate 'UFS filesystem support (read only)' CONFIG_UFS_FS
 if [ "$CONFIG_UFS_FS" != "n" ]; then
-  bool 'BSD disklabel (FreeBSD partition tables) support' CONFIG_BSD_DISKLABEL
-  bool 'SMD disklabel (Sun partition tables) support' CONFIG_SMD_DISKLABEL
+   bool '  BSD disklabel (FreeBSD partition tables) support' CONFIG_BSD_DISKLABEL
+   bool '  SMD disklabel (Sun partition tables) support' CONFIG_SMD_DISKLABEL
 fi
 endmenu
diff -u --recursive --new-file linux-2.0.38/fs/Makefile linux-2.0.39/fs/Makefile
--- linux-2.0.38/fs/Makefile	Sun Jun 13 19:21:03 1999
+++ linux-2.0.39/fs/Makefile	Thu Dec 30 15:41:19 1999
@@ -481,6 +481,22 @@
   endif
 endif
 
+ifeq ($(CONFIG_NLS_ISO8859_10),y)
+NLS += nls_iso8859_10.o
+else
+  ifeq ($(CONFIG_NLS_ISO8859_10),m)
+  M_OBJS += nls_iso8859_10.o
+  endif
+endif
+
+ifeq ($(CONFIG_NLS_ISO8859_14),y)
+NLS += nls_iso8859_14.o
+else
+  ifeq ($(CONFIG_NLS_ISO8859_14),m)
+  M_OBJS += nls_iso8859_14.o
+  endif
+endif
+
 ifeq ($(CONFIG_NLS_ISO8859_15),y)
 NLS += nls_iso8859_15.o
 else
diff -u --recursive --new-file linux-2.0.38/fs/ext2/balloc.c linux-2.0.39/fs/ext2/balloc.c
--- linux-2.0.38/fs/ext2/balloc.c	Sun Aug 17 01:23:19 1997
+++ linux-2.0.39/fs/ext2/balloc.c	Fri Jan 21 16:17:49 2000
@@ -645,6 +645,25 @@
 			 EXT2_BLOCKS_PER_GROUP(sb), map);
 }
 
+static int test_root(int a, int b)
+{
+	if (a == 0)
+		return 1;
+	while (1) {
+		if (a == 1)
+			return 1;
+		if (a % b)
+			return 0;
+		a = a / b;
+	}
+}
+
+int ext2_group_sparse(int group)
+{
+	return (test_root(group, 3) || test_root(group, 5) ||
+		test_root(group, 7));
+}
+
 void ext2_check_blocks_bitmap (struct super_block * sb)
 {
 	struct buffer_head * bh;
@@ -671,16 +690,22 @@
 
 		bh = sb->u.ext2_sb.s_block_bitmap[bitmap_nr];
 
-		if (!test_bit (0, bh->b_data))
-			ext2_error (sb, "ext2_check_blocks_bitmap",
-				    "Superblock in group %d is marked free", i);
-
-		for (j = 0; j < desc_blocks; j++)
-			if (!test_bit (j + 1, bh->b_data))
+		if (!(sb->u.ext2_sb.s_feature_ro_compat &
+		     EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER) ||
+		    ext2_group_sparse(i)) {
+			if (!test_bit (0, bh->b_data))
 				ext2_error (sb, "ext2_check_blocks_bitmap",
+					    "Superblock in group %d "
+					    "is marked free", i);
+
+			for (j = 0; j < desc_blocks; j++)
+				if (!test_bit (j + 1, bh->b_data))
+					ext2_error (sb,
+					    "ext2_check_blocks_bitmap",
 					    "Descriptor block #%d in group "
 					    "%d is marked free", j, i);
-
+		}
+		
 		if (!block_in_use (gdp->bg_block_bitmap, sb, bh->b_data))
 			ext2_error (sb, "ext2_check_blocks_bitmap",
 				    "Block bitmap for group %d is marked free",
diff -u --recursive --new-file linux-2.0.38/fs/ext2/dir.c linux-2.0.39/fs/ext2/dir.c
--- linux-2.0.38/fs/ext2/dir.c	Mon Jul 13 22:47:34 1998
+++ linux-2.0.39/fs/ext2/dir.c	Fri Jan 21 16:17:50 2000
@@ -72,7 +72,7 @@
 };
 
 int ext2_check_dir_entry (const char * function, struct inode * dir,
-			  struct ext2_dir_entry * de, struct buffer_head * bh,
+			  struct ext2_dir_entry_2 * de, struct buffer_head * bh,
 			  unsigned long offset)
 {
 	const char * error_msg = NULL;
@@ -104,7 +104,7 @@
 	unsigned long offset, blk;
 	int i, num, stored;
 	struct buffer_head * bh, * tmp, * bha[16];
-	struct ext2_dir_entry * de;
+	struct ext2_dir_entry_2 * de;
 	struct super_block * sb;
 	int err;
 
@@ -173,7 +173,7 @@
 		
 		while (!error && filp->f_pos < inode->i_size 
 		       && offset < sb->s_blocksize) {
-			de = (struct ext2_dir_entry *) (bh->b_data + offset);
+			de = (struct ext2_dir_entry_2 *) (bh->b_data + offset);
 			if (!ext2_check_dir_entry ("ext2_readdir", inode, de,
 						   bh, offset)) {
 				/* On error, skip the f_pos to the
diff -u --recursive --new-file linux-2.0.38/fs/ext2/namei.c linux-2.0.39/fs/ext2/namei.c
--- linux-2.0.38/fs/ext2/namei.c	Thu Jun  4 00:17:49 1998
+++ linux-2.0.39/fs/ext2/namei.c	Fri Jan 21 16:17:50 2000
@@ -36,7 +36,7 @@
  * NOTE! unlike strncmp, ext2_match returns 1 for success, 0 for failure.
  */
 static int ext2_match (int len, const char * const name,
-		       struct ext2_dir_entry * de)
+		       struct ext2_dir_entry_2 * de)
 {
 	if (!de || !de->inode || len > EXT2_NAME_LEN)
 		return 0;
@@ -61,7 +61,7 @@
  */
 static struct buffer_head * ext2_find_entry (struct inode * dir,
 					     const char * const name, int namelen,
-					     struct ext2_dir_entry ** res_dir)
+					     struct ext2_dir_entry_2 ** res_dir)
 {
 	struct super_block * sb;
 	struct buffer_head * bh_use[NAMEI_RA_SIZE];
@@ -92,7 +92,7 @@
 
 	for (block = 0, offset = 0; offset < dir->i_size; block++) {
 		struct buffer_head * bh;
-		struct ext2_dir_entry * de;
+		struct ext2_dir_entry_2 * de;
 		char * dlimit;
 
 		if ((block % NAMEI_RA_BLOCKS) == 0 && toread) {
@@ -115,7 +115,7 @@
 			break;
 		}
 
-		de = (struct ext2_dir_entry *) bh->b_data;
+		de = (struct ext2_dir_entry_2 *) bh->b_data;
 		dlimit = bh->b_data + sb->s_blocksize;
 		while ((char *) de < dlimit) {
 			if (!ext2_check_dir_entry ("ext2_find_entry", dir,
@@ -130,7 +130,7 @@
 				return bh;
 			}
 			offset += de->rec_len;
-			de = (struct ext2_dir_entry *)
+			de = (struct ext2_dir_entry_2 *)
 				((char *) de + de->rec_len);
 		}
 
@@ -155,7 +155,7 @@
 		 struct inode ** result)
 {
 	unsigned long ino;
-	struct ext2_dir_entry * de;
+	struct ext2_dir_entry_2 * de;
 	struct buffer_head * bh;
 
 	*result = NULL;
@@ -211,13 +211,13 @@
  */
 static struct buffer_head * ext2_add_entry (struct inode * dir,
 					    const char * name, int namelen,
-					    struct ext2_dir_entry ** res_dir,
+					    struct ext2_dir_entry_2 ** res_dir,
 					    int *err)
 {
 	unsigned long offset;
 	unsigned short rec_len;
 	struct buffer_head * bh;
-	struct ext2_dir_entry * de, * de1;
+	struct ext2_dir_entry_2 * de, * de1;
 	struct super_block * sb;
 
 	*err = -EINVAL;
@@ -247,7 +247,7 @@
 		return NULL;
 	rec_len = EXT2_DIR_REC_LEN(namelen);
 	offset = 0;
-	de = (struct ext2_dir_entry *) bh->b_data;
+	de = (struct ext2_dir_entry_2 *) bh->b_data;
 	*err = -ENOSPC;
 	while (1) {
 		if ((char *)de >= sb->s_blocksize + bh->b_data) {
@@ -264,7 +264,7 @@
 
 				ext2_debug ("creating next block\n");
 
-				de = (struct ext2_dir_entry *) bh->b_data;
+				de = (struct ext2_dir_entry_2 *) bh->b_data;
 				de->inode = 0;
 				de->rec_len = sb->s_blocksize;
 				dir->i_size = offset + sb->s_blocksize;
@@ -273,7 +273,7 @@
 
 				ext2_debug ("skipping to next block\n");
 
-				de = (struct ext2_dir_entry *) bh->b_data;
+				de = (struct ext2_dir_entry_2 *) bh->b_data;
 			}
 		}
 		if (!ext2_check_dir_entry ("ext2_add_entry", dir, de, bh,
@@ -291,7 +291,7 @@
 		    (de->rec_len >= EXT2_DIR_REC_LEN(de->name_len) + rec_len)) {
 			offset += de->rec_len;
 			if (de->inode) {
-				de1 = (struct ext2_dir_entry *) ((char *) de +
+				de1 = (struct ext2_dir_entry_2 *) ((char *) de +
 					EXT2_DIR_REC_LEN(de->name_len));
 				de1->rec_len = de->rec_len -
 					EXT2_DIR_REC_LEN(de->name_len);
@@ -300,6 +300,7 @@
 			}
 			de->inode = 0;
 			de->name_len = namelen;
+			de->file_type = 0;
 			memcpy (de->name, name, namelen);
 			/*
 			 * XXX shouldn't update any times until successful
@@ -321,7 +322,7 @@
 			return bh;
 		}
 		offset += de->rec_len;
-		de = (struct ext2_dir_entry *) ((char *) de + de->rec_len);
+		de = (struct ext2_dir_entry_2 *) ((char *) de + de->rec_len);
 	}
 	brelse (bh);
 	return NULL;
@@ -331,15 +332,15 @@
  * ext2_delete_entry deletes a directory entry by merging it with the
  * previous entry
  */
-static int ext2_delete_entry (struct ext2_dir_entry * dir,
+static int ext2_delete_entry (struct ext2_dir_entry_2 * dir,
 			      struct buffer_head * bh)
 {
-	struct ext2_dir_entry * de, * pde;
+	struct ext2_dir_entry_2 * de, * pde;
 	int i;
 
 	i = 0;
 	pde = NULL;
-	de = (struct ext2_dir_entry *) bh->b_data;
+	de = (struct ext2_dir_entry_2 *) bh->b_data;
 	while (i < bh->b_size) {
 		if (!ext2_check_dir_entry ("ext2_delete_entry", NULL, 
 					   de, bh, i))
@@ -352,7 +353,7 @@
 		}
 		i += de->rec_len;
 		pde = de;
-		de = (struct ext2_dir_entry *) ((char *) de + de->rec_len);
+		de = (struct ext2_dir_entry_2 *) ((char *) de + de->rec_len);
 	}
 	return -ENOENT;
 }
@@ -362,7 +363,7 @@
 {
 	struct inode * inode;
 	struct buffer_head * bh;
-	struct ext2_dir_entry * de;
+	struct ext2_dir_entry_2 * de;
 	int err;
 
 	*result = NULL;
@@ -385,6 +386,9 @@
 		return err;
 	}
 	de->inode = inode->i_ino;
+	if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
+				      EXT2_FEATURE_INCOMPAT_FILETYPE))
+		de->file_type = EXT2_FT_REG_FILE;
 	dir->i_version = ++event;
 	dcache_add(dir, de->name, de->name_len, de->inode);
 	mark_buffer_dirty(bh, 1);
@@ -403,7 +407,7 @@
 {
 	struct inode * inode;
 	struct buffer_head * bh;
-	struct ext2_dir_entry * de;
+	struct ext2_dir_entry_2 * de;
 	int err;
 
 	if (!dir)
@@ -427,21 +431,27 @@
 	inode->i_uid = current->fsuid;
 	inode->i_mode = mode;
 	inode->i_op = NULL;
-	if (S_ISREG(inode->i_mode))
+	if (S_ISREG(inode->i_mode)) {
 		inode->i_op = &ext2_file_inode_operations;
-	else if (S_ISDIR(inode->i_mode)) {
-		inode->i_op = &ext2_dir_inode_operations;
-		if (dir->i_mode & S_ISGID)
-			inode->i_mode |= S_ISGID;
-	}
-	else if (S_ISLNK(inode->i_mode))
-		inode->i_op = &ext2_symlink_inode_operations;
-	else if (S_ISCHR(inode->i_mode))
+		if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
+					      EXT2_FEATURE_INCOMPAT_FILETYPE))
+			de->file_type = EXT2_FT_REG_FILE;
+	} else if (S_ISCHR(inode->i_mode)) {
 		inode->i_op = &chrdev_inode_operations;
-	else if (S_ISBLK(inode->i_mode))
+		if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
+					      EXT2_FEATURE_INCOMPAT_FILETYPE))
+			de->file_type = EXT2_FT_CHRDEV;
+	} else if (S_ISBLK(inode->i_mode)) {
 		inode->i_op = &blkdev_inode_operations;
-	else if (S_ISFIFO(inode->i_mode)) 
+		if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
+					      EXT2_FEATURE_INCOMPAT_FILETYPE))
+			de->file_type = EXT2_FT_BLKDEV;
+	} else if (S_ISFIFO(inode->i_mode)) {
 		init_fifo(inode);
+		if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
+					      EXT2_FEATURE_INCOMPAT_FILETYPE))
+			de->file_type = EXT2_FT_FIFO;
+	}
 	if (S_ISBLK(mode) || S_ISCHR(mode))
 		inode->i_rdev = to_kdev_t(rdev);
 	inode->i_dirt = 1;
@@ -471,7 +481,7 @@
 {
 	struct inode * inode;
 	struct buffer_head * bh, * dir_block;
-	struct ext2_dir_entry * de;
+	struct ext2_dir_entry_2 * de;
 	int err;
 
 	if (!dir)
@@ -506,16 +516,22 @@
 		return err;
 	}
 	inode->i_blocks = inode->i_sb->s_blocksize / 512;
-	de = (struct ext2_dir_entry *) dir_block->b_data;
+	de = (struct ext2_dir_entry_2 *) dir_block->b_data;
 	de->inode = inode->i_ino;
 	de->name_len = 1;
 	de->rec_len = EXT2_DIR_REC_LEN(de->name_len);
 	strcpy (de->name, ".");
-	de = (struct ext2_dir_entry *) ((char *) de + de->rec_len);
+	if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
+				      EXT2_FEATURE_INCOMPAT_FILETYPE))
+		de->file_type = EXT2_FT_DIR;
+	de = (struct ext2_dir_entry_2 *) ((char *) de + de->rec_len);
 	de->inode = dir->i_ino;
 	de->rec_len = inode->i_sb->s_blocksize - EXT2_DIR_REC_LEN(1);
 	de->name_len = 2;
 	strcpy (de->name, "..");
+	if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
+				      EXT2_FEATURE_INCOMPAT_FILETYPE))
+		de->file_type = EXT2_FT_DIR;
 	inode->i_nlink = 2;
 	mark_buffer_dirty(dir_block, 1);
 	brelse (dir_block);
@@ -532,6 +548,9 @@
 		return err;
 	}
 	de->inode = inode->i_ino;
+	if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
+				      EXT2_FEATURE_INCOMPAT_FILETYPE))
+		de->file_type = EXT2_FT_DIR;
 	dir->i_version = ++event;
 	dcache_add(dir, de->name, de->name_len, de->inode);
 	mark_buffer_dirty(bh, 1);
@@ -554,7 +573,7 @@
 {
 	unsigned long offset;
 	struct buffer_head * bh;
-	struct ext2_dir_entry * de, * de1;
+	struct ext2_dir_entry_2 * de, * de1;
 	struct super_block * sb;
 	int err;
 
@@ -566,8 +585,8 @@
 			      inode->i_ino);
 		return 1;
 	}
-	de = (struct ext2_dir_entry *) bh->b_data;
-	de1 = (struct ext2_dir_entry *) ((char *) de + de->rec_len);
+	de = (struct ext2_dir_entry_2 *) bh->b_data;
+	de1 = (struct ext2_dir_entry_2 *) ((char *) de + de->rec_len);
 	if (de->inode != inode->i_ino || !de1->inode || 
 	    strcmp (".", de->name) || strcmp ("..", de1->name)) {
 	    	ext2_warning (inode->i_sb, "empty_dir",
@@ -577,7 +596,7 @@
 		return 1;
 	}
 	offset = de->rec_len + de1->rec_len;
-	de = (struct ext2_dir_entry *) ((char *) de1 + de1->rec_len);
+	de = (struct ext2_dir_entry_2 *) ((char *) de1 + de1->rec_len);
 	while (offset < inode->i_size ) {
 		if (!bh || (void *) de >= (void *) (bh->b_data + sb->s_blocksize)) {
 			brelse (bh);
@@ -589,7 +608,7 @@
 				offset += sb->s_blocksize;
 				continue;
 			}
-			de = (struct ext2_dir_entry *) bh->b_data;
+			de = (struct ext2_dir_entry_2 *) bh->b_data;
 		}
 		if (!ext2_check_dir_entry ("empty_dir", inode, de, bh,
 					   offset)) {
@@ -601,7 +620,7 @@
 			return 0;
 		}
 		offset += de->rec_len;
-		de = (struct ext2_dir_entry *) ((char *) de + de->rec_len);
+		de = (struct ext2_dir_entry_2 *) ((char *) de + de->rec_len);
 	}
 	brelse (bh);
 	return 1;
@@ -612,7 +631,7 @@
 	int retval;
 	struct inode * inode;
 	struct buffer_head * bh;
-	struct ext2_dir_entry * de;
+	struct ext2_dir_entry_2 * de;
 
 repeat:
 	if (!dir)
@@ -701,7 +720,7 @@
 	int retval;
 	struct inode * inode;
 	struct buffer_head * bh;
-	struct ext2_dir_entry * de;
+	struct ext2_dir_entry_2 * de;
 
 repeat:
 	if (!dir)
@@ -766,7 +785,7 @@
 int ext2_symlink (struct inode * dir, const char * name, int len,
 		  const char * symname)
 {
-	struct ext2_dir_entry * de;
+	struct ext2_dir_entry_2 * de;
 	struct inode * inode = NULL;
 	struct buffer_head * bh = NULL, * name_block = NULL;
 	char * link;
@@ -831,6 +850,9 @@
 		return err;
 	}
 	de->inode = inode->i_ino;
+	if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
+				      EXT2_FEATURE_INCOMPAT_FILETYPE))
+		de->file_type = EXT2_FT_SYMLINK;
 	dir->i_version = ++event;
 	dcache_add(dir, de->name, de->name_len, de->inode);
 	mark_buffer_dirty(bh, 1);
@@ -847,7 +869,7 @@
 int ext2_link (struct inode * oldinode, struct inode * dir,
 	       const char * name, int len)
 {
-	struct ext2_dir_entry * de;
+	struct ext2_dir_entry_2 * de;
 	struct buffer_head * bh;
 	int err;
 
@@ -880,6 +902,21 @@
 		return err;
 	}
 	de->inode = oldinode->i_ino;
+	if (EXT2_HAS_INCOMPAT_FEATURE(oldinode->i_sb,
+				      EXT2_FEATURE_INCOMPAT_FILETYPE)) {
+		if (S_ISREG(oldinode->i_mode))
+			de->file_type = EXT2_FT_REG_FILE;
+		else if (S_ISDIR(oldinode->i_mode))
+			de->file_type = EXT2_FT_DIR;
+		else if (S_ISLNK(oldinode->i_mode))
+			de->file_type = EXT2_FT_SYMLINK;
+		else if (S_ISCHR(oldinode->i_mode))
+			de->file_type = EXT2_FT_CHRDEV;
+		else if (S_ISBLK(oldinode->i_mode))
+			de->file_type = EXT2_FT_BLKDEV;
+		else if (S_ISFIFO(oldinode->i_mode))  
+			de->file_type = EXT2_FT_FIFO;
+	}
 	dir->i_version = ++event;
 	dcache_add(dir, de->name, de->name_len, de->inode);
 	mark_buffer_dirty(bh, 1);
@@ -921,12 +958,12 @@
 }
 
 #define PARENT_INO(buffer) \
-	((struct ext2_dir_entry *) ((char *) buffer + \
-	((struct ext2_dir_entry *) buffer)->rec_len))->inode
+	((struct ext2_dir_entry_2 *) ((char *) buffer + \
+	((struct ext2_dir_entry_2 *) buffer)->rec_len))->inode
 
 #define PARENT_NAME(buffer) \
-	((struct ext2_dir_entry *) ((char *) buffer + \
-	((struct ext2_dir_entry *) buffer)->rec_len))->name
+	((struct ext2_dir_entry_2 *) ((char *) buffer + \
+	((struct ext2_dir_entry_2 *) buffer)->rec_len))->name
 
 /*
  * rename uses retrying to avoid race-conditions: at least they should be
@@ -946,7 +983,7 @@
 {
 	struct inode * old_inode, * new_inode;
 	struct buffer_head * old_bh, * new_bh, * dir_bh;
-	struct ext2_dir_entry * old_de, * new_de;
+	struct ext2_dir_entry_2 * old_de, * new_de;
 	int retval;
 
 	goto start_up;
@@ -1060,6 +1097,9 @@
 	 * ok, that's it
 	 */
 	new_de->inode = old_inode->i_ino;
+	if (EXT2_HAS_INCOMPAT_FEATURE(new_dir->i_sb,
+				      EXT2_FEATURE_INCOMPAT_FILETYPE))
+		new_de->file_type = old_de->file_type;
 	dcache_add(new_dir, new_de->name, new_de->name_len, new_de->inode);
 	retval = ext2_delete_entry (old_de, old_bh);
 	if (retval == -ENOENT)
diff -u --recursive --new-file linux-2.0.38/fs/ext2/super.c linux-2.0.39/fs/ext2/super.c
--- linux-2.0.38/fs/ext2/super.c	Sun Jul  7 10:06:53 1996
+++ linux-2.0.39/fs/ext2/super.c	Fri Jan 21 16:18:31 2000
@@ -463,6 +463,9 @@
 			goto failed_mount;
 		}
 	}
+	sb->u.ext2_sb.s_feature_compat = es->s_feature_compat;
+	sb->u.ext2_sb.s_feature_incompat = es->s_feature_incompat;
+	sb->u.ext2_sb.s_feature_ro_compat = es->s_feature_ro_compat;
 	sb->u.ext2_sb.s_frag_size = EXT2_MIN_FRAG_SIZE <<
 				   es->s_log_frag_size;
 	if (sb->u.ext2_sb.s_frag_size)
@@ -710,6 +713,7 @@
 	unsigned long overhead;
 	unsigned long overhead_per_group;
 	struct statfs tmp;
+	int ngroups, i;
 
 	if (test_opt (sb, MINIX_DF))
 		overhead = 0;
@@ -717,13 +721,35 @@
 		/*
 		 * Compute the overhead (FS structures)
 		 */
-		overhead_per_group = 1 /* super block */ +
-				     sb->u.ext2_sb.s_db_per_group /* descriptors */ +
-				     1 /* block bitmap */ +
-				     1 /* inode bitmap */ +
-				     sb->u.ext2_sb.s_itb_per_group /* inode table */;
-		overhead = sb->u.ext2_sb.s_es->s_first_data_block +
-			   sb->u.ext2_sb.s_groups_count * overhead_per_group;
+
+		/*
+		 * All of the blocks before first_data_block are
+		 * overhead
+		 */
+		overhead = sb->u.ext2_sb.s_es->s_first_data_block;
+
+		/*
+		 * Add the overhead attributed to the superblock and
+		 * block group descriptors.  If this is sparse
+		 * superblocks is turned on, then not all groups have
+		 * this.
+		 */
+		if (sb->u.ext2_sb.s_feature_ro_compat &
+		    EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER) {
+			ngroups = 0;
+			for (i=0 ; i < sb->u.ext2_sb.s_groups_count; i++)
+				if (ext2_group_sparse(i))
+					ngroups++;
+		} else
+			ngroups = sb->u.ext2_sb.s_groups_count;
+		overhead += ngroups * (1 + sb->u.ext2_sb.s_db_per_group);
+
+		/*
+		 * Every block group has an inode bitmap, a block
+		 * bitmap, and an inode table.
+		 */
+		overhead += (sb->u.ext2_sb.s_groups_count *
+			     (2 + sb->u.ext2_sb.s_itb_per_group));
 	}
 
 	tmp.f_type = EXT2_SUPER_MAGIC;
diff -u --recursive --new-file linux-2.0.38/fs/ncpfs/Config.in linux-2.0.39/fs/ncpfs/Config.in
--- linux-2.0.38/fs/ncpfs/Config.in	Sun Jun 13 19:21:03 1999
+++ linux-2.0.39/fs/ncpfs/Config.in	Thu Dec 30 22:55:52 1999
@@ -1,9 +1,9 @@
 #
 # NCP Filesystem configuration
 #
-bool     '   Packet singatures' CONFIG_NCPFS_PACKET_SIGNING
-bool     '   Proprietary file locking' CONFIG_NCPFS_IOCTL_LOCKING
-bool     '   Clear remove/delete inhibit when needed' CONFIG_NCPFS_STRONG
-bool     '   Use NFS namespace if available' CONFIG_NCPFS_NFS_NS
-bool     '   Use LONG (OS/2) namespace if available' CONFIG_NCPFS_OS2_NS
-bool     '   Allow mounting of volume subdirectories' CONFIG_NCPFS_MOUNT_SUBDIR
+bool     '  Packet signatures' CONFIG_NCPFS_PACKET_SIGNING
+bool     '  Proprietary file locking' CONFIG_NCPFS_IOCTL_LOCKING
+bool     '  Clear remove/delete inhibit when needed' CONFIG_NCPFS_STRONG
+bool     '  Use NFS namespace if available' CONFIG_NCPFS_NFS_NS
+bool     '  Use LONG (OS/2) namespace if available' CONFIG_NCPFS_OS2_NS
+bool     '  Allow mounting of volume subdirectories' CONFIG_NCPFS_MOUNT_SUBDIR
diff -u --recursive --new-file linux-2.0.38/fs/nls.c linux-2.0.39/fs/nls.c
--- linux-2.0.38/fs/nls.c	Sun Jun 13 19:21:03 1999
+++ linux-2.0.39/fs/nls.c	Thu Dec 30 15:42:15 1999
@@ -455,6 +455,9 @@
 #ifdef CONFIG_NLS_ISO8859_9
 	init_nls_iso8859_9();
 #endif
+#ifdef CONFIG_NLS_ISO8859_14
+	init_nls_iso8859_14();
+#endif
 #ifdef CONFIG_NLS_ISO8859_15
 	init_nls_iso8859_15();
 #endif
diff -u --recursive --new-file linux-2.0.38/fs/nls_iso8859_14.c linux-2.0.39/fs/nls_iso8859_14.c
--- linux-2.0.38/fs/nls_iso8859_14.c	Thu Jan  1 01:00:00 1970
+++ linux-2.0.39/fs/nls_iso8859_14.c	Thu Dec 30 15:44:37 1999
@@ -0,0 +1,311 @@
+/*
+ * linux/fs/nls_iso8859-14.c
+ *
+ * Charset iso8859-14 translation tables.
+ *
+ * Generated automatically from the Unicode and charset table
+ * provided by the Unicode Organisation at
+ * http://www.unicode.org/
+ * The Unicode to charset table has only exact mappings.
+ *
+ * Rhys Jones, Swansea University Computer Society
+ * rhys@sucs.swan.ac.uk
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/nls.h>
+
+static struct nls_unicode charset2uni[256] = {
+	/* 0x00*/
+	{0x00, 0x00}, {0x01, 0x00}, {0x02, 0x00}, {0x03, 0x00},
+	{0x04, 0x00}, {0x05, 0x00}, {0x06, 0x00}, {0x07, 0x00},
+	{0x08, 0x00}, {0x09, 0x00}, {0x0a, 0x00}, {0x0b, 0x00},
+	{0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
+	/* 0x10*/
+	{0x10, 0x00}, {0x11, 0x00}, {0x12, 0x00}, {0x13, 0x00},
+	{0x14, 0x00}, {0x15, 0x00}, {0x16, 0x00}, {0x17, 0x00},
+	{0x18, 0x00}, {0x19, 0x00}, {0x1a, 0x00}, {0x1b, 0x00},
+	{0x1c, 0x00}, {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
+	/* 0x20*/
+	{0x20, 0x00}, {0x21, 0x00}, {0x22, 0x00}, {0x23, 0x00},
+	{0x24, 0x00}, {0x25, 0x00}, {0x26, 0x00}, {0x27, 0x00},
+	{0x28, 0x00}, {0x29, 0x00}, {0x2a, 0x00}, {0x2b, 0x00},
+	{0x2c, 0x00}, {0x2d, 0x00}, {0x2e, 0x00}, {0x2f, 0x00},
+	/* 0x30*/
+	{0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
+	{0x34, 0x00}, {0x35, 0x00}, {0x36, 0x00}, {0x37, 0x00},
+	{0x38, 0x00}, {0x39, 0x00}, {0x3a, 0x00}, {0x3b, 0x00},
+	{0x3c, 0x00}, {0x3d, 0x00}, {0x3e, 0x00}, {0x3f, 0x00},
+	/* 0x40*/
+	{0x40, 0x00}, {0x41, 0x00}, {0x42, 0x00}, {0x43, 0x00},
+	{0x44, 0x00}, {0x45, 0x00}, {0x46, 0x00}, {0x47, 0x00},
+	{0x48, 0x00}, {0x49, 0x00}, {0x4a, 0x00}, {0x4b, 0x00},
+	{0x4c, 0x00}, {0x4d, 0x00}, {0x4e, 0x00}, {0x4f, 0x00},
+	/* 0x50*/
+	{0x50, 0x00}, {0x51, 0x00}, {0x52, 0x00}, {0x53, 0x00},
+	{0x54, 0x00}, {0x55, 0x00}, {0x56, 0x00}, {0x57, 0x00},
+	{0x58, 0x00}, {0x59, 0x00}, {0x5a, 0x00}, {0x5b, 0x00},
+	{0x5c, 0x00}, {0x5d, 0x00}, {0x5e, 0x00}, {0x5f, 0x00},
+	/* 0x60*/
+	{0x60, 0x00}, {0x61, 0x00}, {0x62, 0x00}, {0x63, 0x00},
+	{0x64, 0x00}, {0x65, 0x00}, {0x66, 0x00}, {0x67, 0x00},
+	{0x68, 0x00}, {0x69, 0x00}, {0x6a, 0x00}, {0x6b, 0x00},
+	{0x6c, 0x00}, {0x6d, 0x00}, {0x6e, 0x00}, {0x6f, 0x00},
+	/* 0x70*/
+	{0x70, 0x00}, {0x71, 0x00}, {0x72, 0x00}, {0x73, 0x00},
+	{0x74, 0x00}, {0x75, 0x00}, {0x76, 0x00}, {0x77, 0x00},
+	{0x78, 0x00}, {0x79, 0x00}, {0x7a, 0x00}, {0x7b, 0x00},
+	{0x7c, 0x00}, {0x7d, 0x00}, {0x7e, 0x00}, {0x7f, 0x00},
+	/* 0x80*/
+	{0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00},
+	{0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00},
+	{0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00},
+	{0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00},
+	/* 0x90*/
+	{0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00},
+	{0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00},
+	{0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00},
+	{0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00}, {0x00, 0x00},
+	/* 0xa0*/
+	{0xa0, 0x00}, {0x02, 0x1e}, {0x03, 0x1e}, {0xa3, 0x00},
+	{0x0a, 0x01}, {0x0b, 0x01}, {0x0a, 0x1e}, {0xa7, 0x00},
+	{0x80, 0x1e}, {0xa9, 0x00}, {0x82, 0x1e}, {0x0b, 0x1e},
+	{0xf2, 0x1e}, {0xad, 0x00}, {0xae, 0x00}, {0x78, 0x01},
+	/* 0xb0*/
+	{0x1e, 0x1e}, {0x1f, 0x1e}, {0x20, 0x01}, {0x21, 0x01},
+	{0x40, 0x1e}, {0x41, 0x1e}, {0xb6, 0x00}, {0x56, 0x1e},
+	{0x81, 0x1e}, {0x57, 0x1e}, {0x83, 0x1e}, {0x60, 0x1e},
+	{0xf3, 0x1e}, {0x84, 0x1e}, {0x85, 0x1e}, {0x61, 0x1e},
+	/* 0xc0*/
+	{0xc0, 0x00}, {0xc1, 0x00}, {0xc2, 0x00}, {0xc3, 0x00},
+	{0xc4, 0x00}, {0xc5, 0x00}, {0xc6, 0x00}, {0xc7, 0x00},
+	{0xc8, 0x00}, {0xc9, 0x00}, {0xca, 0x00}, {0xcb, 0x00},
+	{0xcc, 0x00}, {0xcd, 0x00}, {0xce, 0x00}, {0xcf, 0x00},
+	/* 0xd0*/
+	{0x74, 0x01}, {0xd1, 0x00}, {0xd2, 0x00}, {0xd3, 0x00},
+	{0xd4, 0x00}, {0xd5, 0x00}, {0xd6, 0x00}, {0x6a, 0x1e},
+	{0xd8, 0x00}, {0xd9, 0x00}, {0xda, 0x00}, {0xdb, 0x00},
+	{0xdc, 0x00}, {0xdd, 0x00}, {0x76, 0x01}, {0xdf, 0x00},
+	/* 0xe0*/
+	{0xe0, 0x00}, {0xe1, 0x00}, {0xe2, 0x00}, {0xe3, 0x00},
+	{0xe4, 0x00}, {0xe5, 0x00}, {0xe6, 0x00}, {0xe7, 0x00},
+	{0xe8, 0x00}, {0xe9, 0x00}, {0xea, 0x00}, {0xeb, 0x00},
+	{0xec, 0x00}, {0xed, 0x00}, {0xee, 0x00}, {0xef, 0x00},
+	/* 0xf0*/
+	{0x75, 0x01}, {0xf1, 0x00}, {0xf2, 0x00}, {0xf3, 0x00},
+	{0xf4, 0x00}, {0xf5, 0x00}, {0xf6, 0x00}, {0x6b, 0x1e},
+	{0xf8, 0x00}, {0xf9, 0x00}, {0xfa, 0x00}, {0xfb, 0x00},
+	{0xfc, 0x00}, {0xfd, 0x00}, {0x77, 0x01}, {0xff, 0x00},
+};
+
+static unsigned char page00[256] = {
+	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */
+	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */
+	0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */
+	0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */
+	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */
+	0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */
+	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */
+	0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */
+	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */
+	0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */
+	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */
+	0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */
+	0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */
+	0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */
+	0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */
+	0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */
+
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
+	0xa0, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */
+	0x00, 0xa9, 0x00, 0x00, 0x00, 0xad, 0xae, 0x00, /* 0xa8-0xaf */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x00, /* 0xb0-0xb7 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+	0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */
+	0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */
+	0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, /* 0xd0-0xd7 */
+	0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */
+	0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */
+	0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */
+	0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, /* 0xf0-0xf7 */
+	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x00, 0xff, /* 0xf8-0xff */
+};
+
+static unsigned char page01[256] = {
+	0x00, 0x00, 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */
+	0x00, 0x00, 0xa6, 0xab, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb1, /* 0x18-0x1f */
+	0xb2, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+	0xb4, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xb9, /* 0x50-0x57 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+	0xbb, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+	0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+	0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, 0xde, 0xfe, /* 0x70-0x77 */
+	0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+
+	0xa8, 0xb8, 0xaa, 0xba, 0xbd, 0xbe, 0x00, 0x00, /* 0x80-0x87 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
+	0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
+};
+
+static unsigned char page1e[256] = {
+	0x00, 0x00, 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */
+	0x00, 0x00, 0xa6, 0xab, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb1, /* 0x18-0x1f */
+	0xb2, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+	0xb4, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xb9, /* 0x50-0x57 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+	0xbb, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+	0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+	0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, 0xde, 0xfe, /* 0x70-0x77 */
+	0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+
+	0xa8, 0xb8, 0xaa, 0xba, 0xbd, 0xbe, 0x00, 0x00, /* 0x80-0x87 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
+	0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
+};
+
+static unsigned char *page_uni2charset[256] = {
+	page00,	page01, NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
+	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
+
+	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
+	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	page1e,	NULL,
+
+	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
+	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
+};
+
+static unsigned char charset2upper[256] = {
+	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */
+	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */
+	0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */
+	0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */
+	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */
+	0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */
+	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */
+	0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */
+	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */
+	0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */
+	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */
+	0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */
+	0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x60-0x67 */
+	0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x68-0x6f */
+	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x70-0x77 */
+	0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
+	0xa0, 0xa1, 0xa1, 0xa3, 0xa6, 0xa6, 0xa6, 0xa7, /* 0xa0-0xa7 */
+	0xa8, 0xa9, 0xaa, 0xa6, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */
+	0xb0, 0xb0, 0xb2, 0xb2, 0xb4, 0xb4, 0xb6, 0xb7, /* 0xb0-0xb7 */
+	0xa8, 0xb7, 0xaa, 0xbb, 0xac, 0xbd, 0xbd, 0xbb, /* 0xb8-0xbf */
+	0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */
+	0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */
+	0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */
+	0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xd8-0xdf */
+	0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xe0-0xe7 */
+	0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xe8-0xef */
+	0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xf0-0xf7 */
+	0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xaf, /* 0xf8-0xff */
+};
+
+
+static void inc_use_count(void)
+{
+	MOD_INC_USE_COUNT;
+}
+
+static void dec_use_count(void)
+{
+	MOD_DEC_USE_COUNT;
+}
+
+static struct nls_table table = {
+	"iso8859-14",
+	page_uni2charset,
+	charset2uni,
+	inc_use_count,
+	dec_use_count,
+	NULL
+};
+
+int init_nls_iso8859_14(void)
+{
+	return register_nls(&table);
+}
+
+#ifdef MODULE
+int init_module(void)
+{
+	return init_nls_iso8859_14();
+}
+
+
+void cleanup_module(void)
+{
+	unregister_nls(&table);
+	return;
+}
+#endif
+
+/*
+ * Overrides for Emacs so that we follow Linus's tabbing style.
+ * Emacs will notice this stuff at the end of the file and automatically
+ * adjust the settings for this buffer only.  This must remain at the end
+ * of the file.
+ * ---------------------------------------------------------------------------
+ * Local variables:
+ * c-indent-level: 8
+ * c-brace-imaginary-offset: 0
+ * c-brace-offset: -8
+ * c-argdecl-indent: 8
+ * c-label-offset: -8
+ * c-continued-statement-offset: 8
+ * c-continued-brace-offset: 0
+ * End:
+ */
diff -u --recursive --new-file linux-2.0.38/fs/proc/mem.c linux-2.0.39/fs/proc/mem.c
--- linux-2.0.38/fs/proc/mem.c	Sun Nov 15 19:33:14 1998
+++ linux-2.0.39/fs/proc/mem.c	Tue Feb  8 15:25:04 2000
@@ -17,16 +17,17 @@
 
 /*
  * mem_write isn't really a good idea right now. It needs
- * to check a lot more: if the process we try to write to 
+ * to check a lot more: if the process we try to write to
  * dies in the middle right now, mem_write will overwrite
  * kernel memory.. This disables it altogether.
  */
 #define mem_write NULL
 
-static int check_range(struct mm_struct * mm, unsigned long addr, int count)
+static ssize_t check_range(struct mm_struct * mm, unsigned long addr,
+			   size_t count)
 {
 	struct vm_area_struct *vma;
-	int retval;
+	ssize_t retval;
 
 	vma = find_vma(mm, addr);
 	if (!vma)
@@ -76,7 +77,8 @@
 	return tsk;
 }
 
-static int mem_read(struct inode * inode, struct file * file,char * buf, int count)
+static ssize_t mem_read(struct inode * inode, struct file * file,
+			char * buf, size_t count)
 {
 	pgd_t *page_dir;
 	pmd_t *page_middle;
@@ -85,7 +87,7 @@
 	struct task_struct * tsk;
 	unsigned long addr;
 	char *tmp;
-	int i;
+	ssize_t scount, i;
 
 	if (count < 0)
 		return -EINVAL;
@@ -93,11 +95,11 @@
 	if (!tsk)
 		return -ESRCH;
 	addr = file->f_pos;
-	count = check_range(tsk->mm, addr, count);
-	if (count < 0)
-		return count;
+	scount = check_range(tsk->mm, addr, count);
+	if (scount < 0)
+		return scount;
 	tmp = buf;
-	while (count > 0) {
+	while (scount > 0) {
 		if (current->signal & ~current->blocked)
 			break;
 		page_dir = pgd_offset(tsk->mm,addr);
@@ -121,12 +123,12 @@
 			break;
 		page = (char *) pte_page(pte) + (addr & ~PAGE_MASK);
 		i = PAGE_SIZE-(addr & ~PAGE_MASK);
-		if (i > count)
-			i = count;
+		if (i > scount)
+			i = scount;
 		memcpy_tofs(tmp, page, i);
 		addr += i;
 		tmp += i;
-		count -= i;
+		scount -= i;
 	}
 	file->f_pos = addr;
 	return tmp-buf;
@@ -134,7 +136,8 @@
 
 #ifndef mem_write
 
-static int mem_write(struct inode * inode, struct file * file,char * buf, int count)
+static ssize_t mem_write(struct inode * inode, struct file * file,
+			 char * buf, ssize_t count)
 {
 	pgd_t *page_dir;
 	pmd_t *page_middle;
@@ -143,7 +146,7 @@
 	struct task_struct * tsk;
 	unsigned long addr;
 	char *tmp;
-	int i;
+	ssize_t i;
 
 	if (count < 0)
 		return -EINVAL;
@@ -195,7 +198,8 @@
 
 #endif
 
-static int mem_lseek(struct inode * inode, struct file * file, off_t offset, int orig)
+static off_t mem_lseek(struct inode * inode, struct file * file,
+		       off_t offset, int orig)
 {
 	switch (orig) {
 		case 0:
diff -u --recursive --new-file linux-2.0.38/fs/proc/net.c linux-2.0.39/fs/proc/net.c
--- linux-2.0.38/fs/proc/net.c	Sun Jan 14 15:47:28 1996
+++ linux-2.0.39/fs/proc/net.c	Wed Dec 29 12:39:44 1999
@@ -15,11 +15,11 @@
  *            quite a bit, modularized the code.
  * fvk 4/'93  waltje@uwalt.nl.mugnet.org (Fred N. van Kempen)
  *	      Renamed "route_get_info()" to "rt_get_info()" for consistency.
- * Alan Cox (gw4pts@gw4pts.ampr.org) 4/94
+ * Alan Cox (alan@lxorguk.ukuu.org.uk) 4/94
  *	      Dusted off the code and added IPX. Fixed the 4K limit.
  * Erik Schoenfelder (schoenfr@ibr.cs.tu-bs.de)
  *	      /proc/net/snmp.
- * Alan Cox (gw4pts@gw4pts.ampr.org) 1/95
+ * Alan Cox (alan@lxorguk.ukuu.org.uk) 1/95
  *	      Added Appletalk slots
  *
  *  proc net directory handling functions
diff -u --recursive --new-file linux-2.0.38/include/linux/etherdevice.h linux-2.0.39/include/linux/etherdevice.h
--- linux-2.0.38/include/linux/etherdevice.h	Fri Apr 12 09:55:09 1996
+++ linux-2.0.39/include/linux/etherdevice.h	Wed Dec 29 12:42:01 1999
@@ -10,8 +10,8 @@
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  *
- *		Relocated to include/linux where it belongs by Alan Cox 
- *							<gw4pts@gw4pts.ampr.org>
+ *		Relocated to include/linux where it belongs by Alan Cox
+ *						<alan@lxorguk.ukuu.org.uk>
  *
  *		This program is free software; you can redistribute it and/or
  *		modify it under the terms of the GNU General Public License
diff -u --recursive --new-file linux-2.0.38/include/linux/ext2_fs.h linux-2.0.39/include/linux/ext2_fs.h
--- linux-2.0.38/include/linux/ext2_fs.h	Thu Nov 13 05:45:40 1997
+++ linux-2.0.39/include/linux/ext2_fs.h	Fri Jan 21 16:17:50 2000
@@ -368,6 +368,15 @@
 	__u32	s_reserved[230];	/* Padding to the end of the block */
 };
 
+#ifdef __KERNEL__
+#define EXT2_SB(sb)	(&((sb)->u.ext2_sb))
+#else
+/* Assume that user mode programs are passing in an ext2fs superblock, not
+ * a kernel struct super_block.  This will allow us to call the feature-test
+ * macros from user land. */
+#define EXT2_SB(sb)	(sb)
+#endif
+
 /*
  * Codes for operating systems
  */
@@ -407,6 +416,35 @@
 };
 
 /*
+ * The new version of the directory entry.  Since EXT2 structures are
+ * stored in intel byte order, and the name_len field could never be
+ * bigger than 255 chars, it's safe to reclaim the extra byte for the
+ * file_type field.
+ */
+struct ext2_dir_entry_2 {
+	__u32	inode;			/* Inode number */
+	__u16	rec_len;		/* Directory entry length */
+	__u8	name_len;		/* Name length */
+	__u8	file_type;
+	char	name[EXT2_NAME_LEN];	/* File name */
+};
+
+/*
+ * Ext2 directory file types.  Only the low 3 bits are used.  The
+ * other bits are reserved for now.
+ */
+#define EXT2_FT_UNKNOWN		0
+#define EXT2_FT_REG_FILE	1
+#define EXT2_FT_DIR		2
+#define EXT2_FT_CHRDEV		3
+#define EXT2_FT_BLKDEV 		4
+#define EXT2_FT_FIFO		5
+#define EXT2_FT_SOCK		6
+#define EXT2_FT_SYMLINK		7
+
+#define EXT2_FT_MAX		8
+
+/*
  * EXT2_DIR_PAD defines the directory entries boundaries
  *
  * NOTE: It must be a multiple of 4
@@ -417,11 +455,23 @@
 					 ~EXT2_DIR_ROUND)
 
 /*
- * Feature set definitions --- none are defined as of now
+ * Feature set definitions
  */
+
+#define EXT2_HAS_COMPAT_FEATURE(sb,mask)			\
+	( EXT2_SB(sb)->s_feature_compat & (mask) )
+#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask)			\
+	( EXT2_SB(sb)->s_feature_ro_compat & (mask) )
+#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask)			\
+	( EXT2_SB(sb)->s_feature_incompat & (mask) )
+
+#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER	0x0001
+
+#define EXT2_FEATURE_INCOMPAT_FILETYPE		0x0002
+
 #define EXT2_FEATURE_COMPAT_SUPP	0
-#define EXT2_FEATURE_INCOMPAT_SUPP	0
-#define EXT2_FEATURE_RO_COMPAT_SUPP	0
+#define EXT2_FEATURE_INCOMPAT_SUPP	EXT2_FEATURE_INCOMPAT_FILETYPE
+#define EXT2_FEATURE_RO_COMPAT_SUPP	EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER
 
 #ifdef __KERNEL__
 /*
@@ -440,6 +490,7 @@
 extern int ext2_permission (struct inode *, int);
 
 /* balloc.c */
+extern int ext2_group_sparse(int group);
 extern int ext2_new_block (const struct inode *, unsigned long,
 			   __u32 *, __u32 *, int *);
 extern void ext2_free_blocks (const struct inode *, unsigned long,
@@ -452,7 +503,7 @@
 
 /* dir.c */
 extern int ext2_check_dir_entry (const char *, struct inode *,
-				 struct ext2_dir_entry *, struct buffer_head *,
+				 struct ext2_dir_entry_2 *, struct buffer_head *,
 				 unsigned long);
 
 /* file.c */
diff -u --recursive --new-file linux-2.0.38/include/linux/ext2_fs_sb.h linux-2.0.39/include/linux/ext2_fs_sb.h
--- linux-2.0.38/include/linux/ext2_fs_sb.h	Thu Nov 13 05:45:40 1997
+++ linux-2.0.39/include/linux/ext2_fs_sb.h	Fri Jan 21 16:17:51 2000
@@ -60,6 +60,9 @@
 	int s_desc_per_block_bits;
 	int s_inode_size;
 	int s_first_ino;
+	int s_feature_compat;
+	int s_feature_incompat;
+	int s_feature_ro_compat;
 };
 
 #endif	/* _LINUX_EXT2_FS_SB */
diff -u --recursive --new-file linux-2.0.38/include/linux/fddidevice.h linux-2.0.39/include/linux/fddidevice.h
--- linux-2.0.38/include/linux/fddidevice.h	Wed Oct 30 02:42:41 1996
+++ linux-2.0.39/include/linux/fddidevice.h	Wed Dec 29 12:43:09 1999
@@ -12,7 +12,7 @@
  *		fddidevice.h is based on previous trdevice.h work by
  *			Ross Biro, <bir7@leland.Stanford.Edu>
  *			Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
- *			Alan Cox, <gw4pts@gw4pts.ampr.org>
+ *			Alan Cox, <alan@lxorguk.ukuu.org.uk>
  *
  *		This program is free software; you can redistribute it and/or
  *		modify it under the terms of the GNU General Public License
diff -u --recursive --new-file linux-2.0.38/include/linux/skbuff.h linux-2.0.39/include/linux/skbuff.h
--- linux-2.0.38/include/linux/skbuff.h	Sun Nov 15 19:33:18 1998
+++ linux-2.0.39/include/linux/skbuff.h	Wed Dec 29 12:41:06 1999
@@ -2,7 +2,7 @@
  *	Definitions for the 'struct sk_buff' memory handlers.
  *
  *	Authors:
- *		Alan Cox, <gw4pts@gw4pts.ampr.org>
+ *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
  *		Florian La Roche, <rzsfl@rz.uni-sb.de>
  *
  *	This program is free software; you can redistribute it and/or
diff -u --recursive --new-file linux-2.0.38/include/linux/trdevice.h linux-2.0.39/include/linux/trdevice.h
--- linux-2.0.38/include/linux/trdevice.h	Sun Mar 24 12:33:25 1996
+++ linux-2.0.39/include/linux/trdevice.h	Wed Dec 29 12:42:41 1999
@@ -10,8 +10,8 @@
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  *
- *		Relocated to include/linux where it belongs by Alan Cox 
- *							<gw4pts@gw4pts.ampr.org>
+ *		Relocated to include/linux where it belongs by Alan Cox
+ *						<alan@lxorguk.ukuu.org.uk>
  *
  *		This program is free software; you can redistribute it and/or
  *		modify it under the terms of the GNU General Public License
diff -u --recursive --new-file linux-2.0.38/include/net/ip.h linux-2.0.39/include/net/ip.h
--- linux-2.0.38/include/net/ip.h	Tue Dec  2 23:20:24 1997
+++ linux-2.0.39/include/net/ip.h	Wed Dec 29 12:43:26 1999
@@ -9,7 +9,7 @@
  *
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
- *		Alan Cox, <gw4pts@gw4pts.ampr.org>
+ *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
  *
  *		This program is free software; you can redistribute it and/or
  *		modify it under the terms of the GNU General Public License
diff -u --recursive --new-file linux-2.0.38/include/net/snmp.h linux-2.0.39/include/net/snmp.h
--- linux-2.0.38/include/net/snmp.h	Tue Jun  6 10:22:18 1995
+++ linux-2.0.39/include/net/snmp.h	Wed Dec 29 12:44:15 1999
@@ -1,8 +1,8 @@
 /*
  *
  *		SNMP MIB entries for the IP subsystem.
- *		
- *		Alan Cox <gw4pts@gw4pts.ampr.org>
+ *
+ *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
  *
  *		We don't chose to implement SNMP in the kernel (this would
  *		be silly as SNMP is a pain in the backside in places). We do
diff -u --recursive --new-file linux-2.0.38/net/802/fddi.c linux-2.0.39/net/802/fddi.c
--- linux-2.0.38/net/802/fddi.c	Wed Oct 30 03:36:35 1996
+++ linux-2.0.39/net/802/fddi.c	Wed Dec 29 12:44:41 1999
@@ -14,8 +14,8 @@
  *			Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  *			Mark Evans, <evansmp@uhura.aston.ac.uk>
  *			Florian La Roche, <rzsfl@rz.uni-sb.de>
- *			Alan Cox, <gw4pts@gw4pts.ampr.org>
- * 
+ *			Alan Cox, <alan@lxorguk.ukuu.org.uk>
+ *
  *		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
diff -u --recursive --new-file linux-2.0.38/net/Config.in linux-2.0.39/net/Config.in
--- linux-2.0.38/net/Config.in	Mon Jul 13 22:47:40 1998
+++ linux-2.0.39/net/Config.in	Thu Dec 30 18:30:09 1999
@@ -7,21 +7,21 @@
 bool 'Network aliasing'  CONFIG_NET_ALIAS
 bool 'TCP/IP networking' CONFIG_INET
 if [ "$CONFIG_INET" = "y" ]; then
-  source net/ipv4/Config.in
+   source net/ipv4/Config.in
 fi
 comment ' '
 tristate 'The IPX protocol' CONFIG_IPX
 tristate 'Appletalk DDP' CONFIG_ATALK
 tristate 'Amateur Radio AX.25 Level 2' CONFIG_AX25
 if [ "$CONFIG_AX25" != "n" ]; then
-  dep_tristate 'Amateur Radio NET/ROM' CONFIG_NETROM $CONFIG_AX25
-  dep_tristate 'Amateur Radio X.25 PLP (Rose)' CONFIG_ROSE $CONFIG_AX25
+   dep_tristate '  Amateur Radio NET/ROM' CONFIG_NETROM $CONFIG_AX25
+   dep_tristate '  Amateur Radio X.25 PLP (Rose)' CONFIG_ROSE $CONFIG_AX25
 fi
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  bool 'Bridging (EXPERIMENTAL)' CONFIG_BRIDGE
+   bool 'Bridging (EXPERIMENTAL)' CONFIG_BRIDGE
 fi
 bool 'Kernel/User network link driver' CONFIG_NETLINK
 if [ "$CONFIG_NETLINK" = "y" ]; then
-  bool 'Routing messages' CONFIG_RTNETLINK
+   bool '  Routing messages' CONFIG_RTNETLINK
 fi
 endmenu
diff -u --recursive --new-file linux-2.0.38/net/core/dev.c linux-2.0.39/net/core/dev.c
--- linux-2.0.38/net/core/dev.c	Sun Nov 15 19:33:20 1998
+++ linux-2.0.39/net/core/dev.c	Wed Dec 29 12:47:23 1999
@@ -1,5 +1,5 @@
 /*
- * 	NET3	Protocol independent device support routines.
+ *	NET3	Protocol independent device support routines.
  *
  *		This program is free software; you can redistribute it and/or
  *		modify it under the terms of the GNU General Public License
@@ -7,40 +7,44 @@
  *		2 of the License, or (at your option) any later version.
  *
  *	Derived from the non IP parts of dev.c 1.0.19
- * 		Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
+ *		Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *				Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  *				Mark Evans, <evansmp@uhura.aston.ac.uk>
  *
  *	Additional Authors:
  *		Florian la Roche <rzsfl@rz.uni-sb.de>
- *		Alan Cox <gw4pts@gw4pts.ampr.org>
+ *		Alan Cox <alan@lxorguk.ukuu.org.uk>
  *		David Hinds <dhinds@allegro.stanford.edu>
  *
  *	Changes:
  *		Alan Cox	:	device private ioctl copies fields back.
- *		Alan Cox	:	Transmit queue code does relevant stunts to
- *					keep the queue safe.
+ *		Alan Cox	:	Transmit queue code does relevant stunts
+ *					to keep the queue safe.
  *		Alan Cox	:	Fixed double lock.
  *		Alan Cox	:	Fixed promisc NULL pointer trap
  *		????????	:	Support the full private ioctl range
- *		Alan Cox	:	Moved ioctl permission check into drivers
+ *		Alan Cox	:	Moved ioctl permission check into
+ :					drivers
  *		Tim Kordas	:	SIOCADDMULTI/SIOCDELMULTI
  *		Alan Cox	:	100 backlog just doesn't cut it when
  *					you start doing multicast video 8)
  *		Alan Cox	:	Rewrote net_bh and list manager.
- *		Alan Cox	: 	Fix ETH_P_ALL echoback lengths.
+ *		Alan Cox	:	Fix ETH_P_ALL echoback lengths.
  *		Alan Cox	:	Took out transmit every packet pass
  *					Saved a few bytes in the ioctl handler
- *		Alan Cox	:	Network driver sets packet type before calling netif_rx. Saves
- *					a function call a packet.
+ *		Alan Cox	:	Network driver sets packet type before
+ *					calling netif_rx. Saves a function
+ *					call a packet.
  *		Alan Cox	:	Hashed net_bh()
  *		Richard Kooijman:	Timestamp fixes.
  *		Alan Cox	:	Wrong field in SIOCGIFDSTADDR
  *		Alan Cox	:	Device lock protection.
- *		Alan Cox	: 	Fixed nasty side effect of device close changes.
- *		Rudi Cilibrasi	:	Pass the right thing to set_mac_address()
- *		Dave Miller	:	32bit quantity for the device lock to make it work out
- *					on a Sparc.
+ *		Alan Cox	:	Fixed nasty side effect of device
+ *					close changes.
+ *		Rudi Cilibrasi	:	Pass the right thing to
+ *					set_mac_address()
+ *		Dave Miller	:	32bit quantity for the device lock
+ *					to make it work out on a Sparc.
  *		Bjorn Ekwall	:	Added KERNELD hack.
  *		Alan Cox	:	Cleaned up the backlog initialise.
  *		Craig Metz	:	SIOCGIFCONF fix if space for under
diff -u --recursive --new-file linux-2.0.38/net/ethernet/eth.c linux-2.0.39/net/ethernet/eth.c
--- linux-2.0.38/net/ethernet/eth.c	Thu Jun  4 00:17:50 1998
+++ linux-2.0.39/net/ethernet/eth.c	Wed Dec 29 12:48:26 1999
@@ -11,16 +11,17 @@
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  *		Mark Evans, <evansmp@uhura.aston.ac.uk>
  *		Florian  La Roche, <rzsfl@rz.uni-sb.de>
- *		Alan Cox, <gw4pts@gw4pts.ampr.org>
- * 
+ *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
+ *
  * Fixes:
  *		Mr Linux	: Arp problems
  *		Alan Cox	: Generic queue tidyup (very tiny here)
  *		Alan Cox	: eth_header ntohs should be htons
  *		Alan Cox	: eth_rebuild_header missing an htons and
  *				  minor other things.
- *		Tegge		: Arp bug fixes. 
- *		Florian		: Removed many unnecessary functions, code cleanup
+ *		Tegge		: Arp bug fixes.
+ *		Florian		: Removed many unnecessary functions,
+ *				  code cleanup
  *				  and changes for new arp and skbuff.
  *		Alan Cox	: Redid header building to reflect new format.
  *		Alan Cox	: ARP only when compiled with CONFIG_INET
@@ -30,7 +31,8 @@
  *		Alan Cox	: Protect against forwarding explosions with
  *				  older network drivers and IFF_ALLMULTI.
  *	Christer Weinigel	: Better rebuild header message.
- *		Russell King	: eth_header_cache_bind and eth_header_cache_update
+ *		Russell King	: eth_header_cache_bind and
+ *				  eth_header_cache_update
  *				  only compiled if CONFIG_INET is selected
  *
  *		This program is free software; you can redistribute it and/or
diff -u --recursive --new-file linux-2.0.38/net/ipv4/Config.in linux-2.0.39/net/ipv4/Config.in
--- linux-2.0.38/net/ipv4/Config.in	Sun Jun 13 19:21:04 1999
+++ linux-2.0.39/net/ipv4/Config.in	Thu Dec 30 02:20:59 1999
@@ -1,67 +1,67 @@
 #
 # IP configuration
 #
-bool 'IP: forwarding/gatewaying' CONFIG_IP_FORWARD
-bool 'IP: multicasting' CONFIG_IP_MULTICAST
-bool 'IP: syn cookies' CONFIG_SYN_COOKIES
+bool '  IP: forwarding/gatewaying' CONFIG_IP_FORWARD
+bool '  IP: multicasting' CONFIG_IP_MULTICAST
+bool '  IP: syn cookies' CONFIG_SYN_COOKIES
 #if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-#  bool 'IP: rst cookies' CONFIG_RST_COOKIES
+#   bool '  IP: rst cookies (EXPERIMENTAL)' CONFIG_RST_COOKIES
 #fi
 if [ "$CONFIG_FIREWALL" = "y" ]; then
-  bool 'IP: firewalling' CONFIG_IP_FIREWALL
-  if [ "$CONFIG_IP_FIREWALL" = "y" ]; then
-    bool 'IP: firewall packet logging' CONFIG_IP_FIREWALL_VERBOSE
-      bool 'IP: masquerading' CONFIG_IP_MASQUERADE
+   bool '  IP: firewalling' CONFIG_IP_FIREWALL
+   if [ "$CONFIG_IP_FIREWALL" = "y" ]; then
+      bool '    IP: firewall packet logging' CONFIG_IP_FIREWALL_VERBOSE
+      bool '    IP: masquerading' CONFIG_IP_MASQUERADE
       if [ "$CONFIG_IP_MASQUERADE" != "n" ]; then
-        comment 'Protocol-specific masquerading support will be built as modules.'
-        if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then	
-          bool 'IP: ipautofw masquerading (EXPERIMENTAL)' CONFIG_IP_MASQUERADE_IPAUTOFW
-          bool 'IP: MS PPTP masq support (EXPERIMENTAL)' CONFIG_IP_MASQUERADE_PPTP
-          if [ "$CONFIG_IP_MASQUERADE_PPTP" = "y" ]; then	
-            bool 'IP: MS PPTP Call ID masq support (EXPERIMENTAL)' CONFIG_IP_MASQUERADE_PPTP_MULTICLIENT
-            bool 'IP: MS PPTP masq debugging' DEBUG_IP_MASQUERADE_PPTP
-            if [ "$DEBUG_IP_MASQUERADE_PPTP" = "y" ]; then	
-              bool 'IP: MS PPTP masq verbose debugging' DEBUG_IP_MASQUERADE_PPTP_VERBOSE
-            fi
-          fi
-          bool 'IP: IPSEC ESP & ISAKMP masq support (EXPERIMENTAL)' CONFIG_IP_MASQUERADE_IPSEC
-          if [ "$CONFIG_IP_MASQUERADE_IPSEC" = "y" ]; then	
-            int 'IP: IPSEC masq table lifetime (minutes)' CONFIG_IP_MASQUERADE_IPSEC_EXPIRE 30
-            bool 'IP: Disable inbound ESP destination guessing' CONFIG_IP_MASQUERADE_IPSEC_NOGUESS
-            bool 'IP: IPSEC masq debugging' DEBUG_IP_MASQUERADE_IPSEC
-            if [ "$DEBUG_IP_MASQUERADE_IPSEC" = "y" ]; then	
-              bool 'IP: IPSEC masq verbose debugging' DEBUG_IP_MASQUERADE_IPSEC_VERBOSE
-            fi
-          fi
-        fi
-        bool 'IP: ICMP masquerading' CONFIG_IP_MASQUERADE_ICMP
+	 comment 'Protocol-specific masquerading support will be built as modules.'
+	 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then	
+	    bool '      IP: ipautofw masquerading (EXPERIMENTAL)' CONFIG_IP_MASQUERADE_IPAUTOFW
+	    bool '      IP: MS PPTP masq support (EXPERIMENTAL)' CONFIG_IP_MASQUERADE_PPTP
+	    if [ "$CONFIG_IP_MASQUERADE_PPTP" = "y" ]; then	
+	       bool '        IP: MS PPTP Call ID masq support' CONFIG_IP_MASQUERADE_PPTP_MULTICLIENT
+	       bool '        IP: MS PPTP masq debugging' DEBUG_IP_MASQUERADE_PPTP
+	       if [ "$DEBUG_IP_MASQUERADE_PPTP" = "y" ]; then	
+		  bool '          IP: MS PPTP masq verbose debugging' DEBUG_IP_MASQUERADE_PPTP_VERBOSE
+	       fi
+	    fi
+	    bool '      IP: IPSEC ESP & ISAKMP masq support (EXPERIMENTAL)' CONFIG_IP_MASQUERADE_IPSEC
+	    if [ "$CONFIG_IP_MASQUERADE_IPSEC" = "y" ]; then	
+	       int 'IP: IPSEC masq table lifetime (minutes)' CONFIG_IP_MASQUERADE_IPSEC_EXPIRE 30
+	       bool '        IP: Disable inbound ESP destination guessing' CONFIG_IP_MASQUERADE_IPSEC_NOGUESS
+	       bool '        IP: IPSEC masq debugging' DEBUG_IP_MASQUERADE_IPSEC
+	       if [ "$DEBUG_IP_MASQUERADE_IPSEC" = "y" ]; then	
+		  bool '        IP: IPSEC masq verbose debugging' DEBUG_IP_MASQUERADE_IPSEC_VERBOSE
+	       fi
+	    fi
+	 fi
+	 bool '      IP: ICMP masquerading' CONFIG_IP_MASQUERADE_ICMP
       fi
       if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then	
-        bool 'IP: transparent proxy support (EXPERIMENTAL)' CONFIG_IP_TRANSPARENT_PROXY
+	 bool '    IP: transparent proxy support (EXPERIMENTAL)' CONFIG_IP_TRANSPARENT_PROXY
       fi	
-     bool 'IP: always defragment' CONFIG_IP_ALWAYS_DEFRAG
-  fi
+      bool '    IP: always defragment' CONFIG_IP_ALWAYS_DEFRAG
+   fi
+fi
+bool '  IP: accounting' CONFIG_IP_ACCT
+bool '  IP: optimize as router not host' CONFIG_IP_ROUTER
+tristate '  IP: tunneling' CONFIG_NET_IPIP
+if [ "$CONFIG_IP_MULTICAST" = "y" ]; then
+   if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+      bool '  IP: multicast routing (EXPERIMENTAL)' CONFIG_IP_MROUTE
+   fi		
 fi
-bool 'IP: accounting' CONFIG_IP_ACCT
-  bool 'IP: optimize as router not host' CONFIG_IP_ROUTER
-  tristate 'IP: tunneling' CONFIG_NET_IPIP
-  if [ "$CONFIG_IP_MULTICAST" = "y" ]; then
-      if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-        bool 'IP: multicast routing (EXPERIMENTAL)' CONFIG_IP_MROUTE
-      fi		
-  fi
 if [ "$CONFIG_NET_ALIAS" = "y" ]; then
-	tristate 'IP: aliasing support' CONFIG_IP_ALIAS
+   tristate '  IP: aliasing support' CONFIG_IP_ALIAS
 fi
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  if [ "$CONFIG_NETLINK" = "y" ]; then
-    bool 'IP: ARP daemon support (EXPERIMENTAL)' CONFIG_ARPD
-  fi
+   if [ "$CONFIG_NETLINK" = "y" ]; then
+      bool '  IP: ARP daemon support (EXPERIMENTAL)' CONFIG_ARPD
+   fi
 fi
 comment '(it is safe to leave these untouched)'
-bool 'IP: PC/TCP compatibility mode' CONFIG_INET_PCTCP
-tristate 'IP: Reverse ARP' CONFIG_INET_RARP
-bool 'IP: Disable Path MTU Discovery (normally enabled)' CONFIG_NO_PATH_MTU_DISCOVERY
-#bool 'IP: Disable NAGLE algorithm (normally enabled)' CONFIG_TCP_NAGLE_OFF
-bool 'IP: Drop source routed frames' CONFIG_IP_NOSR
-bool 'IP: Allow large windows (not recommended if <16Mb of memory)' CONFIG_SKB_LARGE
+bool '  IP: PC/TCP compatibility mode' CONFIG_INET_PCTCP
+tristate '  IP: Reverse ARP' CONFIG_INET_RARP
+bool '  IP: Disable Path MTU Discovery (normally enabled)' CONFIG_NO_PATH_MTU_DISCOVERY
+#bool '  IP: Disable NAGLE algorithm (normally enabled)' CONFIG_TCP_NAGLE_OFF
+bool '  IP: Drop source routed frames' CONFIG_IP_NOSR
+bool '  IP: Allow large windows (not recommended if <16Mb of memory)' CONFIG_SKB_LARGE
diff -u --recursive --new-file linux-2.0.38/net/ipv4/devinet.c linux-2.0.39/net/ipv4/devinet.c
--- linux-2.0.38/net/ipv4/devinet.c	Tue May  7 14:22:30 1996
+++ linux-2.0.39/net/ipv4/devinet.c	Wed Dec 29 12:48:56 1999
@@ -7,16 +7,16 @@
  *		2 of the License, or (at your option) any later version.
  *
  *	Derived from the IP parts of dev.c 1.0.19
- * 		Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
+ *		Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *				Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  *				Mark Evans, <evansmp@uhura.aston.ac.uk>
  *
  *	Additional Authors:
- *		Alan Cox, <gw4pts@gw4pts.ampr.org>
+ *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
  */
 
 #include <linux/config.h>	/* For CONFIG_IP_CLASSLESS */
- 
+
 #include <asm/segment.h>
 #include <asm/system.h>
 #include <asm/bitops.h>
diff -u --recursive --new-file linux-2.0.38/net/ipv4/ip_fw.c linux-2.0.39/net/ipv4/ip_fw.c
--- linux-2.0.38/net/ipv4/ip_fw.c	Tue Dec 29 20:55:12 1998
+++ linux-2.0.39/net/ipv4/ip_fw.c	Mon Dec 27 12:00:03 1999
@@ -505,7 +505,7 @@
 				printk(":%hu", dst_port);
 			printk(" L=%hu S=0x%2.2hX I=%hu F=0x%4.4hX T=%hu",
 				ntohs(ip->tot_len), ip->tos, ntohs(ip->id),
-				ip->frag_off, ip->ttl);
+				ntohs(ip->frag_off), ip->ttl);
 			for (opti = 0; opti < (ip->ihl - sizeof(struct iphdr) / 4); opti++)
 				printk(" O=0x%8.8X", *opt++);
 			printk("\n");
diff -u --recursive --new-file linux-2.0.38/net/ipv4/ip_output.c linux-2.0.39/net/ipv4/ip_output.c
--- linux-2.0.38/net/ipv4/ip_output.c	Thu Jun  4 00:17:50 1998
+++ linux-2.0.39/net/ipv4/ip_output.c	Sat Jan 22 01:56:58 2000
@@ -8,9 +8,9 @@
  * Version:	@(#)ip.c	1.0.16b	9/1/93
  *
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
- *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
- *		Donald Becker, <becker@super.org>
- *		Alan Cox, <Alan.Cox@linux.org>
+ *		Fred N. van Kempen, <waltje@linux.com>
+ *		Donald Becker, <becker@cesdis.gsfc.nasa.gov>
+ *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
  *		Richard Underwood
  *		Stefan Becker, <stefanb@yello.ping.de>
  *		Jorge Cwik, <jorge@laser.satlink.net>
@@ -19,17 +19,20 @@
  *	See ip_input.c for original log
  *
  *	Fixes:
- *		Alan Cox	:	Missing nonblock feature in ip_build_xmit.
- *		Mike Kilburn	:	htons() missing in ip_build_xmit.
- *		Bradford Johnson:	Fix faulty handling of some frames when 
- *					no route is found.
- *		Alexander Demenshin:	Missing sk/skb free in ip_queue_xmit
+ *			 Alan Cox:	Missing nonblock feature in
+ *					ip_build_xmit
+ *		     Mike Kilburn:	htons() missing in ip_build_xmit
+ *		 Bradford Johnson:	Fix faulty handling of some frames
+ *					when no route is found
+ *	      Alexander Demenshin:	Missing sk/skb free in ip_queue_xmit
  *					(in case if packet not accepted by
  *					output firewall rules)
- *              Elliot Poger    :       Added support for SO_BINDTODEVICE.
- *		Juan Jose Ciarlante:	sk/skb source address rewriting
- * 	Elena Apolinario Fdez de Sousa,:ipmr_forward never received multicast
- *	Juan-Mariano de Goyeneche	traffic generated locally.
+ *		     Elliot Poger:	Added support for SO_BINDTODEVICE
+ *	      Juan Jose Ciarlante:	sk/skb source address rewriting
+ * Elena Apolinario Fdez de Sousa
+ *    + Juan-Mariano de Goyeneche:	ipmr_forward never received multicast
+ *					traffic generated locally
+ *		 Andrea Arcangeli:	Fix for the 65468 bytes ping-exploit
  */
 
 #include <asm/segment.h>
@@ -703,7 +706,12 @@
 
 	if (!sk->ip_hdrincl) {
 		length += sizeof(struct iphdr);
-		if(opt) length += opt->optlen;
+		if (opt) {
+			/* make sure not to exceed maximum packet size */
+			if (0xffff - length < opt->optlen)
+				return -EMSGSIZE;
+			length += opt->optlen;
+		}
 	}
 
 	if(length <= dev->mtu && !MULTICAST(daddr) && daddr!=0xFFFFFFFF && daddr!=dev->pa_brdaddr)
diff -u --recursive --new-file linux-2.0.38/net/ipv4/ip_sockglue.c linux-2.0.39/net/ipv4/ip_sockglue.c
--- linux-2.0.38/net/ipv4/ip_sockglue.c	Sun Jun 13 19:21:04 1999
+++ linux-2.0.39/net/ipv4/ip_sockglue.c	Mon Dec 27 21:57:14 1999
@@ -98,11 +98,20 @@
 static struct device *ip_mc_find_devfor(unsigned long addr)
 {
 	struct device *dev;
-	for(dev = dev_base; dev; dev = dev->next)
-	{
-		if((dev->flags&IFF_UP)&&(dev->flags&IFF_MULTICAST)&&
-			(dev->pa_addr==addr))
-			return dev;
+	for(dev = dev_base; dev; dev = dev->next) {
+		if((dev->flags&IFF_UP)&&(dev->flags&IFF_MULTICAST)) {
+			if(dev->flags&IFF_POINTOPOINT) {
+				/* gated needs this so that Multicast works   */
+				/* PTP interfaces cant be identified uniquely */
+				/* by their protocol address as it can very   */
+				/* likely be the address of eth0!             */
+				if(dev->pa_dstaddr==addr)
+					return dev;
+			} else {
+				 if(dev->pa_addr==addr)
+					return dev;
+			}
+		}
 	}
 
 	return NULL;
diff -u --recursive --new-file linux-2.0.38/net/ipv4/packet.c linux-2.0.39/net/ipv4/packet.c
--- linux-2.0.38/net/ipv4/packet.c	Tue Aug 12 23:15:56 1997
+++ linux-2.0.39/net/ipv4/packet.c	Wed Dec 29 12:49:12 1999
@@ -12,7 +12,7 @@
  *
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
- *		Alan Cox, <gw4pts@gw4pts.ampr.org>
+ *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
  *
  * Fixes:	
  *		Alan Cox	:	verify_area() now used correctly
diff -u --recursive --new-file linux-2.0.38/net/ipv4/route.c linux-2.0.39/net/ipv4/route.c
--- linux-2.0.38/net/ipv4/route.c	Mon Jul 13 22:47:41 1998
+++ linux-2.0.39/net/ipv4/route.c	Wed Dec 29 12:31:33 1999
@@ -9,8 +9,8 @@
  *
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
- *		Alan Cox, <gw4pts@gw4pts.ampr.org>
- *		Linus Torvalds, <Linus.Torvalds@helsinki.fi>
+ *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
+ *		Linus Torvalds, <torvalds@transmeta.com>
  *
  * Fixes:
  *		Alan Cox	:	Verify area fixes.
diff -u --recursive --new-file linux-2.0.38/net/ipv4/tcp.c linux-2.0.39/net/ipv4/tcp.c
--- linux-2.0.38/net/ipv4/tcp.c	Thu Aug 26 00:08:27 1999
+++ linux-2.0.39/net/ipv4/tcp.c	Wed Dec 29 12:33:34 1999
@@ -13,8 +13,8 @@
  *		Corey Minyard <wf-rch!minyard@relay.EU.net>
  *		Florian La Roche, <flla@stud.uni-sb.de>
  *		Charles Hedrick, <hedrick@klinzhai.rutgers.edu>
- *		Linus Torvalds, <torvalds@cs.helsinki.fi>
- *		Alan Cox, <gw4pts@gw4pts.ampr.org>
+ *		Linus Torvalds, <torvalds@transmeta.com>
+ *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
  *		Matthew Dillon, <dillon@apollo.west.oic.com>
  *		Arnt Gulbrandsen, <agulbra@nvg.unit.no>
  *		Jorge Cwik, <jorge@laser.satlink.net>
diff -u --recursive --new-file linux-2.0.38/net/ipv4/tcp_input.c linux-2.0.39/net/ipv4/tcp_input.c
--- linux-2.0.38/net/ipv4/tcp_input.c	Thu Aug 26 00:08:27 1999
+++ linux-2.0.39/net/ipv4/tcp_input.c	Wed Dec 29 12:34:19 1999
@@ -13,8 +13,8 @@
  *		Corey Minyard <wf-rch!minyard@relay.EU.net>
  *		Florian La Roche, <flla@stud.uni-sb.de>
  *		Charles Hedrick, <hedrick@klinzhai.rutgers.edu>
- *		Linus Torvalds, <torvalds@cs.helsinki.fi>
- *		Alan Cox, <gw4pts@gw4pts.ampr.org>
+ *		Linus Torvalds, <torvalds@transmeta.com>
+ *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
  *		Matthew Dillon, <dillon@apollo.west.oic.com>
  *		Arnt Gulbrandsen, <agulbra@nvg.unit.no>
  *		Jorge Cwik, <jorge@laser.satlink.net>
diff -u --recursive --new-file linux-2.0.38/net/ipv4/tcp_output.c linux-2.0.39/net/ipv4/tcp_output.c
--- linux-2.0.38/net/ipv4/tcp_output.c	Sun Nov 15 19:33:22 1998
+++ linux-2.0.39/net/ipv4/tcp_output.c	Wed Dec 29 12:34:57 1999
@@ -13,8 +13,8 @@
  *		Corey Minyard <wf-rch!minyard@relay.EU.net>
  *		Florian La Roche, <flla@stud.uni-sb.de>
  *		Charles Hedrick, <hedrick@klinzhai.rutgers.edu>
- *		Linus Torvalds, <torvalds@cs.helsinki.fi>
- *		Alan Cox, <gw4pts@gw4pts.ampr.org>
+ *		Linus Torvalds, <torvalds@transmeta.com>
+ *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
  *		Matthew Dillon, <dillon@apollo.west.oic.com>
  *		Arnt Gulbrandsen, <agulbra@nvg.unit.no>
  *		Jorge Cwik, <jorge@laser.satlink.net>
diff -u --recursive --new-file linux-2.0.38/net/ipv4/tcp_timer.c linux-2.0.39/net/ipv4/tcp_timer.c
--- linux-2.0.38/net/ipv4/tcp_timer.c	Tue Aug 12 20:30:35 1997
+++ linux-2.0.39/net/ipv4/tcp_timer.c	Wed Dec 29 12:35:24 1999
@@ -13,8 +13,8 @@
  *		Corey Minyard <wf-rch!minyard@relay.EU.net>
  *		Florian La Roche, <flla@stud.uni-sb.de>
  *		Charles Hedrick, <hedrick@klinzhai.rutgers.edu>
- *		Linus Torvalds, <torvalds@cs.helsinki.fi>
- *		Alan Cox, <gw4pts@gw4pts.ampr.org>
+ *		Linus Torvalds, <torvalds@transmeta.com>
+ *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
  *		Matthew Dillon, <dillon@apollo.west.oic.com>
  *		Arnt Gulbrandsen, <agulbra@nvg.unit.no>
  *		Jorge Cwik, <jorge@laser.satlink.net>
diff -u --recursive --new-file linux-2.0.38/net/ipx/af_ipx.c linux-2.0.39/net/ipx/af_ipx.c
--- linux-2.0.38/net/ipx/af_ipx.c	Thu Jun  4 00:17:50 1998
+++ linux-2.0.39/net/ipx/af_ipx.c	Tue Feb  8 15:48:52 2000
@@ -2,7 +2,7 @@
  *	Implements an IPX socket layer (badly - but I'm working on it).
  *
  *	This code is derived from work by
- *		Ross Biro	: 	Writing the original IP stack
+ *		Ross Biro	:	Writing the original IP stack
  *		Fred Van Kempen :	Tidying up the TCP/IP
  *
  *	Many thanks go to Keith Baker, Institute For Industrial Information
@@ -11,38 +11,39 @@
  *	work I am currently employed to do there.
  *
  *	All the material in this file is subject to the Gnu license version 2.
- *	Neither Alan Cox nor the Swansea University Computer Society admit liability
- *	nor provide warranty for any of this software. This material is provided 
- *	as is and at no charge.		
+ *	Neither Alan Cox nor the Swansea University Computer Society admit
+ *	liability nor provide warranty for any of this software. This material
+ *	is provided as is and at no charge.
  *
- *	Revision 0.21:	Uses the new generic socket option code.
+ *	Revision 0.21:	Uses the new generic socket option code
  *	Revision 0.22:	Gcc clean ups and drop out device registration. Use the
- *			new multi-protocol edition of hard_header 
- *	Revision 0.23:  IPX /proc by Mark Evans.
- *     			Adding a route will overwrite any existing route to the same
- *			network.
+ *			new multi-protocol edition of hard_header
+ *	Revision 0.23:  IPX /proc by Mark Evans
+ *			Adding a route will overwrite any existing route to
+ *			the same network
  *	Revision 0.24:	Supports new /proc with no 4K limit
- *	Revision 0.25:	Add ephemeral sockets, passive local network 
+ *	Revision 0.25:	Add ephemeral sockets, passive local network
  *			identification, support for local net 0 and
  *			multiple datalinks <Greg Page>
- *	Revision 0.26:  Device drop kills IPX routes via it. (needed for modules)
+ *	Revision 0.26:  Device drop kills IPX routes via it (needed for modules)
  *	Revision 0.27:  Autobind <Mark Evans>
  *	Revision 0.28:  Small fix for multiple local networks <Thomas Winder>
  *	Revision 0.29:  Assorted major errors removed <Mark Evans>
  *			Small correction to promisc mode error fix <Alan Cox>
- *			Asynchronous I/O support.
- *			Changed to use notifiers and the newer packet_type stuff.
+ *			Asynchronous I/O support
+ *			Changed to use notifiers and the newer packet_type stuff
  *			Assorted major fixes <Alejandro Liu>
  *	Revision 0.30:	Moved to net/ipx/...	<Alan Cox>
- *			Don't set address length on recvfrom that errors.
- *			Incorrect verify_area.
- *	Revision 0.31:	New sk_buffs. This still needs a lot of testing. <Alan Cox>
+ *			Don't set address length on recvfrom that errors
+ *			Incorrect verify_area
+ *	Revision 0.31:	New sk_buffs. This still needs a lot of testing
+ *			<Alan Cox>
  *	Revision 0.32:  Using sock_alloc_send_skb, firewall hooks. <Alan Cox>
  *			Supports sendmsg/recvmsg
  *	Revision 0.33:	Internal network support, routing changes, uses a
- *			protocol private area for ipx data.
- *	Revision 0.34:	Module support. <Jim Freeman>
- *	Revision 0.35:  Checksum support. <Neil Turton>, hooked in by <Alan Cox>
+ *			protocol private area for ipx data
+ *	Revision 0.34:	Module support <Jim Freeman>
+ *	Revision 0.35:  Checksum support <Neil Turton>, hooked in by <Alan Cox>
  *			Handles WIN95 discovery packets <Volker Lendecke>
  *
  *	Protect the module by a MOD_INC_USE_COUNT/MOD_DEC_USE_COUNT
@@ -53,10 +54,10 @@
  *	Jacques Gelinas (jacques@solucorp.qc.ca)
  *
  *
- * 	Portions Copyright (c) 1995 Caldera, Inc. <greg@caldera.com>
- *	Neither Greg Page nor Caldera, Inc. admit liability nor provide 
- *	warranty for any of this software. This material is provided 
- *	"AS-IS" and at no charge.		
+ *	Portions Copyright (c) 1995 Caldera, Inc. <greg@caldera.com>
+ *	Neither Greg Page nor Caldera, Inc. admit liability nor provide
+ *	warranty for any of this software. This material is provided
+ *	"AS-IS" and at no charge.
  */
 
 #include <linux/module.h>
@@ -106,7 +107,7 @@
 static struct datalink_proto	*p8023_datalink = NULL;
 static struct datalink_proto	*pSNAP_datalink = NULL;
 
-static ipx_route 	*ipx_routes = NULL;
+static ipx_route	*ipx_routes = NULL;
 static ipx_interface	*ipx_interfaces = NULL;
 static ipx_interface	*ipx_primary_net = NULL;
 static ipx_interface	*ipx_internal_net = NULL;
@@ -124,7 +125,7 @@
 	}
 	return 0;
 }
-		
+
 static int
 ipxcfg_set_auto_select(char val)
 {
@@ -138,7 +139,7 @@
 ipxcfg_get_config_data(ipx_config_data *arg)
 {
 	ipx_config_data	vals;
-	
+
 	vals.ipxcfg_auto_create_interfaces = ipxcfg_auto_create_interfaces;
 	vals.ipxcfg_auto_select_primary = ipxcfg_auto_select_primary;
 	memcpy_tofs(arg, &vals, sizeof(vals));
@@ -146,19 +147,19 @@
 }
 
 
-/***********************************************************************************************************************\
-*															*
-*						Handlers for the socket list.						*
-*															*
-\***********************************************************************************************************************/
+/***************************************************************************\
+*									    *
+*			Handlers for the socket list.			    *
+*									    *
+\***************************************************************************/
 
 /*
  *	Note: Sockets may not be removed _during_ an interrupt or inet_bh
  *	handler using this technique. They can be added although we do not
  *	use this facility.
  */
- 
-static void 
+
+static void
 ipx_remove_socket(ipx_socket *sk)
 {
 	ipx_socket	*s;
@@ -167,7 +168,7 @@
 
 	save_flags(flags);
 	cli();
-	
+
 	/* Determine interface with which socket is associated */
 	intrfc = sk->protinfo.af_ipx.intrfc;
 	if (intrfc == NULL) {
@@ -180,7 +181,7 @@
 		intrfc->if_sklist=s->next;
 		restore_flags(flags);
 		return;
-	} 
+	}
 
 	while(s && s->next) {
 		if(s->next==sk) {
@@ -199,8 +200,8 @@
  *	Once it is removed from the queue no interrupt or bottom half will
  *	touch it and we are (fairly 8-) ) safe.
  */
- 
-static void 
+
+static void
 ipx_destroy_socket(ipx_socket *sk)
 {
 	struct sk_buff	*skb;
@@ -209,11 +210,11 @@
 	while((skb=skb_dequeue(&sk->receive_queue))!=NULL) {
 		kfree_skb(skb,FREE_READ);
 	}
-	
+
 	sk_free(sk);
 	MOD_DEC_USE_COUNT;
 }
-	
+
 /* The following code is used to support IPX Interfaces (IPXITF).  An
  * IPX interface is defined by a physical device and a frame type.
  */
@@ -234,8 +235,8 @@
 {
 	ipx_interface	*i;
 
-	for (i=ipx_interfaces; 
-		i && ((i->if_dev!=dev) || (i->if_dlink_type!=datalink)); 
+	for (i=ipx_interfaces;
+		i && ((i->if_dev!=dev) || (i->if_dlink_type!=datalink));
 		i=i->if_next)
 		;
 	return i;
@@ -277,8 +278,8 @@
 {
 	ipx_socket	*s;
 
-	for (s=intrfc->if_sklist; 
-		(s != NULL) && (s->protinfo.af_ipx.port != port); 
+	for (s=intrfc->if_sklist;
+		(s != NULL) && (s->protinfo.af_ipx.port != port);
 		s=s->next)
 		;
 
@@ -303,7 +304,7 @@
 		s = s->next;
 	}
 	return s;
-}	
+}
 #endif
 
 static void ipxrtr_del_routes(ipx_interface *);
@@ -334,11 +335,11 @@
 	if (intrfc == ipx_interfaces) {
 		ipx_interfaces = intrfc->if_next;
 	} else {
-		for (i = ipx_interfaces; 
+		for (i = ipx_interfaces;
 			(i != NULL) && (i->if_next != intrfc);
 			i = i->if_next)
 			;
-		if ((i != NULL) && (i->if_next == intrfc)) 
+		if ((i != NULL) && (i->if_next == intrfc))
 			i->if_next = intrfc->if_next;
 	}
 
@@ -356,7 +357,7 @@
 	return;
 }
 
-static int 
+static int
 ipxitf_device_event(struct notifier_block *notifier, unsigned long event, void *ptr)
 {
 	struct device *dev = ptr;
@@ -366,9 +367,9 @@
 		return NOTIFY_DONE;
 
 	for (i = ipx_interfaces; i != NULL; ) {
-	
+
 		tmp = i->if_next;
-		if (i->if_dev == dev) 
+		if (i->if_dev == dev)
 			ipxitf_down(i);
 		i = tmp;
 
@@ -381,12 +382,12 @@
 {
 	int	retval;
 
-	if((retval = sock_queue_rcv_skb(sock, skb))<0) 
+	if((retval = sock_queue_rcv_skb(sock, skb))<0)
 	{
 		/*
 		 * skb->sk is NULL here, so FREE_WRITE does not hurt
 		 * the sending socket.
-	 	 */
+		 */
 		kfree_skb(skb,FREE_WRITE);
 	}
 	return retval;
@@ -398,7 +399,7 @@
 
 #ifdef CONFIG_IPX_INTERN
 static int
-ipxitf_demux_socket(ipx_interface *intrfc, struct sk_buff *skb, int copy) 
+ipxitf_demux_socket(ipx_interface *intrfc, struct sk_buff *skb, int copy)
 {
 	ipx_packet	*ipx = (ipx_packet *)(skb->h.raw);
 	ipx_socket	*s;
@@ -462,16 +463,16 @@
 #else
 
 static int
-ipxitf_demux_socket(ipx_interface *intrfc, struct sk_buff *skb, int copy) 
+ipxitf_demux_socket(ipx_interface *intrfc, struct sk_buff *skb, int copy)
 {
 	ipx_packet	*ipx = (ipx_packet *)(skb->h.raw);
 	ipx_socket	*sock1 = NULL, *sock2 = NULL;
 	struct sk_buff	*skb1 = NULL, *skb2 = NULL;
 
 	if (intrfc == ipx_primary_net
-	  && ntohs(ipx->ipx_dest.sock) == 0x451) 
+	  && ntohs(ipx->ipx_dest.sock) == 0x451)
 	{
-	  /* 
+	  /*
 	   * The packet's target is a NCP connection handler. We want to
 	   * hand it to the correct socket directly within the kernel,
 	   * so that the mars_nwe packet distribution process
@@ -484,25 +485,25 @@
 	  int connection = 0;
 
 	  if (    *((char*)(ipx+1))   == 0x22
-	      &&  *((char*)(ipx+1)+1) == 0x22) 
+	      &&  *((char*)(ipx+1)+1) == 0x22)
 	  {
-	  	/*
+		/*
 		 * The packet is a NCP request
 		 */
 		 connection = ( ((int) *((char*)(ipx+1)+5)) << 8 )
-		 	       | (int) *((char*)(ipx+1)+3);
-	  } 
+			       | (int) *((char*)(ipx+1)+3);
+	  }
 	  else if (    *((char*)(ipx+1))   == 0x77
-		   &&  *((char*)(ipx+1)+1) == 0x77) 
+		   &&  *((char*)(ipx+1)+1) == 0x77)
 	  {
 		/*
 		 * The packet is a BURST packet
 		 */
 		 connection = ( ((int) *((char*)(ipx+1)+9)) << 8 )
-		 	       | (int) *((char*)(ipx+1)+8);
+			       | (int) *((char*)(ipx+1)+8);
 	  }
 
-          if (connection) 
+          if (connection)
 	  {
 	    /*
 	     * Now we have to look for a special NCP connection handling
@@ -515,7 +516,7 @@
 		sock1=sock1->next);;
           }
         }
-        if (sock1 == NULL) 
+        if (sock1 == NULL)
 	{
 		/* No special socket found, forward the packet the
 		 * normal way.
@@ -530,21 +531,21 @@
 	 *	The *SPECIAL* socket list contains: 0x452(SAP), 0x453(RIP) and
 	 *	0x456(Diagnostic).
 	 */
-	 
-	if (ipx_primary_net && (intrfc != ipx_primary_net)) 
+
+	if (ipx_primary_net && (intrfc != ipx_primary_net))
 	{
-		switch (ntohs(ipx->ipx_dest.sock)) 
+		switch (ntohs(ipx->ipx_dest.sock))
 		{
 			case 0x452:
 			case 0x453:
 			case 0x456:
 				/*
 				 *	The appropriate thing to do here is to
-				 * 	dup the packet and route to the primary net
+				 *	dup the packet and route to the primary net
 				 *	interface via ipxitf_send; however, we'll cheat
 				 *	and just demux it here.
 				 */
-				sock2 = ipxitf_find_socket(ipx_primary_net, 
+				sock2 = ipxitf_find_socket(ipx_primary_net,
 					ipx->ipx_dest.sock);
 				break;
 			default:
@@ -552,57 +553,57 @@
 		}
 	}
 
-	/* 
+	/*
 	 *	if there is nothing to do, return. The kfree will
 	 *	cancel any charging.
 	 */
-	 
-	if (sock1 == NULL && sock2 == NULL) 
+
+	if (sock1 == NULL && sock2 == NULL)
 	{
-		if (!copy) 
+		if (!copy)
 			kfree_skb(skb,FREE_WRITE);
 		return 0;
 	}
 
 	/*
 	 * This next segment of code is a little awkward, but it sets it up
-	 * so that the appropriate number of copies of the SKB are made and 
-	 * that skb1 and skb2 point to it (them) so that it (they) can be 
+	 * so that the appropriate number of copies of the SKB are made and
+	 * that skb1 and skb2 point to it (them) so that it (they) can be
 	 * demuxed to sock1 and/or sock2.  If we are unable to make enough
 	 * copies, we do as much as is possible.
 	 */
-	 
-	if (copy) 
+
+	if (copy)
 	{
 		skb1 = skb_clone(skb, GFP_ATOMIC);
-		if (skb1 != NULL) 
+		if (skb1 != NULL)
 			skb1->arp = skb1->free = 1;
-	} 
-	else 
+	}
+	else
 	{
 		skb1 = skb;
 	}
-	
-	if (skb1 == NULL) 
-		return -ENOMEM; 
+
+	if (skb1 == NULL)
+		return -ENOMEM;
 
 	/*
-	 *	Do we need 2 SKBs? 
+	 *	Do we need 2 SKBs?
 	 */
-	 
-	if (sock1 && sock2) 
+
+	if (sock1 && sock2)
 	{
 		skb2 = skb_clone(skb1, GFP_ATOMIC);
-		if (skb2 != NULL) 
+		if (skb2 != NULL)
 			skb2->arp = skb2->free = 1;
 	}
-	else 
+	else
 		skb2 = skb1;
-		
+
 	if (sock1)
 		(void) ipxitf_def_skb_handler(sock1, skb1);
 
-	if (skb2 == NULL) 
+	if (skb2 == NULL)
 		return -ENOMEM;
 
 	if (sock2)
@@ -648,28 +649,28 @@
 	char		dest_node[IPX_NODE_LEN];
 	int		send_to_wire = 1;
 	int		addr_len;
-	
-	/* 
+
+	/*
 	 *	We need to know how many skbuffs it will take to send out this
 	 *	packet to avoid unnecessary copies.
 	 */
-	 
-	if ((dl == NULL) || (dev == NULL) || (dev->flags & IFF_LOOPBACK)) 
+
+	if ((dl == NULL) || (dev == NULL) || (dev->flags & IFF_LOOPBACK))
 		send_to_wire = 0;	/* No non looped */
 
 	/*
-	 *	See if this should be demuxed to sockets on this interface 
+	 *	See if this should be demuxed to sockets on this interface
 	 *
 	 *	We want to ensure the original was eaten or that we only use
 	 *	up clones.
 	 */
-	 
-	if (ipx->ipx_dest.net == intrfc->if_netnum) 
+
+	if (ipx->ipx_dest.net == intrfc->if_netnum)
 	{
 		/*
 		 *	To our own node, loop and free the original.
 		 */
-		if (memcmp(intrfc->if_node, node, IPX_NODE_LEN) == 0) 
+		if (memcmp(intrfc->if_node, node, IPX_NODE_LEN) == 0)
 		{
 			/*
 			 *	Don't charge sender
@@ -687,7 +688,7 @@
 		/*
 		 *	Broadcast, loop and possibly keep to send on.
 		 */
-		if (memcmp(ipx_broadcast_node, node, IPX_NODE_LEN) == 0) 
+		if (memcmp(ipx_broadcast_node, node, IPX_NODE_LEN) == 0)
 		{
 			if (!send_to_wire && skb->sk)
 			{
@@ -695,30 +696,30 @@
 				skb->sk=NULL;
 			}
 			ipxitf_demux_socket(intrfc, skb, send_to_wire);
-			if (!send_to_wire) 
+			if (!send_to_wire)
 				return 0;
 		}
 	}
 
 	/*
-	 *	If the originating net is not equal to our net; this is routed 
+	 *	If the originating net is not equal to our net; this is routed
 	 *	We are still charging the sender. Which is right - the driver
 	 *	free will handle this fairly.
 	 */
-	 
-	if (ipx->ipx_source.net != intrfc->if_netnum) 
+
+	if (ipx->ipx_source.net != intrfc->if_netnum)
 	{
-		if (++(ipx->ipx_tctrl) > ipxcfg_max_hops) 
+		if (++(ipx->ipx_tctrl) > ipxcfg_max_hops)
 			send_to_wire = 0;
 	}
 
-	if (!send_to_wire) 
+	if (!send_to_wire)
 	{
 		/*
 		 *	We do a FREE_WRITE here because this indicates how
-		 *	to treat the socket with which the packet is 
-	 	 *	associated.  If this packet is associated with a
-		 *	socket at all, it must be the originator of the 
+		 *	to treat the socket with which the packet is
+		 *	associated.  If this packet is associated with a
+		 *	socket at all, it must be the originator of the
 		 *	packet.   Routed packets will have no socket associated
 		 *	with them.
 		 */
@@ -727,21 +728,21 @@
 	}
 
 	/*
-	 *	Determine the appropriate hardware address 
+	 *	Determine the appropriate hardware address
 	 */
-	 
+
 	addr_len = dev->addr_len;
-	if (memcmp(ipx_broadcast_node, node, IPX_NODE_LEN) == 0) 
+	if (memcmp(ipx_broadcast_node, node, IPX_NODE_LEN) == 0)
 		memcpy(dest_node, dev->broadcast, addr_len);
 	else
 		memcpy(dest_node, &(node[IPX_NODE_LEN-addr_len]), addr_len);
 
 	/*
-	 *	Make any compensation for differing physical/data link size 
+	 *	Make any compensation for differing physical/data link size
 	 */
-	 
+
 	skb = ipxitf_adjust_skbuff(intrfc, skb);
-	if (skb == NULL) 
+	if (skb == NULL)
 		return 0;
 
 	/* set up data link and physical headers */
@@ -749,18 +750,18 @@
 	skb->protocol = htons(ETH_P_IPX);
 	dl->datalink_header(dl, skb, dest_node);
 #if 0
-	/* 
-	 *	Now log the packet just before transmission 
+	/*
+	 *	Now log the packet just before transmission
 	 */
-	 
+
 	dump_pkt("IPX snd:", (ipx_packet *)skb->h.raw);
 	dump_data("ETH hdr:", skb->data, skb->h.raw - skb->data);
 #endif
 
 	/*
-	 *	Send it out 
+	 *	Send it out
 	 */
-	 
+
 	dev_queue_xmit(skb, dev, SOPRI_NORMAL);
 	return 0;
 }
@@ -775,58 +776,74 @@
 static const char * ipx_frame_name(unsigned short);
 static const char * ipx_device_name(ipx_interface *);
 static int ipxrtr_route_skb(struct sk_buff *);
+static int ipxrtr_route_skb_type20(ipx_interface *intrfc, struct sk_buff *);
 
 static int ipxitf_rcv(ipx_interface *intrfc, struct sk_buff *skb)
 {
 	ipx_packet	*ipx = (ipx_packet *) (skb->h.raw);
 	ipx_interface	*i;
 
-#ifdef CONFIG_FIREWALL	
+#ifdef CONFIG_FIREWALL
 	/*
 	 *	We firewall first, ask questions later.
 	 */
-	 
+
 	if (call_in_firewall(PF_IPX, skb->dev, ipx, NULL)!=FW_ACCEPT)
 	{
 		kfree_skb(skb, FREE_READ);
 		return 0;
 	}
-	
-#endif	
+
+#endif
 
 	/* See if we should update our network number */
-	if ((intrfc->if_netnum == 0L) && 
+	if ((intrfc->if_netnum == 0L) &&
 		(ipx->ipx_source.net == ipx->ipx_dest.net) &&
-		(ipx->ipx_source.net != 0L)) 
+		(ipx->ipx_source.net != 0L))
 	{
 		/* NB: NetWare servers lie about their hop count so we
 		 * dropped the test based on it.  This is the best way
 		 * to determine this is a 0 hop count packet.
 		 */
-		if ((i=ipxitf_find_using_net(ipx->ipx_source.net))==NULL) 
+		if ((i=ipxitf_find_using_net(ipx->ipx_source.net))==NULL)
 		{
 			intrfc->if_netnum = ipx->ipx_source.net;
 			(void) ipxitf_add_local_route(intrfc);
-		} 
-		else 
+		}
+		else
 		{
 			printk(KERN_WARNING "IPX: Network number collision %lx\n        %s %s and %s %s\n",
-				htonl(ipx->ipx_source.net), 
+				htonl(ipx->ipx_source.net),
 				ipx_device_name(i),
 				ipx_frame_name(i->if_dlink_type),
 				ipx_device_name(intrfc),
 				ipx_frame_name(intrfc->if_dlink_type));
 		}
 	}
+	/*
+	 * "This shouldn't happen, but just in case"
+	 */
+	if (ipx->ipx_tctrl > ipxcfg_max_hops)
+	{
+		kfree_skb(skb, FREE_READ);
+		return 0;
+	}
+
+	/*
+	 * Do the IPX Packet Type 20 routing
+	 */
+	if (ipx->ipx_type == IPX_TYPE_PPROP)
+		return ipxrtr_route_skb_type20(intrfc, skb);
+
 
 	if (ipx->ipx_dest.net == 0L)
 		ipx->ipx_dest.net = intrfc->if_netnum;
 	if (ipx->ipx_source.net == 0L)
 		ipx->ipx_source.net = intrfc->if_netnum;
 
-	if (intrfc->if_netnum != ipx->ipx_dest.net) 
+	if (intrfc->if_netnum != ipx->ipx_dest.net)
 	{
-#ifdef CONFIG_FIREWALL	
+#ifdef CONFIG_FIREWALL
 		/*
 		 *	See if we are allowed to firewall forward
 		 */
@@ -835,18 +852,18 @@
 			kfree_skb(skb, FREE_READ);
 			return 0;
 		}
-#endif		
+#endif
 		/* We only route point-to-point packets. */
 		if (skb->pkt_type == PACKET_HOST)
 			return ipxrtr_route_skb(skb);
-		
+
 		kfree_skb(skb,FREE_READ);
 		return 0;
 	}
 
 	/* see if we should keep it */
-	if ((memcmp(ipx_broadcast_node, ipx->ipx_dest.node, IPX_NODE_LEN) == 0) 
-		|| (memcmp(intrfc->if_node, ipx->ipx_dest.node, IPX_NODE_LEN) == 0)) 
+	if ((memcmp(ipx_broadcast_node, ipx->ipx_dest.node, IPX_NODE_LEN) == 0)
+		|| (memcmp(intrfc->if_node, ipx->ipx_dest.node, IPX_NODE_LEN) == 0))
 	{
 		return ipxitf_demux_socket(intrfc, skb, 0);
 	}
@@ -876,7 +893,7 @@
 	return;
 }
 
-static int 
+static int
 ipxitf_create_internal(ipx_interface_definition *idef)
 {
 	ipx_interface	*intrfc;
@@ -920,7 +937,7 @@
 	return 0;
 }
 
-static int 
+static int
 ipxitf_create(ipx_interface_definition *idef)
 {
 	struct device	*dev;
@@ -928,7 +945,7 @@
 	struct datalink_proto	*datalink = NULL;
 	ipx_interface	*intrfc;
 
-	if (idef->ipx_special == IPX_INTERNAL) 
+	if (idef->ipx_special == IPX_INTERNAL)
 		return ipxitf_create_internal(idef);
 
 	if ((idef->ipx_special == IPX_PRIMARY) && (ipx_primary_net != NULL))
@@ -939,7 +956,7 @@
 		return -EADDRINUSE;
 
 	switch (idef->ipx_dlink_type) {
-	case IPX_FRAME_ETHERII: 
+	case IPX_FRAME_ETHERII:
 		dlink_type = htons(ETH_P_IPX);
 		datalink = pEII_datalink;
 		break;
@@ -964,11 +981,11 @@
 		break;
 	}
 
-	if (datalink == NULL) 
+	if (datalink == NULL)
 		return -EPROTONOSUPPORT;
 
 	dev=dev_get(idef->ipx_device);
-	if (dev==NULL) 
+	if (dev==NULL)
 		return -ENODEV;
 
 	if (!(dev->flags & IFF_UP))
@@ -978,7 +995,7 @@
 	if(dev->addr_len>IPX_NODE_LEN)
 		return -EINVAL;
 
-	if ((intrfc = ipxitf_find_using_phys(dev, dlink_type)) == NULL) 
+	if ((intrfc = ipxitf_find_using_phys(dev, dlink_type)) == NULL)
 	{
 		/* Ok now create */
 		intrfc=(ipx_interface *)kmalloc(sizeof(ipx_interface),GFP_ATOMIC);
@@ -991,14 +1008,14 @@
 		intrfc->if_sklist = NULL;
 		intrfc->if_sknum = IPX_MIN_EPHEMERAL_SOCKET;
 		/* Setup primary if necessary */
-		if ((idef->ipx_special == IPX_PRIMARY)) 
+		if ((idef->ipx_special == IPX_PRIMARY))
 			ipx_primary_net = intrfc;
 		intrfc->if_internal = 0;
 		intrfc->if_ipx_offset = dev->hard_header_len + datalink->header_length;
 		if(memcmp(idef->ipx_node, "\000\000\000\000\000\000", IPX_NODE_LEN)==0)
 		{
 			memset(intrfc->if_node, 0, IPX_NODE_LEN);
-			memcpy((char *)&(intrfc->if_node[IPX_NODE_LEN-dev->addr_len]), 
+			memcpy((char *)&(intrfc->if_node[IPX_NODE_LEN-dev->addr_len]),
 				dev->dev_addr, dev->addr_len);
 		}
 		else
@@ -1007,13 +1024,13 @@
 	}
 
 	/* If the network number is known, add a route */
-	if (intrfc->if_netnum == 0L) 
+	if (intrfc->if_netnum == 0L)
 		return 0;
 
 	return ipxitf_add_local_route(intrfc);
 }
 
-static int 
+static int
 ipxitf_delete(ipx_interface_definition *idef)
 {
 	struct device	*dev = NULL;
@@ -1057,7 +1074,7 @@
 	case ETH_P_802_3: datalink = p8023_datalink; break;
 	default: return NULL;
 	}
-	
+
 	if (dev == NULL)
 		return NULL;
 
@@ -1073,10 +1090,10 @@
 		intrfc->if_sklist = NULL;
 		intrfc->if_internal = 0;
 		intrfc->if_sknum = IPX_MIN_EPHEMERAL_SOCKET;
-		intrfc->if_ipx_offset = dev->hard_header_len + 
+		intrfc->if_ipx_offset = dev->hard_header_len +
 			datalink->header_length;
 		memset(intrfc->if_node, 0, IPX_NODE_LEN);
-		memcpy((char *)&(intrfc->if_node[IPX_NODE_LEN-dev->addr_len]), 
+		memcpy((char *)&(intrfc->if_node[IPX_NODE_LEN-dev->addr_len]),
 			dev->dev_addr, dev->addr_len);
 		ipxitf_insert(intrfc);
 	}
@@ -1084,7 +1101,7 @@
 	return intrfc;
 }
 
-static int 
+static int
 ipxitf_ioctl_real(unsigned int cmd, void *arg)
 {
 	int err;
@@ -1150,7 +1167,7 @@
 	}
 }
 
-static int 
+static int
 ipxitf_ioctl(unsigned int cmd, void *arg)
 {
 	int ret;
@@ -1159,11 +1176,11 @@
 	MOD_DEC_USE_COUNT;
 	return ret;
 }
-/*******************************************************************************************************************\
-*													            *
-*	            			Routing tables for the IPX socket layer				            *
-*														    *
-\*******************************************************************************************************************/
+/***************************************************************************\
+*								            *
+*		Routing tables for the IPX socket layer		            *
+*									    *
+\***************************************************************************/
 
 static ipx_route *
 ipxrtr_lookup(unsigned long net)
@@ -1220,7 +1237,7 @@
 	}
 }
 
-static int 
+static int
 ipxrtr_create(ipx_route_definition *rd)
 {
 	ipx_interface *intrfc;
@@ -1234,7 +1251,7 @@
 }
 
 
-static int 
+static int
 ipxrtr_delete(long net)
 {
 	ipx_route	**r;
@@ -1249,7 +1266,7 @@
 			*r = tmp->ir_next;
 			kfree_s(tmp, sizeof(ipx_route));
 			return 0;
-		} 
+		}
 		r = &(tmp->ir_next);
 	}
 
@@ -1259,13 +1276,13 @@
 /*
  *	Checksum routine for IPX
  */
- 
+
 /* Note: We assume ipx_tctrl==0 and htons(length)==ipx_pktsize */
 
-static __u16 ipx_set_checksum(ipx_packet *packet,int length) 
+static __u16 ipx_set_checksum(ipx_packet *packet,int length)
 {
-	/* 
-	 *	NOTE: sum is a net byte order quantity, which optimizes the 
+	/*
+	 *	NOTE: sum is a net byte order quantity, which optimizes the
 	 *	loop. This only works on big and little endian machines. (I
 	 *	don't know of a machine that isn't.)
 	 */
@@ -1279,7 +1296,7 @@
 	__u16 *p=(__u16 *)&packet->ipx_pktsize;
 
 	/*
-	 *	Number of complete words 
+	 *	Number of complete words
 	 */
 
 	__u32 i=length>>1;
@@ -1288,14 +1305,14 @@
 	packet->ipx_tctrl = 0;     /* hop count excluded from checksum calc */
 
 	/*
-	 *	Loop through all complete words except the checksum field 
+	 *	Loop through all complete words except the checksum field
 	 */
 
 	while(--i)
 		sum+=*p++;
 
 	/*
-	 *	Add on the last part word if it exists 
+	 *	Add on the last part word if it exists
 	 */
 
 	if(packet->ipx_pktsize&htons(1))
@@ -1303,22 +1320,22 @@
 
 	packet->ipx_tctrl = hops;
 	/*
-	 *	Do final fixup 
+	 *	Do final fixup
 	 */
-	 
+
 	sum=(sum&0xffff)+(sum>>16);
 
 	/*
-	 *	It's a pity there's no concept of carry in C 
+	 *	It's a pity there's no concept of carry in C
 	 */
 
 	if(sum>=0x10000)
 		sum++;
-		
+
 	return ~sum;
 };
 
- 
+
 /*
  *	Route an outgoing frame from a socket.
  */
@@ -1332,14 +1349,14 @@
 	int ipx_offset;
 	ipx_route *rt = NULL;
 	int err;
-	
+
 	/* Find the appropriate interface on which to send packet */
-	if ((usipx->sipx_network == 0L) && (ipx_primary_net != NULL)) 
+	if ((usipx->sipx_network == 0L) && (ipx_primary_net != NULL))
 	{
 		usipx->sipx_network = ipx_primary_net->if_netnum;
 		intrfc = ipx_primary_net;
-	} 
-	else 
+	}
+	else
 	{
 		rt = ipxrtr_lookup(usipx->sipx_network);
 		if (rt==NULL) {
@@ -1347,7 +1364,7 @@
 		}
 		intrfc = rt->ir_intrfc;
 	}
-	
+
 	ipx_offset = intrfc->if_ipx_offset;
 	size=sizeof(ipx_packet)+len;
 	size += ipx_offset;
@@ -1372,7 +1389,7 @@
 #ifdef CONFIG_IPX_INTERN
 	memcpy(ipx->ipx_source.node, sk->protinfo.af_ipx.node, IPX_NODE_LEN);
 #else
-	if ((err = ntohs(sk->protinfo.af_ipx.port)) == 0x453 || err == 0x452)  
+	if ((err = ntohs(sk->protinfo.af_ipx.port)) == 0x453 || err == 0x452)
 	{
 		/* RIP/SAP special handling for mars_nwe */
 		ipx->ipx_source.net = intrfc->if_netnum;
@@ -1394,24 +1411,24 @@
 	/*
 	 *	Apply checksum. Not allowed on 802.3 links.
 	 */
-	 
+
 	if(sk->no_check || intrfc->if_dlink_type==IPX_FRAME_8023)
 		ipx->ipx_checksum=0xFFFF;
 	else
 		ipx->ipx_checksum=ipx_set_checksum(ipx, len+sizeof(ipx_packet));
 
-#ifdef CONFIG_FIREWALL	
+#ifdef CONFIG_FIREWALL
 	if(call_out_firewall(PF_IPX, skb->dev, ipx, NULL)!=FW_ACCEPT)
 	{
 		kfree_skb(skb, FREE_WRITE);
 		return -EPERM;
 	}
 #endif
-	
-	return ipxitf_send(intrfc, skb, (rt && rt->ir_routed) ? 
+
+	return ipxitf_send(intrfc, skb, (rt && rt->ir_routed) ?
 				rt->ir_router_node : ipx->ipx_dest.node);
 }
-	
+
 static int
 ipxrtr_route_skb(struct sk_buff *skb)
 {
@@ -1426,11 +1443,56 @@
 		return 0;
 	}
 	i = r->ir_intrfc;
-	(void)ipxitf_send(i, skb, (r->ir_routed) ? 
+	(void)ipxitf_send(i, skb, (r->ir_routed) ?
 			r->ir_router_node : ipx->ipx_dest.node);
 	return 0;
 }
 
+static int
+ipxrtr_route_skb_type20(ipx_interface *intrfc, struct sk_buff *skb)
+{
+	ipx_packet *ipx = (ipx_packet *) (skb->h.raw);
+	unsigned long *net_num = (long *) (ipx + 1);
+	ipx_interface *ipx_if;
+	struct sk_buff *skb2;
+	int i;
+
+	if (ipx->ipx_tctrl > 8)
+	{
+		kfree_skb(skb, FREE_READ);
+		return 0;
+	}
+
+	for(i = 0; i < ipx->ipx_tctrl; ++i)
+	if(intrfc->if_netnum == net_num[i])
+	{
+		kfree_skb(skb, FREE_READ);
+		return 0;
+	}
+
+	net_num[i] = intrfc->if_netnum;
+	++ipx->ipx_tctrl;
+
+	for(ipx_if = ipx_interfaces; ipx_if != NULL; ipx_if = ipx_if->if_next)
+	{
+		for(i = 0; i < ipx->ipx_tctrl; ++i)
+		if(ipx_if->if_netnum == net_num[i])
+			break;
+
+		if(i != ipx->ipx_tctrl)
+			continue;
+
+		ipx->ipx_dest.net = ipx_if->if_netnum;
+
+		skb2 = skb_clone(skb, GFP_ATOMIC);
+		ipxrtr_route_skb(skb2);
+	}
+
+	kfree_skb(skb, FREE_READ);
+
+	return 0;
+}
+
 /*
  *	We use a normal struct rtentry for route handling
  */
@@ -1444,19 +1506,19 @@
 	err=verify_area(VERIFY_READ,arg,sizeof(rt));
 	if(err)
 		return err;
-		
+
 	memcpy_fromfs(&rt,arg,sizeof(rt));
-	
+
 	sg=(struct sockaddr_ipx *)&rt.rt_gateway;
 	st=(struct sockaddr_ipx *)&rt.rt_dst;
-	
+
 	if(!(rt.rt_flags&RTF_GATEWAY))
 		return -EINVAL;		/* Direct routes are fixed */
 	if(sg->sipx_family!=AF_IPX)
 		return -EINVAL;
 	if(st->sipx_family!=AF_IPX)
 		return -EINVAL;
-		
+
 	switch(cmd)
 	{
 		case SIOCDELRT:
@@ -1505,22 +1567,22 @@
 
 	/* Theory.. Keep printing in the same place until we pass offset */
 
-	len += sprintf (buffer,"%-11s%-15s%-9s%-11s%s\n", "Network", 
+	len += sprintf (buffer,"%-11s%-15s%-9s%-11s%s\n", "Network",
 		"Node_Address", "Primary", "Device", "Frame_Type");
 	for (i = ipx_interfaces; i != NULL; i = i->if_next) {
 		len += sprintf(buffer+len, "%08lX   ", ntohl(i->if_netnum));
-		len += sprintf (buffer+len,"%02X%02X%02X%02X%02X%02X   ", 
+		len += sprintf (buffer+len,"%02X%02X%02X%02X%02X%02X   ",
 				i->if_node[0], i->if_node[1], i->if_node[2],
 				i->if_node[3], i->if_node[4], i->if_node[5]);
 		len += sprintf(buffer+len, "%-9s", (i == ipx_primary_net) ?
 			"Yes" : "No");
 		len += sprintf (buffer+len, "%-11s", ipx_device_name(i));
-		len += sprintf (buffer+len, "%s\n", 
+		len += sprintf (buffer+len, "%s\n",
 			ipx_frame_name(i->if_dlink_type));
 
 		/* Are we still dumping unwanted data then discard the record */
 		pos=begin+len;
-		
+
 		if(pos<offset) {
 			len=0;			/* Keep dumping into the buffer start */
 			begin=pos;
@@ -1528,13 +1590,13 @@
 		if(pos>offset+length)		/* We have dumped enough */
 			break;
 	}
-	
+
 	/* The data in question runs from begin to begin+len */
 	*start=buffer+(offset-begin);	/* Start of wanted data */
 	len-=(offset-begin);		/* Remove unwanted header data from length */
 	if(len>length)
 		len=length;		/* Remove unwanted tail data from length */
-	
+
 	return len;
 }
 
@@ -1549,28 +1611,28 @@
 
 	/* Theory.. Keep printing in the same place until we pass offset */
 
-#ifdef CONFIG_IPX_INTERN	
-	len += sprintf (buffer,"%-28s%-28s%-10s%-10s%-7s%s\n", "Local_Address", 
+#ifdef CONFIG_IPX_INTERN
+	len += sprintf (buffer,"%-28s%-28s%-10s%-10s%-7s%s\n", "Local_Address",
 #else
-	len += sprintf (buffer,"%-15s%-28s%-10s%-10s%-7s%s\n", "Local_Address", 
+	len += sprintf (buffer,"%-15s%-28s%-10s%-10s%-7s%s\n", "Local_Address",
 #endif
-			"Remote_Address", "Tx_Queue", "Rx_Queue", 
+			"Remote_Address", "Tx_Queue", "Rx_Queue",
 			"State", "Uid");
 	for (i = ipx_interfaces; i != NULL; i = i->if_next) {
 		for (s = i->if_sklist; s != NULL; s = s->next) {
 #ifdef CONFIG_IPX_INTERN
 			len += sprintf(buffer+len,
-				       "%08lX:%02X%02X%02X%02X%02X%02X:%04X  ", 
+				       "%08lX:%02X%02X%02X%02X%02X%02X:%04X  ",
 				 htonl(s->protinfo.af_ipx.intrfc->if_netnum),
 				       s->protinfo.af_ipx.node[0],
-				       s->protinfo.af_ipx.node[1], 
-				       s->protinfo.af_ipx.node[2], 
-				       s->protinfo.af_ipx.node[3], 
-				       s->protinfo.af_ipx.node[4], 
+				       s->protinfo.af_ipx.node[1],
+				       s->protinfo.af_ipx.node[2],
+				       s->protinfo.af_ipx.node[3],
+				       s->protinfo.af_ipx.node[4],
 				       s->protinfo.af_ipx.node[5],
 				       htons(s->protinfo.af_ipx.port));
 #else
-			len += sprintf(buffer+len,"%08lX:%04X  ", 
+			len += sprintf(buffer+len,"%08lX:%04X  ",
 				       htonl(i->if_netnum),
 				       htons(s->protinfo.af_ipx.port));
 #endif
@@ -1578,40 +1640,40 @@
 				len += sprintf(buffer+len, "%-28s", "Not_Connected");
 			} else {
 				len += sprintf (buffer+len,
-					"%08lX:%02X%02X%02X%02X%02X%02X:%04X  ", 
+					"%08lX:%02X%02X%02X%02X%02X%02X:%04X  ",
 					htonl(s->protinfo.af_ipx.dest_addr.net),
 					s->protinfo.af_ipx.dest_addr.node[0],
-					s->protinfo.af_ipx.dest_addr.node[1], 
+					s->protinfo.af_ipx.dest_addr.node[1],
 					s->protinfo.af_ipx.dest_addr.node[2],
-					s->protinfo.af_ipx.dest_addr.node[3], 
+					s->protinfo.af_ipx.dest_addr.node[3],
 					s->protinfo.af_ipx.dest_addr.node[4],
 					s->protinfo.af_ipx.dest_addr.node[5],
 					htons(s->protinfo.af_ipx.dest_addr.sock));
 			}
-			len += sprintf (buffer+len,"%08X  %08X  ", 
+			len += sprintf (buffer+len,"%08X  %08X  ",
 				s->wmem_alloc, s->rmem_alloc);
-			len += sprintf (buffer+len,"%02X     %03d\n", 
+			len += sprintf (buffer+len,"%02X     %03d\n",
 				s->state, SOCK_INODE(s->socket)->i_uid);
-		
+
 			/* Are we still dumping unwanted data then discard the record */
 			pos=begin+len;
-		
+
 			if(pos<offset)
 			{
-				len=0;			/* Keep dumping into the buffer start */
+				len=0;	/* Keep dumping into the buffer start */
 				begin=pos;
 			}
-			if(pos>offset+length)		/* We have dumped enough */
+			if(pos>offset+length)	/* We have dumped enough */
 				break;
 		}
 	}
-	
+
 	/* The data in question runs from begin to begin+len */
 	*start=buffer+(offset-begin);	/* Start of wanted data */
 	len-=(offset-begin);		/* Remove unwanted header data from length */
 	if(len>length)
 		len=length;		/* Remove unwanted tail data from length */
-	
+
 	return len;
 }
 
@@ -1623,16 +1685,16 @@
 	off_t pos=0;
 	off_t begin=0;
 
-	len += sprintf (buffer,"%-11s%-13s%s\n", 
+	len += sprintf (buffer,"%-11s%-13s%s\n",
 			"Network", "Router_Net", "Router_Node");
 	for (rt = ipx_routes; rt != NULL; rt = rt->ir_next)
 	{
 		len += sprintf (buffer+len,"%08lX   ", ntohl(rt->ir_net));
 		if (rt->ir_routed) {
-			len += sprintf (buffer+len,"%08lX     %02X%02X%02X%02X%02X%02X\n", 
-				ntohl(rt->ir_intrfc->if_netnum), 
-				rt->ir_router_node[0], rt->ir_router_node[1], 
-				rt->ir_router_node[2], rt->ir_router_node[3], 
+			len += sprintf (buffer+len,"%08lX     %02X%02X%02X%02X%02X%02X\n",
+				ntohl(rt->ir_intrfc->if_netnum),
+				rt->ir_router_node[0], rt->ir_router_node[1],
+				rt->ir_router_node[2], rt->ir_router_node[3],
 				rt->ir_router_node[4], rt->ir_router_node[5]);
 		} else {
 			len += sprintf (buffer+len, "%-13s%s\n",
@@ -1654,11 +1716,12 @@
 	return len;
 }
 
-/*******************************************************************************************************************\
-*													            *
-*	      Handling for system calls applied via the various interfaces to an IPX socket object		    *
-*														    *
-\*******************************************************************************************************************/
+/***************************************************************************\
+*								            *
+*	Handling for system calls applied via the various interfaces	    *
+*	to an IPX socket object						    *
+*									    *
+\***************************************************************************/
 
 static int ipx_fcntl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
@@ -1673,9 +1736,9 @@
 {
 	ipx_socket *sk;
 	int err,opt;
-	
+
 	sk=(ipx_socket *)sock->data;
-	
+
 	if(optval==NULL)
 		return(-EINVAL);
 
@@ -1683,7 +1746,7 @@
 	if(err)
 		return err;
 	opt=get_fs_long((unsigned long *)optval);
-	
+
 	switch(level)
 	{
 		case SOL_IPX:
@@ -1696,7 +1759,7 @@
 					return -EOPNOTSUPP;
 			}
 			break;
-			
+
 		case SOL_SOCKET:
 			return sock_setsockopt(sk,level,optname,optval,optlen);
 
@@ -1711,7 +1774,7 @@
 	ipx_socket *sk;
 	int val=0;
 	int err;
-	
+
 	sk=(ipx_socket *)sock->data;
 
 	switch(level)
@@ -1727,10 +1790,10 @@
 					return -ENOPROTOOPT;
 			}
 			break;
-			
+
 		case SOL_SOCKET:
 			return sock_getsockopt(sk,level,optname,optval,optlen);
-			
+
 		default:
 			return -EOPNOTSUPP;
 	}
@@ -1790,13 +1853,13 @@
 	sk->socket=sock;
 	sk->type=sock->type;
 	sk->mtu=IPX_MTU;
-	sk->no_check = 1;		/* Checksum off by default */	
+	sk->no_check = 1;		/* Checksum off by default */
 	if(sock!=NULL)
 	{
 		sock->data=(void *)sk;
 		sk->sleep=sock->wait;
 	}
-	
+
 	sk->state_change=def_callback1;
 	sk->data_ready=def_callback2;
 	sk->write_space=def_callback1;
@@ -1825,7 +1888,7 @@
 	return(ipx_create(newsock,SOCK_DGRAM));
 }
 
-static unsigned short 
+static unsigned short
 ipx_first_free_socketnum(ipx_interface *intrfc)
 {
 	unsigned short	socketNum = intrfc->if_sknum;
@@ -1842,21 +1905,21 @@
 	intrfc->if_sknum = socketNum;
 	return	ntohs(socketNum);
 }
-	
+
 static int ipx_bind(struct socket *sock, struct sockaddr *uaddr,int addr_len)
 {
 	ipx_socket *sk;
 	ipx_interface *intrfc;
 	struct sockaddr_ipx *addr=(struct sockaddr_ipx *)uaddr;
-	
+
 	sk=(ipx_socket *)sock->data;
-	
+
 	if(sk->zapped==0)
 		return -EIO;
-		
+
 	if(addr_len!=sizeof(struct sockaddr_ipx))
 		return -EINVAL;
-	
+
 	intrfc = ipxitf_find_using_net(addr->sipx_network);
 	if (intrfc == NULL)
 		return -EADDRNOTAVAIL;
@@ -1894,8 +1957,8 @@
 		{
 			memcpy(sk->protinfo.af_ipx.node, addr->sipx_node, IPX_NODE_LEN);
 		}
-		if (ipxitf_find_internal_socket(intrfc, 
-			sk->protinfo.af_ipx.node, 
+		if (ipxitf_find_internal_socket(intrfc,
+			sk->protinfo.af_ipx.node,
 			sk->protinfo.af_ipx.port) != NULL)
 		{
 			if(sk->debug)
@@ -1911,14 +1974,14 @@
 		 * with the ipx routing ioctl()
 		 */
 
-		memcpy(sk->protinfo.af_ipx.node, intrfc->if_node, 
+		memcpy(sk->protinfo.af_ipx.node, intrfc->if_node,
 			IPX_NODE_LEN);
-		
+
 		if(ipxitf_find_socket(intrfc, addr->sipx_port)!=NULL) {
 			if(sk->debug)
 				printk("IPX: bind failed because port %X in"
 				       " use.\n", (int)addr->sipx_port);
-			return -EADDRINUSE;	   
+			return -EADDRINUSE;
 		}
 	}
 
@@ -1931,7 +1994,7 @@
 		if(sk->debug)
 			printk("IPX: bind failed because port %X in use.\n",
 				(int)addr->sipx_port);
-		return -EADDRINUSE;	   
+		return -EADDRINUSE;
 	}
 
 #endif
@@ -1948,20 +2011,20 @@
 {
 	ipx_socket *sk=(ipx_socket *)sock->data;
 	struct sockaddr_ipx *addr;
-	
-	sk->state = TCP_CLOSE;	
+
+	sk->state = TCP_CLOSE;
 	sock->state = SS_UNCONNECTED;
 
 	if(addr_len!=sizeof(*addr))
 		return(-EINVAL);
 	addr=(struct sockaddr_ipx *)uaddr;
-	
+
 	if(sk->protinfo.af_ipx.port==0)
 	/* put the autobinding in */
 	{
 		struct sockaddr_ipx uaddr;
 		int ret;
-	
+
 		uaddr.sipx_port = 0;
 		uaddr.sipx_network = 0L;
 #ifdef CONFIG_IPX_INTERN
@@ -1972,7 +2035,7 @@
 				sizeof(struct sockaddr_ipx));
 		if (ret != 0) return (ret);
 	}
-	
+
 	if(ipxrtr_lookup(addr->sipx_network)==NULL)
 		return -ENETUNREACH;
 	sk->protinfo.af_ipx.dest_addr.net=addr->sipx_network;
@@ -2005,11 +2068,11 @@
 	ipx_address *addr;
 	struct sockaddr_ipx sipx;
 	ipx_socket *sk;
-	
+
 	sk=(ipx_socket *)sock->data;
-	
+
 	*uaddr_len = sizeof(struct sockaddr_ipx);
-		
+
 	if(peer) {
 		if(sk->state!=TCP_ESTABLISHED)
 			return -ENOTCONN;
@@ -2023,7 +2086,7 @@
 #ifdef CONFIG_IPX_INTERN
 			memcpy(sipx.sipx_node, sk->protinfo.af_ipx.node, IPX_NODE_LEN);
 #else
-			memcpy(sipx.sipx_node, 
+			memcpy(sipx.sipx_node,
 				sk->protinfo.af_ipx.intrfc->if_node, IPX_NODE_LEN);
 #endif
 
@@ -2033,7 +2096,7 @@
 		}
 		sipx.sipx_port = sk->protinfo.af_ipx.port;
 	}
-		
+
 	sipx.sipx_family = AF_IPX;
 	sipx.sipx_type = sk->protinfo.af_ipx.type;
 	memcpy(uaddr,&sipx,sizeof(sipx));
@@ -2102,18 +2165,18 @@
 	/* NULL here for pt means the packet was looped back */
 	ipx_interface	*intrfc;
 	ipx_packet *ipx;
-	
-	
+
+
 	ipx=(ipx_packet *)skb->h.raw;
-	
+
 	/* Too small */
-	
+
 	if(ntohs(ipx->ipx_pktsize)<sizeof(ipx_packet)) {
 		kfree_skb(skb,FREE_READ);
 		return 0;
 	}
-	
-	if(ipx->ipx_checksum!=IPX_NO_CHECKSUM) 
+
+	if(ipx->ipx_checksum!=IPX_NO_CHECKSUM)
 	{
 		if(ipx_set_checksum(ipx, ntohs(ipx->ipx_pktsize))!=ipx->ipx_checksum)
 		{
@@ -2121,13 +2184,13 @@
 			return 0;
 		}
 	}
-	
+
 	/* Determine what local ipx endpoint this is */
 	intrfc = ipxitf_find_using_phys(dev, pt->type);
-	if (intrfc == NULL) 
+	if (intrfc == NULL)
 	{
 		if (ipxcfg_auto_create_interfaces &&
-		    ntohl(ipx->ipx_dest.net)!=0L) 
+		    ntohl(ipx->ipx_dest.net)!=0L)
 		{
 			intrfc = ipxitf_auto_create(dev, pt->type);
 		}
@@ -2150,20 +2213,20 @@
 	struct sockaddr_ipx local_sipx;
 	int retval;
 
-	if (sk->zapped) 
+	if (sk->zapped)
 		return -EIO; /* Socket not bound */
-	if(flags) 
+	if(flags)
 		return -EINVAL;
-		
-	if(usipx) 
+
+	if(usipx)
 	{
-		if(sk->protinfo.af_ipx.port == 0) 
+		if(sk->protinfo.af_ipx.port == 0)
 		{
 			struct sockaddr_ipx uaddr;
 			int ret;
 
 			uaddr.sipx_port = 0;
-			uaddr.sipx_network = 0L; 
+			uaddr.sipx_network = 0L;
 #ifdef CONFIG_IPX_INTERN
 			memcpy(uaddr.sipx_node, sk->protinfo.af_ipx.intrfc
 				->if_node, IPX_NODE_LEN);
@@ -2178,7 +2241,7 @@
 		if(usipx->sipx_family != AF_IPX)
 			return -EINVAL;
 	}
-	else 
+	else
 	{
 		if(sk->state!=TCP_ESTABLISHED)
 			return -ENOTCONN;
@@ -2189,9 +2252,9 @@
 		usipx->sipx_network=sk->protinfo.af_ipx.dest_addr.net;
 		memcpy(usipx->sipx_node,sk->protinfo.af_ipx.dest_addr.node,IPX_NODE_LEN);
 	}
-	
+
 	retval = ipxrtr_route_packet(sk, usipx, msg->msg_iov, len, noblock);
-	if (retval < 0) 
+	if (retval < 0)
 		return retval;
 
 	return len;
@@ -2208,10 +2271,10 @@
 	int truesize;
 	struct sk_buff *skb;
 	int er;
-	
+
 	if(sk->err)
 		return sock_error(sk);
-	
+
 	if (sk->zapped)
 		return -EIO;
 
@@ -2219,7 +2282,7 @@
 	skb=skb_recv_datagram(sk,flags,noblock,&er);
 	if(skb==NULL)
 		return er;
-	
+
 	if(addr_len)
 		*addr_len=sizeof(*sipx);
 
@@ -2227,7 +2290,7 @@
 	truesize=ntohs(ipx->ipx_pktsize) - sizeof(ipx_packet);
 	copied = (truesize > size) ? size : truesize;
 	skb_copy_datagram_iovec(skb,sizeof(struct ipx_packet),msg->msg_iov,copied);
-	
+
 	if(sipx)
 	{
 		sipx->sipx_family=AF_IPX;
@@ -2238,7 +2301,7 @@
 	}
 	skb_free_datagram(sk, skb);
 	return(truesize);
-}		
+}
 
 static int ipx_shutdown(struct socket *sk,int how)
 {
@@ -2248,7 +2311,7 @@
 static int ipx_select(struct socket *sock , int sel_type, select_table *wait)
 {
 	ipx_socket *sk=(ipx_socket *)sock->data;
-	
+
 	return datagram_select(sk,sel_type,wait);
 }
 
@@ -2257,7 +2320,7 @@
 	int err;
 	long amount=0;
 	ipx_socket *sk=(ipx_socket *)sock->data;
-	
+
 	switch(cmd)
 	{
 		case TIOCOUTQ:
@@ -2293,7 +2356,7 @@
 				return -EPERM;
 		case SIOCGIFADDR:
 			return(ipxitf_ioctl(cmd,(void *)arg));
-		case SIOCIPXCFGDATA: 
+		case SIOCIPXCFGDATA:
 		{
 			err=verify_area(VERIFY_WRITE,(void *)arg,
 				sizeof(ipx_config_data));
@@ -2343,7 +2406,6 @@
 
 static struct proto_ops ipx_proto_ops = {
 	AF_IPX,
-	
 	ipx_create,
 	ipx_dup,
 	ipx_release,
@@ -2365,7 +2427,7 @@
 
 /* Called by protocol.c on kernel start up */
 
-static struct packet_type ipx_8023_packet_type = 
+static struct packet_type ipx_8023_packet_type =
 
 {
 	0,	/* MUTTER ntohs(ETH_P_8023),*/
@@ -2375,7 +2437,7 @@
 	NULL,
 };
 
-static struct packet_type ipx_dix_packet_type = 
+static struct packet_type ipx_dix_packet_type =
 {
 	0,	/* MUTTER ntohs(ETH_P_IPX),*/
 	NULL,		/* All devices */
@@ -2426,23 +2488,23 @@
 	p8023_datalink = make_8023_client();
 	ipx_8023_packet_type.type=htons(ETH_P_802_3);
 	dev_add_pack(&ipx_8023_packet_type);
-	
+
 	if ((p8022_datalink = register_8022_client(ipx_8022_type, ipx_rcv)) == NULL)
 		printk(KERN_CRIT "IPX: Unable to register with 802.2\n");
 
 	if ((p8022tr_datalink = register_8022tr_client(ipx_8022_type, ipx_rcv)) == NULL)
 		printk(KERN_CRIT "IPX: Unable to register with 802.2TR\n");
- 
+
 	if ((pSNAP_datalink = register_snap_client(ipx_snap_id, ipx_rcv)) == NULL)
 		printk(KERN_CRIT "IPX: Unable to register with SNAP\n");
-	
+
 	register_netdevice_notifier(&ipx_dev_notifier);
 #ifdef CONFIG_PROC_FS
 	proc_net_register(&ipx_procinfo);
 	proc_net_register(&ipx_if_procinfo);
 	proc_net_register(&ipx_rt_procinfo);
-#endif	
-		
+#endif
+
 	printk(KERN_INFO "Swansea University Computer Society IPX 0.34 for NET3.035\n");
 	printk(KERN_INFO "IPX Portions Copyright (c) 1995 Caldera, Inc.\n");
 }
@@ -2452,13 +2514,13 @@
  *
  * Use counts are incremented/decremented when
  * sockets are created/deleted.
- * 
+ *
  * Routes are always associated with an interface, and
  * allocs/frees will remain properly accounted for by
  * their associated interfaces.
- * 
+ *
  * Ergo, before the ipx module can be removed, all IPX
- * sockets be closed from user space. 
+ * sockets be closed from user space.
  */
 
 static void
@@ -2476,7 +2538,7 @@
 	proc_net_unregister(PROC_NET_IPX_ROUTE);
 	proc_net_unregister(PROC_NET_IPX_INTERFACE);
 	proc_net_unregister(PROC_NET_IPX);
-#endif	
+#endif
 
 	unregister_netdevice_notifier(&ipx_dev_notifier);
 
