[lvm-devel] [PATCH] fsadm: add support for btrfs
Lidong Zhong
lzhong at suse.com
Mon Mar 9 06:48:25 UTC 2015
Run `btrfs check` to check filesystem
Run `btrfs filesystem show` to get the filesystem size and
`btrfs filesystem resize` to resize.
Signed-off-by: Lidong Zhong <lzhong at suse.com>
---
scripts/fsadm.sh | 60 ++++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 47 insertions(+), 13 deletions(-)
diff --git a/scripts/fsadm.sh b/scripts/fsadm.sh
index f4ea796..b9683bd 100755
--- a/scripts/fsadm.sh
+++ b/scripts/fsadm.sh
@@ -22,6 +22,7 @@
# ext2/ext3/ext4: resize2fs, tune2fs
# reiserfs: resize_reiserfs, reiserfstune
# xfs: xfs_growfs, xfs_info
+# btrfs: btrfs
#
# Return values:
# 0 success
@@ -56,6 +57,7 @@ FSCK=fsck
XFS_CHECK=xfs_check
# XFS_REPAIR -n is used when XFS_CHECK is not found
XFS_REPAIR=xfs_repair
+BTRFS=btrfs
# user may override lvm location by setting LVM_BINARY
LVM=${LVM_BINARY:-lvm}
@@ -72,6 +74,7 @@ TEMPDIR="${TMPDIR:-/tmp}/${TOOL}_${RANDOM}$$/m"
DM_DEV_DIR="${DM_DEV_DIR:-/dev}"
BLOCKSIZE=
BLOCKCOUNT=
+OLDSIZE=
MOUNTPOINT=
MOUNTED=
REMOUNT=
@@ -157,18 +160,20 @@ cleanup() {
# convert parameter from Exa/Peta/Tera/Giga/Mega/Kilo/Bytes and blocks
# (2^(60/50/40/30/20/10/0))
decode_size() {
- case "$1" in
- *[eE]) NEWSIZE=$(( ${1%[eE]} * 1152921504606846976 )) ;;
- *[pP]) NEWSIZE=$(( ${1%[pP]} * 1125899906842624 )) ;;
- *[tT]) NEWSIZE=$(( ${1%[tT]} * 1099511627776 )) ;;
- *[gG]) NEWSIZE=$(( ${1%[gG]} * 1073741824 )) ;;
- *[mM]) NEWSIZE=$(( ${1%[mM]} * 1048576 )) ;;
- *[kK]) NEWSIZE=$(( ${1%[kK]} * 1024 )) ;;
- *[bB]) NEWSIZE=${1%[bB]} ;;
- *) NEWSIZE=$(( $1 * $2 )) ;;
- esac
- #NEWBLOCKCOUNT=$(round_block_size $NEWSIZE $2)
- NEWBLOCKCOUNT=$(( $NEWSIZE / $2 ))
+ if [ -n "$1" -a -n "$2" ]; then
+ case "$1" in
+ *[eE]) NEWSIZE=$(( ${1%[eE]} * 1152921504606846976 )) ;;
+ *[pP]) NEWSIZE=$(( ${1%[pP]} * 1125899906842624 )) ;;
+ *[tT]) NEWSIZE=$(( ${1%[tT]} * 1099511627776 )) ;;
+ *[gG]) NEWSIZE=$(( ${1%[gG]} * 1073741824 )) ;;
+ *[mM]) NEWSIZE=$(( ${1%[mM]} * 1048576 )) ;;
+ *[kK]) NEWSIZE=$(( ${1%[kK]} * 1024 )) ;;
+ *[bB]) NEWSIZE=${1%[bB]} ;;
+ *) NEWSIZE=$(( $1 * $2 )) ;;
+ esac
+ #NEWBLOCKCOUNT=$(round_block_size $NEWSIZE $2)
+ NEWBLOCKCOUNT=$(( $NEWSIZE / $2 ))
+ fi
if [ $DO_LVRESIZE -eq 1 ]; then
# start lvresize, but first cleanup mounted dirs
@@ -368,6 +373,30 @@ resize_xfs() {
fi
}
+########################
+# Resize btrfs filesystem
+# - mounted for upsize/downsize
+# - cannot resize when unmounted
+########################
+resize_btrfs() {
+ detect_mounted
+ MOUNTPOINT=$MOUNTED
+ if [ -z "$MOUNTED" ]; then
+ MOUNTPOINT=$TEMPDIR
+ temp_mount || error "Cannot mount Btrfs filesystem"
+ fi
+
+ verbose "Parsing $BTRFS filesystem show \"$MOUNTPOINT\""
+ for i in $(LC_ALL=C "$BTRFS" filesystem show "$MOUNTPOINT"); do
+ case "$i" in
+ *"size"*) OLDSIZE=${i##*size};;
+ esac
+ done
+ OLDSIZE=${OLDSIZE%%used*}
+ decode_size $1
+ verbose "Resizing filesystem on device \"$VOLUME\" to $NEWSIZE bytes from $OLDSIZE bytes"
+ dry "$BTRFS" filesystem resize $NEWSIZE "$MOUNTPOINT"
+}
####################
# Resize filesystem
####################
@@ -384,6 +413,7 @@ resize() {
"ext3"|"ext2"|"ext4") resize_ext $NEWSIZE ;;
"reiserfs") resize_reiser $NEWSIZE ;;
"xfs") resize_xfs $NEWSIZE ;;
+ "btrfs") resize_btrfs $NEWSIZE ;;
*) error "Filesystem \"$FSTYPE\" on device \"$VOLUME\" is not supported by this tool" ;;
esac || error "Resize $FSTYPE failed"
cleanup 0
@@ -441,6 +471,10 @@ check() {
# Think about better way....
dry "$XFS_REPAIR" -n -o force_geometry "$VOLUME"
fi ;;
+ "btrfs") if which "$BTRFS" > "$NULL" 2>&1 ; then
+ dry "$BTRFS" check "$VOLUME"
+ fi
+ ;;
*) # check if executed from interactive shell environment
case "$-" in
*i*) dry "$FSCK" $YES $FORCE "$VOLUME" ;;
@@ -462,7 +496,7 @@ test -n "$FSADM_RUNNING" && exit 0
for i in "$TUNE_EXT" "$RESIZE_EXT" "$TUNE_REISER" "$RESIZE_REISER" \
"$TUNE_XFS" "$RESIZE_XFS" "$MOUNT" "$UMOUNT" "$MKDIR" \
"$RMDIR" "$BLOCKDEV" "$BLKID" "$GREP" "$READLINK" \
- "$DATE" "$FSCK" "$XFS_CHECK" "$XFS_REPAIR" "$LVM" ; do
+ "$DATE" "$FSCK" "$XFS_CHECK" "$XFS_REPAIR" "$LVM" "$BTRFS"; do
test -n "$i" || error "Required command definitions in the script are missing!"
done
--
1.8.1.4
More information about the lvm-devel
mailing list