btrfs: make find_workspace warn if there are no workspaces
authorDavid Sterba <dsterba@suse.com>
Wed, 27 Apr 2016 01:07:39 +0000 (03:07 +0200)
committerDavid Sterba <dsterba@suse.com>
Tue, 10 May 2016 07:46:16 +0000 (09:46 +0200)
Be verbose if there are no workspaces at all, ie. the module init time
preallocation failed.

Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/compression.c

index c706255602658418317abad7d52735a9dd2941ca..658c39b70fba2e5878693aadbb317389b0970969 100644 (file)
@@ -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;