 arch/ia64/ia32/ia32priv.h         |    8 ++++----
 arch/ia64/ia32/sys_ia32.c         |    8 +++++---
 arch/mips/kernel/linux32.c        |    7 +++++--
 arch/parisc/hpux/fs.c             |    9 +++++++--
 arch/parisc/hpux/sys_hpux.c       |    2 +-
 arch/parisc/kernel/sys_parisc32.c |    7 ++++---
 arch/ppc64/kernel/sys_ppc32.c     |    8 ++++----
 arch/s390/kernel/compat_linux.c   |    7 +++++--
 arch/sparc64/kernel/sys_sparc32.c |    3 ++-
 arch/sparc64/solaris/fs.c         |   11 +++++++----
 arch/x86_64/ia32/sys_ia32.c       |    6 ++++--
 drivers/block/loop.c              |    4 ++--
 drivers/md/dm-ioctl-v4.c          |    8 ++++----
 drivers/md/dm-table.c             |    2 ++
 drivers/md/md.c                   |   15 ++++++++++-----
 fs/bfs/inode.c                    |    4 +++-
 fs/coda/cnode.c                   |    2 +-
 fs/coda/upcall.c                  |    2 +-
 fs/efs/inode.c                    |   27 ++++++++++++---------------
 fs/ext2/inode.c                   |   20 ++++++++++++++++----
 fs/ext2/namei.c                   |    2 +-
 fs/ext3/inode.c                   |   21 ++++++++++++++++-----
 fs/ext3/namei.c                   |    2 +-
 fs/ext3/super.c                   |    2 +-
 fs/hpfs/inode.c                   |    4 ++--
 fs/hpfs/namei.c                   |    2 +-
 fs/jffs2/file.c                   |    3 +--
 fs/jfs/jfs_imap.c                 |    2 +-
 fs/jfs/jfs_mount.c                |    6 +++---
 fs/jfs/jfs_txnmgr.c               |    2 +-
 fs/jfs/namei.c                    |    4 ++--
 fs/jfs/super.c                    |    3 +++
 fs/namei.c                        |    2 +-
 fs/ncpfs/dir.c                    |    6 +++---
 fs/ncpfs/inode.c                  |    2 +-
 fs/nfs/dir.c                      |    2 +-
 fs/nfs/nfs2xdr.c                  |    2 +-
 fs/nfs/nfs3xdr.c                  |    2 ++
 fs/nfs/nfs4xdr.c                  |    2 ++
 fs/nfs/proc.c                     |    2 +-
 fs/nfsd/nfs3xdr.c                 |    4 ++--
 fs/nfsd/nfsproc.c                 |    7 +------
 fs/nfsd/nfsxdr.c                  |    4 ++--
 fs/reiserfs/inode.c               |    6 +++---
 fs/reiserfs/journal.c             |    2 +-
 fs/reiserfs/namei.c               |    2 +-
 fs/smbfs/dir.c                    |    2 +-
 fs/smbfs/proc.c                   |    3 +++
 fs/stat.c                         |   28 ++++++++++++++++++++++++++--
 fs/super.c                        |    2 +-
 fs/xfs/xfs_vfsops.c               |    6 ++++--
 include/asm-arm26/stat.h          |    6 ++----
 include/asm-h8300/stat.h          |    6 ++----
 init/do_mounts.c                  |    8 ++++++--
 init/do_mounts.h                  |   27 ++++++++++++++++++++++++++-
 init/do_mounts_devfs.c            |    9 ++-------
 init/do_mounts_initrd.c           |    6 +++---
 init/do_mounts_md.c               |    8 ++++----
 init/initramfs.c                  |    2 +-
 59 files changed, 235 insertions(+), 136 deletions(-)

