Commit 2a342179 authored by Linus Torvalds's avatar Linus Torvalds

Linux 2.1.89pre2

[sct] a patch against ipc/shm.c was missing from my swap patches,
      and another fix for spurious warnings about shared dirty pages.

[changelog pieced together by davej]
parent 717def95
......@@ -37,7 +37,8 @@ N: C. Scott Ananian
E: cananian@alumni.princeton.edu
W: http://www.pdos.lcs.mit.edu/~cananian
P: 1024/85AD9EED AD C0 49 08 91 67 DF D7 FA 04 1A EE 09 E8 44 B0
D: pty improvements.
D: Unix98 pty support.
D: APM update to 1.2 spec.
N: Erik Andersen
E: andersee@debian.org
......@@ -930,8 +931,8 @@ S: Unix Centre of Pedagogical Faculty, University of South Bohemia
N: Bas Laarhoven
E: bas@vimec.nl
D: Loadable modules and ftape driver
S: Mr. v. Boemellaan 39
S: NL-5237 KA 's-Hertogenbosch
S: J. Obrechtstr 23
S: NL-5216 GP 's-Hertogenbosch
S: The Netherlands
N: Savio Lam
......@@ -1133,8 +1134,8 @@ S: USA
N: Dirk Melchers
E: dirk@merlin.nbg.sub.org
D: 8 bit XT hard disk driver for OMTI5520
S: Heidackerstrass 19
S: D-91056 Erlangen
S: Schloessleinsgasse 31
S: D-90453 Nuernberg
S: Germany
N: Michael Meskes
......
......@@ -14,10 +14,10 @@ functional and running at least 2.0.x.
therefore owes credit to the same people as that file (Jared Mauch,
Axel Boldt, Alessandro Sigala, and countless other users all over the
'net). Please feel free to submit changes, corrections, gripes,
flames, money, etc. to me (gt1355b@prism.gatech.edu). If you do so,
you don't need to bother doing so in the form of a diff, as this is
generated by texinfo so a diff is useless anyway (though I can
incorporate one by hand if you insist upon sending it that way ;-).
flames, money, etc. to me (kaboom@gatech.edu). If you do so, you don't
need to bother doing so in the form of a diff, as this is generated by
texinfo so a diff is useless anyway (though I can incorporate one by
hand if you insist upon sending it that way ;-).
Check out http://www.cviog.uga.edu/Misc/info/LinuxBleed.html for an
HTML-ized shopping list.
......@@ -26,8 +26,14 @@ HTML-ized shopping list.
http://www.datanet.hu/generations/linux/Changes2.html is an
English-language HTML version.
Last updated: September 13. 1997
Current Author: Chris Ricker (gt1355b@prism.gatech.edu).
The most current version should always be available from
http://cyberbuzz.gatech.edu/kaboom/linux/ as well.
Also, don't forget http://www.linuxhq.com/ for all your Linux kernel
needs.
Last updated: February 16. 1998
Current Author: Chris Ricker (kaboom@gatech.edu).
Current Minimal Requirements
****************************
......@@ -36,21 +42,24 @@ Current Minimal Requirements
encountered a bug! If you're unsure what version you're currently
running, the suggested command should tell you.
- Kernel modules modutils-2.1.55 ; insmod -V
- Kernel modules modutils-2.1.85 ; insmod -V
- Gnu C 2.7.2.3 ; gcc --version
- Binutils 2.8.1.0.1 ; ld -v
- Linux C Library 5.4.38 ; ls -l /lib/libc.so.*
- Dynamic Linker (ld.so) 1.9.5 ; ldd -v
- Linux C++ Library 2.7.2.8 ; ls -l /usr/lib/libg++.so.*
- Procps 1.2 ; ps --version
- Procps 1.2.5 ; ps --version
- Procinfo 0.11 ; procinfo -v
- Mount 2.6h ; mount --version
- Mount 2.7l ; mount --version
- Net-tools 1.41 ; hostname -V
- Loadlin 1.6a
- Sh-utils 1.16 ; expr --v
- Autofs 0.3.11 ; automount --version
- Autofs 0.3.11 ; automount --version
- NFS 0.4.21 ; showmount --version
- Bash 1.14.7 ; bash -version
- Ncpfs 2.1.1 ; ncpmount -v
- Pcmcia-cs 2.9.12
- PPP 2.3.3 ; pppd -v
Upgrade notes
*************
......@@ -76,7 +85,7 @@ accordingly.
For modules to work, you need to be running libc-5.4.x or greater.
Since updates to libc fix other problems as well (security flaws, for
example) and since 5.4.7 is missing a few needed symbols, try to get
the latest 5.4.x you can. Currently, libc-5.4.38 is the latest public
the latest 5.4.x you can. Currently, libc-5.4.44 is the latest public
release.
If you upgrade to libc-5.4.x, you also have to upgrade your dynamic
......@@ -90,10 +99,14 @@ unless you're running glibc2 / libc6.
If you upgrade to libc-5.4.x, you may also need to upgrade ypbind if
you're using NIS.
If you upgrade to libc-5.4.44, please read and pay attention to its
accompanying release notes. The section about it breaking make is not
a joke.
Modules
=======
You need to upgrade to modutils-2.1.55 for kernels 2.1.55 and later.
You need to upgrade to modutils-2.1.85 for kernels 2.1.85 and later.
This version will also work with 2.0.x kernels.
Binutils
......@@ -108,9 +121,13 @@ Gnu C
You need at least GCC 2.7.2 to compile the kernel. If you're
upgrading from an earlier release, you might as well get GCC 2.7.2.3,
the latest public release. If you already have GCC 2.7.2 on your
system, you don't have to upgrade just so the kernel will work (though
feel free to upgrade if you want the gcc bug fixes).
the latest stable public release. If you already have GCC 2.7.2 on
your system, you don't have to upgrade just so the kernel will work
(though feel free to upgrade if you want the gcc bug fixes).
Note that the latest compilers (egcs, pgcc, gcc 2.8) may do Bad
Things while compiling your kernel, particularly if absurd
optimizations (like -O9) are used. Caveat emptor.
Networking Changes
==================
......@@ -190,18 +207,13 @@ parallel port may no longer be where you expect it; for example, LPT1
/dev/lp0 with the new Plug-and-Play driver. If printing breaks with
the new driver, try checking your lpd configuration.
pppd
====
This kernel version needs a minor bugfix to pppd. See
Documentation/networking/ppp.txt for more information.
Syncookies
==========
When you build your kernel with Syncookie support (CONFIG_SYN_COOKIES)
the syncookie code still defaults to off (unlike the 2.0.30+ behaviour).
You have to explicitely enable it by add a line like
echo 1 >/proc/sys/net/ipv4/tcp_syncookies
to one of your startup scripts (e.g. /etc/rc.d/rc.local on a redhat system)
When you build your kernel with Syncookie support
(CONFIG_SYN_COOKIES) the syncookie code still defaults to off (unlike
the 2.0.30+ behavior). You have to explicitly enable it by issuing the
following command: echo 1 > /proc/sys/net/ipv4/tcp_syncookies
Bash
====
......@@ -210,6 +222,24 @@ Bash
cause problems when compiling modules. Upgrade to at least 1.14 to fix
this problem.
Ncpfs
=====
To mount NetWare shares, you'll need to upgrade to a more recent
version of the ncpfs utils.
Pcmcia-cs
=========
If you use pcmcia cards, you'll need to upgrade the daemon and
support utils to the latest release of pcmcia-cs.
PPP
===
Due to changes in the routing code, those of you using PPP
networking will need to upgrade your pppd.
Where to get the files
**********************
......@@ -263,16 +293,16 @@ ftp://sunsite.unc.edu/pub/Linux/GCC/ld.so-1.9.5.tar.gz
Modules utilities
=================
The 2.1.55 release:
ftp://ftp.redhat.com/pub/alphabits/modutils/modutils-2.1.55.tar.gz
ftp://ftp.kernel.org/pub/linux/kernel/v2.1/modutils-2.1.55.tar.gz
The 2.1.85 release:
ftp://ftp.redhat.com/pub/alphabits/modutils/modutils-2.1.85.tar.gz
ftp://ftp.kernel.org/pub/linux/kernel/v2.1/modutils-2.1.85.tar.gz
Procps utilities
================
The 1.2 release:
ftp://tsx-11.mit.edu/pub/linux/sources/usr.bin/procps-1.2.tar.gz
ftp://sunsite.unc.edu/pub/Linux/system/status/ps/procps-1.2.tgz
ftp://tsx-11.mit.edu/pub/linux/sources/usr.bin/procps-1.2.5.tar.gz
ftp://sunsite.unc.edu/pub/Linux/system/status/ps/procps-1.2.5.tgz
Procinfo utilities
==================
......@@ -317,8 +347,8 @@ ftp://prep.ai.mit.edu/pub/gnu/sh-utils-1.16.tar.gz
Mount
=====
The 2.6h release:
ftp://ftp.win.tue.nl/pub/linux/util/mount-2.6h.tar.gz
The 2.7l release:
ftp://ftp.win.tue.nl/pub/linux/util/mount/mount-2.7l.tar.gz
Autofs
======
......@@ -336,9 +366,8 @@ ftp://linux.nrao.edu/pub/people/okir/linux-nfs-0.4.21.tar.gz
Net-tools
=========
The 1.41 release:
ftp://ftp.london.uk.eu.org/pub/ipv6/net-tools-1.41.tar.gz
ftp://ftp.cs-ipv6.lancs.ac.uk/pub/Code/Linux/Net_Tools/net-tools-1.41.tar.gz
The 1.432 release:
ftp://ftp.cs-ipv6.lancs.ac.uk/pub/Code/Linux/Net_Tools/net-tools-1.432.tar.gz
Ypbind
======
......@@ -352,6 +381,25 @@ Bash
The 1.14.7 release:
ftp://prep.ai.mit.edu/pub/gnu/bash-1.14.7.tar.gz
Ncpfs
=====
The 2.1.1 release:
ftp://ftp.gwdg.de/pub/linux/misc/ncpfs/ncpfs-2.1.1.tgz
ftp://sunsite.unc.edu/pub/Linux/system/Filesystems/ncpfs/ncpfs-2.1.1.tgz
Pcmcia-cs
=========
The 1.9.12 release:
ftp://hyper.stanford.edu/pub/pcmcia/pcmcia-cs-2.9.12.tar.gz
PPP
===
The 2.3.3 release:
ftp://cs.anu.edu.au/pub/software/ppp/ppp-2.3.3.tar.gz
Other Info
==========
......@@ -380,5 +428,5 @@ more information and the files.
Please send info about any other packages that 2.1.x "broke" or about
any new features of 2.1.x that require extra or new packages for use to
Chris Ricker (gt1355b@prism.gatech.edu).
Chris Ricker (kaboom@gatech.edu).
......@@ -6477,6 +6477,13 @@ CONFIG_APM_POWER_OFF
powers off the computer). As with the other APM options, this
option may not work reliably with some APM BIOS implementations.
Ignore multiple suspend/standby events
CONFIG_APM_IGNORE_MULTIPLE_SUSPEND
This option is necessary on the Thinkpad 560, but should work on all
other laptops. When the APM BIOS returns multiple suspend or standby
events while one is already being processed they will be ignored.
Without this the Thinkpad 560 has troubles with apmd, and pcmcia-cs.
Watchdog Timer Support
CONFIG_WATCHDOG
If you say Y here (and to one of the following options) and create a
......
......@@ -65,6 +65,11 @@ quiet The file system will not return an error for disallowed
verbose The volume name, file system type and block size will
be written to the syslog when the filesystem is mounted.
mufs The filesystem is really a muFS, also it doesn't
identify itself as one. This option is neccessary if
the filesystem wasn't formatted as muFS, but is used
as one.
prefix=path Path will be prefixed to every absolute path name of
symbolic links on an AFFS partition. Default = /
......
......@@ -8,7 +8,7 @@ I've learned while writing lofs...
The VFS relatively simple, but it is nice not to have to browse through
pages of code to determine what is expected when writing a filesystem.
Hopefully this helps anyone attempting such a feat, as well as clearing up
a few important points/dependancies.
a few important points/dependencies.
register_filesystem (struct file_system_type *fstype)
......
......@@ -285,7 +285,7 @@ README for the ISDN-subsystem
5. Application
a) For some card-types, firmware has to be loaded into the cards, before
proceeding with device-independant setup. See README.<yourDriver>
proceeding with device-independent setup. See README.<yourDriver>
for how to do that.
b) If you only intend to use ttys, you are nearly ready now.
......
......@@ -567,7 +567,7 @@ Syntax: ataflop=<drive type>[,<trackbuffering>[,<steprateA>[,<steprateB>]]]
type.
The second parameter <trackbuffer> tells the kernel whether to use
track buffering (1) or not (0). The default is machine dependant:
track buffering (1) or not (0). The default is machine-dependent:
no for the Medusa and yes for all others.
With the two following parameters, you can change the default
......
......@@ -872,7 +872,7 @@ asmlinkage unsigned long osf_setsysinfo(unsigned long op, void *buffer,
software but have not been seen, enable the exception in
hardware so that we can update our software status mask. */
fpcr = rdfpcr() & (~FPCR_MASK | FPCR_DYN_MASK);
fpcr = ieee_swcr_to_fpcr(swcr | (~swcr & IEEE_STATUS_MASK)>>16);
fpcr |= ieee_swcr_to_fpcr(swcr | (~swcr & IEEE_STATUS_MASK)>>16);
wrfpcr(fpcr);
return 0;
......
......@@ -341,7 +341,7 @@ static struct cpu_model_info cpu_models[] __initdata = {
NULL, NULL, NULL, NULL }},
{ X86_VENDOR_INTEL, 6,
{ "Pentium Pro A-step", "Pentium Pro", NULL, "Pentium II", NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }},
"Pentium II (0.25 um)", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }},
{ X86_VENDOR_CYRIX, 4,
{ NULL, NULL, NULL, NULL, "MediaGX", NULL, NULL, NULL, NULL, "5x86",
NULL, NULL, NULL, NULL, NULL, NULL }},
......@@ -383,8 +383,7 @@ __initfunc(void identify_cpu(struct cpuinfo_x86 *c))
c->cpuid_level < 0)
return;
if ((c->x86_vendor == X86_VENDOR_AMD && amd_model(c)) ||
(c->x86_vendor == X86_VENDOR_CYRIX && cyrix_model(c)))
if (c->x86_vendor == X86_VENDOR_CYRIX && cyrix_model(c))
return;
if (c->x86_model < 16)
......@@ -394,10 +393,15 @@ __initfunc(void identify_cpu(struct cpuinfo_x86 *c))
p = cpu_models[i].model_names[c->x86_model];
break;
}
if (p)
if (p) {
strcpy(c->x86_model_id, p);
else
sprintf(c->x86_model_id, "%02x/%02x", c->x86_vendor, c->x86_model);
return;
}
if (c->x86_vendor == X86_VENDOR_AMD && amd_model(c))
return;
sprintf(c->x86_model_id, "%02x/%02x", c->x86_vendor, c->x86_model);
}
static char *cpu_vendor_names[] __initdata = {
......
......@@ -15,7 +15,7 @@ CONFIG_EXPERIMENTAL=y
# CONFIG_KERNELD is not set
#
# Platform dependant setup
# Platform-dependent setup
#
CONFIG_AMIGA=y
# CONFIG_ATARI is not set
......
......@@ -65,7 +65,7 @@ CFLAGS := $(CFLAGS) -g
endif
#
# CPU dependand compiler/assembler options for optimization.
# CPU-dependent compiler/assembler options for optimization.
#
ifdef CONFIG_CPU_R3000
CFLAGS := $(CFLAGS) -mcpu=r3000 -mips1
......@@ -93,7 +93,7 @@ CFLAGS := $(CFLAGS) -mcpu=r8000 -mips2
endif
#
# Board dependand options and extra files
# Board-dependent options and extra files
#
ifdef CONFIG_ALGOR_P4032
CORE_FILES += arch/mips/algor/algor.o
......
/*
* Setup pointers to hardware dependand routines.
* Setup pointers to hardware-dependent routines.
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
......
/*
* Setup pointers to hardware dependand routines.
* Setup pointers to hardware-dependent routines.
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
......
......@@ -300,10 +300,10 @@ static void printsmallpacket(PnP_TAG_PACKET * pkt, int size) {
#undef p
break;
case StartDepFunc:
printk("Start dependant function:\n");
printk("Start dependent function:\n");
break;
case EndDepFunc:
printk("End dependant function\n");
printk("End dependent function\n");
break;
case IOPort:
#define p pkt->S8_Pack
......
......@@ -89,6 +89,7 @@ if [ "$CONFIG_APM" = "y" ]; then
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
bool 'Watchdog Timer Support' CONFIG_WATCHDOG
if [ "$CONFIG_WATCHDOG" != "n" ]; then
......
......@@ -27,6 +27,7 @@
* Version 1.0 and 1.1
* May 1996, Version 1.2
* Feb 1998, Version 1.3
* Feb 1998, Version 1.4
*
* History:
* 0.6b: first version in official kernel, Linux 1.3.46
......@@ -46,8 +47,11 @@
* The new replacment for it is, but Linux doesn't yet support this.
* Alan Cox Linux 2.1.55
* 1.3: Set up a valid data descriptor 0x40 for buggy BIOS's
* 1.4: Upgraded to support APM 1.2. Integrated ThinkPad suspend patch by
* Dean Gaudet <dgaudet@arctic.org>.
* C. Scott Ananian <cananian@alumni.princeton.edu> Linux 2.1.87
*
* Reference:
* APM 1.1 Reference:
*
* Intel Corporation, Microsoft Corporation. Advanced Power Management
* (APM) BIOS Interface Specification, Revision 1.1, September 1993.
......@@ -58,6 +62,15 @@
* ftp://ftp.intel.com/pub/IAL/software_specs/apmv11.doc. It is also
* available from Microsoft by calling 206.882.8080.]
*
* APM 1.2 Reference:
* Intel Corporation, Microsoft Corporation. Advanced Power Management
* (APM) BIOS Interface Specification, Revision 1.2, February 1996.
*
* [This document is available from Intel at:
* http://www.intel.com/IAL/powermgm
* or Microsoft at
* http://www.microsoft.com/windows/thirdparty/hardware/pcfuture.htm
* ]
*/
#include <linux/config.h>
......@@ -128,6 +141,11 @@ extern unsigned long get_cmos_time(void);
* problems have been reported when using this option with gpm (if you'd
* like to debug this, please do so).
*
* CONFIG_APM_IGNORE_MULTIPLE_SUSPEND: The IBM TP560 bios seems to insist
* on returning multiple suspend/standby events whenever one occurs. We
* really only need one at a time, so just ignore any beyond the first.
* This is probably safe on most laptops.
*
* If you are debugging the APM support for your laptop, note that code for
* all of these options is contained in this file, so you can #define or
* #undef these on the next line to avoid recompiling the whole kernel.
......@@ -341,6 +359,9 @@ static int clock_slowed = 0;
#endif
static int suspends_pending = 0;
static int standbys_pending = 0;
#ifdef CONFIG_APM_IGNORE_MULTIPLE_SUSPEND
static int waiting_for_resume = 0;
#endif
static long clock_cmos_diff;
static int got_clock_diff = 0;
......@@ -350,7 +371,7 @@ static struct apm_bios_struct * user_list = NULL;
static struct timer_list apm_timer;
static char driver_version[] = "1.3"; /* no spaces */
static char driver_version[] = "1.4"; /* no spaces */
#ifdef APM_DEBUG
static char * apm_event_name[] = {
......@@ -614,8 +635,15 @@ static int queue_event(apm_event_t event, struct apm_bios_struct *sender)
if (as == sender)
continue;
as->event_head = (as->event_head + 1) % APM_MAX_EVENTS;
if (as->event_head == as->event_tail)
if (as->event_head == as->event_tail) {
static int notified;
if (notified == 0) {
printk( "apm_bios: an event queue overflowed\n" );
notified = 1;
}
as->event_tail = (as->event_tail + 1) % APM_MAX_EVENTS;
}
as->events[as->event_head] = event;
if (!as->suser)
continue;
......@@ -722,9 +750,23 @@ static void check_events(void)
apm_event_t event;
while ((event = get_event()) != 0) {
#ifdef APM_DEBUG
if (event <= NR_APM_EVENT_NAME)
printk(KERN_DEBUG "APM BIOS received %s notify\n",
apm_event_name[event - 1]);
else
printk(KERN_DEBUG "APM BIOS received unknown "
"event 0x%02x\n", event);
#endif
switch (event) {
case APM_SYS_STANDBY:
case APM_USER_STANDBY:
#ifdef CONFIG_APM_IGNORE_MULTIPLE_SUSPEND
if (waiting_for_resume) {
return;
}
waiting_for_resume = 1;
#endif
send_event(event, APM_STANDBY_RESUME, NULL);
if (standbys_pending <= 0)
standby();
......@@ -737,6 +779,12 @@ static void check_events(void)
break;
#endif
case APM_SYS_SUSPEND:
#ifdef CONFIG_APM_IGNORE_MULTIPLE_SUSPEND
if (waiting_for_resume) {
return;
}
waiting_for_resume = 1;
#endif
send_event(event, APM_NORMAL_RESUME, NULL);
if (suspends_pending <= 0)
suspend();
......@@ -745,6 +793,9 @@ static void check_events(void)
case APM_NORMAL_RESUME:
case APM_CRITICAL_RESUME:
case APM_STANDBY_RESUME:
#ifdef CONFIG_APM_IGNORE_MULTIPLE_SUSPEND
waiting_for_resume = 0;
#endif
set_time();
send_event(event, 0, NULL);
break;
......@@ -763,14 +814,6 @@ static void check_events(void)
suspend();
break;
}
#ifdef APM_DEBUG
if (event <= NR_APM_EVENT_NAME)
printk(KERN_DEBUG "APM BIOS received %s notify\n",
apm_event_name[event - 1]);
else
printk(KERN_DEBUG "APM BIOS received unknown event 0x%02x\n",
event);
#endif
}
}
......
......@@ -185,7 +185,7 @@ static struct channel *card_ptr[MAXCARDS];
/* ----------------------------------------------------------------------
Begin generic memory functions. These functions will be alias
(point at) more specific functions dependant on the board being
(point at) more specific functions dependent on the board being
configured.
----------------------------------------------------------------------- */
......@@ -461,7 +461,7 @@ static inline void pcxi_assertmemoff(struct channel *ch)
cards (Such as PCI) needs no windowing routines at all. We provide
these do nothing routines so that the same code base can be used.
The driver will ALWAYS call a windowing routine if it thinks it needs
to; regardless of the card. However, dependant on the card the routine
to; regardless of the card. However, dependent on the card the routine
may or may not do anything.
---------------------------------------------------------------------------*/
......@@ -4066,7 +4066,7 @@ int get_PCI_configuration(char bus, char device_fn,
base_addr5);
/* ------------------------------------------------------------------------
NOTE - The code below mask out either the 2 or 4 bits dependant on the
NOTE - The code below mask out either the 2 or 4 bits dependent on the
space being addressed. (base_addr value reflecting io space, have their
first 2 bits mask out, while base_addr value reflecting mem space, have
their first 4 bits mask out.) These bits are flag bits and should always
......
......@@ -128,7 +128,7 @@ static int lp_preempt(void *handle)
static __inline__ void lp_yield (int minor)
{
if (parport_yield (lp_table[minor].dev, 1) == 1 && need_resched)
if (!parport_yield_blocking (lp_table[minor].dev) && need_resched)
schedule ();
}
......@@ -654,7 +654,14 @@ static int parport_ptr = 0;
__initfunc(void lp_setup(char *str, int *ints))
{
if (!strncmp(str, "parport", 7)) {
if (!str) {
if (ints[0] == 0 || ints[1] == 0) {
/* disable driver on "lp=" or "lp=0" */
parport[0] = LP_PARPORT_OFF;
} else {
printk(KERN_WARNING "warning: 'lp=0x%x' is deprecated, ignored\n", ints[1]);
}
} else if (!strncmp(str, "parport", 7)) {
int n = simple_strtoul(str+7, NULL, 10);
if (parport_ptr < LP_NO)
parport[parport_ptr++] = n;
......@@ -667,13 +674,6 @@ __initfunc(void lp_setup(char *str, int *ints))
parport[parport_ptr++] = LP_PARPORT_NONE;
} else if (!strcmp(str, "reset")) {
reset = 1;
} else {
if (ints[0] == 0 || ints[1] == 0) {
/* disable driver on "lp=" or "lp=0" */
parport[0] = LP_PARPORT_OFF;
} else {
printk(KERN_WARNING "warning: 'lp=0x%x' is deprecated, ignored\n", ints[1]);
}
}
}
......
......@@ -1961,8 +1961,10 @@ long console_init(long kmem_start, long kmem_end)
return kmem_start;
}
static struct tty_driver dev_tty_driver, dev_console_driver,
dev_syscons_driver, dev_ptmx_driver;
static struct tty_driver dev_tty_driver, dev_syscons_driver, dev_ptmx_driver;
#ifdef CONFIG_VT
static struct tty_driver dev_console_driver;
#endif
/*
* Ok, now we can initialize the rest of the tty devices and can count
......
......@@ -39,11 +39,11 @@ struct aty_cmap_regs {
typedef struct aty_regvals {
int offset[3]; /* first pixel address */
int crtc_h_sync_strt_wid[3]; /* depth dependant */
int crtc_h_sync_strt_wid[3]; /* depth dependent */
int crtc_gen_cntl[3];
int mem_cntl[3];
int crtc_h_tot_disp; /* mode dependant */
int crtc_h_tot_disp; /* mode dependent */
int crtc_v_tot_disp;
int crtc_v_sync_strt_wid;
int crtc_off_pitch;
......
......@@ -31,15 +31,15 @@
#define DATA_LATCH 0x3350010
/* ARC can't read from the data latch, so we must use a soft copy. */
static unsigned int data_copy;
static unsigned char data_copy;
static void arc_write_data(struct parport *p, unsigned int data)
static void arc_write_data(struct parport *p, unsigned char data)
{
data_copy = data;
outb(data, DATA_LATCH);
}
static unsigned int arc_read_data(struct parport *p)
static unsigned char arc_read_data(struct parport *p)
{
return data_copy;
}
......
......@@ -55,83 +55,83 @@ parport_ax_null_intr_func(int irq, void *dev_id, struct pt_regs *regs)
}
void
parport_ax_write_epp(struct parport *p, unsigned int d)
parport_ax_write_epp(struct parport *p, unsigned char d)
{
outb(d, p->base + EPPREG);
}
unsigned int
unsigned char
parport_ax_read_epp(struct parport *p)
{
return (unsigned int)inb(p->base + EPPREG);
return inb(p->base + EPPREG);
}
unsigned int
unsigned char
parport_ax_read_configb(struct parport *p)
{
return (unsigned int)inb(p->base + CONFIGB);
return inb(p->base + CONFIGB);
}
void
parport_ax_write_data(struct parport *p, unsigned int d)
parport_ax_write_data(struct parport *p, unsigned char d)
{
outb(d, p->base + DATA);
}
unsigned int
unsigned char
parport_ax_read_data(struct parport *p)
{
return (unsigned int)inb(p->base + DATA);
return inb(p->base + DATA);
}
void
parport_ax_write_control(struct parport *p, unsigned int d)
parport_ax_write_control(struct parport *p, unsigned char d)
{
outb(d, p->base + CONTROL);
}
unsigned int
unsigned char
parport_ax_read_control(struct parport *p)
{
return (unsigned int)inb(p->base + CONTROL);
return inb(p->base + CONTROL);
}
unsigned int
parport_ax_frob_control(struct parport *p, unsigned int mask, unsigned int val)
unsigned char
parport_ax_frob_control(struct parport *p, unsigned char mask, unsigned char val)
{
unsigned int old = (unsigned int)inb(p->base + CONTROL);
unsigned char old = inb(p->base + CONTROL);
outb(((old & ~mask) ^ val), p->base + CONTROL);
return old;
}
void
parport_ax_write_status(struct parport *p, unsigned int d)
parport_ax_write_status(struct parport *p, unsigned char d)
{
outb(d, p->base + STATUS);
}
unsigned int
unsigned char
parport_ax_read_status(struct parport *p)
{
return (unsigned int)inb(p->base + STATUS);
return inb(p->base + STATUS);
}
void
parport_ax_write_econtrol(struct parport *p, unsigned int d)
parport_ax_write_econtrol(struct parport *p, unsigned char d)
{
outb(d, p->base + ECONTROL);
}
unsigned int
unsigned char
parport_ax_read_econtrol(struct parport *p)
{
return (unsigned int)inb(p->base + ECONTROL);
return inb(p->base + ECONTROL);
}
unsigned int
parport_ax_frob_econtrol(struct parport *p, unsigned int mask, unsigned int val)
unsigned char
parport_ax_frob_econtrol(struct parport *p, unsigned char mask, unsigned char val)
{
unsigned int old = (unsigned int)inb(p->base + ECONTROL);
unsigned char old = inb(p->base + ECONTROL);
outb(((old & ~mask) ^ val), p->base + ECONTROL);
return old;
}
......@@ -143,12 +143,12 @@ parport_ax_change_mode(struct parport *p, int m)
}
void
parport_ax_write_fifo(struct parport *p, unsigned int v)
parport_ax_write_fifo(struct parport *p, unsigned char v)
{
outb(v, p->base + DFIFO);
}
unsigned int
unsigned char
parport_ax_read_fifo(struct parport *p)
{
return inb(p->base + DFIFO);
......@@ -221,29 +221,29 @@ parport_ax_restore_state(struct parport *p, struct parport_state *s)
parport_ax_write_econtrol(p, s->u.pc.ecr);
}
unsigned int
parport_ax_epp_read_block(struct parport *p, void *buf, unsigned int length)
size_t
parport_ax_epp_read_block(struct parport *p, void *buf, size_t length)
{
return 0; /* FIXME */
}
unsigned int
parport_ax_epp_write_block(struct parport *p, void *buf, unsigned int length)
size_t
parport_ax_epp_write_block(struct parport *p, void *buf, size_t length)
{
return 0; /* FIXME */
}
unsigned int
parport_ax_ecp_read_block(struct parport *p, void *buf, unsigned int length,
void (*fn)(struct parport *, void *, unsigned int),
int
parport_ax_ecp_read_block(struct parport *p, void *buf, size_t length,
void (*fn)(struct parport *, void *, size_t),
void *handle)
{
return 0; /* FIXME */
}
unsigned int
parport_ax_ecp_write_block(struct parport *p, void *buf, unsigned int length,
void (*fn)(struct parport *, void *, unsigned int),
int
parport_ax_ecp_write_block(struct parport *p, void *buf, size_t length,
void (*fn)(struct parport *, void *, size_t),
void *handle)
{
return 0; /* FIXME */
......@@ -331,7 +331,8 @@ static struct parport_operations parport_ax_ops =
*/
static int parport_ECR_present(struct parport *pb)
{
unsigned int r, octr = pb->ops->read_control(pb),
unsigned int r;
unsigned char octr = pb->ops->read_control(pb),
oecr = pb->ops->read_econtrol(pb);
r = pb->ops->read_control(pb);
......@@ -360,7 +361,8 @@ static int parport_ECR_present(struct parport *pb)
static int parport_ECP_supported(struct parport *pb)
{
int i, oecr = pb->ops->read_econtrol(pb);
int i;
unsigned char oecr = pb->ops->read_econtrol(pb);
/* If there is no ECONTROL, we have no hope of supporting ECP. */
if (!(pb->modes & PARPORT_MODE_PCECR))
......@@ -398,7 +400,8 @@ static int parport_ECP_supported(struct parport *pb)
static int parport_PS2_supported(struct parport *pb)
{
int ok = 0, octr = pb->ops->read_control(pb);
int ok = 0;
unsigned char octr = pb->ops->read_control(pb);
pb->ops->write_control(pb, octr | 0x20); /* try to tri-state buffer */
......@@ -415,7 +418,8 @@ static int parport_PS2_supported(struct parport *pb)
static int parport_ECPPS2_supported(struct parport *pb)
{
int mode, oecr = pb->ops->read_econtrol(pb);
int mode;
unsigned char oecr = pb->ops->read_econtrol(pb);
if (!(pb->modes & PARPORT_MODE_PCECR))
return 0;
......
......@@ -58,71 +58,71 @@ static void parport_pc_null_intr_func(int irq, void *dev_id, struct pt_regs *reg
/* Null function - does nothing */
}
void parport_pc_write_epp(struct parport *p, unsigned int d)
void parport_pc_write_epp(struct parport *p, unsigned char d)
{
outb(d, p->base+EPPREG);
}
unsigned int parport_pc_read_epp(struct parport *p)
unsigned char parport_pc_read_epp(struct parport *p)
{
return (unsigned int)inb(p->base+EPPREG);
return inb(p->base+EPPREG);
}
unsigned int parport_pc_read_configb(struct parport *p)
unsigned char parport_pc_read_configb(struct parport *p)
{
return (unsigned int)inb(p->base+CONFIGB);
return inb(p->base+CONFIGB);
}
void parport_pc_write_data(struct parport *p, unsigned int d)
void parport_pc_write_data(struct parport *p, unsigned char d)
{
outb(d, p->base+DATA);
}
unsigned int parport_pc_read_data(struct parport *p)
unsigned char parport_pc_read_data(struct parport *p)
{
return (unsigned int)inb(p->base+DATA);
return inb(p->base+DATA);
}
void parport_pc_write_control(struct parport *p, unsigned int d)
void parport_pc_write_control(struct parport *p, unsigned char d)
{
outb(d, p->base+CONTROL);
}
unsigned int parport_pc_read_control(struct parport *p)
unsigned char parport_pc_read_control(struct parport *p)
{
return (unsigned int)inb(p->base+CONTROL);
return inb(p->base+CONTROL);
}
unsigned int parport_pc_frob_control(struct parport *p, unsigned int mask, unsigned int val)
unsigned char parport_pc_frob_control(struct parport *p, unsigned char mask, unsigned char val)
{
unsigned int old = (unsigned int)inb(p->base+CONTROL);
unsigned char old = inb(p->base+CONTROL);
outb(((old & ~mask) ^ val), p->base+CONTROL);
return old;
}
void parport_pc_write_status(struct parport *p, unsigned int d)
void parport_pc_write_status(struct parport *p, unsigned char d)
{
outb(d, p->base+STATUS);
}
unsigned int parport_pc_read_status(struct parport *p)
unsigned char parport_pc_read_status(struct parport *p)
{
return (unsigned int)inb(p->base+STATUS);
return inb(p->base+STATUS);
}
void parport_pc_write_econtrol(struct parport *p, unsigned int d)
void parport_pc_write_econtrol(struct parport *p, unsigned char d)
{
outb(d, p->base+ECONTROL);
}
unsigned int parport_pc_read_econtrol(struct parport *p)
unsigned char parport_pc_read_econtrol(struct parport *p)
{
return (unsigned int)inb(p->base+ECONTROL);
return inb(p->base+ECONTROL);
}
unsigned int parport_pc_frob_econtrol(struct parport *p, unsigned int mask, unsigned int val)
unsigned char parport_pc_frob_econtrol(struct parport *p, unsigned char mask, unsigned char val)
{
unsigned int old = (unsigned int)inb(p->base+ECONTROL);
unsigned char old = inb(p->base+ECONTROL);
outb(((old & ~mask) ^ val), p->base+ECONTROL);
return old;
}
......@@ -132,12 +132,12 @@ void parport_pc_change_mode(struct parport *p, int m)
/* FIXME */
}
void parport_pc_write_fifo(struct parport *p, unsigned int v)
void parport_pc_write_fifo(struct parport *p, unsigned char v)
{
/* FIXME */
}
unsigned int parport_pc_read_fifo(struct parport *p)
unsigned char parport_pc_read_fifo(struct parport *p)
{
return 0; /* FIXME */
}
......@@ -184,22 +184,22 @@ void parport_pc_restore_state(struct parport *p, struct parport_state *s)
parport_pc_write_econtrol(p, s->u.pc.ecr);
}
unsigned int parport_pc_epp_read_block(struct parport *p, void *buf, unsigned int length)
size_t parport_pc_epp_read_block(struct parport *p, void *buf, size_t length)
{
return 0; /* FIXME */
}
unsigned int parport_pc_epp_write_block(struct parport *p, void *buf, unsigned int length)
size_t parport_pc_epp_write_block(struct parport *p, void *buf, size_t length)
{
return 0; /* FIXME */
}
unsigned int parport_pc_ecp_read_block(struct parport *p, void *buf, unsigned int length, void (*fn)(struct parport *, void *, unsigned int), void *handle)
int parport_pc_ecp_read_block(struct parport *p, void *buf, size_t length, void (*fn)(struct parport *, void *, size_t), void *handle)
{
return 0; /* FIXME */
}
unsigned int parport_pc_ecp_write_block(struct parport *p, void *buf, unsigned int length, void (*fn)(struct parport *, void *, unsigned int), void *handle)
int parport_pc_ecp_write_block(struct parport *p, void *buf, size_t length, void (*fn)(struct parport *, void *, size_t), void *handle)
{
return 0; /* FIXME */
}
......@@ -337,7 +337,7 @@ static int parport_detect_dma_transfer(int dma, int size)
/* Only if supports ECP mode */
static int programmable_dma_support(struct parport *pb)
{
int dma, oldstate = parport_pc_read_econtrol(pb);
unsigned char dma, oldstate = parport_pc_read_econtrol(pb);
parport_pc_write_econtrol(pb, 0xe0); /* Configuration MODE */
......@@ -375,7 +375,7 @@ static int programmable_dma_support(struct parport *pb)
static int parport_dma_probe(struct parport *pb)
{
int dma,retv;
int dsr,dsr_read;
unsigned char dsr,dsr_read;
char *buff;
retv = programmable_dma_support(pb);
......@@ -424,7 +424,7 @@ static int parport_dma_probe(struct parport *pb)
*/
static int epp_clear_timeout(struct parport *pb)
{
int r;
unsigned char r;
if (!(parport_pc_read_status(pb) & 0x01))
return 1;
......@@ -470,7 +470,7 @@ static int parport_SPP_supported(struct parport *pb)
*/
static int parport_ECR_present(struct parport *pb)
{
unsigned int r, octr = parport_pc_read_control(pb),
unsigned char r, octr = parport_pc_read_control(pb),
oecr = parport_pc_read_econtrol(pb);
r = parport_pc_read_control(pb);
......@@ -499,7 +499,8 @@ static int parport_ECR_present(struct parport *pb)
static int parport_ECP_supported(struct parport *pb)
{
int i, oecr = parport_pc_read_econtrol(pb);
int i;
unsigned char oecr = parport_pc_read_econtrol(pb);
/* If there is no ECR, we have no hope of supporting ECP. */
if (!(pb->modes & PARPORT_MODE_PCECR))
......@@ -553,7 +554,8 @@ static int parport_EPP_supported(struct parport *pb)
static int parport_ECPEPP_supported(struct parport *pb)
{
int mode, oecr = parport_pc_read_econtrol(pb);
int mode;
unsigned char oecr = parport_pc_read_econtrol(pb);
if (!(pb->modes & PARPORT_MODE_PCECR))
return 0;
......@@ -587,7 +589,8 @@ static int parport_ECPEPP_supported(struct parport *pb)
static int parport_PS2_supported(struct parport *pb)
{
int ok = 0, octr = parport_pc_read_control(pb);
int ok = 0;
unsigned char octr = parport_pc_read_control(pb);
epp_clear_timeout(pb);
......@@ -606,7 +609,8 @@ static int parport_PS2_supported(struct parport *pb)
static int parport_ECPPS2_supported(struct parport *pb)
{
int mode, oecr = parport_pc_read_econtrol(pb);
int mode;
unsigned char oecr = parport_pc_read_econtrol(pb);
if (!(pb->modes & PARPORT_MODE_PCECR))
return 0;
......@@ -676,33 +680,25 @@ static int close_intr_election(long tmp)
/* Only if supports ECP mode */
static int programmable_irq_support(struct parport *pb)
{
int irq, oecr = parport_pc_read_econtrol(pb);
int irq, intrLine;
unsigned char oecr = parport_pc_read_econtrol(pb);
static const int lookup[8] = {
PARPORT_IRQ_NONE, 7, 9, 10, 11, 14, 15, 5
};
parport_pc_write_econtrol(pb,0xE0); /* Configuration MODE */
irq = (parport_pc_read_configb(pb) >> 3) & 0x07;
switch(irq){
case 2:
irq = 9;
break;
case 7:
irq = 5;
break;
case 0:
irq = PARPORT_IRQ_NONE;
break;
default:
irq += 7;
}
intrLine = (parport_pc_read_configb(pb) >> 3) & 0x07;
irq = lookup[intrLine];
parport_pc_write_econtrol(pb, oecr);
return irq;
}
static int irq_probe_ECP(struct parport *pb)
{
int irqs, i, oecr = parport_pc_read_econtrol(pb);
int irqs, i;
unsigned char oecr = parport_pc_read_econtrol(pb);
probe_irq_off(probe_irq_on()); /* Clear any interrupts */
irqs = open_intr_election();
......@@ -725,7 +721,8 @@ static int irq_probe_ECP(struct parport *pb)
*/
static int irq_probe_EPP(struct parport *pb)
{
int irqs, octr = parport_pc_read_control(pb);
int irqs;
unsigned char octr = parport_pc_read_control(pb);
#ifndef ADVANCED_DETECT
return PARPORT_IRQ_NONE;
......@@ -755,7 +752,8 @@ static int irq_probe_EPP(struct parport *pb)
static int irq_probe_SPP(struct parport *pb)
{
int irqs, octr = parport_pc_read_control(pb);
int irqs;
unsigned char octr = parport_pc_read_control(pb);
#ifndef ADVANCED_DETECT
return PARPORT_IRQ_NONE;
......
......@@ -90,6 +90,7 @@ struct parport *parport_register_port(unsigned long base, int irq, int dma,
tmp->devices = tmp->cad = NULL;
tmp->flags = 0;
tmp->ops = ops;
tmp->number = portcount;
spin_lock_init (&tmp->lock);
tmp->name = kmalloc(15, GFP_KERNEL);
......
......@@ -21,7 +21,7 @@
* When compiled as a loadable module, this driver can operate
* the board as either a 4/6 port switch with a 5th or 7th port
* that is a conventional NIC interface as far as the host is
* concerned, OR as 4/6 independant NICs. To select multi-NIC
* concerned, OR as 4/6 independent NICs. To select multi-NIC
* mode, add "nicmode=1" on the insmod load line for the driver.
*
* This driver uses the "dev" common ethernet device structure
......
......@@ -16,37 +16,37 @@ O_OBJS :=
M_OBJS :=
ifeq ($(CONFIG_SPARCAUDIO),y)
M=y
SBUS_AUDIO=y
else
ifeq ($(CONFIG_SPARCAUDIO),m)
MM=y
SBUS_AUDIO_MODULE=y
endif
endif
ifeq ($(CONFIG_SPARCAUDIO_AMD7930),y)
M=y
SBUS_AUDIO=y
OX_OBJS += amd7930.o
else
ifeq ($(CONFIG_SPARCAUDIO_AMD7930),m)
MM=y
SBUS_AUDIO_MODULE=y
MX_OBJS += amd7930.o
endif
endif
ifeq ($(CONFIG_SPARCAUDIO_CS4231),y)
M=y
SBUS_AUDIO=y
O_OBJS += cs4231.o
else
ifeq ($(CONFIG_SPARCAUDIO_CS4231),m)
MM=y
SBUS_AUDIO_MODULE=y
M_OBJS += cs4231.o
endif
endif
ifdef M
ifdef SBUS_AUDIO
OX_OBJS += audio.o
else
ifdef MM
ifdef SBUS_AUDIO_MODULE
MX_OBJS += audio.o
endif
endif
......
......@@ -134,7 +134,7 @@ static struct file_operations flash_fops = {
flash_llseek,
flash_read,
NULL, /* no write to the Flash, use mmap
* and play flash dependant tricks.
* and play flash dependent tricks.
*/
NULL, /* readdir */
NULL, /* poll */
......
......@@ -941,7 +941,7 @@ applies a patch to some files of the kernel tree.
Change to linux source directory
Configure with NCR53C7,8XX support = N
Configure with NCR53C8XX support = Y (or m)
Make dependancies
Make dependencies
Make the kernel (use make zdisk first)
Make and install modules if you have configured with 'm'
......
......@@ -28,6 +28,44 @@ Known bugs:
Please direct bug reports to: hjw@zvw.de
Version 3.8
-----------
Bill Hawes kindly reviewed the affs and sent me the
patches he did. They're marked (BH). Thanks, Bill!
- Cleanup of error handling in read_super().
Didn't release all ressources in case of an
error. (BH)
- put_inode() releases the ext cache only if it's
no longer needed. (BH)
- One set of dentry callbacks is enough. (BH)
- Cleanup of error handling in namei.c. (BH)
- Cleanup of error handling in file.c. (BH)
- The original blocksize of the device is
restored when the fs is unmounted. (BH)
- getblock() did not invalidate the key cache
when it allocated a new block.
- Removed some unneccessary locks as Bill
suggested.
- Simplified match_name(), changed all hashing
and case insensitive name comparisons to use
uppercase. This makes the tolower() routines
obsolete.
- Added mount option 'mufs' to force muFS
uid/gid interpretation.
- File mode changes were not updated on disk.
This was fixed before, but somehow got lost.
Version 3.7
-----------
......
......@@ -7,6 +7,7 @@
* block allocation, deallocation, calculation of free space.
*/
#define DEBUG 0
#include <linux/sched.h>
#include <linux/affs_fs.h>
#include <linux/stat.h>
......
This diff is collapsed.
......@@ -229,36 +229,40 @@ affs_notify_change(struct dentry *dentry, struct iattr *attr)
error = inode_change_ok(inode,attr);
if (error)
return error;
goto out;
if (((attr->ia_valid & ATTR_UID) && (inode->i_sb->u.affs_sb.s_flags & SF_SETUID)) ||
((attr->ia_valid & ATTR_GID) && (inode->i_sb->u.affs_sb.s_flags & SF_SETGID)) ||
((attr->ia_valid & ATTR_MODE) &&
(inode->i_sb->u.affs_sb.s_flags & (SF_SETMODE | SF_IMMUTABLE))))
error = -EPERM;
if (error)
return (inode->i_sb->u.affs_sb.s_flags & SF_QUIET) ? 0 : error;
(inode->i_sb->u.affs_sb.s_flags & (SF_SETMODE | SF_IMMUTABLE)))) {
if (!(inode->i_sb->u.affs_sb.s_flags & SF_QUIET))
error = -EPERM;
goto out;
}
if (attr->ia_valid & ATTR_MODE)
inode->u.affs_i.i_protect = mode_to_prot(attr->ia_mode);
inode_setattr(inode,attr);
return 0;
inode_setattr(inode, attr);
mark_inode_dirty(inode);
error = 0;
out:
return error;
}
void
affs_put_inode(struct inode *inode)
{
pr_debug("AFFS: put_inode(ino=%lu, nlink=%u)\n",inode->i_ino,inode->i_nlink);
lock_super(inode->i_sb);
if (inode->u.affs_i.i_ec) {
pr_debug("AFFS: freeing ext cache\n");
free_page((unsigned long)inode->u.affs_i.i_ec);
inode->u.affs_i.i_ec = NULL;
pr_debug("AFFS: put_inode(ino=%lu, nlink=%u)\n",
inode->i_ino,inode->i_nlink);
if (inode->i_count == 1) {
unsigned long cache_page = (unsigned long) inode->u.affs_i.i_ec;
if (cache_page) {
pr_debug("AFFS: freeing ext cache\n");
inode->u.affs_i.i_ec = NULL;
free_page(cache_page);
}
}
unlock_super(inode->i_sb);
}
void
......
This diff is collapsed.
This diff is collapsed.
......@@ -668,7 +668,11 @@ static void ntfs_read_inode(struct inode* inode)
static void ntfs_put_inode(struct inode *ino)
{
ntfs_debug(DEBUG_OTHER, "ntfs_put_inode %lx\n",ino->i_ino);
}
static void _ntfs_clear_inode(struct inode *ino)
{
ntfs_debug(DEBUG_OTHER, "ntfs_clear_inode %lx\n",ino->i_ino);
#ifdef NTFS_IN_LINUX_KERNEL
if(ino->i_ino!=FILE_MFT)
ntfs_clear_inode(&ino->u.ntfs_i);
......@@ -680,7 +684,7 @@ static void ntfs_put_inode(struct inode *ino)
ino->u.generic_ip=0;
}
#endif
clear_inode(ino);
return;
}
/* Called when umounting a filesystem by do_umount() in fs/super.c */
......@@ -753,6 +757,7 @@ struct super_operations ntfs_super_operations = {
NULL, /* write_super */
ntfs_statfs,
ntfs_remount_fs, /* remount */
_ntfs_clear_inode, /* clear_inode */
};
/* Called to mount a filesystem by read_super() in fs/super.c
......
......@@ -289,8 +289,14 @@ int ntfs_init_inode(ntfs_inode *ino,ntfs_volume *vol,int inum)
void ntfs_clear_inode(ntfs_inode *ino)
{
int i;
if(!ino->attr){
ntfs_error("ntfs_clear_inode: double free\n");
return;
}
ntfs_free(ino->attr);
ino->attr=0;
ntfs_free(ino->records);
ino->records=0;
for(i=0;i<ino->attr_count;i++)
{
if(ino->attrs[i].name)
......@@ -305,6 +311,7 @@ void ntfs_clear_inode(ntfs_inode *ino)
}
}
ntfs_free(ino->attrs);
ino->attrs=0;
}
/* Check and fixup a MFT record */
......
......@@ -46,29 +46,3 @@ struct ng1_setgammaramp_args {
unsigned char green [256];
unsigned char blue [256];
};
#define GFX_NAME_NEWPORT "NG1"
/* ioctls */
#define NG1_SET_CURSOR_HOTSPOT 21001
struct ng1_set_cursor_hotspot {
unsigned short xhot;
unsigned short yhot;
};
#define NG1_SETDISPLAYMODE 21006
struct ng1_setdisplaymode_args {
int wid;
unsigned int mode;
};
#define NG1_SETGAMMARAMP0 21007
struct ng1_setgammaramp_args {
unsigned char red [256];
unsigned char green [256];
unsigned char blue [256];
};
/*
* IRIX prctl interface
*
* The IRIX kernel maps a page at PRDA_ADDRESS with the
* contents of prda and fills it the bits on prda_sys.
* $Id: prctl.h,v 1.1 1997/09/21 22:27:19 miguel Exp $
*/
#ifndef __PRCTL_H__
#define __PRCTL_H__
#define PRDA_ADDRESS 0x200000L
#define PRDA ((struct prda *) PRDA_ADDRESS)
struct prda_sys {
pid_t t_pid;
u32 t_hint;
u32 t_dlactseq;
u32 t_fpflags;
u32 t_prid; /* processor type, $prid CP0 register */
u32 t_dlendseq;
u64 t_unused1[5];
pid_t t_rpid;
s32 t_resched;
u32 t_unused[8];
u32 t_cpu; /* current/last cpu */
/* FIXME: The signal information, not supported by Linux now */
u32 t_flags; /* if true, then the sigprocmask is in userspace */
u32 t_sigprocmask [1]; /* the sigprocmask */
};
struct prda {
char fill [0xe00];
struct prda_sys prda_sys;
};
#define t_sys prda_sys
ptrdiff_t prctl (int op, int v1, int v2);
#endif
/*
* IRIX prctl interface
*
......
......@@ -69,7 +69,7 @@ typedef struct {
caddr_t ptr;
} svr4_xrs_t;
/* Machine dependant context */
/* Machine dependent context */
typedef struct {
svr4_gregset_t greg; /* registers 0..19 (see top) */
svr4_gwindows_t *gwin; /* may point to register windows */
......
......@@ -70,7 +70,7 @@ typedef struct {
u32 ptr;
} svr4_xrs_t;
/* Machine dependant context */
/* Machine dependent context */
typedef struct {
svr4_gregset_t greg; /* registers 0..19 (see top) */
u32 gwin; /* may point to register windows */
......
......@@ -37,6 +37,7 @@ struct affs_zone {
struct affs_sb_info {
int s_partition_size; /* Partition size in blocks. */
int s_blksize; /* Initial device blksize */
s32 s_root_block; /* FFS root block number. */
int s_hashsize; /* Size of hash table. */
unsigned long s_flags; /* See below. */
......
......@@ -128,7 +128,7 @@ typedef __u64 Elf64_Word;
#define AT_GID 13 /* real gid */
#define AT_EGID 14 /* effective gid */
#define AT_PLATFORM 15 /* string identifying cpu for optimizations */
#define AT_HWCAP 16 /* arch dependant hints at cpu capabilities */
#define AT_HWCAP 16 /* arch dependent hints at cpu capabilities */
typedef struct dynamic{
Elf32_Sword d_tag;
......
......@@ -5,7 +5,7 @@
#define SHAPER_QLEN 10
/*
* This is a bit speed dependant (read it shouldnt be a constant!)
* This is a bit speed dependent (read it shouldn't be a constant!)
*
* 5 is about right for 28.8 upwards. Below that double for every
* halving of speed or so. - ie about 20 for 9600 baud.
......
......@@ -3,6 +3,64 @@
#ifndef _PARPORT_H_
#define _PARPORT_H_
/* Start off with user-visible constants */
/* Maximum of 8 ports per machine */
#define PARPORT_MAX 8
/* Magic numbers */
#define PARPORT_IRQ_NONE -1
#define PARPORT_DMA_NONE -1
#define PARPORT_IRQ_AUTO -2
#define PARPORT_DMA_AUTO -2
#define PARPORT_DISABLE -2
#define PARPORT_CONTROL_STROBE 0x1
#define PARPORT_CONTROL_AUTOFD 0x2
#define PARPORT_CONTROL_INIT 0x4
#define PARPORT_CONTROL_SELECT 0x8
#define PARPORT_CONTROL_INTEN 0x10
#define PARPORT_CONTROL_DIRECTION 0x20
#define PARPORT_STATUS_ERROR 0x8
#define PARPORT_STATUS_SELECT 0x10
#define PARPORT_STATUS_PAPEROUT 0x20
#define PARPORT_STATUS_ACK 0x40
#define PARPORT_STATUS_BUSY 0x80
/* Type classes for Plug-and-Play probe. */
typedef enum {
PARPORT_CLASS_LEGACY = 0, /* Non-IEEE1284 device */
PARPORT_CLASS_PRINTER,
PARPORT_CLASS_MODEM,
PARPORT_CLASS_NET,
PARPORT_CLASS_HDC, /* Hard disk controller */
PARPORT_CLASS_PCMCIA,
PARPORT_CLASS_MEDIA, /* Multimedia device */
PARPORT_CLASS_FDC, /* Floppy disk controller */
PARPORT_CLASS_PORTS,
PARPORT_CLASS_SCANNER,
PARPORT_CLASS_DIGCAM,
PARPORT_CLASS_OTHER, /* Anything else */
PARPORT_CLASS_UNSPEC /* No CLS field in ID */
} parport_device_class;
/* The "modes" entry in parport is a bit field representing the following
* modes.
* Note that PARPORT_MODE_PCECPEPP is for the SMC EPP+ECP mode which is NOT
* 100% compatible with EPP.
*/
#define PARPORT_MODE_PCSPP 0x0001
#define PARPORT_MODE_PCPS2 0x0002
#define PARPORT_MODE_PCEPP 0x0004
#define PARPORT_MODE_PCECP 0x0008
#define PARPORT_MODE_PCECPEPP 0x0010
#define PARPORT_MODE_PCECR 0x0020 /* ECR Register Exists */
#define PARPORT_MODE_PCECPPS2 0x0040
/* The rest is for the kernel only */
#ifdef __KERNEL__
#include <asm/system.h>
#include <asm/ptrace.h>
#include <asm/spinlock.h>
......@@ -11,16 +69,6 @@
#define PARPORT_NEED_GENERIC_OPS
/* Maximum of 8 ports per machine */
#define PARPORT_MAX 8
/* Magic numbers */
#define PARPORT_IRQ_NONE -2
#define PARPORT_DMA_NONE -2
#define PARPORT_IRQ_AUTO -1
#define PARPORT_DMA_AUTO -1
#define PARPORT_DISABLE -2
/* Define this later. */
struct parport;
......@@ -39,29 +87,29 @@ struct parport_state {
};
struct parport_operations {
void (*write_data)(struct parport *, unsigned int);
unsigned int (*read_data)(struct parport *);
void (*write_control)(struct parport *, unsigned int);
unsigned int (*read_control)(struct parport *);
unsigned int (*frob_control)(struct parport *, unsigned int mask, unsigned int val);
void (*write_econtrol)(struct parport *, unsigned int);
unsigned int (*read_econtrol)(struct parport *);
unsigned int (*frob_econtrol)(struct parport *, unsigned int mask, unsigned int val);
void (*write_status)(struct parport *, unsigned int);
unsigned int (*read_status)(struct parport *);
void (*write_fifo)(struct parport *, unsigned int);
unsigned int (*read_fifo)(struct parport *);
void (*write_data)(struct parport *, unsigned char);
unsigned char (*read_data)(struct parport *);
void (*write_control)(struct parport *, unsigned char);
unsigned char (*read_control)(struct parport *);
unsigned char (*frob_control)(struct parport *, unsigned char mask, unsigned char val);
void (*write_econtrol)(struct parport *, unsigned char);
unsigned char (*read_econtrol)(struct parport *);
unsigned char (*frob_econtrol)(struct parport *, unsigned char mask, unsigned char val);
void (*write_status)(struct parport *, unsigned char);
unsigned char (*read_status)(struct parport *);
void (*write_fifo)(struct parport *, unsigned char);
unsigned char (*read_fifo)(struct parport *);
void (*change_mode)(struct parport *, int);
void (*release_resources)(struct parport *);
int (*claim_resources)(struct parport *);
unsigned int (*epp_write_block)(struct parport *, void *, unsigned int);
unsigned int (*epp_read_block)(struct parport *, void *, unsigned int);
size_t (*epp_write_block)(struct parport *, void *, size_t);
size_t (*epp_read_block)(struct parport *, void *, size_t);
unsigned int (*ecp_write_block)(struct parport *, void *, unsigned int, void (*fn)(struct parport *, void *, unsigned int), void *);
unsigned int (*ecp_read_block)(struct parport *, void *, unsigned int, void (*fn)(struct parport *, void *, unsigned int), void *);
int (*ecp_write_block)(struct parport *, void *, size_t, void (*fn)(struct parport *, void *, size_t), void *);
int (*ecp_read_block)(struct parport *, void *, size_t, void (*fn)(struct parport *, void *, size_t), void *);
void (*save_state)(struct parport *, struct parport_state *);
void (*restore_state)(struct parport *, struct parport_state *);
......@@ -74,36 +122,6 @@ struct parport_operations {
void (*dec_use_count)(void);
};
#define PARPORT_CONTROL_STROBE 0x1
#define PARPORT_CONTROL_AUTOFD 0x2
#define PARPORT_CONTROL_INIT 0x4
#define PARPORT_CONTROL_SELECT 0x8
#define PARPORT_CONTROL_INTEN 0x10
#define PARPORT_CONTROL_DIRECTION 0x20
#define PARPORT_STATUS_ERROR 0x8
#define PARPORT_STATUS_SELECT 0x10
#define PARPORT_STATUS_PAPEROUT 0x20
#define PARPORT_STATUS_ACK 0x40
#define PARPORT_STATUS_BUSY 0x80
/* Type classes for Plug-and-Play probe. */
typedef enum {
PARPORT_CLASS_LEGACY = 0, /* Non-IEEE1284 device */
PARPORT_CLASS_PRINTER,
PARPORT_CLASS_MODEM,
PARPORT_CLASS_NET,
PARPORT_CLASS_HDC, /* Hard disk controller */
PARPORT_CLASS_PCMCIA,
PARPORT_CLASS_MEDIA, /* Multimedia device */
PARPORT_CLASS_FDC, /* Floppy disk controller */
PARPORT_CLASS_PORTS,
PARPORT_CLASS_SCANNER,
PARPORT_CLASS_DIGCAM,
PARPORT_CLASS_OTHER, /* Anything else */
PARPORT_CLASS_UNSPEC /* No CLS field in ID */
} parport_device_class;
struct parport_device_info {
parport_device_class class;
char *mfr;
......@@ -178,7 +196,7 @@ struct parport {
struct parport_operations *ops;
void *private_data; /* for lowlevel driver */
int number; /* port index - the `n' in `parportn' */
spinlock_t lock;
};
......@@ -243,28 +261,29 @@ extern int parport_claim_or_block(struct pardevice *dev);
extern void parport_release(struct pardevice *dev);
extern __inline__ unsigned int parport_yield(struct pardevice *dev,
unsigned int block)
/* parport_yield relinquishes the port if it would be helpful to other
* drivers. The return value is the same as for parport_claim.
*/
extern __inline__ unsigned int parport_yield(struct pardevice *dev)
{
unsigned long int timeslip = (jiffies - dev->time);
if ((dev->port->waithead == NULL) || (timeslip < dev->timeslice))
return 1;
return 0;
parport_release(dev);
return (block)?parport_claim_or_block(dev):parport_claim(dev);
return parport_claim(dev);
}
/* The "modes" entry in parport is a bit field representing the following
* modes.
* Note that LP_ECPEPP is for the SMC EPP+ECP mode which is NOT
* 100% compatible with EPP.
/* parport_yield_blocking is the same but uses parport_claim_or_block
* instead of parport_claim.
*/
#define PARPORT_MODE_PCSPP 0x0001
#define PARPORT_MODE_PCPS2 0x0002
#define PARPORT_MODE_PCEPP 0x0004
#define PARPORT_MODE_PCECP 0x0008
#define PARPORT_MODE_PCECPEPP 0x0010
#define PARPORT_MODE_PCECR 0x0020 /* ECR Register Exists */
#define PARPORT_MODE_PCECPPS2 0x0040
extern __inline__ unsigned int parport_yield_blocking(struct pardevice *dev)
{
unsigned long int timeslip = (jiffies - dev->time);
if ((dev->port->waithead == NULL) || (timeslip < dev->timeslice))
return 0;
parport_release(dev);
return parport_claim_or_block(dev);
}
/* Flags used to identify what a device does. */
#define PARPORT_DEV_TRAN 0x0000 /* We're transient. */
......@@ -329,4 +348,5 @@ extern void (*parport_probe_hook)(struct parport *port);
#define parport_claim_resources(p) (p)->ops->claim_resources(p)
#endif
#endif /* __KERNEL__ */
#endif /* _PARPORT_H_ */
......@@ -13,80 +13,80 @@
#define STATUS 0x1
#define DATA 0
extern __inline__ void parport_pc_write_epp(struct parport *p, unsigned int d)
extern __inline__ void parport_pc_write_epp(struct parport *p, unsigned char d)
{
outb(d, p->base+EPPREG);
}
extern __inline__ unsigned int parport_pc_read_epp(struct parport *p)
extern __inline__ unsigned char parport_pc_read_epp(struct parport *p)
{
return (unsigned int)inb(p->base+EPPREG);
return inb(p->base+EPPREG);
}
extern __inline__ unsigned int parport_pc_read_configb(struct parport *p)
extern __inline__ unsigned char parport_pc_read_configb(struct parport *p)
{
return (unsigned int)inb(p->base+CONFIGB);
return inb(p->base+CONFIGB);
}
extern __inline__ void parport_pc_write_data(struct parport *p, unsigned int d)
extern __inline__ void parport_pc_write_data(struct parport *p, unsigned char d)
{
outb(d, p->base+DATA);
}
extern __inline__ unsigned int parport_pc_read_data(struct parport *p)
extern __inline__ unsigned char parport_pc_read_data(struct parport *p)
{
return (unsigned int)inb(p->base+DATA);
return inb(p->base+DATA);
}
extern __inline__ void parport_pc_write_control(struct parport *p, unsigned int d)
extern __inline__ void parport_pc_write_control(struct parport *p, unsigned char d)
{
outb(d, p->base+CONTROL);
}
extern __inline__ unsigned int parport_pc_read_control(struct parport *p)
extern __inline__ unsigned char parport_pc_read_control(struct parport *p)
{
return (unsigned int)inb(p->base+CONTROL);
return inb(p->base+CONTROL);
}
extern __inline__ unsigned int parport_pc_frob_control(struct parport *p, unsigned int mask, unsigned int val)
extern __inline__ unsigned char parport_pc_frob_control(struct parport *p, unsigned char mask, unsigned char val)
{
unsigned int old = (unsigned int)inb(p->base+CONTROL);
unsigned char old = inb(p->base+CONTROL);
outb(((old & ~mask) ^ val), p->base+CONTROL);
return old;
}
extern __inline__ void parport_pc_write_status(struct parport *p, unsigned int d)
extern __inline__ void parport_pc_write_status(struct parport *p, unsigned char d)
{
outb(d, p->base+STATUS);
}
extern __inline__ unsigned int parport_pc_read_status(struct parport *p)
extern __inline__ unsigned char parport_pc_read_status(struct parport *p)
{
return (unsigned int)inb(p->base+STATUS);
return inb(p->base+STATUS);
}
extern __inline__ void parport_pc_write_econtrol(struct parport *p, unsigned int d)
extern __inline__ void parport_pc_write_econtrol(struct parport *p, unsigned char d)
{
outb(d, p->base+ECONTROL);
}
extern __inline__ unsigned int parport_pc_read_econtrol(struct parport *p)
extern __inline__ unsigned char parport_pc_read_econtrol(struct parport *p)
{
return (unsigned int)inb(p->base+ECONTROL);
return inb(p->base+ECONTROL);
}
extern __inline__ unsigned int parport_pc_frob_econtrol(struct parport *p, unsigned int mask, unsigned int val)
extern __inline__ unsigned char parport_pc_frob_econtrol(struct parport *p, unsigned char mask, unsigned char val)
{
unsigned int old = (unsigned int)inb(p->base+ECONTROL);
unsigned char old = inb(p->base+ECONTROL);
outb(((old & ~mask) ^ val), p->base+ECONTROL);
return old;
}
extern void parport_pc_change_mode(struct parport *p, int m);
extern void parport_pc_write_fifo(struct parport *p, unsigned int v);
extern void parport_pc_write_fifo(struct parport *p, unsigned char v);
extern unsigned int parport_pc_read_fifo(struct parport *p);
extern unsigned char parport_pc_read_fifo(struct parport *p);
extern void parport_pc_disable_irq(struct parport *p);
......@@ -100,13 +100,13 @@ extern void parport_pc_save_state(struct parport *p, struct parport_state *s);
extern void parport_pc_restore_state(struct parport *p, struct parport_state *s);
extern unsigned int parport_pc_epp_read_block(struct parport *p, void *buf, unsigned int length);
extern size_t parport_pc_epp_read_block(struct parport *p, void *buf, size_t length);
extern unsigned int parport_pc_epp_write_block(struct parport *p, void *buf, unsigned int length);
extern size_t parport_pc_epp_write_block(struct parport *p, void *buf, size_t length);
extern unsigned int parport_pc_ecp_read_block(struct parport *p, void *buf, unsigned int length, void (*fn)(struct parport *, void *, unsigned int), void *handle);
extern int parport_pc_ecp_read_block(struct parport *p, void *buf, size_t length, void (*fn)(struct parport *, void *, size_t), void *handle);
extern unsigned int parport_pc_ecp_write_block(struct parport *p, void *buf, unsigned int length, void (*fn)(struct parport *, void *, unsigned int), void *handle);
extern int parport_pc_ecp_write_block(struct parport *p, void *buf, size_t length, void (*fn)(struct parport *, void *, size_t), void *handle);
extern int parport_pc_examine_irq(struct parport *p);
......
......@@ -159,7 +159,7 @@ typedef struct X25Cmd
#define X25RES_PROTO_VIOLATION 0x41 /* protocol violation occured */
#define X25RES_PKT_TIMEOUT 0x42 /* X.25 packet time out */
#define X25RES_PKT_RETRY_LIMIT 0x43 /* X.25 packet retry limit exceeded */
/*----- Command-dependant results -----*/
/*----- Command-dependent results -----*/
#define X25RES_LINK_DISC 0x00 /* HDLC_LINK_STATUS */
#define X25RES_LINK_IN_ABM 0x01 /* HDLC_LINK_STATUS */
#define X25RES_NO_DATA 0x01 /* HDLC_READ/READ_TRACE_DATA*/
......
......@@ -213,7 +213,7 @@ struct iw_encoding
struct iw_statistics
{
__u8 status; /* Status
* - device dependant for now */
* - device dependent for now */
struct iw_quality qual; /* Quality of the link
* (instant/mean/max) */
......
......@@ -54,7 +54,7 @@ extern int sysctl_tcp_sack;
extern int sysctl_tcp_timestamps;
extern int sysctl_tcp_window_scaling;
/* These are AF independant. */
/* These are AF independent. */
static __inline__ int tcp_bhashfn(__u16 lport)
{
return (lport ^ (lport >> 7)) & (TCP_BHTABLE_SIZE - 1);
......
......@@ -689,7 +689,7 @@ static pte_t shm_swap_in(struct vm_area_struct * shmd, unsigned long offset, uns
goto done;
}
if (!pte_none(pte)) {
rw_swap_page(READ, pte_val(pte), (char *) page, 1); /* FIXME */
rw_swap_page_nocache(READ, pte_val(pte), (char *)page);
pte = __pte(shp->shm_pages[idx]);
if (pte_present(pte)) {
free_page (page); /* doesn't sleep */
......@@ -820,7 +820,7 @@ int shm_swap (int prio, int dma)
if (atomic_read(&mem_map[MAP_NR(pte_page(page))].count) != 1)
goto check_table;
shp->shm_pages[idx] = swap_nr;
rw_swap_page(WRITE, swap_nr, (char *) pte_page(page), 1); /* FIXME */
rw_swap_page_nocache (WRITE, swap_nr, (char *) pte_page(page));
free_page(pte_page(page));
swap_successes++;
shm_swp++;
......
......@@ -206,6 +206,10 @@ EXPORT_SYMBOL(shrink_dcache_parent);
EXPORT_SYMBOL(find_inode_number);
EXPORT_SYMBOL(is_subdir);
#ifdef CONFIG_AUTOFS_FS_MODULE
EXPORT_SYMBOL(locks_remove_flock);
#endif
#if !defined(CONFIG_NFSD) && defined(CONFIG_NFSD_MODULE)
EXPORT_SYMBOL(do_nfsservctl);
#endif
......
......@@ -305,17 +305,17 @@ sys_init_module(const char *name_user, struct module *mod_user)
for (i = 0, dep = mod->deps; i < mod->ndeps; ++i, ++dep) {
struct module *o, *d = dep->dep;
/* Make sure the indicated dependancies are really modules. */
/* Make sure the indicated dependencies are really modules. */
if (d == mod) {
printk(KERN_ERR "init_module: self-referential "
"dependancy in mod->deps.\n");
"dependency in mod->deps.\n");
goto err3;
}
for (o = module_list; o != &kernel_module; o = o->next)
if (o == d) goto found_dep;
printk(KERN_ERR "init_module: found dependancy that is "
printk(KERN_ERR "init_module: found dependency that is "
"(no longer?) a module.\n");
goto err3;
......@@ -790,7 +790,7 @@ free_module(struct module *mod, int tag_freed)
mod->flags &= ~MOD_RUNNING;
}
/* Remove the module from the dependancy lists. */
/* Remove the module from the dependency lists. */
for (i = 0, dep = mod->deps; i < mod->ndeps; ++i, ++dep) {
struct module_ref **pp;
......
......@@ -201,7 +201,9 @@ void rw_swap_page_nocache(int rw, unsigned long entry, char *buffer)
}
page->inode = &swapper_inode;
page->offset = entry;
atomic_inc(&page->count); /* Protect from shrink_mmap() */
rw_swap_page(rw, entry, buffer, 1);
atomic_dec(&page->count);
page->inode = 0;
clear_bit(PG_swap_cache, &page->flags);
}
......
......@@ -108,17 +108,8 @@ static inline int try_to_swap_out(struct task_struct * tsk, struct vm_area_struc
*
* -- Stephen Tweedie 1998 */
if (pte_write(pte)) {
/*
* We _will_ allow dirty cached mappings later on, once
* MAP_SHARED|MAP_ANONYMOUS is working, but for now
* catch this as a bug.
*/
if (is_page_shared(page_map)) {
printk ("VM: Found a shared writable dirty page!\n");
return 0;
}
if (PageSwapCache(page_map)) {
if (PageSwapCache(page_map)) {
if (pte_write(pte)) {
printk ("VM: Found a writable swap-cached page!\n");
return 0;
}
......
......@@ -128,7 +128,7 @@ struct sk_buff *alloc_skb(unsigned int size,int gfp_mask)
}
/*
* FIXME: We could do with an architecture dependant
* FIXME: We could do with an architecture dependent
* 'alignment mask'.
*/
......
......@@ -92,7 +92,7 @@ __u32 cookie_v4_init_sequence(struct sock *sk, struct sk_buff *skb,
return isn;
}
/* This value should be dependant on TCP_TIMEOUT_INIT and
/* This value should be dependent on TCP_TIMEOUT_INIT and
* sysctl_tcp_retries1. It's a rather complicated formula
* (exponential backoff) to compute at runtime so it's currently hardcoded
* here.
......
......@@ -174,7 +174,7 @@ static __inline__ int tcp_lport_inuse(int num)
return 0;
}
/* Find a "good" local port, this is family independant.
/* Find a "good" local port, this is family independent.
* There are several strategies working in unison here to
* get the best possible performance. The current socket
* load is kept track of, if it is zero there is a strong
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment