テクノロジー · 実用ガイド

「Invalid cross-device link」— コピーや削除の前に syscall を証明

EXDEV は mount をまたぐ rename だけでなく path policy の拒否でも発生します。caller、syscall、mount ID を保存し、destination 検証まで source を残す契約を選びます。

「Invalid cross-device link」— コピーや削除の前に syscall を証明
オリジナルイラスト:program、arguments、cwd、namespace、入力と解決後の path、errno、時刻を記録し、wrapper の retry 前の失敗を残します。 Watch at Ease

“Invalid cross-device link” は EXDEV という errno 名であり診断そのものではありません。rename() の mount 境界と openat2() の containment policy を分けます。

filesystem 間の move は通常 copy と source 削除で、単一の atomic rename ではありません。

正確な failure boundary を固定

program、arguments、cwd、namespace、入力と解決後の path、errno、時刻を記録し、wrapper の retry 前の失敗を残します。

必要最小限の trace で syscall と path を特定します。同じ文言でも同じ修正ではありません。

mount identity と path resolution を比較

host の drive 名ではなく実プロセスから見える mount ID を比べます。bind mount と container は rename domain を変えます。

destination parent、type、permission、space、collision policy は別に確認します。

rename と openat2 policy を混同しない

rename() なら mount の違い、openat2() なら flags と absolute path、symlink、..、mount crossing が containment を破るか確認します。

errno を消すために security boundary を無効化せず、path contract か許可 root 内の destination を直します。

安全な cross-filesystem fallback を設計

真の cross-filesystem では destination filesystem に temporary entry を作り、data と metadata を copy、durability contract に従い flush して同一 destination 内で rename します。

collision を明示し、copy または verify 失敗時は source を残し partial destination を隔離します。

source 削除前に destination を検証

size と適切な digest、必要な owner、mode、time、link、ACL、xattr を確認します。tree は manifest と error count も必要です。

destination acceptance 後だけ source を削除し、rename か copy-and-remove かを記録します。

「Invalid cross-device link」— コピーや削除の前に syscall を証明
オリジナルイラスト:destination acceptance 後だけ source を削除し、rename か copy-and-remove かを記録します。 Watch at Ease