jffs2 & new linux zlib
Clive Davies
cdavies at altera.com
Tue Feb 19 09:24:30 EST 2002
In testing jffs2 in linux 2.5.4-rmk1 I've found that kmalloc cannot allocate
objects of the size returned by zlib_deflate_workspacesize() and
zlib_inflate_workspacesize(). The patch below uses vmalloc to sucessfully
allocate the memory, however I'm not sure that this is the best approach.,
maybe it would be better to try and reduce the size of the deflate_workspace
& inflate workspace in zlib? (This might be a ridiculous idea, I haven't a
clue how zlib works) Any suggestions?
--- linux_2.5.4-rmk1/fs/jffs2/compr_zlib.c Mon Feb 11 01:50:06 2002
+++ linux/fs/jffs2/compr_zlib.c Tue Feb 19 13:33:24 2002
@@ -80,8 +80,7 @@ int zlib_compress(unsigned char *data_in
return -1;
#ifdef __KERNEL__
- strm.workspace = kmalloc(zlib_deflate_workspacesize(),
- GFP_KERNEL);
+ strm.workspace = vmalloc(zlib_deflate_workspacesize());
if (strm.workspace == NULL) {
printk(KERN_WARNING "deflateInit alloc of workspace failed\n");
return -1;
@@ -123,7 +122,7 @@ int zlib_compress(unsigned char *data_in
}
zlib_deflateEnd(&strm);
- kfree(strm.workspace);
+ vfree(strm.workspace);
D1(printk(KERN_DEBUG "zlib compressed %ld bytes into %ld\n", strm.total_in,
strm.total_out));
@@ -137,7 +136,7 @@ int zlib_compress(unsigned char *data_in
out_err:
zlib_deflateEnd(&strm);
- kfree(strm.workspace);
+ vfree(strm.workspace);
return -1;
}
@@ -148,8 +147,7 @@ void zlib_decompress(unsigned char *data
int ret;
#ifdef __KERNEL__
- strm.workspace = kmalloc(zlib_inflate_workspacesize(),
- GFP_KERNEL);
+ strm.workspace = vmalloc(zlib_inflate_workspacesize());
if (strm.workspace == NULL) {
printk(KERN_WARNING "inflateInit alloc of workspace failed\n");
return;
@@ -177,5 +175,5 @@ void zlib_decompress(unsigned char *data
printk(KERN_NOTICE "inflate returned %d\n", ret);
}
zlib_inflateEnd(&strm);
- kfree(strm.workspace);
+ vfree(strm.workspace);
}
More information about the linux-mtd
mailing list