lkml.org 
[lkml]   [2007]   [Aug]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[Patch 04/18] fs/logfs/compr.c
    --- /dev/null	2007-08-05 21:14:35.622844160 +0200
    +++ linux-2.6.21logfs/fs/logfs/compr.c 2007-08-08 02:57:37.000000000 +0200
    @@ -0,0 +1,95 @@
    +/*
    + * fs/logfs/compr.c - compression routines
    + *
    + * As should be obvious for Linux kernel code, license is GPLv2
    + *
    + * Copyright (c) 2005-2007 Joern Engel <joern@logfs.org>
    + */
    +#include "logfs.h"
    +#include <linux/vmalloc.h>
    +#include <linux/zlib.h>
    +
    +#define COMPR_LEVEL 3
    +
    +static DEFINE_MUTEX(compr_mutex);
    +static struct z_stream_s stream;
    +
    +int logfs_compress(void *in, void *out, size_t inlen, size_t outlen)
    +{
    + int err, ret;
    +
    + ret = -EIO;
    + mutex_lock(&compr_mutex);
    + err = zlib_deflateInit(&stream, COMPR_LEVEL);
    + if (err != Z_OK)
    + goto error;
    +
    + stream.next_in = in;
    + stream.avail_in = inlen;
    + stream.total_in = 0;
    + stream.next_out = out;
    + stream.avail_out = outlen;
    + stream.total_out = 0;
    +
    + err = zlib_deflate(&stream, Z_FINISH);
    + if (err != Z_STREAM_END)
    + goto error;
    +
    + err = zlib_deflateEnd(&stream);
    + if (err != Z_OK)
    + goto error;
    +
    + if (stream.total_out >= stream.total_in)
    + goto error;
    +
    + ret = stream.total_out;
    +error:
    + mutex_unlock(&compr_mutex);
    + return ret;
    +}
    +
    +int logfs_uncompress(void *in, void *out, size_t inlen, size_t outlen)
    +{
    + int err, ret;
    +
    + ret = -EIO;
    + mutex_lock(&compr_mutex);
    + err = zlib_inflateInit(&stream);
    + if (err != Z_OK)
    + goto error;
    +
    + stream.next_in = in;
    + stream.avail_in = inlen;
    + stream.total_in = 0;
    + stream.next_out = out;
    + stream.avail_out = outlen;
    + stream.total_out = 0;
    +
    + err = zlib_inflate(&stream, Z_FINISH);
    + if (err != Z_STREAM_END)
    + goto error;
    +
    + err = zlib_inflateEnd(&stream);
    + if (err != Z_OK)
    + goto error;
    +
    + ret = 0;
    +error:
    + mutex_unlock(&compr_mutex);
    + return ret;
    +}
    +
    +int __init logfs_compr_init(void)
    +{
    + size_t size = max(zlib_deflate_workspacesize(),
    + zlib_inflate_workspacesize());
    + stream.workspace = vmalloc(size);
    + if (!stream.workspace)
    + return -ENOMEM;
    + return 0;
    +}
    +
    +void logfs_compr_exit(void)
    +{
    + vfree(stream.workspace);
    +}
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2007-08-08 18:23    [W:0.030 / U:0.220 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site