PR: 131341 Index: sys/ufs/ffs/ffs_vfsops.c =================================================================== --- sys/ufs/ffs/ffs_vfsops.c (revision 188710) +++ sys/ufs/ffs/ffs_vfsops.c (working copy) @@ -684,6 +684,23 @@ ffs_mountfs(devvp, mp, td) error = EINVAL; /* XXX needs translation */ goto out; } + /* + * XXX: If fs->fs_fsbtodb is not based on DEV_BSIZE recalculate it. + */ + if (fs->fs_fsize / fsbtodb(fs, 1) != DEV_BSIZE) { + /* integer log2(fs->fs_fsize / DEV_BSIZE) */ + fs->fs_fsbtodb = 0; + while (fs->fs_fsbtodb <= FS_MAXFSBTODB) { + if (fs->fs_fsize / fsbtodb(fs, 1) == DEV_BSIZE) + break; + fs->fs_fsbtodb++; + } + if (fs->fs_fsbtodb > FS_MAXFSBTODB || + fs->fs_fsize % DEV_BSIZE != 0) { + error = EINVAL; + goto out; + } + } fs->fs_fmod = 0; fs->fs_flags &= ~FS_INDEXDIRS; /* no support for directory indicies */ fs->fs_flags &= ~FS_UNCLEAN; Index: sys/ufs/ffs/fs.h =================================================================== --- sys/ufs/ffs/fs.h (revision 188710) +++ sys/ufs/ffs/fs.h (working copy) @@ -506,6 +506,11 @@ struct cg { #define dbtofsb(fs, b) ((b) >> (fs)->fs_fsbtodb) /* + * Theoretical maximum value for fs_fsbtodb field. + */ +#define FS_MAXFSBTODB ((sizeof(daddr_t) * /*CHAR_BIT*/ 8) - 1) + +/* * Cylinder group macros to locate things in cylinder groups. * They calc filesystem addresses of cylinder group data structures. */