99fs-lib/fs-lib.sh: fsck btrfs via mounting like xfs
authorHarald Hoyer <harald@redhat.com>
Thu, 22 Sep 2011 13:12:14 +0000 (15:12 +0200)
committerHarald Hoyer <harald@redhat.com>
Thu, 22 Sep 2011 13:37:28 +0000 (15:37 +0200)
btrfsck is only for manual repairing your filesystem

modules.d/99fs-lib/fs-lib.sh

index f7b20dd..edb5852 100755 (executable)
@@ -59,7 +59,7 @@ fsck_able() {
             ;;
         btrfs)
             type btrfsck >/dev/null 2>&1 &&
-            _drv="_drv=btrfsck fsck_drv_com" &&
+            _drv="_drv=none fsck_drv_btrfs" &&
             return 0
             ;;
         *)
@@ -104,6 +104,37 @@ fsck_drv_xfs() {
     return $_ret
 }
 
+fsck_drv_btrfs() {
+    local _ret
+
+    # fs must be cleanly mounted (and umounted) first, before attempting any
+    # btrfs tools - if this works, nothing else should be needed
+    # note, that user is always dropped into the shell, if the filesystem is
+    # not mountable or if -f flag is found among _fop
+    mkdir -p /tmp/.btrfs
+
+    info "trying to mount $_dev"
+    if mount -t btrfs "$_dev" "/tmp/.btrfs" >/dev/null 2>&1; then
+        _ret=0
+        info "btrfs: $_dev is clean"
+        umount "$_dev" >/dev/null 2>&1
+    else
+        _ret=4
+        warn "*** $_dev is unmountable"
+    fi
+    if [ $_ret -gt 0 ] || strstr "$_fop" "-f"; then
+        warn "*** Dropping you to a shell. You have"
+        warn "*** btrfsck available."
+        warn "*** Note that if btrfs didn't mount properly, it's"
+        warn "*** probably pretty serious condition."
+        emergency_shell -n "(Repair filesystem)"
+    fi
+
+    rm -r /tmp/.btrfs
+    return $_ret
+}
+
+
 # common code for checkers that follow usual subset of options and return codes
 fsck_drv_com() {
     local _ret