#!/bin/sh # # Usage: # xfs_bmap -v oldfile | cp_extents newfile # or # cp_extents newfile < given_bmap_output # # Expect some form of bmap output on stdin. # Done this way as sometimes the bmap output has come from email # or from the web. # # Reverse sort so that we write in backwards direction such that # the allocator doesn't detect a sequence. # Simple script which worked for what I wanted; not sure if it will # be useful in general. # # TODO: add support for unwritten extents # # Example input: # # EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL FLG # 0: [0..31]: hole 32 # 1: [32..55]: 101029448..101029471 12 366152..366175 24 # 2: [56..87]: hole 32 # 3: [88..199]: 101029504..101029615 12 366208..366319 112 # 4: [200..255]: hole 56 # 5: [256..279]: 101029672..101029695 12 366376..366399 24 # 6: [280..559]: hole 280 # 7: [560..647]: 101029976..101030063 12 366680..366767 88 # 8: [648..695]: hole 48 # 9: [696..823]: 101030112..101030239 12 366816..366943 128 # 10: [824..855]: hole 32 # 11: [856..879]: 101030272..101030295 12 366976..366999 24 # 12: [880..943]: hole 64 # 13: [944..1015]: 101030360..101030431 12 367064..367135 72 # 14: [1016..1055]: hole 40 # 15: [1056..1175]: 101030472..101030591 12 367176..367295 120 # 16: [1176..1199]: hole 24 # 17: [1200..1279]: 101030616..101030695 12 367320..367399 80 # 18: [1280..1311]: hole 32 # 19: [1312..1351]: 101030728..101030767 12 367432..367471 40 # 20: [1352..1447]: hole 96 # 21: [1448..1535]: 101030864..101030951 12 367568..367655 88 # 22: [1536..1567]: hole 32 # 23: [1568..3135]: 101461064..101462631 12 797768..799335 1568 # 24: [3136..3543]: 101465928..101466335 12 802632..803039 408 # outfile=$1 sed -e 's/[][]//g' |\ sort -nr -k1,1 |\ tee |\ awk -v file=$outfile ' /EXT:/ { next } # ignore header /[0-9][0-9]*:/ { range = $2 type = $3 #printf("range = %s, type = %s\n", range, type) if (type ~ /hole/) { next } else { n = split(range, arr, ".") start = arr[1] end = arr[3] size = end - start + 1 cmd = sprintf("xfs_io -d -f -c \"pwrite -b %ds %ds %ds\" %s", size, start, size, file) printf("start = %d, end = %d\n", start, end) printf("cmd = %s\n", cmd) system(cmd) } } '