I've since fixed this up.. but I'll respond to the previous posted
patches with additional context on what I changed.

I also have a request about how the sg array is freed on the error path.

Mike

On Mon, Mar 26 2018 at  6:34pm -0400,
kbuild test robot <[email protected]> wrote:

> 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


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

Reply via email to