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: David Sterba <dsterba@suse.com>
This commit is contained in:
David Sterba 2017-02-14 19:04:07 +01:00
parent 52f75f4fe7
commit 38c3146408
5 changed files with 18 additions and 20 deletions

View File

@ -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
* in 'pages'
* @out_pages is used to return the number of pages allocated. There
* may be pages allocated even if we return an error.
*
* out_pages is used to return the number of pages allocated. There
* may be pages allocated even if we return an error
*
* 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
* @total_in is used to return the number of bytes actually read. It
* may be smaller than the input length if we had to exit early because we
* ran out of room in the pages array or because we cross the
* 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
*/
int btrfs_compress_pages(int type, struct address_space *mapping,
u64 start, unsigned long len,
struct page **pages,
u64 start, struct page **pages,
unsigned long nr_dest_pages,
unsigned long *out_pages,
unsigned long *total_in,
@ -944,7 +942,7 @@ int btrfs_compress_pages(int type, struct address_space *mapping,
workspace = find_workspace(type);
ret = btrfs_compress_op[type-1]->compress_pages(workspace, mapping,
start, len, pages,
start, pages,
nr_dest_pages, out_pages,
total_in, total_out,
max_out);

View File

@ -23,8 +23,7 @@ void btrfs_init_compress(void);
void btrfs_exit_compress(void);
int btrfs_compress_pages(int type, struct address_space *mapping,
u64 start, unsigned long len,
struct page **pages,
u64 start, struct page **pages,
unsigned long nr_dest_pages,
unsigned long *out_pages,
unsigned long *total_in,
@ -59,7 +58,7 @@ struct btrfs_compress_op {
int (*compress_pages)(struct list_head *workspace,
struct address_space *mapping,
u64 start, unsigned long len,
u64 start,
struct page **pages,
unsigned long nr_dest_pages,
unsigned long *out_pages,

View File

@ -517,7 +517,7 @@ static noinline void compress_file_range(struct inode *inode,
redirty = 1;
ret = btrfs_compress_pages(compress_type,
inode->i_mapping, start,
total_compressed, pages,
pages,
nr_pages, &nr_pages_ret,
&total_in,
&total_compressed,

View File

@ -86,7 +86,7 @@ static inline size_t read_compress_length(const char *buf)
static int lzo_compress_pages(struct list_head *ws,
struct address_space *mapping,
u64 start, unsigned long len,
u64 start,
struct page **pages,
unsigned long nr_dest_pages,
unsigned long *out_pages,
@ -102,7 +102,7 @@ static int lzo_compress_pages(struct list_head *ws,
struct page *in_page = NULL;
struct page *out_page = NULL;
unsigned long bytes_left;
unsigned long len = *total_out;
size_t in_len;
size_t out_len;
char *buf;

View File

@ -73,7 +73,7 @@ static struct list_head *zlib_alloc_workspace(void)
static int zlib_compress_pages(struct list_head *ws,
struct address_space *mapping,
u64 start, unsigned long len,
u64 start,
struct page **pages,
unsigned long nr_dest_pages,
unsigned long *out_pages,
@ -89,6 +89,7 @@ static int zlib_compress_pages(struct list_head *ws,
struct page *in_page = NULL;
struct page *out_page = NULL;
unsigned long bytes_left;
unsigned long len = *total_out;
*out_pages = 0;
*total_out = 0;