システムクラッシュ後に特定の(ファイル|ディレクトリ)を触るとターミナルが死亡

#前提
ファイルシステムに UFS であるコト。
ZFS は inode 概念が無いので対応不可(笑)
実際に発生した事象は FreeBSD 11.3-RELEASE-p3 ix86 です。

#背景
漠然と www/firefox の build 中にいつも流れるコンパイル中のメッセージがスクロールせずに止まったままに気が付き、Ctrl+C でコンソールに中断要請しても ^c と表示してプロンプトに戻ってこなかった。
仕方なく強制再起動を実施し、通常の操作が出来るように見えたが、特定のディレクトリを触りに行くと、症状が再発した。

#調査
先ずは何が起こっているのは調査をするに際し、特定の ports の make 中に起こっていることが分かったので、シングルユーザーモードで当該ファイルシステムの全調査を試みる。

```text
# find /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app/src/main/res -ls
14780448 8 drwxr-xr-x 3 root weel 1024 4月 8 04:57 /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app/src/main/res/
14780669 8 drwxr-xr-x 2 root weel 1024 4月 8 04:57 /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app/src/main/res/drawable-xhdpi
14780669 8 drwxr-xr-x 2 root weel 1024 4月 8 04:57 /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app/src/main/res/drawable-xhdpi/>
```

☝これ以上進まないので、この inode に問題が含まれていることが分かる。

```text
# fsck_ufs -yp /dev/ada0s1a

** /dev/ada0s1a

USE JOURNAL? [yn] y

** SU+J recovering /dev/ada0s1a
Journal timestamp does not match fs mount time
** Skipping journal, falling through to full fsck 

** Last Mounted on /
** Root file system
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
MISSING '.'  I=14780669  OWNER=root MODE=40755
SIZE=1024 MTIME=Apr  9 13:57 2020
DIR=/usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app/src/main/res/drawable-xhdpi

UNEXPECTED SOFT UPDATE INCONSISTENCY
CANNOT FIX, FIRST ENTRY IN DIRECTORY CONTAINS >

UNEXPECTED SOFT UPDATE INCONSISTENCY
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cyl groups
988514 files, 3456761 used, 28027574 free (344238 frags, 3460417 blocks, 1.1% fragmentation)

***** FILE SYSTEM IS CLEAN *****
```

上記の調査結果から inode 14780669 に通常では予期しない事が起こっている事が判明。

#不具合修正
facebook で尋ねると幾つかの回答が寄せられたので、試してみることにした。

```text:１
[yohgaki@dev tmp]$ touch '>'
[yohgaki@dev tmp]$ ls '>'
[yohgaki@dev tmp]$ rm '>'
rm: 通常の空ファイル '>' を削除しますか? y
[yohgaki@dev tmp]$ ls
```

```text:２
そのディレクトリのinodeを調べて、clri(8)、fsck(8)。
その前にメディアを検査かしら。
```

```test:３
rm -r -i 変な名前のファイルのあるディレクトリ ではだめですかね？ 
```

１番と３番を試すと、ディレクトリを触りに行ったとたんにコンソールが固まり、状況変わらず。
残された２番が的確な手法であった。

```text:１番の結果
# cd /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app/src/main/
# touch 'res/>'
```

ここで先に進まない。

```text:３番の結果
# rm -rf -i /usr/ports/lang/spidermonkey60/work/
remove /usr/ports/lang/spidermonkey60/work/? y
remove /usr/ports/lang/spidermonkey60/work/firefox-60.9.0? y
remove /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile? y
remove /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android? y
remove /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app? y
remove /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app/src? y
remove /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app/src/main? y
remove /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app/src/main/res? y
```

ここで先に進まない。


```text:２番の実施
# clri /dev/ada0s1a 14780669
```

マウントしてファイルを触ってみる。

```text
# mount /dev/ada0s1a /
# rm -rf /usr/ports/lang/spidermonkey60/work/
rm: /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app/src/main/res/drawable-xhdpi: 無効なファイル記述子です
rm: /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app/src/main/res: ディレクトリが空ではありません
rm: /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app/src/main: ディレクトリが空ではありません
rm: /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app/src: ディレクトリが空ではありません
rm: /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app: ディレクトリが空ではありません
rm: /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android: ディレクトリが空ではありません
rm: /usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile: ディレクトリが空ではありません
rm: /usr/ports/lang/spidermonkey60/work/firefox-60.9.0: ディレクトリが空ではありません
rm: /usr/ports/lang/spidermonkey60/work/: ディレクトリが空ではありません
```

消せないじゃん👿

再びシングルユーザモードで fsck してみた。

```text
# fsck -py /dev/ada0s1a
** /dev/ada0s1a
** Last Mounted on /
** Root file system
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
UNALLOCATED  I=14780669  OWNER=root MODE=0
SIZE=0 MTIME=Jan  1 09:00 1970
NAME=/usr/ports/lang/spidermonkey60/work/firefox-60.9.0/mobile/android/app/src/main/res/drawable-xhdpi

UNEXPECTED SOFT UPDATE INCONSISTENCY

REMOVE? yes

** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
LINK COUNT DIR I=14780448  OWNER=root MODE=40755
SIZE=1024 MTIME=Apr  9 13:57 2020  COUNT 3 SHOULD BE 2
ADJUST? yes

** Phase 5 - Check Cyl groups
FREE BLK COUNT(S) WRONG IN SUPERBLK
SALVAGE? yes

SUMMARY INFORMATION BAD
SALVAGE? yes

BLK(S) MISSING IN BIT MAPS
SALVAGE? yes

988519 files, 3456763 used, 28027572 free (344164 frags, 3460426 blocks, 1.1% fragmentation)

***** FILE SYSTEM MARKED DIRTY *****

***** FILE SYSTEM WAS MODIFIED *****

***** PLEASE RERUN FSCK *****
# fsck -fy /dev/ada0s1a
** /dev/ada0s1a
** Last Mounted on /
** Root file system
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cyl groups
988519 files, 3456763 used, 28027572 free (344164 frags, 3460426 blocks, 1.1% fragmentation)

***** FILE SYSTEM MARKED CLEAN *****
```

このあと、再びマウントして当該ディレクトリを触りに行っても固まらず、問題なくファイル操作が出来るようになった。

#結末
原因は不明だが、 inode が壊れた時には clri コマンドが有効だと初めて知った。
マダマダ勉強不足を突き付けられた瞬間で、回答よ寄せてもらった各人には感謝しかない。