common/defrag: rework _require_defrag for ext4

The existing _require_defrag function rejects ext4 file systems
mounted with the dax option or constructed without extents.
However, there are also a number of other ext4 file system
configuration cases that do not currently support online defrag,
including encryption, data journaling, and bigalloc.  In the future,
online defrag functionality may be implemented for some of these,
and new configuration cases could be added that don't support it.

Rather than add a laundry list of mount and file system
configuration options to the existing _require_defrag function that
will need ongoing maintenance, use the available src/e4compact
program to directly determine whether the kernel supports ext4's
move extent ioctl on the test file system.

Signed-off-by: Eric Whitney <enwlinux@gmail.com>
Reviewed-by: Eryu Guan <eguan@redhat.com>
Signed-off-by: Eryu Guan <eguan@redhat.com>
This commit is contained in:
Eric Whitney
2016-08-04 16:02:46 -04:00
committed by Eryu Guan
parent 73f8e854f6
commit 60f3461b7d
+11 -6
View File
@@ -27,14 +27,19 @@ _require_defrag()
DEFRAG_PROG="$XFS_FSR_PROG"
;;
ext4|ext4dev)
echo $MOUNT_OPTIONS | grep -q dax
testfile="$TEST_DIR/$$-test.defrag"
donorfile="$TEST_DIR/$$-donor.defrag"
bsize=`get_block_size $TEST_DIR`
$XFS_IO_PROG -f -c "pwrite -b $bsize 0 $bsize" $testfile > /dev/null
cp $testfile $donorfile
echo $testfile | $here/src/e4compact -v -f $donorfile | \
grep -q "err:95"
if [ $? -eq 0 ]; then
_notrun "$FSTYP defragmentation not supported with DAX"
else
DEFRAG_PROG="$E4DEFRAG_PROG"
rm -f $testfile $donorfile 2>&1 > /dev/null
_notrun "$FSTYP test filesystem doesn't support online defrag"
fi
dumpe2fs -h $TEST_DEV 2> /dev/null | grep -wq extent || \
_notrun "file system does not have extents, needed for defrag"
rm -f $testfile $donorfile 2>&1 > /dev/null
DEFRAG_PROG="$E4DEFRAG_PROG"
;;
btrfs)
DEFRAG_PROG="$BTRFS_UTIL_PROG filesystem defragment"