Changeset View
Changeset View
Standalone View
Standalone View
sys/fs/ext2fs/ext2_vfsops.c
Show First 20 Lines • Show All 459 Lines • ▼ Show 20 Lines | ext2_compute_sb_data(struct vnode *devvp, struct ext2fs *es, | ||||
struct m_ext2fs *fs) | struct m_ext2fs *fs) | ||||
{ | { | ||||
struct buf *bp; | struct buf *bp; | ||||
uint32_t e2fs_descpb, e2fs_gdbcount_alloc; | uint32_t e2fs_descpb, e2fs_gdbcount_alloc; | ||||
int i, j; | int i, j; | ||||
int g_count = 0; | int g_count = 0; | ||||
int error; | int error; | ||||
/* Check if first dblock is valid */ | |||||
if (fs->e2fs->e2fs_bcount >= 1024 && fs->e2fs->e2fs_first_dblock) { | |||||
SDT_PROBE1(ext2fs, , vfsops, ext2_compute_sb_data_error, | |||||
"first dblock is invalid"); | |||||
return (EINVAL); | |||||
} | |||||
/* Check checksum features */ | /* Check checksum features */ | ||||
if (EXT2_HAS_RO_COMPAT_FEATURE(fs, EXT2F_ROCOMPAT_GDT_CSUM) && | if (EXT2_HAS_RO_COMPAT_FEATURE(fs, EXT2F_ROCOMPAT_GDT_CSUM) && | ||||
EXT2_HAS_RO_COMPAT_FEATURE(fs, EXT2F_ROCOMPAT_METADATA_CKSUM)) { | EXT2_HAS_RO_COMPAT_FEATURE(fs, EXT2F_ROCOMPAT_METADATA_CKSUM)) { | ||||
SDT_PROBE1(ext2fs, , vfsops, ext2_compute_sb_data_error, | SDT_PROBE1(ext2fs, , vfsops, ext2_compute_sb_data_error, | ||||
"incorrect checksum features combination"); | "incorrect checksum features combination"); | ||||
return (EINVAL); | return (EINVAL); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 130 Lines • ▼ Show 20 Lines | ext2_compute_sb_data(struct vnode *devvp, struct ext2fs *es, | ||||
fs->e2fs_ficount = le32toh(es->e2fs_ficount); | fs->e2fs_ficount = le32toh(es->e2fs_ficount); | ||||
if (fs->e2fs_ficount > le32toh(es->e2fs_icount)) { | if (fs->e2fs_ficount > le32toh(es->e2fs_icount)) { | ||||
SDT_PROBE1(ext2fs, , vfsops, ext2_compute_sb_data_error, | SDT_PROBE1(ext2fs, , vfsops, ext2_compute_sb_data_error, | ||||
"invalid number of free inodes"); | "invalid number of free inodes"); | ||||
return (EINVAL); | return (EINVAL); | ||||
} | } | ||||
if (le32toh(es->e2fs_first_dblock) >= fs->e2fs_bcount) { | if (le32toh(es->e2fs_first_dblock) != (fs->e2fs_bsize > 1024 ? 0 : 1) || | ||||
le32toh(es->e2fs_first_dblock) >= fs->e2fs_bcount) { | |||||
SDT_PROBE1(ext2fs, , vfsops, ext2_compute_sb_data_error, | SDT_PROBE1(ext2fs, , vfsops, ext2_compute_sb_data_error, | ||||
"first data block out of range"); | "first data block out of range"); | ||||
return (EINVAL); | return (EINVAL); | ||||
} | } | ||||
fs->e2fs_gcount = howmany(fs->e2fs_bcount - | fs->e2fs_gcount = howmany(fs->e2fs_bcount - | ||||
le32toh(es->e2fs_first_dblock), EXT2_BLOCKS_PER_GROUP(fs)); | le32toh(es->e2fs_first_dblock), EXT2_BLOCKS_PER_GROUP(fs)); | ||||
if (fs->e2fs_gcount > ((uint64_t)1 << 32) - EXT2_DESCS_PER_BLOCK(fs)) { | if (fs->e2fs_gcount > ((uint64_t)1 << 32) - EXT2_DESCS_PER_BLOCK(fs)) { | ||||
▲ Show 20 Lines • Show All 829 Lines • Show Last 20 Lines |