diff options
author | Sergio López <slpml@sinrega.org> | 2011-09-29 11:44:40 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2011-10-03 22:33:04 +0200 |
commit | 7f0e0da1fb514c30df296e22481761b77f6d3a6a (patch) | |
tree | 5ac47a57fdb11bca4ad0379c076eb690f7db1633 | |
parent | 2f8e829bdc2e868d1872e21b4acae404a2316e68 (diff) |
Sync pager before clearing MAY_CACHE flag
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.
-rw-r--r-- | ext2fs/pager.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/ext2fs/pager.c b/ext2fs/pager.c index 082537cd..0136f9b1 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, 0); + pager_change_attributes (pager, 0, MEMORY_OBJECT_COPY_DELAY, 0); + } if (pager) ports_port_deref (pager); } |