Commit 85a51578 authored by Linus Torvalds's avatar Linus Torvalds

Linux 2.2.1 - the Brown Paper Bag release

The subject says it all. We did have a few paper-bag-inducing bugs in
2.2.0, so there's a 2.2.1 out there now, just a few days after 2.2.0.
Oh, well. These things happen,

                Linus

- the stupid off-by-one bug 'execute a coredump' crash found by Ingo
- __down_interruptible on alpha
- move "esstype" to outside a #ifdef MODULE
- NFSD rename/rmdir fixes
- revert to old array.c
- change comment about __PAGE_OFFSET
- missing "vma = NULL" case for avl find_vma()
parent f6cce5da
......@@ -49,12 +49,12 @@ D: APM update to 1.2 spec.
N: Erik Andersen
E: andersee@debian.org
W: http://www.inconnect.com/~andersen
W: http://www.xmission.com/~andersen
P: 1024/FC4CFFED 78 3C 6A 19 FA 5D 92 5A FB AC 7B A5 A5 E1 FF 8E
D: Maintainer of ide-cd and Uniform CD-ROM driver,
D: ATAPI CD-Changer support, Major 2.1.x CD-ROM update.
S: 4538 South Carnegie Tech Street
S: West Valley City, Utah 84120
S: Salt Lake City, Utah 84120
S: USA
N: H. Peter Anvin
......
This diff is collapsed.
VERSION = 2
PATCHLEVEL = 2
SUBLEVEL = 0
SUBLEVEL = 1
EXTRAVERSION =
ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
......
......@@ -101,7 +101,7 @@ __down_failed_interruptible:
.prologue 1
mov $24, $16
jsr __down
jsr __down_interruptible
mov $0, $24
ldq $28, 0*8($30)
......
......@@ -144,7 +144,6 @@ static struct voice_info voices[32];
static int freq_div_table[] =
{
44100,
44100, /* 14 */
41160, /* 15 */
38587, /* 16 */
......@@ -2234,9 +2233,6 @@ static int gus_audio_open(int dev, int mode)
gus_busy = 1;
active_device = 0;
gus_reset();
reset_sample_memory();
gus_select_max_voices(14);
saved_iw_mode = iw_mode;
if (iw_mode)
{
......@@ -2244,6 +2240,11 @@ static int gus_audio_open(int dev, int mode)
gus_write8(0x19, gus_read8(0x19) & ~0x01); /* Disable enhanced mode */
iw_mode = 0;
}
gus_reset();
reset_sample_memory();
gus_select_max_voices(14);
pcm_active = 0;
dma_active = 0;
pcm_opened = 1;
......
......@@ -113,6 +113,7 @@ void unload_sb(struct address_info *hw_config)
}
int sb_be_quiet=0;
int esstype = 0; /* ESS chip type */
#ifdef MODULE
......@@ -136,7 +137,6 @@ int trix = 0; /* Set trix=1 to load this as support for trix */
int pas2 = 0; /* Set pas2=1 to load this as support for pas2 */
int sm_games = 0; /* Mixer - see sb_mixer.c */
int acer = 0; /* Do acer notebook init */
int esstype = 0; /* ESS chip type */
MODULE_PARM(io, "i");
MODULE_PARM(irq, "i");
......
......@@ -987,6 +987,20 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp,
goto out;
}
/*
* We need to do a check-parent every time
* after we have locked the parent - to verify
* that the parent is still our parent and
* that we are still hashed onto it..
*
* This is requied in case two processes race
* on removing (or moving) the same entry: the
* parent lock will serialize them, but the
* other process will be too late..
*/
#define check_parent(dir, dentry) \
((dir) == (dentry)->d_parent->d_inode && !list_empty(&dentry->d_hash))
/*
* This follows the model of double_lock() in the VFS.
*/
......@@ -1048,6 +1062,10 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,
if (IS_ERR(odentry))
goto out_nfserr;
err = -ENOENT;
if (!odentry->d_inode)
goto out_dput_old;
ndentry = lookup_dentry(tname, dget(tdentry), 0);
err = PTR_ERR(ndentry);
if (IS_ERR(ndentry))
......@@ -1057,13 +1075,18 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,
* Lock the parent directories.
*/
nfsd_double_down(&tdir->i_sem, &fdir->i_sem);
/* N.B. check for parent changes after locking?? */
err = vfs_rename(fdir, odentry, tdir, ndentry);
if (!err && EX_ISSYNC(tfhp->fh_export)) {
write_inode_now(fdir);
write_inode_now(tdir);
}
err = -ENOENT;
/* GAM3 check for parent changes after locking. */
if (check_parent(fdir, odentry) &&
check_parent(tdir, ndentry)) {
err = vfs_rename(fdir, odentry, tdir, ndentry);
if (!err && EX_ISSYNC(tfhp->fh_export)) {
write_inode_now(fdir);
write_inode_now(tdir);
}
} else
dprintk("nfsd: Caught race in nfsd_rename");
DQUOT_DROP(fdir);
DQUOT_DROP(tdir);
......@@ -1137,10 +1160,9 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
if (!fhp->fh_pre_mtime)
fhp->fh_pre_mtime = dirp->i_mtime;
fhp->fh_locked = 1;
/* CHECKME: Should we do something with the child? */
err = -ENOENT;
if (rdentry->d_parent->d_inode == dirp)
if (check_parent(dirp, rdentry))
err = vfs_rmdir(dirp, rdentry);
rdentry->d_count--;
......
This diff is collapsed.
......@@ -69,10 +69,9 @@ typedef unsigned long pgprot_t;
* you want to use more physical memory, change this define.
*
* For example, if you have 2GB worth of physical memory, you
* could change this define to 0x70000000, which gives the
* kernel slightly more than 2GB of virtual memory (enough to
* map all your physical memory + a bit extra for various
* io-memory mappings)
* could change this define to 0x80000000, which gives the
* kernel 2GB of virtual memory (enough to most of your physical memory
* as the kernel needs a bit extra for various io-memory mappings)
*
* IF YOU CHANGE THIS, PLEASE ALSO CHANGE
*
......
......@@ -393,6 +393,7 @@ struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr)
} else {
/* Then go through the AVL tree quickly. */
struct vm_area_struct * tree = mm->mmap_avl;
vma = NULL;
for (;;) {
if (tree == vm_avl_empty)
break;
......@@ -556,7 +557,7 @@ static void free_pgtables(struct mm_struct * mm, struct vm_area_struct *prev,
unsigned long start, unsigned long end)
{
unsigned long first = start & PGDIR_MASK;
unsigned long last = (end & PGDIR_MASK) + PGDIR_SIZE;
unsigned long last = (end + PGDIR_SIZE - 1) & PGDIR_MASK;
if (!prev) {
prev = mm->mmap;
......
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