Commit 38c31464 authored by David Sterba's avatar David Sterba

btrfs: merge length input and output parameter in compress_pages

The length parameter is basically duplicated for input and output in the
top level caller of the compress_pages chain. We can simply use one
variable for that and reduce stack consumption. The compression
implementation will sink the parameter to a local variable so everything
works as before.
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 52f75f4f
...@@ -911,27 +911,25 @@ static void free_workspaces(void) ...@@ -911,27 +911,25 @@ static void free_workspaces(void)
} }
/* /*
* given an address space and start/len, compress the bytes. * Given an address space and start and length, compress the bytes into @pages
* that are allocated on demand.
* *
* pages are allocated to hold the compressed result and stored * @out_pages is used to return the number of pages allocated. There
* in 'pages' * may be pages allocated even if we return an error.
* *
* out_pages is used to return the number of pages allocated. There * @total_in is used to return the number of bytes actually read. It
* may be pages allocated even if we return an error * may be smaller than the input length if we had to exit early because we
*
* total_in is used to return the number of bytes actually read. It
* may be smaller then len if we had to exit early because we
* ran out of room in the pages array or because we cross the * ran out of room in the pages array or because we cross the
* max_out threshold. * max_out threshold.
* *
* total_out is used to return the total number of compressed bytes * @total_out is an in/out parameter, must be set to the input length and will
* be also used to return the total number of compressed bytes
* *
* max_out tells us the max number of bytes that we're allowed to * @max_out tells us the max number of bytes that we're allowed to
* stuff into pages * stuff into pages
*/ */
int btrfs_compress_pages(int type, struct address_space *mapping, int btrfs_compress_pages(int type, struct address_space *mapping,
u64 start, unsigned long len, u64 start, struct page **pages,
struct page **pages,
unsigned long nr_dest_pages, unsigned long nr_dest_pages,
unsigned long *out_pages, unsigned long *out_pages,
unsigned long *total_in, unsigned long *total_in,
...@@ -944,7 +942,7 @@ int btrfs_compress_pages(int type, struct address_space *mapping, ...@@ -944,7 +942,7 @@ int btrfs_compress_pages(int type, struct address_space *mapping,
workspace = find_workspace(type); workspace = find_workspace(type);
ret = btrfs_compress_op[type-1]->compress_pages(workspace, mapping, ret = btrfs_compress_op[type-1]->compress_pages(workspace, mapping,
start, len, pages, start, pages,
nr_dest_pages, out_pages, nr_dest_pages, out_pages,
total_in, total_out, total_in, total_out,
max_out); max_out);
......
...@@ -23,8 +23,7 @@ void btrfs_init_compress(void); ...@@ -23,8 +23,7 @@ void btrfs_init_compress(void);
void btrfs_exit_compress(void); void btrfs_exit_compress(void);
int btrfs_compress_pages(int type, struct address_space *mapping, int btrfs_compress_pages(int type, struct address_space *mapping,
u64 start, unsigned long len, u64 start, struct page **pages,
struct page **pages,
unsigned long nr_dest_pages, unsigned long nr_dest_pages,
unsigned long *out_pages, unsigned long *out_pages,
unsigned long *total_in, unsigned long *total_in,
...@@ -59,7 +58,7 @@ struct btrfs_compress_op { ...@@ -59,7 +58,7 @@ struct btrfs_compress_op {
int (*compress_pages)(struct list_head *workspace, int (*compress_pages)(struct list_head *workspace,
struct address_space *mapping, struct address_space *mapping,
u64 start, unsigned long len, u64 start,
struct page **pages, struct page **pages,
unsigned long nr_dest_pages, unsigned long nr_dest_pages,
unsigned long *out_pages, unsigned long *out_pages,
......
...@@ -517,7 +517,7 @@ static noinline void compress_file_range(struct inode *inode, ...@@ -517,7 +517,7 @@ static noinline void compress_file_range(struct inode *inode,
redirty = 1; redirty = 1;
ret = btrfs_compress_pages(compress_type, ret = btrfs_compress_pages(compress_type,
inode->i_mapping, start, inode->i_mapping, start,
total_compressed, pages, pages,
nr_pages, &nr_pages_ret, nr_pages, &nr_pages_ret,
&total_in, &total_in,
&total_compressed, &total_compressed,
......
...@@ -86,7 +86,7 @@ static inline size_t read_compress_length(const char *buf) ...@@ -86,7 +86,7 @@ static inline size_t read_compress_length(const char *buf)
static int lzo_compress_pages(struct list_head *ws, static int lzo_compress_pages(struct list_head *ws,
struct address_space *mapping, struct address_space *mapping,
u64 start, unsigned long len, u64 start,
struct page **pages, struct page **pages,
unsigned long nr_dest_pages, unsigned long nr_dest_pages,
unsigned long *out_pages, unsigned long *out_pages,
...@@ -102,7 +102,7 @@ static int lzo_compress_pages(struct list_head *ws, ...@@ -102,7 +102,7 @@ static int lzo_compress_pages(struct list_head *ws,
struct page *in_page = NULL; struct page *in_page = NULL;
struct page *out_page = NULL; struct page *out_page = NULL;
unsigned long bytes_left; unsigned long bytes_left;
unsigned long len = *total_out;
size_t in_len; size_t in_len;
size_t out_len; size_t out_len;
char *buf; char *buf;
......
...@@ -73,7 +73,7 @@ static struct list_head *zlib_alloc_workspace(void) ...@@ -73,7 +73,7 @@ static struct list_head *zlib_alloc_workspace(void)
static int zlib_compress_pages(struct list_head *ws, static int zlib_compress_pages(struct list_head *ws,
struct address_space *mapping, struct address_space *mapping,
u64 start, unsigned long len, u64 start,
struct page **pages, struct page **pages,
unsigned long nr_dest_pages, unsigned long nr_dest_pages,
unsigned long *out_pages, unsigned long *out_pages,
...@@ -89,6 +89,7 @@ static int zlib_compress_pages(struct list_head *ws, ...@@ -89,6 +89,7 @@ static int zlib_compress_pages(struct list_head *ws,
struct page *in_page = NULL; struct page *in_page = NULL;
struct page *out_page = NULL; struct page *out_page = NULL;
unsigned long bytes_left; unsigned long bytes_left;
unsigned long len = *total_out;
*out_pages = 0; *out_pages = 0;
*total_out = 0; *total_out = 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