Apa yang dimaksud dengan 'stale file handle' di Linux?

101

Katakanlah saya membuka terminal, dan melalui terminal itu saya telah membuka cdbeberapa direktori. Melalui terminal lain, saya menghapus direktori itu dan memulihkannya kembali dari cadangan yang sama. Ketika saya mencoba ke vimfile dari terminal pertama, di direktori yang sama, mengapa saya mendapatkan pesan kesalahan tentang file handle yang basi? Apa artinya? (Di samping catatan, saya telah menemukan bahwa adalah mungkin untuk melewati masalah ini cd $(pwd).)

IDDQD
sumber
Jika Anda NFS me-mount direktori (beri nama adir) dari host A ke host B, lalu melakukan hal delete-and-restore untuk adir di host A, Anda juga bisa mendapatkan error "Stale file handle" saat mengakses adir di host B. Gunakan perintah touchpada host A agar bisa normal.
rustyhu

Jawaban:

83

Ketika direktori dihapus, inode untuk direktori itu (dan inode untuk isinya) didaur ulang. Pointer yang dimiliki shell Anda ke inode direktori itu (dan inode isinya) sekarang tidak lagi valid. Ketika direktori dipulihkan dari cadangan, inode lama tidak (harus) digunakan kembali; direktori dan isinya disimpan di inode acak. Satu-satunya hal yang tetap sama adalah direktori induk menggunakan kembali nama yang sama untuk direktori yang dipulihkan (karena Anda menyuruhnya).

Sekarang jika Anda mencoba untuk mengakses konten direktori yang masih diarahkan oleh shell asli Anda, itu mengkomunikasikan permintaan itu ke sistem file sebagai permintaan untuk inode asli, yang telah didaur ulang (dan bahkan mungkin digunakan untuk sesuatu sangat berbeda sekarang). Jadi Anda mendapatkan stale file handlepesan karena Anda meminta beberapa data yang tidak ada.

Saat Anda melakukan cdoperasi, shell mengevaluasi ulang lokasi inode dari tujuan apa pun yang Anda berikan. Sekarang shell Anda mengetahui inode baru untuk direktori (dan inode baru untuk isinya), permintaan masa depan untuk isinya akan valid.

dg99
sumber
Ah, jadi ini hanya cara sistem memperlakukan pointer inode tidak valid / null?
IDDQD
Iya. Saya tidak cukup tahu tentang detailnya untuk mengetahui apa yang akan terjadi jika, misalnya, Anda mencoba mereferensikan inode yang telah didaur ulang untuk menunjukkan sesuatu yang lain. Apakah Anda masih mendapatkan pegangan file yang basi? Atau apakah Anda mendapatkan data yang tidak terduga?
dg99
1
Saya tidak berpikir sistem akan menggunakannya kembali karena seseorang sebenarnya menggunakan I-node itu dengan menjadikannya sebagai direktori saat ini.
Samuel Åslund