:::::: 
:::::: Manual check reason: "low confidence static check warning: 
fs/btrfs/zlib.c:151:10: warning: Branch condition evaluates to a garbage value 
[clang-analyzer-core.uninitialized.Branch]"
:::::: 

CC: [email protected]
CC: [email protected]
BCC: [email protected]
In-Reply-To: <[email protected]>
References: <[email protected]>
TO: "Fabio M. De Francesco" <[email protected]>
TO: Chris Mason <[email protected]>
TO: Josef Bacik <[email protected]>
TO: David Sterba <[email protected]>
TO: Ira Weiny <[email protected]>
TO: [email protected]
TO: [email protected]
CC: "Fabio M. De Francesco" <[email protected]>

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-20220601]
[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
:::::: branch date: 35 hours ago
:::::: commit date: 35 hours ago
config: mips-randconfig-c004-20220531 
(https://download.01.org/0day-ci/archive/20220602/[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
        # install mips cross compiling tool for clang build
        # apt-get install binutils-mipsel-linux-gnu
        # 
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
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=mips 
clang-analyzer 

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


clang-analyzer warnings: (new ones prefixed by >>)
           ^~~~~~
   drivers/md/dm-crypt.c:2619:2: note: Call to function 'memset' is insecure as 
it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'memset_s' in case of C11
           memset(key, '0', key_string_len);
           ^~~~~~
   drivers/md/dm-crypt.c:2641:2: warning: Call to function 'memset' is insecure 
as it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'memset_s' in case of C11 
[clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
           memset(&cc->key, 0, cc->key_size * sizeof(u8));
           ^~~~~~
   drivers/md/dm-crypt.c:2641:2: note: Call to function 'memset' is insecure as 
it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'memset_s' in case of C11
           memset(&cc->key, 0, cc->key_size * sizeof(u8));
           ^~~~~~
   drivers/md/dm-crypt.c:2832:2: warning: Call to function 'strncpy' is 
insecure as it does not provide security checks introduced in the C11 standard. 
Replace with analogous functions that support length arguments or provides 
boundary checks such as 'strncpy_s' in case of C11 
[clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
           strncpy(mac_alg, start, end - start);
           ^~~~~~~
   drivers/md/dm-crypt.c:2832:2: note: Call to function 'strncpy' is insecure 
as it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'strncpy_s' in case of C11
           strncpy(mac_alg, start, end - start);
           ^~~~~~~
   drivers/md/dm-crypt.c:2897:9: warning: Call to function 'snprintf' is 
insecure as it does not provide security checks introduced in the C11 standard. 
Replace with analogous functions that support length arguments or provides 
boundary checks such as 'snprintf_s' in case of C11 
[clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
                   ret = snprintf(buf, CRYPTO_MAX_ALG_NAME, "essiv(%s,%s)",
                         ^~~~~~~~
   drivers/md/dm-crypt.c:2897:9: note: Call to function 'snprintf' is insecure 
as it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'snprintf_s' in case of C11
                   ret = snprintf(buf, CRYPTO_MAX_ALG_NAME, "essiv(%s,%s)",
                         ^~~~~~~~
   drivers/md/dm-crypt.c:2947:11: warning: Call to function 'sscanf' is 
insecure as it does not provide security checks introduced in the C11 standard. 
Replace with analogous functions that support length arguments or provides 
boundary checks such as 'sscanf_s' in case of C11 
[clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
           else if (sscanf(keycount, "%u%c", &cc->tfms_count, &dummy) != 1 ||
                    ^~~~~~
   drivers/md/dm-crypt.c:2947:11: note: Call to function 'sscanf' is insecure 
as it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'sscanf_s' in case of C11
           else if (sscanf(keycount, "%u%c", &cc->tfms_count, &dummy) != 1 ||
                    ^~~~~~
   drivers/md/dm-crypt.c:2982:9: warning: Call to function 'snprintf' is 
insecure as it does not provide security checks introduced in the C11 standard. 
Replace with analogous functions that support length arguments or provides 
boundary checks such as 'snprintf_s' in case of C11 
[clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
                   ret = snprintf(cipher_api, CRYPTO_MAX_ALG_NAME,
                         ^~~~~~~~
   drivers/md/dm-crypt.c:2982:9: note: Call to function 'snprintf' is insecure 
as it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'snprintf_s' in case of C11
                   ret = snprintf(cipher_api, CRYPTO_MAX_ALG_NAME,
                         ^~~~~~~~
   drivers/md/dm-crypt.c:2985:9: warning: Call to function 'snprintf' is 
insecure as it does not provide security checks introduced in the C11 standard. 
Replace with analogous functions that support length arguments or provides 
boundary checks such as 'snprintf_s' in case of C11 
[clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
                   ret = snprintf(cipher_api, CRYPTO_MAX_ALG_NAME,
                         ^~~~~~~~
   drivers/md/dm-crypt.c:2985:9: note: Call to function 'snprintf' is insecure 
as it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'snprintf_s' in case of C11
                   ret = snprintf(cipher_api, CRYPTO_MAX_ALG_NAME,
                         ^~~~~~~~
   drivers/md/dm-crypt.c:3059:3: warning: Call to function 'memset' is insecure 
as it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'memset_s' in case of C11 
[clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
                   memset(cc->key, 0, cc->key_size * sizeof(u8));
                   ^~~~~~
   drivers/md/dm-crypt.c:3059:3: note: Call to function 'memset' is insecure as 
it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'memset_s' in case of C11
                   memset(cc->key, 0, cc->key_size * sizeof(u8));
                   ^~~~~~
   drivers/md/dm-crypt.c:3103:12: warning: Call to function 'sscanf' is 
insecure as it does not provide security checks introduced in the C11 standard. 
Replace with analogous functions that support length arguments or provides 
boundary checks such as 'sscanf_s' in case of C11 
[clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
                   else if (sscanf(opt_string, "integrity:%u:", &val) == 1) {
                            ^~~~~~
   drivers/md/dm-crypt.c:3103:12: note: Call to function 'sscanf' is insecure 
as it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'sscanf_s' in case of C11
                   else if (sscanf(opt_string, "integrity:%u:", &val) == 1) {
                            ^~~~~~
   drivers/md/dm-crypt.c:3120:14: warning: Call to function 'sscanf' is 
insecure as it does not provide security checks introduced in the C11 standard. 
Replace with analogous functions that support length arguments or provides 
boundary checks such as 'sscanf_s' in case of C11 
[clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
                   } else if (sscanf(opt_string, "sector_size:%hu%c", 
&cc->sector_size, &dummy) == 1) {
                              ^~~~~~
   drivers/md/dm-crypt.c:3120:14: note: Call to function 'sscanf' is insecure 
as it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'sscanf_s' in case of C11
                   } else if (sscanf(opt_string, "sector_size:%hu%c", 
&cc->sector_size, &dummy) == 1) {
                              ^~~~~~
   drivers/md/dm-crypt.c:3270:7: warning: Call to function 'sscanf' is insecure 
as it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'sscanf_s' in case of C11 
[clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
           if ((sscanf(argv[2], "%llu%c", &tmpll, &dummy) != 1) ||
                ^~~~~~
   drivers/md/dm-crypt.c:3270:7: note: Call to function 'sscanf' is insecure as 
it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'sscanf_s' in case of C11
           if ((sscanf(argv[2], "%llu%c", &tmpll, &dummy) != 1) ||
                ^~~~~~
   drivers/md/dm-crypt.c:3284:6: warning: Call to function 'sscanf' is insecure 
as it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'sscanf_s' in case of C11 
[clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
           if (sscanf(argv[4], "%llu%c", &tmpll, &dummy) != 1 || tmpll != 
(sector_t)tmpll) {
               ^~~~~~
   drivers/md/dm-crypt.c:3284:6: note: Call to function 'sscanf' is insecure as 
it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'sscanf_s' in case of C11
           if (sscanf(argv[4], "%llu%c", &tmpll, &dummy) != 1 || tmpll != 
(sector_t)tmpll) {
               ^~~~~~
   drivers/md/dm-crypt.c:3577:5: warning: Call to function 'memset' is insecure 
as it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'memset_s' in case of C11 
[clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
                                   memset(argv[2], '0', strlen(argv[2]));
                                   ^~~~~~
   drivers/md/dm-crypt.c:3577:5: note: Call to function 'memset' is insecure as 
it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'memset_s' in case of C11
                                   memset(argv[2], '0', strlen(argv[2]));
                                   ^~~~~~
   drivers/md/dm-crypt.c:3588:5: warning: Call to function 'memset' is insecure 
as it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'memset_s' in case of C11 
[clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
                                   memset(cc->key, 0, cc->key_size * 
sizeof(u8));
                                   ^~~~~~
   drivers/md/dm-crypt.c:3588:5: note: Call to function 'memset' is insecure as 
it does not provide security checks introduced in the C11 standard. Replace 
with analogous functions that support length arguments or provides boundary 
checks such as 'memset_s' in case of C11
                                   memset(cc->key, 0, cc->key_size * 
sizeof(u8));
                                   ^~~~~~
   Suppressed 60 warnings (60 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   45 warnings generated.
   fs/btrfs/free-space-cache.c:385:2: warning: Call to function 'memset' is 
insecure as it does not provide security checks introduced in the C11 standard. 
Replace with analogous functions that support length arguments or provides 
boundary checks such as 'memset_s' in case of C11 
[clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
           memset(io_ctl, 0, sizeof(struct btrfs_io_ctl));
           ^~~~~~
   fs/btrfs/free-space-cache.c:385:2: note: Call to function 'memset' is 
insecure as it does not provide security checks introduced in the C11 standard. 
Replace with analogous functions that support length arguments or provides 
boundary checks such as 'memset_s' in case of C11
           memset(io_ctl, 0, sizeof(struct btrfs_io_ctl));
           ^~~~~~
   fs/btrfs/free-space-cache.c:755:2: warning: Value stored to 'ret' is never 
read [clang-analyzer-deadcode.DeadStores]
           ret = -1;
           ^     ~~
   fs/btrfs/free-space-cache.c:755:2: note: Value stored to 'ret' is never read
           ret = -1;
           ^     ~~
   Suppressed 43 warnings (43 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   48 warnings generated.
>> fs/btrfs/zlib.c:151:10: warning: Branch condition evaluates to a garbage 
>> value [clang-analyzer-core.uninitialized.Branch]
                                           if (data_in) {
                                               ^~~~~~~
   fs/btrfs/zlib.c:100:2: note: 'data_in' declared without an initial value
           char *data_in;
           ^~~~~~~~~~~~~
   fs/btrfs/zlib.c:115:6: note: Assuming the condition is false
           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:115:2: note: Taking false branch
           if (Z_OK != zlib_deflateInit(&workspace->strm, workspace->level)) {
           ^
   fs/btrfs/zlib.c:125:6: note: Assuming 'out_page' is not equal to NULL
           if (out_page == NULL) {
               ^~~~~~~~~~~~~~~~
   fs/btrfs/zlib.c:125:2: note: Taking false branch
           if (out_page == NULL) {
           ^
   fs/btrfs/zlib.c:138:9: note: Assuming 'len' is > field 'total_in'
           while (workspace->strm.total_in < len) {
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/btrfs/zlib.c:138:2: note: Loop condition is true.  Entering loop body
           while (workspace->strm.total_in < len) {
           ^
   fs/btrfs/zlib.c:143:23: note: Field 'avail_in' is equal to 0
                   if (workspace->strm.avail_in == 0) {
                                       ^
   fs/btrfs/zlib.c:143:3: note: Taking true branch
                   if (workspace->strm.avail_in == 0) {
                   ^
   fs/btrfs/zlib.c:145:19: note: Assuming '__UNIQUE_ID___x270' is >= 
'__UNIQUE_ID___y271'
                           in_buf_pages = min(DIV_ROUND_UP(bytes_left, 
PAGE_SIZE),
                                          ^
   include/linux/minmax.h:45:19: note: expanded from macro 'min'
   #define min(x, y)       __careful_cmp(x, y, <)
                           ^~~~~~~~~~~~~~~~~~~~~~
   include/linux/minmax.h:38:3: note: expanded from macro '__careful_cmp'
                   __cmp_once(x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y), op))
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/minmax.h:33:3: note: expanded from macro '__cmp_once'
                   __cmp(unique_x, unique_y, op); })
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/minmax.h:28:26: note: expanded from macro '__cmp'
   #define __cmp(x, y, op) ((x) op (y) ? (x) : (y))
                            ^~~~~~~~~~
   fs/btrfs/zlib.c:145:19: note: '?' condition is false
                           in_buf_pages = min(DIV_ROUND_UP(bytes_left, 
PAGE_SIZE),
                                          ^
   include/linux/minmax.h:45:19: note: expanded from macro 'min'
   #define min(x, y)       __careful_cmp(x, y, <)
                           ^
   include/linux/minmax.h:38:3: note: expanded from macro '__careful_cmp'
                   __cmp_once(x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y), op))
                   ^
   include/linux/minmax.h:33:3: note: expanded from macro '__cmp_once'
                   __cmp(unique_x, unique_y, op); })
                   ^
   include/linux/minmax.h:28:26: note: expanded from macro '__cmp'
   #define __cmp(x, y, op) ((x) op (y) ? (x) : (y))
                            ^
   fs/btrfs/zlib.c:147:8: note: Assuming 'in_buf_pages' is > 1
                           if (in_buf_pages > 1) {
                               ^~~~~~~~~~~~~~~~
   fs/btrfs/zlib.c:147:4: note: Taking true branch
                           if (in_buf_pages > 1) {
                           ^
   fs/btrfs/zlib.c:150:17: note: 'i' is < 'in_buf_pages'
                                   for (i = 0; i < in_buf_pages; i++) {
                                               ^
   fs/btrfs/zlib.c:150:5: note: Loop condition is true.  Entering loop body
                                   for (i = 0; i < in_buf_pages; i++) {
                                   ^
   fs/btrfs/zlib.c:151:10: note: Branch condition evaluates to a garbage value
                                           if (data_in) {
                                               ^~~~~~~
   fs/btrfs/zlib.c:158:6: warning: Call to function 'memcpy' is insecure as it 
does not provide security checks introduced in the C11 standard. Replace with 
analogous functions that support length arguments or provides boundary checks 
such as 'memcpy_s' in case of C11 
[clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
                                           memcpy(workspace->buf + i * 
PAGE_SIZE,
                                           ^~~~~~
   fs/btrfs/zlib.c:158:6: note: Call to function 'memcpy' is insecure as it 
does not provide security checks introduced in the C11 standard. Replace with 
analogous functions that support length arguments or provides boundary checks 
such as 'memcpy_s' in case of C11
                                           memcpy(workspace->buf + i * 
PAGE_SIZE,
                                           ^~~~~~
   fs/btrfs/zlib.c:164:9: warning: Branch condition evaluates to a garbage 
value [clang-analyzer-core.uninitialized.Branch]
                                   if (data_in) {
                                       ^~~~~~~
   fs/btrfs/zlib.c:100:2: note: 'data_in' declared without an initial value
           char *data_in;
           ^~~~~~~~~~~~~
   fs/btrfs/zlib.c:115:6: note: Assuming the condition is false
           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:115:2: note: Taking false branch
           if (Z_OK != zlib_deflateInit(&workspace->strm, workspace->level)) {
           ^
   fs/btrfs/zlib.c:125:6: note: Assuming 'out_page' is not equal to NULL
           if (out_page == NULL) {

vim +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;
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) {
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  }
c8b978188c9a0f Chris Mason           2008-10-29  276  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp
_______________________________________________
kbuild mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to