All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] implement direct IO with integrity
@ 2021-10-28 11:24 Alexander V. Buev
  2021-10-28 11:24 ` [PATCH 1/3] block: bio-integrity: add PI iovec to bio Alexander V. Buev
                   ` (3 more replies)
  0 siblings, 4 replies; 29+ messages in thread
From: Alexander V. Buev @ 2021-10-28 11:24 UTC (permalink / raw)
  To: linux-block
  Cc: Jens Axboe, Christoph Hellwig, Martin K . Petersen,
	Mikhail Malygin, linux, Alexander V. Buev

This series of patches makes possible to do direct block IO
with integrity payload using io uring kernel interface.
Userspace app can utilize READV/WRITEV operation with a new 
(unused before) flag in sqe struct to mark IO request as 
"request with integrity payload". 
When this flag is set, the last of provided iovecs
must contain pointer and length of this integrity payload.

Alexander V. Buev (3):
  block: bio-integrity: add PI iovec to bio
  block: io_uring: add IO_WITH_PI flag to SQE
  block: fops: handle IOCB_USE_PI in direct IO

 block/bio-integrity.c         | 124 +++++++++++++++++++++++++++++++++-
 block/fops.c                  |  71 +++++++++++++++++++
 fs/io_uring.c                 |  32 ++++++++-
 include/linux/bio.h           |   8 +++
 include/linux/fs.h            |   1 +
 include/uapi/linux/io_uring.h |   3 +
 6 files changed, 235 insertions(+), 4 deletions(-)

-- 
2.33.0


^ permalink raw reply	[flat|nested] 29+ messages in thread
* Re: [PATCH 1/3] block: bio-integrity: add PI iovec to bio
@ 2021-10-30 10:29 kernel test robot
  0 siblings, 0 replies; 29+ messages in thread
From: kernel test robot @ 2021-10-30 10:29 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 25252 bytes --]

CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
In-Reply-To: <20211028112406.101314-2-a.buev@yadro.com>
References: <20211028112406.101314-2-a.buev@yadro.com>
TO: "Alexander V. Buev" <a.buev@yadro.com>
TO: linux-block(a)vger.kernel.org
CC: Jens Axboe <axboe@kernel.dk>
CC: Christoph Hellwig <hch@lst.de>
CC: "Martin K . Petersen" <martin.petersen@oracle.com>
CC: Mikhail Malygin <m.malygin@yadro.com>
CC: linux(a)yadro.com
CC: "Alexander V. Buev" <a.buev@yadro.com>

Hi "Alexander,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v5.15-rc7]
[cannot apply to axboe-block/for-next hch-configfs/for-next next-20211029]
[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/0day-ci/linux/commits/Alexander-V-Buev/implement-direct-IO-with-integrity/20211028-193652
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 1fc596a56b334f4d593a2b49e5ff55af6aaa0816
:::::: branch date: 2 days ago
:::::: commit date: 2 days ago
config: riscv-randconfig-c006-20211028 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 5db7568a6a1fcb408eb8988abdaff2a225a8eb72)
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 riscv cross compiling tool for clang build
        # apt-get install binutils-riscv64-linux-gnu
        # https://github.com/0day-ci/linux/commit/582fcf396dced9b11bbf489cd5f64e213de2e4fd
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Alexander-V-Buev/implement-direct-IO-with-integrity/20211028-193652
        git checkout 582fcf396dced9b11bbf489cd5f64e213de2e4fd
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv clang-analyzer 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


