Clearing MAY_CACHE flag on a pager initiates a memory object termination if this one is not referenced anymore. If the object has a significant number of dirty pages (i.e. a file recently created was unlinked before diskfs periodical sync) this operation generates a lot of stress on the translator. This is one of the most common sources for thread storms.
Sync'ing the pager before clearing that flag ensures that there aren't dirty pages in the object before its termination. * ext2fs/pager.c (drop_pager_softrefs): Sync pager before clearing MAY_CACHE flag. --- ext2fs/pager.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/ext2fs/pager.c b/ext2fs/pager.c index 082537c..89a1b71 100644 --- a/ext2fs/pager.c +++ b/ext2fs/pager.c @@ -851,7 +851,10 @@ drop_pager_softrefs (struct node *node) spin_unlock (&node_to_page_lock); if (MAY_CACHE && pager) - pager_change_attributes (pager, 0, MEMORY_OBJECT_COPY_DELAY, 0); + { + pager_sync (pager, 1); + pager_change_attributes (pager, 0, MEMORY_OBJECT_COPY_DELAY, 0); + } if (pager) ports_port_deref (pager); } -- 1.7.6