e2fsprogs-e2freefrag.patch
PATCH 15/15 e2fsprogs-e2freefrag.patch
e2freefrag is a simple tool to report free space fragmentation on ext2/3/4 filesystems. It a simple tool which goes through the block bitmap reporting sizes of free chunks. By default chunksize of 1MB is used, but a different chunksize can be given using a -c option.
It also reports the min/max/avg size of free chunks and a histogram of all free chunks.
Here is the output of e2freefrag:
[kalpak@garfield e2fsprogs-1.41.2]# e2freefrag -c 1024 /dev/sda3
Device: /dev/sda3
Blocksize: 4096 bytes
Total blocks: 2560359
Free blocks: 603234 (23.6%)
Total chunks: 10002
Free chunks: 2074 (20.7%)
Min free chunk: 4 KB
Max free chunk: 98276 KB
Avg. free chunk: 1952 KB
HISTOGRAM OF FREE CHUNK SIZES:
Range Free chunks
4K... 8K- : 326
8K... 16K- : 186
16K... 32K- : 124
32K... 64K- : 88
64K... 128K- : 83
128K... 256K- : 74
256K... 512K- : 58
512K... 1024K- : 44
1M... 2M- : 38
2M... 4M- : 36
4M... 8M- : 115
8M... 16M- : 38 16M... 32M- : 16
32M... 64M- : 3
64M... 128M- : 2
misc/e2freefrag.8.in new file +93 -0
@@ -0,0 +1,93 @@ +.\" -*- nroff -*- +.TH E2FREEFRAG 8 +.SH NAME +e2freefrag \- report free space fragmentation +.SH SYNOPSIS +.B e2freefrag +[ +.B \-c chunk_kb +] +[ +.B \-h +] +.B filesys + +.SH DESCRIPTION +.B e2freefrag +is used to report free space fragmentation on ext2/3/4 file systems. +.I filesys +can be a device name (e.g. +.IR /dev/hdc1 ", " /dev/sdb2 ). +The +.B e2freefrag +program will scan the block bitmap information to check how many free blocks +are present as contiguous free space. The percentage of contiguous free blocks +of size and of alignment +.IR chunk_kb +is reported. It also displays the minimum/maximum/average free chunk size in +the filesystem. It also displays an histogram of all free chunks. This +information can be used to gauge the level of free space fragmentation in the +filesystem. +.SH OPTIONS +.TP +.BI \-c " chunk_kb" +Desired size of chunk. It is specified in units of kilobytes (KB). If no +.I chunk_kb +is specified on the command line, then the default value is 1024KB. +.TP +.BI \-h +Print the usage of the program. +.SH EXAMPLE +# e2freefrag -c 1024 /dev/sda5 +.br +Device: /dev/sda5 +.br +Blocksize: 4096 bytes +.br + +Total blocks: 5120710 +.br +Free blocks: 831744 (16.2%) +.br + +Total chunks: 20003 +.br +Free chunks: 2174 (10.9%) +.br + +Min free chunk: 4 KB +.br +Max free chunk: 24576 KB +.br +Avg. free chunk: 340 KB +.br + +HISTOGRAM OF FREE CHUNK SIZES: +.br + Range Free chunks +.br + 4K... 8K- : 2824 +.br + 8K... 16K- : 1760 +.br + 16K... 32K- : 1857 +.br + 32K... 64K- : 1003 +.br + 64K... 128K- : 616 +.br + 128K... 256K- : 479 +.br + 256K... 512K- : 302 +.br + 512K... 1024K- : 238 +.br + 1M... 2M- : 213 +.br + 2M... 4M- : 173 +.br + 4M... 8M- : 287 +.br + 8M... 16M- : 4 +.br + 16M... 32M- : 1
misc/e2freefrag.c new file +266 -0
266 lines not on this page · raw message
misc/e2freefrag.h new file +20 -0
@@ -0,0 +1,20 @@ +#include <sys/types.h> + +#define DEFAULT_CHUNKSIZE (1024*1024) + +#define MAX_HIST 32 +struct free_chunk_histogram { +unsigned long fc_buckets[MAX_HIST ]; +}; + +struct chunk_info { +unsigned long chunkbytes;/* chunk size in bytes */ +int chunkbits;/* chunk size in bits */ +unsigned long free_chunks;/* total no of free chunks of given size */ +unsigned long real_free_chunks;/* free chunks of any size */ +int blocksize_bits;/* fs blocksize in bits */ +int blks_in_chunk;/* number of blocks in a chunk */ +unsigned long min, max, avg;/* chunk size stats */ +struct free_chunk_histogram histogram;/* histogram of chunks of all sizes */ +}; +
e2fsprogs.spec.in +2 -0
@@ -143,6 +143,7 @@ exit 0 %{_root_sbindir}/tune2fs %{_sbindir}/filefrag %{_sbindir}/mklost+found +%{_sbindir}/e2freefrag %{_root_libdir}/libblkid.so.* %{_root_libdir}/libcom_err.so.*
@@ -187,6 +188,7 @@ exit 0 %{_mandir}/man8/resize2fs.8* %{_mandir}/man8/tune2fs.8* %{_mandir}/man8/filefrag.8* +%{_mandir}/man8/e2freefrag.8* %files devel %defattr(-,root,root)
misc/Makefile.in +16 -4
@@ -19,10 +19,10 @@ INSTALL = @INSTALL@ SPROGS= mke2fs badblocks tune2fs dumpe2fs blkid logsave \ $(E2IMAGE_PROG) @FSCK_PROG@ e2undo -USPROGS= mklost+found filefrag $(UUIDD_PROG) +USPROGS= mklost+found filefrag e2freefrag $(UUIDD_PROG) SMANPAGES= tune2fs.8 mklost+found.8 mke2fs.8 dumpe2fs.8 badblocks.8 \ e2label.8 findfs.8 blkid.8 $(E2IMAGE_MAN) \ - logsave.8 filefrag.8 e2undo.8 $(UUIDD_MAN) @FSCK_MAN@ + logsave.8 filefrag.8 e2freefrag.8 e2undo.8 $(UUIDD_MAN) @FSCK_MAN@ FMANPAGES= mke2fs.conf.5 UPROGS= chattr lsattr uuidgen
@@ -44,6 +44,7 @@ FSCK_OBJS= fsck.o base_device.o ismounte BLKID_OBJS= blkid.o FILEFRAG_OBJS= filefrag.o E2UNDO_OBJS= e2undo.o +E2FREEFRAG_OBJS= e2freefrag.o XTRA_CFLAGS= -I$(srcdir)/../e2fsck -I.
@@ -53,7 +54,7 @@ SRCS= $(srcdir)/tune2fs.c $(srcdir)/mklo $(srcdir)/uuidgen.c $(srcdir)/blkid.c $(srcdir)/logsave.c \ $(srcdir)/filefrag.c $(srcdir)/base_device.c \ $(srcdir)/ismounted.c $(srcdir)/../e2fsck/profile.c \ - $(srcdir)/e2undo.c + $(srcdir)/e2undo.c $(srcdir)/e2freefrag.c LIBS= $(LIBEXT2FS) $(LIBCOM_ERR) DEPLIBS= $(LIBEXT2FS) $(LIBCOM_ERR)
@@ -181,6 +182,10 @@ logsave: logsave.o @echo " LD $@" @$(CC) $(ALL_LDFLAGS) -o logsave logsave.o +e2freefrag: $(E2FREEFRAG_OBJS) + @echo "LD $@" + @$(CC) $(ALL_LDFLAGS) -o e2freefrag $(E2FREEFRAG_OBJS) $(LIBS) + filefrag: $(FILEFRAG_OBJS) @echo " LD $@" @$(CC) $(ALL_LDFLAGS) -o filefrag $(FILEFRAG_OBJS)
@@ -261,6 +266,10 @@ blkid.1: $(DEP_SUBSTITUTE) $(srcdir)/blk @echo " SUBST $@" @$(SUBSTITUTE_UPTIME) $(srcdir)/blkid.1.in blkid.1 +e2freefrag.8: $(DEP_SUBSTITUTE) $(srcdir)/e2freefrag.8.in + @echo " SUBST $@" + @$(SUBSTITUTE_UPTIME) $(srcdir)/e2freefrag.8.in e2freefrag.8 + filefrag.8: $(DEP_SUBSTITUTE) $(srcdir)/filefrag.8.in @echo " SUBST $@" @$(SUBSTITUTE_UPTIME) $(srcdir)/filefrag.8.in filefrag.8
@@ -422,7 +431,7 @@ uninstall: clean: $(RM) -f $(SPROGS) $(USPROGS) $(UPROGS) $(UMANPAGES) $(SMANPAGES) \ $(FMANPAGES) \ - base_device base_device.out mke2fs.static filefrag \ + base_device base_device.out mke2fs.static filefrag e2freefrag \ e2initrd_helper partinfo prof_err.[ch] default_profile.c \ uuidd e2image tune2fs.static tst_ismounted \ \#* *.s *.o *.a *~ core
@@ -499,6 +508,9 @@ uuidgen.o: $(srcdir)/uuidgen.c $(top_src blkid.o: $(srcdir)/blkid.c $(top_srcdir)/lib/blkid/blkid.h \ $(top_builddir)/lib/blkid/blkid_types.h logsave.o: $(srcdir)/logsave.c +e2freefrag.o: $(srcdir)/e2freefrag.c e2freefrag.h \ + $(top_srcdir)/lib/ext2fs/ext2_fs.h $(top_srcdir)/lib/ext2fs/ext2fs.h \ + $(top_srcdir)/lib/ext2fs/bitops.h filefrag.o: $(srcdir)/filefrag.c base_device.o: $(srcdir)/base_device.c $(srcdir)/fsck.h ismounted.o: $(srcdir)/ismounted.c $(top_srcdir)/lib/et/com_err.h