GETBLKSIZE64

GETBLKSIZE64とNBDの組み合せではまる。

uint64_t size;
fd = ::open(getNodePath().c_str(), &size);
ioctl(fd, GETBLKSIZE64, &size);

エラー処理は省略。



NBDは、接続が完了前にioctlをやると失敗する。
失敗するのは良いのだけど、エラーを返さないで、ヘンな値を返してくる。なんてこった。


タチの悪いことにサーバーの応答が速かったときは成功するので、再現するときとしないときがある。
気づくまでに時間がかかってしまった。


で、気づいたのは良いけど、どうやって対処すれば…
とりあえずsleep(3);を入れてみたけど、場合により失敗する。