我正在寻找一个明确的规范来描述 ioctl 0x1268 (BLKSSZGET) 的预期参数和行为。
这个数字在很多地方都有声明(其中没有一个包含明确的参考来源),例如linux/fs.h
,但我找不到它的规范。
当然,有人在过去的某个时候决定 0x1268 将获得设备的物理扇区大小,并在某处记录了这一点。这些信息来自哪里,我在哪里可以找到它?
编辑:我不是在问 BLKSSZGET 一般做什么,也不是在问它定义在什么标头中。我正在寻找一个明确的标准化源,它说明它应该采用什么参数类型以及它的行为对于任何驱动程序应该是什么实现它。
具体来说,我问是因为在 util-linux 2.23(和 2.24)中似乎存在一个错误,blkdiscard
其中扇区大小被查询到 a uint64_t
,但是高 32 位没有被触及,因为 BLKSSZGET似乎期望一个 32 位整数,这会导致不正确的扇区大小、不正确的对齐计算以及blkdiscard
应该成功的时间失败。因此,在我提交补丁之前,我需要确定问题是否blkdiscard
应该使用 32 位整数,或者我的内核中的驱动程序实现是否应该使用 64 位整数。
编辑 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/。