summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.com>2016-04-27 03:07:39 +0200
committerDavid Sterba <dsterba@suse.com>2016-04-27 03:07:39 +0200
commitae55b9ec7ac117c05ff866500425fe8b4accfebe (patch)
treef8809792f88ccb97431f59981e9882e353172412
parentbtrfs: make find_workspace always succeed (diff)
downloadlinux-ae55b9ec7ac117c05ff866500425fe8b4accfebe.tar.xz
linux-ae55b9ec7ac117c05ff866500425fe8b4accfebe.zip
btrfs: make find_workspace warn if there are no workspaces
Be verbose if there are no workspaces at all, ie. the module init time preallocation failed. Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--fs/btrfs/compression.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index c70625560265..658c39b70fba 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -834,7 +834,21 @@ again:
* workspace preallocated for each type and the compression
* time is bounded so we get to a workspace eventually. This
* makes our caller's life easier.
+ *
+ * To prevent silent and low-probability deadlocks (when the
+ * initial preallocation fails), check if there are any
+ * workspaces at all.
*/
+ if (atomic_read(total_ws) == 0) {
+ static DEFINE_RATELIMIT_STATE(_rs,
+ /* once per minute */ 60 * HZ,
+ /* no burst */ 1);
+
+ if (__ratelimit(&_rs)) {
+ printk(KERN_WARNING
+ "no compression workspaces, low memory, retrying");
+ }
+ }
goto again;
}
return workspace;