diff options
author | David Sterba <dsterba@suse.com> | 2016-04-27 03:07:39 +0200 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2016-04-27 03:07:39 +0200 |
commit | ae55b9ec7ac117c05ff866500425fe8b4accfebe (patch) | |
tree | f8809792f88ccb97431f59981e9882e353172412 | |
parent | btrfs: make find_workspace always succeed (diff) | |
download | linux-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.c | 14 |
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; |