2022-06-01 11:06:24

by Fabio M. De Francesco

[permalink] [raw]
Subject: [PATCH 3/3] btrfs: Replace kmap() with kmap_local_page() in zlib.c

The use of kmap() is being deprecated in favor of kmap_local_page() where
it is feasible. With kmap_local_page(), the mapping is per thread, CPU
local and not globally visible.

Therefore, use kmap_local_page() / kunmap_local() in zlib.c wherever the
mappings are per thread and not globally visible.

Tested on QEMU + KVM 32 bits VM with 4GB of RAM and HIGHMEM64G enabled.

Suggested-by: Ira Weiny <[email protected]>
Signed-off-by: Fabio M. De Francesco <[email protected]>
---
fs/btrfs/zlib.c | 40 ++++++++++++++++++++--------------------
1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/fs/btrfs/zlib.c b/fs/btrfs/zlib.c
index 767a0c6c9694..7c10e78bd3d4 100644
--- a/fs/btrfs/zlib.c
+++ b/fs/btrfs/zlib.c
@@ -126,7 +126,7 @@ int zlib_compress_pages(struct list_head *ws, struct address_space *mapping,
ret = -ENOMEM;
goto out;
}
- cpage_out = kmap(out_page);
+ cpage_out = kmap_local_page(out_page);
pages[0] = out_page;
nr_pages = 1;

