diff options
Diffstat (limited to 'fs/btrfs/compression.c')
| -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;  | 
