tree:   
https://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git 
dm-4.17
head:   8702a90d3c773f590c875d4300e751fce1780bbc
commit: 8702a90d3c773f590c875d4300e751fce1780bbc [25/25] dm verity: allow 
parallel processing of blocks
config: i386-randconfig-x016-201812 (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
        git checkout 8702a90d3c773f590c875d4300e751fce1780bbc
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

   drivers//md/dm-verity-target.c: In function 'verity_verify_io':
>> drivers//md/dm-verity-target.c:560:22: error: assignment from incompatible 
>> pointer type [-Werror=incompatible-pointer-types]
     iodata->reqdata_arr = reqdata_arr;
                         ^
   cc1: some warnings being treated as errors

vim +560 drivers//md/dm-verity-target.c

   533  
   534  static void verity_release_req(struct dm_verity_io_data *iodata)
   535  {
   536          kfree(iodata->reqdata_arr);
   537          kfree(iodata);
   538  }
   539  /*
   540   * Verify one "dm_verity_io" structure.
   541   */
   542  static void verity_verify_io(struct dm_verity_io *io)
   543  {
   544          bool is_zero;
   545          struct dm_verity *v = io->v;
   546          unsigned int b = 0, blocks = 0;
   547          struct dm_verity_io_data *iodata = NULL;
   548          struct dm_verity_req_data *reqdata_arr = NULL;
   549          struct scatterlist *sg = NULL;
   550          int r;
   551  
   552          iodata = kmalloc(sizeof(*iodata), GFP_NOIO);
   553          reqdata_arr = kmalloc_array(io->n_blocks,
   554                                      sizeof(struct dm_verity_req_data), 
GFP_NOIO);
   555          if (unlikely((iodata == NULL) || (reqdata_arr == NULL))) {
   556                  WARN_ON((iodata == NULL) || (reqdata_arr == NULL));
   557                  goto err_memfree;
   558          }
   559          atomic_set(&iodata->expected_reqs, io->n_blocks);
 > 560          iodata->reqdata_arr = reqdata_arr;
   561          iodata->io = io;
   562          iodata->total_reqs = blocks = io->n_blocks;
   563  
   564          for (b = 0; b < blocks; b++) {
   565                  unsigned int nents;
   566                  unsigned int total_len = 0;
   567                  unsigned int num_of_buffs = 0;
   568                  sector_t cur_block = io->block + b;
   569  
   570                  if (v->validated_blocks &&
   571                      likely(test_bit(cur_block, v->validated_blocks))) {
   572                          verity_bv_skip_block(v, io, &io->iter);
   573                          continue;
   574                  }
   575  
   576                  reqdata_arr[b].req = ahash_request_alloc(v->tfm, 
GFP_NOIO);
   577                  if (unlikely(reqdata_arr[b].req == NULL))
   578                          goto err_memfree;
   579                  ahash_request_set_tfm(reqdata_arr[b].req, v->tfm);
   580  
   581                  /* +1 for the salt buffer */
   582                  num_of_buffs = verity_calc_buffs_for_bv(v, io, 
&io->iter) + 1;
   583                  WARN_ON(num_of_buffs < 1);
   584                  sg = kmalloc_array(num_of_buffs, sizeof(struct 
scatterlist),
   585                                     GFP_NOIO);
   586                  if (!sg) {
   587                          DMERR_LIMIT("%s: kmalloc_array failed", 
__func__);
   588                          goto err_memfree;
   589                  }
   590                  sg_init_table(sg, num_of_buffs);
   591                  // FIXME: if we 'err_memfree' (or continue;) below how 
does this sg get kfree()'d?
   592  
   593                  r = verity_hash_for_block(v, io, cur_block,
   594                                            reqdata_arr[b].want_digest,
   595                                            &reqdata_arr[b].fec_io, 
&is_zero);
   596                  if (unlikely(r < 0))
   597                          goto err_memfree;
   598  
   599                  if (is_zero) {
   600                          /*
   601                           * If we expect a zero block, don't validate, 
just
   602                           * return zeroes.
   603                           */
   604                          r = verity_for_bv_block(v, io, &io->iter,
   605                                                  verity_bv_zero);
   606                          if (unlikely(r < 0))
   607                                  goto err_memfree;
   608                          verity_cb_complete(iodata, r);
   609                          continue;
   610                  }
   611  
   612                  nents = 0;
   613                  total_len = 0;
   614                  if (verity_is_salt_required(v, START_SG))
   615                          verity_add_salt(v, sg, &nents, &total_len);
   616  
   617                  verity_for_io_block(v, io, &io->iter, sg, &nents, 
&total_len);
   618                  if (verity_is_salt_required(v, END_SG))
   619                          verity_add_salt(v, sg, &nents, &total_len);
   620  
   621                  reqdata_arr[b].iodata = iodata;
   622                  reqdata_arr[b].sg = sg;
   623                  reqdata_arr[b].digest_size = v->digest_size;
   624                  reqdata_arr[b].iblock = b;
   625                  /*
   626                   * Need to mark end of chain, since we might
   627                   * have allocated more than we actually use.
   628                   */
   629                  sg_mark_end(&sg[nents-1]);
   630  
   631                  ahash_request_set_tfm(reqdata_arr[b].req, v->tfm);
   632                  ahash_request_set_callback(reqdata_arr[b].req,
   633                                             CRYPTO_TFM_REQ_MAY_SLEEP |
   634                                             CRYPTO_TFM_REQ_MAY_BACKLOG,
   635                                             single_block_req_done, 
&reqdata_arr[b]);
   636                  ahash_request_set_crypt(reqdata_arr[b].req, sg,
   637                                          reqdata_arr[b].real_digest, 
total_len);
   638                  r = crypto_ahash_digest(reqdata_arr[b].req);
   639                  if (r == 0) {
   640                          /* digest completed already, callback won't be 
called. */
   641                          __single_block_req_done(&reqdata_arr[b], r);
   642                  }
   643          }
   644          return;
   645  
   646  err_memfree:
   647          /*
   648           * reduce expected requests by the number of unsent
   649           * requests, -1 accounting for the current block
   650           */
   651          atomic_sub(blocks - b - 1, &iodata->expected_reqs);
   652          verity_cb_complete(iodata, -EIO);
   653  }
   654  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip

--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to