|
@@ -296,11 +296,21 @@ void balance_dirty_pages_ratelimited_nr(struct address_space *mapping,
|
|
|
}
|
|
|
EXPORT_SYMBOL(balance_dirty_pages_ratelimited_nr);
|
|
|
|
|
|
-void throttle_vm_writeout(void)
|
|
|
+void throttle_vm_writeout(gfp_t gfp_mask)
|
|
|
{
|
|
|
long background_thresh;
|
|
|
long dirty_thresh;
|
|
|
|
|
|
+ if ((gfp_mask & (__GFP_FS|__GFP_IO)) != (__GFP_FS|__GFP_IO)) {
|
|
|
+ /*
|
|
|
+ * The caller might hold locks which can prevent IO completion
|
|
|
+ * or progress in the filesystem. So we cannot just sit here
|
|
|
+ * waiting for IO to complete.
|
|
|
+ */
|
|
|
+ congestion_wait(WRITE, HZ/10);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
for ( ; ; ) {
|
|
|
get_dirty_limits(&background_thresh, &dirty_thresh, NULL);
|
|
|
|
|
@@ -317,7 +327,6 @@ void throttle_vm_writeout(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/*
|
|
|
* writeback at least _min_pages, and keep writing until the amount of dirty
|
|
|
* memory is less than the background threshold, or until we're all clean.
|