期待される引数と ioctl 0x1268 (BLKSSZGET) の動作を説明する最終的な仕様を探しています。
この番号は、 などの多くの場所で宣言されています (決定的な参照元を含む場所はありません) が、そのlinux/fs.h
仕様を見つけることができません。
確かに、過去のある時点で、誰かが 0x1268 でデバイスの物理セクター サイズを取得できると判断し、それをどこかに文書化しました。この情報はどこから来て、どこで見つけることができますか?
編集: BLKSSZGET が一般的に何をするかを尋ねているわけでも、それが定義されているヘッダーを尋ねているわけでもありません。どのような引数の型をとるべきか、どのようなドライバーに対してどのような動作をすべきかを述べた、決定的で標準化されたソースを探しています。実装します。
具体的には、util-linux 2.23 (および 2.24) にバグがあり、セクター サイズが にクエリされているように見えるので質問していますが、BLKSSZGETは 32 ビット整数を期待しているように見えるため、上位 32 ビットは変更されていません。 、そしてこれは、不正確なセクターサイズ、不正確なアライメント計算、および成功するはずの失敗につながります。そのため、パッチを送信する前に、問題が32 ビット整数を使用する必要があるのか、それともカーネルのドライバー実装が 64 ビット整数を使用する必要があるのかを、確実に判断する必要があります。blkdiscard
uint64_t
blkdiscard
blkdiscard
編集 2: 話題になっているので、提案されたパッチが間違っていると推定するblkdiscard
のは次のとおりです。
--- sys-utils/blkdiscard.c-2.23 2013-11-01 18:28:19.270004947 -0400
+++ sys-utils/blkdiscard.c 2013-11-01 18:29:07.334002382 -0400
@@ -71,7 +71,8 @@
{
char *path;
int c, fd, verbose = 0, secure = 0;
- uint64_t end, blksize, secsize, range[2];
+ uint64_t end, blksize, range[2];
+ uint32_t secsize;
struct stat sb;
static const struct option longopts[] = {
@@ -146,8 +147,8 @@
err(EXIT_FAILURE, _("%s: BLKSSZGET ioctl failed"), path);
/* align range to the sector size */
- range[0] = (range[0] + secsize - 1) & ~(secsize - 1);
- range[1] &= ~(secsize - 1);
+ range[0] = (range[0] + (uint64_t)secsize - 1) & ~((uint64_t)secsize - 1);
+ range[1] &= ~((uint64_t)secsize - 1);
/* is the range end behind the end of the device ?*/
end = range[0] + range[1];
たとえば、 https://www.kernel.org/pub/linux/utils/util-linux/v2.23/に適用されます。