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

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
Loading
Loading
Loading
Loading
+11 −13
Original line number Diff line number Diff line
@@ -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);
+2 −3
Original line number Diff line number Diff line
@@ -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,
+1 −1
Original line number Diff line number Diff line
@@ -517,7 +517,7 @@ again:
		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,
+2 −2
Original line number Diff line number Diff line
@@ -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;
+2 −1
Original line number Diff line number Diff line
@@ -73,7 +73,7 @@ fail:

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;