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]; } _