From e6d60ef292bea87ef647235a3bc7a3214e7fa2ca Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Sat, 24 Jan 2026 15:52:22 +0100 Subject: [PATCH] Add compression, btree_usage, reconcile and options --- bcachefs.sh | 124 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 97 insertions(+), 27 deletions(-) diff --git a/bcachefs.sh b/bcachefs.sh index db00bd8..9ad8c43 100644 --- a/bcachefs.sh +++ b/bcachefs.sh @@ -18,40 +18,43 @@ function convert_to_bytes() { }' <<< "$1" } +function ensure_comma() { + if [[ $FIRST -eq 1 ]] + then + FIRST= + else + echo -n , + fi +} FSPATH="/mnt" -UUID= - PARSER_STATE=0 -#echo switch to 0 while IFS= read -r line; do case $PARSER_STATE in 0) if [[ $line =~ ^Filesystem:[[:space:]]+([^[:space:]]+)$ ]] then uuid="${BASH_REMATCH[1]}" -# echo "uuid=$UUID" elif [[ $line == Data\ type* ]] then - #echo switch to 1 PARSER_STATE=1 - #continue elif [[ $line == "Compression:" ]] then - #echo switch to 2 + echo -n "bcachefs_compression,fspath=\"$FSPATH\",uuid=\"$uuid\" " + FIRST=1 PARSER_STATE=2 - #continue elif [[ $line == "Btree usage:" ]] then - #echo switch to 3 + echo -n "bcachefs_btree_usage,fspath=\"$FSPATH\",uuid=\"$uuid\" " + FIRST=1 PARSER_STATE=3 - #continue - elif [[ $line == "Pending reconcile:" ]] + elif [[ $line =~ ^Pending\ reconcile: ]] then - #echo switch to 4 + echo -n "bcachefs_reconcile,fspath=\"$FSPATH\",uuid=\"$uuid\" " + FIRST=1 PARSER_STATE=4 - #continue + REMAINING=(replicas checksum erasure_code compression target high_priority pending) elif [[ $line =~ ^([^ ]+)\ \(device\ ([0-9]+)\):[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+([0-9]+)%$ ]] then blockdev="${BASH_REMATCH[3]}" @@ -59,53 +62,103 @@ while IFS= read -r line; do then blockdev="/dev/$blockdev" fi - echo -n "bcachefs,fspath=\"$FSPATH\",UUID=\"$UUID\",devlabel=\"${BASH_REMATCH[1]}\",devid=${BASH_REMATCH[2]},blockdev=\"$blockdev\" mode=\"${BASH_REMATCH[4]}\",usage=${BASH_REMATCH[5]}" + echo -n "bcachefs_devices,fspath=\"$FSPATH\",uuid=\"$uuid\",devlabel=\"${BASH_REMATCH[1]}\",devid=${BASH_REMATCH[2]},blockdev=\"$blockdev\" mode=\"${BASH_REMATCH[4]}\",usage=${BASH_REMATCH[5]}" - #echo switch to 5 label="$label" devid="$devid" block_device="$block_device" mode="$mode" usage="$usage" PARSER_STATE=5 - #continue + #else + #echo unknown? fi ;; 1) if [[ "$line" == "" ]] then - #echo switch to 0 PARSER_STATE=0 - #continue fi ;; 2) if [[ "$line" == "" ]] then - #echo switch to 0 + echo PARSER_STATE=0 - #continue + elif [[ $line =~ ^([^[:space:]]+)[[:space:]]*(.*)$ ]] + then + field="${BASH_REMATCH[1]// /_}" + rest="${BASH_REMATCH[2]}" + + read -r val1 val2 val3 <<<"$rest" + val1="$(convert_to_bytes "$val1")" + + ensure_comma + + echo -n "${field}_compressed=$val1" + if [[ ! -z "$val2" ]] + then + val2="$(convert_to_bytes "$val2")" + echo -n ",${field}_uncompressed=$val2" + fi + if [[ ! -z "$val3" ]] + then + val3="$(convert_to_bytes "$val3")" + echo -n ",${field}_avgextsize=$val3" + fi + #else + #echo unknown? fi ;; 3) if [[ "$line" == "" ]] then - #echo switch to 0 + echo PARSER_STATE=0 - #continue + elif [[ $line =~ ^([^:]+)[:space:]+(.*)$ ]] + then + field="${BASH_REMATCH[1]// /_}" + val="${BASH_REMATCH[2]}" + val="$(convert_to_bytes "$val")" + + ensure_comma + + echo -n "$field=$val" + #else + #echo unknown? fi ;; 4) if [[ "$line" == "" ]] then - #echo switch to 0 + for field in "${REMAINING[@]}" + do + ensure_comma + echo -n "${field}_data=0,${field}_metadata=0" + done + + echo PARSER_STATE=0 - #continue + elif [[ $line =~ ^([^:]+):[[:space:]]*(.*)$ ]] + then + field="${BASH_REMATCH[1]// /_}" + rest="${BASH_REMATCH[2]}" + + read -r val1 val2 <<<"$rest" + val1="$(convert_to_bytes "$val1")" + val2="$(convert_to_bytes "$val2")" + + ensure_comma + + echo -n "${field}_data=$val1,${field}_metadata=$val2" + + REMAINING=( "${REMAINING[@]/$field}" ) + #else + #echo unknown? fi ;; 5) if [[ "$line" == "" ]] then echo - #echo switch to 0 PARSER_STATE=0 - #continue - elif [[ $line =~ ^[[:space:]]*([^:]+):[[:space:]]*(.*)$ ]]; then + elif [[ $line =~ ^[[:space:]]*([^:]+):[[:space:]]*(.*)$ ]] + then field="${BASH_REMATCH[1]// /_}" rest="${BASH_REMATCH[2]}" @@ -133,3 +186,20 @@ while IFS= read -r line; do # echo "Got line: $line" #fi done < <(sudo bcachefs fs usage -a "$FSPATH") + +cd "/sys/fs/bcachefs/${uuid}/options" || exit 1 +echo -n "bcachefs_options,fspath=\"$FSPATH\",uuid=\"$uuid\" " +FIRST=1 +for i in * +do + if [[ $FIRST == 1 ]] + then + FIRST= + else + echo -n , + fi + + echo -n "${i}=\"$(cat "$i")\"" +done + +echo