Commit 60e1975a authored by Zach Brown's avatar Zach Brown Committed by Chris Mason

btrfs: return errno instead of -1 from compression

The compression layer seems to have been built to return -1 and have
callers make up errors that make sense.  This isn't great because there
are different errors that originate down in the compression layer.

Let's return real negative errnos from the compression layer so that
callers can pass on the error without having to guess what happened.
ENOMEM for allocation failure, E2BIG when compression exceeds the
uncompressed input, and EIO for everything else.

This helps a future path return errors from btrfs_decompress().
Signed-off-by: default avatarZach Brown <zab@redhat.com>
Signed-off-by: default avatarChris Mason <clm@fb.com>
parent 98806b44
...@@ -143,7 +143,7 @@ static int lzo_compress_pages(struct list_head *ws, ...@@ -143,7 +143,7 @@ static int lzo_compress_pages(struct list_head *ws,
if (ret != LZO_E_OK) { if (ret != LZO_E_OK) {
printk(KERN_DEBUG "BTRFS: deflate in loop returned %d\n", printk(KERN_DEBUG "BTRFS: deflate in loop returned %d\n",
ret); ret);
ret = -1; ret = -EIO;
goto out; goto out;
} }
...@@ -189,7 +189,7 @@ static int lzo_compress_pages(struct list_head *ws, ...@@ -189,7 +189,7 @@ static int lzo_compress_pages(struct list_head *ws,
kunmap(out_page); kunmap(out_page);
if (nr_pages == nr_dest_pages) { if (nr_pages == nr_dest_pages) {
out_page = NULL; out_page = NULL;
ret = -1; ret = -E2BIG;
goto out; goto out;
} }
...@@ -208,7 +208,7 @@ static int lzo_compress_pages(struct list_head *ws, ...@@ -208,7 +208,7 @@ static int lzo_compress_pages(struct list_head *ws,
/* we're making it bigger, give up */ /* we're making it bigger, give up */
if (tot_in > 8192 && tot_in < tot_out) { if (tot_in > 8192 && tot_in < tot_out) {
ret = -1; ret = -E2BIG;
goto out; goto out;
} }
...@@ -335,7 +335,7 @@ static int lzo_decompress_biovec(struct list_head *ws, ...@@ -335,7 +335,7 @@ static int lzo_decompress_biovec(struct list_head *ws,
break; break;
if (page_in_index + 1 >= total_pages_in) { if (page_in_index + 1 >= total_pages_in) {
ret = -1; ret = -EIO;
goto done; goto done;
} }
...@@ -358,7 +358,7 @@ static int lzo_decompress_biovec(struct list_head *ws, ...@@ -358,7 +358,7 @@ static int lzo_decompress_biovec(struct list_head *ws,
kunmap(pages_in[page_in_index - 1]); kunmap(pages_in[page_in_index - 1]);
if (ret != LZO_E_OK) { if (ret != LZO_E_OK) {
printk(KERN_WARNING "BTRFS: decompress failed\n"); printk(KERN_WARNING "BTRFS: decompress failed\n");
ret = -1; ret = -EIO;
break; break;
} }
...@@ -402,12 +402,12 @@ static int lzo_decompress(struct list_head *ws, unsigned char *data_in, ...@@ -402,12 +402,12 @@ static int lzo_decompress(struct list_head *ws, unsigned char *data_in,
ret = lzo1x_decompress_safe(data_in, in_len, workspace->buf, &out_len); ret = lzo1x_decompress_safe(data_in, in_len, workspace->buf, &out_len);
if (ret != LZO_E_OK) { if (ret != LZO_E_OK) {
printk(KERN_WARNING "BTRFS: decompress failed!\n"); printk(KERN_WARNING "BTRFS: decompress failed!\n");
ret = -1; ret = -EIO;
goto out; goto out;
} }
if (out_len < start_byte) { if (out_len < start_byte) {
ret = -1; ret = -EIO;
goto out; goto out;
} }
......
...@@ -98,7 +98,7 @@ static int zlib_compress_pages(struct list_head *ws, ...@@ -98,7 +98,7 @@ static int zlib_compress_pages(struct list_head *ws,
if (Z_OK != zlib_deflateInit(&workspace->def_strm, 3)) { if (Z_OK != zlib_deflateInit(&workspace->def_strm, 3)) {
printk(KERN_WARNING "BTRFS: deflateInit failed\n"); printk(KERN_WARNING "BTRFS: deflateInit failed\n");
ret = -1; ret = -EIO;
goto out; goto out;
} }
...@@ -110,7 +110,7 @@ static int zlib_compress_pages(struct list_head *ws, ...@@ -110,7 +110,7 @@ static int zlib_compress_pages(struct list_head *ws,
out_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM); out_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM);
if (out_page == NULL) { if (out_page == NULL) {
ret = -1; ret = -ENOMEM;
goto out; goto out;
} }
cpage_out = kmap(out_page); cpage_out = kmap(out_page);
...@@ -128,7 +128,7 @@ static int zlib_compress_pages(struct list_head *ws, ...@@ -128,7 +128,7 @@ static int zlib_compress_pages(struct list_head *ws,
printk(KERN_DEBUG "BTRFS: deflate in loop returned %d\n", printk(KERN_DEBUG "BTRFS: deflate in loop returned %d\n",
ret); ret);
zlib_deflateEnd(&workspace->def_strm); zlib_deflateEnd(&workspace->def_strm);
ret = -1; ret = -EIO;
goto out; goto out;
} }
...@@ -136,7 +136,7 @@ static int zlib_compress_pages(struct list_head *ws, ...@@ -136,7 +136,7 @@ static int zlib_compress_pages(struct list_head *ws,
if (workspace->def_strm.total_in > 8192 && if (workspace->def_strm.total_in > 8192 &&
workspace->def_strm.total_in < workspace->def_strm.total_in <
workspace->def_strm.total_out) { workspace->def_strm.total_out) {
ret = -1; ret = -EIO;
goto out; goto out;
} }
/* we need another page for writing out. Test this /* we need another page for writing out. Test this
...@@ -147,12 +147,12 @@ static int zlib_compress_pages(struct list_head *ws, ...@@ -147,12 +147,12 @@ static int zlib_compress_pages(struct list_head *ws,
kunmap(out_page); kunmap(out_page);
if (nr_pages == nr_dest_pages) { if (nr_pages == nr_dest_pages) {
out_page = NULL; out_page = NULL;
ret = -1; ret = -E2BIG;
goto out; goto out;
} }
out_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM); out_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM);
if (out_page == NULL) { if (out_page == NULL) {
ret = -1; ret = -ENOMEM;
goto out; goto out;
} }
cpage_out = kmap(out_page); cpage_out = kmap(out_page);
...@@ -188,12 +188,12 @@ static int zlib_compress_pages(struct list_head *ws, ...@@ -188,12 +188,12 @@ static int zlib_compress_pages(struct list_head *ws,
zlib_deflateEnd(&workspace->def_strm); zlib_deflateEnd(&workspace->def_strm);
if (ret != Z_STREAM_END) { if (ret != Z_STREAM_END) {
ret = -1; ret = -EIO;
goto out; goto out;
} }
if (workspace->def_strm.total_out >= workspace->def_strm.total_in) { if (workspace->def_strm.total_out >= workspace->def_strm.total_in) {
ret = -1; ret = -E2BIG;
goto out; goto out;
} }
...@@ -253,7 +253,7 @@ static int zlib_decompress_biovec(struct list_head *ws, struct page **pages_in, ...@@ -253,7 +253,7 @@ static int zlib_decompress_biovec(struct list_head *ws, struct page **pages_in,
if (Z_OK != zlib_inflateInit2(&workspace->inf_strm, wbits)) { if (Z_OK != zlib_inflateInit2(&workspace->inf_strm, wbits)) {
printk(KERN_WARNING "BTRFS: inflateInit failed\n"); printk(KERN_WARNING "BTRFS: inflateInit failed\n");
return -1; return -EIO;
} }
while (workspace->inf_strm.total_in < srclen) { while (workspace->inf_strm.total_in < srclen) {
ret = zlib_inflate(&workspace->inf_strm, Z_NO_FLUSH); ret = zlib_inflate(&workspace->inf_strm, Z_NO_FLUSH);
...@@ -295,7 +295,7 @@ static int zlib_decompress_biovec(struct list_head *ws, struct page **pages_in, ...@@ -295,7 +295,7 @@ static int zlib_decompress_biovec(struct list_head *ws, struct page **pages_in,
} }
} }
if (ret != Z_STREAM_END) if (ret != Z_STREAM_END)
ret = -1; ret = -EIO;
else else
ret = 0; ret = 0;
done: done:
...@@ -337,7 +337,7 @@ static int zlib_decompress(struct list_head *ws, unsigned char *data_in, ...@@ -337,7 +337,7 @@ static int zlib_decompress(struct list_head *ws, unsigned char *data_in,
if (Z_OK != zlib_inflateInit2(&workspace->inf_strm, wbits)) { if (Z_OK != zlib_inflateInit2(&workspace->inf_strm, wbits)) {
printk(KERN_WARNING "BTRFS: inflateInit failed\n"); printk(KERN_WARNING "BTRFS: inflateInit failed\n");
return -1; return -EIO;
} }
while (bytes_left > 0) { while (bytes_left > 0) {
...@@ -354,7 +354,7 @@ static int zlib_decompress(struct list_head *ws, unsigned char *data_in, ...@@ -354,7 +354,7 @@ static int zlib_decompress(struct list_head *ws, unsigned char *data_in,
total_out = workspace->inf_strm.total_out; total_out = workspace->inf_strm.total_out;
if (total_out == buf_start) { if (total_out == buf_start) {
ret = -1; ret = -EIO;
break; break;
} }
...@@ -382,7 +382,7 @@ static int zlib_decompress(struct list_head *ws, unsigned char *data_in, ...@@ -382,7 +382,7 @@ static int zlib_decompress(struct list_head *ws, unsigned char *data_in,
} }
if (ret != Z_STREAM_END && bytes_left != 0) if (ret != Z_STREAM_END && bytes_left != 0)
ret = -1; ret = -EIO;
else else
ret = 0; ret = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment