diff -u --recursive --new-file v1.3.23/linux/Makefile linux/Makefile --- v1.3.23/linux/Makefile Sun Sep 3 16:12:48 1995 +++ linux/Makefile Mon Sep 4 14:59:53 1995 @@ -1,6 +1,6 @@ VERSION = 1 PATCHLEVEL = 3 -SUBLEVEL = 23 +SUBLEVEL = 24 ARCH = i386 diff -u --recursive --new-file v1.3.23/linux/arch/alpha/kernel/ptrace.c linux/arch/alpha/kernel/ptrace.c --- v1.3.23/linux/arch/alpha/kernel/ptrace.c Sun Sep 3 12:26:49 1995 +++ linux/arch/alpha/kernel/ptrace.c Mon Sep 4 13:40:47 1995 @@ -160,7 +160,8 @@ * and that it is in the task area before calling this: this routine does * no checking. */ -static unsigned long get_long(struct vm_area_struct * vma, unsigned long addr) +static unsigned long get_long(struct task_struct * tsk, + struct vm_area_struct * vma, unsigned long addr) { pgd_t * pgdir; pmd_t * pgmiddle; @@ -169,9 +170,9 @@ DBG(DBG_MEM_ALL, ("getting long at 0x%lx\n", addr)); repeat: - pgdir = pgd_offset(vma->vm_task, addr); + pgdir = pgd_offset(vma->vm_mm, addr); if (pgd_none(*pgdir)) { - do_no_page(vma, addr, 0); + do_no_page(tsk, vma, addr, 0); goto repeat; } if (pgd_bad(*pgdir)) { @@ -181,7 +182,7 @@ } pgmiddle = pmd_offset(pgdir, addr); if (pmd_none(*pgmiddle)) { - do_no_page(vma, addr, 0); + do_no_page(tsk, vma, addr, 0); goto repeat; } if (pmd_bad(*pgmiddle)) { @@ -191,7 +192,7 @@ } pgtable = pte_offset(pgmiddle, addr); if (!pte_present(*pgtable)) { - do_no_page(vma, addr, 0); + do_no_page(tsk, vma, addr, 0); goto repeat; } page = pte_page(*pgtable); @@ -211,8 +212,8 @@ * Now keeps R/W state of page so that a text page stays readonly * even if a debugger scribbles breakpoints into it. -M.U- */ -static void put_long(struct vm_area_struct * vma, unsigned long addr, - unsigned long data) +static void put_long(struct task_struct * tsk, struct vm_area_struct * vma, + unsigned long addr, unsigned long data) { pgd_t *pgdir; pmd_t *pgmiddle; @@ -220,9 +221,9 @@ unsigned long page; repeat: - pgdir = pgd_offset(vma->vm_task, addr); + pgdir = pgd_offset(vma->vm_mm, addr); if (!pgd_present(*pgdir)) { - do_no_page(vma, addr, 1); + do_no_page(tsk, vma, addr, 1); goto repeat; } if (pgd_bad(*pgdir)) { @@ -232,7 +233,7 @@ } pgmiddle = pmd_offset(pgdir, addr); if (pmd_none(*pgmiddle)) { - do_no_page(vma, addr, 1); + do_no_page(tsk, vma, addr, 1); goto repeat; } if (pmd_bad(*pgmiddle)) { @@ -242,12 +243,12 @@ } pgtable = pte_offset(pgmiddle, addr); if (!pte_present(*pgtable)) { - do_no_page(vma, addr, 1); + do_no_page(tsk, vma, addr, 1); goto repeat; } page = pte_page(*pgtable); if (!pte_write(*pgtable)) { - do_wp_page(vma, addr, 1); + do_wp_page(tsk, vma, addr, 1); goto repeat; } /* this is a hack for non-kernel-mapped video buffers and similar */ @@ -304,17 +305,17 @@ } align = addr & (sizeof(long) - 1); addr -= align; - low = get_long(vma, addr); + low = get_long(tsk, vma, addr); if (align) { unsigned long high; - high = get_long(vma_high, addr + sizeof(long)); + high = get_long(tsk, vma_high, addr + sizeof(long)); low >>= align * 8; low |= high << (64 - align * 8); } *result = low; } else { - long l = get_long(vma, addr); + long l = get_long(tsk, vma, addr); DBG(DBG_MEM_ALL, ("value is 0x%lx\n", l)); *result = l; @@ -344,16 +345,16 @@ } align = addr & (sizeof(long) - 1); addr -= align; - low = get_long(vma, addr); - high = get_long(vma_high, addr + sizeof(long)); + low = get_long(tsk, vma, addr); + high = get_long(tsk, vma_high, addr + sizeof(long)); low &= ~0UL >> (64 - align * 8); high &= ~0UL << (align * 8); low |= data << (align * 8); high |= data >> (64 - align * 8); - put_long(vma, addr, low); - put_long(vma_high, addr + sizeof(long), high); + put_long(tsk, vma, addr, low); + put_long(tsk, vma_high, addr + sizeof(long), high); } else - put_long(vma, addr, data); + put_long(tsk, vma, addr, data); return 0; } diff -u --recursive --new-file v1.3.23/linux/arch/i386/config.in linux/arch/i386/config.in --- v1.3.23/linux/arch/i386/config.in Sun Sep 3 12:26:49 1995 +++ linux/arch/i386/config.in Tue Sep 5 10:25:36 1995 @@ -6,7 +6,7 @@ comment 'General setup' bool 'Kernel math emulation' CONFIG_MATH_EMULATION n -bool 'Normal floppy disk support' CONFIG_BLK_DEV_FD y +tristate 'Normal floppy disk support' CONFIG_BLK_DEV_FD y bool 'Normal (MFM/RLL) disk and IDE disk/cdrom support' CONFIG_ST506 y if [ "$CONFIG_ST506" = "y" ]; then comment 'Please see drivers/block/README.ide for help/info on IDE drives' @@ -32,7 +32,7 @@ fi fi bool 'System V IPC' CONFIG_SYSVIPC y -bool 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF y +tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF y if [ "$CONFIG_BINFMT_ELF" = "y" ]; then bool 'Compile kernel as ELF - if your GCC is ELF-GCC' CONFIG_KERNEL_ELF n fi @@ -52,7 +52,7 @@ bool 'IP: multicasting' CONFIG_IP_MULTICAST n bool 'IP: firewalling' CONFIG_IP_FIREWALL n bool 'IP: accounting' CONFIG_IP_ACCT n -bool 'IP: tunneling' CONFIG_NET_IPIP n +tristate 'IP: tunneling' CONFIG_NET_IPIP n if [ "$CONFIG_IP_FORWARD" = "y" -a "$CONFIG_IP_FIREWALL" = "y" ]; then bool 'IP: firewall packet logging' CONFIG_IP_FIREWALL_VERBOSE y bool 'IP: masquerading (ALPHA)' CONFIG_IP_MASQUERADE n @@ -62,7 +62,7 @@ fi comment '(it is safe to leave these untouched)' bool 'IP: PC/TCP compatibility mode' CONFIG_INET_PCTCP n -bool 'IP: Reverse ARP' CONFIG_INET_RARP n +tristate 'IP: Reverse ARP' CONFIG_INET_RARP n bool 'IP: Assume subnets are local' CONFIG_INET_SNARL y bool 'IP: Disable NAGLE algorithm (normally enabled)' CONFIG_TCP_NAGLE_OFF n bool 'IP: Drop source routed frames' CONFIG_IP_NOSR y @@ -88,10 +88,10 @@ comment 'SCSI support type (disk, tape, CDrom)' -bool 'SCSI disk support' CONFIG_BLK_DEV_SD y -bool 'SCSI tape support' CONFIG_CHR_DEV_ST n -bool 'SCSI CDROM support' CONFIG_BLK_DEV_SR y -bool 'SCSI generic support' CONFIG_CHR_DEV_SG n +tristate 'SCSI disk support' CONFIG_BLK_DEV_SD y +tristate 'SCSI tape support' CONFIG_CHR_DEV_ST n +tristate 'SCSI CDROM support' CONFIG_BLK_DEV_SR y +tristate 'SCSI generic support' CONFIG_CHR_DEV_SG n comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs' @@ -99,28 +99,28 @@ comment 'SCSI low-level drivers' -bool 'Adaptec AHA152X support' CONFIG_SCSI_AHA152X y -bool 'Adaptec AHA1542 support' CONFIG_SCSI_AHA1542 n -bool 'Adaptec AHA1740 support' CONFIG_SCSI_AHA1740 n -bool 'Adaptec AHA274X/284X/294X support' CONFIG_SCSI_AIC7XXX n -bool 'BusLogic SCSI support' CONFIG_SCSI_BUSLOGIC n -bool 'EATA-DMA (DPT, NEC, ATT, Olivetti) support' CONFIG_SCSI_EATA_DMA n -bool 'EATA-PIO (old DPT PM2001, PM2012A) support' CONFIG_SCSI_EATA_PIO n -bool 'UltraStor 14F/34F support' CONFIG_SCSI_U14_34F n -bool 'Future Domain 16xx SCSI support' CONFIG_SCSI_FUTURE_DOMAIN n +tristate 'Adaptec AHA152X support' CONFIG_SCSI_AHA152X y +tristate 'Adaptec AHA1542 support' CONFIG_SCSI_AHA1542 n +tristate 'Adaptec AHA1740 support' CONFIG_SCSI_AHA1740 n +tristate 'Adaptec AHA274X/284X/294X support' CONFIG_SCSI_AIC7XXX n +tristate 'BusLogic SCSI support' CONFIG_SCSI_BUSLOGIC n +tristate 'EATA-DMA (DPT, NEC, ATT, Olivetti) support' CONFIG_SCSI_EATA_DMA n +tristate 'EATA-PIO (old DPT PM2001, PM2012A) support' CONFIG_SCSI_EATA_PIO n +tristate 'UltraStor 14F/34F support' CONFIG_SCSI_U14_34F n +tristate 'Future Domain 16xx SCSI support' CONFIG_SCSI_FUTURE_DOMAIN n bool 'Generic NCR5380 SCSI support' CONFIG_SCSI_GENERIC_NCR5380 n if [ "$CONFIG_PCI" = "y" ]; then - bool 'NCR53c7,8xx SCSI support' CONFIG_SCSI_NCR53C7xx n + tristate 'NCR53c7,8xx SCSI support' CONFIG_SCSI_NCR53C7xx n fi -bool 'Always IN2000 SCSI support (test release)' CONFIG_SCSI_IN2000 n +tristate 'Always IN2000 SCSI support (test release)' CONFIG_SCSI_IN2000 n bool 'PAS16 SCSI support' CONFIG_SCSI_PAS16 n -bool 'QLOGIC SCSI support' CONFIG_SCSI_QLOGIC n -bool 'Seagate ST-02 and Future Domain TMC-8xx SCSI support' CONFIG_SCSI_SEAGATE n +tristate 'QLOGIC SCSI support' CONFIG_SCSI_QLOGIC n +tristate 'Seagate ST-02 and Future Domain TMC-8xx SCSI support' CONFIG_SCSI_SEAGATE n bool 'Trantor T128/T128F/T228 SCSI support' CONFIG_SCSI_T128 n -bool 'UltraStor SCSI support' CONFIG_SCSI_ULTRASTOR n -bool '7000FASST SCSI support' CONFIG_SCSI_7000FASST n -bool 'EATA ISA/EISA (DPT PM2011/021/012/022/122/322) support' CONFIG_SCSI_EATA n -#bool 'SCSI debugging host adapter' CONFIG_SCSI_DEBUG n +tristate 'UltraStor SCSI support' CONFIG_SCSI_ULTRASTOR n +tristate '7000FASST SCSI support' CONFIG_SCSI_7000FASST n +tristate 'EATA ISA/EISA (DPT PM2011/021/012/022/122/322) support' CONFIG_SCSI_EATA n +#tristate 'SCSI debugging host adapter' CONFIG_SCSI_DEBUG n fi @@ -134,13 +134,13 @@ comment 'Skipping network driver configuration options...' else -bool 'Dummy net driver support' CONFIG_DUMMY y -bool 'SLIP (serial line) support' CONFIG_SLIP n -if [ "$CONFIG_SLIP" = "y" ]; then +tristate 'Dummy net driver support' CONFIG_DUMMY y +tristate 'SLIP (serial line) support' CONFIG_SLIP n +if [ "$CONFIG_SLIP" != "n" ]; then bool ' CSLIP compressed headers' CONFIG_SLIP_COMPRESSED y fi -bool 'PPP (point-to-point) support' CONFIG_PPP n -if [ "$CONFIG_PPP" = "y" ]; then +tristate 'PPP (point-to-point) support' CONFIG_PPP n +if [ "$CONFIG_PPP" != "n" ]; then bool ' 16 channels instead of 4' CONFIG_PPP_LOTS n fi if [ "$CONFIG_AX25" = "y" ]; then @@ -148,57 +148,57 @@ else bool 'Z8530 SCC kiss emulation driver for AX.25' CONFIG_SCC n fi -bool 'PLIP (parallel port) support' CONFIG_PLIP n -bool 'EQL (serial line load balancing) support' CONFIG_EQUALIZER n +tristate 'PLIP (parallel port) support' CONFIG_PLIP n +tristate 'EQL (serial line load balancing) support' CONFIG_EQUALIZER n bool 'Do you want to be offered ALPHA test drivers' CONFIG_NET_ALPHA n bool 'Western Digital/SMC cards' CONFIG_NET_VENDOR_SMC n if [ "$CONFIG_NET_VENDOR_SMC" = "y" ]; then - bool 'WD80*3 support' CONFIG_WD80x3 n - bool 'SMC Ultra support' CONFIG_ULTRA n + tristate 'WD80*3 support' CONFIG_WD80x3 n + tristate 'SMC Ultra support' CONFIG_ULTRA n fi bool 'AMD LANCE and PCnet (AT1500 and NE2100) support' CONFIG_LANCE n bool '3COM cards' CONFIG_NET_VENDOR_3COM y if [ "$CONFIG_NET_VENDOR_3COM" = "y" ]; then - bool '3c501 support' CONFIG_EL1 n - bool '3c503 support' CONFIG_EL2 n + tristate '3c501 support' CONFIG_EL1 n + tristate '3c503 support' CONFIG_EL2 n if [ "$CONFIG_NET_ALPHA" = "y" ]; then - bool '3c505 support' CONFIG_ELPLUS n - bool '3c507 support' CONFIG_EL16 n + tristate '3c505 support' CONFIG_ELPLUS n + tristate '3c507 support' CONFIG_EL16 n fi - bool '3c509/3c579 support' CONFIG_EL3 y + tristate '3c509/3c579 support' CONFIG_EL3 y fi bool 'Other ISA cards' CONFIG_NET_ISA n if [ "$CONFIG_NET_ISA" = "y" ]; then - bool 'Arcnet support' CONFIG_ARCNET n - bool 'Cabletron E21xx support' CONFIG_E2100 n - bool 'DEPCA support' CONFIG_DEPCA n - bool 'EtherWorks 3 support' CONFIG_EWRK3 n + tristate 'Arcnet support' CONFIG_ARCNET n + tristate 'Cabletron E21xx support' CONFIG_E2100 n + tristate 'DEPCA support' CONFIG_DEPCA n + tristate 'EtherWorks 3 support' CONFIG_EWRK3 n if [ "$CONFIG_NET_ALPHA" = "y" ]; then bool 'SEEQ8005 support' CONFIG_SEEQ8005 n - bool 'AT1700 support' CONFIG_AT1700 n - bool 'EtherExpressPro support' CONFIG_EEXPRESS_PRO n - bool 'EtherExpress support' CONFIG_EEXPRESS n + tristate 'AT1700 support' CONFIG_AT1700 n + tristate 'EtherExpressPro support' CONFIG_EEXPRESS_PRO n + tristate 'EtherExpress support' CONFIG_EEXPRESS n bool 'NI5210 support' CONFIG_NI52 n bool 'NI6510 support' CONFIG_NI65 n if [ "$CONFIG_AX25" = "y" ]; then bool 'Ottawa PI and PI/2 support' CONFIG_PI y fi - bool 'WaveLAN support' CONFIG_WAVELAN n + tristate 'WaveLAN support' CONFIG_WAVELAN n fi - bool 'HP PCLAN+ (27247B and 27252A) support' CONFIG_HPLAN_PLUS n - bool 'HP PCLAN (27245 and other 27xxx series) support' CONFIG_HPLAN n - bool 'HP 10/100VG PCLAN (ISA, EISA, PCI) support' CONFIG_HP100 y - bool 'NE2000/NE1000 support' CONFIG_NE2000 y + tristate 'HP PCLAN+ (27247B and 27252A) support' CONFIG_HPLAN_PLUS n + tristate 'HP PCLAN (27245 and other 27xxx series) support' CONFIG_HPLAN n + tristate 'HP 10/100VG PCLAN (ISA, EISA, PCI) support' CONFIG_HP100 y + tristate 'NE2000/NE1000 support' CONFIG_NE2000 y bool 'SK_G16 support' CONFIG_SK_G16 n fi bool 'EISA, VLB, PCI and on board controllers' CONFIG_NET_EISA n if [ "$CONFIG_NET_EISA" = "y" ]; then if [ "$CONFIG_NET_ALPHA" = "y" ]; then - bool 'Ansel Communications EISA 3200 support' CONFIG_AC3200 n + tristate 'Ansel Communications EISA 3200 support' CONFIG_AC3200 n fi - bool 'Apricot Xen-II on board ethernet' CONFIG_APRICOT n - bool 'DE425, DE434, DE435, DE500 support' CONFIG_DE4X5 n -# bool 'DEC 21040 PCI support' CONFIG_DEC_ELCP n + tristate 'Apricot Xen-II on board ethernet' CONFIG_APRICOT n + tristate 'DE425, DE434, DE435, DE500 support' CONFIG_DE4X5 n +# tristate 'DEC 21040 PCI support' CONFIG_DEC_ELCP n # bool 'LPL T100V 100Mbs support' CONFIG_LPL_T100 n # bool 'PCnet32 (32 bit VLB and PCI LANCE) support' CONFIG_PCNET32 n bool 'Zenith Z-Note support' CONFIG_ZNET y @@ -206,26 +206,26 @@ bool 'Pocket and portable adaptors' CONFIG_NET_POCKET n if [ "$CONFIG_NET_POCKET" = "y" ]; then bool 'AT-LAN-TEC/RealTek pocket adaptor support' CONFIG_ATP n - bool 'D-Link DE600 pocket adaptor support' CONFIG_DE600 n - bool 'D-Link DE620 pocket adaptor support' CONFIG_DE620 n + tristate 'D-Link DE600 pocket adaptor support' CONFIG_DE600 n + tristate 'D-Link DE620 pocket adaptor support' CONFIG_DE620 n # bool 'Silicom pocket adaptor support' CONFIG_SILICOM_PEA n # bool 'WaveLAN PCMCIA support' CONFIG_WaveLAN n # bool '3 Com 3c589 PCMCIA support' CONFIG_3C589 n fi bool 'Token Ring driver support' CONFIG_TR n if [ "$CONFIG_TR" = "y" ]; then - bool 'IBM Tropic chipset based adaptor support' CONFIG_IBMTR y + tristate 'IBM Tropic chipset based adaptor support' CONFIG_IBMTR y fi fi fi comment 'CD-ROM drivers (not for SCSI or IDE/ATAPI drives)' -bool 'Sony CDU31A/CDU33A CDROM support' CONFIG_CDU31A n -bool 'Standard Mitsumi [no XA/Multisession] CDROM support' CONFIG_MCD n -bool 'Experimental Mitsumi [XA/MultiSession] support' CONFIG_MCDX n -bool 'Matsushita/Panasonic CDROM support' CONFIG_SBPCD n -if [ "$CONFIG_SBPCD" = "y" ]; then +tristate 'Sony CDU31A/CDU33A CDROM support' CONFIG_CDU31A n +tristate 'Standard Mitsumi [no XA/Multisession] CDROM support' CONFIG_MCD n +tristate 'Experimental Mitsumi [XA/MultiSession] support' CONFIG_MCDX n +tristate 'Matsushita/Panasonic CDROM support' CONFIG_SBPCD n +if [ "$CONFIG_SBPCD" != "n" ]; then bool 'Matsushita/Panasonic second CDROM controller support' CONFIG_SBPCD2 n if [ "$CONFIG_SBPCD2" = "y" ]; then bool 'Matsushita/Panasonic third CDROM controller support' CONFIG_SBPCD3 n @@ -234,44 +234,40 @@ fi fi fi -bool 'Aztech/Orchid/Okano/Wearnes (non IDE) CDROM support' CONFIG_AZTCD n -bool 'Sony CDU535 CDROM support' CONFIG_CDU535 n -bool 'Goldstar R420 CDROM support' CONFIG_GSCD n -bool 'Philips/LMS CM206 CDROM support' CONFIG_CM206 n -bool 'Experimental Optics Storage DOLPHIN 8000AT CDROM support' CONFIG_OPTCD n +tristate 'Aztech/Orchid/Okano/Wearnes (non IDE) CDROM support' CONFIG_AZTCD n +tristate 'Sony CDU535 CDROM support' CONFIG_CDU535 n +tristate 'Goldstar R420 CDROM support' CONFIG_GSCD n +tristate 'Philips/LMS CM206 CDROM support' CONFIG_CM206 n +tristate 'Experimental Optics Storage DOLPHIN 8000AT CDROM support' CONFIG_OPTCD n bool 'Experimental Sanyo H94A CDROM support' CONFIG_SJCD n comment 'Filesystems' -bool 'Standard (minix) fs support' CONFIG_MINIX_FS y +tristate 'Standard (minix) fs support' CONFIG_MINIX_FS y bool 'Extended fs support' CONFIG_EXT_FS n bool 'Second extended fs support' CONFIG_EXT2_FS y -bool 'xiafs filesystem support' CONFIG_XIA_FS n -bool 'msdos fs support' CONFIG_MSDOS_FS y -if [ "$CONFIG_MSDOS_FS" = "y" ]; then -bool 'umsdos: Unix like fs on top of std MSDOS FAT fs' CONFIG_UMSDOS_FS n +tristate 'xiafs filesystem support' CONFIG_XIA_FS n +tristate 'msdos fs support' CONFIG_MSDOS_FS y +if [ "$CONFIG_MSDOS_FS" != "n" ]; then + tristate 'umsdos: Unix like fs on top of std MSDOS FAT fs' CONFIG_UMSDOS_FS n fi bool '/proc filesystem support' CONFIG_PROC_FS y if [ "$CONFIG_INET" = "y" ]; then -bool 'NFS filesystem support' CONFIG_NFS_FS y + tristate 'NFS filesystem support' CONFIG_NFS_FS y fi -if [ "$CONFIG_BLK_DEV_SR" = "y" -o "$CONFIG_BLK_DEV_IDECD" = "y" -o "$CONFIG_CDU31A" = "y" -o "$CONFIG_MCDX" = "y" -o "$CONFIG_MCD" = "y" -o "$CONFIG_SBPCD" = "y" -o "$CONFIG_AZTCD" = "y" -o "$CONFIG_CDU535" = "y" -o "$CONFIG_GSCD" = "y" -o "$CONFIG_CM206" = "y" -o "$CONFIG_OPTCD" = "y" -o "$CONFIG_SJCD" = "y" ]; then - bool 'ISO9660 cdrom filesystem support' CONFIG_ISO9660_FS y -else - bool 'ISO9660 cdrom filesystem support' CONFIG_ISO9660_FS n -fi -bool 'OS/2 HPFS filesystem support (read only)' CONFIG_HPFS_FS n -bool 'System V and Coherent filesystem support' CONFIG_SYSV_FS n -bool 'SMB filesystem (to mount WfW shares etc..) support' CONFIG_SMB_FS n +tristate 'ISO9660 cdrom filesystem support' CONFIG_ISO9660_FS y +tristate 'OS/2 HPFS filesystem support (read only)' CONFIG_HPFS_FS n +tristate 'System V and Coherent filesystem support' CONFIG_SYSV_FS n +tristate 'SMB filesystem (to mount WfW shares etc..) support' CONFIG_SMB_FS n comment 'character devices' bool 'Cyclades async mux support' CONFIG_CYCLADES n -bool 'Parallel printer support' CONFIG_PRINTER n +tristate 'Parallel printer support' CONFIG_PRINTER n bool 'Logitech busmouse support' CONFIG_BUSMOUSE n bool 'PS/2 mouse (aka "auxiliary device") support' CONFIG_PSMOUSE n if [ "$CONFIG_PSMOUSE" = "y" ]; then -bool 'C&T 82C710 mouse port support (as on TI Travelmate)' CONFIG_82C710_MOUSE y + bool 'C&T 82C710 mouse port support (as on TI Travelmate)' CONFIG_82C710_MOUSE y fi bool 'Microsoft busmouse support' CONFIG_MS_BUSMOUSE n bool 'ATIXL busmouse support' CONFIG_ATIXL_BUSMOUSE n @@ -279,7 +275,7 @@ bool 'QIC-02 tape support' CONFIG_QIC02_TAPE n if [ "$CONFIG_QIC02_TAPE" = "y" ]; then -bool 'Do you want runtime configuration for QIC-02' CONFIG_QIC02_DYNCONF y + bool 'Do you want runtime configuration for QIC-02' CONFIG_QIC02_DYNCONF y if [ "$CONFIG_QIC02_DYNCONF" != "y" ]; then comment '>>> Edit configuration parameters in ./include/linux/tpqic02.h!' @@ -294,7 +290,7 @@ bool 'QIC-117 tape support' CONFIG_FTAPE n if [ "$CONFIG_FTAPE" = "y" ]; then -int ' number of ftape buffers' NR_FTAPE_BUFFERS 3 + int ' number of ftape buffers' NR_FTAPE_BUFFERS 3 fi comment 'Sound' @@ -304,7 +300,7 @@ comment 'Kernel hacking' #bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC n -bool 'Kernel profiling support' CONFIG_PROFILE y +bool 'Kernel profiling support' CONFIG_PROFILE n if [ "$CONFIG_PROFILE" = "y" ]; then int ' Profile shift count' CONFIG_PROFILE_SHIFT 2 fi diff -u --recursive --new-file v1.3.23/linux/arch/i386/kernel/ptrace.c linux/arch/i386/kernel/ptrace.c --- v1.3.23/linux/arch/i386/kernel/ptrace.c Sun Sep 3 12:26:49 1995 +++ linux/arch/i386/kernel/ptrace.c Mon Sep 4 13:35:16 1995 @@ -83,7 +83,8 @@ * and that it is in the task area before calling this: this routine does * no checking. */ -static unsigned long get_long(struct vm_area_struct * vma, unsigned long addr) +static unsigned long get_long(struct task_struct * tsk, + struct vm_area_struct * vma, unsigned long addr) { pgd_t * pgdir; pmd_t * pgmiddle; @@ -91,9 +92,9 @@ unsigned long page; repeat: - pgdir = pgd_offset(vma->vm_task, addr); + pgdir = pgd_offset(vma->vm_mm, addr); if (pgd_none(*pgdir)) { - do_no_page(vma, addr, 0); + do_no_page(tsk, vma, addr, 0); goto repeat; } if (pgd_bad(*pgdir)) { @@ -103,7 +104,7 @@ } pgmiddle = pmd_offset(pgdir, addr); if (pmd_none(*pgmiddle)) { - do_no_page(vma, addr, 0); + do_no_page(tsk, vma, addr, 0); goto repeat; } if (pmd_bad(*pgmiddle)) { @@ -113,7 +114,7 @@ } pgtable = pte_offset(pgmiddle, addr); if (!pte_present(*pgtable)) { - do_no_page(vma, addr, 0); + do_no_page(tsk, vma, addr, 0); goto repeat; } page = pte_page(*pgtable); @@ -133,7 +134,7 @@ * Now keeps R/W state of page so that a text page stays readonly * even if a debugger scribbles breakpoints into it. -M.U- */ -static void put_long(struct vm_area_struct * vma, unsigned long addr, +static void put_long(struct task_struct * tsk, struct vm_area_struct * vma, unsigned long addr, unsigned long data) { pgd_t *pgdir; @@ -142,9 +143,9 @@ unsigned long page; repeat: - pgdir = pgd_offset(vma->vm_task, addr); + pgdir = pgd_offset(vma->vm_mm, addr); if (!pgd_present(*pgdir)) { - do_no_page(vma, addr, 1); + do_no_page(tsk, vma, addr, 1); goto repeat; } if (pgd_bad(*pgdir)) { @@ -154,7 +155,7 @@ } pgmiddle = pmd_offset(pgdir, addr); if (pmd_none(*pgmiddle)) { - do_no_page(vma, addr, 1); + do_no_page(tsk, vma, addr, 1); goto repeat; } if (pmd_bad(*pgmiddle)) { @@ -164,12 +165,12 @@ } pgtable = pte_offset(pgmiddle, addr); if (!pte_present(*pgtable)) { - do_no_page(vma, addr, 1); + do_no_page(tsk, vma, addr, 1); goto repeat; } page = pte_page(*pgtable); if (!pte_write(*pgtable)) { - do_wp_page(vma, addr, 1); + do_wp_page(tsk, vma, addr, 1); goto repeat; } /* this is a hack for non-kernel-mapped video buffers and similar */ @@ -220,8 +221,8 @@ if (!vma_high || vma_high->vm_start != vma->vm_end) return -EIO; } - low = get_long(vma, addr & ~(sizeof(long)-1)); - high = get_long(vma_high, (addr+sizeof(long)) & ~(sizeof(long)-1)); + low = get_long(tsk, vma, addr & ~(sizeof(long)-1)); + high = get_long(tsk, vma_high, (addr+sizeof(long)) & ~(sizeof(long)-1)); switch (addr & (sizeof(long)-1)) { case 1: low >>= 8; @@ -238,7 +239,7 @@ } *result = low; } else - *result = get_long(vma, addr); + *result = get_long(tsk, vma, addr); return 0; } @@ -262,8 +263,8 @@ if (!vma_high || vma_high->vm_start != vma->vm_end) return -EIO; } - low = get_long(vma, addr & ~(sizeof(long)-1)); - high = get_long(vma_high, (addr+sizeof(long)) & ~(sizeof(long)-1)); + low = get_long(tsk, vma, addr & ~(sizeof(long)-1)); + high = get_long(tsk, vma_high, (addr+sizeof(long)) & ~(sizeof(long)-1)); switch (addr & (sizeof(long)-1)) { case 0: /* shouldn't happen, but safety first */ low = data; @@ -287,10 +288,10 @@ high |= data >> 8; break; } - put_long(vma, addr & ~(sizeof(long)-1),low); - put_long(vma_high, (addr+sizeof(long)) & ~(sizeof(long)-1),high); + put_long(tsk, vma, addr & ~(sizeof(long)-1),low); + put_long(tsk, vma_high, (addr+sizeof(long)) & ~(sizeof(long)-1),high); } else - put_long(vma, addr, data); + put_long(tsk, vma, addr, data); return 0; } diff -u --recursive --new-file v1.3.23/linux/arch/i386/kernel/signal.c linux/arch/i386/kernel/signal.c --- v1.3.23/linux/arch/i386/kernel/signal.c Fri Jun 16 22:02:54 1995 +++ linux/arch/i386/kernel/signal.c Mon Sep 4 13:52:30 1995 @@ -90,7 +90,7 @@ #define __CODE ((unsigned long)(frame+24)) #define CODE(x) ((unsigned long *) ((x)+__CODE)) frame = *fp; - if (regs->ss != USER_DS) + if (regs->ss != USER_DS && sa->sa_restorer) frame = (unsigned long *) sa->sa_restorer; frame -= 32; if (verify_area(VERIFY_WRITE,frame,32*4)) diff -u --recursive --new-file v1.3.23/linux/arch/i386/kernel/sys_i386.c linux/arch/i386/kernel/sys_i386.c --- v1.3.23/linux/arch/i386/kernel/sys_i386.c Tue Jun 27 14:11:30 1995 +++ linux/arch/i386/kernel/sys_i386.c Mon Sep 4 14:35:43 1995 @@ -59,10 +59,10 @@ if (fd >= NR_OPEN || !(file = current->files->fd[fd])) return -EBADF; } + flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); return do_mmap(file, get_user(buffer), get_user(buffer+1), get_user(buffer+2), flags, get_user(buffer+5)); } - extern asmlinkage int sys_select(int, fd_set *, fd_set *, fd_set *, struct timeval *); diff -u --recursive --new-file v1.3.23/linux/arch/i386/kernel/vm86.c linux/arch/i386/kernel/vm86.c --- v1.3.23/linux/arch/i386/kernel/vm86.c Sun Sep 3 12:26:49 1995 +++ linux/arch/i386/kernel/vm86.c Mon Sep 4 13:32:21 1995 @@ -74,7 +74,7 @@ pte_t *pte; int i; - pgd = pgd_offset(tsk, 0xA0000); + pgd = pgd_offset(tsk->mm, 0xA0000); if (pgd_none(*pgd)) return; if (pgd_bad(*pgd)) { diff -u --recursive --new-file v1.3.23/linux/arch/i386/mm/fault.c linux/arch/i386/mm/fault.c --- v1.3.23/linux/arch/i386/mm/fault.c Sun Sep 3 16:12:48 1995 +++ linux/arch/i386/mm/fault.c Mon Sep 4 13:36:26 1995 @@ -92,10 +92,10 @@ if (regs->cs == KERNEL_CS) printk("WP fault at %08x\n", regs->eip); #endif - do_wp_page(vma, address, error_code & 2); + do_wp_page(current, vma, address, error_code & 2); return; } - do_no_page(vma, address, error_code & 2); + do_no_page(current, vma, address, error_code & 2); return; /* diff -u --recursive --new-file v1.3.23/linux/arch/mips/kernel/ptrace.c linux/arch/mips/kernel/ptrace.c --- v1.3.23/linux/arch/mips/kernel/ptrace.c Sun Sep 3 12:26:49 1995 +++ linux/arch/mips/kernel/ptrace.c Mon Sep 4 11:27:21 1995 @@ -89,7 +89,7 @@ unsigned long page; repeat: - pgdir = PAGE_DIR_OFFSET(vma->vm_task, addr); + pgdir = PAGE_DIR_OFFSET(vma->vm_mm, addr); if (pgd_none(*pgdir)) { do_no_page(vma, addr, 0); goto repeat; @@ -129,7 +129,7 @@ unsigned long page; repeat: - pgdir = PAGE_DIR_OFFSET(vma->vm_task, addr); + pgdir = PAGE_DIR_OFFSET(vma->vm_mm, addr); if (!pgd_present(*pgdir)) { do_no_page(vma, addr, 1); goto repeat; diff -u --recursive --new-file v1.3.23/linux/drivers/block/Makefile linux/drivers/block/Makefile --- v1.3.23/linux/drivers/block/Makefile Mon Aug 28 14:52:18 1995 +++ linux/drivers/block/Makefile Mon Sep 4 07:31:53 1995 @@ -20,101 +20,123 @@ M_OBJS := MOD_LIST_NAME := BLOCK_MODULES -ifdef CONFIG_BLK_DEV_FD +ifeq ($(CONFIG_BLK_DEV_FD),y) L_OBJS += floppy.o else -M_OBJS += floppy.o + ifeq ($(CONFIG_BLK_DEV_FD),m) + M_OBJS += floppy.o + endif endif -ifdef CONFIG_AZTCD +ifeq ($(CONFIG_AZTCD),y) L_OBJS += aztcd.o else -M_OBJS += aztcd.o + ifeq ($(CONFIG_AZTCD),m) + M_OBJS += aztcd.o + endif endif #CONFIG_AZTCD -ifdef CONFIG_CDU31A +ifeq ($(CONFIG_CDU31A),y) L_OBJS += cdu31a.o else -M_OBJS += cdu31a.o + ifeq ($(CONFIG_CDU31A),m) + M_OBJS += cdu31a.o + endif endif #CONFIG_CDU31A -ifdef CONFIG_MCD +ifeq ($(CONFIG_MCD),y) L_OBJS += mcd.o else -M_OBJS += mcd.o + ifeq ($(CONFIG_MCD),m) + M_OBJS += mcd.o + endif endif #CONFIG_MCD -ifdef CONFIG_MCDX +ifeq ($(CONFIG_MCDX),y) L_OBJS += mcdx.o else -M_OBJS += mcdx.o + ifeq ($(CONFIG_MCDX),m) + M_OBJS += mcdx.o + endif endif #CONFIG_MCDX -ifdef CONFIG_SBPCD +ifeq ($(CONFIG_SBPCD),y) L_OBJS += sbpcd.o else -M_OBJS += sbpcd.o + ifeq ($(CONFIG_SBPCD),m) + M_OBJS += sbpcd.o + endif endif #CONFIG_SBPCD -ifdef CONFIG_SBPCD2 +ifeq ($(CONFIG_SBPCD2),y) L_OBJS += sbpcd2.o endif #CONFIG_SBPCD2 -ifdef CONFIG_SBPCD3 +ifeq ($(CONFIG_SBPCD3),y) L_OBJS += sbpcd3.o endif #CONFIG_SBPCD3 -ifdef CONFIG_SBPCD4 +ifeq ($(CONFIG_SBPCD4),y) L_OBJS += sbpcd4.o endif #CONFIG_SBPCD4 -ifdef CONFIG_CDU535 +ifeq ($(CONFIG_CDU535),y) L_OBJS += sonycd535.o else -M_OBJS += sonycd535.o + ifeq ($(CONFIG_CDU535),m) + M_OBJS += sonycd535.o + endif endif #CONFIG_CDU535 -ifdef CONFIG_GSCD +ifeq ($(CONFIG_GSCD),y) L_OBJS += gscd.o else -M_OBJS += gscd.o + ifeq ($(CONFIG_GSCD),m) + M_OBJS += gscd.o + endif endif #CONFIG_GSCD -ifdef CONFIG_CM206 +ifeq ($(CONFIG_CM206),y) L_OBJS += cm206.o else -M_OBJS += cm206.o + ifeq ($(CONFIG_CM206),m) + M_OBJS += cm206.o + endif endif #CONFIG_CM206 -ifdef CONFIG_OPTCD +ifeq ($(CONFIG_OPTCD),y) L_OBJS += optcd.o else -M_OBJS += optcd.o + ifeq ($(CONFIG_OPTCD),m) + M_OBJS += optcd.o + endif endif #CONFIG_OPTCD -ifdef CONFIG_SJCD +ifeq ($(CONFIG_SJCD),y) L_OBJS += sjcd.o #else -#M_OBJS += sjcd.o +# ifeq ($(CONFIG_SJCD),m) +# M_OBJS += sjcd.o +# endif endif #CONFIG_SJCD -ifdef CONFIG_BLK_DEV_HD +ifeq ($(CONFIG_BLK_DEV_HD),y) L_OBJS += hd.o endif -ifdef CONFIG_BLK_DEV_IDE +ifeq ($(CONFIG_BLK_DEV_IDE),y) L_OBJS += ide.o endif -ifdef CONFIG_BLK_DEV_TRITON +ifeq ($(CONFIG_BLK_DEV_TRITON),y) L_OBJS += triton.o endif -ifdef CONFIG_BLK_DEV_IDECD +ifeq ($(CONFIG_BLK_DEV_IDECD),y) L_OBJS += ide-cd.o endif -ifdef CONFIG_BLK_DEV_XD +ifeq ($(CONFIG_BLK_DEV_XD),y) L_OBJS += xd.o endif diff -u --recursive --new-file v1.3.23/linux/drivers/block/ide.c linux/drivers/block/ide.c --- v1.3.23/linux/drivers/block/ide.c Sun Sep 3 16:12:48 1995 +++ linux/drivers/block/ide.c Tue Sep 5 09:02:52 1995 @@ -1,5 +1,5 @@ /* - * linux/drivers/block/ide.c Version 5.12 Sep 1, 1995 + * linux/drivers/block/ide.c Version 5.13 Sep 4, 1995 * * Copyright (C) 1994, 1995 Linus Torvalds & authors (see below) */ @@ -37,6 +37,8 @@ * Petri Mattila (ptjmatti@kruuna.helsinki.fi) (EIDE stuff) * Scott Snyder (snyder@fnald0.fnal.gov) (ATAPI IDE cd-rom) * + * Maintained by Mark Lord (mlord@bnr.ca): ide.c, ide.h, triton.c, hd.c, .. + * * This was a rewrite of just about everything from hd.c, though some original * code is still sprinkled about. Think of it as a major evolution, with * inspiration from lots of linux users, esp. hamish@zot.apana.org.au @@ -136,6 +138,8 @@ * driver now forces "serialize" again for all cmd640 chips * noticed REALLY_SLOW_IO had no effect, moved it to ide.c * made do_drive_cmd() into public ide_do_drive_cmd() + * Version 5.13 fixed typo ('B'), thanks to houston@boyd.geog.mcgill.ca + * fixed ht6560b support * * Driver compile-time options are in ide.h * @@ -352,18 +356,18 @@ void ide_hwif_select (ide_hwif_t *hwif) { - static ide_hwif_t *current_hwif = NULL; + static byte current_select = 0; - if (hwif != current_hwif) { + if (hwif->select != current_select) { unsigned long flags; save_flags (flags); cli(); + current_select = hwif->select; (void) inb(0x3e6); (void) inb(0x3e6); (void) inb(0x3e6); (void) inb(0x3e6); - outb(0x1c,hwif->select); - current_hwif = hwif; + outb(current_select,0x3e6); restore_flags (flags); } } @@ -1724,7 +1728,8 @@ }; drive->part[0].nr_sects = current_capacity(drive); - resetup_one_dev(HWIF(drive)->gd, drive->select.b.unit); + if (drive->media == disk) + resetup_one_dev(HWIF(drive)->gd, drive->select.b.unit); drive->busy = 0; wake_up(&drive->wqueue); @@ -2582,6 +2587,11 @@ * * Need to add an ioctl to select between them. */ + if (check_region(0x3e6,1)) { + printk(" -- HT6560 PORT 0x3e6 ALREADY IN USE"); + goto done; + } + request_region(0x3e6, 1, hwif->name); ide_hwifs[0].select = 0x3c; ide_hwifs[1].select = 0x3d; goto do_serialize; @@ -2921,7 +2931,6 @@ if (hwif->irq == HD_IRQ && hwif->io_base != HD_DATA) { printk("%s: CANNOT SHARE IRQ WITH OLD HARDDISK DRIVER (hd.c)\n", hwif->name); hwif->present = 0; -B } #endif /* CONFIG_BLK_DEV_HD */ } diff -u --recursive --new-file v1.3.23/linux/drivers/block/ide.h linux/drivers/block/ide.h --- v1.3.23/linux/drivers/block/ide.h Sun Sep 3 16:12:49 1995 +++ linux/drivers/block/ide.h Tue Sep 5 14:15:12 1995 @@ -20,7 +20,7 @@ * * REALLY_SLOW_IO can be defined in ide.c and ide-cd.c, if necessary */ -#define REALLY_FAST_IO /* define if ide ports are perfect */ +#undef REALLY_FAST_IO /* define if ide ports are perfect */ #define INITIAL_MULT_COUNT 0 /* off=0; on=2,4,8,16,32, etc.. */ #ifndef DISK_RECOVERY_TIME /* off=0; on=access_delay_time */ diff -u --recursive --new-file v1.3.23/linux/drivers/block/ramdisk.c linux/drivers/block/ramdisk.c --- v1.3.23/linux/drivers/block/ramdisk.c Sun Aug 13 14:45:28 1995 +++ linux/drivers/block/ramdisk.c Mon Sep 4 07:55:16 1995 @@ -216,7 +216,7 @@ return; /* for Slackware install disks */ - printk(KERN_NOTICE "VFS: Insert ramdisk floppy and press ENTER\n"); + printk(KERN_NOTICE "VFS: Insert root floppy to be loaded into ramdisk and press ENTER\n"); wait_for_keypress(); memset(&filp, 0, sizeof(filp)); diff -u --recursive --new-file v1.3.23/linux/drivers/char/Makefile linux/drivers/char/Makefile --- v1.3.23/linux/drivers/char/Makefile Tue Aug 15 20:39:02 1995 +++ linux/drivers/char/Makefile Mon Sep 4 07:31:53 1995 @@ -34,10 +34,12 @@ L_OBJS += busmouse.o endif -ifdef CONFIG_PRINTER +ifeq ($(CONFIG_PRINTER),y) L_OBJS += lp.o else -M_OBJS += lp.o + ifeq ($(CONFIG_PRINTER),m) + M_OBJS += lp.o + endif endif ifdef CONFIG_MS_BUSMOUSE diff -u --recursive --new-file v1.3.23/linux/drivers/char/psaux.c linux/drivers/char/psaux.c --- v1.3.23/linux/drivers/char/psaux.c Sun Sep 3 12:26:52 1995 +++ linux/drivers/char/psaux.c Tue Sep 5 12:21:27 1995 @@ -84,7 +84,7 @@ #define QP_DATA 0x310 /* Data Port I/O Address */ #define QP_STATUS 0x311 /* Status Port I/O Address */ -#define QP_DEV_IDLE 0x01 /* Device Idle */ +#define QP_DEV_IDLE 0x01 /* Device Idle */ #define QP_RX_FULL 0x02 /* Device Char received */ #define QP_TX_IDLE 0x04 /* Device XMIT Idle */ #define QP_RESET 0x08 /* Device Reset */ @@ -140,11 +140,10 @@ /* * Write to device & handle returned ack */ - #if defined INITIALIZE_DEVICE static int aux_write_ack(int val) { - int retries = 0; + int retries = 0; poll_aux_status_nosleep(); outb_p(AUX_MAGIC_WRITE,AUX_COMMAND); @@ -261,11 +260,11 @@ unsigned char status; if (!poll_qp_status()) - printk("Warning: Mouse device busy in release_qp()\n"); + printk("Warning: Mouse device busy in release_qp()\n"); status = inb_p(qp_status); outb_p(status & ~(QP_ENABLE|QP_INTS_ON), qp_status); if (!poll_qp_status()) - printk("Warning: Mouse device busy in release_qp()\n"); + printk("Warning: Mouse device busy in release_qp()\n"); free_irq(QP_IRQ); fasync_aux(inode, file, 0); qp_busy = 0; @@ -275,6 +274,7 @@ static int fasync_aux(struct inode *inode, struct file *filp, int on) { struct fasync_struct *fa, *prev; + unsigned long flags; for (fa = queue->fasync, prev = 0; fa; prev= fa, fa = fa->fa_next) { if (fa->fa_file == filp) @@ -287,21 +287,27 @@ fa = (struct fasync_struct *)kmalloc(sizeof(struct fasync_struct), GFP_KERNEL); if (!fa) return -ENOMEM; + save_flags(flags); + cli(); fa->magic = FASYNC_MAGIC; fa->fa_file = filp; fa->fa_next = queue->fasync; queue->fasync = fa; + restore_flags(flags); } else { if (!fa) return 0; + save_flags(flags); + cli(); if (prev) prev->fa_next = fa->fa_next; else queue->fasync = fa->fa_next; + restore_flags(flags); kfree_s(fa, sizeof(struct fasync_struct)); } - return 0; + return 0; } /* @@ -318,7 +324,7 @@ if (!poll_aux_status()) return -EBUSY; aux_busy = 1; - queue->head = queue->tail = 0; /* Flush input queue */ + queue->head = queue->tail = 0; /* Flush input queue */ if (request_irq(AUX_IRQ, aux_interrupt, 0, "PS/2 Mouse")) { aux_busy = 0; return -EBUSY; @@ -341,7 +347,7 @@ static int open_qp(struct inode * inode, struct file * file) { - unsigned char status; + unsigned char status; if (!qp_present) return -EINVAL; @@ -365,9 +371,9 @@ outb_p(status, qp_status); /* Enable interrupts */ while (!poll_qp_status()) { - printk("Error: Mouse device busy in open_qp()\n"); + printk("Error: Mouse device busy in open_qp()\n"); return -EBUSY; - } + } outb_p(AUX_ENABLE_DEV, qp_data); /* Wake up mouse */ @@ -437,8 +443,8 @@ goto repeat; } current->state = TASK_RUNNING; - remove_wait_queue(&queue->proc_list, &wait); - } + remove_wait_queue(&queue->proc_list, &wait); + } while (i > 0 && !queue_empty()) { c = get_from_queue(); put_user(c, buffer++); @@ -488,11 +494,11 @@ unsigned long psaux_init(unsigned long kmem_start) { - int qp_found = 0; + int qp_found = 0; #ifdef CONFIG_82C710_MOUSE - if ((qp_found = probe_qp())) { - printk("82C710 type pointing device detected -- driver installed.\n"); + if ((qp_found = probe_qp())) { + printk("82C710 type pointing device detected -- driver installed.\n"); /* printk("82C710 address = %x (should be 0x310)\n", qp_data); */ qp_present = 1; psaux_fops.write = write_qp; @@ -501,8 +507,8 @@ } else #endif if (aux_device_present == 0xaa) { - printk("PS/2 auxiliary pointing device detected -- driver installed.\n"); - aux_present = 1; + printk("PS/2 auxiliary pointing device detected -- driver installed.\n"); + aux_present = 1; kbd_read_mask = AUX_OBUF_FULL; } else { return kmem_start; /* No mouse at all */ @@ -514,15 +520,15 @@ queue->proc_list = NULL; if (!qp_found) { #if defined INITIALIZE_DEVICE - outb_p(AUX_ENABLE,AUX_COMMAND); /* Enable Aux */ - aux_write_ack(AUX_SET_SAMPLE); - aux_write_ack(100); /* 100 samples/sec */ - aux_write_ack(AUX_SET_RES); - aux_write_ack(3); /* 8 counts per mm */ - aux_write_ack(AUX_SET_SCALE21); /* 2:1 scaling */ - poll_aux_status_nosleep(); + outb_p(AUX_ENABLE,AUX_COMMAND); /* Enable Aux */ + aux_write_ack(AUX_SET_SAMPLE); + aux_write_ack(100); /* 100 samples/sec */ + aux_write_ack(AUX_SET_RES); + aux_write_ack(3); /* 8 counts per mm */ + aux_write_ack(AUX_SET_SCALE21); /* 2:1 scaling */ + poll_aux_status_nosleep(); #endif /* INITIALIZE_DEVICE */ - outb_p(AUX_DISABLE,AUX_COMMAND); /* Disable Aux device */ + outb_p(AUX_DISABLE,AUX_COMMAND); /* Disable Aux device */ poll_aux_status_nosleep(); outb_p(AUX_CMD_WRITE,AUX_COMMAND); poll_aux_status_nosleep(); /* Disable interrupts */ @@ -568,11 +574,11 @@ int retries=0; while ((inb(qp_status)&(QP_RX_FULL|QP_TX_IDLE|QP_DEV_IDLE)) - != (QP_DEV_IDLE|QP_TX_IDLE) - && retries < MAX_RETRIES) { + != (QP_DEV_IDLE|QP_TX_IDLE) + && retries < MAX_RETRIES) { - if (inb_p(qp_status)&(QP_RX_FULL)) - inb_p(qp_data); + if (inb_p(qp_status)&(QP_RX_FULL)) + inb_p(qp_data); current->state = TASK_INTERRUPTIBLE; current->timeout = jiffies + (5*HZ + 99) / 100; schedule(); @@ -587,7 +593,7 @@ static inline unsigned char read_710(unsigned char index) { - outb_p(index, 0x390); /* Write index */ + outb_p(index, 0x390); /* Write index */ return inb_p(0x391); /* Read the data */ } @@ -597,7 +603,7 @@ static int probe_qp(void) { - outb_p(0x55, 0x2fa); /* Any value except 9, ff or 36 */ + outb_p(0x55, 0x2fa); /* Any value except 9, ff or 36 */ outb_p(0xaa, 0x3fa); /* Inverse of 55 */ outb_p(0x36, 0x3fa); /* Address the chip */ outb_p(0xe4, 0x3fa); /* 390/4; 390 = config address */ diff -u --recursive --new-file v1.3.23/linux/drivers/net/Makefile linux/drivers/net/Makefile --- v1.3.23/linux/drivers/net/Makefile Sun Sep 3 16:12:49 1995 +++ linux/drivers/net/Makefile Mon Sep 4 07:38:03 1995 @@ -12,262 +12,342 @@ M_OBJS := MOD_LIST_NAME := NET_MODULES -ifdef CONFIG_SEEQ8005 +ifeq ($(CONFIG_SEEQ8005),y) L_OBJS += seeq8005.o endif -ifdef CONFIG_IBMTR +ifeq ($(CONFIG_IBMTR),y) L_OBJS += ibmtr.o else -M_OBJS += ibmtr.o + ifeq ($(CONFIG_IBMTR),m) + M_OBJS += ibmtr.o + endif endif -ifdef CONFIG_SK_G16 +ifeq ($(CONFIG_SK_G16),y) L_OBJS += sk_g16.o endif -ifdef CONFIG_NET_IPIP +ifeq ($(CONFIG_NET_IPIP),y) L_OBJS += tunnel.o else -M_OBJS += tunnel.o + ifeq ($(CONFIG_NET_IPIP),m) + M_OBJS += tunnel.o + endif endif -ifdef CONFIG_HP100 +ifeq ($(CONFIG_HP100),y) L_OBJS += hp100.o else -M_OBJS += hp100.o + ifeq ($(CONFIG_HP100),m) + M_OBJS += hp100.o + endif endif -ifdef CONFIG_WD80x3 +ifeq ($(CONFIG_WD80x3),y) L_OBJS += wd.o -CONFIG_8390 = CONFIG_8390 +CONFIG_8390 = y else -M_OBJS += wd.o + ifeq ($(CONFIG_WD80x3),m) + CONFIG_8390 = m + M_OBJS += wd.o + endif endif -ifdef CONFIG_EL2 +ifeq ($(CONFIG_EL2),y) L_OBJS += 3c503.o -CONFIG_8390 = CONFIG_8390 +CONFIG_8390 = y else -M_OBJS += 3c503.o + ifeq ($(CONFIG_EL2),m) + CONFIG_8390 = m + M_OBJS += 3c503.o + endif endif -ifdef CONFIG_NE2000 +ifeq ($(CONFIG_NE2000),y) L_OBJS += ne.o -CONFIG_8390 = CONFIG_8390 +CONFIG_8390 = y else -M_OBJS += ne.o + ifeq ($(CONFIG_NE2000),m) + CONFIG_8390 = m + M_OBJS += ne.o + endif endif -ifdef CONFIG_HPLAN +ifeq ($(CONFIG_HPLAN),y) L_OBJS += hp.o -CONFIG_8390 = CONFIG_8390 +CONFIG_8390 = y else -M_OBJS += hp.o + ifeq ($(CONFIG_HPLAN),m) + CONFIG_8390 = m + M_OBJS += hp.o + endif endif -ifdef CONFIG_HPLAN_PLUS +ifeq ($(CONFIG_HPLAN_PLUS),y) L_OBJS += hp-plus.o -CONFIG_8390 = CONFIG_8390 +CONFIG_8390 = y else -M_OBJS += hp-plus.o + ifeq ($(CONFIG_HPLAN_PLUS),m) + CONFIG_8390 = m + M_OBJS += hp-plus.o + endif endif -ifdef CONFIG_ULTRA +ifeq ($(CONFIG_ULTRA),y) L_OBJS += smc-ultra.o -CONFIG_8390 = CONFIG_8390 +CONFIG_8390 = y else -M_OBJS += smc-ultra.o + ifeq ($(CONFIG_ULTRA),m) + CONFIG_8390 = m + M_OBJS += smc-ultra.o + endif endif -ifdef CONFIG_E2100 +ifeq ($(CONFIG_E2100),y) L_OBJS += e2100.o -CONFIG_8390 = CONFIG_8390 +CONFIG_8390 = y else -M_OBJS += e2100.o + ifeq ($(CONFIG_E2100),m) + CONFIG_8390 = m + M_OBJS += e2100.o + endif endif -ifdef CONFIG_PLIP +ifeq ($(CONFIG_PLIP),y) L_OBJS += plip.o else -M_OBJS += plip.o + ifeq ($(CONFIG_PLIP),m) + M_OBJS += plip.o + endif endif -ifdef CONFIG_PPP +ifeq ($(CONFIG_PPP),y) L_OBJS += ppp.o -CONFIG_SLHC = CONFIG_SLHC +CONFIG_SLHC = y else -M_OBJS += ppp.o + ifeq ($(CONFIG_PPP),m) + CONFIG_SLHC = m + M_OBJS += ppp.o + endif endif -ifdef CONFIG_SLIP +ifeq ($(CONFIG_SLIP),y) L_OBJS += slip.o -CONFIG_SLHC = CONFIG_SLHC +CONFIG_SLHC = y else -M_OBJS += slip.o + ifeq ($(CONFIG_SLIP),m) + CONFIG_SLHC = m + M_OBJS += slip.o + endif endif -ifdef CONFIG_DE650 +ifeq ($(CONFIG_DE650),y) ETDRV_OBJS := $(L_OBJS) de650.o -CONFIG_8390 = CONFIG_8390 +CONFIG_8390 = y endif -ifdef CONFIG_3C589 +ifeq ($(CONFIG_3C589),y) L_OBJS += 3c589.o endif -ifdef CONFIG_DUMMY +ifeq ($(CONFIG_DUMMY),y) L_OBJS += dummy.o else -M_OBJS += dummy.o + ifeq ($(CONFIG_DUMMY),m) + M_OBJS += dummy.o + endif endif -ifdef CONFIG_DE600 +ifeq ($(CONFIG_DE600),y) L_OBJS += de600.o else -M_OBJS += de600.o + ifeq ($(CONFIG_DE600),m) + M_OBJS += de600.o + endif endif -ifdef CONFIG_DE620 +ifeq ($(CONFIG_DE620),y) L_OBJS += de620.o else -M_OBJS += de620.o + ifeq ($(CONFIG_DE620),m) + M_OBJS += de620.o + endif endif -ifdef CONFIG_AT1500 +ifeq ($(CONFIG_AT1500),y) L_OBJS += lance.o endif -ifdef CONFIG_LANCE +ifeq ($(CONFIG_LANCE),y) L_OBJS += lance.o endif -ifdef CONFIG_AT1700 +ifeq ($(CONFIG_AT1700),y) L_OBJS += at1700.o else -M_OBJS += at1700.o + ifeq ($(CONFIG_AT1700),m) + M_OBJS += at1700.o + endif endif -ifdef CONFIG_EL1 +ifeq ($(CONFIG_EL1),y) L_OBJS += 3c501.o else -M_OBJS += 3c501.o + ifeq ($(CONFIG_EL1),m) + M_OBJS += 3c501.o + endif endif -ifdef CONFIG_EL16 +ifeq ($(CONFIG_EL16),y) L_OBJS += 3c507.o else -M_OBJS += 3c507.o + ifeq ($(CONFIG_EL16),m) + M_OBJS += 3c507.o + endif endif -ifdef CONFIG_EL3 +ifeq ($(CONFIG_EL3),y) L_OBJS += 3c509.o else -M_OBJS += 3c509.o + ifeq ($(CONFIG_EL3),m) + M_OBJS += 3c509.o + endif endif -ifdef CONFIG_EEXPRESS +ifeq ($(CONFIG_EEXPRESS),y) L_OBJS += eexpress.o else -M_OBJS += eexpress.o + ifeq ($(CONFIG_EEXPRESS),m) + M_OBJS += eexpress.o + endif endif -ifdef CONFIG_EEXPRESS_PRO +ifeq ($(CONFIG_EEXPRESS_PRO),y) L_OBJS += eepro.o else -M_OBJS += eepro.o + ifeq ($(CONFIG_EEXPRESS_PRO),m) + M_OBJS += eepro.o + endif endif -ifdef CONFIG_WAVELAN +ifeq ($(CONFIG_WAVELAN),y) L_OBJS += wavelan.o else -M_OBJS += wavelan.o + ifeq ($(CONFIG_WAVELAN),m) + M_OBJS += wavelan.o + endif endif -ifdef CONFIG_ZNET +ifeq ($(CONFIG_ZNET),y) L_OBJS += znet.o endif -ifdef CONFIG_DEPCA +ifeq ($(CONFIG_DEPCA),y) L_OBJS += depca.o else -M_OBJS += depca.o + ifeq ($(CONFIG_DEPCA),m) + M_OBJS += depca.o + endif endif -ifdef CONFIG_EWRK3 +ifeq ($(CONFIG_EWRK3),y) L_OBJS += ewrk3.o else -M_OBJS += ewrk3.o + ifeq ($(CONFIG_EWRK3),m) + M_OBJS += ewrk3.o + endif endif -ifdef CONFIG_ATP +ifeq ($(CONFIG_ATP),y) L_OBJS += atp.o endif -ifdef CONFIG_DE4X5 +ifeq ($(CONFIG_DE4X5),y) L_OBJS += de4x5.o else -M_OBJS += de4x5.o + ifeq ($(CONFIG_DE4X5),m) + M_OBJS += de4x5.o + endif endif -ifdef CONFIG_NI52 +ifeq ($(CONFIG_NI52),y) L_OBJS += ni52.o endif -ifdef CONFIG_NI65 +ifeq ($(CONFIG_NI65),y) L_OBJS += ni65.o endif -ifdef CONFIG_ELPLUS +ifeq ($(CONFIG_ELPLUS),y) L_OBJS += 3c505.o else -M_OBJS += 3c505.o + ifeq ($(CONFIG_ELPLUS),m) + M_OBJS += 3c505.o + endif endif -ifdef CONFIG_AC3200 +ifeq ($(CONFIG_AC3200),y) L_OBJS += ac3200.o -CONFIG_8390 = CONFIG_8390 +CONFIG_8390 = y else -M_OBJS += ac3200.o + ifeq ($(CONFIG_AC3200),m) + CONFIG_8390 = m + M_OBJS += ac3200.o + endif endif -ifdef CONFIG_APRICOT +ifeq ($(CONFIG_APRICOT),y) L_OBJS += apricot.o else -M_OBJS += apricot.o + ifeq ($(CONFIG_APRICOT),m) + M_OBJS += apricot.o + endif endif -ifdef CONFIG_DEC_ELCP +ifeq ($(CONFIG_DEC_ELCP),y) L_OBJS += tulip.o else -M_OBJS += tulip.o + ifeq ($(CONFIG_DEC_ELCP),m) + M_OBJS += tulip.o + endif endif -ifdef CONFIG_ARCNET +ifeq ($(CONFIG_ARCNET),y) L_OBJS += arcnet.o +else + ifeq ($(CONFIG_ARCNET),m) + M_OBJS += arcnet.o + endif endif -ifdef CONFIG_PI +ifeq ($(CONFIG_PI),y) L_OBJS += pi2.o CONFIG_PI = CONFIG_PI endif -ifdef CONFIG_SLHC +ifeq ($(CONFIG_SLHC),y) L_OBJS += slhc.o else -M_OBJS += slhc.o + ifeq ($(CONFIG_SLHC),m) + M_OBJS += slhc.o + endif endif -ifdef CONFIG_8390 +ifeq ($(CONFIG_8390),y) L_OBJS += 8390.o else -M_OBJS += 8390.o + ifeq ($(CONFIG_8390),m) + M_OBJS += 8390.o + endif endif -ifdef CONFIG_EQUALIZER +ifeq ($(CONFIG_EQUALIZER),y) L_OBJS += eql.o else -M_OBJS += eql.o + ifeq ($(CONFIG_EQUALIZER),m) + M_OBJS += eql.o + endif endif include $(TOPDIR)/Rules.make diff -u --recursive --new-file v1.3.23/linux/drivers/net/net_init.c linux/drivers/net/net_init.c --- v1.3.23/linux/drivers/net/net_init.c Sun Sep 3 12:26:54 1995 +++ linux/drivers/net/net_init.c Mon Sep 4 14:48:37 1995 @@ -15,6 +15,9 @@ Modifications/additions by Bjorn Ekwall : ethdev_index[MAX_ETH_CARDS] register_netdev() / unregister_netdev() + + Modifications by Wolfgang Walter + Use dev_close cleanly so we always shut things down tidily. */ #include diff -u --recursive --new-file v1.3.23/linux/drivers/scsi/Makefile linux/drivers/scsi/Makefile --- v1.3.23/linux/drivers/scsi/Makefile Mon Aug 28 14:52:20 1995 +++ linux/drivers/scsi/Makefile Mon Sep 4 07:31:54 1995 @@ -43,146 +43,193 @@ M_OBJS += scsi_mod.o endif -ifdef CONFIG_CHR_DEV_ST +ifeq ($(CONFIG_CHR_DEV_ST),y) L_OBJS += st.o else -M_OBJS += st.o + ifeq ($(CONFIG_CHR_DEV_ST),m) + M_OBJS += st.o + endif endif -ifdef CONFIG_BLK_DEV_SD +ifeq ($(CONFIG_BLK_DEV_SD),y) L_OBJS += sd.o sd_ioctl.o else -M_OBJS += sd_mod.o + ifeq ($(CONFIG_BLK_DEV_SD),m) + M_OBJS += sd_mod.o + endif endif -ifdef CONFIG_BLK_DEV_SR +ifeq ($(CONFIG_BLK_DEV_SR),y) L_OBJS += sr.o sr_ioctl.o else -M_OBJS += sr_mod.o + ifeq ($(CONFIG_BLK_DEV_SR),m) + M_OBJS += sr_mod.o + endif endif -ifdef CONFIG_CHR_DEV_SG +ifeq ($(CONFIG_CHR_DEV_SG),y) L_OBJS += sg.o else -M_OBJS += sg.o + ifeq ($(CONFIG_CHR_DEV_SG),m) + M_OBJS += sg.o + endif endif -ifdef CONFIG_SCSI_QLOGIC +ifeq ($(CONFIG_SCSI_QLOGIC),y) L_OBJS += qlogic.o else -M_OBJS += qlogic.o + ifeq ($(CONFIG_SCSI_QLOGIC),m) + M_OBJS += qlogic.o + endif endif -ifdef CONFIG_SCSI_AHA152X +ifeq ($(CONFIG_SCSI_AHA152X),y) L_OBJS += aha152x.o else -M_OBJS += aha152x.o + ifeq ($(CONFIG_SCSI_AHA152X),m) + M_OBJS += aha152x.o + endif endif -ifdef CONFIG_SCSI_AHA1542 +ifeq ($(CONFIG_SCSI_AHA1542),y) L_OBJS += aha1542.o else -M_OBJS += aha1542.o + ifeq ($(CONFIG_SCSI_AHA1542),m) + M_OBJS += aha1542.o + endif endif -ifdef CONFIG_SCSI_AHA1740 +ifeq ($(CONFIG_SCSI_AHA1740),y) L_OBJS += aha1740.o else -M_OBJS += aha1740.o + ifeq ($(CONFIG_SCSI_AHA1740),m) + M_OBJS += aha1740.o + endif endif -ifdef CONFIG_SCSI_AIC7XXX +ifeq ($(CONFIG_SCSI_AIC7XXX),y) L_OBJS += aic7xxx.o else -M_OBJS += aic7xxx.o + ifeq ($(CONFIG_SCSI_AIC7XXX),m) + M_OBJS += aic7xxx.o + endif endif -ifdef CONFIG_SCSI_BUSLOGIC +ifeq ($(CONFIG_SCSI_BUSLOGIC),y) L_OBJS += buslogic.o else -M_OBJS += buslogic.o + ifeq ($(CONFIG_SCSI_BUSLOGIC),m) + M_OBJS += buslogic.o + endif endif -ifdef CONFIG_SCSI_EATA_DMA +ifeq ($(CONFIG_SCSI_EATA_DMA),y) L_OBJS += eata_dma.o else -M_OBJS += eata_dma.o + ifeq ($(CONFIG_SCSI_EATA_DMA),m) + M_OBJS += eata_dma.o + endif endif -ifdef CONFIG_SCSI_EATA_PIO +ifeq ($(CONFIG_SCSI_EATA_PIO),y) L_OBJS += eata_pio.o else -M_OBJS += eata_pio.o + ifeq ($(CONFIG_SCSI_EATA_PIO),m) + M_OBJS += eata_pio.o + endif endif -ifdef CONFIG_SCSI_U14_34F +ifeq ($(CONFIG_SCSI_U14_34F),y) L_OBJS += u14-34f.o else -M_OBJS += u14-34f.o + ifeq ($(CONFIG_SCSI_U14_34F),m) + M_OBJS += u14-34f.o + endif endif -ifdef CONFIG_SCSI_DEBUG +ifeq ($(CONFIG_SCSI_DEBUG),y) L_OBJS += scsi_debug.o else -M_OBJS += scsi_debug.o + ifeq ($(CONFIG_SCSI_DEBUG),m) + M_OBJS += scsi_debug.o + endif endif -ifdef CONFIG_SCSI_FUTURE_DOMAIN +ifeq ($(CONFIG_SCSI_FUTURE_DOMAIN),y) L_OBJS += fdomain.o else -M_OBJS += fdomain.o + ifeq ($(CONFIG_SCSI_FUTURE_DOMAIN),m) + M_OBJS += fdomain.o + endif endif -ifdef CONFIG_SCSI_IN2000 +ifeq ($(CONFIG_SCSI_IN2000),y) L_OBJS += in2000.o else -M_OBJS += in2000.o + ifeq ($(CONFIG_SCSI_IN2000),m) + M_OBJS += in2000.o + endif endif -ifdef CONFIG_SCSI_GENERIC_NCR5380 +ifeq ($(CONFIG_SCSI_GENERIC_NCR5380),y) L_OBJS += g_NCR5380.o endif -ifdef CONFIG_SCSI_NCR53C7xx +ifeq ($(CONFIG_SCSI_NCR53C7xx),y) L_OBJS += 53c7,8xx.o else -M_OBJS += 53c7,8xx.o + ifeq ($(CONFIG_SCSI_NCR53C7xx),m) + M_OBJS += 53c7,8xx.o + endif endif -ifdef CONFIG_SCSI_PAS16 +ifeq ($(CONFIG_SCSI_PAS16),y) L_OBJS += pas16.o endif -ifdef CONFIG_SCSI_SEAGATE +ifeq ($(CONFIG_SCSI_SEAGATE),y) L_OBJS += seagate.o else -ifdef CONFIG_SCSI_FD_8xx -L_OBJS += seagate.o -else -M_OBJS += seagate.o -endif + ifeq ($(CONFIG_SCSI_SEAGATE),m) + M_OBJS += seagate.o + endif +endif +ifndef CONFIG_SCSI_SEAGATE + ifeq ($(CONFIG_SCSI_FD_8xx),y) + L_OBJS += seagate.o + else + ifeq ($(CONFIG_SCSI_FD_8xx),m) + M_OBJS += seagate.o + endif + endif endif -ifdef CONFIG_SCSI_7000FASST +ifeq ($(CONFIG_SCSI_7000FASST),y) L_OBJS += wd7000.o else -M_OBJS += wd7000.o + ifeq ($(CONFIG_SCSI_7000FASST),m) + M_OBJS += wd7000.o + endif endif -ifdef CONFIG_SCSI_T128 +ifeq ($(CONFIG_SCSI_T128),y) L_OBJS += t128.o endif -ifdef CONFIG_SCSI_ULTRASTOR +ifeq ($(CONFIG_SCSI_ULTRASTOR),y) L_OBJS += ultrastor.o else -M_OBJS += ultrastor.o + ifeq ($(CONFIG_SCSI_ULTRASTOR),m) + M_OBJS += ultrastor.o + endif endif -ifdef CONFIG_SCSI_EATA +ifeq ($(CONFIG_SCSI_EATA),y) L_OBJS += eata.o else -M_OBJS += eata.o + ifeq ($(CONFIG_SCSI_EATA),m) + M_OBJS += eata.o + endif endif include $(TOPDIR)/Rules.make diff -u --recursive --new-file v1.3.23/linux/drivers/scsi/st.c linux/drivers/scsi/st.c --- v1.3.23/linux/drivers/scsi/st.c Sun Sep 3 12:27:00 1995 +++ linux/drivers/scsi/st.c Mon Sep 4 09:46:50 1995 @@ -11,7 +11,7 @@ Copyright 1992, 1993, 1994, 1995 Kai Makisara email Kai.Makisara@metla.fi - Last modified: Thu Aug 31 00:04:12 1995 by root@kai.makisara.fi + Last modified: Sat Sep 2 11:50:15 1995 by root@kai.makisara.fi */ #ifdef MODULE #include @@ -249,13 +249,12 @@ unsigned char cmd[10]; unsigned int flags; + SCpnt = allocate_device(NULL, STp->device, 1); cmd[0] = SPACE; - cmd[1] = 0x01; /* Space FileMarks */ + cmd[1] = ((SCpnt->lun << 5) & 0xe0) | 0x01; /* Space FileMarks */ cmd[2] = cmd[3] = cmd[4] = 0xff; /* -1 filemarks */ cmd[5] = 0; - SCpnt = allocate_device(NULL, STp->device, 1); - SCpnt->sense_buffer[0] = 0; SCpnt->request.dev = dev; scsi_do_cmd(SCpnt, (void *) cmd, (void *) (STp->buffer)->b_data, 0, @@ -320,10 +319,9 @@ #endif memset((STp->buffer)->b_data + offset, 0, transfer - offset); - SCpnt->sense_buffer[0] = 0; memset(cmd, 0, 10); cmd[0] = WRITE_6; - cmd[1] = 1; + cmd[1] = ((SCpnt->lun << 5) & 0xe0) | 1; blks = transfer / STp->block_size; cmd[2] = blks >> 16; cmd[3] = blks >> 8; @@ -465,9 +463,9 @@ return (-EBUSY); } - SCpnt->sense_buffer[0]=0; memset ((void *) &cmd[0], 0, 10); cmd[0] = TEST_UNIT_READY; + cmd[1] = (SCpnt->lun << 5) & 0xe0; SCpnt->request.dev = dev; scsi_do_cmd(SCpnt, (void *) cmd, (void *) (STp->buffer)->b_data, @@ -483,9 +481,9 @@ if ((SCpnt->sense_buffer[0] & 0x70) == 0x70 && (SCpnt->sense_buffer[2] & 0x0f) == UNIT_ATTENTION) { /* New media? */ (STp->mt_status)->mt_fileno = 0 ; - SCpnt->sense_buffer[0]=0; memset ((void *) &cmd[0], 0, 10); cmd[0] = TEST_UNIT_READY; + cmd[1] = (SCpnt->lun << 5) & 0xe0; SCpnt->request.dev = dev; scsi_do_cmd(SCpnt, (void *) cmd, (void *) (STp->buffer)->b_data, @@ -525,9 +523,9 @@ return 0; } - SCpnt->sense_buffer[0]=0; memset ((void *) &cmd[0], 0, 10); cmd[0] = READ_BLOCK_LIMITS; + cmd[1] = (SCpnt->lun << 5) & 0xe0; SCpnt->request.dev = dev; scsi_do_cmd(SCpnt, (void *) cmd, (void *) (STp->buffer)->b_data, @@ -558,9 +556,9 @@ #endif } - SCpnt->sense_buffer[0]=0; memset ((void *) &cmd[0], 0, 10); cmd[0] = MODE_SENSE; + cmd[1] = (SCpnt->lun << 5) & 0xe0; cmd[4] = 12; SCpnt->request.dev = dev; scsi_do_cmd(SCpnt, @@ -687,9 +685,9 @@ if (result == 0 || result == (-ENOSPC)) { SCpnt = allocate_device(NULL, STp->device, 1); - SCpnt->sense_buffer[0] = 0; memset(cmd, 0, 10); cmd[0] = WRITE_FILEMARKS; + cmd[1] = (SCpnt->lun << 5) & 0xe0; cmd[4] = 1 + STp->two_fm; SCpnt->request.dev = dev; scsi_do_cmd( SCpnt, @@ -833,7 +831,7 @@ memset(cmd, 0, 10); cmd[0] = WRITE_6; - cmd[1] = (STp->block_size != 0); + cmd[1] = ((SCpnt->lun << 5) & 0xe0) | (STp->block_size != 0); STp->rw = ST_WRITING; @@ -863,7 +861,6 @@ cmd[2] = blks >> 16; cmd[3] = blks >> 8; cmd[4] = blks; - SCpnt->sense_buffer[0] = 0; SCpnt->request.dev = dev; scsi_do_cmd (SCpnt, (void *) cmd, (STp->buffer)->b_data, transfer, @@ -978,7 +975,6 @@ cmd[2] = blks >> 16; cmd[3] = blks >> 8; cmd[4] = blks; - SCpnt->sense_buffer[0] = 0; SCpnt->request.dev = dev; STp->write_pending = 1; scsi_do_cmd (SCpnt, @@ -1057,7 +1053,7 @@ memset(cmd, 0, 10); cmd[0] = READ_6; - cmd[1] = (STp->block_size != 0); + cmd[1] = ((SCpnt->lun << 5) & 0xe0) | (STp->block_size != 0); if (STp->block_size == 0) blks = bytes = count; else { @@ -1077,7 +1073,6 @@ cmd[3] = blks >> 8; cmd[4] = blks; - SCpnt->sense_buffer[0] = 0; SCpnt->request.dev = dev; scsi_do_cmd (SCpnt, (void *) cmd, (STp->buffer)->b_data, @@ -1643,7 +1638,7 @@ } SCpnt = allocate_device(NULL, STp->device, 1); - SCpnt->sense_buffer[0] = 0; + cmd[1] |= (SCpnt->lun << 5) & 0xe0; SCpnt->request.dev = dev; scsi_do_cmd(SCpnt, (void *) cmd, (void *) (STp->buffer)->b_data, datalen, @@ -1900,7 +1895,6 @@ SCpnt = allocate_device(NULL, STp->device, 1); - SCpnt->sense_buffer[0]=0; memset (scmd, 0, 10); if ((STp->device)->scsi_level < SCSI_2) { scmd[0] = QFA_REQUEST_BLOCK; @@ -1911,7 +1905,7 @@ scmd[1] = 1; } SCpnt->request.dev = dev; - SCpnt->sense_buffer[0] = 0; + scmd[1] |= (SCpnt->lun << 5) & 0xe0; scsi_do_cmd(SCpnt, (void *) scmd, (void *) (STp->buffer)->b_data, 20, st_sleep_done, ST_TIMEOUT, MAX_READY_RETRIES); diff -u --recursive --new-file v1.3.23/linux/fs/Makefile linux/fs/Makefile --- v1.3.23/linux/fs/Makefile Sun Sep 3 12:27:00 1995 +++ linux/fs/Makefile Tue Sep 5 07:50:31 1995 @@ -18,10 +18,12 @@ MOD_LIST_NAME := FS_MODULES ALL_SUB_DIRS = minix ext ext2 msdos proc isofs nfs xiafs umsdos hpfs sysv smbfs -ifdef CONFIG_MINIX_FS +ifeq ($(CONFIG_MINIX_FS),y) SUB_DIRS += minix else -MOD_SUB_DIRS += minix + ifeq ($(CONFIG_MINIX_FS),m) + MOD_SUB_DIRS += minix + endif endif ifdef CONFIG_EXT_FS @@ -32,62 +34,80 @@ SUB_DIRS += ext2 endif -ifdef CONFIG_MSDOS_FS +ifeq ($(CONFIG_MSDOS_FS),y) SUB_DIRS += msdos else -MOD_SUB_DIRS += msdos + ifeq ($(CONFIG_MSDOS_FS),m) + MOD_SUB_DIRS += msdos + endif endif ifdef CONFIG_PROC_FS SUB_DIRS += proc endif -ifdef CONFIG_ISO9660_FS +ifeq ($(CONFIG_ISO9660_FS),y) SUB_DIRS += isofs else -MOD_SUB_DIRS += isofs + ifeq ($(CONFIG_ISO9660_FS),m) + MOD_SUB_DIRS += isofs + endif endif -ifdef CONFIG_NFS_FS +ifeq ($(CONFIG_NFS_FS),y) SUB_DIRS += nfs else -MOD_SUB_DIRS += nfs + ifeq ($(CONFIG_NFS_FS),m) + MOD_SUB_DIRS += nfs + endif endif -ifdef CONFIG_XIA_FS +ifeq ($(CONFIG_XIA_FS),y) SUB_DIRS += xiafs else -MOD_SUB_DIRS += xiafs + ifeq ($(CONFIG_XIA_FS),m) + MOD_SUB_DIRS += xiafs + endif endif -ifdef CONFIG_UMSDOS_FS +ifeq ($(CONFIG_UMSDOS_FS),y) SUB_DIRS += umsdos else -MOD_SUB_DIRS += umsdos + ifeq ($(CONFIG_UMSDOS_FS),m) + MOD_SUB_DIRS += umsdos + endif endif -ifdef CONFIG_SYSV_FS +ifeq ($(CONFIG_SYSV_FS),y) SUB_DIRS += sysv else -MOD_SUB_DIRS += sysv + ifeq ($(CONFIG_SYSV_FS),m) + MOD_SUB_DIRS += sysv + endif endif -ifdef CONFIG_SMB_FS +ifeq ($(CONFIG_SMB_FS),y) SUB_DIRS += smbfs else -MOD_SUB_DIRS += smbfs + ifeq ($(CONFIG_SMB_FS),m) + MOD_SUB_DIRS += smbfs + endif endif -ifdef CONFIG_HPFS_FS +ifeq ($(CONFIG_HPFS_FS),y) SUB_DIRS += hpfs else -MOD_SUB_DIRS += hpfs + ifeq ($(CONFIG_HPFS_FS),m) + MOD_SUB_DIRS += hpfs + endif endif -ifdef CONFIG_BINFMT_ELF +ifeq ($(CONFIG_BINFMT_ELF),y) BINFMTS += binfmt_elf.o else -MOD_SUB_DIRS += binfmt_elf.o + ifeq ($(CONFIG_BINFMT_ELF),m) + M_OBJS += binfmt_elf.o + endif endif include $(TOPDIR)/Rules.make diff -u --recursive --new-file v1.3.23/linux/fs/binfmt_elf.c linux/fs/binfmt_elf.c --- v1.3.23/linux/fs/binfmt_elf.c Sun Sep 3 12:27:00 1995 +++ linux/fs/binfmt_elf.c Mon Sep 4 13:52:30 1995 @@ -97,7 +97,7 @@ mpnt = (struct vm_area_struct *)kmalloc(sizeof(*mpnt), GFP_KERNEL); if (mpnt) { - mpnt->vm_task = current; + mpnt->vm_mm = current->mm; mpnt->vm_start = PAGE_MASK & (unsigned long) p; mpnt->vm_end = TASK_SIZE; mpnt->vm_page_prot = PAGE_COPY; @@ -235,7 +235,7 @@ error = do_mmap(file, vaddr & 0xfffff000, - eppnt->p_filesz + (vaddr & 0xfff), + eppnt->p_filesz + (eppnt->p_vaddr & 0xfff), elf_prot, elf_type, eppnt->p_offset & 0xfffff000); diff -u --recursive --new-file v1.3.23/linux/fs/exec.c linux/fs/exec.c --- v1.3.23/linux/fs/exec.c Sun Sep 3 12:27:00 1995 +++ linux/fs/exec.c Tue Sep 5 11:09:25 1995 @@ -305,7 +305,7 @@ mpnt = (struct vm_area_struct *)kmalloc(sizeof(*mpnt), GFP_KERNEL); if (mpnt) { - mpnt->vm_task = current; + mpnt->vm_mm = current->mm; mpnt->vm_start = PAGE_MASK & (unsigned long) p; mpnt->vm_end = STACK_TOP; mpnt->vm_page_prot = PAGE_COPY; @@ -542,7 +542,7 @@ current->comm[i] = '\0'; /* Release all of the old mmap stuff. */ - exit_mmap(current); + exit_mmap(current->mm); flush_thread(); diff -u --recursive --new-file v1.3.23/linux/fs/proc/array.c linux/fs/proc/array.c --- v1.3.23/linux/fs/proc/array.c Sun Sep 3 12:27:01 1995 +++ linux/fs/proc/array.c Mon Sep 4 13:30:18 1995 @@ -293,7 +293,7 @@ if (!p || ptr >= TASK_SIZE) return 0; - page_dir = pgd_offset(p,ptr); + page_dir = pgd_offset(p->mm,ptr); if (pgd_none(*page_dir)) return 0; if (pgd_bad(*page_dir)) { @@ -556,7 +556,7 @@ struct vm_area_struct * vma = (*p)->mm->mmap; while (vma) { - pgd_t *pgd = pgd_offset(*p, vma->vm_start); + pgd_t *pgd = pgd_offset((*p)->mm, vma->vm_start); int pages = 0, shared = 0, dirty = 0, total = 0; statm_pgd_range(pgd, vma->vm_start, vma->vm_end, &pages, &shared, &dirty, &total); diff -u --recursive --new-file v1.3.23/linux/fs/proc/mem.c linux/fs/proc/mem.c --- v1.3.23/linux/fs/proc/mem.c Sun Sep 3 12:27:01 1995 +++ linux/fs/proc/mem.c Mon Sep 4 12:58:55 1995 @@ -81,7 +81,7 @@ while (count > 0) { if (current->signal & ~current->blocked) break; - page_dir = pgd_offset(tsk,addr); + page_dir = pgd_offset(tsk->mm,addr); if (pgd_none(*page_dir)) break; if (pgd_bad(*page_dir)) { @@ -236,7 +236,7 @@ if (!src_vma || (src_vma->vm_flags & VM_SHM)) return -EINVAL; - src_dir = pgd_offset(tsk, stmp); + src_dir = pgd_offset(tsk->mm, stmp); if (pgd_none(*src_dir)) return -EINVAL; if (pgd_bad(*src_dir)) { @@ -271,11 +271,11 @@ while (src_vma && stmp > src_vma->vm_end) src_vma = src_vma->vm_next; - src_dir = pgd_offset(tsk, stmp); + src_dir = pgd_offset(tsk->mm, stmp); src_middle = pmd_offset(src_dir, stmp); src_table = pte_offset(src_middle, stmp); - dest_dir = pgd_offset(current, dtmp); + dest_dir = pgd_offset(current->mm, dtmp); dest_middle = pmd_alloc(dest_dir, dtmp); if (!dest_middle) return -ENOMEM; @@ -284,10 +284,10 @@ return -ENOMEM; if (!pte_present(*src_table)) - do_no_page(src_vma, stmp, 1); + do_no_page(tsk, src_vma, stmp, 1); if ((vma->vm_flags & VM_WRITE) && !pte_write(*src_table)) - do_wp_page(src_vma, stmp, 1); + do_wp_page(tsk, src_vma, stmp, 1); set_pte(src_table, pte_mkdirty(*src_table)); set_pte(dest_table, *src_table); diff -u --recursive --new-file v1.3.23/linux/include/asm-alpha/processor.h linux/include/asm-alpha/processor.h --- v1.3.23/linux/include/asm-alpha/processor.h Fri Jun 2 13:53:58 1995 +++ linux/include/asm-alpha/processor.h Mon Sep 4 13:00:38 1995 @@ -37,7 +37,7 @@ unsigned long res1, res2; }; -#define INIT_MMAP { &init_task, 0xfffffc0000000000, 0xfffffc0010000000, \ +#define INIT_MMAP { &init_mm, 0xfffffc0000000000, 0xfffffc0010000000, \ PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC } #define INIT_TSS { \ diff -u --recursive --new-file v1.3.23/linux/include/asm-i386/pgtable.h linux/include/asm-i386/pgtable.h --- v1.3.23/linux/include/asm-i386/pgtable.h Tue Aug 8 12:31:41 1995 +++ linux/include/asm-i386/pgtable.h Mon Sep 4 09:01:07 1995 @@ -219,9 +219,9 @@ { return pmd_val(pmd) & PAGE_MASK; } /* to find an entry in a page-table-directory */ -extern inline pgd_t * pgd_offset(struct task_struct * tsk, unsigned long address) +extern inline pgd_t * pgd_offset(struct mm_struct * mm, unsigned long address) { - return (pgd_t *) tsk->tss.cr3 + (address >> PGDIR_SHIFT); + return mm->pgd + (address >> PGDIR_SHIFT); } /* Find an entry in the second-level page table.. */ diff -u --recursive --new-file v1.3.23/linux/include/asm-i386/processor.h linux/include/asm-i386/processor.h --- v1.3.23/linux/include/asm-i386/processor.h Fri Jun 16 22:02:55 1995 +++ linux/include/asm-i386/processor.h Mon Sep 4 13:00:28 1995 @@ -106,7 +106,7 @@ unsigned long v86flags, v86mask, v86mode; }; -#define INIT_MMAP { &init_task, 0, 0x40000000, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC } +#define INIT_MMAP { &init_mm, 0, 0x40000000, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC } #define INIT_TSS { \ 0,0, \ diff -u --recursive --new-file v1.3.23/linux/include/linux/igmp.h linux/include/linux/igmp.h --- v1.3.23/linux/include/linux/igmp.h Sun Sep 3 16:12:49 1995 +++ linux/include/linux/igmp.h Mon Sep 4 14:48:36 1995 @@ -4,6 +4,8 @@ * Authors: * Alan Cox * + * Extended to talk the BSD extended IGMP protocol of mrouted 3.6 + * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,30 +26,37 @@ struct igmphdr { - unsigned char type; - unsigned char code; - unsigned short csum; - unsigned long group; + __u8 type; + __u8 code; /* For newer IGMP */ + __u16 csum; + __u32 group; }; +#define IGMP_HOST_MEMBERSHIP_QUERY 0x11 /* From RFC1112 */ +#define IGMP_HOST_MEMBERSHIP_REPORT 0x12 /* Ditto */ +#define IGMP_DVMRP 0x13 /* DVMRP routing */ +#define IGMP_PIM 0x14 /* PIM routing */ +#define IGMP_HOST_NEW_MEMBERSHIP_REPORT 0x16 /* New version of 0x11 */ +#define IGMP_HOST_LEAVE_MESSAGE 0x17 /* An extra BSD seems to send */ + +#define IGMP_MTRACE_RESP 0x1e +#define IGMP_MTRACE 0x1f + /* - * Header in host convenient format + * Use the BSD names for these for compatibility */ -struct igmp_header -{ - unsigned char type; - unsigned char code; - unsigned short csum; - unsigned long group; -}; +#define IGMP_DELAYING_MEMBER 0x01 +#define IGMP_IDLE_MEMBER 0x02 +#define IGMP_LAZY_MEMBER 0x03 +#define IGMP_SLEEPING_MEMBER 0x04 +#define IGMP_AWAKENING_MEMBER 0x05 + +#define IGMP_OLD_ROUTER 0x00 +#define IGMP_NEW_ROUTER 0x01 -#define IGMP_HOST_MEMBERSHIP_QUERY 0x11 /* From RFC1112 */ -#define IGMP_HOST_MEMBERSHIP_REPORT 0x12 /* Ditto */ -#define IGMP_HOST_LEAVE_MESSAGE 0x17 /* An extra BSD seems to send */ - /* 224.0.0.1 */ #define IGMP_ALL_HOSTS htonl(0xE0000001L) /* diff -u --recursive --new-file v1.3.23/linux/include/linux/mm.h linux/include/linux/mm.h --- v1.3.23/linux/include/linux/mm.h Mon Aug 28 14:52:23 1995 +++ linux/include/linux/mm.h Tue Sep 5 10:14:01 1995 @@ -33,7 +33,7 @@ * library, the executable area etc). */ struct vm_area_struct { - struct task_struct * vm_task; /* VM area parameters */ + struct mm_struct * vm_mm; /* VM area parameters */ unsigned long vm_start; unsigned long vm_end; pgprot_t vm_page_prot; @@ -181,8 +181,8 @@ extern int zeromap_page_range(unsigned long from, unsigned long size, pgprot_t prot); extern void handle_mm_fault(struct vm_area_struct *vma, unsigned long address, int write_access); -extern void do_wp_page(struct vm_area_struct * vma, unsigned long address, int write_access); -extern void do_no_page(struct vm_area_struct * vma, unsigned long address, int write_access); +extern void do_wp_page(struct task_struct * tsk, struct vm_area_struct * vma, unsigned long address, int write_access); +extern void do_no_page(struct task_struct * tsk, struct vm_area_struct * vma, unsigned long address, int write_access); extern unsigned long paging_init(unsigned long start_mem, unsigned long end_mem); extern void mem_init(unsigned long start_mem, unsigned long end_mem); @@ -201,7 +201,7 @@ extern void swap_free(unsigned long); extern void swap_duplicate(unsigned long); -extern void swap_in(struct vm_area_struct *, pte_t *, unsigned long id, int write_access); +extern void swap_in(struct task_struct *, struct vm_area_struct *, pte_t *, unsigned long id, int write_access); extern void si_swapinfo(struct sysinfo * val); extern void rw_swap_page(int rw, unsigned long nr, char * buf); @@ -214,8 +214,8 @@ extern void merge_segments(struct task_struct *, unsigned long, unsigned long); extern void insert_vm_struct(struct task_struct *, struct vm_area_struct *); extern void remove_shared_vm_struct(struct vm_area_struct *); -extern void build_mmap_avl(struct task_struct *); -extern void exit_mmap(struct task_struct *); +extern void build_mmap_avl(struct mm_struct *); +extern void exit_mmap(struct mm_struct *); extern int do_munmap(unsigned long, size_t); extern unsigned long get_unmapped_area(unsigned long, unsigned long); diff -u --recursive --new-file v1.3.23/linux/include/linux/pci.h linux/include/linux/pci.h --- v1.3.23/linux/include/linux/pci.h Sun Sep 3 12:27:03 1995 +++ linux/include/linux/pci.h Mon Sep 4 15:12:50 1995 @@ -132,7 +132,7 @@ #define PCI_CLASS_STORAGE_IDE 0x0101 #define PCI_CLASS_STORAGE_FLOPPY 0x0102 #define PCI_CLASS_STORAGE_IPI 0x0103 -#define PCI_CLASS_STORAGE_RAID 0x0104 +#define PCI_CLASS_STORAGE_RAID 0x0104 #define PCI_CLASS_STORAGE_OTHER 0x0180 #define PCI_BASE_CLASS_NETWORK 0x02 diff -u --recursive --new-file v1.3.23/linux/include/linux/sched.h linux/include/linux/sched.h --- v1.3.23/linux/include/linux/sched.h Sun Sep 3 12:27:03 1995 +++ linux/include/linux/sched.h Mon Sep 4 13:02:29 1995 @@ -19,6 +19,7 @@ #include #include #include +#include /* * These are the constant used to fake the fixed-point load-average @@ -114,6 +115,7 @@ struct mm_struct { int count; + pgd_t * pgd; unsigned long start_code, end_code, start_data, end_data; unsigned long start_brk, brk, start_stack, start_mmap; unsigned long arg_start, arg_end, env_start, env_end; @@ -130,6 +132,7 @@ #define INIT_MM { \ 1, \ + swapper_pg_dir, \ 0, 0, 0, 0, \ 0, 0, 0, 0, \ 0, 0, 0, 0, \ @@ -261,6 +264,7 @@ #ifdef __KERNEL__ +extern struct mm_struct init_mm; extern struct task_struct init_task; extern struct task_struct *task[NR_TASKS]; extern struct task_struct *last_task_used_math; diff -u --recursive --new-file v1.3.23/linux/include/net/sock.h linux/include/net/sock.h --- v1.3.23/linux/include/net/sock.h Sun Sep 3 12:27:03 1995 +++ linux/include/net/sock.h Tue Sep 5 14:16:35 1995 @@ -352,6 +352,7 @@ int *optlen); extern struct sk_buff *sock_alloc_send_skb(struct sock *skb, unsigned long size, + unsigned long fallback, int noblock, int *errcode); diff -u --recursive --new-file v1.3.23/linux/ipc/shm.c linux/ipc/shm.c --- v1.3.23/linux/ipc/shm.c Sun Sep 3 12:27:03 1995 +++ linux/ipc/shm.c Mon Sep 4 13:31:26 1995 @@ -393,8 +393,8 @@ if (shp->attaches != shmd) { printk("shm_close: shm segment (id=%ld) attach list inconsistent\n", SWP_OFFSET(shmd->vm_pte) & SHM_ID_MASK); - printk("shm_close: %d %08lx-%08lx %c%c%c%c %08lx %08lx\n", - shmd->vm_task->pid, shmd->vm_start, shmd->vm_end, + printk("shm_close: %08lx-%08lx %c%c%c%c %08lx %08lx\n", + shmd->vm_start, shmd->vm_end, shmd->vm_flags & VM_READ ? 'r' : '-', shmd->vm_flags & VM_WRITE ? 'w' : '-', shmd->vm_flags & VM_EXEC ? 'x' : '-', @@ -435,7 +435,7 @@ tmp < shmd->vm_end; tmp += PAGE_SIZE, shm_sgn += SWP_ENTRY(0, 1 << SHM_IDX_SHIFT)) { - page_dir = pgd_offset(shmd->vm_task,tmp); + page_dir = pgd_offset(shmd->vm_mm,tmp); page_middle = pmd_alloc(page_dir,tmp); if (!page_middle) return -ENOMEM; @@ -514,7 +514,7 @@ shmd->vm_pte = SWP_ENTRY(SHM_SWP_TYPE, id); shmd->vm_start = addr; shmd->vm_end = addr + shp->shm_npages * PAGE_SIZE; - shmd->vm_task = current; + shmd->vm_mm = current->mm; shmd->vm_page_prot = (shmflg & SHM_RDONLY) ? PAGE_READONLY : PAGE_SHARED; shmd->vm_flags = VM_SHM | VM_MAYSHARE | VM_SHARED | VM_MAYREAD | VM_MAYEXEC | VM_READ | VM_EXEC @@ -738,7 +738,7 @@ tmp = shmd->vm_start + (idx << PAGE_SHIFT) - shmd->vm_offset; if (!(tmp >= shmd->vm_start && tmp < shmd->vm_end)) continue; - page_dir = pgd_offset(shmd->vm_task,tmp); + page_dir = pgd_offset(shmd->vm_mm,tmp); if (pgd_none(*page_dir) || pgd_bad(*page_dir)) { printk("shm_swap: bad pgtbl! id=%ld start=%lx idx=%ld\n", id, shmd->vm_start, idx); @@ -765,8 +765,8 @@ set_pte(page_table, __pte(shmd->vm_pte + SWP_ENTRY(0, idx << SHM_IDX_SHIFT))); mem_map[MAP_NR(pte_page(pte))]--; - if (shmd->vm_task->mm->rss > 0) - shmd->vm_task->mm->rss--; + if (shmd->vm_mm->rss > 0) + shmd->vm_mm->rss--; invalid++; /* continue looping through circular list */ } while (0); diff -u --recursive --new-file v1.3.23/linux/kernel/exit.c linux/kernel/exit.c --- v1.3.23/linux/kernel/exit.c Sun Sep 3 12:27:03 1995 +++ linux/kernel/exit.c Tue Sep 5 10:19:16 1995 @@ -97,6 +97,10 @@ if (STACK_MAGIC != *(unsigned long *)p->kernel_stack_page) printk(KERN_ALERT "release: %s kernel stack corruption. Aiee\n", p->comm); free_page(p->kernel_stack_page); + free_page((long) p->mm); + free_page((long) p->files); + free_page((long) p->fs); + free_page((long) p->sigaction); free_page((long) p); return; } @@ -363,7 +367,6 @@ if (current->files->fd[i]) sys_close(i); } - free_page((long) current->files); } static void exit_fs(void) @@ -374,20 +377,15 @@ iput(current->fs->root); current->fs->root = NULL; } - free_page((long) current->fs); } static void exit_mm(void) { - if (!--current->mm->count) - exit_mmap(current); + if (!--current->mm->count) { + current->mm->rss = 0; + exit_mmap(current->mm); + } free_page_tables(current); - free_page((long) current->mm); -} - -static void exit_signal(void) -{ - free_page((long) current->sigaction); } NORET_TYPE void do_exit(long code) @@ -405,7 +403,6 @@ exit_mm(); exit_files(); exit_fs(); - exit_signal(); exit_thread(); forget_original_parent(current); /* @@ -468,7 +465,6 @@ last_task_used_math = NULL; current->state = TASK_ZOMBIE; current->exit_code = code; - current->mm->rss = 0; #ifdef DEBUG_PROC_TREE audit_ptree(); #endif diff -u --recursive --new-file v1.3.23/linux/kernel/fork.c linux/kernel/fork.c --- v1.3.23/linux/kernel/fork.c Sun Sep 3 12:27:03 1995 +++ linux/kernel/fork.c Tue Sep 5 10:30:29 1995 @@ -79,20 +79,20 @@ return free_task; } -static int dup_mmap(struct task_struct * tsk) +static int dup_mmap(struct mm_struct * mm) { struct vm_area_struct * mpnt, **p, *tmp; - tsk->mm->mmap = NULL; - p = &tsk->mm->mmap; + mm->mmap = NULL; + p = &mm->mmap; for (mpnt = current->mm->mmap ; mpnt ; mpnt = mpnt->vm_next) { tmp = (struct vm_area_struct *) kmalloc(sizeof(struct vm_area_struct), GFP_KERNEL); if (!tmp) { - exit_mmap(tsk); + exit_mmap(mm); return -ENOMEM; } *tmp = *mpnt; - tmp->vm_task = tsk; + tmp->vm_mm = mm; tmp->vm_next = NULL; if (tmp->vm_inode) { tmp->vm_inode->i_count++; @@ -106,7 +106,7 @@ *p = tmp; p = &tmp->vm_next; } - build_mmap_avl(tsk); + build_mmap_avl(mm); return 0; } @@ -126,7 +126,7 @@ u->mm.cmin_flt = u->mm.cmaj_flt = 0; if (copy_page_tables(&u->tsk)) return -1; - if (dup_mmap(&u->tsk)) + if (dup_mmap(&u->mm)) return -1; mem_map[MAP_NR(u)]++; return 0; diff -u --recursive --new-file v1.3.23/linux/kernel/sched.c linux/kernel/sched.c --- v1.3.23/linux/kernel/sched.c Sun Sep 3 12:27:03 1995 +++ linux/kernel/sched.c Mon Sep 4 13:01:49 1995 @@ -81,10 +81,11 @@ static unsigned long init_kernel_stack[1024] = { STACK_MAGIC, }; unsigned long init_user_stack[1024] = { STACK_MAGIC, }; static struct vm_area_struct init_mmap = INIT_MMAP; -static struct mm_struct init_mm = INIT_MM; static struct fs_struct init_fs = INIT_FS; static struct files_struct init_files = INIT_FILES; static struct sigaction init_sigaction[32] = { {0,}, }; + +struct mm_struct init_mm = INIT_MM; struct task_struct init_task = INIT_TASK; unsigned long volatile jiffies=0; diff -u --recursive --new-file v1.3.23/linux/mm/filemap.c linux/mm/filemap.c --- v1.3.23/linux/mm/filemap.c Sun Sep 3 12:27:04 1995 +++ linux/mm/filemap.c Mon Sep 4 12:30:08 1995 @@ -260,7 +260,7 @@ unsigned long end = address + size; int error = 0; - dir = pgd_offset(current, address); + dir = pgd_offset(current->mm, address); while (address < end) { error |= filemap_sync_pmd_range(dir, address, end - address, vma, flags); address = (address + PGDIR_SIZE) & PGDIR_MASK; diff -u --recursive --new-file v1.3.23/linux/mm/kmalloc.c linux/mm/kmalloc.c --- v1.3.23/linux/mm/kmalloc.c Sun Sep 3 12:27:04 1995 +++ linux/mm/kmalloc.c Tue Sep 5 12:28:14 1995 @@ -10,6 +10,8 @@ /* * Modified by Alex Bligh (alex@cconcepts.co.uk) 4 Apr 1994 to use multiple * pages. So for 'page' throughout, read 'area'. + * + * Largely rewritten.. Linus */ #include @@ -17,17 +19,6 @@ #include #include -/* I want this low enough for a while to catch errors. - I want this number to be increased in the near future: - loadable device drivers should use this function to get memory */ - -#define MAX_KMALLOC_K ((PAGE_SIZE<<(NUM_AREA_ORDERS-1))>>10) - - -/* This defines how many times we should try to allocate a free page before - giving up. Normally this shouldn't happen at all. */ -#define MAX_GET_FREE_PAGE_TRIES 4 - /* Private flags. */ @@ -229,17 +220,18 @@ } /* We need to get a new free page..... */ + /* This can be done with ints on: This is private to this invocation */ + restore_flags(flags); /* sz is the size of the blocks we're dealing with */ sz = BLOCKSIZE(order); - /* This can be done with ints on: This is private to this invocation */ - page = (struct page_descriptor *) __get_free_pages(priority & GFP_LEVEL_MASK, + page = (struct page_descriptor *) __get_free_pages(priority, sizes[order].gfporder, max_addr); if (!page) { static unsigned long last = 0; - if (last + 10 * HZ < jiffies) { + if (priority != GFP_BUFFER && (last + 10 * HZ < jiffies)) { last = jiffies; printk("Couldn't get a free page.....\n"); } diff -u --recursive --new-file v1.3.23/linux/mm/memory.c linux/mm/memory.c --- v1.3.23/linux/mm/memory.c Sun Sep 3 12:27:04 1995 +++ linux/mm/memory.c Mon Sep 4 12:22:45 1995 @@ -154,7 +154,7 @@ return; if (tsk == task[0]) panic("task[0] (swapper) doesn't support exec()\n"); - page_dir = pgd_offset(tsk, 0); + page_dir = pgd_offset(tsk->mm, 0); if (!page_dir || page_dir == swapper_pg_dir) { printk("%s trying to clear kernel page-directory: not good\n", tsk->comm); return; @@ -169,6 +169,7 @@ for (i = USER_PTRS_PER_PGD ; i < PTRS_PER_PGD ; i++) new_pg[i] = page_dir[i]; SET_PAGE_DIR(tsk, new_pg); + tsk->mm->pgd = new_pg; pgd_free(page_dir); return; } @@ -192,12 +193,13 @@ printk("task[0] (swapper) killed: unable to recover\n"); panic("Trying to free up swapper memory space"); } - page_dir = pgd_offset(tsk, 0); + page_dir = pgd_offset(tsk->mm, 0); if (!page_dir || page_dir == swapper_pg_dir) { printk("%s trying to free kernel page-directory: not good\n", tsk->comm); return; } SET_PAGE_DIR(tsk, swapper_pg_dir); + tsk->mm->pgd = swapper_pg_dir; if (pgd_inuse(page_dir)) { pgd_free(page_dir); return; @@ -218,9 +220,10 @@ { pgd_t * pg_dir; - pg_dir = pgd_offset(current, 0); + pg_dir = pgd_offset(current->mm, 0); pgd_reuse(pg_dir); SET_PAGE_DIR(tsk, pg_dir); + tsk->mm->pgd = pg_dir; return 0; } @@ -323,7 +326,8 @@ if (!new_pgd) return -ENOMEM; SET_PAGE_DIR(tsk, new_pgd); - old_pgd = pgd_offset(current, 0); + tsk->mm->pgd = new_pgd; + old_pgd = pgd_offset(current->mm, 0); for (i = 0 ; i < PTRS_PER_PGD ; i++) { int errno = copy_one_pgd(old_pgd, new_pgd); if (errno) { @@ -413,7 +417,7 @@ pgd_t * dir; unsigned long end = address + size; - dir = pgd_offset(current, address); + dir = pgd_offset(current->mm, address); while (address < end) { unmap_pmd_range(dir, address, end - address); address = (address + PGDIR_SIZE) & PGDIR_MASK; @@ -467,7 +471,7 @@ pte_t zero_pte; zero_pte = pte_wrprotect(mk_pte(ZERO_PAGE, prot)); - dir = pgd_offset(current, address); + dir = pgd_offset(current->mm, address); while (address < end) { pmd_t *pmd = pmd_alloc(dir, address); error = -ENOMEM; @@ -537,7 +541,7 @@ unsigned long end = from + size; offset -= from; - dir = pgd_offset(current, from); + dir = pgd_offset(current->mm, from); while (from < end) { pmd_t *pmd = pmd_alloc(dir, from); error = -ENOMEM; @@ -581,7 +585,7 @@ printk("put_dirty_page: trying to put page %08lx at %08lx\n",page,address); if (mem_map[MAP_NR(page)] != 1) printk("mem_map disagrees with %08lx at %08lx\n",page,address); - pgd = pgd_offset(tsk,address); + pgd = pgd_offset(tsk->mm,address); pmd = pmd_alloc(pgd, address); if (!pmd) { free_page(page); @@ -621,8 +625,8 @@ * change only once the write actually happens. This avoids a few races, * and potentially makes it more efficient. */ -void do_wp_page(struct vm_area_struct * vma, unsigned long address, - int write_access) +void do_wp_page(struct task_struct * tsk, struct vm_area_struct * vma, + unsigned long address, int write_access) { pgd_t *page_dir; pmd_t *page_middle; @@ -630,7 +634,7 @@ unsigned long old_page, new_page; new_page = __get_free_page(GFP_KERNEL); - page_dir = pgd_offset(vma->vm_task,address); + page_dir = pgd_offset(vma->vm_mm, address); if (pgd_none(*page_dir)) goto end_wp_page; if (pgd_bad(*page_dir)) @@ -649,14 +653,14 @@ old_page = pte_page(pte); if (old_page >= high_memory) goto bad_wp_page; - vma->vm_task->mm->min_flt++; + vma->vm_mm->min_flt++; /* * Do we need to copy? */ if (mem_map[MAP_NR(old_page)] != 1) { if (new_page) { if (mem_map[MAP_NR(old_page)] & MAP_PAGE_RESERVED) - ++vma->vm_task->mm->rss; + ++vma->vm_mm->rss; copy_page(old_page,new_page); set_pte(page_table, pte_mkwrite(pte_mkdirty(mk_pte(new_page, vma->vm_page_prot)))); free_page(old_page); @@ -665,7 +669,7 @@ } set_pte(page_table, BAD_PAGE); free_page(old_page); - oom(vma->vm_task); + oom(tsk); invalidate(); return; } @@ -676,15 +680,15 @@ return; bad_wp_page: printk("do_wp_page: bogus page at address %08lx (%08lx)\n",address,old_page); - send_sig(SIGKILL, vma->vm_task, 1); + send_sig(SIGKILL, tsk, 1); goto end_wp_page; bad_wp_pagemiddle: printk("do_wp_page: bogus page-middle at address %08lx (%08lx)\n", address, pmd_val(*page_middle)); - send_sig(SIGKILL, vma->vm_task, 1); + send_sig(SIGKILL, tsk, 1); goto end_wp_page; bad_wp_pagedir: printk("do_wp_page: bogus page-dir entry at address %08lx (%08lx)\n", address, pgd_val(*page_dir)); - send_sig(SIGKILL, vma->vm_task, 1); + send_sig(SIGKILL, tsk, 1); end_wp_page: if (new_page) free_page(new_page); @@ -754,7 +758,7 @@ start &= PAGE_MASK; for (;;) { - do_wp_page(vma, start, 1); + do_wp_page(current, vma, start, 1); if (!size) break; size--; @@ -773,12 +777,12 @@ return -EFAULT; } -static inline void get_empty_page(struct vm_area_struct * vma, pte_t * page_table) +static inline void get_empty_page(struct task_struct * tsk, struct vm_area_struct * vma, pte_t * page_table) { unsigned long tmp; if (!(tmp = get_free_page(GFP_KERNEL))) { - oom(vma->vm_task); + oom(tsk); put_page(page_table, BAD_PAGE); return; } @@ -802,7 +806,7 @@ pte_t * from_table, * to_table; pte_t from, to; - from_dir = pgd_offset(from_area->vm_task,from_address); + from_dir = pgd_offset(from_area->vm_mm,from_address); /* is there a page-directory at from? */ if (pgd_none(*from_dir)) return 0; @@ -836,7 +840,7 @@ if (mem_map[MAP_NR(pte_page(from))] & MAP_PAGE_RESERVED) return 0; /* is the destination ok? */ - to_dir = pgd_offset(to_area->vm_task,to_address); + to_dir = pgd_offset(to_area->vm_mm,to_address); /* is there a page-directory at to? */ if (pgd_none(*to_dir)) return 0; @@ -958,7 +962,7 @@ pmd_t *pmd; pte_t *pte; - pgd = pgd_offset(tsk, address); + pgd = pgd_offset(tsk->mm, address); pmd = pmd_alloc(pgd, address); if (!pmd) { oom(tsk); @@ -972,13 +976,14 @@ return pte; } -static inline void do_swap_page(struct vm_area_struct * vma, unsigned long address, +static inline void do_swap_page(struct task_struct * tsk, + struct vm_area_struct * vma, unsigned long address, pte_t * page_table, pte_t entry, int write_access) { pte_t page; if (!vma->vm_ops || !vma->vm_ops->swapin) { - swap_in(vma, page_table, pte_val(entry), write_access); + swap_in(tsk, vma, page_table, pte_val(entry), write_access); return; } page = vma->vm_ops->swapin(vma, address - vma->vm_start + vma->vm_offset, pte_val(entry)); @@ -988,8 +993,8 @@ } if (mem_map[MAP_NR(pte_page(page))] > 1 && !(vma->vm_flags & VM_SHARED)) page = pte_wrprotect(page); - ++vma->vm_task->mm->rss; - ++vma->vm_task->mm->maj_flt; + ++vma->vm_mm->rss; + ++vma->vm_mm->maj_flt; set_pte(page_table, page); return; } @@ -1000,43 +1005,43 @@ * the "write_access" parameter is true in order to avoid the next * page fault. */ -void do_no_page(struct vm_area_struct * vma, unsigned long address, - int write_access) +void do_no_page(struct task_struct * tsk, struct vm_area_struct * vma, + unsigned long address, int write_access) { pte_t * page_table; pte_t entry; unsigned long page; - page_table = get_empty_pgtable(vma->vm_task,address); + page_table = get_empty_pgtable(tsk, address); if (!page_table) return; entry = *page_table; if (pte_present(entry)) return; if (!pte_none(entry)) { - do_swap_page(vma, address, page_table, entry, write_access); + do_swap_page(tsk, vma, address, page_table, entry, write_access); return; } address &= PAGE_MASK; if (!vma->vm_ops || !vma->vm_ops->nopage) { - ++vma->vm_task->mm->rss; - ++vma->vm_task->mm->min_flt; - get_empty_page(vma, page_table); + ++vma->vm_mm->rss; + ++vma->vm_mm->min_flt; + get_empty_page(tsk, vma, page_table); return; } page = __get_free_page(GFP_KERNEL); if (share_page(vma, address, write_access, page)) { - ++vma->vm_task->mm->min_flt; - ++vma->vm_task->mm->rss; + ++vma->vm_mm->min_flt; + ++vma->vm_mm->rss; return; } if (!page) { - oom(current); + oom(tsk); put_page(page_table, BAD_PAGE); return; } - ++vma->vm_task->mm->maj_flt; - ++vma->vm_task->mm->rss; + ++vma->vm_mm->maj_flt; + ++vma->vm_mm->rss; /* * The fourth argument is "no_share", which tells the low-level code * to copy, not share the page even if sharing is possible. It's @@ -1083,7 +1088,7 @@ int write_access, pte_t * pte) { if (!pte_present(*pte)) { - do_no_page(vma, address, write_access); + do_no_page(current, vma, address, write_access); return; } set_pte(pte, pte_mkyoung(*pte)); @@ -1093,7 +1098,7 @@ set_pte(pte, pte_mkdirty(*pte)); return; } - do_wp_page(vma, address, write_access); + do_wp_page(current, vma, address, write_access); } void handle_mm_fault(struct vm_area_struct * vma, unsigned long address, @@ -1103,7 +1108,7 @@ pmd_t *pmd; pte_t *pte; - pgd = pgd_offset(vma->vm_task, address); + pgd = pgd_offset(vma->vm_mm, address); pmd = pmd_alloc(pgd, address); if (!pmd) goto no_memory; @@ -1114,5 +1119,5 @@ update_mmu_cache(vma, address, *pte); return; no_memory: - oom(vma->vm_task); + oom(current); } diff -u --recursive --new-file v1.3.23/linux/mm/mmap.c linux/mm/mmap.c --- v1.3.23/linux/mm/mmap.c Tue Jun 27 14:11:47 1995 +++ linux/mm/mmap.c Tue Sep 5 10:13:32 1995 @@ -77,8 +77,10 @@ default: return -EINVAL; } - if ((flags & MAP_DENYWRITE) && (file->f_inode->i_wcount > 0)) - return -ETXTBSY; + if (flags & MAP_DENYWRITE) { + if (file->f_inode->i_wcount > 0) + return -ETXTBSY; + } } else if ((flags & MAP_TYPE) != MAP_PRIVATE) return -EINVAL; @@ -111,7 +113,7 @@ if (!vma) return -ENOMEM; - vma->vm_task = current; + vma->vm_mm = current->mm; vma->vm_start = addr; vma->vm_end = addr + len; vma->vm_flags = prot & (VM_READ | VM_WRITE | VM_EXEC); @@ -772,23 +774,23 @@ } /* Build the AVL tree corresponding to the VMA list. */ -void build_mmap_avl(struct task_struct * task) +void build_mmap_avl(struct mm_struct * mm) { struct vm_area_struct * vma; - task->mm->mmap_avl = NULL; - for (vma = task->mm->mmap; vma; vma = vma->vm_next) - avl_insert(vma, &task->mm->mmap_avl); + mm->mmap_avl = NULL; + for (vma = mm->mmap; vma; vma = vma->vm_next) + avl_insert(vma, &mm->mmap_avl); } /* Release all mmaps. */ -void exit_mmap(struct task_struct * task) +void exit_mmap(struct mm_struct * mm) { struct vm_area_struct * mpnt; - mpnt = task->mm->mmap; - task->mm->mmap = NULL; - task->mm->mmap_avl = NULL; + mpnt = mm->mmap; + mm->mmap = NULL; + mm->mmap_avl = NULL; while (mpnt) { struct vm_area_struct * next = mpnt->vm_next; if (mpnt->vm_ops && mpnt->vm_ops->close) diff -u --recursive --new-file v1.3.23/linux/mm/mprotect.c linux/mm/mprotect.c --- v1.3.23/linux/mm/mprotect.c Sun Sep 3 12:27:04 1995 +++ linux/mm/mprotect.c Mon Sep 4 12:30:19 1995 @@ -73,7 +73,7 @@ { pgd_t *dir; - dir = pgd_offset(current, start); + dir = pgd_offset(current->mm, start); while (start < end) { change_pmd_range(dir, start, end - start, newprot); start = (start + PGDIR_SIZE) & PGDIR_MASK; diff -u --recursive --new-file v1.3.23/linux/mm/swap.c linux/mm/swap.c --- v1.3.23/linux/mm/swap.c Sun Sep 3 12:27:04 1995 +++ linux/mm/swap.c Mon Sep 4 12:29:42 1995 @@ -310,8 +310,8 @@ * Also, don't bother to add to the swap cache if this page-in * was due to a write access. */ -void swap_in(struct vm_area_struct * vma, pte_t * page_table, - unsigned long entry, int write_access) +void swap_in(struct task_struct * tsk, struct vm_area_struct * vma, + pte_t * page_table, unsigned long entry, int write_access) { unsigned long page = __get_free_page(GFP_KERNEL); @@ -322,7 +322,7 @@ if (!page) { set_pte(page_table, BAD_PAGE); swap_free(entry); - oom(current); + oom(tsk); return; } read_swap_page(entry, (char *) page); @@ -330,8 +330,8 @@ free_page(page); return; } - vma->vm_task->mm->rss++; - vma->vm_task->mm->maj_flt++; + vma->vm_mm->rss++; + vma->vm_mm->maj_flt++; if (!write_access && add_to_swap_cache(page, entry)) { set_pte(page_table, mk_pte(page, vma->vm_page_prot)); return; @@ -352,7 +352,8 @@ * using a process that no longer actually exists (it might * have died while we slept). */ -static inline int try_to_swap_out(struct vm_area_struct* vma, unsigned long address, pte_t * page_table, unsigned long limit) +static inline int try_to_swap_out(struct task_struct * tsk, struct vm_area_struct* vma, + unsigned long address, pte_t * page_table, unsigned long limit) { pte_t pte; unsigned long entry; @@ -374,8 +375,8 @@ } if (pte_dirty(pte)) { if (vma->vm_ops && vma->vm_ops->swapout) { - pid_t pid = vma->vm_task->pid; - vma->vm_task->mm->rss--; + pid_t pid = tsk->pid; + vma->vm_mm->rss--; if (vma->vm_ops->swapout(vma, address - vma->vm_start + vma->vm_offset, page_table)) kill_proc(pid, SIGBUS, 1); } else { @@ -383,7 +384,7 @@ return 0; if (!(entry = get_swap_page())) return 0; - vma->vm_task->mm->rss--; + vma->vm_mm->rss--; set_pte(page_table, __pte(entry)); invalidate(); write_swap_page(entry, (char *) page); @@ -397,13 +398,13 @@ printk("Aiee.. duplicated cached swap-cache entry\n"); return 0; } - vma->vm_task->mm->rss--; + vma->vm_mm->rss--; set_pte(page_table, __pte(entry)); invalidate(); free_page(page); return 1; } - vma->vm_task->mm->rss--; + vma->vm_mm->rss--; pte_clear(page_table); invalidate(); entry = mem_map[MAP_NR(page)]; @@ -438,8 +439,8 @@ */ #define SWAP_RATIO 128 -static inline int swap_out_pmd(struct vm_area_struct * vma, pmd_t *dir, - unsigned long address, unsigned long end, unsigned long limit) +static inline int swap_out_pmd(struct task_struct * tsk, struct vm_area_struct * vma, + pmd_t *dir, unsigned long address, unsigned long end, unsigned long limit) { pte_t * pte; unsigned long pmd_end; @@ -460,8 +461,8 @@ do { int result; - vma->vm_task->mm->swap_address = address + PAGE_SIZE; - result = try_to_swap_out(vma, address, pte, limit); + vma->vm_mm->swap_address = address + PAGE_SIZE; + result = try_to_swap_out(tsk, vma, address, pte, limit); if (result) return result; address += PAGE_SIZE; @@ -470,8 +471,8 @@ return 0; } -static inline int swap_out_pgd(struct vm_area_struct * vma, pgd_t *dir, - unsigned long address, unsigned long end, unsigned long limit) +static inline int swap_out_pgd(struct task_struct * tsk, struct vm_area_struct * vma, + pgd_t *dir, unsigned long address, unsigned long end, unsigned long limit) { pmd_t * pmd; unsigned long pgd_end; @@ -491,7 +492,7 @@ end = pgd_end; do { - int result = swap_out_pmd(vma, pmd, address, end, limit); + int result = swap_out_pmd(tsk, vma, pmd, address, end, limit); if (result) return result; address = (address + PMD_SIZE) & PMD_MASK; @@ -500,8 +501,8 @@ return 0; } -static int swap_out_vma(struct vm_area_struct * vma, pgd_t *pgdir, - unsigned long start, unsigned long limit) +static int swap_out_vma(struct task_struct * tsk, struct vm_area_struct * vma, + pgd_t *pgdir, unsigned long start, unsigned long limit) { unsigned long end; @@ -512,7 +513,7 @@ end = vma->vm_end; while (start < end) { - int result = swap_out_pgd(vma, pgdir, start, end, limit); + int result = swap_out_pgd(tsk, vma, pgdir, start, end, limit); if (result) return result; start = (start + PGDIR_SIZE) & PGDIR_MASK; @@ -542,7 +543,7 @@ address = vma->vm_start; for (;;) { - int result = swap_out_vma(vma, pgd_offset(p, address), address, limit); + int result = swap_out_vma(p, vma, pgd_offset(p->mm, address), address, limit); if (result) return result; vma = vma->vm_next; @@ -871,7 +872,7 @@ return 1; } set_pte(dir, pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot)))); - ++vma->vm_task->mm->rss; + ++vma->vm_mm->rss; swap_free(pte_val(pte)); return 1; } @@ -956,7 +957,7 @@ */ vma = p->mm->mmap; while (vma) { - pgd_t * pgd = pgd_offset(p, vma->vm_start); + pgd_t * pgd = pgd_offset(p->mm, vma->vm_start); if (unuse_vma(vma, pgd, vma->vm_start, vma->vm_end, type, page)) return 1; vma = vma->vm_next; diff -u --recursive --new-file v1.3.23/linux/mm/vmalloc.c linux/mm/vmalloc.c --- v1.3.23/linux/mm/vmalloc.c Sun Sep 3 12:27:04 1995 +++ linux/mm/vmalloc.c Mon Sep 4 13:03:05 1995 @@ -32,7 +32,7 @@ struct task_struct * p; for_each_task(p) - *pgd_offset(p,address) = entry; + *pgd_offset(p->mm,address) = entry; } static inline void free_area_pte(pmd_t * pmd, unsigned long address, unsigned long size) @@ -96,7 +96,7 @@ pgd_t * dir; unsigned long end = address + size; - dir = pgd_offset(&init_task, address); + dir = pgd_offset(&init_mm, address); while (address < end) { free_area_pmd(dir, address, end - address); address = (address + PGDIR_SIZE) & PGDIR_MASK; @@ -152,7 +152,7 @@ pgd_t * dir; unsigned long end = address + size; - dir = pgd_offset(&init_task, address); + dir = pgd_offset(&init_mm, address); while (address < end) { pmd_t *pmd = pmd_alloc_kernel(dir, address); if (!pmd) @@ -213,7 +213,7 @@ unsigned long end = address + size; offset -= address; - dir = pgd_offset(&init_task, address); + dir = pgd_offset(&init_mm, address); while (address < end) { pmd_t *pmd = pmd_alloc_kernel(dir, address); if (!pmd) diff -u --recursive --new-file v1.3.23/linux/net/Changes linux/net/Changes --- v1.3.23/linux/net/Changes Sun Sep 3 12:27:04 1995 +++ linux/net/Changes Mon Sep 4 14:48:37 1995 @@ -95,7 +95,7 @@ o Appletalk router fixes [Michael Callahan] [TESTED] o TCP state error fixes [Mark Tamsky] [TESTED] o Verify area fixes [Heiko Eissfeldt] [TESTED] -o Routes use metric field [John Naylor] [TESTED/NOT YET AS BSD] +o Routes use metric field [John Naylor] [TESTED] o Major AX.25/NetROM fixes [John Nalor] [TESTED] ------->>>>> NET3 030 <<<<<---------- @@ -177,16 +177,44 @@ o Datagram generic iovec support [IN] o Misc minor bug fixes [IN] --------->>>>> 1.3.22 I expect <<<<<------- +-------->>>>> 1.3.22 <<<<<------- -o Device lock against page fault [IN] +o Device lock against page fault [TESTED] o IP_HDRINCL [TESTED] o IP firewalling spoofing protection [IN] o IGMP bug fixes and workarounds [TESTED] o IFF_ALLMULTI protocol layer support [TESTED] o First parts of IP multicast routing code [IN] -o Generate BSD ENETDOWN errors [IN] +o Generate BSD ENETDOWN errors [TESTED] +o Clean device unload bug [IN] +-------->>>>> 1.3.23 <<<<<------- + +o Missing IGMP includes fixes [TESTED] +o Smarter buffer use options for sockets [IN] +o AF_UNIX smarter buffer driving [IN] +o AF_UNIX full BSD semantics on STREAM writes [IN] +o IOVEC's support repeated calls to copy more [IN] +o Zero fragment 'solaris nfs' bug fixed [IN] +o NetROM supports sendmsg/recvmsg [IN] + +---------- Things Linus had for a while and not merged ---------------- + +o Paul Gortmakers 8390 Copy and checksum [PLEASE ADD 8)] + +---------- Things pending from other people to chase ------------- + +o Tom May's insw_and_checksum() + +---------- Things pending for me to merge -------------- + +o IPFW support for TOS changing (Al Longyear) +o /dev/skip /dev/ipah etc - Kernel/Usermode communications module (me) +o AF_UNIX garbage collect code +o Closing socket change (Marc Tamsky) +o Faster closedown option for heavy use sites (me) + +--------------- Tbings That Need Doing Before 1.4 ------------------ o Finish merging the bridge code o SIOCSLEEPRT patch @@ -202,11 +230,14 @@ o Clean up RAW AX.25 sockets. o Finish 802.2 Class I code to be compliant to the oddities of 802.2 o Full variable length AX.25 support [JSN doing] -o Tidy BPQ support +o Tidy BPQ support to use an bpqip tunnel device o Strange eth0-eth3 bug o Finish IPIP bug fixes o Why doesnt the PROTO_UNREACH get sent ? - +o IP protocols using sendmsg() +o Kill off old ip_queue_xmit/ip_send stuff. +o Remove kernel RARP and replace with user mode daemon. +o Throw out existing firewall ioctl()'s and use a single table load. 0.2 --- @@ -222,7 +253,7 @@ 0.3 --- -o Merge the layered protocol support. +o Merge the layered protocol support. [ABANDONED TOO SLOW] o IP firewalling performance - caching and radix trees. o Zebedee o 802.2 Class 2 services (eg netbios). @@ -279,7 +310,7 @@ 10. Frame Relay/WAN/ISDN drivers [I'm working on the sonix EuroISDN board driver but thats for an internal project and its general release is still -a maybe (so is finishing it ;))][Someone is working on Frame Relay]. +a maybe (so is finishing it ;))][Jim Freeman is working on Frame Relay]. 11. IP over SCSI. @@ -307,6 +338,9 @@ 19. IPv4 IP-AH and IP-ESP. [Taken] + +20. SKIP IP security using ENskip-0.10 - started +[Me] BTW: Don't let the magic words 'kernel programming' worry you. Its like DOS - you make a mistake you have to reboot. You do at least get dumps and a diff -u --recursive --new-file v1.3.23/linux/net/appletalk/ddp.c linux/net/appletalk/ddp.c --- v1.3.23/linux/net/appletalk/ddp.c Mon Aug 28 14:52:25 1995 +++ linux/net/appletalk/ddp.c Mon Sep 4 14:48:36 1995 @@ -1545,7 +1545,7 @@ size += dev->hard_header_len; - skb = sock_alloc_send_skb(sk, size, 0 , &err); + skb = sock_alloc_send_skb(sk, size, 0, 0 , &err); if(skb==NULL) return err; diff -u --recursive --new-file v1.3.23/linux/net/ax25/af_ax25.c linux/net/ax25/af_ax25.c --- v1.3.23/linux/net/ax25/af_ax25.c Mon Aug 28 14:52:25 1995 +++ linux/net/ax25/af_ax25.c Mon Sep 4 14:48:36 1995 @@ -1720,7 +1720,7 @@ /* Assume the worst case */ size = len + 3 + size_ax25_addr(dp) + AX25_BPQ_HEADER_LEN; - if ((skb = sock_alloc_send_skb(sk, size, 0, &err)) == NULL) + if ((skb = sock_alloc_send_skb(sk, size, 0, 0, &err)) == NULL) return err; skb->sk = sk; diff -u --recursive --new-file v1.3.23/linux/net/ax25/ax25_out.c linux/net/ax25/ax25_out.c --- v1.3.23/linux/net/ax25/ax25_out.c Fri Aug 18 08:44:59 1995 +++ linux/net/ax25/ax25_out.c Mon Sep 4 14:48:36 1995 @@ -71,7 +71,7 @@ while (skb->len > 0) { if (skb->sk != NULL) { - if ((skbn = sock_alloc_send_skb(skb->sk, mtu + 2 + frontlen, 0, &err)) == NULL) + if ((skbn = sock_alloc_send_skb(skb->sk, mtu + 2 + frontlen, 0, 0, &err)) == NULL) return; } else { if ((skbn = alloc_skb(mtu + 2 + frontlen, GFP_ATOMIC)) == NULL) diff -u --recursive --new-file v1.3.23/linux/net/core/iovec.c linux/net/core/iovec.c --- v1.3.23/linux/net/core/iovec.c Mon Aug 28 14:52:25 1995 +++ linux/net/core/iovec.c Mon Sep 4 14:56:40 1995 @@ -6,6 +6,9 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. + * + * Fixes: + * Andrew Lunn : Errors in iovec copying. */ @@ -64,10 +67,15 @@ { while(len>0) { - int copy = min(iov->iov_len,len); - memcpy_tofs(iov->iov_base,kdata,copy); - kdata+=copy; - len-=copy; + if(iov->iov_len) + { + int copy = min(iov->iov_len,len); + memcpy_tofs(iov->iov_base,kdata,copy); + kdata+=copy; + len-=copy; + iov->iov_len-=copy; + iov->iov_base+=copy; + } iov++; } } @@ -78,13 +86,17 @@ void memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len) { - int copy; while(len>0) { - copy=min(len,iov->iov_len); - memcpy_fromfs(kdata, iov->iov_base, copy); - len-=copy; - kdata+=copy; + if(iov->iov_len) + { + int copy=min(len,iov->iov_len); + memcpy_fromfs(kdata, iov->iov_base, copy); + len-=copy; + kdata+=copy; + iov->iov_base+=copy; + iov->iov_len-=copy; + } iov++; } } diff -u --recursive --new-file v1.3.23/linux/net/core/sock.c linux/net/core/sock.c --- v1.3.23/linux/net/core/sock.c Fri Jul 7 13:42:58 1995 +++ linux/net/core/sock.c Mon Sep 4 14:48:36 1995 @@ -64,6 +64,7 @@ * Alan Cox : Make SO_DEBUG superuser only. * Alan Cox : Allow anyone to clear SO_DEBUG * (compatibility fix) + * Alan Cox : Added optimistic memory grabbing for AF_UNIX throughput. * * To Fix: * @@ -421,7 +422,7 @@ * Generic send/receive buffer handlers */ -struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size, int noblock, int *errcode) +struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size, unsigned long fallback, int noblock, int *errcode) { struct sk_buff *skb; int err; @@ -446,8 +447,21 @@ return NULL; } - skb = sock_wmalloc(sk, size, 0, GFP_KERNEL); + if(!fallback) + skb = sock_wmalloc(sk, size, 0, GFP_KERNEL); + else + { + /* The buffer get won't block, or use the atomic queue. It does + produce annoying no free page messages still.... */ + skb = sock_wmalloc(sk, size, 0 , GFP_BUFFER); + if(!skb) + skb=sock_wmalloc(sk, fallback, 0, GFP_KERNEL); + } + /* + * This means we have too many buffers for this socket already. + */ + if(skb==NULL) { unsigned long tmp; diff -u --recursive --new-file v1.3.23/linux/net/ipv4/Makefile linux/net/ipv4/Makefile --- v1.3.23/linux/net/ipv4/Makefile Sun Sep 3 12:27:05 1995 +++ linux/net/ipv4/Makefile Mon Sep 4 07:38:03 1995 @@ -12,11 +12,13 @@ arp.o ip.o raw.o icmp.o tcp.o udp.o devinet.o af_inet.o \ igmp.o ip_fw.o ipip.o ipmr.o -ifdef CONFIG_INET_RARP +ifeq ($(CONFIG_INET_RARP),y) IPV4_OBJS := $(IPV4_OBJS) rarp.o else -M_OBJS := rarp.o -MOD_LIST_NAME := IPV4_MODULES + ifeq ($(CONFIG_INET_RARP),m) + M_OBJS := rarp.o + MOD_LIST_NAME := IPV4_MODULES + endif endif ifdef CONFIG_INET diff -u --recursive --new-file v1.3.23/linux/net/ipv4/ip.c linux/net/ipv4/ip.c --- v1.3.23/linux/net/ipv4/ip.c Sun Sep 3 16:12:49 1995 +++ linux/net/ipv4/ip.c Mon Sep 4 14:48:37 1995 @@ -90,6 +90,7 @@ * Gerhard Koerting : IP fragmentation forwarding fix * Alan Cox : Device lock against page fault. * Alan Cox : IP_HDRINCL facility. + * Werner Almesberger : Zero fragment bug * * * @@ -2531,7 +2532,7 @@ if(length+20 <= dev->mtu && !MULTICAST(daddr) && daddr!=0xFFFFFFFF && daddr!=dev->pa_brdaddr) { int error; - struct sk_buff *skb=sock_alloc_send_skb(sk, length+20+15+dev->hard_header_len,0,&error); + struct sk_buff *skb=sock_alloc_send_skb(sk, length+20+15+dev->hard_header_len,0, 0,&error); if(skb==NULL) { ip_statistics.IpOutDiscards++; @@ -2614,7 +2615,7 @@ fraglen = length - offset + fragheaderlen; - if(fraglen==0) + if(length-offset==0) { fraglen = maxfraglen; offset -= maxfraglen-fragheaderlen; @@ -2660,7 +2661,7 @@ * Get the memory we require with some space left for alignment. */ - skb = sock_alloc_send_skb(sk, fraglen+15, 0, &error); + skb = sock_alloc_send_skb(sk, fraglen+15, 0, 0, &error); if (skb == NULL) { ip_statistics.IpOutDiscards++; diff -u --recursive --new-file v1.3.23/linux/net/ipv4/tcp.c linux/net/ipv4/tcp.c --- v1.3.23/linux/net/ipv4/tcp.c Sun Sep 3 12:27:06 1995 +++ linux/net/ipv4/tcp.c Mon Sep 4 14:48:37 1995 @@ -141,7 +141,7 @@ * Alan Cox : Per route irtt. * Matt Day : Select() match BSD precisely on error * Alan Cox : New buffers - * Mark Tamsky : Various sk->prot->retransmits and + * Marc Tamsky : Various sk->prot->retransmits and * sk->retransmits misupdating fixed. * Fixed tcp_write_timeout: stuck close, * and TCP syn retries gets used now. diff -u --recursive --new-file v1.3.23/linux/net/netrom/af_netrom.c linux/net/netrom/af_netrom.c --- v1.3.23/linux/net/netrom/af_netrom.c Mon Aug 28 14:52:26 1995 +++ linux/net/netrom/af_netrom.c Mon Sep 4 14:48:37 1995 @@ -1019,11 +1019,10 @@ return 1; } -static int nr_sendto(struct socket *sock, const void *ubuf, int len, int noblock, - unsigned flags, struct sockaddr *usip, int addr_len) +static int nr_sendmsg(struct socket *sock, struct msghdr *msg, int len, int noblock, int flags) { struct sock *sk = (struct sock *)sock->data; - struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)usip; + struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name; int err; struct sockaddr_ax25 sax; struct sk_buff *skb; @@ -1046,7 +1045,7 @@ return -ENETUNREACH; if (usax) { - if (addr_len < sizeof(sax)) + if (msg->msg_namelen < sizeof(sax)) return -EINVAL; memcpy(&sax, usax, sizeof(sax)); if (sk->type == SOCK_SEQPACKET && memcmp(&sk->nr->dest_addr, &sax.sax25_call, sizeof(ax25_address)) != 0) @@ -1069,7 +1068,7 @@ size = len + AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + 3 + NR_NETWORK_LEN + NR_TRANSPORT_LEN; - if ((skb = sock_alloc_send_skb(sk, size, 0, &err)) == NULL) + if ((skb = sock_alloc_send_skb(sk, size, 0, 0, &err)) == NULL) return err; skb->sk = sk; @@ -1110,7 +1109,7 @@ printk("NET/ROM: Appending user data\n"); /* User data follows immediately after the NET/ROM transport header */ - memcpy_fromfs(asmptr, ubuf, len); + memcpy_fromiovec(asmptr, msg->msg_iov, len); if (sk->debug) printk("NET/ROM: Transmitting buffer\n"); @@ -1125,6 +1124,21 @@ return len; } +static int nr_sendto(struct socket *sock, const void *ubuf, int size, int noblock, unsigned flags, + struct sockaddr *sa, int addr_len) +{ + struct iovec iov; + struct msghdr msg; + iov.iov_base=(void *)ubuf; + iov.iov_len=size; + msg.msg_name=(void *)sa; + msg.msg_namelen=addr_len; + msg.msg_accrights=NULL; + msg.msg_iov=&iov; + msg.msg_iovlen=1; + return nr_sendmsg(sock,&msg,size,noblock,flags); +} + static int nr_send(struct socket *sock, const void *ubuf, int size, int noblock, unsigned flags) { return nr_sendto(sock, ubuf, size, noblock, flags, NULL, 0); @@ -1132,21 +1146,23 @@ static int nr_write(struct socket *sock, const char *ubuf, int size, int noblock) { - return nr_send(sock, ubuf, size, noblock, 0); + return nr_sendto(sock, ubuf, size, noblock, 0, NULL, 0); } -static int nr_recvfrom(struct socket *sock, void *ubuf, int size, int noblock, - unsigned flags, struct sockaddr *sip, int *addr_len) +static int nr_recvmsg(struct socket *sock, struct msghdr *msg, int size, int noblock, + int flags, int *addr_len) { struct sock *sk = (struct sock *)sock->data; - struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)sip; + struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name; int copied; struct sk_buff *skb; int er; if (sk->err) { + cli(); er = -sk->err; sk->err = 0; + sti(); return er; } @@ -1170,7 +1186,7 @@ } copied = (size < skb->len) ? size : skb->len; - skb_copy_datagram(skb, 0, ubuf, copied); + skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); if (sax != NULL) { struct sockaddr_ax25 addr; @@ -1188,6 +1204,24 @@ return copied; } +static int nr_recvfrom(struct socket *sock, void *ubuf, int size, int noblock, unsigned flags, + struct sockaddr *sa, int *addr_len) +{ + struct iovec iov; + struct msghdr msg; + iov.iov_base=ubuf; + iov.iov_len=size; + msg.msg_name=(void *)sa; + msg.msg_namelen=0; + if (addr_len) + msg.msg_namelen = *addr_len; + msg.msg_accrights=NULL; + msg.msg_iov=&iov; + msg.msg_iovlen=1; + return nr_recvmsg(sock,&msg,size,noblock,flags,addr_len); +} + + static int nr_recv(struct socket *sock, void *ubuf, int size , int noblock, unsigned flags) { @@ -1387,6 +1421,8 @@ nr_setsockopt, nr_getsockopt, nr_fcntl, + nr_sendmsg, + nr_recvmsg }; static struct notifier_block nr_dev_notifier = { diff -u --recursive --new-file v1.3.23/linux/net/netrom/nr_out.c linux/net/netrom/nr_out.c --- v1.3.23/linux/net/netrom/nr_out.c Mon Jul 31 15:59:05 1995 +++ linux/net/netrom/nr_out.c Mon Sep 4 14:48:37 1995 @@ -61,7 +61,7 @@ frontlen = skb_headroom(skb); while (skb->len > 0) { - if ((skbn = sock_alloc_send_skb(sk, frontlen + mtu, 0, &err)) == NULL) + if ((skbn = sock_alloc_send_skb(sk, frontlen + mtu, 0, 0, &err)) == NULL) return; skbn->sk = sk; diff -u --recursive --new-file v1.3.23/linux/net/unix/af_unix.c linux/net/unix/af_unix.c --- v1.3.23/linux/net/unix/af_unix.c Sun Sep 3 12:27:06 1995 +++ linux/net/unix/af_unix.c Mon Sep 4 15:31:37 1995 @@ -136,7 +136,6 @@ * Retry; */ - init_timer(&sk->timer); sk->timer.expires=jiffies+10*HZ; /* No real hurry try it every 10 seconds or so */ add_timer(&sk->timer); } @@ -144,7 +143,6 @@ static void unix_delayed_delete(unix_socket *sk) { - init_timer(&sk->timer); sk->timer.data=(unsigned long)sk; sk->timer.expires=jiffies+HZ; /* Normally 1 second after will clean up. After that we try every 10 */ sk->timer.function=unix_destroy_timer; @@ -275,6 +273,7 @@ kfree_s(sk,sizeof(*sk)); return -ESOCKTNOSUPPORT; } + init_timer(&sk->timer); skb_queue_head_init(&sk->write_queue); skb_queue_head_init(&sk->receive_queue); skb_queue_head_init(&sk->back_log); @@ -473,7 +472,7 @@ * Now ready to connect */ - skb=sock_alloc_send_skb(sk, 0, 0, &err); /* Marker object */ + skb=sock_alloc_send_skb(sk, 0, 0, 0, &err); /* Marker object */ if(skb==NULL) return err; skb->sk=sk; /* So they know it is us */ @@ -658,6 +657,8 @@ struct sockaddr_un *sun=msg->msg_name; int err,size; struct sk_buff *skb; + int limit=0; + int sent=0; if(sk->err) { @@ -687,62 +688,91 @@ return -ENOTCONN; } - /* - * Optimisation for the fact that under 0.01% of X messages typically - * need breaking up. - */ - if(len>(sk->sndbuf-sizeof(struct sk_buff))/2) /* Keep two messages in the pipe so it schedules better */ + while(sent < len) { - if(sock->type==SOCK_DGRAM) - return -EMSGSIZE; - len=(sk->sndbuf-sizeof(struct sk_buff))/2; + /* + * Optimisation for the fact that under 0.01% of X messages typically + * need breaking up. + */ + + size=len-sent; + + if(size>(sk->sndbuf-sizeof(struct sk_buff))/2) /* Keep two messages in the pipe so it schedules better */ + { + if(sock->type==SOCK_DGRAM) + return -EMSGSIZE; + size=(sk->sndbuf-sizeof(struct sk_buff))/2; + } /* * Keep to page sized kmalloc()'s as various people * have suggested. Big mallocs stress the vm too * much. */ - if(len > 4000 && sock->type!=SOCK_DGRAM) - len = 4000; - } - - size=/*protocol_size(&proto_unix)+*/len; - skb=sock_alloc_send_skb(sk,size,nonblock, &err); - if(skb==NULL) - return err; -/* protocol_adjust(skb,&proto_unix);*/ - skb->sk=sk; - skb->free=1; - memcpy_fromiovec(skb_put(skb,len),msg->msg_iov, len); - cli(); - if(sun==NULL) - { - other=sk->protinfo.af_unix.other; - if(sock->type==SOCK_DGRAM && other->dead) + if(size > 4000 && sock->type!=SOCK_DGRAM) + limit = 4000; /* Fall back to 4K if we can't grab a big buffer this instant */ + else + limit = 0; /* Otherwise just grab and wait */ + + /* + * Grab a buffer + */ + + skb=sock_alloc_send_skb(sk,size,limit,nonblock, &err); + + if(skb==NULL) { - other->protinfo.af_unix.locks--; - sk->protinfo.af_unix.other=NULL; - sock->state=SS_UNCONNECTED; - sti(); - return -ECONNRESET; + if(sent) + { + sk->err=-err; + return sent; + } + return err; } - } - else - { - unix_mkname(sun, msg->msg_namelen); - other=unix_find_other(sun->sun_path, &err); - if(other==NULL) + size=skb_tailroom(skb); /* If we dropped back on a limit then our skb is smaller */ + + skb->sk=sk; + skb->free=1; + + memcpy_fromiovec(skb_put(skb,size),msg->msg_iov, size); + + cli(); + if(sun==NULL) { - kfree_skb(skb, FREE_WRITE); - sti(); - return err; + other=sk->protinfo.af_unix.other; + if(sock->type==SOCK_DGRAM && other->dead) + { + other->protinfo.af_unix.locks--; + sk->protinfo.af_unix.other=NULL; + sock->state=SS_UNCONNECTED; + sti(); + if(!sent) + return -ECONNRESET; + else + return sent; + } + } + else + { + unix_mkname(sun, msg->msg_namelen); + other=unix_find_other(sun->sun_path, &err); + if(other==NULL) + { + kfree_skb(skb, FREE_WRITE); + sti(); + if(sent) + return sent; + else + return err; + } } + skb_queue_tail(&other->receive_queue, skb); + sti(); + other->data_ready(other,size); + sent+=size; } - skb_queue_tail(&other->receive_queue, skb); - sti(); - other->data_ready(other,len); - return len; + return sent; } static int unix_recvmsg(struct socket *sock, struct msghdr *msg, int size, int noblock, int flags, int *addr_len) diff -u --recursive --new-file v1.3.23/linux/scripts/Configure linux/scripts/Configure --- v1.3.23/linux/scripts/Configure Sun Sep 3 12:27:06 1995 +++ linux/scripts/Configure Mon Sep 4 07:31:54 1995 @@ -13,6 +13,9 @@ # # 050793 - use IFS='@' to get around a bug in a pre-version of bash-1.13 # with an empty IFS. +# +# 030995 (storner@osiris.ping.dk) - added support for tri-state answers, +# for selecting modules to compile. # # Make sure we're really running bash. @@ -60,13 +63,22 @@ # define_bool define value # function define_bool () { - if [ "$2" = "y" ]; then + case "$2" in + "y" | "Y") echo "$1=y" >>$CONFIG echo "#define $1 1" >>$CONFIG_H - else + ;; + + "m" | "M") + echo "$1=m" >>$CONFIG + echo "#undef $1" >>$CONFIG_H + ;; + + "n" | "N") echo "# $1 is not set" >>$CONFIG echo "#undef $1" >>$CONFIG_H - fi + ;; + esac eval "$1=$2" } @@ -78,8 +90,36 @@ function bool () { ans="" def=$(eval echo "\${$2:-$3}") + case "$def" in + "y") defprompt="Y/n" + ;; + "n") defprompt="N/y" + ;; + esac while [ "$ans" != "y" -a "$ans" != "n" ]; do - readln "$1 ($2) [$def] " "$def" + readln "$1 ($2) [$defprompt] " "$def" + done + define_bool "$2" "$ans" +} + +# +# tristate processes a tristate argument +# +# tristate question define default +# +function tristate () { + ans="" + def=$(eval echo "\${$2:-$3}") + case "$def" in + "y") defprompt="Y/m/n" + ;; + "m") defprompt="M/n/y" + ;; + "n") defprompt="N/y/m" + ;; + esac + while [ "$ans" != "y" -a "$ans" != "n" -a "$ans" != "m" ]; do + readln "$1 ($2) [$defprompt] " "$def" done define_bool "$2" "$ans" }