arch/mips/kernel/sysirix.c | 34 ++++++++----------- arch/sparc64/solaris/fs.c | 41 +++++++++-------------- drivers/s390/block/dasd_int.h | 3 + fs/libfs.c | 19 ---------- fs/xfs/linux/xfs_iops.c | 8 +++- fs/xfs/linux/xfs_super.c | 2 - fs/xfs/xfs_types.h | 16 --------- include/linux/fs.h | 3 - include/linux/kdev_t.h | 74 ++++++++++++++++++++++++++++++++++++++++-- include/linux/raid/md_k.h | 6 --- include/linux/types.h | 2 - 11 files changed, 115 insertions(+), 93 deletions(-) diff -puN arch/mips/kernel/sysirix.c~KD42-32bit-B5 arch/mips/kernel/sysirix.c --- 25/arch/mips/kernel/sysirix.c~KD42-32bit-B5 2003-09-21 22:35:27.000000000 -0700 +++ 25-akpm/arch/mips/kernel/sysirix.c 2003-09-21 22:35:27.000000000 -0700 @@ -1187,13 +1187,7 @@ asmlinkage int irix_uname(struct iuname #undef DEBUG_XSTAT -static inline u32 -linux_to_irix_dev_t(dev_t t) -{ - return MAJOR (t) << 18 | MINOR (t); -} - -static inline int irix_xstat32_xlate(struct kstat *stat, void *ubuf) +static int irix_xstat32_xlate(struct kstat *stat, void *ubuf) { struct xstat32 { u32 st_dev, st_pad1[3], st_ino, st_mode, st_nlink, st_uid, st_gid; @@ -1206,13 +1200,15 @@ static inline int irix_xstat32_xlate(str u32 st_pad4[8]; } ub; - ub.st_dev = linux_to_irix_dev_t(stat->dev); + if (!sysv_valid_dev(stat->dev) || !sysv_valid_dev(stat->rdev)) + return -EOVERFLOW; + ub.st_dev = sysv_encode_dev(stat->dev); ub.st_ino = stat->ino; ub.st_mode = stat->mode; ub.st_nlink = stat->nlink; SET_STAT_UID(ub, stat->uid); SET_STAT_GID(ub, stat->gid); - ub.st_rdev = linux_to_irix_dev_t(stat->rdev); + ub.st_rdev = sysv_encode_dev(stat->rdev); #if BITS_PER_LONG == 32 if (stat->size > MAX_NON_LFS) return -EOVERFLOW; @@ -1231,7 +1227,7 @@ static inline int irix_xstat32_xlate(str return copy_to_user(ubuf, &ub, sizeof(ub)) ? -EFAULT : 0; } -static inline void irix_xstat64_xlate(struct kstat *stat, void *ubuf) +static int irix_xstat64_xlate(struct kstat *stat, void *ubuf) { struct xstat64 { u32 st_dev; s32 st_pad1[3]; @@ -1248,14 +1244,17 @@ static inline void irix_xstat64_xlate(st s32 st_pad4[8]; } ks; - ks.st_dev = linux_to_irix_dev_t(stat->dev); + if (!sysv_valid_dev(stat->dev) || !sysv_valid_dev(stat->rdev)) + return -EOVERFLOW; + + ks.st_dev = sysv_encode_dev(stat->dev); ks.st_pad1[0] = ks.st_pad1[1] = ks.st_pad1[2] = 0; ks.st_ino = (unsigned long long) stat->ino; ks.st_mode = (u32) stat->mode; ks.st_nlink = (u32) stat->nlink; ks.st_uid = (s32) stat->uid; ks.st_gid = (s32) stat->gid; - ks.st_rdev = linux_to_irix_dev_t (stat->rdev); + ks.st_rdev = sysv_encode_dev (stat->rdev); ks.st_pad2[0] = ks.st_pad2[1] = 0; ks.st_size = (long long) stat->size; ks.st_pad3 = 0; @@ -1275,7 +1274,7 @@ static inline void irix_xstat64_xlate(st ks.st_pad4[4] = ks.st_pad4[5] = ks.st_pad4[6] = ks.st_pad4[7] = 0; /* Now write it all back. */ - copy_to_user(ubuf, &ks, sizeof(struct xstat64)); + return copy_to_user(ubuf, &ub, sizeof(ub)) ? -EFAULT : 0; } asmlinkage int irix_xstat(int version, char *filename, struct stat *statbuf) @@ -1295,8 +1294,7 @@ asmlinkage int irix_xstat(int version, c retval = irix_xstat32_xlate(&stat, statbuf); break; case 3: - irix_xstat64_xlate(&stat, statbuf); - retval = 0; /* Really? */ + retval = irix_xstat64_xlate(&stat, statbuf); break; default: retval = -EINVAL; @@ -1323,8 +1321,7 @@ asmlinkage int irix_lxstat(int version, error = irix_xstat32_xlate(&stat, statbuf); break; case 3: - irix_xstat64_xlate(&stat, statbuf); - error = 0; + error = irix_xstat64_xlate(&stat, statbuf); break; default: error = -EINVAL; @@ -1350,8 +1347,7 @@ asmlinkage int irix_fxstat(int version, error = irix_xstat32_xlate(&stat, statbuf); break; case 3: - irix_xstat64_xlate(&stat, statbuf); - error = 0; + error = irix_xstat64_xlate(&stat, statbuf); break; default: error = -EINVAL; diff -puN arch/sparc64/solaris/fs.c~KD42-32bit-B5 arch/sparc64/solaris/fs.c --- 25/arch/sparc64/solaris/fs.c~KD42-32bit-B5 2003-09-21 22:35:27.000000000 -0700 +++ 25-akpm/arch/sparc64/solaris/fs.c 2003-09-21 22:35:27.000000000 -0700 @@ -28,21 +28,6 @@ #include "conv.h" -static inline u32 R4_DEV(dev_t DEV) -{ - return MINOR(DEV) | (MAJOR(DEV) << 18); -} - -static inline unsigned R4_MAJOR(u32 DEV) -{ - return (DEV >> 18) & 0x3fff; -} - -static inline unsigned R4_MINOR(u32 DEV) -{ - return DEV & 0x3ffff; -} - #define R3_VERSION 1 #define R4_VERSION 2 @@ -96,15 +81,17 @@ struct sol_stat64 { static inline int putstat(struct sol_stat *ubuf, struct kstat *kbuf) { - if (kbuf->size > MAX_NON_LFS) + if (kbuf->size > MAX_NON_LFS || + !sysv_valid_dev(kbuf->dev) || + !sysv_valid_dev(kbuf->rdev)) return -EOVERFLOW; - if (put_user (R4_DEV(kbuf->dev), &ubuf->st_dev) || + if (put_user (sysv_encode_dev(kbuf->dev), &ubuf->st_dev) || __put_user (kbuf->ino, &ubuf->st_ino) || __put_user (kbuf->mode, &ubuf->st_mode) || __put_user (kbuf->nlink, &ubuf->st_nlink) || __put_user (kbuf->uid, &ubuf->st_uid) || __put_user (kbuf->gid, &ubuf->st_gid) || - __put_user (R4_DEV(kbuf->rdev), &ubuf->st_rdev) || + __put_user (sysv_encode_dev(kbuf->rdev), &ubuf->st_rdev) || __put_user (kbuf->size, &ubuf->st_size) || __put_user (kbuf->atime.tv_sec, &ubuf->st_atime.tv_sec) || __put_user (kbuf->atime.tv_nsec, &ubuf->st_atime.tv_nsec) || @@ -121,13 +108,15 @@ static inline int putstat(struct sol_sta static inline int putstat64(struct sol_stat64 *ubuf, struct kstat *kbuf) { - if (put_user (R4_DEV(kbuf->dev), &ubuf->st_dev) || + if (!sysv_valid_dev(kbuf->dev) || !sysv_valid_dev(kbuf->rdev)) + return -EOVERFLOW; + if (put_user (sysv_encode_dev(kbuf->dev), &ubuf->st_dev) || __put_user (kbuf->ino, &ubuf->st_ino) || __put_user (kbuf->mode, &ubuf->st_mode) || __put_user (kbuf->nlink, &ubuf->st_nlink) || __put_user (kbuf->uid, &ubuf->st_uid) || __put_user (kbuf->gid, &ubuf->st_gid) || - __put_user (R4_DEV(kbuf->rdev), &ubuf->st_rdev) || + __put_user (sysv_encode_dev(kbuf->rdev), &ubuf->st_rdev) || __put_user (kbuf->size, &ubuf->st_size) || __put_user (kbuf->atime.tv_sec, &ubuf->st_atime.tv_sec) || __put_user (kbuf->atime.tv_nsec, &ubuf->st_atime.tv_nsec) || @@ -261,8 +250,8 @@ asmlinkage int solaris_mknod(u32 path, u (int (*)(const char *,int,unsigned))SYS(mknod); int major, minor; - if ((major = R4_MAJOR(dev)) > 255 || - (minor = R4_MINOR(dev)) > 255) return -EINVAL; + 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))); } @@ -415,6 +404,8 @@ static int report_statvfs(struct vfsmoun if (j > 15) j = 15; if (IS_RDONLY(inode)) i = 1; if (mnt->mnt_flags & MNT_NOSUID) i |= 2; + if (!sysv_valid_dev(inode->i_sb->s_dev)) + return -EOVERFLOW; if (put_user (s.f_bsize, &ss->f_bsize) || __put_user (0, &ss->f_frsize) || __put_user (s.f_blocks, &ss->f_blocks) || @@ -423,7 +414,7 @@ static int report_statvfs(struct vfsmoun __put_user (s.f_files, &ss->f_files) || __put_user (s.f_ffree, &ss->f_ffree) || __put_user (s.f_ffree, &ss->f_favail) || - __put_user (R4_DEV(inode->i_sb->s_dev), &ss->f_fsid) || + __put_user (sysv_encode_dev(inode->i_sb->s_dev), &ss->f_fsid) || __copy_to_user (ss->f_basetype,p,j) || __put_user (0, (char *)&ss->f_basetype[j]) || __put_user (s.f_namelen, &ss->f_namemax) || @@ -449,6 +440,8 @@ static int report_statvfs64(struct vfsmo if (j > 15) j = 15; if (IS_RDONLY(inode)) i = 1; if (mnt->mnt_flags & MNT_NOSUID) i |= 2; + if (!sysv_valid_dev(inode->i_sb->s_dev)) + return -EOVERFLOW; if (put_user (s.f_bsize, &ss->f_bsize) || __put_user (0, &ss->f_frsize) || __put_user (s.f_blocks, &ss->f_blocks) || @@ -457,7 +450,7 @@ static int report_statvfs64(struct vfsmo __put_user (s.f_files, &ss->f_files) || __put_user (s.f_ffree, &ss->f_ffree) || __put_user (s.f_ffree, &ss->f_favail) || - __put_user (R4_DEV(inode->i_sb->s_dev), &ss->f_fsid) || + __put_user (sysv_encode_dev(inode->i_sb->s_dev), &ss->f_fsid) || __copy_to_user (ss->f_basetype,p,j) || __put_user (0, (char *)&ss->f_basetype[j]) || __put_user (s.f_namelen, &ss->f_namemax) || diff -puN drivers/s390/block/dasd_int.h~KD42-32bit-B5 drivers/s390/block/dasd_int.h --- 25/drivers/s390/block/dasd_int.h~KD42-32bit-B5 2003-09-21 22:35:27.000000000 -0700 +++ 25-akpm/drivers/s390/block/dasd_int.h 2003-09-21 22:35:27.000000000 -0700 @@ -14,7 +14,8 @@ #ifdef __KERNEL__ -#define DASD_PER_MAJOR ( 1U<<(MINORBITS-DASD_PARTN_BITS)) +/* we keep old device allocation scheme; IOW, minors are still in 0..255 */ +#define DASD_PER_MAJOR ( 1U<<(8-DASD_PARTN_BITS)) #define DASD_PARTN_MASK ((1 << DASD_PARTN_BITS) - 1) /* diff -puN fs/libfs.c~KD42-32bit-B5 fs/libfs.c --- 25/fs/libfs.c~KD42-32bit-B5 2003-09-21 22:35:27.000000000 -0700 +++ 25-akpm/fs/libfs.c 2003-09-21 22:35:27.000000000 -0700 @@ -429,22 +429,3 @@ void simple_release_fs(struct vfsmount * spin_unlock(&pin_fs_lock); mntput(mnt); } - -/* acceptable for old filesystems */ -int old_valid_dev(dev_t dev) -{ - return MAJOR(dev) < 256 && MINOR(dev) < 256; -} -EXPORT_SYMBOL(old_valid_dev); - -u16 old_encode_dev(dev_t dev) -{ - return (MAJOR(dev) << 8) | MINOR(dev); -} -EXPORT_SYMBOL(old_encode_dev); - -dev_t old_decode_dev(u16 val) -{ - return MKDEV((val >> 8) & 255, val & 255); -} -EXPORT_SYMBOL(old_decode_dev); diff -puN fs/xfs/linux/xfs_iops.c~KD42-32bit-B5 fs/xfs/linux/xfs_iops.c --- 25/fs/xfs/linux/xfs_iops.c~KD42-32bit-B5 2003-09-21 22:35:27.000000000 -0700 +++ 25-akpm/fs/xfs/linux/xfs_iops.c 2003-09-21 22:35:27.000000000 -0700 @@ -113,7 +113,11 @@ linvfs_mknod( xattr_exists_t test_default_acl = _ACL_DEFAULT_EXISTS; int error; - if (!old_valid_dev(rdev)) + /* + * Irix uses Missed'em'V split, but doesn't want to see + * the upper 5 bits of (14bit) major. + */ + if (!sysv_valid_dev(rdev) || MAJOR(rdev) & ~0x1ff) return -EINVAL; if (test_default_acl && test_default_acl(dvp)) { @@ -135,7 +139,7 @@ linvfs_mknod( switch (mode & S_IFMT) { case S_IFCHR: case S_IFBLK: case S_IFIFO: case S_IFSOCK: - va.va_rdev = XFS_MKDEV(MAJOR(rdev), MINOR(rdev)); + va.va_rdev = sysv_encode_dev(rdev); va.va_mask |= XFS_AT_RDEV; /*FALLTHROUGH*/ case S_IFREG: diff -puN fs/xfs/linux/xfs_super.c~KD42-32bit-B5 fs/xfs/linux/xfs_super.c --- 25/fs/xfs/linux/xfs_super.c~KD42-32bit-B5 2003-09-21 22:35:27.000000000 -0700 +++ 25-akpm/fs/xfs/linux/xfs_super.c 2003-09-21 22:35:27.000000000 -0700 @@ -174,7 +174,7 @@ xfs_revalidate_inode( inode->i_rdev = 0; } else { xfs_dev_t dev = ip->i_df.if_u2.if_rdev; - inode->i_rdev = XFS_DEV_TO_DEVT(dev); + inode->i_rdev = MKDEV(sysv_major(dev) & 0x1ff, sysv_minor(dev)); } inode->i_blksize = PAGE_CACHE_SIZE; inode->i_generation = ip->i_d.di_gen; diff -puN fs/xfs/xfs_types.h~KD42-32bit-B5 fs/xfs/xfs_types.h --- 25/fs/xfs/xfs_types.h~KD42-32bit-B5 2003-09-21 22:35:27.000000000 -0700 +++ 25-akpm/fs/xfs/xfs_types.h 2003-09-21 22:35:27.000000000 -0700 @@ -197,20 +197,4 @@ typedef enum { XFS_BTNUM_MAX } xfs_btnum_t; - -/* - * Juggle IRIX device numbers - still used in ondisk structures - */ -#define XFS_DEV_BITSMAJOR 14 -#define XFS_DEV_BITSMINOR 18 -#define XFS_DEV_MAXMAJ 0x1ff -#define XFS_DEV_MAXMIN 0x3ffff -#define XFS_DEV_MAJOR(dev) ((int)(((unsigned)(dev)>>XFS_DEV_BITSMINOR) \ - & XFS_DEV_MAXMAJ)) -#define XFS_DEV_MINOR(dev) ((int)((dev)&XFS_DEV_MAXMIN)) -#define XFS_MKDEV(major,minor) ((xfs_dev_t)(((major)<> MINORBITS)) @@ -18,6 +17,77 @@ buffer; \ }) +/* acceptable for old filesystems */ +static inline int old_valid_dev(dev_t dev) +{ + return MAJOR(dev) < 256 && MINOR(dev) < 256; +} + +static inline u16 old_encode_dev(dev_t dev) +{ + return (MAJOR(dev) << 8) | MINOR(dev); +} + +static inline dev_t old_decode_dev(u16 val) +{ + return MKDEV((val >> 8) & 255, val & 255); +} + +static inline int new_valid_dev(dev_t dev) +{ + return 1; +} + +static inline u32 new_encode_dev(dev_t dev) +{ + unsigned major = MAJOR(dev); + unsigned minor = MINOR(dev); + return (minor & 0xff) | (major << 8) | ((minor & ~0xff) << 12); +} + +static inline dev_t new_decode_dev(u32 dev) +{ + unsigned major = (dev & 0xfff00) >> 8; + unsigned minor = (dev & 0xff) | ((dev >> 12) & 0xfff00); + return MKDEV(major, minor); +} + +static inline int huge_valid_dev(dev_t dev) +{ + return 1; +} + +static inline u64 huge_encode_dev(dev_t dev) +{ + return new_encode_dev(dev); +} + +static inline dev_t huge_decode_dev(u64 dev) +{ + return new_decode_dev(dev); +} + +static inline int sysv_valid_dev(dev_t dev) +{ + return MAJOR(dev) < (1<<14) && MINOR(dev) < (1<<18); +} + +static inline u32 sysv_encode_dev(dev_t dev) +{ + return MINOR(dev) | (MAJOR(dev) << 18); +} + +static inline unsigned sysv_major(u32 dev) +{ + return (dev >> 18) & 0x3fff; +} + +static inline unsigned sysv_minor(u32 dev) +{ + return dev & 0x3ffff; +} + + #else /* __KERNEL__ */ /* diff -puN include/linux/raid/md_k.h~KD42-32bit-B5 include/linux/raid/md_k.h --- 25/include/linux/raid/md_k.h~KD42-32bit-B5 2003-09-21 22:35:27.000000000 -0700 +++ 25-akpm/include/linux/raid/md_k.h 2003-09-21 22:35:27.000000000 -0700 @@ -64,11 +64,7 @@ static inline int level_to_pers (int lev typedef struct mddev_s mddev_t; typedef struct mdk_rdev_s mdk_rdev_t; -#if (MINORBITS != 8) -#error MD does not handle bigger kdev yet -#endif - -#define MAX_MD_DEVS (1<