When examining files on EXT4 filesystems, you'll frequently encounter the e
attribute through lsattr
. This marker indicates the file uses extents - a modern block mapping mechanism replacing the traditional indirect block scheme from EXT2/3.
# View extent information for a file
debugfs -R "stat /path/to/file" /dev/sdX | grep -i extent
Extents store block ranges (start block + length) rather than individual blocks:
- Traditional: Blocks 100,101,102,103,104 → 5 entries
- Extent-based: Blocks 100-104 → 1 entry
This reduces metadata overhead significantly. A 1GB file with 4K blocks would need:
# Traditional scheme (assuming 3-level indirection)
256 (direct) + 256² (single indirect) + 256³ (double indirect) = ~16.8M metadata
# Extent scheme (typical 4KB node size, 12-byte extent entries)
1GB / 128MB (max extent size) = ~8 entries
- Filesystem Analysis: When debugging fragmentation or performance issues
- Data Recovery: Extent-based files require different recovery approaches
- Benchmarking: Comparing extent vs non-extent file performance
Use filefrag
to examine extent allocation:
filefrag -v /path/to/file
# Output example:
# Filesystem type is: ef53
# File size of /var/log/syslog is 1048576 (256 blocks)
# 2 extents found
For developers working with extent I/O directly:
# Get extent info via FIEMAP ioctl
#include <linux/fs.h>
struct fiemap fm = {
.fm_start = 0,
.fm_length = FIEMAP_MAX_OFFSET,
.fm_flags = FIEMAP_FLAG_SYNC
};
ioctl(fd, FS_IOC_FIEMAP, &fm);
The e
flag is informational only - it reflects the filesystem's allocation strategy. Attempting to modify it with chattr
fails because:
- Ext4 uses extents by default since kernel 2.6.23
- Conversion between extent/non-extent formats isn't supported online
- The flag exists primarily for legacy compatibility checks
Consider these real-world impacts:
Operation | Extent Benefit |
---|---|
File creation | ~15% faster metadata operations |
ls -l | ~30% fewer stat calls |
fsck | ~50% faster checks |
For database workloads, extents particularly help with:
# MySQL configuration recommendation for EXT4
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT
When examining file attributes on ext4 filesystems (lsattr
output), you'll notice the mysterious 'e' flag appearing on most files:
$ lsattr -d /bin
-------------e- /bin
This marker represents one of ext4's most significant architectural improvements over ext2/ext3 - the extents-based allocation system.
In legacy filesystems, block mapping used indirect blocks:
// Traditional indirect block structure
inode → block[0] → data
→ block[1] → data
→ block[N] → indirect_block → more_blocks
Ext4's extent system works more efficiently:
// Extent-based structure
struct ext4_extent {
__le32 ee_block; /* first logical block */
__le16 ee_len; /* number of blocks */
__le32 ee_start; /* first physical block */
};
This isn't just a technical curiosity - extents provide concrete benefits:
- Fragmentation reduction: Large files occupy contiguous blocks
- Metadata efficiency: Single extent can describe millions of blocks
- Performance gains: Faster file operations and fsck times
When working with file I/O in C, extent-aware code can optimize operations:
#include <fcntl.h>
#include <linux/fs.h>
int fd = open("large_file.dat", O_RDWR);
unsigned long long range[2] = {0, 1048576}; // 1MB range
// Use FALLOC_FL_KEEP_SIZE to preallocate with extents
fallocate(fd, FALLOC_FL_KEEP_SIZE, range[0], range[1]);
While you can't remove the 'e' attribute (as noted in chattr(1)), understanding extents helps when:
- Developing filesystem-intensive applications
- Tuning database storage engines
- Analyzing filesystem performance issues
The persistent 'e' attribute serves as a visible reminder that you're benefiting from ext4's modern allocation strategy. Unlike tunable features like journaling, extents are always active and provide silent performance benefits for all file operations.