]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/block/zram/zram_drv.c
Merge tag 'pinctrl-v4.8-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[karo-tx-linux.git] / drivers / block / zram / zram_drv.c
index 8fcad8b761f14b5686644317d3da018d9bc326e0..7454cf188c8e24bafe0815b4c289ed01545c1be3 100644 (file)
@@ -342,9 +342,16 @@ static ssize_t comp_algorithm_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t len)
 {
        struct zram *zram = dev_to_zram(dev);
+       char compressor[CRYPTO_MAX_ALG_NAME];
        size_t sz;
 
-       if (!zcomp_available_algorithm(buf))
+       strlcpy(compressor, buf, sizeof(compressor));
+       /* ignore trailing newline */
+       sz = strlen(compressor);
+       if (sz > 0 && compressor[sz - 1] == '\n')
+               compressor[sz - 1] = 0x00;
+
+       if (!zcomp_available_algorithm(compressor))
                return -EINVAL;
 
        down_write(&zram->init_lock);
@@ -353,13 +360,8 @@ static ssize_t comp_algorithm_store(struct device *dev,
                pr_info("Can't change algorithm for initialized device\n");
                return -EBUSY;
        }
-       strlcpy(zram->compressor, buf, sizeof(zram->compressor));
-
-       /* ignore trailing newline */
-       sz = strlen(zram->compressor);
-       if (sz > 0 && zram->compressor[sz - 1] == '\n')
-               zram->compressor[sz - 1] = 0x00;
 
+       strlcpy(zram->compressor, compressor, sizeof(compressor));
        up_write(&zram->init_lock);
        return len;
 }
@@ -563,7 +565,7 @@ static int zram_decompress_page(struct zram *zram, char *mem, u32 index)
        unsigned char *cmem;
        struct zram_meta *meta = zram->meta;
        unsigned long handle;
-       size_t size;
+       unsigned int size;
 
        bit_spin_lock(ZRAM_ACCESS, &meta->table[index].value);
        handle = meta->table[index].handle;
@@ -576,10 +578,14 @@ static int zram_decompress_page(struct zram *zram, char *mem, u32 index)
        }
 
        cmem = zs_map_object(meta->mem_pool, handle, ZS_MM_RO);
-       if (size == PAGE_SIZE)
+       if (size == PAGE_SIZE) {
                copy_page(mem, cmem);
-       else
-               ret = zcomp_decompress(zram->comp, cmem, size, mem);
+       } else {
+               struct zcomp_strm *zstrm = zcomp_stream_get(zram->comp);
+
+               ret = zcomp_decompress(zstrm, cmem, size, mem);
+               zcomp_stream_put(zram->comp);
+       }
        zs_unmap_object(meta->mem_pool, handle);
        bit_spin_unlock(ZRAM_ACCESS, &meta->table[index].value);
 
@@ -646,7 +652,7 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
                           int offset)
 {
        int ret = 0;
-       size_t clen;
+       unsigned int clen;
        unsigned long handle = 0;
        struct page *page;
        unsigned char *user_mem, *cmem, *src, *uncmem = NULL;
@@ -695,8 +701,8 @@ compress_again:
                goto out;
        }
 
-       zstrm = zcomp_strm_find(zram->comp);
-       ret = zcomp_compress(zram->comp, zstrm, uncmem, &clen);
+       zstrm = zcomp_stream_get(zram->comp);
+       ret = zcomp_compress(zstrm, uncmem, &clen);
        if (!is_partial_io(bvec)) {
                kunmap_atomic(user_mem);
                user_mem = NULL;
@@ -732,19 +738,21 @@ compress_again:
                handle = zs_malloc(meta->mem_pool, clen,
                                __GFP_KSWAPD_RECLAIM |
                                __GFP_NOWARN |
-                               __GFP_HIGHMEM);
+                               __GFP_HIGHMEM |
+                               __GFP_MOVABLE);
        if (!handle) {
-               zcomp_strm_release(zram->comp, zstrm);
+               zcomp_stream_put(zram->comp);
                zstrm = NULL;
 
                atomic64_inc(&zram->stats.writestall);
 
                handle = zs_malloc(meta->mem_pool, clen,
-                               GFP_NOIO | __GFP_HIGHMEM);
+                               GFP_NOIO | __GFP_HIGHMEM |
+                               __GFP_MOVABLE);
                if (handle)
                        goto compress_again;
 
-               pr_err("Error allocating memory for compressed page: %u, size=%zu\n",
+               pr_err("Error allocating memory for compressed page: %u, size=%u\n",
                        index, clen);
                ret = -ENOMEM;
                goto out;
@@ -769,7 +777,7 @@ compress_again:
                memcpy(cmem, src, clen);
        }
 
-       zcomp_strm_release(zram->comp, zstrm);
+       zcomp_stream_put(zram->comp);
        zstrm = NULL;
        zs_unmap_object(meta->mem_pool, handle);
 
@@ -789,7 +797,7 @@ compress_again:
        atomic64_inc(&zram->stats.pages_stored);
 out:
        if (zstrm)
-               zcomp_strm_release(zram->comp, zstrm);
+               zcomp_stream_put(zram->comp);
        if (is_partial_io(bvec))
                kfree(uncmem);
        return ret;
@@ -874,7 +882,7 @@ static void __zram_make_request(struct zram *zram, struct bio *bio)
        offset = (bio->bi_iter.bi_sector &
                  (SECTORS_PER_PAGE - 1)) << SECTOR_SHIFT;
 
-       if (unlikely(bio->bi_rw & REQ_DISCARD)) {
+       if (unlikely(bio_op(bio) == REQ_OP_DISCARD)) {
                zram_bio_discard(zram, index, offset, bio);
                bio_endio(bio);
                return;