@@ -148,26 +148,26 @@ int zlib_compress_pages(struct list_head *ws, struct address_space *mapping,
int i;

for (i = 0; i < in_buf_pages; i++) {
- if (in_page) {
- kunmap(in_page);
+ if (data_in) {
+ kunmap_local(data_in);
put_page(in_page);
}
in_page = find_get_page(mapping,
start >> PAGE_SHIFT);
- data_in = kmap(in_page);
+ data_in = kmap_local_page(in_page);
memcpy(workspace->buf + i * PAGE_SIZE,
data_in, PAGE_SIZE);
start += PAGE_SIZE;
}
workspace->strm.next_in = workspace->buf;
} else {
- if (in_page) {
- kunmap(in_page);
+ if (data_in) {
+ kunmap_local(data_in);
put_page(in_page);
}
in_page = find_get_page(mapping,
start >> PAGE_SHIFT);
- data_in = kmap(in_page);
+ data_in = kmap_local_page(in_page);
start += PAGE_SIZE;
workspace->strm.next_in = data_in;
}
@@ -196,7 +196,7 @@ int zlib_compress_pages(struct list_head *ws, struct address_space *mapping,
* the stream end if required
*/
if (workspace->strm.avail_out == 0) {
- kunmap(out_page);
+ kunmap_local(cpage_out);
if (nr_pages == nr_dest_pages) {
out_page = NULL;
ret = -E2BIG;
@@ -207,7 +207,7 @@ int zlib_compress_pages(struct list_head *ws, struct address_space *mapping,
ret = -ENOMEM;
goto out;
}
- cpage_out = kmap(out_page);
+ cpage_out = kmap_local_page(out_page);
pages[nr_pages] = out_page;
nr_pages++;
workspace->strm.avail_out = PAGE_SIZE;
@@ -234,7 +234,7 @@ int zlib_compress_pages(struct list_head *ws, struct address_space *mapping,
goto out;
} else if (workspace->strm.avail_out == 0) {
/* get another page for the stream end */
- kunmap(out_page);
+ kunmap_local(cpage_out);
if (nr_pages == nr_dest_pages) {
out_page = NULL;
ret = -E2BIG;
@@ -245,7 +245,7 @@ int zlib_compress_pages(struct list_head *ws, struct address_space *mapping,
ret = -ENOMEM;
goto out;
}
- cpage_out = kmap(out_page);
+ cpage_out = kmap_local_page(out_page);
pages[nr_pages] = out_page;
nr_pages++;
workspace->strm.avail_out = PAGE_SIZE;
@@ -264,11 +264,11 @@ int zlib_compress_pages(struct list_head *ws, struct address_space *mapping,
*total_in = workspace->strm.total_in;
out:
*out_pages = nr_pages;
- if (out_page)
- kunmap(out_page);
+ if (cpage_out)
+ kunmap_local(cpage_out);

- if (in_page) {
- kunmap(in_page);
+ if (data_in) {
+ kunmap_local(data_in);
put_page(in_page);
}
return ret;
@@ -287,7 +287,7 @@ int zlib_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
unsigned long buf_start;
struct page **pages_in = cb->compressed_pages;

- data_in = kmap(pages_in[page_in_index]);
+ data_in = kmap_local_page(pages_in[page_in_index]);
workspace->strm.next_in = data_in;
workspace->strm.avail_in = min_t(size_t, srclen, PAGE_SIZE);
workspace->strm.total_in = 0;
@@ -309,7 +309,7 @@ int zlib_decompress_bio(struct list_head *ws, struct compressed_bio *cb)

if (Z_OK != zlib_inflateInit2(&workspace->strm, wbits)) {
pr_warn("BTRFS: inflateInit failed\n");
- kunmap(pages_in[page_in_index]);
+ kunmap_local(data_in);
return -EIO;
}
while (workspace->strm.total_in < srclen) {
@@ -336,13 +336,13 @@ int zlib_decompress_bio(struct list_head *ws, struct compressed_bio *cb)

if (workspace->strm.avail_in == 0) {
unsigned long tmp;
- kunmap(pages_in[page_in_index]);
+ kunmap_local(data_in);
page_in_index++;
if (page_in_index >= total_pages_in) {
data_in = NULL;
break;
}
- data_in = kmap(pages_in[page_in_index]);
+ data_in = kmap_local_page(pages_in[page_in_index]);
workspace->strm.next_in = data_in;
tmp = srclen - workspace->strm.total_in;
workspace->strm.avail_in = min(tmp, PAGE_SIZE);
@@ -355,7 +355,7 @@ int zlib_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
done:
zlib_inflateEnd(&workspace->strm);
if (data_in)
- kunmap(pages_in[page_in_index]);
+ kunmap_local(data_in);
if (!ret)
zero_fill_bio(cb->orig_bio);
return ret;
--
2.36.1



2022-06-01 21:30:17

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH 3/3] btrfs: Replace kmap() with kmap_local_page() in zlib.c

Hi "Fabio,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on kdave/for-next]
[also build test WARNING on v5.18 next-20220531]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/intel-lab-lkp/linux/commits/Fabio-M-De-Francesco/btrfs-Replace-kmap-with-kmap_local_page/20220531-225557
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
config: x86_64-randconfig-a012 (https://download.01.org/0day-ci/archive/20220601/[email protected]/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project c825abd6b0198fb088d9752f556a70705bc99dfd)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/a549d3a90067e82e5e7d44d78a98e4a4feb628c3
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Fabio-M-De-Francesco/btrfs-Replace-kmap-with-kmap_local_page/20220531-225557
git checkout a549d3a90067e82e5e7d44d78a98e4a4feb628c3
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash fs/btrfs/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <[email protected]>

All warnings (new ones prefixed by >>):

>> fs/btrfs/zlib.c:125:6: warning: variable 'data_in' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (out_page == NULL) {
^~~~~~~~~~~~~~~~
fs/btrfs/zlib.c:270:6: note: uninitialized use occurs here
if (data_in) {
^~~~~~~
fs/btrfs/zlib.c:125:2: note: remove the 'if' if its condition is always false
if (out_page == NULL) {
^~~~~~~~~~~~~~~~~~~~~~~
fs/btrfs/zlib.c:115:6: warning: variable 'data_in' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (Z_OK != zlib_deflateInit(&workspace->strm, workspace->level)) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/zlib.h:148:25: note: expanded from macro 'Z_OK'
#define Z_OK 0
^
fs/btrfs/zlib.c:270:6: note: uninitialized use occurs here
if (data_in) {
^~~~~~~
fs/btrfs/zlib.c:115:2: note: remove the 'if' if its condition is always false
if (Z_OK != zlib_deflateInit(&workspace->strm, workspace->level)) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/btrfs/zlib.c:100:15: note: initialize the variable 'data_in' to silence this warning
char *data_in;
^
= NULL
>> fs/btrfs/zlib.c:125:6: warning: variable 'cpage_out' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (out_page == NULL) {
^~~~~~~~~~~~~~~~
fs/btrfs/zlib.c:267:6: note: uninitialized use occurs here
if (cpage_out)
^~~~~~~~~
fs/btrfs/zlib.c:125:2: note: remove the 'if' if its condition is always false
if (out_page == NULL) {
^~~~~~~~~~~~~~~~~~~~~~~
fs/btrfs/zlib.c:115:6: warning: variable 'cpage_out' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (Z_OK != zlib_deflateInit(&workspace->strm, workspace->level)) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/zlib.h:148:25: note: expanded from macro 'Z_OK'
#define Z_OK 0
^
fs/btrfs/zlib.c:267:6: note: uninitialized use occurs here
if (cpage_out)
^~~~~~~~~
fs/btrfs/zlib.c:115:2: note: remove the 'if' if its condition is always false
if (Z_OK != zlib_deflateInit(&workspace->strm, workspace->level)) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/btrfs/zlib.c:101:17: note: initialize the variable 'cpage_out' to silence this warning
char *cpage_out;
^
= NULL
4 warnings generated.


vim +125 fs/btrfs/zlib.c

c8b978188c9a0fd Chris Mason 2008-10-29 93
c4bf665a3197554 David Sterba 2019-10-01 94 int zlib_compress_pages(struct list_head *ws, struct address_space *mapping,
c4bf665a3197554 David Sterba 2019-10-01 95 u64 start, struct page **pages, unsigned long *out_pages,
c4bf665a3197554 David Sterba 2019-10-01 96 unsigned long *total_in, unsigned long *total_out)
c8b978188c9a0fd Chris Mason 2008-10-29 97 {
261507a02ccba9a Li Zefan 2010-12-17 98 struct workspace *workspace = list_entry(ws, struct workspace, list);
c8b978188c9a0fd Chris Mason 2008-10-29 99 int ret;
c8b978188c9a0fd Chris Mason 2008-10-29 100 char *data_in;
c8b978188c9a0fd Chris Mason 2008-10-29 101 char *cpage_out;
c8b978188c9a0fd Chris Mason 2008-10-29 102 int nr_pages = 0;
c8b978188c9a0fd Chris Mason 2008-10-29 103 struct page *in_page = NULL;
c8b978188c9a0fd Chris Mason 2008-10-29 104 struct page *out_page = NULL;
c8b978188c9a0fd Chris Mason 2008-10-29 105 unsigned long bytes_left;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 106 unsigned int in_buf_pages;
38c31464089f639 David Sterba 2017-02-14 107 unsigned long len = *total_out;
4d3a800ebb12999 David Sterba 2017-02-14 108 unsigned long nr_dest_pages = *out_pages;
e5d74902362f1a0 David Sterba 2017-02-14 109 const unsigned long max_out = nr_dest_pages * PAGE_SIZE;
c8b978188c9a0fd Chris Mason 2008-10-29 110
c8b978188c9a0fd Chris Mason 2008-10-29 111 *out_pages = 0;
c8b978188c9a0fd Chris Mason 2008-10-29 112 *total_out = 0;
c8b978188c9a0fd Chris Mason 2008-10-29 113 *total_in = 0;
c8b978188c9a0fd Chris Mason 2008-10-29 114
f51d2b59120ff36 David Sterba 2017-09-15 115 if (Z_OK != zlib_deflateInit(&workspace->strm, workspace->level)) {
62e855771dacf7c Jeff Mahoney 2016-09-20 116 pr_warn("BTRFS: deflateInit failed\n");
60e1975acb48fc3 Zach Brown 2014-05-09 117 ret = -EIO;
c8b978188c9a0fd Chris Mason 2008-10-29 118 goto out;
c8b978188c9a0fd Chris Mason 2008-10-29 119 }
c8b978188c9a0fd Chris Mason 2008-10-29 120
7880991344f7364 Sergey Senozhatsky 2014-07-07 121 workspace->strm.total_in = 0;
7880991344f7364 Sergey Senozhatsky 2014-07-07 122 workspace->strm.total_out = 0;
c8b978188c9a0fd Chris Mason 2008-10-29 123
b0ee5e1ec44afda David Sterba 2021-06-14 124 out_page = alloc_page(GFP_NOFS);
4b72029dc3fd6ba Li Zefan 2010-11-09 @125 if (out_page == NULL) {
60e1975acb48fc3 Zach Brown 2014-05-09 126 ret = -ENOMEM;
4b72029dc3fd6ba Li Zefan 2010-11-09 127 goto out;
4b72029dc3fd6ba Li Zefan 2010-11-09 128 }
a549d3a90067e82 Fabio M. De Francesco 2022-05-31 129 cpage_out = kmap_local_page(out_page);
c8b978188c9a0fd Chris Mason 2008-10-29 130 pages[0] = out_page;
c8b978188c9a0fd Chris Mason 2008-10-29 131 nr_pages = 1;
c8b978188c9a0fd Chris Mason 2008-10-29 132
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 133 workspace->strm.next_in = workspace->buf;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 134 workspace->strm.avail_in = 0;
7880991344f7364 Sergey Senozhatsky 2014-07-07 135 workspace->strm.next_out = cpage_out;
09cbfeaf1a5a67b Kirill A. Shutemov 2016-04-01 136 workspace->strm.avail_out = PAGE_SIZE;
c8b978188c9a0fd Chris Mason 2008-10-29 137
7880991344f7364 Sergey Senozhatsky 2014-07-07 138 while (workspace->strm.total_in < len) {
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 139 /*
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 140 * Get next input pages and copy the contents to
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 141 * the workspace buffer if required.
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 142 */
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 143 if (workspace->strm.avail_in == 0) {
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 144 bytes_left = len - workspace->strm.total_in;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 145 in_buf_pages = min(DIV_ROUND_UP(bytes_left, PAGE_SIZE),
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 146 workspace->buf_size / PAGE_SIZE);
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 147 if (in_buf_pages > 1) {
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 148 int i;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 149
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 150 for (i = 0; i < in_buf_pages; i++) {
a549d3a90067e82 Fabio M. De Francesco 2022-05-31 151 if (data_in) {
a549d3a90067e82 Fabio M. De Francesco 2022-05-31 152 kunmap_local(data_in);
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 153 put_page(in_page);
55276e14df4324a David Sterba 2021-10-27 154 }
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 155 in_page = find_get_page(mapping,
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 156 start >> PAGE_SHIFT);
a549d3a90067e82 Fabio M. De Francesco 2022-05-31 157 data_in = kmap_local_page(in_page);
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 158 memcpy(workspace->buf + i * PAGE_SIZE,
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 159 data_in, PAGE_SIZE);
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 160 start += PAGE_SIZE;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 161 }
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 162 workspace->strm.next_in = workspace->buf;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 163 } else {
a549d3a90067e82 Fabio M. De Francesco 2022-05-31 164 if (data_in) {
a549d3a90067e82 Fabio M. De Francesco 2022-05-31 165 kunmap_local(data_in);
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 166 put_page(in_page);
55276e14df4324a David Sterba 2021-10-27 167 }
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 168 in_page = find_get_page(mapping,
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 169 start >> PAGE_SHIFT);
a549d3a90067e82 Fabio M. De Francesco 2022-05-31 170 data_in = kmap_local_page(in_page);
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 171 start += PAGE_SIZE;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 172 workspace->strm.next_in = data_in;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 173 }
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 174 workspace->strm.avail_in = min(bytes_left,
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 175 (unsigned long) workspace->buf_size);
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 176 }
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 177
7880991344f7364 Sergey Senozhatsky 2014-07-07 178 ret = zlib_deflate(&workspace->strm, Z_SYNC_FLUSH);
c8b978188c9a0fd Chris Mason 2008-10-29 179 if (ret != Z_OK) {
62e855771dacf7c Jeff Mahoney 2016-09-20 180 pr_debug("BTRFS: deflate in loop returned %d\n",
c8b978188c9a0fd Chris Mason 2008-10-29 181 ret);
7880991344f7364 Sergey Senozhatsky 2014-07-07 182 zlib_deflateEnd(&workspace->strm);
60e1975acb48fc3 Zach Brown 2014-05-09 183 ret = -EIO;
c8b978188c9a0fd Chris Mason 2008-10-29 184 goto out;
c8b978188c9a0fd Chris Mason 2008-10-29 185 }
c8b978188c9a0fd Chris Mason 2008-10-29 186
c8b978188c9a0fd Chris Mason 2008-10-29 187 /* we're making it bigger, give up */
7880991344f7364 Sergey Senozhatsky 2014-07-07 188 if (workspace->strm.total_in > 8192 &&
7880991344f7364 Sergey Senozhatsky 2014-07-07 189 workspace->strm.total_in <
7880991344f7364 Sergey Senozhatsky 2014-07-07 190 workspace->strm.total_out) {
130d5b415a091e4 David Sterba 2014-06-20 191 ret = -E2BIG;
c8b978188c9a0fd Chris Mason 2008-10-29 192 goto out;
c8b978188c9a0fd Chris Mason 2008-10-29 193 }
c8b978188c9a0fd Chris Mason 2008-10-29 194 /* we need another page for writing out. Test this
c8b978188c9a0fd Chris Mason 2008-10-29 195 * before the total_in so we will pull in a new page for
c8b978188c9a0fd Chris Mason 2008-10-29 196 * the stream end if required
c8b978188c9a0fd Chris Mason 2008-10-29 197 */
7880991344f7364 Sergey Senozhatsky 2014-07-07 198 if (workspace->strm.avail_out == 0) {
a549d3a90067e82 Fabio M. De Francesco 2022-05-31 199 kunmap_local(cpage_out);
c8b978188c9a0fd Chris Mason 2008-10-29 200 if (nr_pages == nr_dest_pages) {
c8b978188c9a0fd Chris Mason 2008-10-29 201 out_page = NULL;
60e1975acb48fc3 Zach Brown 2014-05-09 202 ret = -E2BIG;
c8b978188c9a0fd Chris Mason 2008-10-29 203 goto out;
c8b978188c9a0fd Chris Mason 2008-10-29 204 }
b0ee5e1ec44afda David Sterba 2021-06-14 205 out_page = alloc_page(GFP_NOFS);
4b72029dc3fd6ba Li Zefan 2010-11-09 206 if (out_page == NULL) {
60e1975acb48fc3 Zach Brown 2014-05-09 207 ret = -ENOMEM;
4b72029dc3fd6ba Li Zefan 2010-11-09 208 goto out;
4b72029dc3fd6ba Li Zefan 2010-11-09 209 }
a549d3a90067e82 Fabio M. De Francesco 2022-05-31 210 cpage_out = kmap_local_page(out_page);
c8b978188c9a0fd Chris Mason 2008-10-29 211 pages[nr_pages] = out_page;
c8b978188c9a0fd Chris Mason 2008-10-29 212 nr_pages++;
09cbfeaf1a5a67b Kirill A. Shutemov 2016-04-01 213 workspace->strm.avail_out = PAGE_SIZE;
7880991344f7364 Sergey Senozhatsky 2014-07-07 214 workspace->strm.next_out = cpage_out;
c8b978188c9a0fd Chris Mason 2008-10-29 215 }
c8b978188c9a0fd Chris Mason 2008-10-29 216 /* we're all done */
7880991344f7364 Sergey Senozhatsky 2014-07-07 217 if (workspace->strm.total_in >= len)
c8b978188c9a0fd Chris Mason 2008-10-29 218 break;
7880991344f7364 Sergey Senozhatsky 2014-07-07 219 if (workspace->strm.total_out > max_out)
c8b978188c9a0fd Chris Mason 2008-10-29 220 break;
c8b978188c9a0fd Chris Mason 2008-10-29 221 }
7880991344f7364 Sergey Senozhatsky 2014-07-07 222 workspace->strm.avail_in = 0;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 223 /*
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 224 * Call deflate with Z_FINISH flush parameter providing more output
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 225 * space but no more input data, until it returns with Z_STREAM_END.
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 226 */
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 227 while (ret != Z_STREAM_END) {
7880991344f7364 Sergey Senozhatsky 2014-07-07 228 ret = zlib_deflate(&workspace->strm, Z_FINISH);
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 229 if (ret == Z_STREAM_END)
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 230 break;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 231 if (ret != Z_OK && ret != Z_BUF_ERROR) {
7880991344f7364 Sergey Senozhatsky 2014-07-07 232 zlib_deflateEnd(&workspace->strm);
60e1975acb48fc3 Zach Brown 2014-05-09 233 ret = -EIO;
c8b978188c9a0fd Chris Mason 2008-10-29 234 goto out;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 235 } else if (workspace->strm.avail_out == 0) {
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 236 /* get another page for the stream end */
a549d3a90067e82 Fabio M. De Francesco 2022-05-31 237 kunmap_local(cpage_out);
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 238 if (nr_pages == nr_dest_pages) {
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 239 out_page = NULL;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 240 ret = -E2BIG;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 241 goto out;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 242 }
b0ee5e1ec44afda David Sterba 2021-06-14 243 out_page = alloc_page(GFP_NOFS);
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 244 if (out_page == NULL) {
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 245 ret = -ENOMEM;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 246 goto out;
c8b978188c9a0fd Chris Mason 2008-10-29 247 }
a549d3a90067e82 Fabio M. De Francesco 2022-05-31 248 cpage_out = kmap_local_page(out_page);
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 249 pages[nr_pages] = out_page;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 250 nr_pages++;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 251 workspace->strm.avail_out = PAGE_SIZE;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 252 workspace->strm.next_out = cpage_out;
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 253 }
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 254 }
3fd396afc05fc90 Mikhail Zaslonko 2020-01-30 255 zlib_deflateEnd(&workspace->strm);
c8b978188c9a0fd Chris Mason 2008-10-29 256
7880991344f7364 Sergey Senozhatsky 2014-07-07 257 if (workspace->strm.total_out >= workspace->strm.total_in) {
60e1975acb48fc3 Zach Brown 2014-05-09 258 ret = -E2BIG;
c8b978188c9a0fd Chris Mason 2008-10-29 259 goto out;
c8b978188c9a0fd Chris Mason 2008-10-29 260 }
c8b978188c9a0fd Chris Mason 2008-10-29 261
c8b978188c9a0fd Chris Mason 2008-10-29 262 ret = 0;
7880991344f7364 Sergey Senozhatsky 2014-07-07 263 *total_out = workspace->strm.total_out;
7880991344f7364 Sergey Senozhatsky 2014-07-07 264 *total_in = workspace->strm.total_in;
c8b978188c9a0fd Chris Mason 2008-10-29 265 out:
c8b978188c9a0fd Chris Mason 2008-10-29 266 *out_pages = nr_pages;
a549d3a90067e82 Fabio M. De Francesco 2022-05-31 267 if (cpage_out)
a549d3a90067e82 Fabio M. De Francesco 2022-05-31 268 kunmap_local(cpage_out);
55276e14df4324a David Sterba 2021-10-27 269
a549d3a90067e82 Fabio M. De Francesco 2022-05-31 270 if (data_in) {
a549d3a90067e82 Fabio M. De Francesco 2022-05-31 271 kunmap_local(data_in);
09cbfeaf1a5a67b Kirill A. Shutemov 2016-04-01 272 put_page(in_page);
55276e14df4324a David Sterba 2021-10-27 273 }
c8b978188c9a0fd Chris Mason 2008-10-29 274 return ret;
c8b978188c9a0fd Chris Mason 2008-10-29 275 }
c8b978188c9a0fd Chris Mason 2008-10-29 276

--
0-DAY CI Kernel Test Service
https://01.org/lkp

2022-06-01 21:39:13

by Fabio M. De Francesco

[permalink] [raw]
Subject: Re: [PATCH 3/3] btrfs: Replace kmap() with kmap_local_page() in zlib.c

On martedì 31 maggio 2022 22:35:30 CEST kernel test robot wrote:
> Hi "Fabio,
>
> Thank you for the patch! Perhaps something to improve:
>

[snip]

> If you fix the issue, kindly add following tag where applicable
> Reported-by: kernel test robot <[email protected]>
>
> All warnings (new ones prefixed by >>):
>
> >> fs/btrfs/zlib.c:125:6: warning: variable 'data_in' is used
uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
> if (out_page == NULL) {
> ^~~~~~~~~~~~~~~~
> fs/btrfs/zlib.c:270:6: note: uninitialized use occurs here
> if (data_in) {
> ^~~~~~~
> fs/btrfs/zlib.c:125:2: note: remove the 'if' if its condition is
always false
> if (out_page == NULL) {
> ^~~~~~~~~~~~~~~~~~~~~~~
> fs/btrfs/zlib.c:115:6: warning: variable 'data_in' is used
uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
> if (Z_OK != zlib_deflateInit(&workspace->strm, workspace-
>level)) {
>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/linux/zlib.h:148:25: note: expanded from macro 'Z_OK'
> #define Z_OK 0
> ^
> fs/btrfs/zlib.c:270:6: note: uninitialized use occurs here
> if (data_in) {
> ^~~~~~~
> fs/btrfs/zlib.c:115:2: note: remove the 'if' if its condition is
always false
> if (Z_OK != zlib_deflateInit(&workspace->strm, workspace-
>level)) {
>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> fs/btrfs/zlib.c:100:15: note: initialize the variable 'data_in' to
silence this warning
> char *data_in;
> ^
> = NULL
> >> fs/btrfs/zlib.c:125:6: warning: variable 'cpage_out' is used
uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
> if (out_page == NULL) {
> ^~~~~~~~~~~~~~~~
> fs/btrfs/zlib.c:267:6: note: uninitialized use occurs here
> if (cpage_out)
> ^~~~~~~~~
> fs/btrfs/zlib.c:125:2: note: remove the 'if' if its condition is
always false
> if (out_page == NULL) {
> ^~~~~~~~~~~~~~~~~~~~~~~
> fs/btrfs/zlib.c:115:6: warning: variable 'cpage_out' is used
uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
> if (Z_OK != zlib_deflateInit(&workspace->strm, workspace-
>level)) {
>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/linux/zlib.h:148:25: note: expanded from macro 'Z_OK'
> #define Z_OK 0
> ^
> fs/btrfs/zlib.c:267:6: note: uninitialized use occurs here
> if (cpage_out)
> ^~~~~~~~~
> fs/btrfs/zlib.c:115:2: note: remove the 'if' if its condition is
always false
> if (Z_OK != zlib_deflateInit(&workspace->strm, workspace-
>level)) {
>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> fs/btrfs/zlib.c:101:17: note: initialize the variable 'cpage_out' to
silence this warning
> char *cpage_out;
> ^
> = NULL
> 4 warnings generated.

I'll initialize these variables in v2.

Thanks,

Fabio



2022-06-06 12:17:57

by Dan Carpenter

[permalink] [raw]
Subject: Re: [PATCH 3/3] btrfs: Replace kmap() with kmap_local_page() in zlib.c

Hi "Fabio,

url: https://github.com/intel-lab-lkp/linux/commits/Fabio-M-De-Francesco/btrfs-Replace-kmap-with-kmap_local_page/20220531-225557
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
config: x86_64-rhel-8.3-kselftests (https://download.01.org/0day-ci/archive/20220603/[email protected]/config)
compiler: gcc-11 (Debian 11.3.0-1) 11.3.0

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <[email protected]>
Reported-by: Dan Carpenter <[email protected]>

New smatch warnings:
fs/btrfs/zlib.c:151 zlib_compress_pages() error: uninitialized symbol 'data_in'.
fs/btrfs/zlib.c:267 zlib_compress_pages() error: uninitialized symbol 'cpage_out'.

Old smatch warnings:
fs/btrfs/zlib.c:164 zlib_compress_pages() error: uninitialized symbol 'data_in'.
fs/btrfs/zlib.c:227 zlib_compress_pages() error: uninitialized symbol 'ret'.
fs/btrfs/zlib.c:270 zlib_compress_pages() error: uninitialized symbol 'data_in'.

vim +/data_in +151 fs/btrfs/zlib.c

c8b978188c9a0f Chris Mason 2008-10-29 93
c4bf665a319755 David Sterba 2019-10-01 94 int zlib_compress_pages(struct list_head *ws, struct address_space *mapping,
c4bf665a319755 David Sterba 2019-10-01 95 u64 start, struct page **pages, unsigned long *out_pages,
c4bf665a319755 David Sterba 2019-10-01 96 unsigned long *total_in, unsigned long *total_out)
c8b978188c9a0f Chris Mason 2008-10-29 97 {
261507a02ccba9 Li Zefan 2010-12-17 98 struct workspace *workspace = list_entry(ws, struct workspace, list);
c8b978188c9a0f Chris Mason 2008-10-29 99 int ret;
c8b978188c9a0f Chris Mason 2008-10-29 100 char *data_in;
^^^^^^^

c8b978188c9a0f Chris Mason 2008-10-29 101 char *cpage_out;
c8b978188c9a0f Chris Mason 2008-10-29 102 int nr_pages = 0;
c8b978188c9a0f Chris Mason 2008-10-29 103 struct page *in_page = NULL;
c8b978188c9a0f Chris Mason 2008-10-29 104 struct page *out_page = NULL;
c8b978188c9a0f Chris Mason 2008-10-29 105 unsigned long bytes_left;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 106 unsigned int in_buf_pages;
38c31464089f63 David Sterba 2017-02-14 107 unsigned long len = *total_out;
4d3a800ebb1299 David Sterba 2017-02-14 108 unsigned long nr_dest_pages = *out_pages;
e5d74902362f1a David Sterba 2017-02-14 109 const unsigned long max_out = nr_dest_pages * PAGE_SIZE;
c8b978188c9a0f Chris Mason 2008-10-29 110
c8b978188c9a0f Chris Mason 2008-10-29 111 *out_pages = 0;
c8b978188c9a0f Chris Mason 2008-10-29 112 *total_out = 0;
c8b978188c9a0f Chris Mason 2008-10-29 113 *total_in = 0;
c8b978188c9a0f Chris Mason 2008-10-29 114
f51d2b59120ff3 David Sterba 2017-09-15 115 if (Z_OK != zlib_deflateInit(&workspace->strm, workspace->level)) {
62e855771dacf7 Jeff Mahoney 2016-09-20 116 pr_warn("BTRFS: deflateInit failed\n");
60e1975acb48fc Zach Brown 2014-05-09 117 ret = -EIO;
c8b978188c9a0f Chris Mason 2008-10-29 118 goto out;

cpage_out is not initialized before the goto.

c8b978188c9a0f Chris Mason 2008-10-29 119 }
c8b978188c9a0f Chris Mason 2008-10-29 120
7880991344f736 Sergey Senozhatsky 2014-07-07 121 workspace->strm.total_in = 0;
7880991344f736 Sergey Senozhatsky 2014-07-07 122 workspace->strm.total_out = 0;
c8b978188c9a0f Chris Mason 2008-10-29 123
b0ee5e1ec44afd David Sterba 2021-06-14 124 out_page = alloc_page(GFP_NOFS);
4b72029dc3fd6b Li Zefan 2010-11-09 125 if (out_page == NULL) {
60e1975acb48fc Zach Brown 2014-05-09 126 ret = -ENOMEM;
4b72029dc3fd6b Li Zefan 2010-11-09 127 goto out;
4b72029dc3fd6b Li Zefan 2010-11-09 128 }
a549d3a90067e8 Fabio M. De Francesco 2022-05-31 129 cpage_out = kmap_local_page(out_page);
c8b978188c9a0f Chris Mason 2008-10-29 130 pages[0] = out_page;
c8b978188c9a0f Chris Mason 2008-10-29 131 nr_pages = 1;
c8b978188c9a0f Chris Mason 2008-10-29 132
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 133 workspace->strm.next_in = workspace->buf;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 134 workspace->strm.avail_in = 0;
7880991344f736 Sergey Senozhatsky 2014-07-07 135 workspace->strm.next_out = cpage_out;
09cbfeaf1a5a67 Kirill A. Shutemov 2016-04-01 136 workspace->strm.avail_out = PAGE_SIZE;
c8b978188c9a0f Chris Mason 2008-10-29 137
7880991344f736 Sergey Senozhatsky 2014-07-07 138 while (workspace->strm.total_in < len) {
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 139 /*
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 140 * Get next input pages and copy the contents to
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 141 * the workspace buffer if required.
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 142 */
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 143 if (workspace->strm.avail_in == 0) {
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 144 bytes_left = len - workspace->strm.total_in;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 145 in_buf_pages = min(DIV_ROUND_UP(bytes_left, PAGE_SIZE),
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 146 workspace->buf_size / PAGE_SIZE);
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 147 if (in_buf_pages > 1) {
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 148 int i;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 149
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 150 for (i = 0; i < in_buf_pages; i++) {
a549d3a90067e8 Fabio M. De Francesco 2022-05-31 @151 if (data_in) {
^^^^^^^
Uninitialized.

a549d3a90067e8 Fabio M. De Francesco 2022-05-31 152 kunmap_local(data_in);
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 153 put_page(in_page);
55276e14df4324 David Sterba 2021-10-27 154 }
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 155 in_page = find_get_page(mapping,
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 156 start >> PAGE_SHIFT);
a549d3a90067e8 Fabio M. De Francesco 2022-05-31 157 data_in = kmap_local_page(in_page);
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 158 memcpy(workspace->buf + i * PAGE_SIZE,
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 159 data_in, PAGE_SIZE);
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 160 start += PAGE_SIZE;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 161 }
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 162 workspace->strm.next_in = workspace->buf;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 163 } else {
a549d3a90067e8 Fabio M. De Francesco 2022-05-31 164 if (data_in) {
a549d3a90067e8 Fabio M. De Francesco 2022-05-31 165 kunmap_local(data_in);
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 166 put_page(in_page);
55276e14df4324 David Sterba 2021-10-27 167 }
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 168 in_page = find_get_page(mapping,
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 169 start >> PAGE_SHIFT);
a549d3a90067e8 Fabio M. De Francesco 2022-05-31 170 data_in = kmap_local_page(in_page);
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 171 start += PAGE_SIZE;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 172 workspace->strm.next_in = data_in;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 173 }
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 174 workspace->strm.avail_in = min(bytes_left,
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 175 (unsigned long) workspace->buf_size);
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 176 }
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 177
7880991344f736 Sergey Senozhatsky 2014-07-07 178 ret = zlib_deflate(&workspace->strm, Z_SYNC_FLUSH);
c8b978188c9a0f Chris Mason 2008-10-29 179 if (ret != Z_OK) {
62e855771dacf7 Jeff Mahoney 2016-09-20 180 pr_debug("BTRFS: deflate in loop returned %d\n",
c8b978188c9a0f Chris Mason 2008-10-29 181 ret);
7880991344f736 Sergey Senozhatsky 2014-07-07 182 zlib_deflateEnd(&workspace->strm);
60e1975acb48fc Zach Brown 2014-05-09 183 ret = -EIO;
c8b978188c9a0f Chris Mason 2008-10-29 184 goto out;
c8b978188c9a0f Chris Mason 2008-10-29 185 }
c8b978188c9a0f Chris Mason 2008-10-29 186
c8b978188c9a0f Chris Mason 2008-10-29 187 /* we're making it bigger, give up */
7880991344f736 Sergey Senozhatsky 2014-07-07 188 if (workspace->strm.total_in > 8192 &&
7880991344f736 Sergey Senozhatsky 2014-07-07 189 workspace->strm.total_in <
7880991344f736 Sergey Senozhatsky 2014-07-07 190 workspace->strm.total_out) {
130d5b415a091e David Sterba 2014-06-20 191 ret = -E2BIG;
c8b978188c9a0f Chris Mason 2008-10-29 192 goto out;
c8b978188c9a0f Chris Mason 2008-10-29 193 }
c8b978188c9a0f Chris Mason 2008-10-29 194 /* we need another page for writing out. Test this
c8b978188c9a0f Chris Mason 2008-10-29 195 * before the total_in so we will pull in a new page for
c8b978188c9a0f Chris Mason 2008-10-29 196 * the stream end if required
c8b978188c9a0f Chris Mason 2008-10-29 197 */
7880991344f736 Sergey Senozhatsky 2014-07-07 198 if (workspace->strm.avail_out == 0) {
a549d3a90067e8 Fabio M. De Francesco 2022-05-31 199 kunmap_local(cpage_out);
c8b978188c9a0f Chris Mason 2008-10-29 200 if (nr_pages == nr_dest_pages) {
c8b978188c9a0f Chris Mason 2008-10-29 201 out_page = NULL;
60e1975acb48fc Zach Brown 2014-05-09 202 ret = -E2BIG;
c8b978188c9a0f Chris Mason 2008-10-29 203 goto out;
c8b978188c9a0f Chris Mason 2008-10-29 204 }
b0ee5e1ec44afd David Sterba 2021-06-14 205 out_page = alloc_page(GFP_NOFS);
4b72029dc3fd6b Li Zefan 2010-11-09 206 if (out_page == NULL) {
60e1975acb48fc Zach Brown 2014-05-09 207 ret = -ENOMEM;
4b72029dc3fd6b Li Zefan 2010-11-09 208 goto out;
4b72029dc3fd6b Li Zefan 2010-11-09 209 }
a549d3a90067e8 Fabio M. De Francesco 2022-05-31 210 cpage_out = kmap_local_page(out_page);
c8b978188c9a0f Chris Mason 2008-10-29 211 pages[nr_pages] = out_page;
c8b978188c9a0f Chris Mason 2008-10-29 212 nr_pages++;
09cbfeaf1a5a67 Kirill A. Shutemov 2016-04-01 213 workspace->strm.avail_out = PAGE_SIZE;
7880991344f736 Sergey Senozhatsky 2014-07-07 214 workspace->strm.next_out = cpage_out;
c8b978188c9a0f Chris Mason 2008-10-29 215 }
c8b978188c9a0f Chris Mason 2008-10-29 216 /* we're all done */
7880991344f736 Sergey Senozhatsky 2014-07-07 217 if (workspace->strm.total_in >= len)
c8b978188c9a0f Chris Mason 2008-10-29 218 break;
7880991344f736 Sergey Senozhatsky 2014-07-07 219 if (workspace->strm.total_out > max_out)
c8b978188c9a0f Chris Mason 2008-10-29 220 break;
c8b978188c9a0f Chris Mason 2008-10-29 221 }
7880991344f736 Sergey Senozhatsky 2014-07-07 222 workspace->strm.avail_in = 0;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 223 /*
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 224 * Call deflate with Z_FINISH flush parameter providing more output
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 225 * space but no more input data, until it returns with Z_STREAM_END.
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 226 */
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 227 while (ret != Z_STREAM_END) {
7880991344f736 Sergey Senozhatsky 2014-07-07 228 ret = zlib_deflate(&workspace->strm, Z_FINISH);
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 229 if (ret == Z_STREAM_END)
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 230 break;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 231 if (ret != Z_OK && ret != Z_BUF_ERROR) {
7880991344f736 Sergey Senozhatsky 2014-07-07 232 zlib_deflateEnd(&workspace->strm);
60e1975acb48fc Zach Brown 2014-05-09 233 ret = -EIO;
c8b978188c9a0f Chris Mason 2008-10-29 234 goto out;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 235 } else if (workspace->strm.avail_out == 0) {
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 236 /* get another page for the stream end */
a549d3a90067e8 Fabio M. De Francesco 2022-05-31 237 kunmap_local(cpage_out);
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 238 if (nr_pages == nr_dest_pages) {
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 239 out_page = NULL;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 240 ret = -E2BIG;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 241 goto out;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 242 }
b0ee5e1ec44afd David Sterba 2021-06-14 243 out_page = alloc_page(GFP_NOFS);
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 244 if (out_page == NULL) {
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 245 ret = -ENOMEM;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 246 goto out;
c8b978188c9a0f Chris Mason 2008-10-29 247 }
a549d3a90067e8 Fabio M. De Francesco 2022-05-31 248 cpage_out = kmap_local_page(out_page);
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 249 pages[nr_pages] = out_page;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 250 nr_pages++;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 251 workspace->strm.avail_out = PAGE_SIZE;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 252 workspace->strm.next_out = cpage_out;
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 253 }
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 254 }
3fd396afc05fc9 Mikhail Zaslonko 2020-01-30 255 zlib_deflateEnd(&workspace->strm);
c8b978188c9a0f Chris Mason 2008-10-29 256
7880991344f736 Sergey Senozhatsky 2014-07-07 257 if (workspace->strm.total_out >= workspace->strm.total_in) {
60e1975acb48fc Zach Brown 2014-05-09 258 ret = -E2BIG;
c8b978188c9a0f Chris Mason 2008-10-29 259 goto out;
c8b978188c9a0f Chris Mason 2008-10-29 260 }
c8b978188c9a0f Chris Mason 2008-10-29 261
c8b978188c9a0f Chris Mason 2008-10-29 262 ret = 0;
7880991344f736 Sergey Senozhatsky 2014-07-07 263 *total_out = workspace->strm.total_out;
7880991344f736 Sergey Senozhatsky 2014-07-07 264 *total_in = workspace->strm.total_in;
c8b978188c9a0f Chris Mason 2008-10-29 265 out:
c8b978188c9a0f Chris Mason 2008-10-29 266 *out_pages = nr_pages;
a549d3a90067e8 Fabio M. De Francesco 2022-05-31 @267 if (cpage_out)
a549d3a90067e8 Fabio M. De Francesco 2022-05-31 268 kunmap_local(cpage_out);
55276e14df4324 David Sterba 2021-10-27 269
a549d3a90067e8 Fabio M. De Francesco 2022-05-31 270 if (data_in) {
a549d3a90067e8 Fabio M. De Francesco 2022-05-31 271 kunmap_local(data_in);
09cbfeaf1a5a67 Kirill A. Shutemov 2016-04-01 272 put_page(in_page);
55276e14df4324 David Sterba 2021-10-27 273 }
c8b978188c9a0f Chris Mason 2008-10-29 274 return ret;
c8b978188c9a0f Chris Mason 2008-10-29 275 }

--
0-DAY CI Kernel Test Service
https://01.org/lkp