【发布时间】:2020-01-12 15:14:43
【问题描述】:
据我了解,GNU/Linux 上的fstrim 实用程序只是一个实用程序,而不是内核模块;它如何避免在发现给定块未使用和发出ioctl(2) FITRIM 命令来修剪它之间的竞争条件?
【问题讨论】:
标签: linux linux-kernel race-condition
据我了解,GNU/Linux 上的fstrim 实用程序只是一个实用程序,而不是内核模块;它如何避免在发现给定块未使用和发出ioctl(2) FITRIM 命令来修剪它之间的竞争条件?
【问题讨论】:
标签: linux linux-kernel race-condition
这很容易通过阅读源代码来回答。
fstrim utility 与确定哪些块已使用或未使用无关,也没有用于执行任何此类操作的代码。它只是在-o 和-l 选项指定的整个设备范围上调用FITRIM ioctl,或者默认情况下调用整个设备(start = 0, len = ULLONG_MAX)。据了解,内核应该只修剪该范围内的 unused 块,并由内核确定这些块是哪些块,并酌情锁定。正如您所说,从用户空间执行此操作几乎是不可能的,而不会有竞争或死锁的风险。
Here 是处理 ext4 修剪的内核代码。我不是 fs 代码方面的专家,但似乎很明显正在发生某种锁定。
【讨论】: