There is no way to get a string with all the crypto comp algorithms supported by the crypto comp engine, so we need to maintain our own backends list. At the same time we additionally need to use crypto_has_comp() to make sure that the user has requested a compression algorithm that is recognized by the crypto comp engine. Relying on /proc/crypto is not an options here, because it does not show not-yet-inserted compression modules.
Example: modprobe zram cat /proc/crypto | grep -i lz4 modprobe lz4 cat /proc/crypto | grep -i lz4 name : lz4 driver : lz4-generic module : lz4 So the user can't tell exactly if the lz4 is really supported from /proc/crypto output, unless someone or something has loaded it. This patch also adds crypto_has_comp() to zcomp_available_show(). We store all the compression algorithms names in zcomp's `backends' array, regardless the CONFIG_CRYPTO_FOO configuration, but show only those that are also supported by crypto engine. This helps user to know the exact list of compression algorithms that can be used. Example: module lz4 is not loaded yet, but is supported by the crypto engine. /proc/crypto has no information on this module, while zram's `comp_algorithm' lists it: cat /proc/crypto | grep -i lz4 cat /sys/block/zram0/comp_algorithm [lzo] lz4 deflate lz4hc 842 Signed-off-by: Sergey Senozhatsky <sergey.senozhat...@gmail.com> Cc: Minchan Kim <minc...@kernel.org> Cc: Joonsoo Kim <iamjoonsoo....@lge.com> --- drivers/block/zram/zcomp.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 79b30d7..a8593e9 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -29,12 +29,16 @@ static const char * const backends[] = { static const char *find_backend(const char *compress) { int i = 0; + while (backends[i]) { if (sysfs_streq(compress, backends[i])) break; i++; } - return backends[i]; + + if (backends[i] && crypto_has_comp(backends[i], 0, 0)) + return backends[i]; + return NULL; } static void zcomp_strm_free(struct zcomp *comp, struct zcomp_strm *zstrm) @@ -74,14 +78,16 @@ ssize_t zcomp_available_show(const char *comp, char *buf) ssize_t sz = 0; int i = 0; - while (backends[i]) { + for (; backends[i]; i++) { + if (!crypto_has_comp(backends[i], 0, 0)) + continue; + if (!strcmp(comp, backends[i])) sz += scnprintf(buf + sz, PAGE_SIZE - sz - 2, "[%s] ", backends[i]); else sz += scnprintf(buf + sz, PAGE_SIZE - sz - 2, "%s ", backends[i]); - i++; } sz += scnprintf(buf + sz, PAGE_SIZE - sz, "\n"); return sz; -- 2.8.3.394.g3916adf