为什么在屏蔽 GFP_NOFS 时递归文件系统调用不是一个好主意

why recursive filesystem calls would be a bad idea when the GFP_NOFS is masked

来自 LDD3 第 214 页:

GFP_NOIO
GFP_NOFS
这些标志的功能类似于 GFP_KERNEL,但它们对内核可以做什么来满足请求添加了限制。 GFP_NOFS 分配不允许执行任何文件系统调用,而 GFP_NOIO 根本不允许启动任何 I/O。它们主要用于文件系统和虚拟内存代码中,在这些代码中可以允许分配休眠,但是递归文件系统调用不是一个好主意。

我想知道当 GFP_NOFS 被屏蔽时,为什么递归文件系统调用不是一个好主意?

谢谢!

I want to know why recursive filesystem calls is a bad idea, when GFP_NOFS is masktd?

这是另一种方式:您使用 GFP_NOFS 表示分配可以休眠,但不能与文件系统交互(例如:将一些内存块转储到磁盘以释放一些空闲内存)。它是在代码的关键区域完成的。
例如:你进入了文件系统调用,为这个文件系统锁定了一些全局互斥量,称为 kmalloc。如果 kmalloc 将尝试调用另一个文件系统函数,该函数锁定相同的互斥体 - 我们将出现死锁。所以我们提供GFP_NOFS标志。