Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions drivers/block/zram/zcomp.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,14 @@ static const struct zcomp_ops *lookup_backend_ops(const char *comp)
return backends[i];
}

bool zcomp_available_algorithm(const char *comp)
const char *zcomp_lookup_backend_name(const char *comp)
{
return lookup_backend_ops(comp) != NULL;
const struct zcomp_ops *backend = lookup_backend_ops(comp);

if (backend)
return backend->name;

return NULL;
}

/* show available compressors */
Expand Down
2 changes: 1 addition & 1 deletion drivers/block/zram/zcomp.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ struct zcomp {
int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist_node *node);
int zcomp_cpu_dead(unsigned int cpu, struct hlist_node *node);
ssize_t zcomp_available_show(const char *comp, char *buf, ssize_t at);
bool zcomp_available_algorithm(const char *comp);
const char *zcomp_lookup_backend_name(const char *comp);

struct zcomp *zcomp_create(const char *alg, struct zcomp_params *params);
void zcomp_destroy(struct zcomp *comp);
Expand Down
28 changes: 5 additions & 23 deletions drivers/block/zram/zram_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -1637,43 +1637,29 @@ static void zram_debugfs_unregister(struct zram *zram) {};

static void comp_algorithm_set(struct zram *zram, u32 prio, const char *alg)
{
/* Do not free statically defined compression algorithms */
if (zram->comp_algs[prio] != default_compressor)
kfree(zram->comp_algs[prio]);

zram->comp_algs[prio] = alg;
}

static int __comp_algorithm_store(struct zram *zram, u32 prio, const char *buf)
{
char *compressor;
const char *alg;
size_t sz;

sz = strlen(buf);
if (sz >= ZRAM_MAX_ALGO_NAME_SZ)
return -E2BIG;

compressor = kstrdup(buf, GFP_KERNEL);
if (!compressor)
return -ENOMEM;

/* ignore trailing newline */
if (sz > 0 && compressor[sz - 1] == '\n')
compressor[sz - 1] = 0x00;

if (!zcomp_available_algorithm(compressor)) {
kfree(compressor);
alg = zcomp_lookup_backend_name(buf);
if (!alg)
return -EINVAL;
}

guard(rwsem_write)(&zram->dev_lock);
if (init_done(zram)) {
kfree(compressor);
pr_info("Can't change algorithm for initialized device\n");
return -EBUSY;
}

comp_algorithm_set(zram, prio, compressor);
comp_algorithm_set(zram, prio, alg);
return 0;
}

Expand Down Expand Up @@ -2851,12 +2837,8 @@ static void zram_destroy_comps(struct zram *zram)
zram->num_active_comps--;
}

for (prio = ZRAM_PRIMARY_COMP; prio < ZRAM_MAX_COMPS; prio++) {
/* Do not free statically defined compression algorithms */
if (zram->comp_algs[prio] != default_compressor)
kfree(zram->comp_algs[prio]);
for (prio = ZRAM_PRIMARY_COMP; prio < ZRAM_MAX_COMPS; prio++)
zram->comp_algs[prio] = NULL;
}

zram_comp_params_reset(zram);
}
Expand Down