lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <202204011224.U5aqrW6q-lkp@intel.com>
Date:   Fri, 1 Apr 2022 12:36:47 +0800
From:   kernel test robot <lkp@...el.com>
To:     Logan Gunthorpe <logang@...tatee.com>
Cc:     kbuild-all@...ts.01.org, linux-kernel@...r.kernel.org
Subject: [sbates130272-p2pmem:raid5_fixups 3/6]
 drivers/md/raid5-ppl.c:895:30: sparse: sparse: incorrect type in assignment
 (different address spaces)

tree:   https://github.com/sbates130272/linux-p2pmem.git raid5_fixups
head:   37cb73889e93d24459385229b6925da10648225d
commit: 93ecde7add0ce4b4464e98700e39da53458c2d46 [3/6] md/raid5: Add __rcu annotation to struct disk_info
config: i386-randconfig-s002 (https://download.01.org/0day-ci/archive/20220401/202204011224.U5aqrW6q-lkp@intel.com/config)
compiler: gcc-11 (Debian 11.2.0-19) 11.2.0
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.4-dirty
        # https://github.com/sbates130272/linux-p2pmem/commit/93ecde7add0ce4b4464e98700e39da53458c2d46
        git remote add sbates130272-p2pmem https://github.com/sbates130272/linux-p2pmem.git
        git fetch --no-tags sbates130272-p2pmem raid5_fixups
        git checkout 93ecde7add0ce4b4464e98700e39da53458c2d46
        # save the config file to linux build tree
        mkdir build_dir
        make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=i386 SHELL=/bin/bash drivers/md/

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


sparse warnings: (new ones prefixed by >>)
   drivers/md/raid5-ppl.c: note: in included file:
   drivers/md/raid5.h:271:14: sparse: sparse: array of flexible structures
>> drivers/md/raid5-ppl.c:895:30: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct md_rdev *rdev @@     got struct md_rdev [noderef] __rcu *rdev @@
   drivers/md/raid5-ppl.c:895:30: sparse:     expected struct md_rdev *rdev
   drivers/md/raid5-ppl.c:895:30: sparse:     got struct md_rdev [noderef] __rcu *rdev
>> drivers/md/raid5-ppl.c:946:29: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct md_rdev *parity_rdev @@     got struct md_rdev [noderef] __rcu *rdev @@
   drivers/md/raid5-ppl.c:946:29: sparse:     expected struct md_rdev *parity_rdev
   drivers/md/raid5-ppl.c:946:29: sparse:     got struct md_rdev [noderef] __rcu *rdev
>> drivers/md/raid5-ppl.c:1417:54: sparse: sparse: incorrect type in initializer (different address spaces) @@     expected struct md_rdev *rdev @@     got struct md_rdev [noderef] __rcu *rdev @@
   drivers/md/raid5-ppl.c:1417:54: sparse:     expected struct md_rdev *rdev
   drivers/md/raid5-ppl.c:1417:54: sparse:     got struct md_rdev [noderef] __rcu *rdev

vim +895 drivers/md/raid5-ppl.c

4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  728  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  729  /*
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  730   * PPL recovery strategy: xor partial parity and data from all modified data
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  731   * disks within a stripe and write the result as the new stripe parity. If all
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  732   * stripe data disks are modified (full stripe write), no partial parity is
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  733   * available, so just xor the data disks.
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  734   *
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  735   * Recovery of a PPL entry shall occur only if all modified data disks are
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  736   * available and read from all of them succeeds.
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  737   *
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  738   * A PPL entry applies to a stripe, partial parity size for an entry is at most
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  739   * the size of the chunk. Examples of possible cases for a single entry:
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  740   *
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  741   * case 0: single data disk write:
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  742   *   data0    data1    data2     ppl        parity
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  743   * +--------+--------+--------+           +--------------------+
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  744   * | ------ | ------ | ------ | +----+    | (no change)        |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  745   * | ------ | -data- | ------ | | pp | -> | data1 ^ pp         |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  746   * | ------ | -data- | ------ | | pp | -> | data1 ^ pp         |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  747   * | ------ | ------ | ------ | +----+    | (no change)        |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  748   * +--------+--------+--------+           +--------------------+
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  749   * pp_size = data_size
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  750   *
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  751   * case 1: more than one data disk write:
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  752   *   data0    data1    data2     ppl        parity
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  753   * +--------+--------+--------+           +--------------------+
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  754   * | ------ | ------ | ------ | +----+    | (no change)        |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  755   * | -data- | -data- | ------ | | pp | -> | data0 ^ data1 ^ pp |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  756   * | -data- | -data- | ------ | | pp | -> | data0 ^ data1 ^ pp |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  757   * | ------ | ------ | ------ | +----+    | (no change)        |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  758   * +--------+--------+--------+           +--------------------+
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  759   * pp_size = data_size / modified_data_disks
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  760   *
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  761   * case 2: write to all data disks (also full stripe write):
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  762   *   data0    data1    data2                parity
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  763   * +--------+--------+--------+           +--------------------+
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  764   * | ------ | ------ | ------ |           | (no change)        |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  765   * | -data- | -data- | -data- | --------> | xor all data       |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  766   * | ------ | ------ | ------ | --------> | (no change)        |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  767   * | ------ | ------ | ------ |           | (no change)        |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  768   * +--------+--------+--------+           +--------------------+
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  769   * pp_size = 0
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  770   *
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  771   * The following cases are possible only in other implementations. The recovery
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  772   * code can handle them, but they are not generated at runtime because they can
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  773   * be reduced to cases 0, 1 and 2:
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  774   *
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  775   * case 3:
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  776   *   data0    data1    data2     ppl        parity
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  777   * +--------+--------+--------+ +----+    +--------------------+
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  778   * | ------ | -data- | -data- | | pp |    | data1 ^ data2 ^ pp |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  779   * | ------ | -data- | -data- | | pp | -> | data1 ^ data2 ^ pp |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  780   * | -data- | -data- | -data- | | -- | -> | xor all data       |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  781   * | -data- | -data- | ------ | | pp |    | data0 ^ data1 ^ pp |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  782   * +--------+--------+--------+ +----+    +--------------------+
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  783   * pp_size = chunk_size
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  784   *
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  785   * case 4:
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  786   *   data0    data1    data2     ppl        parity
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  787   * +--------+--------+--------+ +----+    +--------------------+
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  788   * | ------ | -data- | ------ | | pp |    | data1 ^ pp         |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  789   * | ------ | ------ | ------ | | -- | -> | (no change)        |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  790   * | ------ | ------ | ------ | | -- | -> | (no change)        |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  791   * | -data- | ------ | ------ | | pp |    | data0 ^ pp         |
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  792   * +--------+--------+--------+ +----+    +--------------------+
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  793   * pp_size = chunk_size
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  794   */
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  795  static int ppl_recover_entry(struct ppl_log *log, struct ppl_header_entry *e,
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  796  			     sector_t ppl_sector)
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  797  {
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  798  	struct ppl_conf *ppl_conf = log->ppl_conf;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  799  	struct mddev *mddev = ppl_conf->mddev;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  800  	struct r5conf *conf = mddev->private;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  801  	int block_size = ppl_conf->block_size;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  802  	struct page *page1;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  803  	struct page *page2;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  804  	sector_t r_sector_first;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  805  	sector_t r_sector_last;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  806  	int strip_sectors;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  807  	int data_disks;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  808  	int i;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  809  	int ret = 0;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  810  	char b[BDEVNAME_SIZE];
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  811  	unsigned int pp_size = le32_to_cpu(e->pp_size);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  812  	unsigned int data_size = le32_to_cpu(e->data_size);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  813  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  814  	page1 = alloc_page(GFP_KERNEL);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  815  	page2 = alloc_page(GFP_KERNEL);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  816  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  817  	if (!page1 || !page2) {
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  818  		ret = -ENOMEM;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  819  		goto out;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  820  	}
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  821  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  822  	r_sector_first = le64_to_cpu(e->data_sector) * (block_size >> 9);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  823  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  824  	if ((pp_size >> 9) < conf->chunk_sectors) {
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  825  		if (pp_size > 0) {
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  826  			data_disks = data_size / pp_size;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  827  			strip_sectors = pp_size >> 9;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  828  		} else {
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  829  			data_disks = conf->raid_disks - conf->max_degraded;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  830  			strip_sectors = (data_size >> 9) / data_disks;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  831  		}
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  832  		r_sector_last = r_sector_first +
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  833  				(data_disks - 1) * conf->chunk_sectors +
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  834  				strip_sectors;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  835  	} else {
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  836  		data_disks = conf->raid_disks - conf->max_degraded;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  837  		strip_sectors = conf->chunk_sectors;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  838  		r_sector_last = r_sector_first + (data_size >> 9);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  839  	}
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  840  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  841  	pr_debug("%s: array sector first: %llu last: %llu\n", __func__,
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  842  		 (unsigned long long)r_sector_first,
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  843  		 (unsigned long long)r_sector_last);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  844  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  845  	/* if start and end is 4k aligned, use a 4k block */
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  846  	if (block_size == 512 &&
c911c46c017c74 Yufen Yu          2020-07-18  847  	    (r_sector_first & (RAID5_STRIPE_SECTORS(conf) - 1)) == 0 &&
c911c46c017c74 Yufen Yu          2020-07-18  848  	    (r_sector_last & (RAID5_STRIPE_SECTORS(conf) - 1)) == 0)
c911c46c017c74 Yufen Yu          2020-07-18  849  		block_size = RAID5_STRIPE_SIZE(conf);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  850  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  851  	/* iterate through blocks in strip */
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  852  	for (i = 0; i < strip_sectors; i += (block_size >> 9)) {
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  853  		bool update_parity = false;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  854  		sector_t parity_sector;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  855  		struct md_rdev *parity_rdev;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  856  		struct stripe_head sh;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  857  		int disk;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  858  		int indent = 0;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  859  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  860  		pr_debug("%s:%*s iter %d start\n", __func__, indent, "", i);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  861  		indent += 2;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  862  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  863  		memset(page_address(page1), 0, PAGE_SIZE);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  864  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  865  		/* iterate through data member disks */
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  866  		for (disk = 0; disk < data_disks; disk++) {
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  867  			int dd_idx;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  868  			struct md_rdev *rdev;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  869  			sector_t sector;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  870  			sector_t r_sector = r_sector_first + i +
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  871  					    (disk * conf->chunk_sectors);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  872  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  873  			pr_debug("%s:%*s data member disk %d start\n",
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  874  				 __func__, indent, "", disk);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  875  			indent += 2;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  876  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  877  			if (r_sector >= r_sector_last) {
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  878  				pr_debug("%s:%*s array sector %llu doesn't need parity update\n",
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  879  					 __func__, indent, "",
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  880  					 (unsigned long long)r_sector);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  881  				indent -= 2;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  882  				continue;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  883  			}
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  884  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  885  			update_parity = true;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  886  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  887  			/* map raid sector to member disk */
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  888  			sector = raid5_compute_sector(conf, r_sector, 0,
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  889  						      &dd_idx, NULL);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  890  			pr_debug("%s:%*s processing array sector %llu => data member disk %d, sector %llu\n",
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  891  				 __func__, indent, "",
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  892  				 (unsigned long long)r_sector, dd_idx,
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  893  				 (unsigned long long)sector);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  894  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09 @895  			rdev = conf->disks[dd_idx].rdev;
07719ff767dcd8 Artur Paszkiewicz 2017-09-29  896  			if (!rdev || (!test_bit(In_sync, &rdev->flags) &&
07719ff767dcd8 Artur Paszkiewicz 2017-09-29  897  				      sector >= rdev->recovery_offset)) {
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  898  				pr_debug("%s:%*s data member disk %d missing\n",
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  899  					 __func__, indent, "", dd_idx);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  900  				update_parity = false;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  901  				break;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  902  			}
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  903  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  904  			pr_debug("%s:%*s reading data member disk %s sector %llu\n",
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  905  				 __func__, indent, "", bdevname(rdev->bdev, b),
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  906  				 (unsigned long long)sector);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  907  			if (!sync_page_io(rdev, sector, block_size, page2,
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  908  					REQ_OP_READ, 0, false)) {
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  909  				md_error(mddev, rdev);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  910  				pr_debug("%s:%*s read failed!\n", __func__,
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  911  					 indent, "");
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  912  				ret = -EIO;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  913  				goto out;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  914  			}
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  915  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  916  			ppl_xor(block_size, page1, page2);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  917  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  918  			indent -= 2;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  919  		}
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  920  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  921  		if (!update_parity)
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  922  			continue;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  923  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  924  		if (pp_size > 0) {
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  925  			pr_debug("%s:%*s reading pp disk sector %llu\n",
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  926  				 __func__, indent, "",
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  927  				 (unsigned long long)(ppl_sector + i));
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  928  			if (!sync_page_io(log->rdev,
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  929  					ppl_sector - log->rdev->data_offset + i,
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  930  					block_size, page2, REQ_OP_READ, 0,
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  931  					false)) {
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  932  				pr_debug("%s:%*s read failed!\n", __func__,
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  933  					 indent, "");
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  934  				md_error(mddev, log->rdev);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  935  				ret = -EIO;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  936  				goto out;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  937  			}
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  938  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  939  			ppl_xor(block_size, page1, page2);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  940  		}
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  941  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  942  		/* map raid sector to parity disk */
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  943  		parity_sector = raid5_compute_sector(conf, r_sector_first + i,
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  944  				0, &disk, &sh);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  945  		BUG_ON(sh.pd_idx != le32_to_cpu(e->parity_disk));
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09 @946  		parity_rdev = conf->disks[sh.pd_idx].rdev;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  947  
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  948  		BUG_ON(parity_rdev->bdev->bd_dev != log->rdev->bdev->bd_dev);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  949  		pr_debug("%s:%*s write parity at sector %llu, disk %s\n",
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  950  			 __func__, indent, "",
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  951  			 (unsigned long long)parity_sector,
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  952  			 bdevname(parity_rdev->bdev, b));
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  953  		if (!sync_page_io(parity_rdev, parity_sector, block_size,
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  954  				page1, REQ_OP_WRITE, 0, false)) {
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  955  			pr_debug("%s:%*s parity write error!\n", __func__,
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  956  				 indent, "");
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  957  			md_error(mddev, parity_rdev);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  958  			ret = -EIO;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  959  			goto out;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  960  		}
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  961  	}
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  962  out:
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  963  	if (page1)
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  964  		__free_page(page1);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  965  	if (page2)
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  966  		__free_page(page2);
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  967  	return ret;
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  968  }
4536bf9ba2d034 Artur Paszkiewicz 2017-03-09  969  

:::::: The code at line 895 was first introduced by commit
:::::: 4536bf9ba2d03404655586b07f8830b6f2106242 raid5-ppl: load and recover the log

:::::: TO: Artur Paszkiewicz <artur.paszkiewicz@...el.com>
:::::: CC: Shaohua Li <shli@...com>

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

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