clang-analyzer warnings: (new ones prefixed by >>)
   5 warnings generated.
   Suppressed 5 warnings (5 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.
   6 warnings generated.
   drivers/phy/microchip/sparx5_serdes.c:715:10: warning: 2nd function call argument is an uninitialized value [clang-analyzer-core.CallAndMessage]
           u8 iw = sd25g28_get_iw_setting(macro->priv->dev, mode->bitwidth);
                   ^
   drivers/phy/microchip/sparx5_serdes.c:2219:6: note: Assuming 'err' is 0
           if (err)
               ^~~
   drivers/phy/microchip/sparx5_serdes.c:2219:2: note: Taking false branch
           if (err)
           ^
   drivers/phy/microchip/sparx5_serdes.c:2221:6: note: Assuming field 'serdestype' is equal to SPX5_SDT_25G
           if (macro->serdestype == SPX5_SDT_25G)
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/phy/microchip/sparx5_serdes.c:2221:2: note: Taking true branch
           if (macro->serdestype == SPX5_SDT_25G)
           ^
   drivers/phy/microchip/sparx5_serdes.c:2222:9: note: Calling 'sparx5_sd25g28_config'
                   err = sparx5_sd25g28_config(macro, true);
                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/phy/microchip/sparx5_serdes.c:1868:8: note: Calling 'sparx5_sd10g25_get_mode_preset'
           err = sparx5_sd10g25_get_mode_preset(macro, &mode);
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/phy/microchip/sparx5_serdes.c:647:2: note: Control jumps to 'case SPX5_SD_MODE_SFI:'  at line 648
           switch (macro->serdesmode) {
           ^
   drivers/phy/microchip/sparx5_serdes.c:649:7: note: Assuming field 'speed' is not equal to SPEED_25000
                   if (macro->speed == SPEED_25000)
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/phy/microchip/sparx5_serdes.c:649:3: note: Taking false branch
                   if (macro->speed == SPEED_25000)
                   ^
   drivers/phy/microchip/sparx5_serdes.c:651:12: note: Assuming field 'speed' is not equal to SPEED_10000
                   else if (macro->speed == SPEED_10000)
                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/phy/microchip/sparx5_serdes.c:651:8: note: Taking false branch
                   else if (macro->speed == SPEED_10000)
                        ^
   drivers/phy/microchip/sparx5_serdes.c:653:12: note: Assuming field 'speed' is not equal to SPEED_5000
                   else if (macro->speed == SPEED_5000)
                            ^~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/phy/microchip/sparx5_serdes.c:653:8: note: Taking false branch
                   else if (macro->speed == SPEED_5000)
                        ^
   drivers/phy/microchip/sparx5_serdes.c:655:3: note:  Execution continues on line 669
                   break;
                   ^
   drivers/phy/microchip/sparx5_serdes.c:669:2: note: Returning without writing to 'mode->bitwidth'
           return 0;
           ^
   drivers/phy/microchip/sparx5_serdes.c:1868:8: note: Returning from 'sparx5_sd10g25_get_mode_preset'
           err = sparx5_sd10g25_get_mode_preset(macro, &mode);
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/phy/microchip/sparx5_serdes.c:1869:6: note: 'err' is 0
           if (err)
               ^~~
   drivers/phy/microchip/sparx5_serdes.c:1869:2: note: Taking false branch
           if (err)
           ^
   drivers/phy/microchip/sparx5_serdes.c:1871:2: note: Calling 'sparx5_sd25g28_get_params'
           sparx5_sd25g28_get_params(macro, &media, &mode, &args, &params);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/phy/microchip/sparx5_serdes.c:715:10: note: 2nd function call argument is an uninitialized value
           u8 iw = sd25g28_get_iw_setting(macro->priv->dev, mode->bitwidth);
                   ^                                        ~~~~~~~~~~~~~~
   Suppressed 5 warnings (5 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.
   7 warnings generated.
   block/bfq-wf2q.c:263:7: warning: Access to field 'my_sched_data' results in a dereference of a null pointer (loaded from variable 'entity') [clang-analyzer-core.NullDereference]
           if (!entity->my_sched_data)
                ^
   block/bfq-wf2q.c:1508:2: note: 'entity' initialized to a null pointer value
           struct bfq_entity *entity = NULL;
           ^~~~~~~~~~~~~~~~~~~~~~~~~
   block/bfq-wf2q.c:1512:6: note: Assuming the condition is false
           if (bfq_tot_busy_queues(bfqd) == 0)
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   block/bfq-wf2q.c:1512:2: note: Taking false branch
           if (bfq_tot_busy_queues(bfqd) == 0)
           ^
   block/bfq-wf2q.c:1521:2: note: Loop condition is false. Execution continues on line 1582
           for (; sd ; sd = entity->my_sched_data) {
           ^
   block/bfq-wf2q.c:1582:28: note: Passing null pointer value via 1st parameter 'entity'
           bfqq = bfq_entity_to_bfqq(entity);
                                     ^~~~~~
   block/bfq-wf2q.c:1582:9: note: Calling 'bfq_entity_to_bfqq'
           bfqq = bfq_entity_to_bfqq(entity);
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~
   block/bfq-wf2q.c:263:7: note: Access to field 'my_sched_data' results in a dereference of a null pointer (loaded from variable 'entity')
           if (!entity->my_sched_data)
                ^~~~~~
   Suppressed 6 warnings (6 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.
   7 warnings generated.
   Suppressed 7 warnings (6 in non-user code, 1 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   6 warnings generated.
>> block/bio-integrity.c:492:13: warning: Access to field 'bip_flags' results in a dereference of an undefined pointer value (loaded from variable 'bip') [clang-analyzer-core.NullDereference]
           if (ret && bip->bip_flags & BIP_RELEASE_PAGES)
                      ^~~
   block/bio-integrity.c:406:2: note: 'bip' declared without an initial value
           struct bio_integrity_payload *bip;
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   block/bio-integrity.c:417:16: note: 'bi' is non-null
           if (unlikely(!bi)) {
                         ^
   include/linux/compiler.h:78:42: note: expanded from macro 'unlikely'
   # define unlikely(x)    __builtin_expect(!!(x), 0)
                                               ^
   block/bio-integrity.c:417:2: note: Taking false branch
           if (unlikely(!bi)) {
           ^
   block/bio-integrity.c:425:15: note: Assuming 'nr_vec_page' is <= 8
           if (unlikely(nr_vec_page > __MAX_ONSTACK_PI_PAGES)) {
                        ^
   include/linux/compiler.h:78:42: note: expanded from macro 'unlikely'
   # define unlikely(x)    __builtin_expect(!!(x), 0)
                                               ^
   block/bio-integrity.c:425:2: note: Taking false branch
           if (unlikely(nr_vec_page > __MAX_ONSTACK_PI_PAGES)) {
           ^
   block/bio-integrity.c:432:15: note: Assuming the condition is true
           if (unlikely(intervals * bi->tuple_size < pi_iov->iov_len)) {
                        ^
   include/linux/compiler.h:78:42: note: expanded from macro 'unlikely'
   # define unlikely(x)    __builtin_expect(!!(x), 0)
                                               ^
   block/bio-integrity.c:432:2: note: Taking true branch
           if (unlikely(intervals * bi->tuple_size < pi_iov->iov_len)) {
           ^
   block/bio-integrity.c:433:3: note: Left side of '&&' is true
                   pr_err("Interval number is wrong, intervals=%d, bi->tuple_size=%d, pi_iov->iov_len=%u",
                   ^
   include/linux/printk.h:489:2: note: expanded from macro 'pr_err'
           printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
           ^
   include/linux/printk.h:446:26: note: expanded from macro 'printk'
   #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)
                            ^
   include/linux/printk.h:417:3: note: expanded from macro 'printk_index_wrap'
                   __printk_index_emit(_fmt, NULL, NULL);                  \
                   ^
   include/linux/printk.h:370:7: note: expanded from macro '__printk_index_emit'
                   if (__builtin_constant_p(_fmt) && __builtin_constant_p(_level)) { \
                       ^
   block/bio-integrity.c:433:3: note: Taking true branch
                   pr_err("Interval number is wrong, intervals=%d, bi->tuple_size=%d, pi_iov->iov_len=%u",
                   ^
   include/linux/printk.h:489:2: note: expanded from macro 'pr_err'
           printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
           ^
   include/linux/printk.h:446:26: note: expanded from macro 'printk'
   #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)
                            ^
   include/linux/printk.h:417:3: note: expanded from macro 'printk_index_wrap'
                   __printk_index_emit(_fmt, NULL, NULL);                  \
                   ^
   include/linux/printk.h:370:3: note: expanded from macro '__printk_index_emit'
                   if (__builtin_constant_p(_fmt) && __builtin_constant_p(_level)) { \
                   ^
   block/bio-integrity.c:433:3: note: '?' condition is true
                   pr_err("Interval number is wrong, intervals=%d, bi->tuple_size=%d, pi_iov->iov_len=%u",
                   ^
   include/linux/printk.h:489:2: note: expanded from macro 'pr_err'
           printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
           ^
   include/linux/printk.h:446:26: note: expanded from macro 'printk'
   #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)
                            ^
   include/linux/printk.h:417:3: note: expanded from macro 'printk_index_wrap'
                   __printk_index_emit(_fmt, NULL, NULL);                  \
                   ^
   include/linux/printk.h:379:12: note: expanded from macro '__printk_index_emit'
                                   .fmt = __builtin_constant_p(_fmt) ? (_fmt) : NULL, \
                                          ^
   block/bio-integrity.c:433:3: note: '?' condition is true
                   pr_err("Interval number is wrong, intervals=%d, bi->tuple_size=%d, pi_iov->iov_len=%u",
                   ^
   include/linux/printk.h:489:2: note: expanded from macro 'pr_err'
           printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
           ^
   include/linux/printk.h:446:26: note: expanded from macro 'printk'
   #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)
                            ^
   include/linux/printk.h:417:3: note: expanded from macro 'printk_index_wrap'
                   __printk_index_emit(_fmt, NULL, NULL);                  \
                   ^
   include/linux/printk.h:383:14: note: expanded from macro '__printk_index_emit'
                                   .level = __builtin_constant_p(_level) ? (_level) : NULL, \
                                            ^
   block/bio-integrity.c:433:3: note: Loop condition is false.  Exiting loop
                   pr_err("Interval number is wrong, intervals=%d, bi->tuple_size=%d, pi_iov->iov_len=%u",
                   ^
   include/linux/printk.h:489:2: note: expanded from macro 'pr_err'
           printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
           ^
   include/linux/printk.h:446:26: note: expanded from macro 'printk'
   #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)

vim +492 block/bio-integrity.c

7ba1ba12eeef0a fs/bio-integrity.c    Martin K. Petersen 2008-06-30  394  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  395  #define __MAX_ONSTACK_PI_PAGES (8)
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  396  /**
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  397   * bio_integrity_add_pi_iovec - Add PI io vector
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  398   * @bio:	bio whose integrity vector to update
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  399   * @pi_iov:	iovec added to @bio's integrity
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  400   *
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  401   * Description: Pins pages for *pi_iov and appends them to @bio's integrity.
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  402   */
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  403  int bio_integrity_add_pi_iovec(struct bio *bio, struct iovec *pi_iov)
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  404  {
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  405  	struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  406  	struct bio_integrity_payload *bip;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  407  	struct page *pi_pages[__MAX_ONSTACK_PI_PAGES];
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  408  	struct page **pi_page = pi_pages;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  409  	struct iov_iter pi_iter;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  410  	int nr_vec_page = 0;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  411  	int ret = 0, intervals = 0;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  412  	bool is_write = op_is_write(bio_op(bio));
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  413  	ssize_t size, pg_num;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  414  	size_t offset;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  415  	size_t len;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  416  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  417  	if (unlikely(!bi)) {
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  418  		pr_err("The disk is not integrity capable");
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  419  		return -EINVAL;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  420  	}
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  421  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  422  	nr_vec_page = (pi_iov->iov_len + PAGE_SIZE - 1) >> PAGE_SHIFT;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  423  	nr_vec_page += 1; // we need this die to data of size N pages can be pinned to N+1 page
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  424  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  425  	if (unlikely(nr_vec_page > __MAX_ONSTACK_PI_PAGES)) {
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  426  		pi_page = kcalloc(nr_vec_page, sizeof(struct pi_page *), GFP_NOIO);
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  427  		if (!pi_page)
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  428  			return -ENOMEM;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  429  	}
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  430  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  431  	intervals = bio_integrity_intervals(bi, bio_sectors(bio));
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  432  	if (unlikely(intervals * bi->tuple_size < pi_iov->iov_len)) {
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  433  		pr_err("Interval number is wrong, intervals=%d, bi->tuple_size=%d, pi_iov->iov_len=%u",
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  434  			(int)intervals, (int)bi->tuple_size,
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  435  			(unsigned int)pi_iov->iov_len);
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  436  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  437  		ret = -EINVAL;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  438  		goto exit;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  439  	}
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  440  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  441  	bip = bio_integrity_alloc(bio, GFP_NOIO, nr_vec_page);
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  442  	if (IS_ERR(bip)) {
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  443  		ret = PTR_ERR(bip);
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  444  		goto exit;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  445  	}
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  446  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  447  	bip->bip_iter.bi_size = pi_iov->iov_len;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  448  	bip->bio_iter = bio->bi_iter;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  449  	bip_set_seed(bip, bio->bi_iter.bi_sector);
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  450  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  451  	if (bi->flags & BLK_INTEGRITY_IP_CHECKSUM)
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  452  		bip->bip_flags |= BIP_IP_CHECKSUM;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  453  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  454  	iov_iter_init(&pi_iter, is_write ?  WRITE : READ, pi_iov, 1, pi_iov->iov_len);
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  455  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  456  	// pin user data to pages
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  457  	size = iov_iter_get_pages(&pi_iter, pi_page, LONG_MAX, nr_vec_page, &offset);
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  458  	if (unlikely(size < 0)) {
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  459  		pr_err("Failed to pin PI buffer to page");
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  460  		ret = -EFAULT;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  461  		goto exit;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  462  	}
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  463  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  464  	// calc count of pined pages
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  465  	if (size > (PAGE_SIZE-offset)) {
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  466  		size = DIV_ROUND_UP(size - (PAGE_SIZE-offset), PAGE_SIZE)+1;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  467  	} else
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  468  		size = 1;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  469  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  470  	// fill bio integrity biovecs the given pages
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  471  	len = pi_iov->iov_len;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  472  	for (pg_num = 0; pg_num < size; ++pg_num) {
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  473  		size_t sz;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  474  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  475  		offset = (pg_num)?0:offset;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  476  		sz = PAGE_SIZE-offset;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  477  		if (sz > len)
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  478  			sz = len;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  479  		ret = bio_integrity_add_page(bio, pi_page[pg_num], sz, offset);
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  480  		if (unlikely(ret != sz)) {
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  481  			ret = -ENOMEM;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  482  			goto exit;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  483  		}
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  484  		len -= sz;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  485  		bip->bip_flags |= BIP_RELEASE_PAGES;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  486  	}
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  487  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  488  	ret = 0;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  489  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  490  exit:
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  491  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28 @492  	if (ret && bip->bip_flags & BIP_RELEASE_PAGES)
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  493  		bio_integrity_payload_release_pages(bip);
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  494  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  495  	if (pi_page != pi_pages)
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  496  		kfree(pi_page);
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  497  
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  498  	return ret;
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  499  }
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  500  EXPORT_SYMBOL(bio_integrity_add_pi_iovec);
582fcf396dced9 block/bio-integrity.c Alexander V. Buev  2021-10-28  501  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 36091 bytes --]

^ permalink raw reply	[flat|nested] 29+ messages in thread

end of thread, other threads:[~2021-10-30 10:29 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-10-28 11:24 [PATCH 0/3] implement direct IO with integrity Alexander V. Buev
2021-10-28 11:24 ` [PATCH 1/3] block: bio-integrity: add PI iovec to bio Alexander V. Buev
2021-10-28 15:16   ` Christoph Hellwig
2021-10-29  0:11   ` Chaitanya Kulkarni
2021-10-29  4:27   ` Martin K. Petersen
2021-10-29 10:59     ` Alexander V. Buev
2021-10-29  8:40   ` kernel test robot
2021-10-29  8:40     ` kernel test robot
2021-10-29  8:53   ` kernel test robot
2021-10-29  8:53     ` kernel test robot
2021-10-29  9:48   ` kernel test robot
2021-10-29  9:48     ` kernel test robot
2021-10-28 11:24 ` [PATCH 2/3] block: io_uring: add IO_WITH_PI flag to SQE Alexander V. Buev
2021-10-28 11:24 ` [PATCH 3/3] block: fops: handle IOCB_USE_PI in direct IO Alexander V. Buev
2021-10-28 15:17   ` Christoph Hellwig
2021-10-29  9:04   ` kernel test robot
2021-10-29  9:04     ` kernel test robot
2021-10-28 15:13 ` [PATCH 0/3] implement direct IO with integrity Jens Axboe
2021-10-28 15:18   ` Christoph Hellwig
2021-10-28 15:20     ` Jens Axboe
2021-10-28 15:44       ` Mikhail Malygin
2021-10-28 15:50         ` Jens Axboe
2021-10-28 15:56           ` Pavel Begunkov
2021-10-28 16:22             ` Jens Axboe
2021-10-28 17:11               ` Pavel Begunkov
2021-10-28 17:45                 ` Jens Axboe
2021-10-29  3:39       ` Martin K. Petersen
2021-10-28 15:25   ` Jens Axboe
  -- strict thread matches above, loose matches on Subject: below --
2021-10-30 10:29 [PATCH 1/3] block: bio-integrity: add PI iovec to bio kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.