git://git.camperquake.de
/
zfs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add ZFS specific mmap() checks
[zfs.git]
/
module
/
zfs
/
lzjb.c
diff --git
a/module/zfs/lzjb.c
b/module/zfs/lzjb.c
index
ad9e423
..
4da30cf
100644
(file)
--- a/
module/zfs/lzjb.c
+++ b/
module/zfs/lzjb.c
@@
-36,7
+36,7
@@
* source length if compression would overflow the destination buffer.
*/
* source length if compression would overflow the destination buffer.
*/
-#include <sys/
types
.h>
+#include <sys/
zfs_context
.h>
#define MATCH_BITS 6
#define MATCH_MIN 3
#define MATCH_BITS 6
#define MATCH_MIN 3
@@
-54,12
+54,15
@@
lzjb_compress(void *s_start, void *d_start, size_t s_len, size_t d_len, int n)
int copymask = 1 << (NBBY - 1);
int mlen, offset, hash;
uint16_t *hp;
int copymask = 1 << (NBBY - 1);
int mlen, offset, hash;
uint16_t *hp;
- uint16_t
lempel[LEMPEL_SIZE] = { 0 }
;
+ uint16_t
*lempel
;
+ lempel = kmem_zalloc(LEMPEL_SIZE * sizeof (uint16_t), KM_SLEEP);
while (src < (uchar_t *)s_start + s_len) {
if ((copymask <<= 1) == (1 << NBBY)) {
while (src < (uchar_t *)s_start + s_len) {
if ((copymask <<= 1) == (1 << NBBY)) {
- if (dst >= (uchar_t *)d_start + d_len - 1 - 2 * NBBY)
+ if (dst >= (uchar_t *)d_start + d_len - 1 - 2 * NBBY) {
+ kmem_free(lempel, LEMPEL_SIZE*sizeof(uint16_t));
return (s_len);
return (s_len);
+ }
copymask = 1;
copymap = dst;
*dst++ = 0;
copymask = 1;
copymap = dst;
*dst++ = 0;
@@
-89,6
+92,8
@@
lzjb_compress(void *s_start, void *d_start, size_t s_len, size_t d_len, int n)
*dst++ = *src++;
}
}
*dst++ = *src++;
}
}
+
+ kmem_free(lempel, LEMPEL_SIZE * sizeof (uint16_t));
return (dst - (uchar_t *)d_start);
}
return (dst - (uchar_t *)d_start);
}