#!/usr/bin/ruby # convert existing files on an ext4 filesystem to use extents # after an upgrade from ext3 # can be run on a live mounted rw filesystem (use at your own risks) # (c) Y. Guillot 2010 # redistribute under the WtfPLv2 EXT4_IOC_MIGRATE = (?f.ord << 8) | 9 $count = 0 $t = Time.now def migrate(f) if Time.now > $t+0.4 $stderr.print(' '*80+"\r"+f+"\r") $t = Time.now end case File.ftype(f) when 'directory' Dir.entries(f).each { |e| next if e == '.' or e == '..' migrate(File.join(f, e)) } when 'file' File.open(f) { |fd| fd.ioctl(EXT4_IOC_MIGRATE, 0) } $count += 1 end rescue Errno::EINVAL # may already use extents rescue puts "failed to migrate #{f.inspect}: #$!" end ARGV.each { |f| migrate f } puts ' '*80+"\r"+"converted #$count files"