From: kubo@... Date: 2017-12-07T11:37:11+00:00 Subject: [ruby-dev:50338] [Ruby trunk Feature#13731] inode for Windows on ReFS Issue #13731 has been updated by kubo (Takehiro Kubo). 2.5 に入らないかもしれないとのこと、了解です。 ついでですが、ReFSボリュームを作ってファイルを2つ作成し、FILE_ID_INFO の128ビットの値と nFileIndexHigh/Low の64ビットの値を取得してみました。 FILE_ID_INFOの値をリトルエンディアン128ビット整数として表記すると、以下の値が取れました。(32ビット毎にアンダースコアを付与) * 0x00000000_00000001_00000000_00000600 * 0x00000000_00000002_00000000_00000600 一方、同じファイルの nFileIndexHigh/Low の値はそれぞれ以下のようになっていました。 * 0x30000000_00001600 * 0x30000000_00002600 サンプル数が少ないので完全に当てずっぽうですが、128ビットの値をビットシフトして、xor した値を64ビットの値として使い、64ビットにしたときの衝突が少ないように工夫しているのかもしれません。 ---------------------------------------- Feature #13731: inode for Windows on ReFS https://bugs.ruby-lang.org/issues/13731#change-68223 * Author: kubo (Takehiro Kubo) * Status: Assigned * Priority: Normal * Assignee: usa (Usaku NAKAMURA) * Target version: ---------------------------------------- #11216 でWindowsでのinodeの代用としてBY_HANDLE_FILE_INFORMATION構造体の メンバ、nFileIndexHigh/Lowを使っていますが、ReFS ではこの値ではユニークに なりません。ReFSでは64ビットではなくて、128ビットでユニークな番号になります。 In https://msdn.microsoft.com/en-us/library/windows/desktop/aa363788(v=vs.85).aspx The ReFS file system, introduced with Windows Server 2012, includes 128-bit file identifiers. To retrieve the 128-bit file identifier use the GetFileInformationByHandleEx function with FileIdInfo to retrieve the FILE_ID_INFO structure. The 64-bit identifier in this structure is not guaranteed to be unique on ReFS. 128ビットの数字を入れるには現行の struct stati64 では足りません。しかし、 #13726 のパッチが受け入れられたなら stat 構造体の定義が変わるので、ついでに st_ino を 128ビットにしたら(もしくは st_ino を 64ビットにして、64ビットのメンバをもうひと つ追加したら)どうでしょうか? ruby 2.5 になるタイミングならABI非互換の変更も入れられるでしょう。 -- https://bugs.ruby-lang.org/