diff -uNr 99-pre5/ipc/shm.c c5/ipc/shm.c --- 99-pre5/ipc/shm.c Sat Apr 15 19:14:55 2000 +++ c5/ipc/shm.c Wed Apr 19 19:05:52 2000 @@ -1715,12 +1715,13 @@ d_instantiate(filp->f_dentry, inp); /* - * Copy over /dev/zero dev/ino for benefit of procfs. Use + * Copy over dev/ino for benefit of procfs. Use * ino to indicate seperate mappings. */ - filp->f_dentry->d_inode->i_dev = fzero->f_dentry->d_inode->i_dev; + filp->f_dentry->d_inode->i_dev = shm_sb->s_dev; filp->f_dentry->d_inode->i_ino = (unsigned long)shp; - fput(fzero); /* release /dev/zero file */ + if (fzero) + fput(fzero); /* release /dev/zero file */ return(filp); } diff -uNr 99-pre5/mm/mmap.c c5/mm/mmap.c --- 99-pre5/mm/mmap.c Fri Mar 24 18:48:50 2000 +++ c5/mm/mmap.c Wed Apr 19 19:06:09 2000 @@ -220,8 +220,7 @@ default: return -EINVAL; } - } else if ((flags & MAP_TYPE) != MAP_PRIVATE) - return -EINVAL; + } /* Obtain the address to map to. we verify (or select) it and ensure * that it represents a valid section of the address space. @@ -269,8 +268,11 @@ if (!(file->f_mode & FMODE_WRITE)) vma->vm_flags &= ~(VM_MAYWRITE | VM_SHARED); } - } else + } else { vma->vm_flags |= VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC; + if (flags & MAP_SHARED) + vma->vm_flags |= VM_SHARED | VM_MAYSHARE; + } vma->vm_page_prot = protection_map[vma->vm_flags & 0x0f]; vma->vm_ops = NULL; vma->vm_pgoff = pgoff; @@ -316,6 +318,8 @@ atomic_inc(&file->f_dentry->d_inode->i_writecount); if (error) goto unmap_and_free_vma; + } else if (flags & MAP_SHARED) { + error = map_zero_setup (vma); } /*