btrfs: merge nr_pages input and output parameter in compress_pages
authorDavid Sterba <dsterba@suse.com>
Tue, 14 Feb 2017 18:04:07 +0000 (19:04 +0100)
committerDavid Sterba <dsterba@suse.com>
Tue, 28 Feb 2017 13:26:35 +0000 (14:26 +0100)
The parameter saying how many pages can be allocated at maximum can be
merged with the output page counter, to save some stack space.  The
compression implementation will sink the parameter to a local variable
so everything works as before.

The nr_pages variables can also be simply merged in compress_file_range
into one.

Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/compression.c
fs/btrfs/compression.h
fs/btrfs/inode.c
fs/btrfs/lzo.c
fs/btrfs/zlib.c

index 7e214fd254e4e2f5816cf739a355173e449cc35e..11dcda57e15c51080e2081b2b9f5e24b26025c82 100644 (file)
@@ -914,8 +914,8 @@ static void free_workspaces(void)
  * Given an address space and start and length, compress the bytes into @pages
  * that are allocated on demand.
  *
- * @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 an in/out parameter, holds maximum number of pages to allocate
+ * and returns number of actually allocated pages
  *
  * @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
@@ -930,7 +930,6 @@ static void free_workspaces(void)
  */
 int btrfs_compress_pages(int type, struct address_space *mapping,
                         u64 start, struct page **pages,
-                        unsigned long nr_dest_pages,
                         unsigned long *out_pages,
                         unsigned long *total_in,
                         unsigned long *total_out,
@@ -943,7 +942,7 @@ int btrfs_compress_pages(int type, struct address_space *mapping,
 
        ret = btrfs_compress_op[type-1]->compress_pages(workspace, mapping,
                                                      start, pages,
-                                                     nr_dest_pages, out_pages,
+                                                     out_pages,
                                                      total_in, total_out,
                                                      max_out);
        free_workspace(type, workspace);
index 725d1e0bd25d98af20bef0a675ba02169b24ee8f..cfcec709c61bffcf316005f5a3cfb44fa536d293 100644 (file)
@@ -24,7 +24,6 @@ void btrfs_exit_compress(void);
 
 int btrfs_compress_pages(int type, struct address_space *mapping,
                         u64 start, struct page **pages,
-                        unsigned long nr_dest_pages,
                         unsigned long *out_pages,
                         unsigned long *total_in,
                         unsigned long *total_out,
@@ -60,7 +59,6 @@ struct btrfs_compress_op {
                              struct address_space *mapping,
                              u64 start,
                              struct page **pages,
-                             unsigned long nr_dest_pages,
                              unsigned long *out_pages,
                              unsigned long *total_in,
                              unsigned long *total_out,
index 8b9eac33d4316cda260b5cdde831502a08135199..83bbe1e31869d5db27b0f423a0b3ac3a9493def0 100644 (file)
@@ -430,7 +430,6 @@ static noinline void compress_file_range(struct inode *inode,
        int ret = 0;
        struct page **pages = NULL;
        unsigned long nr_pages;
-       unsigned long nr_pages_ret = 0;
        unsigned long total_compressed = 0;
        unsigned long total_in = 0;
        unsigned long max_compressed = SZ_128K;
@@ -518,7 +517,7 @@ again:
                ret = btrfs_compress_pages(compress_type,
                                           inode->i_mapping, start,
                                           pages,
-                                          nr_pages, &nr_pages_ret,
+                                          &nr_pages,
                                           &total_in,
                                           &total_compressed,
                                           max_compressed);
@@ -526,7 +525,7 @@ again:
                if (!ret) {
                        unsigned long offset = total_compressed &
                                (PAGE_SIZE - 1);
-                       struct page *page = pages[nr_pages_ret - 1];
+                       struct page *page = pages[nr_pages - 1];
                        char *kaddr;
 
                        /* zero the tail end of the last page, we might be
@@ -607,7 +606,7 @@ cont:
                         * will submit them to the elevator.
                         */
                        add_async_extent(async_cow, start, num_bytes,
-                                       total_compressed, pages, nr_pages_ret,
+                                       total_compressed, pages, nr_pages,
                                        compress_type);
 
                        if (start + num_bytes < end) {
@@ -624,14 +623,14 @@ cont:
                 * the compression code ran but failed to make things smaller,
                 * free any pages it allocated and our page pointer array
                 */
-               for (i = 0; i < nr_pages_ret; i++) {
+               for (i = 0; i < nr_pages; i++) {
                        WARN_ON(pages[i]->mapping);
                        put_page(pages[i]);
                }
                kfree(pages);
                pages = NULL;
                total_compressed = 0;
-               nr_pages_ret = 0;
+               nr_pages = 0;
 
                /* flag the file so we don't compress in the future */
                if (!btrfs_test_opt(fs_info, FORCE_COMPRESS) &&
@@ -660,7 +659,7 @@ cleanup_and_bail_uncompressed:
        return;
 
 free_pages_out:
-       for (i = 0; i < nr_pages_ret; i++) {
+       for (i = 0; i < nr_pages; i++) {
                WARN_ON(pages[i]->mapping);
                put_page(pages[i]);
        }
index 489f78c4e5eca203a888a8d31bc9383d370dd7a7..0baf978fbcaf157b8f8f474cff469d32eadaa0ca 100644 (file)
@@ -88,7 +88,6 @@ static int lzo_compress_pages(struct list_head *ws,
                              struct address_space *mapping,
                              u64 start,
                              struct page **pages,
-                             unsigned long nr_dest_pages,
                              unsigned long *out_pages,
                              unsigned long *total_in,
                              unsigned long *total_out,
@@ -103,6 +102,7 @@ static int lzo_compress_pages(struct list_head *ws,
        struct page *out_page = NULL;
        unsigned long bytes_left;
        unsigned long len = *total_out;
+       unsigned long nr_dest_pages = *out_pages;
        size_t in_len;
        size_t out_len;
        char *buf;
index 42d76b7824c38422d20db6141f2983d59b31c663..e7f2020f8ee7643c7d8fcb0262c2d41c444671bc 100644 (file)
@@ -75,7 +75,6 @@ static int zlib_compress_pages(struct list_head *ws,
                               struct address_space *mapping,
                               u64 start,
                               struct page **pages,
-                              unsigned long nr_dest_pages,
                               unsigned long *out_pages,
                               unsigned long *total_in,
                               unsigned long *total_out,
@@ -90,6 +89,7 @@ static int zlib_compress_pages(struct list_head *ws,
        struct page *out_page = NULL;
        unsigned long bytes_left;
        unsigned long len = *total_out;
+       unsigned long nr_dest_pages = *out_pages;
 
        *out_pages = 0;
        *total_out = 0;