Commit 158a16f9 authored by Linus Torvalds's avatar Linus Torvalds

Import 2.1.1

parent fbda5aab
VERSION = 2
PATCHLEVEL = 1
SUBLEVEL = 0
SUBLEVEL = 1
ARCH = i386
......
......@@ -63,11 +63,8 @@ INSTALLING the kernel:
to get it all put in place. Replace "XX" with the version number of the
latest kernel.
- You can also upgrade between 2.1.xx releases by patching. Each
patch that is released for 2.1.xx contains only bugfixes. No
new features will be added to the Linux kernel until the 2.1.xx
development effort begins. To install by patching, get all the
newer patch files and do
- You can also upgrade between 2.1.xx releases by patching. To install
by patching, get all the newer patch files and do
cd /usr/src
gzip -cd patchXX.gz | patch -p0
......@@ -144,10 +141,13 @@ COMPILING the kernel:
- Make sure you have gcc-2.7.0 or newer available. It seems older gcc
versions can have problems compiling newer versions of linux. This
is mainly because they only compile programs in the a.out binary
format. As of Linux 2.1.0, the kernel must be compiled as ELF. If
you upgrade your compiler, remember to get the new binutils package too
(for as/ld/nm and company).
is mainly because the older compilers can only generate "a.out"-format
executables. As of Linux 2.1.0, the kernel must be compiled as an
"ELF" binary. If you upgrade your compiler, remember to get the new
binutils package too (for as/ld/nm and company).
Please note that you can still run a.out user programs with this
kernel.
- Do a "make zImage" to create a compressed kernel image. If you want
to make a bootdisk (without root filesystem or lilo), insert a floppy
......@@ -173,10 +173,10 @@ COMPILING the kernel:
For some, this is on a floppy disk, in which case you can "cp
/usr/src/linux/arch/i386/boot/zImage /dev/fd0" to make a bootable
floppy. Note that a change in the 1.3.x series prevented a kernel
copied to a 720k double-density 3.5" floppy from booting. In this
floppy. Please note that you can not boot a kernel by
directly dumping it to a 720k double-density 3.5" floppy. In this
case, it is highly recommended that you install LILO on your
double-density bootfloppy or switch to high-density floppies.
double-density boot floppy or switch to high-density floppies.
If you boot Linux from the hard drive, chances are you use LILO which
uses the kernel image as specified in the file /etc/lilo.conf. The
......
......@@ -86,7 +86,7 @@ asmlinkage int do_sigsuspend(unsigned long mask, struct pt_regs * regs, struct s
/*
* Do a signal return; undo the signal stack.
*/
asmlinkage void do_sigreturn(struct sigcontext_struct * sc,
asmlinkage void do_sigreturn(struct sigcontext * sc,
struct pt_regs * regs, struct switch_stack * sw)
{
unsigned long mask;
......@@ -155,10 +155,10 @@ static void setup_frame(struct sigaction * sa,
{
int i;
unsigned long oldsp;
struct sigcontext_struct * sc;
struct sigcontext * sc;
oldsp = rdusp();
sc = ((struct sigcontext_struct *) oldsp) - 1;
sc = ((struct sigcontext *) oldsp) - 1;
/* check here if we would need to switch stacks.. */
if (verify_area(VERIFY_WRITE, sc, sizeof(*sc)))
......
......@@ -15,8 +15,8 @@ static struct symbol_table arch_symbol_table = {
X(dump_thread),
X(dump_fpu),
X(ioremap),
XNOVERS(down_failed),
XNOVERS(up_wakeup),
XNOVERS(__down_failed),
XNOVERS(__up_wakeup),
#ifdef __SMP__
X(apic_reg), /* Needed internally for the I386 inlines */
X(cpu_data),
......
......@@ -84,7 +84,7 @@ asmlinkage int sys_sigreturn(unsigned long __unused)
if ((context.x & 0xfffc) && (context.x & 3) != 3) goto badframe; COPY(x);
#define COPY_SEG_STRICT(x) \
if (!(context.x & 0xfffc) || (context.x & 3) != 3) goto badframe; COPY(x);
struct sigcontext_struct context;
struct sigcontext context;
struct pt_regs * regs;
regs = (struct pt_regs *) &__unused;
......
......@@ -220,10 +220,7 @@ static inline int is_revectored(int nr, struct revectored_struct * bitmap)
{
if (verify_area(VERIFY_READ, bitmap, 256/8) < 0)
return 1;
__asm__ __volatile__("btl %2,%%fs:%1\n\tsbbl %0,%0"
:"=r" (nr)
:"m" (*bitmap),"r" (nr));
return nr;
return test_bit(nr, bitmap);
}
/*
......@@ -234,16 +231,16 @@ static inline int is_revectored(int nr, struct revectored_struct * bitmap)
#define pushb(base, ptr, val) \
__asm__ __volatile__( \
"decw %w0\n\t" \
"movb %2,%%fs:0(%1,%0)" \
"movb %2,0(%1,%0)" \
: "=r" (ptr) \
: "r" (base), "q" (val), "0" (ptr))
#define pushw(base, ptr, val) \
__asm__ __volatile__( \
"decw %w0\n\t" \
"movb %h2,%%fs:0(%1,%0)\n\t" \
"movb %h2,0(%1,%0)\n\t" \
"decw %w0\n\t" \
"movb %b2,%%fs:0(%1,%0)" \
"movb %b2,0(%1,%0)" \
: "=r" (ptr) \
: "r" (base), "q" (val), "0" (ptr))
......@@ -251,21 +248,21 @@ __asm__ __volatile__( \
__asm__ __volatile__( \
"decw %w0\n\t" \
"rorl $16,%2\n\t" \
"movb %h2,%%fs:0(%1,%0)\n\t" \
"movb %h2,0(%1,%0)\n\t" \
"decw %w0\n\t" \
"movb %b2,%%fs:0(%1,%0)\n\t" \
"movb %b2,0(%1,%0)\n\t" \
"decw %w0\n\t" \
"rorl $16,%2\n\t" \
"movb %h2,%%fs:0(%1,%0)\n\t" \
"movb %h2,0(%1,%0)\n\t" \
"decw %w0\n\t" \
"movb %b2,%%fs:0(%1,%0)" \
"movb %b2,0(%1,%0)" \
: "=r" (ptr) \
: "r" (base), "q" (val), "0" (ptr))
#define popb(base, ptr) \
({ unsigned long __res; \
__asm__ __volatile__( \
"movb %%fs:0(%1,%0),%b2\n\t" \
"movb 0(%1,%0),%b2\n\t" \
"incw %w0" \
: "=r" (ptr), "=r" (base), "=q" (__res) \
: "0" (ptr), "1" (base), "2" (0)); \
......@@ -274,9 +271,9 @@ __res; })
#define popw(base, ptr) \
({ unsigned long __res; \
__asm__ __volatile__( \
"movb %%fs:0(%1,%0),%b2\n\t" \
"movb 0(%1,%0),%b2\n\t" \
"incw %w0\n\t" \
"movb %%fs:0(%1,%0),%h2\n\t" \
"movb 0(%1,%0),%h2\n\t" \
"incw %w0" \
: "=r" (ptr), "=r" (base), "=q" (__res) \
: "0" (ptr), "1" (base), "2" (0)); \
......@@ -285,14 +282,14 @@ __res; })
#define popl(base, ptr) \
({ unsigned long __res; \
__asm__ __volatile__( \
"movb %%fs:0(%1,%0),%b2\n\t" \
"movb 0(%1,%0),%b2\n\t" \
"incw %w0\n\t" \
"movb %%fs:0(%1,%0),%h2\n\t" \
"movb 0(%1,%0),%h2\n\t" \
"incw %w0\n\t" \
"rorl $16,%2\n\t" \
"movb %%fs:0(%1,%0),%b2\n\t" \
"movb 0(%1,%0),%b2\n\t" \
"incw %w0\n\t" \
"movb %%fs:0(%1,%0),%h2\n\t" \
"movb 0(%1,%0),%h2\n\t" \
"incw %w0\n\t" \
"rorl $16,%2" \
: "=r" (ptr), "=r" (base), "=q" (__res) \
......
......@@ -9,19 +9,27 @@
/*
* "down_failed" is called with the eventual return address
* in %eax, and the address of the semaphore in %ecx. We need
* to increment the number of waiters on the semaphore,
* call "__down()", and then eventually return to try again.
* to call "__down()", and then re-try until we succeed..
*/
ENTRY(down_failed)
pushl %eax
pushl %ecx
ENTRY(__down_failed)
pushl %eax /* return address */
pushl %edx /* save %edx */
1: pushl %ecx /* save %ecx (and argument) */
call SYMBOL_NAME(__down)
popl %ecx
popl %ecx /* restore %ecx (count on __down not changing it) */
#ifdef __SMP__
lock
#endif
decl (%ecx)
js 1b
popl %edx /* restore %edx */
ret
ENTRY(up_wakeup)
pushl %eax
pushl %ecx
ENTRY(__up_wakeup)
pushl %eax /* return address */
pushl %edx /* save %edx */
pushl %ecx /* save %ecx (and argument) */
call SYMBOL_NAME(__up)
popl %ecx
popl %ecx /* restore %ecx (count on __up not changing it) */
popl %edx /* restore %edx */
ret
......@@ -180,14 +180,14 @@ static int rd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un
#ifdef CONFIG_BLK_DEV_INITRD
static int initrd_read(struct inode *inode,struct file *file,char *buf,
int count)
static long initrd_read(struct inode *inode,struct file *file,
char *buf, unsigned long count)
{
int left;
left = initrd_end-initrd_start-file->f_pos;
if (count > left) count = left;
if (count <= 0) return 0;
if (count == 0) return 0;
memcpy_tofs(buf,(char *) initrd_start+file->f_pos,count);
file->f_pos += count;
return count;
......@@ -350,8 +350,8 @@ identify_ramdisk_image(kdev_t device, struct file *fp, int start_block)
/*
* Read block 0 to test for gzipped kernel
*/
if (fp->f_op->lseek)
fp->f_op->lseek(fp->f_inode, fp, start_block * BLOCK_SIZE, 0);
if (fp->f_op->llseek)
fp->f_op->llseek(fp->f_inode, fp, start_block * BLOCK_SIZE, 0);
fp->f_pos = start_block * BLOCK_SIZE;
fp->f_op->read(fp->f_inode, fp, buf, size);
......@@ -370,8 +370,8 @@ identify_ramdisk_image(kdev_t device, struct file *fp, int start_block)
/*
* Read block 1 to test for minix and ext2 superblock
*/
if (fp->f_op->lseek)
fp->f_op->lseek(fp->f_inode, fp,
if (fp->f_op->llseek)
fp->f_op->llseek(fp->f_inode, fp,
(start_block+1) * BLOCK_SIZE, 0);
fp->f_pos = (start_block+1) * BLOCK_SIZE;
......@@ -400,8 +400,8 @@ identify_ramdisk_image(kdev_t device, struct file *fp, int start_block)
start_block);
done:
if (fp->f_op->lseek)
fp->f_op->lseek(fp->f_inode, fp, start_block * BLOCK_SIZE, 0);
if (fp->f_op->llseek)
fp->f_op->llseek(fp->f_inode, fp, start_block * BLOCK_SIZE, 0);
fp->f_pos = start_block * BLOCK_SIZE;
if ((nblocks > 0) && blk_size[MAJOR(device)]) {
......
......@@ -209,7 +209,8 @@ struct pci_dev_info dev_info[] = {
DEVICE( 3DLABS, 3DLABS_300SX, "GLINT 300SX"),
DEVICE( AVANCE, AVANCE_2302, "ALG-2302"),
DEVICE( S3, S3_ViRGE, "ViRGE"),
DEVICE( S3, S3_811, "Trio32/Trio64"),
DEVICE( S3, S3_TRIO, "Trio32/Trio64"),
DEVICE( S3, S3_ViRGE_VX, "ViRGE/VX"),
DEVICE( S3, S3_868, "Vision 868"),
DEVICE( S3, S3_928, "Vision 928-P"),
DEVICE( S3, S3_864_1, "Vision 864-P"),
......
......@@ -248,14 +248,11 @@ typedef unsigned int u32;
#include <linux/proc_fs.h>
#include <linux/string.h>
#include <linux/malloc.h>
#include <linuxv/malloc.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/time.h>
#ifdef LINUX_1_2
#include "../block/blk.h"
#else
#include <linux/blk.h>
#endif
#undef current
#include "scsi.h"
......
......@@ -2252,6 +2252,21 @@ cmd->scsi_done(cmd);
return SCSI_ABORT_SUCCESS;
}
/*
* AM53C974_release()
*
* Release resources allocated for a single AM53C974 adapter.
*/
int
AM53C974_release(struct Scsi_Host *shp)
{
free_irq(shp->irq, NULL);
scsi_unregister(shp);
return 0;
}
#ifdef MODULE
static Scsi_Host_Template driver_template = AM53C974;
......
......@@ -273,7 +273,7 @@ extern struct proc_dir_entry proc_scsi_am53c974;
NULL, /* int (*proc_info)(char *, char **, off_t, int, int, int); */ \
"AM53C974", /* name */ \
AM53C974_detect, /* int (* detect)(struct SHT *) */ \
NULL, /* int (*release)(struct Scsi_Host *) */ \
AM53C974_release, /* int (*release)(struct Scsi_Host *) */ \
AM53C974_info, /* const char *(* info)(struct Scsi_Host *) */ \
AM53C974_command, /* int (* command)(Scsi_Cmnd *) */ \
AM53C974_queue_command, /* int (* queuecommand)(Scsi_Cmnd *, \
......@@ -293,6 +293,7 @@ extern struct proc_dir_entry proc_scsi_am53c974;
void AM53C974_setup(char *str, int *ints);
int AM53C974_detect(Scsi_Host_Template *tpnt);
int AM53C974_release(struct Scsi_Host *shp);
int AM53C974_biosparm(Disk *disk, int dev, int *info_array);
const char *AM53C974_info(struct Scsi_Host *);
int AM53C974_command(Scsi_Cmnd *SCpnt);
......
......@@ -21,7 +21,7 @@ dep_tristate 'Adaptec AHA1740 support' CONFIG_SCSI_AHA1740 $CONFIG_SCSI
dep_tristate 'Adaptec AHA274X/284X/294X support' CONFIG_SCSI_AIC7XXX $CONFIG_SCSI
dep_tristate 'AdvanSys SCSI support' CONFIG_SCSI_ADVANSYS $CONFIG_SCSI
dep_tristate 'Always IN2000 SCSI support' CONFIG_SCSI_IN2000 $CONFIG_SCSI
bool 'AM53/79C974 PCI SCSI support' CONFIG_SCSI_AM53C974
dep_tristate 'AM53/79C974 PCI SCSI support' CONFIG_SCSI_AM53C974 $CONFIG_SCSI
dep_tristate 'BusLogic SCSI support' CONFIG_SCSI_BUSLOGIC $CONFIG_SCSI
dep_tristate 'DTC3180/3280 SCSI support' CONFIG_SCSI_DTC3280 $CONFIG_SCSI
dep_tristate 'EATA ISA/EISA (DPT PM2011/021/012/022/122/322) support' CONFIG_SCSI_EATA $CONFIG_SCSI
......
......@@ -174,6 +174,10 @@ endif
ifeq ($(CONFIG_SCSI_AM53C974),y)
L_OBJS += AM53C974.o
else
ifeq ($(CONFIG_SCSI_AM53C974),m)
M_OBJS += AM53C974.o
endif
endif
ifeq ($(CONFIG_SCSI_BUSLOGIC),y)
......
......@@ -636,7 +636,7 @@ int aha1542_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
panic("Foooooooood fight!");
};
any2scsi(cptr[i].dataptr, SCSI_PA(sgpnt[i].address));
if(SCSI_PA(sgpnt[i].address+sgpnt[i].length) > ISA_DMA_THRESHOLD)
if(SCSI_PA(sgpnt[i].address+sgpnt[i].length-1) > ISA_DMA_THRESHOLD)
BAD_DMA("sgpnt", sgpnt[i].address, sgpnt[i].length);
any2scsi(cptr[i].datalen, sgpnt[i].length);
};
......@@ -651,7 +651,7 @@ int aha1542_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
ccb[mbo].op = 0; /* SCSI Initiator Command */
SCpnt->host_scribble = NULL;
any2scsi(ccb[mbo].datalen, bufflen);
if(buff && SCSI_PA(buff+bufflen) > ISA_DMA_THRESHOLD)
if(buff && SCSI_PA(buff+bufflen-1) > ISA_DMA_THRESHOLD)
BAD_DMA("buff", buff, bufflen);
any2scsi(ccb[mbo].dataptr, SCSI_PA(buff));
};
......@@ -950,7 +950,7 @@ int aha1542_detect(Scsi_Host_Template * tpnt)
/* For now we do this - until kmalloc is more intelligent
we are resigned to stupid hacks like this */
if (SCSI_PA(shpnt+1) > ISA_DMA_THRESHOLD) {
if (SCSI_PA(shpnt) >= ISA_DMA_THRESHOLD) {
printk("Invalid address for shpnt with 1542.\n");
goto unregister;
}
......
/*
* eata.c - Low-level driver for EATA/DMA SCSI host adapters.
*
* 27 Sep 1996 rev. 2.12 for linux 2.1.0
* Portability cleanups (virtual/bus addressing, little/big endian
* support).
*
* 09 Jul 1996 rev. 2.11 for linux 2.0.4
* Number of internal retries is now limited.
*
......@@ -127,6 +131,7 @@
#include <linux/ioport.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/byteorder.h>
#include <linux/proc_fs.h>
#include <linux/blk.h>
#include "scsi.h"
......@@ -331,6 +336,11 @@ static unsigned int irqlist[MAX_IRQ], calls[MAX_IRQ];
#define HD(board) ((struct hostdata *) &sh[board]->hostdata)
#define BN(board) (HD(board)->board_name)
#define H2DEV(x) htonl(x)
#define DEV2H(x) H2DEV(x)
#define V2DEV(addr) ((addr) ? H2DEV(virt_to_bus((void *)addr)) : 0)
#define DEV2V(addr) ((addr) ? DEV2H(bus_to_virt((unsigned long)addr)) : 0)
static void eata2x_interrupt_handler(int, void *, struct pt_regs *);
static int do_trace = FALSE;
......@@ -347,11 +357,11 @@ static inline unchar do_dma (ushort iobase, unsigned int addr, unchar cmd) {
if (wait_on_busy(iobase)) return TRUE;
if (addr) {
outb((char) addr, iobase + REG_LOW);
outb((char) (addr >> 8), iobase + REG_LM);
outb((char) (addr >> 16), iobase + REG_MID);
outb((char) (addr >> 24), iobase + REG_MSB);
if ((addr = V2DEV(addr))) {
outb((char) (addr >> 24), iobase + REG_LOW);
outb((char) (addr >> 16), iobase + REG_LM);
outb((char) (addr >> 8), iobase + REG_MID);
outb((char) addr, iobase + REG_MSB);
}
outb(cmd, iobase + REG_CMD);
......@@ -403,14 +413,14 @@ static inline int port_detect(ushort *port_base, unsigned int j,
/* Check the controller "EATA" signature */
if (info.sign != EATA_SIGNATURE) return FALSE;
if (ntohl(info.data_len) < EATA_2_0A_SIZE) {
if (DEV2H(info.data_len) < EATA_2_0A_SIZE) {
printk("%s: config structure size (%ld bytes) too short, detaching.\n",
name, ntohl(info.data_len));
name, DEV2H(info.data_len));
return FALSE;
}
else if (ntohl(info.data_len) == EATA_2_0A_SIZE)
else if (DEV2H(info.data_len) == EATA_2_0A_SIZE)
protocol_rev = 'A';
else if (ntohl(info.data_len) == EATA_2_0B_SIZE)
else if (DEV2H(info.data_len) == EATA_2_0B_SIZE)
protocol_rev = 'B';
else
protocol_rev = 'C';
......@@ -552,8 +562,8 @@ static inline int port_detect(ushort *port_base, unsigned int j,
info.forcaddr, info.max_id, info.max_chan);
printk("%s: Version 0x%x, SYNC 0x%x, infol %ld, cpl %ld spl %ld.\n",
name, info.version, info.sync, ntohl(info.data_len),
ntohl(info.cp_len), ntohl(info.sp_len));
name, info.version, info.sync, DEV2H(info.data_len),
DEV2H(info.cp_len), DEV2H(info.sp_len));
#endif
return TRUE;
......@@ -603,12 +613,12 @@ static inline void build_sg_list(struct mscp *cpp, Scsi_Cmnd *SCpnt) {
sgpnt = (struct scatterlist *) SCpnt->request_buffer;
for (k = 0; k < SCpnt->use_sg; k++) {
cpp->sglist[k].address = htonl((unsigned int) sgpnt[k].address);
cpp->sglist[k].num_bytes = htonl((unsigned int) sgpnt[k].length);
cpp->sglist[k].address = V2DEV(sgpnt[k].address);
cpp->sglist[k].num_bytes = H2DEV(sgpnt[k].length);
}
cpp->data_address = htonl((unsigned int) cpp->sglist);
cpp->data_len = htonl((SCpnt->use_sg * sizeof(struct sg_list)));
cpp->data_address = V2DEV(cpp->sglist);
cpp->data_len = H2DEV((SCpnt->use_sg * sizeof(struct sg_list)));
}
int eata2x_queuecommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
......@@ -670,8 +680,8 @@ int eata2x_queuecommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
memset(spp, 0, sizeof(struct mssp));
/* The EATA protocol uses Big Endian format, while Intel is Little Endian */
cpp->sp_addr = htonl((unsigned int) spp);
/* The EATA protocol uses Big Endian format */
cpp->sp_addr = V2DEV(spp);
SCpnt->scsi_done = done;
cpp->index = i;
......@@ -693,7 +703,7 @@ int eata2x_queuecommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
cpp->target = SCpnt->target;
cpp->lun = SCpnt->lun;
cpp->SCpnt = SCpnt;
cpp->sense_addr = htonl((unsigned int) SCpnt->sense_buffer);
cpp->sense_addr = V2DEV(SCpnt->sense_buffer);
cpp->sense_len = sizeof SCpnt->sense_buffer;
if (SCpnt->use_sg) {
......@@ -701,8 +711,8 @@ int eata2x_queuecommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
build_sg_list(cpp, SCpnt);
}
else {
cpp->data_address = htonl((unsigned int) SCpnt->request_buffer);
cpp->data_len = htonl(SCpnt->request_bufflen);
cpp->data_address = V2DEV(SCpnt->request_buffer);
cpp->data_len = H2DEV(SCpnt->request_bufflen);
}
memcpy(cpp->cdb, SCpnt->cmnd, SCpnt->cmd_len);
......
......@@ -11,7 +11,7 @@ int eata2x_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int eata2x_abort(Scsi_Cmnd *);
int eata2x_reset(Scsi_Cmnd *, unsigned int);
#define EATA_VERSION "2.11.00"
#define EATA_VERSION "2.12.00"
#define EATA { \
......
/* fdomain.c -- Future Domain TMC-16x0 SCSI driver
* Created: Sun May 3 18:53:19 1992 by faith@cs.unc.edu
* Revised: Thu Aug 8 14:58:51 1996 by r.faith@ieee.org
* Revised: Wed Oct 2 11:10:55 1996 by r.faith@ieee.org
* Author: Rickard E. Faith, faith@cs.unc.edu
* Copyright 1992, 1993, 1994, 1995, 1996 Rickard E. Faith
*
* $Id: fdomain.c,v 5.44 1996/08/08 18:58:53 root Exp $
* $Id: fdomain.c,v 5.45 1996/10/02 15:13:06 root Exp $
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
......@@ -105,6 +105,7 @@
1.3.72 5.39 8 Feb 1996 Adaptec AHA-2920 board
1.3.85 5.41 4 Apr 1996
2.0.12 5.44 8 Aug 1996 Use ID 7 for all PCI cards
2.1.1 5.45 2 Oct 1996 Update ROM accesses for 2.1.x
......@@ -276,7 +277,7 @@ struct proc_dir_entry proc_scsi_fdomain = {
S_IFDIR | S_IRUGO | S_IXUGO, 2
};
#define VERSION "$Revision: 5.44 $"
#define VERSION "$Revision: 5.45 $"
/* START OF USER DEFINABLE OPTIONS */
......@@ -363,7 +364,7 @@ enum out_port_type {
};
static int port_base = 0;
static void *bios_base = NULL;
static unsigned long bios_base = 0;
static int bios_major = 0;
static int bios_minor = 0;
static int PCI_bus = 0;
......@@ -397,16 +398,17 @@ static int Write_SCSI_Data_port;
static int FIFO_Size = 0x2000; /* 8k FIFO for
pre-tmc18c30 chips */
extern void fdomain_16x0_intr( int irq, void *dev_id, struct pt_regs * regs );
static void *addresses[] = {
(void *)0xc8000,
(void *)0xca000,
(void *)0xce000,
(void *)0xde000,
(void *)0xcc000, /* Extra addresses for PCI boards */
(void *)0xd0000,
(void *)0xe0000,
extern void fdomain_16x0_intr( int irq, void *dev_id,
struct pt_regs * regs );
static unsigned long addresses[] = {
0xc8000,
0xca000,
0xce000,
0xde000,
0xcc000, /* Extra addresses for PCI boards */
0xd0000,
0xe0000,
};
#define ADDRESS_COUNT (sizeof( addresses ) / sizeof( unsigned ))
......@@ -425,7 +427,7 @@ static unsigned short ints[] = { 3, 5, 10, 11, 12, 14, 15, 0 };
This driver works *ONLY* for Future Domain cards using the TMC-1800,
TMC-18C50, or TMC-18C30 chip. This includes models TMC-1650, 1660, 1670,
and 1680.
and 1680. These are all 16-bit cards.
The following BIOS signature signatures are for boards which do *NOT*
work with this driver (these TMC-8xx and TMC-9xx boards may work with the
......@@ -439,6 +441,12 @@ static unsigned short ints[] = { 3, 5, 10, 11, 12, 14, 15, 0 };
FUTURE DOMAIN CORP. (C) 1986-1990 V7.009/18/90
FUTURE DOMAIN CORP. (C) 1992 V8.00.004/02/92
(The cards which do *NOT* work are all 8-bit cards -- although some of
them have a 16-bit form-factor, the upper 8-bits are used only for IRQs
and are *NOT* used for data. You can tell the difference by following
the tracings on the circuit board -- if only the IRQ lines are involved,
you have a "8-bit" card, and should *NOT* use this driver.)
*/
struct signature {
......@@ -501,8 +509,8 @@ static void print_banner( struct Scsi_Host *shpnt )
if (bios_minor >= 0) printk( "%d", bios_minor );
else printk( "?." );
printk( " at 0x%x using scsi id %d\n",
(unsigned)bios_base, shpnt->this_id );
printk( " at 0x%lx using scsi id %d\n",
bios_base, shpnt->this_id );
}
/* If this driver works for later FD PCI
......@@ -577,7 +585,7 @@ static int fdomain_is_valid_port( int port )
if (inb( port + MSB_ID_Code ) != 0x60) return 0;
chip = tmc18c50;
#if 0
#if 1
/* Try to toggle 32-bit mode. This only
works on an 18c30 chip. (User reports
......@@ -675,16 +683,13 @@ static int fdomain_isa_detect( int *irq, int *iobase )
switch (Quantum) {
case 2: /* ISA_200S */
case 3: /* ISA_250MG */
base = *((char *)bios_base + 0x1fa2)
+ (*((char *)bios_base + 0x1fa3) << 8);
base = readb(bios_base + 0x1fa2) + (readb(bios_base + 0x1fa3) << 8);
break;
case 4: /* ISA_200S (another one) */
base = *((char *)bios_base + 0x1fa3)
+ (*((char *)bios_base + 0x1fa4) << 8);
base = readb(bios_base + 0x1fa3) + (readb(bios_base + 0x1fa4) << 8);
break;
default:
base = *((char *)bios_base + 0x1fcc)
+ (*((char *)bios_base + 0x1fcd) << 8);
base = readb(bios_base + 0x1fcc) + (readb(bios_base + 0x1fcd) << 8);
break;
}
......@@ -944,11 +949,12 @@ int fdomain_16x0_detect( Scsi_Host_Template *tpnt )
for (i = 0; !bios_base && i < ADDRESS_COUNT; i++) {
#if DEBUG_DETECT
printk( " %x(%x),", (unsigned)addresses[i], (unsigned)bios_base );
printk( " %lx(%lx),", addresses[i], bios_base );
#endif
for (j = 0; !bios_base && j < SIGNATURE_COUNT; j++) {
if (!memcmp( ((char *)addresses[i] + signatures[j].sig_offset),
signatures[j].signature, signatures[j].sig_length )) {
if (check_signature(addresses[i] + signatures[j].sig_offset,
signatures[j].signature,
signatures[j].sig_length )) {
bios_major = signatures[j].major_bios_version;
bios_minor = signatures[j].minor_bios_version;
PCI_bus = (signatures[j].flag == 1);
......@@ -1927,11 +1933,12 @@ int fdomain_16x0_biosparam( Scsi_Disk *disk, kdev_t dev, int *info_array )
unsigned char *data = (unsigned char *)(sizes + 2);
unsigned char do_read[] = { READ_6, 0, 0, 0, 1, 0 };
int retcode;
unsigned long offset;
struct drive_info {
unsigned short cylinders;
unsigned char heads;
unsigned char sectors;
} *i;
} i;
/* NOTES:
The RAM area starts at 0x1f00 from the bios_base address.
......@@ -1983,28 +1990,30 @@ int fdomain_16x0_biosparam( Scsi_Disk *disk, kdev_t dev, int *info_array )
case 2: /* ISA_200S */
/* The value of 25 has never been verified.
It should probably be 15. */
i = (struct drive_info *)( (char *)bios_base + 0x1f33 + drive * 25 );
offset = bios_base + 0x1f33 + drive * 25;
break;
case 3: /* ISA_250MG */
i = (struct drive_info *)( (char *)bios_base + 0x1f36 + drive * 15 );
offset = bios_base + 0x1f36 + drive * 15;
break;
case 4: /* ISA_200S (another one) */
i = (struct drive_info *)( (char *)bios_base + 0x1f34 + drive * 15 );
offset = bios_base + 0x1f34 + drive * 15;
break;
default:
i = (struct drive_info *)( (char *)bios_base + 0x1f31 + drive * 25 );
offset = bios_base + 0x1f31 + drive * 25;
break;
}
info_array[0] = i->heads;
info_array[1] = i->sectors;
info_array[2] = i->cylinders;
memcpy_fromio( &i, offset, sizeof( struct drive_info ) );
info_array[0] = i.heads;
info_array[1] = i.sectors;
info_array[2] = i.cylinders;
} else if (bios_major == 3
&& bios_minor >= 0
&& bios_minor < 4) { /* 3.0 and 3.2 BIOS */
i = (struct drive_info *)( (char *)bios_base + 0x1f71 + drive * 10 );
info_array[0] = i->heads + 1;
info_array[1] = i->sectors;
info_array[2] = i->cylinders;
memcpy_fromio( &i, bios_base + 0x1f71 + drive * 10,
sizeof( struct drive_info ) );
info_array[0] = i.heads + 1;
info_array[1] = i.sectors;
info_array[2] = i.cylinders;
} else { /* 3.4 BIOS (and up?) */
/* This algorithm was provided by Future Domain (much thanks!). */
......
......@@ -11,7 +11,7 @@
Copyright 1992 - 1996 Kai Makisara
email Kai.Makisara@metla.fi
Last modified: Sun Jul 7 10:08:46 1996 by root@kai.makisara.fi
Last modified: Tue Oct 1 22:53:51 1996 by makisara@kai.makisara.fi
Some small formal changes - aeb, 950809
*/
......@@ -2192,7 +2192,8 @@ get_location(struct inode * inode, unsigned int *block, int *partition,
return (-EBUSY);
if ((STp->buffer)->last_result_fatal != 0 ||
((STp->buffer)->b_data[0] & 4)) {
(STp->device->scsi_level >= SCSI_2 &&
((STp->buffer)->b_data[0] & 4) != 0)) {
*block = *partition = 0;
#if DEBUG
if (debugging)
......
/*
* u14-34f.c - Low-level driver for UltraStor 14F/34F SCSI host adapters.
*
* 27 Sep 1996 rev. 2.12 for linux 2.1.0
* Portability cleanups (virtual/bus addressing, little/big endian
* support).
*
* 09 Jul 1996 rev. 2.11 for linux 2.0.4
* "Data over/under-run" no longer implies a redo on all targets.
* Number of internal retries is now limited.
......@@ -157,6 +161,7 @@
#include <linux/ioport.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/byteorder.h>
#include <linux/proc_fs.h>
#include <linux/blk.h>
#include "scsi.h"
......@@ -266,8 +271,8 @@ struct mscp {
Scsi_Cmnd *SCpnt;
struct sg_list {
unsigned int address; /* Segment Address */
unsigned int num_bytes; /* Segment Length */
unsigned int address; /* Segment Address */
unsigned int num_bytes; /* Segment Length */
} sglist[MAX_SGLIST];
unsigned int index; /* cp index */
......@@ -302,6 +307,20 @@ static unsigned int irqlist[MAX_IRQ], calls[MAX_IRQ];
#define HD(board) ((struct hostdata *) &sh[board]->hostdata)
#define BN(board) (HD(board)->board_name)
#if defined(__BIG_ENDIAN)
#define H2DEV(x) ((unsigned long)( \
(((unsigned long)(x) & 0x000000ffU) << 24) | \
(((unsigned long)(x) & 0x0000ff00U) << 8) | \
(((unsigned long)(x) & 0x00ff0000U) >> 8) | \
(((unsigned long)(x) & 0xff000000U) >> 24)))
#else
#define H2DEV(x) (x)
#endif
#define DEV2H(x) H2DEV(x)
#define V2DEV(addr) ((addr) ? H2DEV(virt_to_bus((void *)addr)) : 0)
#define DEV2V(addr) ((addr) ? DEV2H(bus_to_virt((unsigned long)addr)) : 0)
static void u14_34f_interrupt_handler(int, void *, struct pt_regs *);
static int do_trace = FALSE;
......@@ -322,8 +341,8 @@ static int board_inquiry(unsigned int j) {
memset(cpp, 0, sizeof(struct mscp));
cpp->opcode = OP_HOST_ADAPTER;
cpp->xdir = DTD_IN;
cpp->data_address = virt_to_bus(HD(j)->board_id);
cpp->data_len = sizeof(HD(j)->board_id);
cpp->data_address = V2DEV(HD(j)->board_id);
cpp->data_len = H2DEV(sizeof(HD(j)->board_id));
cpp->scsi_cdbs_len = 6;
cpp->scsi_cdbs[0] = HA_CMD_INQUIRY;
......@@ -338,7 +357,7 @@ static int board_inquiry(unsigned int j) {
outb(CMD_CLR_INTR, sh[j]->io_port + REG_SYS_INTR);
/* Store pointer in OGM address bytes */
outl(virt_to_bus(cpp), sh[j]->io_port + REG_OGM);
outl(V2DEV(cpp), sh[j]->io_port + REG_OGM);
/* Issue OGM interrupt */
outb(CMD_OGM_INTR, sh[j]->io_port + REG_LCL_INTR);
......@@ -568,14 +587,14 @@ static inline void build_sg_list(struct mscp *cpp, Scsi_Cmnd *SCpnt) {
sgpnt = (struct scatterlist *) SCpnt->request_buffer;
for (k = 0; k < SCpnt->use_sg; k++) {
cpp->sglist[k].address = virt_to_bus(sgpnt[k].address);
cpp->sglist[k].num_bytes = sgpnt[k].length;
cpp->sglist[k].address = V2DEV(sgpnt[k].address);
cpp->sglist[k].num_bytes = H2DEV(sgpnt[k].length);
data_len += sgpnt[k].length;
}
cpp->use_sg = SCpnt->use_sg;
cpp->data_address = virt_to_bus(cpp->sglist);
cpp->data_len = data_len;
cpp->data_address = V2DEV(cpp->sglist);
cpp->data_len = H2DEV(data_len);
}
int u14_34f_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
......@@ -649,7 +668,7 @@ int u14_34f_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
cpp->target = SCpnt->target;
cpp->lun = SCpnt->lun;
cpp->SCpnt = SCpnt;
cpp->sense_addr = virt_to_bus(SCpnt->sense_buffer);
cpp->sense_addr = V2DEV(SCpnt->sense_buffer);
cpp->sense_len = sizeof SCpnt->sense_buffer;
if (SCpnt->use_sg) {
......@@ -657,8 +676,8 @@ int u14_34f_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
build_sg_list(cpp, SCpnt);
}
else {
cpp->data_address = virt_to_bus(SCpnt->request_buffer);
cpp->data_len = SCpnt->request_bufflen;
cpp->data_address = V2DEV(SCpnt->request_buffer);
cpp->data_len = H2DEV(SCpnt->request_bufflen);
}
cpp->scsi_cdbs_len = SCpnt->cmd_len;
......@@ -675,7 +694,7 @@ int u14_34f_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
}
/* Store pointer in OGM address bytes */
outl(virt_to_bus(cpp), sh[j]->io_port + REG_OGM);
outl(V2DEV(cpp), sh[j]->io_port + REG_OGM);
/* Issue OGM interrupt */
outb(CMD_OGM_INTR, sh[j]->io_port + REG_LCL_INTR);
......@@ -901,7 +920,7 @@ static void u14_34f_interrupt_handler(int irq, void *dev_id, struct pt_regs * re
if (do_trace) printk("%s: ihdlr, start service, count %d.\n",
BN(j), HD(j)->iocount);
spp = (struct mscp *)bus_to_virt(inl(sh[j]->io_port + REG_ICM));
spp = (struct mscp *)DEV2V(inl(sh[j]->io_port + REG_ICM));
/* Clear interrupt pending flag */
outb(CMD_CLR_INTR, sh[j]->io_port + REG_SYS_INTR);
......
......@@ -10,7 +10,7 @@ int u14_34f_abort(Scsi_Cmnd *);
int u14_34f_reset(Scsi_Cmnd *, unsigned int);
int u14_34f_biosparam(Disk *, kdev_t, int *);
#define U14_34F_VERSION "2.11.00"
#define U14_34F_VERSION "2.12.00"
#define ULTRASTOR_14_34F { \
NULL, /* Ptr for modules */ \
......
......@@ -662,12 +662,12 @@ static inline void build_sg_list(register struct mscp *mscp, Scsi_Cmnd *SCpnt)
sl = (struct scatterlist *) SCpnt->request_buffer;
max = SCpnt->use_sg;
for (i = 0; i < max; i++) {
mscp->sglist[i].address = (unsigned int)sl[i].address;
mscp->sglist[i].address = virt_to_bus(sl[i].address);
mscp->sglist[i].num_bytes = sl[i].length;
transfer_length += sl[i].length;
}
mscp->number_of_sg_list = max;
mscp->transfer_data = (unsigned int)mscp->sglist;
mscp->transfer_data = virt_to_bus(mscp->sglist);
/* ??? May not be necessary. Docs are unclear as to whether transfer
length field is ignored or whether it should be set to the total
number of bytes of the transfer. */
......@@ -723,7 +723,7 @@ int ultrastor_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
} else {
/* Unset scatter/gather flag in SCSI command packet */
my_mscp->sg = FALSE;
my_mscp->transfer_data = (unsigned int)SCpnt->request_buffer;
my_mscp->transfer_data = virt_to_bus(SCpnt->request_buffer);
my_mscp->transfer_data_length = SCpnt->request_bufflen;
}
my_mscp->command_link = 0; /*???*/
......@@ -733,7 +733,7 @@ int ultrastor_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
memcpy(my_mscp->scsi_cdbs, SCpnt->cmnd, my_mscp->length_of_scsi_cdbs);
my_mscp->adapter_status = 0;
my_mscp->target_status = 0;
my_mscp->sense_data = (unsigned int)&SCpnt->sense_buffer;
my_mscp->sense_data = virt_to_bus(&SCpnt->sense_buffer);
my_mscp->done = done;
my_mscp->SCint = SCpnt;
SCpnt->host_scribble = (unsigned char *)my_mscp;
......@@ -791,7 +791,7 @@ int ultrastor_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
}
/* Store pointer in OGM address bytes */
outl((unsigned int)my_mscp, config.ogm_address);
outl(virt_to_bus(my_mscp), config.ogm_address);
/* Issue OGM interrupt */
if (config.slot) {
......@@ -867,9 +867,9 @@ int ultrastor_abort(Scsi_Cmnd *SCpnt)
out[28 + i * 3] = '\n';
out[29 + i * 3] = 0;
ogm_status = inb(port0 + 22);
ogm_addr = inl(port0 + 23);
ogm_addr = (unsigned int)bus_to_virt(inl(port0 + 23));
icm_status = inb(port0 + 27);
icm_addr = inl(port0 + 28);
icm_addr = (unsigned int)bus_to_virt(inl(port0 + 28));
restore_flags(flags);
}
......@@ -905,7 +905,7 @@ int ultrastor_abort(Scsi_Cmnd *SCpnt)
save_flags(flags);
cli();
outl((int)&config.mscp[mscp_index], config.ogm_address);
outl(virt_to_bus(&config.mscp[mscp_index]), config.ogm_address);
inb(0xc80); /* delay */
outb(0x80, config.ogm_address - 1);
outb(0x2, LCL_DOORBELL_INTR(config.doorbell_address));
......@@ -1038,7 +1038,7 @@ static void ultrastor_interrupt(int irq, void *dev_id, struct pt_regs *regs)
#if ULTRASTOR_MAX_CMDS == 1
mscp = &config.mscp[0];
#else
mscp = (struct mscp *)inl(config.icm_address);
mscp = (struct mscp *)bus_to_virt(inl(config.icm_address));
mscp_index = mscp - config.mscp;
if (mscp_index >= ULTRASTOR_MAX_CMDS) {
printk("Ux4F interrupt: bad MSCP address %x\n", (unsigned int) mscp);
......
......@@ -52,8 +52,8 @@ snd_ioctl_return (int *addr, int value)
return 0;
}
static int
sound_read (inode_handle * inode, file_handle * file, char *buf, int count)
static long
sound_read (inode_handle * inode, file_handle * file, char *buf, unsigned long count)
{
int dev;
......@@ -64,8 +64,8 @@ sound_read (inode_handle * inode, file_handle * file, char *buf, int count)
return sound_read_sw (dev, &files[dev], buf, count);
}
static int
sound_write (inode_handle * inode, file_handle * file, const char *buf, int count)
static long
sound_write (inode_handle * inode, file_handle * file, const char *buf, unsigned long count)
{
int dev;
......@@ -76,8 +76,8 @@ sound_write (inode_handle * inode, file_handle * file, const char *buf, int coun
return sound_write_sw (dev, &files[dev], buf, count);
}
static int
sound_lseek (inode_handle * inode, file_handle * file, off_t offset, int orig)
static long long
sound_lseek (inode_handle * inode, file_handle * file, long long offset, int orig)
{
return -(EPERM);
}
......
......@@ -127,7 +127,6 @@ static int posix_lock_file(struct file *filp, struct file_lock *caller,
unsigned int wait);
static int posix_locks_deadlock(struct task_struct *my_task,
struct task_struct *blocked_task);
static int locks_overlap(struct file_lock *fl1, struct file_lock *fl2);
static void posix_remove_locks(struct file_lock **before, struct task_struct *task);
static void flock_remove_locks(struct file_lock **before, struct file *filp);
......@@ -136,6 +135,10 @@ static void locks_insert_lock(struct file_lock **pos, struct file_lock *fl);
static void locks_delete_lock(struct file_lock **thisfl_p, unsigned int wait);
static char *lock_get_status(struct file_lock *fl, char *p, int id, char *pfx);
static void locks_insert_block(struct file_lock *blocker, struct file_lock *waiter);
static void locks_delete_block(struct file_lock *blocker, struct file_lock *waiter);
static void locks_wake_up_blocks(struct file_lock *blocker, unsigned int wait);
static struct file_lock *file_lock_table = NULL;
/* Free lock not inserted in any queue.
......@@ -152,13 +155,21 @@ static inline void locks_free_lock(struct file_lock *fl)
return;
}
/* Check if two locks overlap each other.
*/
static inline int locks_overlap(struct file_lock *fl1, struct file_lock *fl2)
{
return ((fl1->fl_end >= fl2->fl_start) &&
(fl2->fl_end >= fl1->fl_start));
}
/* Insert waiter into blocker's block list.
* We use a circular list so that processes can be easily woken up in
* the order they blocked. The documentation doesn't require this but
* it seems seems like the reasonable thing to do.
*/
static inline void locks_insert_block(struct file_lock *blocker,
struct file_lock *waiter)
static void locks_insert_block(struct file_lock *blocker,
struct file_lock *waiter)
{
struct file_lock *prevblock;
......@@ -180,8 +191,8 @@ static inline void locks_insert_block(struct file_lock *blocker,
/* Remove waiter from blocker's block list.
* When blocker ends up pointing to itself then the list is empty.
*/
static inline void locks_delete_block(struct file_lock *blocker,
struct file_lock *waiter)
static void locks_delete_block(struct file_lock *blocker,
struct file_lock *waiter)
{
struct file_lock *nextblock;
struct file_lock *prevblock;
......@@ -206,8 +217,7 @@ static inline void locks_delete_block(struct file_lock *blocker,
* If told to wait then schedule the processes until the block list
* is empty, otherwise empty the block list ourselves.
*/
static inline void locks_wake_up_blocks(struct file_lock *blocker,
unsigned int wait)
static void locks_wake_up_blocks(struct file_lock *blocker, unsigned int wait)
{
struct file_lock *waiter;
......@@ -305,8 +315,7 @@ int fcntl_setlk(unsigned int fd, unsigned int cmd, struct flock *l)
struct flock flock;
struct inode *inode;
/*
* Get arguments and validate them ...
/* Get arguments and validate them ...
*/
if ((fd >= NR_OPEN) || !(filp = current->files->fd[fd]))
......@@ -493,21 +502,14 @@ int locks_mandatory_area(int read_write, struct inode *inode,
if ((fl = inode->i_flock) == NULL || (fl->fl_flags & FL_FLOCK))
return (0);
/*
* Search the lock list for this inode for locks that conflict with
/* Search the lock list for this inode for locks that conflict with
* the proposed read/write.
*/
while (fl != NULL) {
if (fl->fl_owner == current ||
fl->fl_end < offset || fl->fl_start >= offset + count)
goto next_lock;
/*
* Block for writes against a "read" lock,
/* Block for writes against a "read" lock,
* and both reads and writes against a "write" lock.
*/
if ((read_write == FLOCK_VERIFY_WRITE) ||
(fl->fl_type == F_WRLCK)) {
if (posix_locks_conflict(fl, &tfl)) {
if (filp && (filp->f_flags & O_NONBLOCK))
return (-EAGAIN);
if (current->signal & ~current->blocked)
......@@ -521,15 +523,13 @@ int locks_mandatory_area(int read_write, struct inode *inode,
if (current->signal & ~current->blocked)
return (-ERESTARTSYS);
/*
* If we've been sleeping someone might have
/* If we've been sleeping someone might have
* changed the permissions behind our back.
*/
if ((inode->i_mode & (S_ISGID | S_IXGRP)) != S_ISGID)
break;
goto repeat;
}
next_lock:
fl = fl->fl_next;
}
#endif
......@@ -675,14 +675,6 @@ static int locks_conflict(struct file_lock *caller_fl, struct file_lock *sys_fl)
return (0); /* This should never happen */
}
/* Check if two locks overlap each other.
*/
static int locks_overlap(struct file_lock *fl1, struct file_lock *fl2)
{
return ((fl1->fl_end >= fl2->fl_start) &&
(fl2->fl_end >= fl1->fl_start));
}
/* This function tests for deadlock condition before putting a process to
* sleep. The detection scheme is no longer recursive. Recursive was neat,
* but dangerous - we risked stack corruption if the lock data was bad, or
......@@ -777,11 +769,8 @@ static int flock_lock_file(struct file *filp, struct file_lock *caller,
interruptible_sleep_on(&new_fl->fl_wait);
locks_delete_block(fl, new_fl);
if (current->signal & ~current->blocked) {
/* If we are here, than we were awakened
* by a signal, so new_fl is still in the
* block queue of fl. We need to remove
* new_fl and then free it.
* Dmitry Gorodchanin 09/02/96.
/* Awakened by a signal. Free the new
* lock and return an error.
*/
locks_free_lock(new_fl);
return (-ERESTARTSYS);
......@@ -795,8 +784,8 @@ static int flock_lock_file(struct file *filp, struct file_lock *caller,
}
/* Add a POSIX style lock to a file.
* We merge adjacent locks whenever possible. POSIX locks come after FLOCK
* locks in the list and are sorted by owner task, then by starting address
* We merge adjacent locks whenever possible. POSIX locks are sorted by owner
* task, then by starting address
*
* Kai Petzke writes:
* To make freeing a lock much faster, we keep a pointer to the lock before the
......@@ -839,18 +828,17 @@ static int posix_lock_file(struct file *filp, struct file_lock *caller,
fl = fl->fl_next;
}
}
/*
* Find the first old lock with the same owner as the new lock.
/* Find the first old lock with the same owner as the new lock.
*/
before = &filp->f_inode->i_flock;
/* First skip FLOCK locks and locks owned by other processes.
/* First skip locks owned by other processes.
*/
while ((fl = *before) && (caller->fl_owner != fl->fl_owner)) {
before = &fl->fl_next;
}
/* Process locks with this owner.
*/
......
......@@ -24,8 +24,8 @@ struct ncp_dirent {
unsigned long f_pos;
};
static int
ncp_dir_read(struct inode *inode, struct file *filp, char *buf, int count);
static long
ncp_dir_read(struct inode *inode, struct file *filp, char *buf, unsigned long count);
static int
ncp_readdir(struct inode *inode, struct file *filp,
......@@ -192,8 +192,8 @@ ncp_find_inode(struct inode *inode)
return NULL;
}
static int
ncp_dir_read(struct inode *inode, struct file *filp, char *buf, int count)
static long
ncp_dir_read(struct inode *inode, struct file *filp, char *buf, unsigned long count)
{
return -EISDIR;
}
......
......@@ -80,8 +80,8 @@ ncp_make_open(struct inode *i, int right)
return -EACCES;
}
static int
ncp_file_read(struct inode *inode, struct file *file, char *buf, int count)
static long
ncp_file_read(struct inode *inode, struct file *file, char *buf, unsigned long count)
{
int bufsize, already_read;
off_t pos;
......@@ -164,9 +164,9 @@ ncp_file_read(struct inode *inode, struct file *file, char *buf, int count)
return already_read;
}
static int
static long
ncp_file_write(struct inode *inode, struct file *file, const char *buf,
int count)
unsigned long count)
{
int bufsize, already_written;
off_t pos;
......
......@@ -16,84 +16,95 @@
#include <asm/segment.h>
asmlinkage long sys_lseek(unsigned int fd, off_t offset, unsigned int origin)
static long long default_llseek(struct inode *inode,
struct file *file,
long long offset,
int origin)
{
struct file * file;
long tmp = -1;
long long retval;
if (fd >= NR_OPEN || !(file=current->files->fd[fd]) || !(file->f_inode))
return -EBADF;
if (origin > 2)
return -EINVAL;
if (file->f_op && file->f_op->llseek)
return file->f_op->llseek(file->f_inode,file,offset,origin);
/* this is the default handler if no lseek handler is present */
switch (origin) {
case 0:
tmp = offset;
break;
case 1:
tmp = file->f_pos + offset;
break;
case 2:
if (!file->f_inode)
return -EINVAL;
tmp = file->f_inode->i_size + offset;
offset += inode->i_size;
break;
case 1:
offset += file->f_pos;
}
if (tmp < 0)
return -EINVAL;
if (tmp != file->f_pos) {
file->f_pos = tmp;
file->f_reada = 0;
file->f_version = ++event;
retval = -EINVAL;
if (offset >= 0) {
if (offset != file->f_pos) {
file->f_pos = offset;
file->f_reada = 0;
file->f_version = ++event;
}
retval = offset;
}
return file->f_pos;
return retval;
}
static inline long long llseek(struct inode * inode, struct file *file,
long long offset, unsigned int origin)
{
long long (*fn)(struct inode *, struct file *, long long, int);
fn = default_llseek;
if (file->f_op && file->f_op->llseek)
fn = file->f_op->llseek;
return fn(inode, file, offset, origin);
}
asmlinkage long sys_lseek(unsigned int fd, off_t offset, unsigned int origin)
{
long retval;
struct file * file;
struct inode * inode;
retval = -EBADF;
if (fd >= NR_OPEN ||
!(file = current->files->fd[fd]) ||
!(inode = file->f_inode))
goto bad;
retval = -EINVAL;
if (origin > 2)
goto bad;
retval = llseek(inode, file, offset, origin);
bad:
return retval;
}
asmlinkage int sys_llseek(unsigned int fd, unsigned long offset_high,
unsigned long offset_low, loff_t * result,
unsigned int origin)
{
long retval;
struct file * file;
loff_t tmp = -1;
loff_t offset;
int err;
struct inode * inode;
long long offset;
if (fd >= NR_OPEN || !(file=current->files->fd[fd]) || !(file->f_inode))
return -EBADF;
retval = -EBADF;
if (fd >= NR_OPEN ||
!(file = current->files->fd[fd]) ||
!(inode = file->f_inode))
goto bad;
retval = -EINVAL;
if (origin > 2)
return -EINVAL;
if ((err = verify_area(VERIFY_WRITE, result, sizeof(loff_t))))
return err;
offset = (loff_t) (((unsigned long long) offset_high << 32) | offset_low);
goto bad;
if (file->f_op && file->f_op->llseek)
return file->f_op->llseek(file->f_inode,file,offset,origin);
retval = verify_area(VERIFY_WRITE, result, sizeof(offset));
if (retval)
goto bad;
switch (origin) {
case 0:
tmp = offset;
break;
case 1:
tmp = file->f_pos + offset;
break;
case 2:
if (!file->f_inode)
return -EINVAL;
tmp = file->f_inode->i_size + offset;
break;
}
if (tmp < 0)
return -EINVAL;
if (tmp != file->f_pos) {
file->f_pos = tmp;
file->f_reada = 0;
file->f_version = ++event;
offset = llseek(inode, file,
(((unsigned long long) offset_high << 32) | offset_low),
origin);
retval = offset;
if (offset >= 0) {
put_user(offset, result);
retval = 0;
}
memcpy_tofs(result, &file->f_pos, sizeof(loff_t));
return 0;
bad:
return retval;
}
asmlinkage long sys_read(unsigned int fd, char * buf, unsigned long count)
......
......@@ -20,9 +20,9 @@
* For backward compatibility? Maybe this should be moved
* into arch/i386 instead?
*/
static void cp_old_stat(struct inode * inode, struct old_stat * statbuf)
static void cp_old_stat(struct inode * inode, struct __old_kernel_stat * statbuf)
{
struct old_stat tmp;
struct __old_kernel_stat tmp;
printk("VFS: Warning: %s using old stat() call. Recompile your binary.\n",
current->comm);
......@@ -44,9 +44,9 @@ static void cp_old_stat(struct inode * inode, struct old_stat * statbuf)
#endif
static void cp_new_stat(struct inode * inode, struct new_stat * statbuf)
static void cp_new_stat(struct inode * inode, struct stat * statbuf)
{
struct new_stat tmp;
struct stat tmp;
unsigned int blocks, indirect;
memset(&tmp, 0, sizeof(tmp));
......@@ -107,7 +107,7 @@ static void cp_new_stat(struct inode * inode, struct new_stat * statbuf)
* For backward compatibility? Maybe this should be moved
* into arch/i386 instead?
*/
asmlinkage int sys_stat(char * filename, struct old_stat * statbuf)
asmlinkage int sys_stat(char * filename, struct __old_kernel_stat * statbuf)
{
struct inode * inode;
int error;
......@@ -124,7 +124,7 @@ asmlinkage int sys_stat(char * filename, struct old_stat * statbuf)
}
#endif
asmlinkage int sys_newstat(char * filename, struct new_stat * statbuf)
asmlinkage int sys_newstat(char * filename, struct stat * statbuf)
{
struct inode * inode;
int error;
......@@ -146,7 +146,7 @@ asmlinkage int sys_newstat(char * filename, struct new_stat * statbuf)
* For backward compatibility? Maybe this should be moved
* into arch/i386 instead?
*/
asmlinkage int sys_lstat(char * filename, struct old_stat * statbuf)
asmlinkage int sys_lstat(char * filename, struct __old_kernel_stat * statbuf)
{
struct inode * inode;
int error;
......@@ -164,7 +164,7 @@ asmlinkage int sys_lstat(char * filename, struct old_stat * statbuf)
#endif
asmlinkage int sys_newlstat(char * filename, struct new_stat * statbuf)
asmlinkage int sys_newlstat(char * filename, struct stat * statbuf)
{
struct inode * inode;
int error;
......@@ -186,7 +186,7 @@ asmlinkage int sys_newlstat(char * filename, struct new_stat * statbuf)
* For backward compatibility? Maybe this should be moved
* into arch/i386 instead?
*/
asmlinkage int sys_fstat(unsigned int fd, struct old_stat * statbuf)
asmlinkage int sys_fstat(unsigned int fd, struct __old_kernel_stat * statbuf)
{
struct file * f;
struct inode * inode;
......@@ -203,7 +203,7 @@ asmlinkage int sys_fstat(unsigned int fd, struct old_stat * statbuf)
#endif
asmlinkage int sys_newfstat(unsigned int fd, struct new_stat * statbuf)
asmlinkage int sys_newfstat(unsigned int fd, struct stat * statbuf)
{
struct file * f;
struct inode * inode;
......
......@@ -6,16 +6,12 @@
* Laboratory for Computer Science Research Computing Facility
* Rutgers, The State University of New Jersey
*
* $Id: ufs_dir.c,v 1.3 1996/04/25 09:12:00 davem Exp $
* $Id: ufs_dir.c,v 1.7 1996/05/21 19:01:45 davem Exp $
*
*/
#include <linux/fs.h>
/* XXX */
extern int ufs_lookup (struct inode *, const char *, int, struct inode **);
extern int ufs_bmap (struct inode *, int);
extern void ufs_print_inode (struct inode *);
#include <linux/ufs_fs.h>
/*
* This is blatantly stolen from ext2fs
......@@ -47,7 +43,6 @@ ufs_readdir (struct inode * inode, struct file * filp, void * dirent,
while (!error && !stored && filp->f_pos < inode->i_size) {
lblk = (filp->f_pos) >> sb->s_blocksize_bits;
blk = ufs_bmap(inode, lblk);
/* XXX - ufs_bmap() call needs error checking */
blk = ufs_bmap(inode, lblk);
bh = bread (sb->s_dev, blk, sb->s_blocksize);
......@@ -74,9 +69,9 @@ ufs_readdir (struct inode * inode, struct file * filp, void * dirent,
* least that it is non-zero. A
* failure will be detected in the
* dirent test below. */
if (de->d_reclen < 1)
if (ufs_swab16(de->d_reclen) < 1)
break;
i += de->d_reclen;
i += ufs_swab16(de->d_reclen);
}
offset = i;
filp->f_pos = (filp->f_pos & ~(sb->s_blocksize - 1))
......@@ -88,7 +83,8 @@ ufs_readdir (struct inode * inode, struct file * filp, void * dirent,
&& offset < sb->s_blocksize) {
de = (struct ufs_direct *) (bh->b_data + offset);
/* XXX - put in a real ufs_check_dir_entry() */
if ((de->d_reclen == 0) || (de->d_namlen == 0)) {
if ((ufs_swab16(de->d_reclen) == 0)
|| (ufs_swab16(de->d_namlen) == 0)) {
filp->f_pos = (filp->f_pos & (sb->s_blocksize - 1)) + sb->s_blocksize;
brelse(bh);
return stored;
......@@ -104,8 +100,8 @@ ufs_readdir (struct inode * inode, struct file * filp, void * dirent,
return stored;
}
#endif /* XXX */
offset += de->d_reclen;
if (de->d_ino) {
offset += ufs_swab16(de->d_reclen);
if (ufs_swab32(de->d_ino)) {
/* We might block in the next section
* if the data destination is
* currently swapped out. So, use a
......@@ -113,21 +109,22 @@ ufs_readdir (struct inode * inode, struct file * filp, void * dirent,
* not the directory has been modified
* during the copy operation. */
unsigned long version;
dcache_add(inode, de->d_name, de->d_namlen,
de->d_ino);
dcache_add(inode, de->d_name,
ufs_swab16(de->d_namlen),
ufs_swab32(de->d_ino));
version = inode->i_version;
if (inode->i_sb->u.ufs_sb.s_flags & UFS_DEBUG) {
printk("ufs_readdir: filldir(%s,%u)\n",
de->d_name, de->d_ino);
de->d_name, ufs_swab32(de->d_ino));
}
error = filldir(dirent, de->d_name, de->d_namlen, filp->f_pos, de->d_ino);
error = filldir(dirent, de->d_name, ufs_swab16(de->d_namlen), filp->f_pos, ufs_swab32(de->d_ino));
if (error)
break;
if (version != inode->i_version)
goto revalidate;
stored ++;
}
filp->f_pos += de->d_reclen;
filp->f_pos += ufs_swab16(de->d_reclen);
}
offset = 0;
brelse (bh);
......
......@@ -6,93 +6,12 @@
* Laboratory for Computer Science Research Computing Facility
* Rutgers, The State University of New Jersey
*
* $Id: ufs_file.c,v 1.3 1996/04/25 09:12:02 davem Exp $
* $Id: ufs_file.c,v 1.6 1996/05/19 03:55:48 krioles Exp $
*
*/
#include <linux/fs.h>
/*
* Return values:
* 0: bmap failed
* nonzero: absolute "block" number
*/
int ufs_bmap (struct inode * inode, int block)
{
unsigned long int fsblkno, phys_block, lfsblkno;
struct buffer_head * bh;
/*
* Note that contrary to what the BSD source calls these things,
* blkno and lblkno are *frags* (1024), not UFS blocks (8192).
* XXX - maybe I'm wrong, and ui_blocks is really 512-blocks...
*/
/*
* Ok, I think I figured out what is going on. ui_blocks is the
* number of 512-byte blocks that are allocated to the file. The
* elements in ui_db[UFS_NDADDR] are pointers to 1024-byte aligned
* 8192 byte objects. The entire 8192 bytes (16 512-blocks) may
* not be allocated to the file in question - use ui_blocks to see
* how many of the blocks are allocated. Also, use ui_size to see
* what fraction of the last block is allocated to the file, and
* what fraction is unused. I have not yet seen a file with a
* hole in it, but I'd guess that a hole must be at least 8192
* bytes of zeros, and it's represented by a zero in ui_db[X].
*
* Yes, this means that there is more than one way to name a given
* 512-byte block on the disk. Because of the 1024-byte alignment
* of 8192-byte filesystem blocks, a given 512-byte disk block
* could be referred to in eight different ways.
*/
/*
* block is the logical 1024-block in the file
* lfsblkno is the logical 8192-block in the file
* fsblkno is the physical 8192-block
* phys_block is the 1024-block
*/
lfsblkno = block>>3;
if (block < UFS_NDADDR) {
/* It's a direct block */
fsblkno = inode->u.ufs_i.ui_db[lfsblkno]; /* XXX */
#if 0
phys_block = ufs_cgdmin(inode->i_sb, ufs_ino2cg(inode)) +
blkno%(inode->i_sb->u.ufs_sb.s_fpg);
#endif
phys_block = fsblkno + ((block & 0x7)<<10); /* XXX */
if (inode->i_sb->u.ufs_sb.s_flags & UFS_DEBUG) {
printk("ufs_bmap: mapped ino %lu logical %u to %lu (phys %lu)\n",
inode->i_ino, block, fsblkno, phys_block);
}
return(phys_block);
} else {
/* Need to use indirect blocks */
/* XXX - bmap through indirect blocks not implemented */
block -= UFS_NDADDR;
if (block < (inode->i_sb->s_blocksize/sizeof(__u32))) {
bh = bread(inode->i_dev, inode->u.ufs_i.ui_ib[0],
BLOCK_SIZE);
if (bh == NULL) {
printk("ufs_bmap: can't map block %u, ino %lu\n",
block + UFS_NDADDR, inode->i_ino);
return(0);
}
phys_block = ((__u32 *)bh->b_data)[block];
brelse(bh);
printk("ufs_bmap: imap ino %lu block %u phys %lu\n",
inode->i_ino, block + UFS_NDADDR, phys_block);
return(phys_block);
} else {
printk("ufs_bmap: ino %lu: indirect blocks not implemented\n",
inode->i_ino);
return(0);
}
}
return(0);
}
#include <linux/ufs_fs.h>
static struct file_operations ufs_file_operations = {
NULL, /* lseek */
......@@ -131,13 +50,3 @@ struct inode_operations ufs_file_inode_operations = {
NULL, /* smap */
};
/*
* Local Variables: ***
* c-indent-level: 8 ***
* c-continued-statement-offset: 8 ***
* c-brace-offset: -8 ***
* c-argdecl-indent: 0 ***
* c-label-offset: -8 ***
* End: ***
*/
This diff is collapsed.
......@@ -6,13 +6,14 @@
* Laboratory for Computer Science Research Computing Facility
* Rutgers, The State University of New Jersey
*
* $Id: ufs_namei.c,v 1.3 1996/04/25 09:12:07 davem Exp $
* $Id: ufs_namei.c,v 1.7 1996/06/01 14:56:49 ecd Exp $
*
*/
#include <linux/fs.h>
#include <linux/ufs_fs.h>
extern unsigned int ufs_bmap(struct inode * inode, int block); /* XXX */
#include <linux/string.h>
/*
* NOTE! unlike strncmp, ext2_match returns 1 for success, 0 for failure.
......@@ -20,15 +21,15 @@ extern unsigned int ufs_bmap(struct inode * inode, int block); /* XXX */
*/
static int ufs_match (int len, const char * const name, struct ufs_direct * d)
{
if (!d || len > UFS_MAXNAMLEN)
if (!d || len > UFS_MAXNAMLEN) /* XXX - name space */
return 0;
/*
* "" means "." ---> so paths like "/usr/lib//libc.a" work
*/
if (!len && (d->d_namlen == 1) && (d->d_name[0] == '.') &&
if (!len && (ufs_swab16(d->d_namlen) == 1) && (d->d_name[0] == '.') &&
(d->d_name[1] == '\0'))
return 1;
if (len != d->d_namlen)
if (len != ufs_swab16(d->d_namlen))
return 0;
return !memcmp(name, d->d_name, len);
}
......@@ -41,6 +42,9 @@ int ufs_lookup (struct inode * dir, const char * name, int len,
struct buffer_head * bh;
struct ufs_direct * d;
if (dir->i_sb->u.ufs_sb.s_flags & UFS_DEBUG)
printk("Passed name: %s\nPassed length: %d\n", name, len);
/*
* Touching /xyzzy in a filesystem toggles debugging messages.
*/
......@@ -50,6 +54,7 @@ int ufs_lookup (struct inode * dir, const char * name, int len,
printk("UFS debugging %s\n",
(dir->i_sb->u.ufs_sb.s_flags & UFS_DEBUG) ?
"on": "off");
iput(dir);
return(-ENOENT);
}
......@@ -62,6 +67,7 @@ int ufs_lookup (struct inode * dir, const char * name, int len,
printk("UFS inode debugging %s\n",
(dir->i_sb->u.ufs_sb.s_flags & UFS_DEBUG_INODE) ?
"on": "off");
iput(dir);
return(-ENOENT);
}
......@@ -71,6 +77,7 @@ int ufs_lookup (struct inode * dir, const char * name, int len,
printk("UFS namei debugging %s\n",
(dir->i_sb->u.ufs_sb.s_flags & UFS_DEBUG_NAMEI) ?
"on": "off");
iput(dir);
return(-ENOENT);
}
......@@ -80,6 +87,7 @@ int ufs_lookup (struct inode * dir, const char * name, int len,
printk("UFS symlink debugging %s\n",
(dir->i_sb->u.ufs_sb.s_flags & UFS_DEBUG_LINKS) ?
"on": "off");
iput(dir);
return(-ENOENT);
}
......@@ -99,19 +107,21 @@ int ufs_lookup (struct inode * dir, const char * name, int len,
}
if (fragno == 0) {
/* XXX - bug bug bug */
iput(dir);
return(-ENOENT);
}
bh = bread(dir->i_dev, fragno, dir->i_sb->s_blocksize);
if (bh == NULL) {
printk("ufs_lookup: bread failed: ino %lu, lfragno %lu",
dir->i_ino, lfragno);
iput(dir);
return(-EIO);
}
d = (struct ufs_direct *)(bh->b_data);
while (((char *)d - bh->b_data + d->d_reclen) <=
while (((char *)d - bh->b_data + ufs_swab16(d->d_reclen)) <=
dir->i_sb->s_blocksize) {
/* XXX - skip block if d_reclen or d_namlen is 0 */
if ((d->d_reclen == 0) || (d->d_namlen == 0)) {
if ((ufs_swab16(d->d_reclen) == 0) || (ufs_swab16(d->d_namlen) == 0)) {
if (dir->i_sb->u.ufs_sb.s_flags & UFS_DEBUG) {
printk("ufs_lookup: skipped space in directory, ino %lu\n",
dir->i_ino);
......@@ -120,35 +130,28 @@ int ufs_lookup (struct inode * dir, const char * name, int len,
}
if (dir->i_sb->u.ufs_sb.s_flags & UFS_DEBUG) {
printk("lfragno 0x%lx direct d 0x%x d_ino %u d_reclen %u d_namlen %u d_name `%s'\n",
lfragno, (unsigned int)d, d->d_ino, d->d_reclen, d->d_namlen, d->d_name);
lfragno, (unsigned int)d, ufs_swab32(d->d_ino), ufs_swab16(d->d_reclen), ufs_swab16(d->d_namlen), d->d_name);
}
if ((d->d_namlen == len) &&
if ((ufs_swab16(d->d_namlen) == len) &&
/* XXX - don't use strncmp() - see ext2fs */
(ufs_match(len, name, d))) {
/* We have a match */
*result = iget(dir->i_sb, d->d_ino);
*result = iget(dir->i_sb, ufs_swab32(d->d_ino));
brelse(bh);
iput(dir);
return(0);
} else {
/* XXX - bounds checking */
if (dir->i_sb->u.ufs_sb.s_flags & UFS_DEBUG) {
printk("ufs_lookup: wanted (%s,%d) got (%s,%d)\n",
name, len, d->d_name, d->d_namlen);
name, len, d->d_name, ufs_swab16(d->d_namlen));
}
}
d = (struct ufs_direct *)((char *)d + d->d_reclen);
d = (struct ufs_direct *)((char *)d + ufs_swab16(d->d_reclen));
}
brelse(bh);
}
iput(dir);
return(-ENOENT);
}
/*
* Local Variables: ***
* c-indent-level: 8 ***
* c-continued-statement-offset: 8 ***
* c-brace-offset: -8 ***
* c-argdecl-indent: 0 ***
* c-label-offset: -8 ***
* End: ***
*/
......@@ -6,7 +6,7 @@
* Laboratory for Computer Science Research Computing Facility
* Rutgers, The State University of New Jersey
*
* $Id: ufs_super.c,v 1.3 1996/04/25 09:12:09 davem Exp $
* $Id: ufs_super.c,v 1.17 1996/09/03 07:15:53 ecd Exp $
*
*/
......@@ -23,18 +23,16 @@
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/ufs_fs.h>
#include <linux/module.h>
#include <linux/locks.h>
#include <asm/segment.h>
int ufs_need_swab = 0;
struct super_block * ufs_read_super(struct super_block * sb, void * data, int silent);
void ufs_put_super (struct super_block * sb);
void ufs_statfs(struct super_block * sb, struct statfs * buf, int bufsize);
extern void ufs_read_inode(struct inode * inode);
extern void ufs_put_inode(struct inode * inode);
static struct super_operations ufs_super_ops = {
ufs_read_inode,
NULL, /* notify_change() */
......@@ -72,6 +70,20 @@ void cleanup_module(void)
}
#endif
static char error_buf[1024];
void ufs_warning (struct super_block * sb, const char * function,
const char * fmt, ...)
{
va_list args;
va_start (args, fmt);
vsprintf (error_buf, fmt, args);
va_end (args);
printk (KERN_WARNING "UFS warning (device %s): %s: %s\n",
kdevname(sb->s_dev), function, error_buf);
}
#if 0 /* unused */
static void
ufs_print_super_stuff(struct super_block * sb, struct ufs_superblock * usb)
......@@ -116,26 +128,21 @@ ufs_read_super(struct super_block * sb, void * data, int silent)
if (!(bh1 = bread(sb->s_dev, UFS_SBLOCK/BLOCK_SIZE, BLOCK_SIZE)) ||
!(bh2 = bread(sb->s_dev, (UFS_SBLOCK + BLOCK_SIZE)/BLOCK_SIZE,
BLOCK_SIZE))) {
sb->s_dev = 0;
unlock_super (sb);
if (bh1) {
brelse(bh1);
}
printk ("ufs_read_super: unable to read superblock\n");
MOD_DEC_USE_COUNT;
return(NULL);
goto ufs_read_super_lose;
}
/* XXX - redo this so we can free it later... */
usb = (struct ufs_superblock *)__get_free_page(GFP_KERNEL);
if (usb == NULL) {
sb->s_dev=0;
unlock_super(sb);
brelse(bh1);
brelse(bh2);
printk ("ufs_read_super: get_free_page() failed\n");
MOD_DEC_USE_COUNT;
return (NULL);
goto ufs_read_super_lose;
}
memcpy((char *)usb, bh1->b_data, BLOCK_SIZE);
......@@ -145,54 +152,51 @@ ufs_read_super(struct super_block * sb, void * data, int silent)
brelse(bh1);
brelse(bh2);
if (usb->fs_magic != UFS_MAGIC) {
/* XXX - replace hard-coded constant with a byte-swap macro */
if (usb->fs_magic == 0x54190100) {
printk ("ufs_read_super: can't grok byteswapped fs on dev %d/%d\n",
MAJOR(sb->s_dev), MINOR(sb->s_dev));
silent = 1;
}
sb->s_dev = 0;
unlock_super (sb);
if (!silent)
printk ("ufs_read_super: bad magic number 0x%8.8x on dev %d/%d\n",
usb->fs_magic, MAJOR(sb->s_dev),
MINOR(sb->s_dev));
MOD_DEC_USE_COUNT;
return(NULL);
ufs_need_swab = 0;
sb->s_magic = ufs_swab32(usb->fs_magic);
if (sb->s_magic != UFS_MAGIC) {
ufs_need_swab = 1;
sb->s_magic = ufs_swab32(usb->fs_magic);
if (sb->s_magic != UFS_MAGIC) {
printk ("ufs_read_super: bad magic number 0x%8.8x "
"on dev %d/%d\n", sb->s_magic,
MAJOR(sb->s_dev), MINOR(sb->s_dev));
goto ufs_read_super_lose;
}
}
/* We found a UFS filesystem on this device. */
/* XXX - parse args */
if (usb->fs_bsize != UFS_BSIZE) {
printk("ufs_read_super: fs_bsize %d != %d\n", usb->fs_bsize,
if (ufs_swab32(usb->fs_bsize) != UFS_BSIZE) {
printk("ufs_read_super: fs_bsize %d != %d\n", ufs_swab32(usb->fs_bsize),
UFS_BSIZE);
goto ufs_read_super_lose;
}
if (usb->fs_fsize != UFS_FSIZE) {
printk("ufs_read_super: fs_fsize %d != %d\n", usb->fs_fsize,
if (ufs_swab32(usb->fs_fsize) != UFS_FSIZE) {
printk("ufs_read_super: fs_fsize %d != %d\n", ufs_swab32(usb->fs_fsize),
UFS_FSIZE);
goto ufs_read_super_lose;
}
if (usb->fs_nindir != UFS_NINDIR) {
printk("ufs_read_super: fs_nindir %d != %d\n", usb->fs_nindir,
UFS_NINDIR);
printk("ufs_read_super: fucking Sun blows me\n");
}
#ifdef DEBUG_UFS_SUPER
printk("ufs_read_super: fs last mounted on \"%s\"\n", usb->fs_fsmnt);
#endif
if (usb->fs_state == UFS_FSOK - usb->fs_time) {
if (ufs_swab32(usb->fs_state) == UFS_FSOK - ufs_swab32(usb->fs_time)) {
switch(usb->fs_clean) {
case UFS_FSCLEAN:
#ifdef DEBUG_UFS_SUPER
printk("ufs_read_super: fs is clean\n");
#endif
break;
case UFS_FSSTABLE:
#ifdef DEBUG_UFS_SUPER
printk("ufs_read_super: fs is stable\n");
#endif
break;
case UFS_FSACTIVE:
printk("ufs_read_super: fs is active\n");
......@@ -216,31 +220,41 @@ ufs_read_super(struct super_block * sb, void * data, int silent)
/* XXX - sanity check sb fields */
sb->s_blocksize = usb->fs_fsize;
sb->s_blocksize_bits = 10; /* XXX */
/* KRR - Why are we not using fs_bsize for blocksize? */
sb->s_blocksize = ufs_swab32(usb->fs_fsize);
sb->s_blocksize_bits = ufs_swab32(usb->fs_fshift);
/* XXX - sb->s_lock */
sb->s_op = &ufs_super_ops;
sb->dq_op = 0; /* XXX */
sb->s_magic = usb->fs_magic;
/* KRR - defined above - sb->s_magic = usb->fs_magic; */
/* sb->s_time */
/* sb->s_wait */
/* XXX - sb->u.ufs_sb */
sb->u.ufs_sb.s_raw_sb = usb; /* XXX - maybe move this to the top */
sb->u.ufs_sb.s_flags = 0;
sb->u.ufs_sb.s_ncg = usb->fs_ncg;
sb->u.ufs_sb.s_ipg = usb->fs_ipg;
sb->u.ufs_sb.s_fpg = usb->fs_fpg;
sb->u.ufs_sb.s_fsize = usb->fs_fsize;
sb->u.ufs_sb.s_bsize = usb->fs_bsize;
sb->u.ufs_sb.s_iblkno = usb->fs_iblkno;
sb->u.ufs_sb.s_dblkno = usb->fs_dblkno;
sb->u.ufs_sb.s_cgoffset = usb->fs_cgoffset;
sb->u.ufs_sb.s_cgmask = usb->fs_cgmask;
sb->u.ufs_sb.s_inopb = usb->fs_inopb;
sb->u.ufs_sb.s_fsfrag = usb->fs_frag; /* XXX - rename this later */
sb->u.ufs_sb.s_ncg = ufs_swab32(usb->fs_ncg);
sb->u.ufs_sb.s_ipg = ufs_swab32(usb->fs_ipg);
sb->u.ufs_sb.s_fpg = ufs_swab32(usb->fs_fpg);
sb->u.ufs_sb.s_fsize = ufs_swab32(usb->fs_fsize);
sb->u.ufs_sb.s_fmask = ufs_swab32(usb->fs_fmask);
sb->u.ufs_sb.s_fshift = ufs_swab32(usb->fs_fshift);
sb->u.ufs_sb.s_bsize = ufs_swab32(usb->fs_bsize);
sb->u.ufs_sb.s_bmask = ufs_swab32(usb->fs_bmask);
sb->u.ufs_sb.s_bshift = ufs_swab32(usb->fs_bshift);
sb->u.ufs_sb.s_iblkno = ufs_swab32(usb->fs_iblkno);
sb->u.ufs_sb.s_dblkno = ufs_swab32(usb->fs_dblkno);
sb->u.ufs_sb.s_cgoffset = ufs_swab32(usb->fs_cgoffset);
sb->u.ufs_sb.s_cgmask = ufs_swab32(usb->fs_cgmask);
sb->u.ufs_sb.s_inopb = ufs_swab32(usb->fs_inopb);
sb->u.ufs_sb.s_lshift = ufs_swab32(usb->fs_bshift) - ufs_swab32(usb->fs_fshift);
sb->u.ufs_sb.s_lmask = ~((ufs_swab32(usb->fs_fmask) - ufs_swab32(usb->fs_bmask))
>> ufs_swab32(usb->fs_fshift));
sb->u.ufs_sb.s_fsfrag = ufs_swab32(usb->fs_frag); /* XXX - rename this later */
sb->s_mounted = iget(sb, UFS_ROOTINO);
#ifdef DEBUG_UFS_SUPER
printk("ufs_read_super: inopb %u\n", sb->u.ufs_sb.s_inopb);
#endif
/*
* XXX - read cg structs?
*/
......@@ -248,16 +262,19 @@ ufs_read_super(struct super_block * sb, void * data, int silent)
unlock_super(sb);
return(sb);
ufs_read_super_lose:
ufs_read_super_lose:
/* XXX - clean up */
sb->s_dev = 0;
unlock_super (sb);
MOD_DEC_USE_COUNT;
return(NULL);
}
void ufs_put_super (struct super_block * sb)
{
printk("ufs_put_super\n"); /* XXX */
if (sb->u.ufs_sb.s_flags & UFS_DEBUG) {
printk("ufs_put_super\n"); /* XXX */
}
lock_super (sb);
/* XXX - sync fs data, set state to ok, and flush buffers */
......@@ -275,31 +292,22 @@ void ufs_statfs(struct super_block * sb, struct statfs * buf, int bufsiz)
{
struct statfs tmp;
printk("ufs_statfs\n"); /* XXX */
if (sb->u.ufs_sb.s_flags & UFS_DEBUG) {
printk("ufs_statfs\n"); /* XXX */
}
tmp.f_type = sb->s_magic;
tmp.f_bsize = PAGE_SIZE;
tmp.f_blocks = sb->u.ufs_sb.s_raw_sb->fs_dsize;
tmp.f_bfree = sb->u.ufs_sb.s_raw_sb->fs_cstotal.cs_nbfree;
tmp.f_bavail = sb->u.ufs_sb.s_raw_sb->fs_cstotal.cs_nbfree; /* XXX */
tmp.f_bsize = sb->s_blocksize;
tmp.f_blocks = ufs_swab32(sb->u.ufs_sb.s_raw_sb->fs_dsize);
tmp.f_bfree = ufs_swab32(sb->u.ufs_sb.s_raw_sb->fs_cstotal.cs_nbfree);
tmp.f_bavail = ufs_swab32(sb->u.ufs_sb.s_raw_sb->fs_cstotal.cs_nbfree);
tmp.f_files = sb->u.ufs_sb.s_ncg * sb->u.ufs_sb.s_ipg;
tmp.f_ffree = sb->u.ufs_sb.s_raw_sb->fs_cstotal.cs_nifree;
tmp.f_fsid.val[0] = sb->u.ufs_sb.s_raw_sb->fs_id[0];
tmp.f_fsid.val[1] = sb->u.ufs_sb.s_raw_sb->fs_id[1];
tmp.f_ffree = ufs_swab32(sb->u.ufs_sb.s_raw_sb->fs_cstotal.cs_nifree);
tmp.f_fsid.val[0] = ufs_swab32(sb->u.ufs_sb.s_raw_sb->fs_id[0]);
tmp.f_fsid.val[1] = ufs_swab32(sb->u.ufs_sb.s_raw_sb->fs_id[1]);
tmp.f_namelen = UFS_MAXNAMLEN;
/* tmp.f_spare[6] */
memcpy_tofs(buf, &tmp, bufsiz);
return;
}
/*
* Local Variables: ***
* c-indent-level: 8 ***
* c-continued-statement-offset: 8 ***
* c-brace-offset: -8 ***
* c-argdecl-indent: 0 ***
* c-label-offset: -8 ***
* End: ***
*/
......@@ -6,17 +6,16 @@
* Laboratory for Computer Science Research Computing Facility
* Rutgers, The State University of New Jersey
*
* $Id: ufs_symlink.c,v 1.3 1996/04/25 09:12:11 davem Exp $
* $Id: ufs_symlink.c,v 1.5 1996/05/19 03:55:56 krioles Exp $
*
*/
#include <linux/fs.h>
#include <linux/ufs_fs.h>
#include <linux/sched.h>
#include <asm/segment.h>
extern int ufs_bmap (struct inode *, int);
static int
ufs_readlink(struct inode * inode, char * buffer, int buflen)
{
......@@ -55,7 +54,7 @@ ufs_readlink(struct inode * inode, char * buffer, int buflen)
link = bh->b_data;
}
else {
link = (char *)&(inode->u.ufs_i.ui_db[0]);
link = (char *)&(inode->u.ufs_i.i_data[0]);
}
i = 0;
while (i < buflen && (c = link[i])) {
......@@ -122,7 +121,7 @@ ufs_follow_link(struct inode * dir, struct inode * inode,
link = bh->b_data;
} else {
/* fast symlink */
link = (char *)&(inode->u.ufs_i.ui_db[0]);
link = (char *)&(inode->u.ufs_i.i_data[0]);
}
current->link_count++;
error = open_namei (link, flag, mode, res_inode, dir);
......@@ -172,12 +171,3 @@ struct inode_operations ufs_symlink_inode_operations = {
NULL, /* smap */
};
/*
* Local Variables: ***
* c-indent-level: 8 ***
* c-continued-statement-offset: 8 ***
* c-brace-offset: -8 ***
* c-argdecl-indent: 0 ***
* c-label-offset: -8 ***
* End: ***
*/
......@@ -23,11 +23,10 @@
/*
Read a file into kernel space memory
*/
int umsdos_file_read_kmem(
struct inode *inode,
long umsdos_file_read_kmem (struct inode *inode,
struct file *filp,
char *buf,
int count)
unsigned long count)
{
int ret;
int old_fs = get_fs();
......@@ -39,11 +38,10 @@ int umsdos_file_read_kmem(
/*
Write to a file from kernel space
*/
int umsdos_file_write_kmem(
struct inode *inode,
long umsdos_file_write_kmem (struct inode *inode,
struct file *filp,
const char *buf,
int count)
unsigned long count)
{
int ret;
int old_fs = get_fs();
......@@ -60,11 +58,10 @@ int umsdos_file_write_kmem(
Return 0 if ok, a negative error code if not.
*/
int umsdos_emd_dir_write (
struct inode *emd_dir,
long umsdos_emd_dir_write (struct inode *emd_dir,
struct file *filp,
char *buf, /* buffer in kernel memory, not in user space */
int count)
unsigned long count)
{
int written;
filp->f_flags = 0;
......@@ -76,18 +73,17 @@ int umsdos_emd_dir_write (
The block of data is NOT in user space.
Return 0 if ok, -EIO if any error.
*/
int umsdos_emd_dir_read (
struct inode *emd_dir,
long umsdos_emd_dir_read (struct inode *emd_dir,
struct file *filp,
char *buf, /* buffer in kernel memory, not in user space */
int count)
unsigned long count)
{
int ret = 0;
long int ret = 0;
int sizeread;
filp->f_flags = 0;
sizeread = umsdos_file_read_kmem (emd_dir,filp,buf,count);
if (sizeread != count){
printk ("UMSDOS: problem with EMD file. Can't read pos = %Ld (%d != %d)\n"
printk ("UMSDOS: problem with EMD file. Can't read pos = %Ld (%d != %ld)\n"
,filp->f_pos,sizeread,count);
ret = -EIO;
}
......
#ifndef _ASMAXP_SIGCONTEXT_H
#define _ASMAXP_SIGCONTEXT_H
struct sigcontext_struct {
struct sigcontext {
/*
* what should we have here? I'd probably better use the same
* stack layout as OSF/1, just in case we ever want to try
......
#ifndef _ALPHA_STAT_H
#define _ALPHA_STAT_H
struct old_stat {
struct __old_kernel_stat {
unsigned int st_dev;
unsigned int st_ino;
unsigned int st_mode;
......@@ -19,7 +19,7 @@ struct old_stat {
unsigned int st_gen;
};
struct new_stat {
struct stat {
unsigned int st_dev;
unsigned int st_ino;
unsigned int st_mode;
......
......@@ -33,15 +33,8 @@
#define put_fs_word(x,addr) put_user((x),(unsigned short *)(addr))
#define put_fs_long(x,addr) put_user((x),(unsigned int *)(addr))
static inline void memcpy_fromfs(void * to, const void * from, unsigned long n)
{
memcpy(to, from, n);
}
static inline void memcpy_tofs(void * to, const void * from, unsigned long n)
{
memcpy(to, from, n);
}
#define memcpy_fromfs(to,from,n) memcpy((to),(from),(n))
#define memcpy_tofs(to,from,n) memcpy((to),(from),(n))
/*
* The fs value determines whether argument validity checking should be
......@@ -53,11 +46,7 @@ static inline void memcpy_tofs(void * to, const void * from, unsigned long n)
#define get_fs() (current->tss.segment)
#define set_fs(x) (current->tss.segment = (x))
static inline unsigned long get_ds(void)
{
return KERNEL_DS;
}
#define get_ds() (KERNEL_DS)
#endif /* __ASSEMBLY__ */
......
......@@ -18,8 +18,8 @@ struct semaphore {
#define MUTEX ((struct semaphore) { 1, 0, NULL })
#define MUTEX_LOCKED ((struct semaphore) { 0, 0, NULL })
asmlinkage void down_failed(void /* special register calling convention */);
asmlinkage void up_wakeup(void /* special register calling convention */);
asmlinkage void __down_failed(void /* special register calling convention */);
asmlinkage void __up_wakeup(void /* special register calling convention */);
extern void __down(struct semaphore * sem);
extern void __up(struct semaphore * sem);
......@@ -32,17 +32,17 @@ extern void __up(struct semaphore * sem);
extern inline void down(struct semaphore * sem)
{
__asm__ __volatile__(
"# atomic down operation\n"
"1:\n\t"
"movl $1b,%%eax\n\t"
"# atomic down operation\n\t"
#ifdef __SMP__
"lock ; "
#endif
"decl %0\n\t"
"js " SYMBOL_NAME_STR(down_failed)
"movl $1f,%%eax\n\t"
"js " SYMBOL_NAME_STR(__down_failed)
"\n1:"
:/* no outputs */
:"m" (sem->count), "c" (sem)
:"ax","dx","memory");
:"ax", "memory");
}
/*
......@@ -55,16 +55,16 @@ extern inline void up(struct semaphore * sem)
{
__asm__ __volatile__(
"# atomic up operation\n\t"
"movl $1f,%%eax\n\t"
#ifdef __SMP__
"lock ; "
#endif
"incl %0\n\t"
"jle " SYMBOL_NAME_STR(up_wakeup)
"movl $1f,%%eax\n\t"
"jle " SYMBOL_NAME_STR(__up_wakeup)
"\n1:"
:/* no outputs */
:"m" (sem->count), "c" (sem)
:"ax", "dx", "memory");
:"ax", "memory");
}
#endif
......@@ -26,7 +26,7 @@ struct _fpstate {
unsigned long status;
};
struct sigcontext_struct {
struct sigcontext {
unsigned short gs, __gsh;
unsigned short fs, __fsh;
unsigned short es, __esh;
......
#ifndef _I386_STAT_H
#define _I386_STAT_H
struct old_stat {
struct __old_kernel_stat {
unsigned short st_dev;
unsigned short st_ino;
unsigned short st_mode;
......@@ -15,7 +15,7 @@ struct old_stat {
unsigned long st_ctime;
};
struct new_stat {
struct stat {
unsigned short st_dev;
unsigned short __pad1;
unsigned long st_ino;
......
......@@ -170,6 +170,17 @@
#define __NR_nanosleep 162
#define __NR_mremap 163
/* user-visible error numbers are in the range -1 - -122: see <asm-i386/errno.h> */
#define __syscall_return(type, res) \
do { \
if ((unsigned long)(res) >= (unsigned long)(-125)) { \
errno = -(res); \
res = -1; \
} \
return (type) (res); \
} while (0)
/* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */
#define _syscall0(type,name) \
type name(void) \
......@@ -178,10 +189,7 @@ long __res; \
__asm__ volatile ("int $0x80" \
: "=a" (__res) \
: "0" (__NR_##name)); \
if (__res >= 0) \
return (type) __res; \
errno = -__res; \
return -1; \
__syscall_return(type,__res); \
}
#define _syscall1(type,name,type1,arg1) \
......@@ -191,10 +199,7 @@ long __res; \
__asm__ volatile ("int $0x80" \
: "=a" (__res) \
: "0" (__NR_##name),"b" ((long)(arg1))); \
if (__res >= 0) \
return (type) __res; \
errno = -__res; \
return -1; \
__syscall_return(type,__res); \
}
#define _syscall2(type,name,type1,arg1,type2,arg2) \
......@@ -204,10 +209,7 @@ long __res; \
__asm__ volatile ("int $0x80" \
: "=a" (__res) \
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2))); \
if (__res >= 0) \
return (type) __res; \
errno = -__res; \
return -1; \
__syscall_return(type,__res); \
}
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
......@@ -218,10 +220,7 @@ __asm__ volatile ("int $0x80" \
: "=a" (__res) \
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
"d" ((long)(arg3))); \
if (__res>=0) \
return (type) __res; \
errno=-__res; \
return -1; \
__syscall_return(type,__res); \
}
#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
......@@ -232,10 +231,7 @@ __asm__ volatile ("int $0x80" \
: "=a" (__res) \
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
"d" ((long)(arg3)),"S" ((long)(arg4))); \
if (__res>=0) \
return (type) __res; \
errno=-__res; \
return -1; \
__syscall_return(type,__res); \
}
#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
......@@ -247,10 +243,7 @@ __asm__ volatile ("int $0x80" \
: "=a" (__res) \
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
"d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5))); \
if (__res>=0) \
return (type) __res; \
errno=-__res; \
return -1; \
__syscall_return(type,__res); \
}
#ifdef __KERNEL_SYSCALLS__
......
......@@ -46,6 +46,10 @@
#define ICMP_HOST_ANO 10
#define ICMP_NET_UNR_TOS 11
#define ICMP_HOST_UNR_TOS 12
#define ICMP_PKT_FILTERED 13 /* Packet filtered */
#define ICMP_PREC_VIOLATION 14 /* Precedence violation */
#define ICMP_PREC_CUTOFF 15 /* Precedence cut off */
#define NR_ICMP_UNREACH 15 /* instead of hardcoding immediate value */
/* Codes for REDIRECT. */
#define ICMP_REDIR_NET 0 /* Redirect Net */
......
......@@ -530,7 +530,8 @@
#define PCI_VENDOR_ID_S3 0x5333
#define PCI_DEVICE_ID_S3_ViRGE 0x5631
#define PCI_DEVICE_ID_S3_811 0x8811
#define PCI_DEVICE_ID_S3_TRIO 0x8811
#define PCI_DEVICE_ID_S3_ViRGE_VX 0x883d
#define PCI_DEVICE_ID_S3_868 0x8880
#define PCI_DEVICE_ID_S3_928 0x88b0
#define PCI_DEVICE_ID_S3_864_1 0x88c0
......
......@@ -6,7 +6,7 @@
* Laboratory for Computer Science Research Computing Facility
* Rutgers, The State University of New Jersey
*
* $Id: ufs_fs.h,v 1.1 1996/04/21 14:45:11 davem Exp $
* $Id: ufs_fs.h,v 1.7 1996/08/13 19:27:59 ecd Exp $
*
*/
......@@ -31,6 +31,10 @@
#define UFS_NDADDR 12
#define UFS_NINDIR 3
#define UFS_IND_BLOCK (UFS_NDADDR + 0)
#define UFS_DIND_BLOCK (UFS_NDADDR + 1)
#define UFS_TIND_BLOCK (UFS_NDADDR + 2)
#define UFS_ROOTINO 2
#define UFS_USEEFT ((__u16)65535)
......@@ -47,6 +51,8 @@
#define UFS_DEBUG_NAMEI 0x00000004
#define UFS_DEBUG_LINKS 0x00000008
#define UFS_ADDR_PER_BLOCK(sb) ((sb)->u.ufs_sb.s_bsize >> 2)
#define UFS_ADDR_PER_BLOCK_BITS(sb) ((sb)->u.ufs_sb.s_bshift - 2)
/* Test if the inode number is valid. */
#define ufs_ino_ok(inode) ((inode->i_ino < 2) && \
......@@ -66,6 +72,10 @@
#define UFS_MAXNAMLEN 255
#define ufs_lbn(sb, block) ((block) >> (sb)->u.ufs_sb.s_lshift)
#define ufs_boff(sb, block) ((block) & ~((sb)->u.ufs_sb.s_lmask))
#define ufs_dbn(sb, block, boff) ((block) + ufs_boff((sb), (boff)))
struct ufs_direct {
__u32 d_ino; /* inode number of this entry */
__u16 d_reclen; /* length of this entry */
......@@ -93,61 +103,78 @@ typedef struct _ufsquad {
struct ufs_superblock {
__u32 fs_link; /* UNUSED */
__u32 fs_rlink; /* UNUSED */
__u32 fs_sblkno;
__u32 fs_cblkno;
__u32 fs_iblkno;
__u32 fs_dblkno;
__u32 fs_cgoffset;
__u32 fs_cgmask;
time_t fs_time; /* XXX - check type */
__u32 fs_size;
__u32 fs_dsize;
__u32 fs_ncg;
__u32 fs_bsize;
__u32 fs_fsize;
__u32 fs_frag;
__u32 fs_minfree;
__u32 fs_rotdelay;
__u32 fs_rps;
__u32 fs_bmask;
__u32 fs_fmask;
__u32 fs_bshift;
__u32 fs_fshift;
__u32 fs_maxcontig;
__u32 fs_maxbpg;
__u32 fs_fragshift;
__u32 fs_fsbtodb;
__u32 fs_sbsize;
__u32 fs_csmask;
__u32 fs_csshift;
__u32 fs_nindir;
__u32 fs_inopb;
__u32 fs_nspf;
__u32 fs_optim;
__u32 fs_XXX1;
__u32 fs_interleave;
__u32 fs_trackskew;
__u32 fs_id[2];
__u32 fs_csaddr;
__u32 fs_cssize;
__u32 fs_cgsize;
__u32 fs_ntrak;
__u32 fs_nsect;
__u32 fs_spc;
__u32 fs_ncyl;
__u32 fs_cpg;
__u32 fs_ipg;
__u32 fs_fpg;
struct ufs_csum fs_cstotal;
__u8 fs_fmod;
__u8 fs_clean;
__u8 fs_ronly;
__u8 fs_flags;
__u8 fs_fsmnt[MAXMNTLEN];
__u32 fs_cgrotor;
struct ufs_csum * fs_csp[MAXCSBUFS];
__u32 fs_cpc;
__u16 fs_opostbl[16][8]; /* old rotation block list head */
__u32 fs_sblkno; /* addr of super-block in filesys */
__u32 fs_cblkno; /* offset of cyl-block in filesys */
__u32 fs_iblkno; /* offset of inode-blocks in filesys */
__u32 fs_dblkno; /* offset of first data after cg */
__u32 fs_cgoffset; /* cylinder group offset in cylinder */
__u32 fs_cgmask; /* used to calc mod fs_ntrak */
time_t fs_time; /* last time written */
__u32 fs_size; /* number of blocks in fs */
__u32 fs_dsize; /* number of data blocks in fs */
__u32 fs_ncg; /* number of cylinder groups */
__u32 fs_bsize; /* size of basic blocks in fs */
__u32 fs_fsize; /* size of frag blocks in fs */
__u32 fs_frag; /* number of frags in a block in fs */
/* these are configuration parameters */
__u32 fs_minfree; /* minimum percentage of free blocks */
__u32 fs_rotdelay; /* num of ms for optimal next block */
__u32 fs_rps; /* disk revolutions per second */
/* these fields can be computed from the others */
__u32 fs_bmask; /* ``blkoff'' calc of blk offsets */
__u32 fs_fmask; /* ``fragoff'' calc of frag offsets */
__u32 fs_bshift; /* ``lblkno'' calc of logical blkno */
__u32 fs_fshift; /* ``numfrags'' calc number of frags */
/* these are configuration parameters */
__u32 fs_maxcontig; /* max number of contiguous blks */
__u32 fs_maxbpg; /* max number of blks per cyl group */
/* these fields can be computed from the others */
__u32 fs_fragshift; /* block to frag shift */
__u32 fs_fsbtodb; /* fsbtodb and dbtofsb shift constant */
__u32 fs_sbsize; /* actual size of super block */
__u32 fs_csmask; /* csum block offset */
__u32 fs_csshift; /* csum block number */
__u32 fs_nindir; /* value of NINDIR */
__u32 fs_inopb; /* value of INOPB */
__u32 fs_nspf; /* value of NSPF */
/* yet another configuration parameter */
__u32 fs_optim; /* optimization preference, see below */
/* these fields are derived from the hardware */
__u32 fs_npsect; /* # sectors/track including spares */
__u32 fs_interleave; /* hardware sector interleave */
__u32 fs_trackskew; /* sector 0 skew, per track */
/* a unique id for this filesystem (currently unused and unmaintained) */
/* In 4.3 Tahoe this space is used by fs_headswitch and fs_trkseek */
/* Neither of those fields is used in the Tahoe code right now but */
/* there could be problems if they are. */
__u32 fs_id[2]; /* file system id */
/* sizes determined by number of cylinder groups and their sizes */
__u32 fs_csaddr; /* blk addr of cyl grp summary area */
__u32 fs_cssize; /* size of cyl grp summary area */
__u32 fs_cgsize; /* cylinder group size */
/* these fields are derived from the hardware */
__u32 fs_ntrak; /* tracks per cylinder */
__u32 fs_nsect; /* sectors per track */
__u32 fs_spc; /* sectors per cylinder */
/* this comes from the disk driver partitioning */
__u32 fs_ncyl; /* cylinders in file system */
/* these fields can be computed from the others */
__u32 fs_cpg; /* cylinders per group */
__u32 fs_ipg; /* inodes per group */
__u32 fs_fpg; /* blocks per group * fs_frag */
/* this data must be re-computed after crashes */
struct ufs_csum fs_cstotal; /* cylinder summary information */
/* these fields are cleared at mount time */
__u8 fs_fmod; /* super block modified flag */
__u8 fs_clean; /* file system is clean flag */
__u8 fs_ronly; /* mounted read-only flag */
__u8 fs_flags; /* currently unused flag */
__u8 fs_fsmnt[MAXMNTLEN]; /* name mounted on */
/* these fields retain the current block allocation info */
__u32 fs_cgrotor; /* last cg searched */
struct ufs_csum * fs_csp[MAXCSBUFS]; /* list of fs_cs info buffers */
__u32 fs_cpc; /* cyl per cycle in postbl */
__u16 fs_opostbl[16][8]; /* old rotation block list head */
__s32 fs_sparecon[55]; /* reserved for future constants */
__s32 fs_state; /* file system state time stamp */
ufsquad fs_qbmask; /* ~usb_bmask - for use with __s64 size */
......@@ -184,15 +211,60 @@ struct ufs_inode {
__u32 ui_oeftflag; /* 0x7c reserved */
};
#ifdef __KERNEL__
/*
* Function prototypes
*/
/* ufs_inode.c */
extern int ufs_bmap (struct inode *, int);
extern void ufs_read_inode(struct inode * inode);
extern void ufs_put_inode(struct inode * inode);
extern void ufs_print_inode (struct inode *);
/* ufs_namei.c */
extern int ufs_lookup (struct inode *, const char *, int, struct inode **);
/* ufs_super.c */
extern void ufs_warning (struct super_block *, const char *, const char *, ...)
__attribute__ ((format (printf, 3, 4)));
extern int init_ufs_fs(void);
#endif /* __LINUX_UFS_FS_H */
/*
* Local Variables: ***
* c-indent-level: 8 ***
* c-continued-statement-offset: 8 ***
* c-brace-offset: -8 ***
* c-argdecl-indent: 0 ***
* c-label-offset: -8 ***
* End: ***
* Inodes and files operations
*/
/* ufs_dir.c */
extern struct inode_operations ufs_dir_inode_operations;
extern struct file_operations ufs_dir_operations;
/* ufs_file.c */
extern struct inode_operations ufs_file_inode_operations;
extern struct file_operations ufs_file_operations;
/* ufs_symlink.c */
extern struct inode_operations ufs_symlink_inode_operations;
extern struct file_operations ufs_symlink_operations;
/* Byte swapping 32/16-bit quantities into little endian format. */
extern int ufs_need_swab;
extern __inline__ __u32 ufs_swab32(__u32 value)
{
return (ufs_need_swab ? ((value >> 24) |
((value >> 8) & 0xff00) |
((value << 8) & 0xff0000) |
(value << 24)) : value);
}
extern __inline__ __u16 ufs_swab16(__u16 value)
{
return (ufs_need_swab ? ((value >> 8) |
(value << 8)) : value);
}
#endif /* __KERNEL__ */
#endif /* __LINUX_UFS_FS_H */
......@@ -6,25 +6,22 @@
* Laboratory for Computer Science Research Computing Facility
* Rutgers, The State University of New Jersey
*
* $Id: ufs_fs_i.h,v 1.1 1996/04/21 14:45:13 davem Exp $
* $Id: ufs_fs_i.h,v 1.2 1996/05/03 04:02:25 davem Exp $
*
*/
#ifndef _LINUX_UFS_FS_I_H
#define _LINUX_UFS_FS_I_H
#include <linux/ufs_fs.h>
struct ufs_inode_info {
__u64 ui_size;
__u32 ui_flags;
__u32 ui_gen;
__u32 ui_shadow;
__u32 ui_uid;
__u32 ui_gid;
__u32 ui_oeftflag;
__u32 ui_db[UFS_NDADDR];
__u32 ui_ib[UFS_NINDIR];
__u32 i_data[15];
__u64 i_size;
__u32 i_flags;
__u32 i_gen;
__u32 i_shadow;
__u32 i_uid;
__u32 i_gid;
__u32 i_oeftflag;
};
#endif /* _LINUX_UFS_FS_I_H */
......@@ -6,13 +6,14 @@
* Laboratory for Computer Science Research Computing Facility
* Rutgers, The State University of New Jersey
*
* $Id: ufs_fs_sb.h,v 1.1 1996/04/21 14:45:15 davem Exp $
* $Id: ufs_fs_sb.h,v 1.6 1996/06/01 15:31:08 ecd Exp $
*
*/
#ifndef __LINUX_UFS_FS_SB_H
#define __LINUX_UFS_FS_SB_H
#include <linux/ufs_fs.h>
struct ufs_sb_info {
struct ufs_superblock * s_raw_sb;
......@@ -21,23 +22,19 @@ struct ufs_sb_info {
__u32 s_ipg; /* used in ufs_read_inode */
__u32 s_fpg;
__u32 s_fsize;
__u32 s_fshift;
__u32 s_fmask;
__u32 s_bsize;
__u32 s_bmask;
__u32 s_bshift;
__u32 s_iblkno;
__u32 s_dblkno;
__u32 s_cgoffset;
__u32 s_cgmask;
__u32 s_inopb;
__u32 s_lshift;
__u32 s_lmask;
__u32 s_fsfrag;
};
#endif /* __LINUX_UFS_FS_SB_H */
/*
* Local Variables: ***
* c-indent-level: 8 ***
* c-continued-statement-offset: 8 ***
* c-brace-offset: -8 ***
* c-argdecl-indent: 0 ***
* c-label-offset: -8 ***
* End: ***
*/
......@@ -1984,13 +1984,14 @@ static int arp_req_set(struct arpreq *r, struct device * dev)
{
if (!mask && ip)
return -EINVAL;
if (!dev)
if (!dev) {
dev = dev_getbytype(r->arp_ha.sa_family);
if (!dev)
return -ENODEV;
}
}
else
{
if (ip_chk_addr(ip) && dev->type != ARPHRD_METRICOM)
return -EINVAL;
if (!dev)
{
struct rtable * rt;
......@@ -1999,9 +2000,13 @@ static int arp_req_set(struct arpreq *r, struct device * dev)
return -ENETUNREACH;
dev = rt->rt_dev;
ip_rt_put(rt);
if (!dev)
return -ENODEV;
}
if (dev->type != ARPHRD_METRICOM && ip_chk_addr(ip))
return -EINVAL;
}
if (!dev || (dev->flags&(IFF_LOOPBACK|IFF_NOARP)))
if (dev->flags & (IFF_LOOPBACK | IFF_NOARP))
return -ENODEV;
if (r->arp_ha.sa_family != dev->type)
......
......@@ -283,7 +283,10 @@ struct icmp_err icmp_err_convert[] = {
{ ENETUNREACH, 1 }, /* ICMP_NET_ANO */
{ EHOSTUNREACH, 1 }, /* ICMP_HOST_ANO */
{ EOPNOTSUPP, 0 }, /* ICMP_NET_UNR_TOS */
{ EOPNOTSUPP, 0 } /* ICMP_HOST_UNR_TOS */
{ EOPNOTSUPP, 0 }, /* ICMP_HOST_UNR_TOS */
{ EOPNOTSUPP, 1 }, /* ICMP_PKT_FILTERED */
{ EOPNOTSUPP, 1 }, /* ICMP_PREC_VIOLATION */
{ EOPNOTSUPP, 1 } /* ICMP_PREC_CUTOFF */
};
/*
......@@ -734,7 +737,7 @@ static void icmp_unreach(struct icmphdr *icmph, struct sk_buff *skb, struct devi
default:
break;
}
if(icmph->code>15) /* Invalid type */
if(icmph->code>NR_ICMP_UNREACH) /* Invalid type */
return;
}
......
......@@ -100,7 +100,7 @@ void raw_err (int type, int code, unsigned char *header, __u32 daddr,
sk->error_report(sk);
}
if(code<13)
if(code<=NR_ICMP_UNREACH)
{
sk->err = icmp_err_convert[code & 0xff].errno;
sk->error_report(sk);
......
......@@ -573,7 +573,7 @@ void tcp_err(int type, int code, unsigned char *header, __u32 daddr,
* until we time out, or the user gives up.
*/
if (code < 13)
if(code<=NR_ICMP_UNREACH)
{
if(icmp_err_convert[code].fatal || sk->state == TCP_SYN_SENT || sk->state == TCP_SYN_RECV)
{
......
......@@ -193,7 +193,7 @@ void udp_err(int type, int code, unsigned char *header, __u32 daddr,
/* 4.1.3.3. */
/* After the comment above, that should be no surprise. */
if (code < 13 && icmp_err_convert[code].fatal)
if(code<=NR_ICMP_UNREACH && icmp_err_convert[code].fatal)
{
/*
* 4.x BSD compatibility item. Break RFC1122 to
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment