private void createSuperBlockCopies(Program program, BinaryReader reader, int groupSize,
			int numGroups, boolean is64Bit, boolean isSparseSuper, TaskMonitor monitor)
			throws Exception {
		monitor.setMessage("Creating super block and group descriptor copies...");
		monitor.setMaximum(numGroups);
		for (int i = 1; i < numGroups; i++) {
			monitor.checkCancelled();
			if (isSparseSuper && (!isXpowerOfY(i, 3) && !isXpowerOfY(i, 5) && !isXpowerOfY(i, 7))) {
				continue;
			}
			int offset = groupSize * i;
			Address address = toAddr(program, offset);
			reader.setPointerIndex(offset);
			Ext4SuperBlock superBlock = new Ext4SuperBlock(reader);
			createData(program, address, superBlock.toDataType());
			setPlateComment(program, address, "SuperBlock Copy 0x" + Integer.toHexString(i));

			long groupDescOffset = (offset & 0xffffffffL) + blockSize;
			Address groupDescAddress = toAddr(program, groupDescOffset);
			reader.setPointerIndex(groupDescOffset);
			for (int j = 0; j < numGroups; j++) {

				Ext4GroupDescriptor groupDesc = new Ext4GroupDescriptor(reader, is64Bit);
				DataType groupDescDataType = groupDesc.toDataType();
				createData(program, groupDescAddress, groupDescDataType);
				setPlateComment(program, groupDescAddress, "SuperBlock Copy 0x" +
					Integer.toHexString(i) + " Group 0x" + Integer.toHexString(j));

				groupDescAddress = groupDescAddress.add(groupDescDataType.getLength());
			}
			monitor.incrementProgress(1);
		}
	}
This method allows for EXT4 files larger than 2GB to be imported as 2 (or 3) separate programs.
Then if both programs are opened (and have the same base name), then both will be analyzed.
Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/ext4/NewExt4Analyzer.java