Commit 8b109aa9 authored by Linus Torvalds's avatar Linus Torvalds

Import 2.1.119

parent 00b90961
......@@ -68,6 +68,7 @@ D: Parport hacker
D: Implemented a workaround for some interrupt buggy printers
D: Author of pscan that helps to fix lp/parport bug
D: Author of lil (Linux Interrupt Latency benchmark)
D: Fixed the shm swap deallocation at swapoff time (try_to_unuse message)
D: Various other kernel hacks
S: Via Ciaclini 26
S: Imola 40026
......
......@@ -190,12 +190,6 @@ net-tools. This will also fix other problems. For example, the format
of /proc/net/dev changed; as a result, an older ifconfig will
incorrectly report errors.
As of 2.1.102, the firewalling code has been replaced with
firewalling chains. See
http://www.adelaide.net.au/~rustcorp/ipfwchains/ipfwchains.html for
more information. Among other things, you'll now need to use ipchains
instead of ipfwadm to configure your filters.
The IP firewalling code has been replaced: ipfwadm will no longer
work. You need to obtain `ipchains', available from
http://www.adelaide.net.au/~rustcorp/ipfwchains/ipfwchains.html
......
......@@ -72,6 +72,12 @@ ROOT_DEV = CURRENT
#INSTALL_PATH=/boot
#
# INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory
# relocations required by build roots. This is not defined in the
# makefile but the arguement can be passed to make if needed.
#
#
# If you want to preset the SVGA mode, uncomment the next line and
# set SVGA_MODE to whatever number you want.
......@@ -289,7 +295,7 @@ $(patsubst %, _mod_%, $(SUBDIRS)) : include/linux/version.h
modules_install:
@( \
MODLIB=/lib/modules/$(VERSION).$(PATCHLEVEL).$(SUBLEVEL); \
MODLIB=$(INSTALL_MOD_PATH)/lib/modules/$(VERSION).$(PATCHLEVEL).$(SUBLEVEL); \
cd modules; \
MODULES=""; \
inst_mod() { These="`cat $$1`"; MODULES="$$MODULES $$These"; \
......
......@@ -44,7 +44,6 @@
#include <asm/system.h>
#include <asm/pgtable.h>
#include <asm/io.h>
#include <asm/ide.h>
#include <asm/pci-bridge.h>
#include <asm/adb.h>
#include <asm/cuda.h>
......@@ -273,94 +272,3 @@ __initfunc(void note_bootable_part(kdev_t dev, int part))
}
}
#ifdef CONFIG_BLK_DEV_IDE
int pmac_ide_ports_known;
ide_ioreg_t pmac_ide_regbase[MAX_HWIFS];
int pmac_ide_irq[MAX_HWIFS];
__initfunc(void pmac_ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq))
{
int i;
*p = 0;
if (base == 0)
return;
if (base == mb_cd_base && !check_media_bay(MB_CD)) {
mb_cd_index = -1;
return;
}
for (i = 0; i < 8; ++i)
*p++ = base + i * 0x10;
*p = base + 0x160;
if (irq != NULL) {
*irq = 0;
for (i = 0; i < MAX_HWIFS; ++i) {
if (base == pmac_ide_regbase[i]) {
*irq = pmac_ide_irq[i];
break;
}
}
}
}
__initfunc(void pmac_ide_probe(void))
{
struct device_node *np;
int i;
struct device_node *atas;
struct device_node *p, **pp, *removables, **rp;
pp = &atas;
rp = &removables;
p = find_devices("ATA");
if (p == NULL)
p = find_devices("IDE");
if (p == NULL)
p = find_type_devices("ide");
if (p == NULL)
p = find_type_devices("ata");
/* Move removable devices such as the media-bay CDROM
on the PB3400 to the end of the list. */
for (; p != NULL; p = p->next) {
if (p->parent && p->parent->name
&& strcasecmp(p->parent->name, "media-bay") == 0) {
*rp = p;
rp = &p->next;
} else {
*pp = p;
pp = &p->next;
}
}
*rp = NULL;
*pp = removables;
for (i = 0, np = atas; i < MAX_HWIFS && np != NULL; np = np->next) {
if (np->n_addrs == 0) {
printk(KERN_WARNING "ide: no address for device %s\n",
np->full_name);
continue;
}
pmac_ide_regbase[i] = (unsigned long)
ioremap(np->addrs[0].address, 0x200);
if (np->n_intrs == 0) {
printk("ide: no intrs for device %s, using 13\n",
np->full_name);
pmac_ide_irq[i] = 13;
} else {
pmac_ide_irq[i] = np->intrs[0].line;
}
if (np->parent && np->parent->name
&& strcasecmp(np->parent->name, "media-bay") == 0) {
mb_cd_index = i;
mb_cd_base = pmac_ide_regbase[i];
mb_cd_irq = pmac_ide_irq[i];
}
++i;
}
pmac_ide_ports_known = 1;
}
#endif /* CONFIG_BLK_DEV_IDE */
......@@ -48,6 +48,14 @@ else
bool ' WInbond SL82c105 support' CONFIG_BLK_DEV_SL82C105
fi
fi
if [ "$CONFIG_PMAC" = "y" ]; then
define_bool CONFIG_BLK_DEV_IDE_PMAC y
bool ' PowerMac IDE DMA support' CONFIG_BLK_DEV_IDEDMA_PMAC
if [ "$CONFIG_BLK_DEV_IDEDMA_PMAC" = "y" ]; then
define_bool CONFIG_BLK_DEV_IDEDMA y
bool ' Use DMA by default' CONFIG_PMAC_IDEDMA_AUTO
fi
fi
bool ' Other IDE chipset support' CONFIG_IDE_CHIPSETS
if [ "$CONFIG_IDE_CHIPSETS" = "y" ]; then
comment 'Note: most of these also require special kernel boot parameters'
......
......@@ -106,6 +106,10 @@ ifeq ($(CONFIG_BLK_DEV_CMD640),y)
IDE_OBJS += cmd640.o
endif
ifeq ($(CONFIG_BLK_DEV_IDE_PMAC),y)
IDE_OBJS += ide-pmac.o
endif
ifeq ($(CONFIG_BLK_DEV_IDEPCI),y)
IDE_OBJS += ide-pci.o
endif
......
/*
* Support for IDE interfaces on PowerMacs.
* These IDE interfaces are memory-mapped and have a DBDMA channel
* for doing DMA.
*
* Copyright (C) 1998 Paul Mackerras.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Some code taken from drivers/block/ide-dma.c:
*
* Copyright (c) 1995-1998 Mark Lord
*
*/
#include <linux/config.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <asm/prom.h>
#include <asm/io.h>
#include <asm/dbdma.h>
#include <asm/ide.h>
#include <asm/mediabay.h>
#include "ide.h"
ide_ioreg_t pmac_ide_regbase[MAX_HWIFS];
int pmac_ide_irq[MAX_HWIFS];
#ifdef CONFIG_BLK_DEV_IDEDMA_PMAC
#define MAX_DCMDS 256 /* allow up to 256 DBDMA commands per xfer */
static void pmac_ide_setup_dma(struct device_node *np, ide_hwif_t *hwif);
static int pmac_ide_dmaproc(ide_dma_action_t func, ide_drive_t *drive);
static int pmac_ide_build_dmatable(ide_drive_t *drive, int wr);
#endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
__initfunc(void
pmac_ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq))
{
int i;
*p = 0;
if (base == 0)
return;
if (base == mb_cd_base && !check_media_bay(MB_CD)) {
mb_cd_index = -1;
return;
}
for (i = 0; i < 8; ++i)
*p++ = base + i * 0x10;
*p = base + 0x160;
if (irq != NULL) {
*irq = 0;
for (i = 0; i < MAX_HWIFS; ++i) {
if (base == pmac_ide_regbase[i]) {
*irq = pmac_ide_irq[i];
break;
}
}
}
}
__initfunc(void
pmac_ide_probe(void))
{
struct device_node *np;
int i;
struct device_node *atas;
struct device_node *p, **pp, *removables, **rp;
unsigned long base;
int irq;
ide_hwif_t *hwif;
if (_machine != _MACH_Pmac)
return;
pp = &atas;
rp = &removables;
p = find_devices("ATA");
if (p == NULL)
p = find_devices("IDE");
if (p == NULL)
p = find_type_devices("ide");
if (p == NULL)
p = find_type_devices("ata");
/* Move removable devices such as the media-bay CDROM
on the PB3400 to the end of the list. */
for (; p != NULL; p = p->next) {
if (p->parent && p->parent->name
&& strcasecmp(p->parent->name, "media-bay") == 0) {
*rp = p;
rp = &p->next;
} else {
*pp = p;
pp = &p->next;
}
}
*rp = NULL;
*pp = removables;
for (i = 0, np = atas; i < MAX_HWIFS && np != NULL; np = np->next) {
if (np->n_addrs == 0) {
printk(KERN_WARNING "ide: no address for device %s\n",
np->full_name);
continue;
}
base = (unsigned long) ioremap(np->addrs[0].address, 0x200);
if (np->n_intrs == 0) {
printk("ide: no intrs for device %s, using 13\n",
np->full_name);
irq = 13;
} else {
irq = np->intrs[0].line;
}
pmac_ide_regbase[i] = base;
pmac_ide_irq[i] = irq;
if (np->parent && np->parent->name
&& strcasecmp(np->parent->name, "media-bay") == 0) {
mb_cd_index = i;
mb_cd_base = base;
mb_cd_irq = irq;
}
hwif = &ide_hwifs[i];
pmac_ide_init_hwif_ports(hwif->io_ports, base, &hwif->irq);
hwif->chipset = ide_generic;
hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET];
#ifdef CONFIG_BLK_DEV_IDEDMA_PMAC
if (np->n_addrs >= 2 && np->n_intrs >= 2) {
/* has a DBDMA controller channel */
pmac_ide_setup_dma(np, hwif);
}
#endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
++i;
}
}
#ifdef CONFIG_BLK_DEV_IDEDMA_PMAC
__initfunc(static void
pmac_ide_setup_dma(struct device_node *np, ide_hwif_t *hwif))
{
hwif->dma_base = (unsigned long) ioremap(np->addrs[1].address, 0x200);
/*
* Allocate space for the DBDMA commands.
* The +2 is +1 for the stop command and +1 to allow for
* aligning the start address to a multiple of 16 bytes.
*/
hwif->dmatable = (unsigned long *)
kmalloc((MAX_DCMDS + 2) * sizeof(struct dbdma_cmd), GFP_KERNEL);
if (hwif->dmatable == 0) {
printk(KERN_ERR "%s: unable to allocate DMA command list\n",
hwif->name);
return;
}
hwif->dmaproc = &pmac_ide_dmaproc;
#ifdef CONFIG_PMAC_IDEDMA_AUTO
hwif->autodma = 1;
#endif
}
/*
* pmac_ide_build_dmatable builds the DBDMA command list
* for a transfer and sets the DBDMA channel to point to it.
*/
static int
pmac_ide_build_dmatable(ide_drive_t *drive, int wr)
{
ide_hwif_t *hwif = HWIF(drive);
struct dbdma_cmd *table, *tstart;
int count = 0;
struct request *rq = HWGROUP(drive)->rq;
struct buffer_head *bh = rq->bh;
unsigned int size, addr;
volatile struct dbdma_regs *dma
= (volatile struct dbdma_regs *) hwif->dma_base;
table = tstart = (struct dbdma_cmd *) DBDMA_ALIGN(hwif->dmatable);
out_le32(&dma->control, (RUN|PAUSE|FLUSH|WAKE|DEAD) << 16);
do {
/*
* Determine addr and size of next buffer area. We assume that
* individual virtual buffers are always composed linearly in
* physical memory. For example, we assume that any 8kB buffer
* is always composed of two adjacent physical 4kB pages rather
* than two possibly non-adjacent physical 4kB pages.
*/
if (bh == NULL) { /* paging requests have (rq->bh == NULL) */
addr = virt_to_bus(rq->buffer);
size = rq->nr_sectors << 9;
} else {
/* group sequential buffers into one large buffer */
addr = virt_to_bus(bh->b_data);
size = bh->b_size;
while ((bh = bh->b_reqnext) != NULL) {
if ((addr + size) != virt_to_bus(bh->b_data))
break;
size += bh->b_size;
}
}
/*
* Fill in the next DBDMA command block.
* Note that one DBDMA command can transfer
* at most 65535 bytes.
*/
while (size) {
unsigned int tc = (size < 0xfe00)? size: 0xfe00;
if (++count >= MAX_DCMDS) {
printk("%s: DMA table too small\n",
drive->name);
return 0; /* revert to PIO for this request */
}
st_le16(&table->command, wr? OUTPUT_MORE: INPUT_MORE);
st_le16(&table->req_count, tc);
st_le32(&table->phy_addr, addr);
table->cmd_dep = 0;
table->xfer_status = 0;
table->res_count = 0;
addr += tc;
size -= tc;
++table;
}
} while (bh != NULL);
/* convert the last command to an input/output last command */
if (count)
st_le16(&table[-1].command, wr? OUTPUT_LAST: INPUT_LAST);
else
printk(KERN_DEBUG "%s: empty DMA table?\n", drive->name);
/* add the stop command to the end of the list */
memset(table, 0, sizeof(struct dbdma_cmd));
out_le16(&table->command, DBDMA_STOP);
out_le32(&dma->cmdptr, virt_to_bus(tstart));
return 1;
}
int pmac_ide_dmaproc(ide_dma_action_t func, ide_drive_t *drive)
{
ide_hwif_t *hwif = HWIF(drive);
volatile struct dbdma_regs *dma
= (volatile struct dbdma_regs *) hwif->dma_base;
int dstat;
switch (func) {
case ide_dma_on:
/* ide-floppy DMA doesn't work yet... */
drive->using_dma = drive->media != ide_floppy;
break;
case ide_dma_off:
printk(KERN_INFO "%s: DMA disabled\n", drive->name);
case ide_dma_off_quietly:
drive->using_dma = 0;
break;
case ide_dma_check:
/* ide-floppy DMA doesn't work yet... */
drive->using_dma = hwif->autodma && drive->media != ide_floppy;
break;
case ide_dma_read:
case ide_dma_write:
if (!pmac_ide_build_dmatable(drive, func==ide_dma_write))
return 1;
drive->waiting_for_dma = 1;
if (drive->media != ide_disk)
return 0;
ide_set_handler(drive, &ide_dma_intr, WAIT_CMD);
OUT_BYTE(func==ide_dma_write? WIN_WRITEDMA: WIN_READDMA,
IDE_COMMAND_REG);
case ide_dma_begin:
out_le32(&dma->control, (RUN << 16) | RUN);
break;
case ide_dma_end:
drive->waiting_for_dma = 0;
dstat = in_le32(&dma->status);
out_le32(&dma->control, ((RUN|WAKE|DEAD) << 16));
/* verify good dma status */
return (dstat & (RUN|DEAD|ACTIVE)) != RUN;
case ide_dma_test_irq:
return (in_le32(&dma->status) & (RUN|ACTIVE)) == RUN;
default:
printk(KERN_ERR "pmac_ide_dmaproc: bad func %d\n", func);
}
return 0;
}
#endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
......@@ -2637,6 +2637,12 @@ __initfunc(static void probe_for_hwifs (void))
(void) init_pdc4030();
}
#endif /* CONFIG_BLK_DEV_PDC4030 */
#ifdef CONFIG_BLK_DEV_IDE_PMAC
{
extern void pmac_ide_probe(void);
pmac_ide_probe();
}
#endif /* CONFIG_BLK_DEV_IDE_PMAC */
}
__initfunc(void ide_init_builtin_drivers (void))
......
......@@ -81,9 +81,18 @@ static int nbd_xmit(int send, struct socket *sock, char *buf, int size)
int result;
struct msghdr msg;
struct iovec iov;
unsigned long flags;
oldfs = get_fs();
set_fs(get_ds());
spin_lock_irqsave(&current->sigmask_lock, flags);
oldset = current->blocked;
sigfillset(&current->blocked);
recalc_sigpending(current);
spin_unlock_irqrestore(&current->sigmask_lock, flags);
do {
sigset_t oldset;
......@@ -98,22 +107,11 @@ static int nbd_xmit(int send, struct socket *sock, char *buf, int size)
msg.msg_namelen = 0;
msg.msg_flags = 0;
spin_lock_irq(&current->sigmask_lock);
oldset = current->blocked;
sigfillset(&current->blocked);
recalc_sigpending(current);
spin_unlock_irq(&current->sigmask_lock);
if (send)
result = sock_sendmsg(sock, &msg, size);
else
result = sock_recvmsg(sock, &msg, size, 0);
spin_lock_irq(&current->sigmask_lock);
current->blocked = oldset;
recalc_sigpending(current);
spin_unlock_irq(&current->sigmask_lock);
if (result <= 0) {
#ifdef PARANOIA
printk(KERN_ERR "NBD: %s - sock=%ld at buf=%ld, size=%d returned %d.\n",
......@@ -124,6 +122,12 @@ static int nbd_xmit(int send, struct socket *sock, char *buf, int size)
size -= result;
buf += result;
} while (size > 0);
spin_lock_irqsave(&current->sigmask_lock, flags);
current->blocked = oldset;
recalc_sigpending(current);
spin_unlock_irqrestore(&current->sigmask_lock, flags);
set_fs(oldfs);
return result;
}
......@@ -295,8 +299,6 @@ static void do_nbd_request(void)
requests_in++;
#endif
req->errors = 0;
nbd_send_req(lo->sock, req); /* Why does this block? */
CURRENT = CURRENT->next;
req->next = NULL;
if (lo->head == NULL) {
......@@ -306,6 +308,10 @@ static void do_nbd_request(void)
lo->head->next = req;
lo->head = req;
}
spin_unlock_irq(&io_request_lock);
nbd_send_req(lo->sock, req); /* Why does this block? */
spin_lock_irq(&io_request_lock);
continue;
error_out:
......
......@@ -1787,6 +1787,7 @@ static struct file_operations isdn_fops =
isdn_ioctl, /* isdn_ioctl */
NULL, /* isdn_mmap */
isdn_open,
NULL, /* flush */
isdn_close,
NULL /* fsync */
};
......
......@@ -518,10 +518,18 @@ scsi_unregister(struct Scsi_Host * sh){
/* If we are removing the last host registered, it is safe to reuse
* its host number (this avoids "holes" at boot time) (DB)
* It is also safe to reuse those of numbers directly below which have
* been released earlier (to avoid some holes in numbering).
*/
if (max_scsi_hosts == next_scsi_host)
max_scsi_hosts--;
if(sh->host_no == max_scsi_hosts - 1) {
while(--max_scsi_hosts >= next_scsi_host) {
shpnt = scsi_hostlist;
while(shpnt && shpnt->host_no != max_scsi_hosts - 1)
shpnt = shpnt->next;
if(shpnt)
break;
}
}
next_scsi_host--;
scsi_init_free((char *) sh, sizeof(struct Scsi_Host) + sh->extra_bytes);
}
......
......@@ -56,18 +56,6 @@
#include <linux/nfs_fs.h>
#include <asm/uaccess.h>
/*
* NOTE! We must NOT default to soft-mounting: that breaks too many
* programs that depend on POSIX behaviour of uninterruptible reads
* and writes.
*
* Until we have a per-mount soft/hard mount policy that we can honour
* we must default to hard mounting!
*
* And yes, this should be "interruptible", not soft.
*/
#define IS_SOFT 0
#define NFS_PARANOIA 1
#define NFSDBG_FACILITY NFSDBG_PAGECACHE
......@@ -730,29 +718,21 @@ int
nfs_flush_dirty_pages(struct inode *inode, pid_t pid, off_t offset, off_t len)
{
struct nfs_wreq *last = NULL;
int result = 0, cancel = 0;
int result = 0;
dprintk("NFS: flush_dirty_pages(%x/%ld for pid %d %ld/%ld)\n",
inode->i_dev, inode->i_ino, current->pid, offset, len);
if (IS_SOFT && signalled()) {
nfs_cancel_dirty(inode, pid);
cancel = 1;
}
for (;;) {
if (IS_SOFT && signalled()) {
if (!cancel)
nfs_cancel_dirty(inode, pid);
result = -ERESTARTSYS;
break;
}
/* Flush all pending writes for the pid and file region */
last = nfs_flush_pages(inode, pid, offset, len, 0);
if (last == NULL)
break;
wait_on_write_request(last);
result = wait_on_write_request(last);
if (result) {
nfs_cancel_dirty(inode,pid);
break;
}
}
return result;
......
......@@ -1961,11 +1961,13 @@ smb_proc_getattr(struct dentry *dir, struct smb_fattr *fattr)
smb_init_dirent(server, fattr);
/*
* Win 95 is painfully slow at returning trans2 getattr info,
* so we provide the SMB_FIX_OLDATTR option switch.
* Select whether to use core or trans2 getattr.
*/
if (server->opt.protocol >= SMB_PROTOCOL_LANMAN2) {
if (server->mnt->version & SMB_FIX_OLDATTR)
/*
* Win 95 appears to break with the trans2 getattr.
*/
if (server->mnt->version & (SMB_FIX_OLDATTR|SMB_FIX_WIN95))
goto core_attr;
if (server->mnt->version & SMB_FIX_DIRATTR)
result = smb_proc_getattr_ff(server, dir, fattr);
......
......@@ -95,8 +95,6 @@ static __inline__ int ide_default_irq(ide_ioreg_t base)
static __inline__ ide_ioreg_t ide_default_io_base(int index)
{
if (_machine == _MACH_Pmac) {
if (!pmac_ide_ports_known)
pmac_ide_probe();
return pmac_ide_regbase[index];
}
if (_machine == _MACH_mbx) return index;
......
......@@ -9,7 +9,6 @@
#ifndef _LINUX_SMB_FS_H
#define _LINUX_SMB_FS_H
#include <linux/dirent.h>
#include <linux/smb.h>
/*
......
......@@ -15,12 +15,11 @@
struct smb_mount_data {
int version;
uid_t mounted_uid; /* Who may umount() this filesystem? */
uid_t uid;
gid_t gid;
mode_t file_mode;
mode_t dir_mode;
__kernel_uid_t mounted_uid; /* Who may umount() this filesystem? */
__kernel_uid_t uid;
__kernel_gid_t gid;
__kernel_mode_t file_mode;
__kernel_mode_t dir_mode;
};
#endif
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