diff -puN arch/ia64/ia32/ia32priv.h~KD43-real32-B5 arch/ia64/ia32/ia32priv.h
--- 25-power4/arch/ia64/ia32/ia32priv.h~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/arch/ia64/ia32/ia32priv.h	2003-09-22 00:13:03.000000000 -0700
@@ -168,15 +168,15 @@ struct ucontext_ia32 {
 };
 
 struct stat64 {
-	unsigned short	st_dev;
-	unsigned char	__pad0[10];
+	unsigned long long	st_dev;
+	unsigned char	__pad0[4];
 	unsigned int	__st_ino;
 	unsigned int	st_mode;
 	unsigned int	st_nlink;
 	unsigned int	st_uid;
 	unsigned int	st_gid;
-	unsigned short	st_rdev;
-	unsigned char	__pad3[10];
+	unsigned long long	st_rdev;
+	unsigned char	__pad3[4];
 	unsigned int	st_size_lo;
 	unsigned int	st_size_hi;
 	unsigned int	st_blksize;
diff -puN arch/ia64/ia32/sys_ia32.c~KD43-real32-B5 arch/ia64/ia32/sys_ia32.c
--- 25-power4/arch/ia64/ia32/sys_ia32.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/arch/ia64/ia32/sys_ia32.c	2003-09-22 00:13:03.000000000 -0700
@@ -180,7 +180,9 @@ int cp_compat_stat(struct kstat *stat, s
 {
 	int err;
 
-	if ((u64) stat->size > MAX_NON_LFS)
+	if ((u64) stat->size > MAX_NON_LFS ||
+	    !old_valid_dev(stat->dev) ||
+	    !old_valid_dev(stat->rdev))
 		return -EOVERFLOW;
 
 	if (clear_user(ubuf, sizeof(*ubuf)))
@@ -2488,7 +2490,7 @@ putstat64 (struct stat64 *ubuf, struct k
 	if (clear_user(ubuf, sizeof(*ubuf)))
 		return -EFAULT;
 
-	err  = __put_user(old_encode_dev(kbuf->dev), &ubuf->st_dev);
+	err  = __put_user(huge_encode_dev(kbuf->dev), &ubuf->st_dev);
 	err |= __put_user(kbuf->ino, &ubuf->__st_ino);
 	err |= __put_user(kbuf->ino, &ubuf->st_ino_lo);
 	err |= __put_user(kbuf->ino >> 32, &ubuf->st_ino_hi);
@@ -2496,7 +2498,7 @@ putstat64 (struct stat64 *ubuf, struct k
 	err |= __put_user(kbuf->nlink, &ubuf->st_nlink);
 	err |= __put_user(kbuf->uid, &ubuf->st_uid);
 	err |= __put_user(kbuf->gid, &ubuf->st_gid);
-	err |= __put_user(old_encode_dev(kbuf->rdev), &ubuf->st_rdev);
+	err |= __put_user(huge_encode_dev(kbuf->rdev), &ubuf->st_rdev);
 	err |= __put_user(kbuf->size, &ubuf->st_size_lo);
 	err |= __put_user((kbuf->size >> 32), &ubuf->st_size_hi);
 	err |= __put_user(kbuf->atime.tv_sec, &ubuf->st_atime);
diff -puN arch/mips/kernel/linux32.c~KD43-real32-B5 arch/mips/kernel/linux32.c
--- 25-power4/arch/mips/kernel/linux32.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/arch/mips/kernel/linux32.c	2003-09-22 00:13:03.000000000 -0700
@@ -71,14 +71,17 @@ int cp_compat_stat(struct kstat *stat, s
 {
 	struct compat_stat tmp;
 
+	if (!new_valid_dev(stat->dev) || !new_valid_dev(stat->rdev))
+		return -EOVERFLOW;
+
 	memset(&tmp, 0, sizeof(tmp));
-	tmp.st_dev = old_encode_dev(stat->dev);
+	tmp.st_dev = new_encode_dev(stat->dev);
 	tmp.st_ino = stat->ino;
 	tmp.st_mode = stat->mode;
 	tmp.st_nlink = stat->nlink;
 	SET_STAT_UID(tmp, stat->uid);
 	SET_STAT_GID(tmp, stat->gid);
-	tmp.st_rdev = old_encode_dev(stat->rdev);
+	tmp.st_rdev = new_encode_dev(stat->rdev);
 	tmp.st_size = stat->size;
 	tmp.st_atime = stat->atime.tv_sec;
 	tmp.st_mtime = stat->mtime.tv_sec;
diff -puN arch/parisc/hpux/fs.c~KD43-real32-B5 arch/parisc/hpux/fs.c
--- 25-power4/arch/parisc/hpux/fs.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/arch/parisc/hpux/fs.c	2003-09-22 00:13:03.000000000 -0700
@@ -123,14 +123,19 @@ static int cp_hpux_stat(struct kstat *st
 {
 	struct hpux_stat64 tmp;
 
+	/* we probably want a different split here - is hpux 12:20? */
+
+	if (!new_valid_dev(stat->dev) || !new_valid_dev(stat->rdev))
+		return -EOVERFLOW;
+
 	memset(&tmp, 0, sizeof(tmp));
-	tmp.st_dev = old_encode_dev(stat->dev);
+	tmp.st_dev = new_encode_dev(stat->dev);
 	tmp.st_ino = stat->ino;
 	tmp.st_mode = stat->mode;
 	tmp.st_nlink = stat->nlink;
 	tmp.st_uid = stat->uid;
 	tmp.st_gid = stat->gid;
-	tmp.st_rdev = old_encode_dev(stat->rdev);
+	tmp.st_rdev = new_encode_dev(stat->rdev);
 	tmp.st_size = stat->size;
 	tmp.st_atime = stat->atime.tv_sec;
 	tmp.st_mtime = stat->mtime.tv_sec;
diff -puN arch/parisc/hpux/sys_hpux.c~KD43-real32-B5 arch/parisc/hpux/sys_hpux.c
--- 25-power4/arch/parisc/hpux/sys_hpux.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/arch/parisc/hpux/sys_hpux.c	2003-09-22 00:13:03.000000000 -0700
@@ -272,7 +272,7 @@ int hpux_utssys(char *ubuf, int n, int t
 		break ;
 	case 2:
 		/*  ustat():  */
-		return( hpux_ustat(old_decode_dev(n), (struct hpux_ustat *)ubuf) );
+		return( hpux_ustat(new_decode_dev(n), (struct hpux_ustat *)ubuf) );
 		break ;
 	case 3:
 		/*  setuname():
diff -puN arch/parisc/kernel/sys_parisc32.c~KD43-real32-B5 arch/parisc/kernel/sys_parisc32.c
--- 25-power4/arch/parisc/kernel/sys_parisc32.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/arch/parisc/kernel/sys_parisc32.c	2003-09-22 00:13:03.000000000 -0700
@@ -439,16 +439,17 @@ int cp_compat_stat(struct kstat *stat, s
 {
 	int err;
 
-	if (stat->size > MAX_NON_LFS)
+	if (stat->size > MAX_NON_LFS || !new_valid_dev(stat->dev) ||
+	    !new_valid_dev(stat->rdev))
 		return -EOVERFLOW;
 
-	err  = put_user(old_encode_dev(stat->dev), &statbuf->st_dev);
+	err  = put_user(new_encode_dev(stat->dev), &statbuf->st_dev);
 	err |= put_user(stat->ino, &statbuf->st_ino);
 	err |= put_user(stat->mode, &statbuf->st_mode);
 	err |= put_user(stat->nlink, &statbuf->st_nlink);
 	err |= put_user(0, &statbuf->st_reserved1);
 	err |= put_user(0, &statbuf->st_reserved2);
-	err |= put_user(old_encode_dev(stat->rdev), &statbuf->st_rdev);
+	err |= put_user(new_encode_dev(stat->rdev), &statbuf->st_rdev);
 	err |= put_user(stat->size, &statbuf->st_size);
 	err |= put_user(stat->atime.tv_sec, &statbuf->st_atime);
 	err |= put_user(stat->atime.tv_nsec, &statbuf->st_atime_nsec);
diff -puN arch/ppc64/kernel/sys_ppc32.c~KD43-real32-B5 arch/ppc64/kernel/sys_ppc32.c
--- 25-power4/arch/ppc64/kernel/sys_ppc32.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/arch/ppc64/kernel/sys_ppc32.c	2003-09-22 00:13:03.000000000 -0700
@@ -748,16 +748,16 @@ int cp_compat_stat(struct kstat *stat, s
 {
 	int err;
 
-	if (stat->size > MAX_NON_LFS)
-		return -EOVERFLOW;
+	if (stat->size > MAX_NON_LFS || !new_valid_dev(stat->dev) ||
+	    !new_valid_dev(stat->rdev))
 
-	err  = put_user(old_encode_dev(stat->dev), &statbuf->st_dev);
+	err  = put_user(new_encode_dev(stat->dev), &statbuf->st_dev);
 	err |= put_user(stat->ino, &statbuf->st_ino);
 	err |= put_user(stat->mode, &statbuf->st_mode);
 	err |= put_user(stat->nlink, &statbuf->st_nlink);
 	err |= put_user(stat->uid, &statbuf->st_uid);
 	err |= put_user(stat->gid, &statbuf->st_gid);
-	err |= put_user(old_encode_dev(stat->rdev), &statbuf->st_rdev);
+	err |= put_user(new_encode_dev(stat->rdev), &statbuf->st_rdev);
 	err |= put_user(stat->size, &statbuf->st_size);
 	err |= put_user(stat->atime.tv_sec, &statbuf->st_atime);
 	err |= put_user(0, &statbuf->__unused1);
diff -puN arch/s390/kernel/compat_linux.c~KD43-real32-B5 arch/s390/kernel/compat_linux.c
--- 25-power4/arch/s390/kernel/compat_linux.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/arch/s390/kernel/compat_linux.c	2003-09-22 00:13:03.000000000 -0700
@@ -1316,6 +1316,9 @@ int cp_compat_stat(struct kstat *stat, s
 {
 	int err;
 
+	if (!old_valid_dev(stat->dev) || !old_valid_dev(stat->rdev))
+		return -EOVERFLOW;
+
 	err = put_user(old_encode_dev(stat->dev), &statbuf->st_dev);
 	err |= put_user(stat->ino, &statbuf->st_ino);
 	err |= put_user(stat->mode, &statbuf->st_mode);
@@ -2573,14 +2576,14 @@ static int cp_stat64(struct stat64_emu31
 
 	memset(&tmp, 0, sizeof(tmp));
 
-	tmp.st_dev = old_encode_dev(stat->dev);
+	tmp.st_dev = huge_encode_dev(stat->dev);
 	tmp.st_ino = stat->ino;
 	tmp.__st_ino = (u32)stat->ino;
 	tmp.st_mode = stat->mode;
 	tmp.st_nlink = (unsigned int)stat->nlink;
 	tmp.uid = stat->uid;
 	tmp.gid = stat->gid;
-	tmp.st_rdev = old_encode_dev(stat->rdev);
+	tmp.st_rdev = huge_encode_dev(stat->rdev);
 	tmp.st_size = stat->st_size;
 	tmp.st_blksize = (u32)stat->blksize;
 	tmp.st_blocks = (u32)stat->blocks;
diff -puN arch/sparc64/kernel/sys_sparc32.c~KD43-real32-B5 arch/sparc64/kernel/sys_sparc32.c
--- 25-power4/arch/sparc64/kernel/sys_sparc32.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/arch/sparc64/kernel/sys_sparc32.c	2003-09-22 00:13:03.000000000 -0700
@@ -1304,7 +1304,8 @@ int cp_compat_stat(struct kstat *stat, s
 {
 	int err;
 
-	if (stat->size > MAX_NON_LFS)
+	if (stat->size > MAX_NON_LFS || !old_valid_dev(stat->dev) ||
+	    !old_valid_dev(stat->rdev))
 		return -EOVERFLOW;
 
 	err  = put_user(old_encode_dev(stat->dev), &statbuf->st_dev);
diff -puN arch/sparc64/solaris/fs.c~KD43-real32-B5 arch/sparc64/solaris/fs.c
--- 25-power4/arch/sparc64/solaris/fs.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/arch/sparc64/solaris/fs.c	2003-09-22 00:13:03.000000000 -0700
@@ -248,11 +248,14 @@ asmlinkage int solaris_mknod(u32 path, u
 {
 	int (*sys_mknod)(const char *,int,unsigned) = 
 		(int (*)(const char *,int,unsigned))SYS(mknod);
-	int major, minor;
+	int major = sysv_major(dev);
+	int minor = sysv_minor(dev);
 
-	if ((major = sysv_major(dev)) > 255 || 
-	    (minor = sysv_minor(dev)) > 255) return -EINVAL;
-	return sys_mknod((const char *)A(path), mode, old_encode_dev(MKDEV(major,minor)));
+	/* minor is guaranteed to be OK for MKDEV, major might be not */
+	if (major > 0xfff)
+		return -EINVAL;
+	return sys_mknod((const char *)A(path), mode,
+				new_encode_dev(MKDEV(major,minor)));
 }
 
 asmlinkage int solaris_xmknod(int vers, u32 path, u32 mode, s32 dev)
diff -puN arch/x86_64/ia32/sys_ia32.c~KD43-real32-B5 arch/x86_64/ia32/sys_ia32.c
--- 25-power4/arch/x86_64/ia32/sys_ia32.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/arch/x86_64/ia32/sys_ia32.c	2003-09-22 00:13:03.000000000 -0700
@@ -91,6 +91,8 @@ extern int overflowuid,overflowgid; 
 
 int cp_compat_stat(struct kstat *kbuf, struct compat_stat *ubuf)
 {
+	if (!old_valid_dev(kbuf->dev) || !old_valid_dev(kbuf->rdev))
+		return -EOVERFLOW;
 	if (verify_area(VERIFY_WRITE, ubuf, sizeof(struct compat_stat)) ||
 	    __put_user (old_encode_dev(kbuf->dev), &ubuf->st_dev) ||
 	    __put_user (kbuf->ino, &ubuf->st_ino) ||
@@ -119,14 +121,14 @@ static int
 cp_stat64(struct stat64 *ubuf, struct kstat *stat)
 {
 	if (verify_area(VERIFY_WRITE, ubuf, sizeof(struct stat64)) ||
-	    __put_user(old_encode_dev(stat->dev), &ubuf->st_dev) ||
+	    __put_user(huge_encode_dev(stat->dev), &ubuf->st_dev) ||
 	    __put_user (stat->ino, &ubuf->__st_ino) ||
 	    __put_user (stat->ino, &ubuf->st_ino) ||
 	    __put_user (stat->mode, &ubuf->st_mode) ||
 	    __put_user (stat->nlink, &ubuf->st_nlink) ||
 	    __put_user (stat->uid, &ubuf->st_uid) ||
 	    __put_user (stat->gid, &ubuf->st_gid) ||
-	    __put_user (old_encode_dev(stat->rdev), &ubuf->st_rdev) ||
+	    __put_user (huge_encode_dev(stat->rdev), &ubuf->st_rdev) ||
 	    __put_user (stat->size, &ubuf->st_size) ||
 	    __put_user (stat->atime.tv_sec, &ubuf->st_atime) ||
 	    __put_user (stat->atime.tv_nsec, &ubuf->st_atime_nsec) ||
diff -puN drivers/block/loop.c~KD43-real32-B5 drivers/block/loop.c
--- 25-power4/drivers/block/loop.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/drivers/block/loop.c	2003-09-22 00:13:03.000000000 -0700
@@ -931,9 +931,9 @@ loop_get_status(struct loop_device *lo, 
 		return error;
 	memset(info, 0, sizeof(*info));
 	info->lo_number = lo->lo_number;
-	info->lo_device = old_encode_dev(stat.dev);
+	info->lo_device = huge_encode_dev(stat.dev);
 	info->lo_inode = stat.ino;
-	info->lo_rdevice = old_encode_dev(lo->lo_device ? stat.rdev : stat.dev);
+	info->lo_rdevice = huge_encode_dev(lo->lo_device ? stat.rdev : stat.dev);
 	info->lo_offset = lo->lo_offset;
 	info->lo_sizelimit = lo->lo_sizelimit;
 	info->lo_flags = lo->lo_flags;
diff -puN drivers/md/dm-ioctl-v4.c~KD43-real32-B5 drivers/md/dm-ioctl-v4.c
--- 25-power4/drivers/md/dm-ioctl-v4.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/drivers/md/dm-ioctl-v4.c	2003-09-22 00:13:03.000000000 -0700
@@ -401,7 +401,7 @@ static int list_devices(struct dm_ioctl 
 				old_nl->next = (uint32_t) ((void *) nl -
 							   (void *) old_nl);
 			disk = dm_disk(hc->md);
-			nl->dev = old_encode_dev(MKDEV(disk->major, disk->first_minor));
+			nl->dev = huge_encode_dev(MKDEV(disk->major, disk->first_minor));
 			nl->next = 0;
 			strcpy(nl->name, hc->name);
 
@@ -445,7 +445,7 @@ static int __dev_status(struct mapped_de
 	if (!bdev)
 		return -ENXIO;
 
-	param->dev = old_encode_dev(MKDEV(disk->major, disk->first_minor));
+	param->dev = huge_encode_dev(MKDEV(disk->major, disk->first_minor));
 
 	/*
 	 * Yes, this will be out of date by the time it gets back
@@ -481,7 +481,7 @@ static int dev_create(struct dm_ioctl *p
 		return r;
 
 	if (param->flags & DM_PERSISTENT_DEV_FLAG)
-		r = dm_create_with_minor(MINOR(old_decode_dev(param->dev)), &md);
+		r = dm_create_with_minor(MINOR(huge_decode_dev(param->dev)), &md);
 	else
 		r = dm_create(&md);
 
@@ -886,7 +886,7 @@ static void retrieve_deps(struct dm_tabl
 	count = 0;
 	list_for_each(tmp, dm_table_get_devices(table)) {
 		struct dm_dev *dd = list_entry(tmp, struct dm_dev, list);
-		deps->dev[count++] = old_encode_dev(dd->bdev->bd_dev);
+		deps->dev[count++] = huge_encode_dev(dd->bdev->bd_dev);
 	}
 
 	param->data_size = param->data_start + needed;
diff -puN drivers/md/dm-table.c~KD43-real32-B5 drivers/md/dm-table.c
--- 25-power4/drivers/md/dm-table.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/drivers/md/dm-table.c	2003-09-22 00:13:03.000000000 -0700
@@ -426,6 +426,8 @@ static int __table_get_device(struct dm_
 	if (sscanf(path, "%u:%u", &major, &minor) == 2) {
 		/* Extract the major/minor numbers */
 		dev = MKDEV(major, minor);
+		if (MAJOR(dev) != major || MINOR(dev) != minor)
+			return -EOVERFLOW;
 	} else {
 		/* convert the path to a device */
 		if ((r = lookup_device(path, &dev)))
diff -puN drivers/md/md.c~KD43-real32-B5 drivers/md/md.c
--- 25-power4/drivers/md/md.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/drivers/md/md.c	2003-09-22 00:13:03.000000000 -0700
@@ -1881,6 +1881,8 @@ static int autostart_array(dev_t startde
 			continue;
 		if (dev == startdev)
 			continue;
+		if (MAJOR(dev) != desc->major || MINOR(dev) != desc->minor)
+			continue;
 		rdev = md_import_device(dev, 0, 0);
 		if (IS_ERR(rdev)) {
 			printk(KERN_WARNING "md: could not import %s,"
@@ -2005,6 +2007,9 @@ static int add_new_disk(mddev_t * mddev,
 	mdk_rdev_t *rdev;
 	dev_t dev = MKDEV(info->major,info->minor);
 
+	if (info->major != MAJOR(dev) || info->minor != MINOR(dev))
+		return -EOVERFLOW;
+
 	if (!mddev->raid_disks) {
 		int err;
 		/* expecting a device which has a superblock */
@@ -2403,7 +2408,7 @@ static int md_ioctl(struct inode *inode,
 		/* START_ARRAY doesn't need to lock the array as autostart_array
 		 * does the locking, and it could even be a different array
 		 */
-		err = autostart_array(old_decode_dev(arg));
+		err = autostart_array(new_decode_dev(arg));
 		if (err) {
 			printk(KERN_WARNING "md: autostart %s failed!\n",
 				__bdevname(arg, b));
@@ -2540,18 +2545,18 @@ static int md_ioctl(struct inode *inode,
 			goto done_unlock;
 		}
 		case HOT_GENERATE_ERROR:
-			err = hot_generate_error(mddev, old_decode_dev(arg));
+			err = hot_generate_error(mddev, new_decode_dev(arg));
 			goto done_unlock;
 		case HOT_REMOVE_DISK:
-			err = hot_remove_disk(mddev, old_decode_dev(arg));
+			err = hot_remove_disk(mddev, new_decode_dev(arg));
 			goto done_unlock;
 
 		case HOT_ADD_DISK:
-			err = hot_add_disk(mddev, old_decode_dev(arg));
+			err = hot_add_disk(mddev, new_decode_dev(arg));
 			goto done_unlock;
 
 		case SET_DISK_FAULTY:
-			err = set_disk_faulty(mddev, old_decode_dev(arg));
+			err = set_disk_faulty(mddev, new_decode_dev(arg));
 			goto done_unlock;
 
 		case RUN_ARRAY:
diff -puN fs/bfs/inode.c~KD43-real32-B5 fs/bfs/inode.c
--- 25-power4/fs/bfs/inode.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/bfs/inode.c	2003-09-22 00:13:03.000000000 -0700
@@ -194,13 +194,15 @@ static void bfs_put_super(struct super_b
 static int bfs_statfs(struct super_block *s, struct kstatfs *buf)
 {
 	struct bfs_sb_info *info = BFS_SB(s);
+	u64 id = huge_encode_dev(s->s_bdev->bd_dev);
 	buf->f_type = BFS_MAGIC;
 	buf->f_bsize = s->s_blocksize;
 	buf->f_blocks = info->si_blocks;
 	buf->f_bfree = buf->f_bavail = info->si_freeb;
 	buf->f_files = info->si_lasti + 1 - BFS_ROOT_INO;
 	buf->f_ffree = info->si_freei;
-	buf->f_fsid.val[0] = old_encode_dev(s->s_dev);
+	buf->f_fsid.val[0] = (u32)id;
+	buf->f_fsid.val[1] = (u32)(id >> 32);
 	buf->f_namelen = BFS_NAMELEN;
 	return 0;
 }
diff -puN fs/coda/cnode.c~KD43-real32-B5 fs/coda/cnode.c
--- 25-power4/fs/coda/cnode.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/coda/cnode.c	2003-09-22 00:13:03.000000000 -0700
@@ -38,7 +38,7 @@ static void coda_fill_inode(struct inode
 		inode->i_data.a_ops = &coda_symlink_aops;
 		inode->i_mapping = &inode->i_data;
 	} else
-                init_special_inode(inode, inode->i_mode, old_decode_dev(attr->va_rdev));
+                init_special_inode(inode, inode->i_mode, huge_decode_dev(attr->va_rdev));
 }
 
 static int coda_test_inode(struct inode *inode, void *data)
diff -puN fs/coda/upcall.c~KD43-real32-B5 fs/coda/upcall.c
--- 25-power4/fs/coda/upcall.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/coda/upcall.c	2003-09-22 00:13:03.000000000 -0700
@@ -345,7 +345,7 @@ int venus_create(struct super_block *sb,
 
         inp->coda_create.VFid = *dirfid;
         inp->coda_create.attr.va_mode = mode;
-        inp->coda_create.attr.va_rdev = old_encode_dev(rdev);
+        inp->coda_create.attr.va_rdev = huge_encode_dev(rdev);
 	inp->coda_create.excl = excl;
         inp->coda_create.mode = mode;
         inp->coda_create.name = offset;
diff -puN fs/efs/inode.c~KD43-real32-B5 fs/efs/inode.c
--- 25-power4/fs/efs/inode.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/efs/inode.c	2003-09-22 00:13:03.000000000 -0700
@@ -47,9 +47,11 @@ static inline void extent_copy(efs_exten
 	return;
 }
 
-void efs_read_inode(struct inode *inode) {
+void efs_read_inode(struct inode *inode)
+{
 	int i, inode_index;
 	dev_t device;
+	u32 rdev;
 	struct buffer_head *bh;
 	struct efs_sb_info    *sb = SUPER_INFO(inode->i_sb);
 	struct efs_inode_info *in = INODE_INFO(inode);
@@ -104,20 +106,15 @@ void efs_read_inode(struct inode *inode)
 		inode->i_blocks = ((inode->i_size - 1) >> EFS_BLOCKSIZE_BITS) + 1;
 	}
 
-	/*
-	 * BUG: irix dev_t is 32-bits. linux dev_t is only 16-bits.
-	 *
-	 * apparently linux will change to 32-bit dev_t sometime during
-	 * linux 2.3.
-	 *
-	 * as is, this code maps devices that can't be represented in
-	 * 16-bits (ie major > 255 or minor > 255) to major = minor = 255.
-	 *
-	 * during 2.3 when 32-bit dev_t become available, we should test
-	 * to see whether odev contains 65535. if this is the case then we
-	 * should then do device = be32_to_cpu(efs_inode->di_u.di_dev.ndev).
-	 */
-    	device = old_decode_dev(be16_to_cpu(efs_inode->di_u.di_dev.odev));
+	rdev = be16_to_cpu(efs_inode->di_u.di_dev.odev);
+	if (rdev == 0xffff) {
+		rdev = be32_to_cpu(efs_inode->di_u.di_dev.ndev);
+		if (sysv_major(rdev) > 0xfff)
+			device = 0;
+		else
+			device = MKDEV(sysv_major(rdev), sysv_minor(rdev));
+	} else
+		device = old_decode_dev(rdev);
 
 	/* get the number of extents for this object */
 	in->numextents = be16_to_cpu(efs_inode->di_numextents);
diff -puN fs/ext2/inode.c~KD43-real32-B5 fs/ext2/inode.c
--- 25-power4/fs/ext2/inode.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/ext2/inode.c	2003-09-22 00:13:03.000000000 -0700
@@ -1126,8 +1126,12 @@ void ext2_read_inode (struct inode * ino
 		}
 	} else {
 		inode->i_op = &ext2_special_inode_operations;
-		init_special_inode(inode, inode->i_mode,
+		if (raw_inode->i_block[0])
+			init_special_inode(inode, inode->i_mode,
 			   old_decode_dev(le32_to_cpu(raw_inode->i_block[0])));
+		else 
+			init_special_inode(inode, inode->i_mode,
+			   new_decode_dev(le32_to_cpu(raw_inode->i_block[1])));
 	}
 	brelse (bh);
 	ext2_set_inode_flags(inode);
@@ -1215,9 +1219,17 @@ static int ext2_update_inode(struct inod
 	}
 	
 	raw_inode->i_generation = cpu_to_le32(inode->i_generation);
-	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
-		raw_inode->i_block[0] = cpu_to_le32(old_encode_dev(inode->i_rdev));
-	else for (n = 0; n < EXT2_N_BLOCKS; n++)
+	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
+		if (old_valid_dev(inode->i_rdev)) {
+			raw_inode->i_block[0] =
+				cpu_to_le32(old_encode_dev(inode->i_rdev));
+			raw_inode->i_block[1] = 0;
+		} else {
+			raw_inode->i_block[0] = 0;
+			raw_inode->i_block[1] =
+				cpu_to_le32(new_encode_dev(inode->i_rdev));
+		}
+	} else for (n = 0; n < EXT2_N_BLOCKS; n++)
 		raw_inode->i_block[n] = ei->i_data[n];
 	mark_buffer_dirty(bh);
 	if (do_sync) {
diff -puN fs/ext2/namei.c~KD43-real32-B5 fs/ext2/namei.c
--- 25-power4/fs/ext2/namei.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/ext2/namei.c	2003-09-22 00:13:03.000000000 -0700
@@ -142,7 +142,7 @@ static int ext2_mknod (struct inode * di
 	struct inode * inode;
 	int err;
 
-	if (!old_valid_dev(rdev))
+	if (!new_valid_dev(rdev))
 		return -EINVAL;
 
 	inode = ext2_new_inode (dir, mode);
diff -puN fs/ext3/inode.c~KD43-real32-B5 fs/ext3/inode.c
--- 25-power4/fs/ext3/inode.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/ext3/inode.c	2003-09-22 00:13:03.000000000 -0700
@@ -2565,8 +2565,12 @@ void ext3_read_inode(struct inode * inod
 		}
 	} else {
 		inode->i_op = &ext3_special_inode_operations;
-		init_special_inode(inode, inode->i_mode,
+		if (raw_inode->i_block[0])
+			init_special_inode(inode, inode->i_mode,
 			   old_decode_dev(le32_to_cpu(raw_inode->i_block[0])));
+		else 
+			init_special_inode(inode, inode->i_mode,
+			   new_decode_dev(le32_to_cpu(raw_inode->i_block[1])));
 	}
 	brelse (iloc.bh);
 	ext3_set_inode_flags(inode);
@@ -2666,10 +2670,17 @@ static int ext3_do_update_inode(handle_t
 		}
 	}
 	raw_inode->i_generation = cpu_to_le32(inode->i_generation);
-	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
-		raw_inode->i_block[0] =
-			cpu_to_le32(old_encode_dev(inode->i_rdev));
-	else for (block = 0; block < EXT3_N_BLOCKS; block++)
+	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
+		if (old_valid_dev(inode->i_rdev)) {
+			raw_inode->i_block[0] =
+				cpu_to_le32(old_encode_dev(inode->i_rdev));
+			raw_inode->i_block[1] = 0;
+		} else {
+			raw_inode->i_block[0] = 0;
+			raw_inode->i_block[1] =
+				cpu_to_le32(new_encode_dev(inode->i_rdev));
+		}
+	} else for (block = 0; block < EXT3_N_BLOCKS; block++)
 		raw_inode->i_block[block] = ei->i_data[block];
 
 	BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
diff -puN fs/ext3/namei.c~KD43-real32-B5 fs/ext3/namei.c
--- 25-power4/fs/ext3/namei.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/ext3/namei.c	2003-09-22 00:13:03.000000000 -0700
@@ -1659,7 +1659,7 @@ static int ext3_mknod (struct inode * di
 	struct inode *inode;
 	int err;
 
-	if (!old_valid_dev(rdev))
+	if (!new_valid_dev(rdev))
 		return -EINVAL;
 
 	handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS +
diff -puN fs/ext3/super.c~KD43-real32-B5 fs/ext3/super.c
--- 25-power4/fs/ext3/super.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/ext3/super.c	2003-09-22 00:13:03.000000000 -0700
@@ -1551,7 +1551,7 @@ static int ext3_load_journal(struct supe
 {
 	journal_t *journal;
 	int journal_inum = le32_to_cpu(es->s_journal_inum);
-	dev_t journal_dev = old_decode_dev(le32_to_cpu(es->s_journal_dev));
+	dev_t journal_dev = new_decode_dev(le32_to_cpu(es->s_journal_dev));
 	int err = 0;
 	int really_read_only;
 
diff -puN fs/hpfs/inode.c~KD43-real32-B5 fs/hpfs/inode.c
--- 25-power4/fs/hpfs/inode.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/hpfs/inode.c	2003-09-22 00:13:03.000000000 -0700
@@ -159,7 +159,7 @@ void hpfs_read_inode(struct inode *i)
 				i->i_size = 0;
 				i->i_blocks = 1;
 				init_special_inode(i, mode,
-					old_decode_dev(rdev));
+					new_decode_dev(rdev));
 				return;
 			}
 		}
@@ -223,7 +223,7 @@ void hpfs_write_inode_ea(struct inode *i
 				hpfs_inode->i_ea_mode = 1;
 			}
 		if (S_ISBLK(i->i_mode) || S_ISCHR(i->i_mode)) {
-			ea = cpu_to_le32(old_encode_dev(i->i_rdev));
+			ea = cpu_to_le32(new_encode_dev(i->i_rdev));
 			hpfs_set_ea(i, fnode, "DEV", (char *)&ea, 4);
 		}
 	}
diff -puN fs/hpfs/namei.c~KD43-real32-B5 fs/hpfs/namei.c
--- 25-power4/fs/hpfs/namei.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/hpfs/namei.c	2003-09-22 00:13:03.000000000 -0700
@@ -194,7 +194,7 @@ int hpfs_mknod(struct inode *dir, struct
 	int err;
 	if ((err = hpfs_chk_name((char *)name, &len))) return err==-ENOENT ? -EINVAL : err;
 	if (hpfs_sb(dir->i_sb)->sb_eas < 2) return -EPERM;
-	if (!old_valid_dev(rdev))
+	if (!new_valid_dev(rdev))
 		return -EINVAL;
 	lock_kernel();
 	if (!(fnode = hpfs_alloc_fnode(dir->i_sb, hpfs_i(dir)->i_dno, &fno, &bh))) goto bail;
diff -puN fs/jffs2/file.c~KD43-real32-B5 fs/jffs2/file.c
--- 25-power4/fs/jffs2/file.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/jffs2/file.c	2003-09-22 00:13:03.000000000 -0700
@@ -105,8 +105,7 @@ int jffs2_setattr (struct dentry *dentry
 	   it out again with the appropriate data attached */
 	if (S_ISBLK(inode->i_mode) || S_ISCHR(inode->i_mode)) {
 		/* For these, we don't actually need to read the old node */
-		dev =  (imajor(dentry->d_inode) << 8) | 
-			iminor(dentry->d_inode);
+		dev =  old_encode_dev(dentry->d_inode->i_rdev);
 		mdata = (char *)&dev;
 		mdatalen = sizeof(dev);
 		D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of kdev_t\n", mdatalen));
diff -puN fs/jfs/jfs_imap.c~KD43-real32-B5 fs/jfs/jfs_imap.c
--- 25-power4/fs/jfs/jfs_imap.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/jfs/jfs_imap.c	2003-09-22 00:13:03.000000000 -0700
@@ -3044,7 +3044,7 @@ static int copy_from_dinode(struct dinod
 
 	if (S_ISCHR(ip->i_mode) || S_ISBLK(ip->i_mode)) {
 		jfs_ip->dev = le32_to_cpu(dip->di_rdev);
-		ip->i_rdev = old_decode_dev(jfs_ip->dev);
+		ip->i_rdev = new_decode_dev(jfs_ip->dev);
 	}
 
 	if (S_ISDIR(ip->i_mode)) {
diff -puN fs/jfs/jfs_mount.c~KD43-real32-B5 fs/jfs/jfs_mount.c
--- 25-power4/fs/jfs/jfs_mount.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/jfs/jfs_mount.c	2003-09-22 00:13:03.000000000 -0700
@@ -395,7 +395,7 @@ static int chkSuper(struct super_block *
 	if (sbi->mntflag & JFS_INLINELOG)
 		sbi->logpxd = j_sb->s_logpxd;
 	else {
-		sbi->logdev = old_decode_dev(le32_to_cpu(j_sb->s_logdev));
+		sbi->logdev = new_decode_dev(le32_to_cpu(j_sb->s_logdev));
 		memcpy(sbi->uuid, j_sb->s_uuid, sizeof(sbi->uuid));
 		memcpy(sbi->loguuid, j_sb->s_loguuid, sizeof(sbi->uuid));
 	}
@@ -444,7 +444,7 @@ int updateSuper(struct super_block *sb, 
 
 	if (state == FM_MOUNT) {
 		/* record log's dev_t and mount serial number */
-		j_sb->s_logdev = cpu_to_le32(old_encode_dev(sbi->log->bdev->bd_dev));
+		j_sb->s_logdev = cpu_to_le32(new_encode_dev(sbi->log->bdev->bd_dev));
 		j_sb->s_logserial = cpu_to_le32(sbi->log->serial);
 	} else if (state == FM_CLEAN) {
 		/*
@@ -507,7 +507,7 @@ static int logMOUNT(struct super_block *
 	lrd.backchain = 0;
 	lrd.type = cpu_to_le16(LOG_MOUNT);
 	lrd.length = 0;
-	lrd.aggregate = cpu_to_le32(old_encode_dev(sb->s_bdev->bd_dev));
+	lrd.aggregate = cpu_to_le32(new_encode_dev(sb->s_bdev->bd_dev));
 	lmLog(log, NULL, &lrd, NULL);
 
 	return 0;
diff -puN fs/jfs/jfs_txnmgr.c~KD43-real32-B5 fs/jfs/jfs_txnmgr.c
--- 25-power4/fs/jfs/jfs_txnmgr.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/jfs/jfs_txnmgr.c	2003-09-22 00:13:03.000000000 -0700
@@ -1354,7 +1354,7 @@ static int txLog(struct jfs_log * log, s
 
 		/* initialize lrd common */
 		ip = tlck->ip;
-		lrd->aggregate = cpu_to_le32(old_encode_dev(ip->i_sb->s_bdev->bd_dev));
+		lrd->aggregate = cpu_to_le32(new_encode_dev(ip->i_sb->s_bdev->bd_dev));
 		lrd->log.redopage.fileset = cpu_to_le32(JFS_IP(ip)->fileset);
 		lrd->log.redopage.inode = cpu_to_le32(ip->i_ino);
 
diff -puN fs/jfs/namei.c~KD43-real32-B5 fs/jfs/namei.c
--- 25-power4/fs/jfs/namei.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/jfs/namei.c	2003-09-22 00:13:03.000000000 -0700
@@ -1312,7 +1312,7 @@ int jfs_mknod(struct inode *dir, struct 
 	tid_t tid;
 	struct tblock *tblk;
 
-	if (!old_valid_dev(rdev))
+	if (!new_valid_dev(rdev))
 		return -EINVAL;
 
 	jfs_info("jfs_mknod: %s", dentry->d_name.name);
@@ -1344,7 +1344,7 @@ int jfs_mknod(struct inode *dir, struct 
 		goto out3;
 
 	ip->i_op = &jfs_file_inode_operations;
-	jfs_ip->dev = old_encode_dev(rdev);
+	jfs_ip->dev = new_encode_dev(rdev);
 	init_special_inode(ip, ip->i_mode, rdev);
 
 	insert_inode_hash(ip);
diff -puN fs/jfs/super.c~KD43-real32-B5 fs/jfs/super.c
--- 25-power4/fs/jfs/super.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/jfs/super.c	2003-09-22 00:13:03.000000000 -0700
@@ -307,6 +307,9 @@ static int jfs_fill_super(struct super_b
 
 	jfs_info("In jfs_read_super: s_flags=0x%lx", sb->s_flags);
 
+	if (!new_valid_dev(sb->s_bdev->bd_dev))
+		return -EOVERFLOW;
+
 	sbi = kmalloc(sizeof (struct jfs_sb_info), GFP_KERNEL);
 	if (!sbi)
 		return -ENOSPC;
diff -puN fs/namei.c~KD43-real32-B5 fs/namei.c
--- 25-power4/fs/namei.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/namei.c	2003-09-22 00:13:03.000000000 -0700
@@ -1501,7 +1501,7 @@ asmlinkage long sys_mknod(const char __u
 			break;
 		case S_IFCHR: case S_IFBLK:
 			error = vfs_mknod(nd.dentry->d_inode,dentry,mode,
-					old_decode_dev(dev));
+					new_decode_dev(dev));
 			break;
 		case S_IFIFO: case S_IFSOCK:
 			error = vfs_mknod(nd.dentry->d_inode,dentry,mode,0);
diff -puN fs/ncpfs/dir.c~KD43-real32-B5 fs/ncpfs/dir.c
--- 25-power4/fs/ncpfs/dir.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/ncpfs/dir.c	2003-09-22 00:13:03.000000000 -0700
@@ -929,10 +929,10 @@ int ncp_create_new(struct inode *dir, st
 	finfo.access = opmode;
 	if (ncp_is_nfs_extras(server, finfo.volume)) {
 		finfo.i.nfs.mode = mode;
-		finfo.i.nfs.rdev = old_encode_dev(rdev);
+		finfo.i.nfs.rdev = new_encode_dev(rdev);
 		if (ncp_modify_nfs_info(server, finfo.volume,
 					finfo.i.dirEntNum,
-					mode, old_encode_dev(rdev)) != 0)
+					mode, new_encode_dev(rdev)) != 0)
 			goto out;
 	}
 
@@ -1170,7 +1170,7 @@ out:
 static int ncp_mknod(struct inode * dir, struct dentry *dentry,
 		     int mode, dev_t rdev)
 {
-	if (!old_valid_dev(rdev))
+	if (!new_valid_dev(rdev))
 		return -EINVAL;
 	if (ncp_is_nfs_extras(NCP_SERVER(dir), NCP_FINFO(dir)->volNumber)) {
 		DPRINTK(KERN_DEBUG "ncp_mknod: mode = 0%o\n", mode);
diff -puN fs/ncpfs/inode.c~KD43-real32-B5 fs/ncpfs/inode.c
--- 25-power4/fs/ncpfs/inode.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/ncpfs/inode.c	2003-09-22 00:13:03.000000000 -0700
@@ -262,7 +262,7 @@ ncp_iget(struct super_block *sb, struct 
 #ifdef CONFIG_NCPFS_NFS_NS
 		} else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) || S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
 			init_special_inode(inode, inode->i_mode,
-				old_decode_dev(info->i.nfs.rdev));
+				new_decode_dev(info->i.nfs.rdev));
 #endif
 #if defined(CONFIG_NCPFS_EXTRAS) || defined(CONFIG_NCPFS_NFS_NS)
 		} else if (S_ISLNK(inode->i_mode)) {
diff -puN fs/nfs/dir.c~KD43-real32-B5 fs/nfs/dir.c
--- 25-power4/fs/nfs/dir.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/nfs/dir.c	2003-09-22 00:13:03.000000000 -0700
@@ -859,7 +859,7 @@ nfs_mknod(struct inode *dir, struct dent
 	dfprintk(VFS, "NFS: mknod(%s/%ld, %s\n", dir->i_sb->s_id,
 		dir->i_ino, dentry->d_name.name);
 
-	if (!old_valid_dev(rdev))
+	if (!new_valid_dev(rdev))
 		return -EINVAL;
 
 	attr.ia_mode = mode;
diff -puN fs/nfsd/nfs3xdr.c~KD43-real32-B5 fs/nfsd/nfs3xdr.c
--- 25-power4/fs/nfsd/nfs3xdr.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/nfsd/nfs3xdr.c	2003-09-22 00:13:03.000000000 -0700
@@ -189,7 +189,7 @@ encode_fattr3(struct svc_rqst *rqstp, u3
 	if (is_fsid(fhp, rqstp->rq_reffh))
 		p = xdr_encode_hyper(p, (u64) fhp->fh_export->ex_fsid);
 	else
-		p = xdr_encode_hyper(p, (u64) old_encode_dev(stat.dev));
+		p = xdr_encode_hyper(p, (u64) huge_encode_dev(stat.dev));
 	p = xdr_encode_hyper(p, (u64) stat.ino);
 	p = encode_time3(p, &stat.atime);
 	lease_get_mtime(dentry->d_inode, &time); 
@@ -223,7 +223,7 @@ encode_saved_post_attr(struct svc_rqst *
 	if (is_fsid(fhp, rqstp->rq_reffh))
 		p = xdr_encode_hyper(p, (u64) fhp->fh_export->ex_fsid);
 	else
-		p = xdr_encode_hyper(p, (u64)old_encode_dev(inode->i_sb->s_dev));
+		p = xdr_encode_hyper(p, (u64)huge_encode_dev(inode->i_sb->s_dev));
 	p = xdr_encode_hyper(p, (u64) inode->i_ino);
 	p = encode_time3(p, &fhp->fh_post_atime);
 	p = encode_time3(p, &fhp->fh_post_mtime);
diff -puN fs/nfsd/nfsproc.c~KD43-real32-B5 fs/nfsd/nfsproc.c
--- 25-power4/fs/nfsd/nfsproc.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/nfsd/nfsproc.c	2003-09-22 00:13:03.000000000 -0700
@@ -184,7 +184,7 @@ nfsd_proc_create(struct svc_rqst *rqstp,
 	struct inode	*inode;
 	struct dentry	*dchild;
 	int		nfserr, type, mode;
-	dev_t		rdev = 0, wanted = old_decode_dev(attr->ia_size);
+	dev_t		rdev = 0, wanted = new_decode_dev(attr->ia_size);
 
 	dprintk("nfsd: CREATE   %s %.*s\n",
 		SVCFH_fmt(dirfhp), argp->len, argp->name);
@@ -282,11 +282,6 @@ nfsd_proc_create(struct svc_rqst *rqstp,
 		} else if (type == S_IFCHR && !(attr->ia_valid & ATTR_SIZE)) {
 			/* If you think you've seen the worst, grok this. */
 			type = S_IFIFO;
-		} else if (!rdev && attr->ia_size != old_encode_dev(wanted)) {
-			/* dev got truncated because of 16bit Linux dev_t */
-			/* may need to change when we widen dev_t */
-			nfserr = nfserr_inval;
-			goto out_unlock;
 		} else {
 			/* Okay, char or block special */
 			is_borc = 1;
diff -puN fs/nfsd/nfsxdr.c~KD43-real32-B5 fs/nfsd/nfsxdr.c
--- 25-power4/fs/nfsd/nfsxdr.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/nfsd/nfsxdr.c	2003-09-22 00:13:03.000000000 -0700
@@ -159,14 +159,14 @@ encode_fattr(struct svc_rqst *rqstp, u32
 	}
 	*p++ = htonl((u32) stat.blksize);
 	if (S_ISCHR(type) || S_ISBLK(type))
-		*p++ = htonl((u32) old_encode_dev(stat.rdev));
+		*p++ = htonl(new_encode_dev(stat.rdev));
 	else
 		*p++ = htonl(0xffffffff);
 	*p++ = htonl((u32) stat.blocks);
 	if (is_fsid(fhp, rqstp->rq_reffh))
 		*p++ = htonl((u32) fhp->fh_export->ex_fsid);
 	else
-		*p++ = htonl((u32) old_encode_dev(stat.dev));
+		*p++ = htonl(new_encode_dev(stat.dev));
 	*p++ = htonl((u32) stat.ino);
 	*p++ = htonl((u32) stat.atime.tv_sec);
 	*p++ = htonl(stat.atime.tv_nsec ? stat.atime.tv_nsec / 1000 : 0);
diff -puN fs/nfs/nfs2xdr.c~KD43-real32-B5 fs/nfs/nfs2xdr.c
--- 25-power4/fs/nfs/nfs2xdr.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/nfs/nfs2xdr.c	2003-09-22 00:13:03.000000000 -0700
@@ -122,7 +122,7 @@ xdr_decode_fattr(u32 *p, struct nfs_fatt
 	p = xdr_decode_time(p, &fattr->mtime);
 	p = xdr_decode_time(p, &fattr->ctime);
 	fattr->valid |= NFS_ATTR_FATTR;
-	fattr->rdev = old_decode_dev(rdev);
+	fattr->rdev = new_decode_dev(rdev);
 	if (fattr->type == NFCHR && rdev == NFS2_FIFO_DEV) {
 		fattr->type = NFFIFO;
 		fattr->mode = (fattr->mode & ~S_IFMT) | S_IFIFO;
diff -puN fs/nfs/nfs3xdr.c~KD43-real32-B5 fs/nfs/nfs3xdr.c
--- 25-power4/fs/nfs/nfs3xdr.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/nfs/nfs3xdr.c	2003-09-22 00:13:03.000000000 -0700
@@ -163,6 +163,8 @@ xdr_decode_fattr(u32 *p, struct nfs_fatt
 	major = ntohl(*p++);
 	minor = ntohl(*p++);
 	fattr->rdev = MKDEV(major, minor);
+	if (MAJOR(fattr->rdev) != major || MINOR(fattr->rdev) != minor)
+		fattr->rdev = 0;
 
 	p = xdr_decode_hyper(p, &fattr->fsid_u.nfs3);
 	p = xdr_decode_hyper(p, &fattr->fileid);
diff -puN fs/nfs/nfs4xdr.c~KD43-real32-B5 fs/nfs/nfs4xdr.c
--- 25-power4/fs/nfs/nfs4xdr.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/nfs/nfs4xdr.c	2003-09-22 00:13:03.000000000 -0700
@@ -1503,6 +1503,8 @@ decode_getattr(struct xdr_stream *xdr, s
 		READ32(major);
 		READ32(minor);
 		nfp->rdev = MKDEV(major, minor);
+		if (MAJOR(nfp->rdev) != major || MINOR(nfp->rdev) != minor)
+			nfp->rdev = 0;
 		dprintk("read_attrs: rdev=%u:%u\n", major, minor);
         }
         if (bmval1 & FATTR4_WORD1_SPACE_AVAIL) {
diff -puN fs/nfs/proc.c~KD43-real32-B5 fs/nfs/proc.c
--- 25-power4/fs/nfs/proc.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/nfs/proc.c	2003-09-22 00:13:03.000000000 -0700
@@ -277,7 +277,7 @@ nfs_proc_mknod(struct inode *dir, struct
 		sattr->ia_valid &= ~ATTR_SIZE;
 	} else if (S_ISCHR(mode) || S_ISBLK(mode)) {
 		sattr->ia_valid |= ATTR_SIZE;
-		sattr->ia_size = old_encode_dev(rdev);/* get out your barf bag */
+		sattr->ia_size = new_encode_dev(rdev);/* get out your barf bag */
 	}
 
 	fattr->valid = 0;
diff -puN fs/reiserfs/inode.c~KD43-real32-B5 fs/reiserfs/inode.c
--- 25-power4/fs/reiserfs/inode.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/reiserfs/inode.c	2003-09-22 00:13:03.000000000 -0700
@@ -1055,7 +1055,7 @@ static void init_inode (struct inode * i
 	inode->i_mapping->a_ops = &reiserfs_address_space_operations;
     } else {
 	inode->i_blocks = 0;
-	init_special_inode(inode, inode->i_mode, old_decode_dev(rdev));
+	init_special_inode(inode, inode->i_mode, new_decode_dev(rdev));
     }
 }
 
@@ -1076,7 +1076,7 @@ static void inode2sd (void * sd, struct 
     set_sd_v2_ctime(sd_v2, inode->i_ctime.tv_sec );
     set_sd_v2_blocks(sd_v2, inode->i_blocks );
     if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
-	set_sd_v2_rdev(sd_v2, old_encode_dev(inode->i_rdev));
+	set_sd_v2_rdev(sd_v2, new_encode_dev(inode->i_rdev));
     else
 	set_sd_v2_generation(sd_v2, inode->i_generation);
     flags = REISERFS_I(inode)->i_attrs;
@@ -1100,7 +1100,7 @@ static void inode2sd_v1 (void * sd, stru
     set_sd_v1_mtime(sd_v1, inode->i_mtime.tv_sec );
 
     if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
-        set_sd_v1_rdev(sd_v1, old_encode_dev(inode->i_rdev));
+        set_sd_v1_rdev(sd_v1, new_encode_dev(inode->i_rdev));
     else
         set_sd_v1_blocks(sd_v1, inode->i_blocks );
 
diff -puN fs/reiserfs/journal.c~KD43-real32-B5 fs/reiserfs/journal.c
--- 25-power4/fs/reiserfs/journal.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/reiserfs/journal.c	2003-09-22 00:13:03.000000000 -0700
@@ -1916,7 +1916,7 @@ static int journal_init_dev( struct supe
 	journal -> j_dev_bd = NULL;
 	journal -> j_dev_file = NULL;
 	jdev = SB_ONDISK_JOURNAL_DEVICE( super ) ?
-		old_decode_dev(SB_ONDISK_JOURNAL_DEVICE(super)) : super->s_dev;	
+		new_decode_dev(SB_ONDISK_JOURNAL_DEVICE(super)) : super->s_dev;	
 
 	if (bdev_read_only(super->s_bdev))
 	    blkdev_mode = FMODE_READ;
diff -puN fs/reiserfs/namei.c~KD43-real32-B5 fs/reiserfs/namei.c
--- 25-power4/fs/reiserfs/namei.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/reiserfs/namei.c	2003-09-22 00:13:03.000000000 -0700
@@ -613,7 +613,7 @@ static int reiserfs_mknod (struct inode 
     struct reiserfs_transaction_handle th ;
     int jbegin_count = JOURNAL_PER_BALANCE_CNT * 3; 
 
-    if (!old_valid_dev(rdev))
+    if (!new_valid_dev(rdev))
 	return -EINVAL;
 
     if (!(inode = new_inode(dir->i_sb))) {
diff -puN fs/smbfs/dir.c~KD43-real32-B5 fs/smbfs/dir.c
--- 25-power4/fs/smbfs/dir.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/smbfs/dir.c	2003-09-22 00:13:03.000000000 -0700
@@ -661,7 +661,7 @@ smb_make_node(struct inode *dir, struct 
 	attr.ia_uid = current->euid;
 	attr.ia_gid = current->egid;
 
-	if (!old_valid_dev(dev))
+	if (!new_valid_dev(dev))
 		return -EINVAL;
 
 	smb_invalid_dir_cache(dir);
diff -puN fs/smbfs/proc.c~KD43-real32-B5 fs/smbfs/proc.c
--- 25-power4/fs/smbfs/proc.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/smbfs/proc.c	2003-09-22 00:13:03.000000000 -0700
@@ -2112,6 +2112,9 @@ void smb_decode_unix_basic(struct smb_fa
 		__u64 minor = LVAL(p, 68);
 
 		fattr->f_rdev = MKDEV(major & 0xffffffff, minor & 0xffffffff);
+		if (MAJOR(fattr->f_rdev) != (major & 0xffffffff) ||
+		    MINOR(fattr->f_rdev) != (minor & 0xffffffff))
+			fattr->f_rdev = 0;
 	}
 	fattr->f_mode |= LVAL(p, 84);
 }
diff -puN fs/stat.c~KD43-real32-B5 fs/stat.c
--- 25-power4/fs/stat.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/stat.c	2003-09-22 00:13:03.000000000 -0700
@@ -172,14 +172,30 @@ static int cp_new_stat(struct kstat *sta
 {
 	struct stat tmp;
 
+#if BITS_PER_LONG == 32
+	if (!old_valid_dev(stat->dev) || !old_valid_dev(stat->rdev))
+		return -EOVERFLOW;
+#else
+	if (!new_valid_dev(stat->dev) || !new_valid_dev(stat->rdev))
+		return -EOVERFLOW;
+#endif
+
 	memset(&tmp, 0, sizeof(tmp));
+#if BITS_PER_LONG == 32
 	tmp.st_dev = old_encode_dev(stat->dev);
+#else
+	tmp.st_dev = new_encode_dev(stat->dev);
+#endif
 	tmp.st_ino = stat->ino;
 	tmp.st_mode = stat->mode;
 	tmp.st_nlink = stat->nlink;
 	SET_STAT_UID(tmp, stat->uid);
 	SET_STAT_GID(tmp, stat->gid);
+#if BITS_PER_LONG == 32
 	tmp.st_rdev = old_encode_dev(stat->rdev);
+#else
+	tmp.st_rdev = new_encode_dev(stat->rdev);
+#endif
 #if BITS_PER_LONG == 32
 	if (stat->size > MAX_NON_LFS)
 		return -EOVERFLOW;
@@ -263,7 +279,16 @@ static long cp_new_stat64(struct kstat *
 	struct stat64 tmp;
 
 	memset(&tmp, 0, sizeof(struct stat64));
-	tmp.st_dev = old_encode_dev(stat->dev);
+#ifdef CONFIG_MIPS
+	/* mips has weird padding, so we don't get 64 bits there */
+	if (!new_valid_dev(stat->dev) || !new_valid_dev(stat->rdev))
+		return -EOVERFLOW;
+	tmp.st_dev = new_encode_dev(stat->dev);
+	tmp.st_rdev = new_encode_dev(stat->rdev);
+#else
+	tmp.st_dev = huge_encode_dev(stat->dev);
+	tmp.st_rdev = huge_encode_dev(stat->rdev);
+#endif
 	tmp.st_ino = stat->ino;
 #ifdef STAT64_HAS_BROKEN_ST_INO
 	tmp.__st_ino = stat->ino;
@@ -272,7 +297,6 @@ static long cp_new_stat64(struct kstat *
 	tmp.st_nlink = stat->nlink;
 	tmp.st_uid = stat->uid;
 	tmp.st_gid = stat->gid;
-	tmp.st_rdev = old_encode_dev(stat->rdev);
 	tmp.st_atime = stat->atime.tv_sec;
 	tmp.st_atime_nsec = stat->atime.tv_nsec;
 	tmp.st_mtime = stat->mtime.tv_sec;
diff -puN fs/super.c~KD43-real32-B5 fs/super.c
--- 25-power4/fs/super.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/super.c	2003-09-22 00:13:03.000000000 -0700
@@ -412,7 +412,7 @@ asmlinkage long sys_ustat(unsigned dev, 
         struct kstatfs sbuf;
 	int err = -EINVAL;
 
-        s = user_get_super(old_decode_dev(dev));
+        s = user_get_super(new_decode_dev(dev));
         if (s == NULL)
                 goto out;
 	err = vfs_statfs(s, &sbuf);
diff -puN fs/xfs/xfs_vfsops.c~KD43-real32-B5 fs/xfs/xfs_vfsops.c
--- 25-power4/fs/xfs/xfs_vfsops.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/fs/xfs/xfs_vfsops.c	2003-09-22 00:13:03.000000000 -0700
@@ -755,6 +755,7 @@ xfs_statvfs(
 	xfs_mount_t	*mp;
 	xfs_sb_t	*sbp;
 	unsigned long	s;
+	u64 id;
 
 	mp = XFS_BHVTOM(bdp);
 	sbp = &(mp->m_sb);
@@ -781,8 +782,9 @@ xfs_statvfs(
 	statp->f_ffree = statp->f_files - (sbp->sb_icount - sbp->sb_ifree);
 	XFS_SB_UNLOCK(mp, s);
 
-	statp->f_fsid.val[0] = old_encode_dev(mp->m_dev);
-	statp->f_fsid.val[1] = 0;
+	id = huge_encode_dev(mp->m_dev);
+	statp->f_fsid.val[0] = (u32)id;
+	statp->f_fsid.val[1] = (u32)(id >> 32);
 	statp->f_namelen = MAXNAMELEN - 1;
 
 	return 0;
diff -puN include/asm-arm26/stat.h~KD43-real32-B5 include/asm-arm26/stat.h
--- 25-power4/include/asm-arm26/stat.h~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/include/asm-arm26/stat.h	2003-09-22 00:13:03.000000000 -0700
@@ -42,8 +42,7 @@ struct stat {
  * insane amounts of padding around dev_t's.
  */
 struct stat64 {
-	unsigned short  st_dev;
-	unsigned char   __pad0b[6];
+	unsigned long long  st_dev;
 	unsigned char   __pad0[4];
 
 #define STAT64_HAS_BROKEN_ST_INO	1
@@ -54,8 +53,7 @@ struct stat64 {
 	unsigned long	st_uid;
 	unsigned long	st_gid;
 
-	unsigned short  st_rdev;
-	unsigned char   __pad3b[6];
+	unsigned long long  st_rdev;
 	unsigned char   __pad3[4];
 
 	long long	st_size;
diff -puN include/asm-h8300/stat.h~KD43-real32-B5 include/asm-h8300/stat.h
--- 25-power4/include/asm-h8300/stat.h~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/include/asm-h8300/stat.h	2003-09-22 00:13:03.000000000 -0700
@@ -42,8 +42,7 @@ struct stat {
  * insane amounts of padding around dev_t's.
  */
 struct stat64 {
-	unsigned char	__pad0[6];
-	unsigned short	st_dev;
+	unsigned long long	st_dev;
 	unsigned char	__pad1[2];
 
 #define STAT64_HAS_BROKEN_ST_INO	1
@@ -55,8 +54,7 @@ struct stat64 {
 	unsigned long	st_uid;
 	unsigned long	st_gid;
 
-	unsigned char	__pad2[6];
-	unsigned short	st_rdev;
+	unsigned long long	st_rdev;
 	unsigned char	__pad3[2];
 
 	long long	st_size;
diff -puN init/do_mounts.c~KD43-real32-B5 init/do_mounts.c
--- 25-power4/init/do_mounts.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/init/do_mounts.c	2003-09-22 00:13:03.000000000 -0700
@@ -76,11 +76,13 @@ static dev_t __init try_name(char *name,
 		 * Try the %u:%u format -- see print_dev_t()
 		 */
 		res = MKDEV(maj, min);
+		if (maj != MAJOR(res) || min != MINOR(res))
+			goto fail;
 	} else {
 		/*
 		 * Nope.  Try old-style "0321"
 		 */
-		res = old_decode_dev(simple_strtoul(buf, &s, 16));
+		res = new_decode_dev(simple_strtoul(buf, &s, 16));
 		if (*s)
 			goto fail;
 	}
@@ -145,8 +147,10 @@ dev_t name_to_dev_t(char *name)
 
 		if (sscanf(name, "%u:%u", &maj, &min) == 2) {
 			res = MKDEV(maj, min);
+			if (maj != MAJOR(res) || min != MINOR(res))
+				goto fail;
 		} else {
-			res = old_decode_dev(simple_strtoul(name, &p, 16));
+			res = new_decode_dev(simple_strtoul(name, &p, 16));
 			if (*p)
 				goto fail;
 		}
diff -puN init/do_mounts_devfs.c~KD43-real32-B5 init/do_mounts_devfs.c
--- 25-power4/init/do_mounts_devfs.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/init/do_mounts_devfs.c	2003-09-22 00:13:03.000000000 -0700
@@ -80,7 +80,6 @@ static void * __init read_dir(char *path
  */
 static int __init find_in_devfs(char *path, unsigned dev)
 {
-	struct stat buf;
 	char *end = path + strlen(path);
 	int rest = path + 64 - end;
 	int size;
@@ -96,11 +95,7 @@ static int __init find_in_devfs(char *pa
 		switch (d->d_type) {
 			case DT_BLK:
 				sprintf(end, "/%s", d->d_name);
-				if (sys_newstat(path, &buf) < 0)
-					break;
-				if (!S_ISBLK(buf.st_mode))
-					break;
-				if (buf.st_rdev != dev)
+				if (bstat(path) != dev)
 					break;
 				kfree(p);
 				return 0;
@@ -140,7 +135,7 @@ int __init create_dev(char *name, dev_t 
 	if (!dev)
 		return -1;
 	strcpy(path, "/dev");
-	if (find_in_devfs(path, old_encode_dev(dev)) < 0)
+	if (find_in_devfs(path, new_encode_dev(dev)) < 0)
 		return -1;
 	return sys_symlink(path + 5, name);
 }
diff -puN init/do_mounts.h~KD43-real32-B5 init/do_mounts.h
--- 25-power4/init/do_mounts.h~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/init/do_mounts.h	2003-09-22 00:13:03.000000000 -0700
@@ -43,11 +43,36 @@ static inline void umount_devfs(const ch
 static inline int create_dev(char *name, dev_t dev, char *devfs_name)
 {
 	sys_unlink(name);
-	return sys_mknod(name, S_IFBLK|0600, old_encode_dev(dev));
+	return sys_mknod(name, S_IFBLK|0600, new_encode_dev(dev));
 }
 
 #endif
 
+#if BITS_PER_LONG == 32
+asmlinkage long sys_stat64(char *name, struct stat64 *stat);
+static inline u32 bstat(char *name)
+{
+	struct stat64 stat;
+	if (!sys_stat64(name, &stat) != 0)
+		return 0;
+	if (!S_ISBLK(stat.st_mode))
+		return 0;
+	if (stat.st_rdev != (u32)stat.st_rdev)
+		return 0;
+	return stat.st_rdev;
+}
+#else
+static inline u32 bstat(char *name)
+{
+	struct stat stat;
+	if (!sys_newstat(name, &stat) != 0)
+		return 0;
+	if (!S_ISBLK(stat.st_mode))
+		return 0;
+	return stat.st_rdev;
+}
+#endif
+
 #ifdef CONFIG_BLK_DEV_RAM
 
 int __init rd_load_disk(int n);
diff -puN init/do_mounts_initrd.c~KD43-real32-B5 init/do_mounts_initrd.c
--- 25-power4/init/do_mounts_initrd.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/init/do_mounts_initrd.c	2003-09-22 00:13:03.000000000 -0700
@@ -40,7 +40,7 @@ static void __init handle_initrd(void)
 	int error;
 	int i, pid;
 
-	real_root_dev = old_encode_dev(ROOT_DEV);
+	real_root_dev = new_encode_dev(ROOT_DEV);
 	create_dev("/dev/root.old", Root_RAM0, NULL);
 	/* mount initrd on rootfs' /root */
 	mount_block_root("/dev/root.old", root_mountflags & ~MS_RDONLY);
@@ -69,12 +69,12 @@ static void __init handle_initrd(void)
 	close(root_fd);
 	umount_devfs("/old/dev");
 
-	if (old_decode_dev(real_root_dev) == Root_RAM0) {
+	if (new_decode_dev(real_root_dev) == Root_RAM0) {
 		sys_chdir("/old");
 		return;
 	}
 
-	ROOT_DEV = old_decode_dev(real_root_dev);
+	ROOT_DEV = new_decode_dev(real_root_dev);
 	mount_root();
 
 	printk(KERN_NOTICE "Trying to move old root to /initrd ... ");
diff -puN init/do_mounts_md.c~KD43-real32-B5 init/do_mounts_md.c
--- 25-power4/init/do_mounts_md.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/init/do_mounts_md.c	2003-09-22 00:13:03.000000000 -0700
@@ -124,7 +124,7 @@ static void __init md_setup_drive(void)
 		for (i = 0; i < MD_SB_DISKS && devname != 0; i++) {
 			char *p;
 			char comp_name[64];
-			struct stat buf;
+			u32 rdev;
 
 			p = strchr(devname, ',');
 			if (p)
@@ -134,9 +134,9 @@ static void __init md_setup_drive(void)
 			if (strncmp(devname, "/dev/", 5) == 0)
 				devname += 5;
 			snprintf(comp_name, 63, "/dev/%s", devname);
-			if (sys_newstat(comp_name, &buf) == 0 &&
-							S_ISBLK(buf.st_mode))
-				dev = old_decode_dev(buf.st_rdev);
+			rdev = bstat(comp_name);
+			if (rdev)
+				dev = new_decode_dev(rdev);
 			if (!dev) {
 				printk(KERN_WARNING "md: Unknown device name: %s\n", devname);
 				break;
diff -puN init/initramfs.c~KD43-real32-B5 init/initramfs.c
--- 25-power4/init/initramfs.c~KD43-real32-B5	2003-09-22 00:13:03.000000000 -0700
+++ 25-power4-akpm/init/initramfs.c	2003-09-22 00:13:03.000000000 -0700
@@ -113,7 +113,7 @@ static void __init parse_header(char *s)
 	body_len = parsed[6];
 	major = parsed[7];
 	minor = parsed[8];
-	rdev = old_encode_dev(MKDEV(parsed[9], parsed[10]));
+	rdev = new_encode_dev(MKDEV(parsed[9], parsed[10]));
 	name_len = parsed[11];
 }
 

_
