据我了解,GNU / Linux上的fstrim
实用程序只是一个实用程序,而不是内核模块;在发现给定的块未使用和发出ioctl(2) FITRIM
命令对其进行修剪之间,如何避免出现竞争情况?
这很容易阅读源代码。
fstrim
utility与确定使用或未使用的块没有关系,并且没有执行任何操作的代码。它仅在由fstrim
和FITRIM
选项指定的设备的整个范围(默认情况下,整个设备(-o
))上调用-l
ioctl。可以理解,内核仅应修整该范围内的unused块,并且由内核来确定哪些块是适当的,并锁定。正如您所说,要在用户空间中做到这一点而又不冒种族或僵局的风险,几乎是不可能的。
start = 0, len = ULLONG_MAX
是处理ext4的修整的内核代码。我不是fs代码方面的专家,但是显然某种锁定正在发生。