OSDN Git Service

zram: inline zram_compress
[uclinux-h8/linux.git] / drivers / block / zram / zram_drv.c
index f1a94f4..7b16ab0 100644 (file)
@@ -589,25 +589,38 @@ out:
        return ret;
 }
 
-static int zram_compress(struct zram *zram, struct zcomp_strm **zstrm,
-                       struct page *page,
-                       unsigned long *out_handle, unsigned int *out_comp_len)
+static int __zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index)
 {
        int ret;
-       unsigned int comp_len;
-       void *src;
        unsigned long alloced_pages;
        unsigned long handle = 0;
+       unsigned int comp_len = 0;
+       void *src, *dst, *mem;
+       struct zcomp_strm *zstrm;
+       struct page *page = bvec->bv_page;
+       unsigned long element = 0;
+       enum zram_pageflags flags = 0;
+
+       mem = kmap_atomic(page);
+       if (page_same_filled(mem, &element)) {
+               kunmap_atomic(mem);
+               /* Free memory associated with this sector now. */
+               flags = ZRAM_SAME;
+               atomic64_inc(&zram->stats.same_pages);
+               goto out;
+       }
+       kunmap_atomic(mem);
 
 compress_again:
+       zstrm = zcomp_stream_get(zram->comp);
        src = kmap_atomic(page);
-       ret = zcomp_compress(*zstrm, src, &comp_len);
+       ret = zcomp_compress(zstrm, src, &comp_len);
        kunmap_atomic(src);
 
        if (unlikely(ret)) {
+               zcomp_stream_put(zram->comp);
                pr_err("Compression failed! err=%d\n", ret);
-               if (handle)
-                       zs_free(zram->mem_pool, handle);
+               zs_free(zram->mem_pool, handle);
                return ret;
        }
 
@@ -639,7 +652,6 @@ compress_again:
                handle = zs_malloc(zram->mem_pool, comp_len,
                                GFP_NOIO | __GFP_HIGHMEM |
                                __GFP_MOVABLE);
-               *zstrm = zcomp_stream_get(zram->comp);
                if (handle)
                        goto compress_again;
                return -ENOMEM;
@@ -649,43 +661,11 @@ compress_again:
        update_used_max(zram, alloced_pages);
 
        if (zram->limit_pages && alloced_pages > zram->limit_pages) {
+               zcomp_stream_put(zram->comp);
                zs_free(zram->mem_pool, handle);
                return -ENOMEM;
        }
 
-       *out_handle = handle;
-       *out_comp_len = comp_len;
-       return 0;
-}
-
-static int __zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index)
-{
-       int ret;
-       unsigned long handle = 0;
-       unsigned int comp_len = 0;
-       void *src, *dst, *mem;
-       struct zcomp_strm *zstrm;
-       struct page *page = bvec->bv_page;
-       unsigned long element = 0;
-       enum zram_pageflags flags = 0;
-
-       mem = kmap_atomic(page);
-       if (page_same_filled(mem, &element)) {
-               kunmap_atomic(mem);
-               /* Free memory associated with this sector now */
-               atomic64_inc(&zram->stats.same_pages);
-               flags = ZRAM_SAME;
-               goto out;
-       }
-       kunmap_atomic(mem);
-
-       zstrm = zcomp_stream_get(zram->comp);
-       ret = zram_compress(zram, &zstrm, page, &handle, &comp_len);
-       if (ret) {
-               zcomp_stream_put(zram->comp);
-               return ret;
-       }
-
        dst = zs_map_object(zram->mem_pool, handle, ZS_MM_WO);
 
        src = zstrm->buffer;