dio-invalidate-cache stat_test t_encrypted_d_revalidate \
attr_replace_test swapon mkswap t_attr_corruption t_open_tmpfiles \
fscrypt-crypt-util bulkstat_null_ocount splice-test chprojid_fail \
- detached_mounts_propagation
+ detached_mounts_propagation ext4_resize
EXTRA_EXECS = dmerror fill2attr fill2fs fill2fs_check scaleread.sh \
btrfs_crc32c_forged_name.py
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0
+
+/*
+ * Test program which uses the raw ext4 resize_fs ioctl directly.
+ */
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <sys/mount.h>
+
+typedef unsigned long long __u64;
+
+#ifndef EXT4_IOC_RESIZE_FS
+#define EXT4_IOC_RESIZE_FS _IOW('f', 16, __u64)
+#endif
+
+int main(int argc, char **argv)
+{
+ __u64 new_size;
+ int error, fd;
+ char *tmp = NULL;
+
+ if (argc != 3) {
+ fputs("insufficient arguments\n", stderr);
+ return 1;
+ }
+ fd = open(argv[1], O_RDONLY);
+ if (!fd) {
+ perror(argv[1]);
+ return 1;
+ }
+
+ new_size = strtoull(argv[2], &tmp, 10);
+ if ((errno) || (*tmp != '\0')) {
+ fprintf(stderr, "%s: invalid new size\n", argv[0]);
+ return 1;
+ }
+
+ error = ioctl(fd, EXT4_IOC_RESIZE_FS, &new_size);
+ if (error < 0) {
+ perror("EXT4_IOC_RESIZE_FS");
+ return 1;
+ }
+ return 0;
+}
# FS QA Test 033
#
# Test s_inodes_count overflow for huge filesystems. This bug was fixed
-# by commit "ext4: Forbid overflowing inode count when resizing".
+# by commit 4f2f76f75143 ("ext4: Forbid overflowing inode count when
+# resizing".)
#
. ./common/preamble
_begin_fstest auto ioctl resize
_require_scratch_nocheck
_require_dmhugedisk
_require_dumpe2fs
-_require_command "$RESIZE2FS_PROG" resize2fs
+_require_test_program ext4_resize
+
+EXT4_RESIZE=$here/src/ext4_resize
# Figure out whether device is large enough
devsize=$(blockdev --getsize64 $SCRATCH_DEV)
# This should fail, s_inodes_count would just overflow!
echo "Resizing to inode limit + 1..."
-$RESIZE2FS_PROG $DMHUGEDISK_DEV $((limit_groups*group_blocks)) >> $seqres.full 2>&1
+echo $EXT4_RESIZE $SCRATCH_MNT $((limit_groups*group_blocks)) >> $seqres.full 2>&1
+$EXT4_RESIZE $SCRATCH_MNT $((limit_groups*group_blocks)) >> $seqres.full 2>&1
if [ $? -eq 0 ]; then
echo "Resizing succeeded but it should fail!"
exit
# This should succeed, we are maxing out inodes
echo "Resizing to max group count..."
-$RESIZE2FS_PROG $DMHUGEDISK_DEV $(((limit_groups-1)*group_blocks)) >> $seqres.full 2>&1
+echo $EXT4_RESIZE $SCRATCH_MNT $(((limit_groups-1)*group_blocks)) >> $seqres.full 2>&1
+$EXT4_RESIZE $SCRATCH_MNT $(((limit_groups-1)*group_blocks)) >> $seqres.full 2>&1
if [ $? -ne 0 ]; then
echo "Resizing failed!"
exit
# This should fail, s_inodes_count would overflow by quite a bit!
echo "Resizing to device size..."
-$RESIZE2FS_PROG $DMHUGEDISK_DEV >> $seqres.full 2>&1
+echo $EXT4_RESIZE $SCRATCH_MNT $(((limit_groups + 16)*group_blocks)) >> $seqres.full 2>&1
+$EXT4_RESIZE $SCRATCH_MNT $(((limit_groups + 16)*group_blocks)) >> $seqres.full 2>&1
if [ $? -eq 0 ]; then
echo "Resizing succeeded but it should fail!"
exit