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. ...@@ -49,12 +49,12 @@ D: APM update to 1.2 spec.
N: Erik Andersen N: Erik Andersen
E: andersee@debian.org 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 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: Maintainer of ide-cd and Uniform CD-ROM driver,
D: ATAPI CD-Changer support, Major 2.1.x CD-ROM update. D: ATAPI CD-Changer support, Major 2.1.x CD-ROM update.
S: 4538 South Carnegie Tech Street S: 4538 South Carnegie Tech Street
S: West Valley City, Utah 84120 S: Salt Lake City, Utah 84120
S: USA S: USA
N: H. Peter Anvin N: H. Peter Anvin
......
This diff is collapsed.
VERSION = 2 VERSION = 2
PATCHLEVEL = 2 PATCHLEVEL = 2
SUBLEVEL = 0 SUBLEVEL = 1
EXTRAVERSION = EXTRAVERSION =
ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) 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: ...@@ -101,7 +101,7 @@ __down_failed_interruptible:
.prologue 1 .prologue 1
mov $24, $16 mov $24, $16
jsr __down jsr __down_interruptible
mov $0, $24 mov $0, $24
ldq $28, 0*8($30) ldq $28, 0*8($30)
......
...@@ -144,7 +144,6 @@ static struct voice_info voices[32]; ...@@ -144,7 +144,6 @@ static struct voice_info voices[32];
static int freq_div_table[] = static int freq_div_table[] =
{ {
44100,
44100, /* 14 */ 44100, /* 14 */
41160, /* 15 */ 41160, /* 15 */
38587, /* 16 */ 38587, /* 16 */
...@@ -2234,9 +2233,6 @@ static int gus_audio_open(int dev, int mode) ...@@ -2234,9 +2233,6 @@ static int gus_audio_open(int dev, int mode)
gus_busy = 1; gus_busy = 1;
active_device = 0; active_device = 0;
gus_reset();
reset_sample_memory();
gus_select_max_voices(14);
saved_iw_mode = iw_mode; saved_iw_mode = iw_mode;
if (iw_mode) if (iw_mode)
{ {
...@@ -2244,6 +2240,11 @@ static int gus_audio_open(int dev, int mode) ...@@ -2244,6 +2240,11 @@ static int gus_audio_open(int dev, int mode)
gus_write8(0x19, gus_read8(0x19) & ~0x01); /* Disable enhanced mode */ gus_write8(0x19, gus_read8(0x19) & ~0x01); /* Disable enhanced mode */
iw_mode = 0; iw_mode = 0;
} }
gus_reset();
reset_sample_memory();
gus_select_max_voices(14);
pcm_active = 0; pcm_active = 0;
dma_active = 0; dma_active = 0;
pcm_opened = 1; pcm_opened = 1;
......
...@@ -113,6 +113,7 @@ void unload_sb(struct address_info *hw_config) ...@@ -113,6 +113,7 @@ void unload_sb(struct address_info *hw_config)
} }
int sb_be_quiet=0; int sb_be_quiet=0;
int esstype = 0; /* ESS chip type */
#ifdef MODULE #ifdef MODULE
...@@ -136,7 +137,6 @@ int trix = 0; /* Set trix=1 to load this as support for trix */ ...@@ -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 pas2 = 0; /* Set pas2=1 to load this as support for pas2 */
int sm_games = 0; /* Mixer - see sb_mixer.c */ int sm_games = 0; /* Mixer - see sb_mixer.c */
int acer = 0; /* Do acer notebook init */ int acer = 0; /* Do acer notebook init */
int esstype = 0; /* ESS chip type */
MODULE_PARM(io, "i"); MODULE_PARM(io, "i");
MODULE_PARM(irq, "i"); MODULE_PARM(irq, "i");
......
...@@ -987,6 +987,20 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp, ...@@ -987,6 +987,20 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp,
goto out; 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. * 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, ...@@ -1048,6 +1062,10 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,
if (IS_ERR(odentry)) if (IS_ERR(odentry))
goto out_nfserr; goto out_nfserr;
err = -ENOENT;
if (!odentry->d_inode)
goto out_dput_old;
ndentry = lookup_dentry(tname, dget(tdentry), 0); ndentry = lookup_dentry(tname, dget(tdentry), 0);
err = PTR_ERR(ndentry); err = PTR_ERR(ndentry);
if (IS_ERR(ndentry)) if (IS_ERR(ndentry))
...@@ -1057,13 +1075,18 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen, ...@@ -1057,13 +1075,18 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,
* Lock the parent directories. * Lock the parent directories.
*/ */
nfsd_double_down(&tdir->i_sem, &fdir->i_sem); nfsd_double_down(&tdir->i_sem, &fdir->i_sem);
/* N.B. check for parent changes after locking?? */ err = -ENOENT;
/* GAM3 check for parent changes after locking. */
err = vfs_rename(fdir, odentry, tdir, ndentry); if (check_parent(fdir, odentry) &&
if (!err && EX_ISSYNC(tfhp->fh_export)) { check_parent(tdir, ndentry)) {
write_inode_now(fdir);
write_inode_now(tdir); 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(fdir);
DQUOT_DROP(tdir); DQUOT_DROP(tdir);
...@@ -1137,10 +1160,9 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, ...@@ -1137,10 +1160,9 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
if (!fhp->fh_pre_mtime) if (!fhp->fh_pre_mtime)
fhp->fh_pre_mtime = dirp->i_mtime; fhp->fh_pre_mtime = dirp->i_mtime;
fhp->fh_locked = 1; fhp->fh_locked = 1;
/* CHECKME: Should we do something with the child? */
err = -ENOENT; err = -ENOENT;
if (rdentry->d_parent->d_inode == dirp) if (check_parent(dirp, rdentry))
err = vfs_rmdir(dirp, rdentry); err = vfs_rmdir(dirp, rdentry);
rdentry->d_count--; rdentry->d_count--;
......
This diff is collapsed.
...@@ -69,10 +69,9 @@ typedef unsigned long pgprot_t; ...@@ -69,10 +69,9 @@ typedef unsigned long pgprot_t;
* you want to use more physical memory, change this define. * you want to use more physical memory, change this define.
* *
* For example, if you have 2GB worth of physical memory, you * For example, if you have 2GB worth of physical memory, you
* could change this define to 0x70000000, which gives the * could change this define to 0x80000000, which gives the
* kernel slightly more than 2GB of virtual memory (enough to * kernel 2GB of virtual memory (enough to most of your physical memory
* map all your physical memory + a bit extra for various * as the kernel needs a bit extra for various io-memory mappings)
* io-memory mappings)
* *
* IF YOU CHANGE THIS, PLEASE ALSO CHANGE * IF YOU CHANGE THIS, PLEASE ALSO CHANGE
* *
......
...@@ -393,6 +393,7 @@ struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr) ...@@ -393,6 +393,7 @@ struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr)
} else { } else {
/* Then go through the AVL tree quickly. */ /* Then go through the AVL tree quickly. */
struct vm_area_struct * tree = mm->mmap_avl; struct vm_area_struct * tree = mm->mmap_avl;
vma = NULL;
for (;;) { for (;;) {
if (tree == vm_avl_empty) if (tree == vm_avl_empty)
break; break;
...@@ -556,7 +557,7 @@ static void free_pgtables(struct mm_struct * mm, struct vm_area_struct *prev, ...@@ -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 start, unsigned long end)
{ {
unsigned long first = start & PGDIR_MASK; 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) { if (!prev) {
prev = mm->mmap; 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