diff options
Diffstat (limited to 'kernel/power/hibernate.c')
| -rw-r--r-- | kernel/power/hibernate.c | 33 | 
1 files changed, 33 insertions, 0 deletions
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index 4b0b7cf2e019..76b7ff619c90 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c @@ -47,6 +47,15 @@ dev_t swsusp_resume_device;  sector_t swsusp_resume_block;  __visible int in_suspend __nosavedata; +static const char *default_compressor = CONFIG_HIBERNATION_DEF_COMP; + +/* + * Compression/decompression algorithm to be used while saving/loading + * image to/from disk. This would later be used in 'kernel/power/swap.c' + * to allocate comp streams. + */ +char hib_comp_algo[CRYPTO_MAX_ALG_NAME]; +  enum {  	HIBERNATION_INVALID,  	HIBERNATION_PLATFORM, @@ -732,6 +741,17 @@ int hibernate(void)  		return -EPERM;  	} +	/* +	 * Query for the compression algorithm support if compression is enabled. +	 */ +	if (!nocompress) { +		strscpy(hib_comp_algo, default_compressor, sizeof(hib_comp_algo)); +		if (crypto_has_comp(hib_comp_algo, 0, 0) != 1) { +			pr_err("%s compression is not available\n", hib_comp_algo); +			return -EOPNOTSUPP; +		} +	} +  	sleep_flags = lock_system_sleep();  	/* The snapshot device should not be opened while we're running */  	if (!hibernate_acquire()) { @@ -955,6 +975,19 @@ static int software_resume(void)  	if (error)  		goto Unlock; +	/* +	 * Check if the hibernation image is compressed. If so, query for +	 * the algorithm support. +	 */ +	if (!(swsusp_header_flags & SF_NOCOMPRESS_MODE)) { +		strscpy(hib_comp_algo, default_compressor, sizeof(hib_comp_algo)); +		if (crypto_has_comp(hib_comp_algo, 0, 0) != 1) { +			pr_err("%s compression is not available\n", hib_comp_algo); +			error = -EOPNOTSUPP; +			goto Unlock; +		} +	} +  	/* The snapshot device should not be opened while we're running */  	if (!hibernate_acquire()) {  		error = -EBUSY;  | 
