All of lore.kernel.org
 help / color / mirror / Atom feed
* drivers/md/raid10.c:1707:39: warning: Uninitialized variable: first_r10bio [uninitvar]
@ 2021-05-26 15:08 kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2021-05-26 15:08 UTC (permalink / raw)
  To: kbuild

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

CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Xiao Ni <xni@redhat.com>
CC: Song Liu <songliubraving@fb.com>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   ad9f25d338605d26acedcaf3ba5fab5ca26f1c10
commit: 254c271da0712ea8914f187588e0f81f7678ee2f md/raid10: improve discard request for far layout
date:   9 weeks ago
:::::: branch date: 22 hours ago
:::::: commit date: 9 weeks ago
compiler: nios2-linux-gcc (GCC) 9.3.0

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


cppcheck possible warnings: (new ones prefixed by >>, may not real problems)

   In file included from drivers/md/raid10.c:
>> drivers/md/raid10.c:1707:39: warning: Uninitialized variable: first_r10bio [uninitvar]
     r10_bio->master_bio = (struct bio *)first_r10bio;
                                         ^

vim +1707 drivers/md/raid10.c

d30588b2731fb0 Xiao Ni 2021-02-04  1573  
d30588b2731fb0 Xiao Ni 2021-02-04  1574  /*
d30588b2731fb0 Xiao Ni 2021-02-04  1575   * There are some limitations to handle discard bio
d30588b2731fb0 Xiao Ni 2021-02-04  1576   * 1st, the discard size is bigger than stripe_size*2.
d30588b2731fb0 Xiao Ni 2021-02-04  1577   * 2st, if the discard bio spans reshape progress, we use the old way to
d30588b2731fb0 Xiao Ni 2021-02-04  1578   * handle discard bio
d30588b2731fb0 Xiao Ni 2021-02-04  1579   */
d30588b2731fb0 Xiao Ni 2021-02-04  1580  static int raid10_handle_discard(struct mddev *mddev, struct bio *bio)
d30588b2731fb0 Xiao Ni 2021-02-04  1581  {
d30588b2731fb0 Xiao Ni 2021-02-04  1582  	struct r10conf *conf = mddev->private;
d30588b2731fb0 Xiao Ni 2021-02-04  1583  	struct geom *geo = &conf->geo;
254c271da0712e Xiao Ni 2021-02-04  1584  	int far_copies = geo->far_copies;
254c271da0712e Xiao Ni 2021-02-04  1585  	bool first_copy = true;
254c271da0712e Xiao Ni 2021-02-04  1586  	struct r10bio *r10_bio, *first_r10bio;
d30588b2731fb0 Xiao Ni 2021-02-04  1587  	struct bio *split;
d30588b2731fb0 Xiao Ni 2021-02-04  1588  	int disk;
d30588b2731fb0 Xiao Ni 2021-02-04  1589  	sector_t chunk;
d30588b2731fb0 Xiao Ni 2021-02-04  1590  	unsigned int stripe_size;
d30588b2731fb0 Xiao Ni 2021-02-04  1591  	unsigned int stripe_data_disks;
d30588b2731fb0 Xiao Ni 2021-02-04  1592  	sector_t split_size;
d30588b2731fb0 Xiao Ni 2021-02-04  1593  	sector_t bio_start, bio_end;
d30588b2731fb0 Xiao Ni 2021-02-04  1594  	sector_t first_stripe_index, last_stripe_index;
d30588b2731fb0 Xiao Ni 2021-02-04  1595  	sector_t start_disk_offset;
d30588b2731fb0 Xiao Ni 2021-02-04  1596  	unsigned int start_disk_index;
d30588b2731fb0 Xiao Ni 2021-02-04  1597  	sector_t end_disk_offset;
d30588b2731fb0 Xiao Ni 2021-02-04  1598  	unsigned int end_disk_index;
d30588b2731fb0 Xiao Ni 2021-02-04  1599  	unsigned int remainder;
d30588b2731fb0 Xiao Ni 2021-02-04  1600  
d30588b2731fb0 Xiao Ni 2021-02-04  1601  	if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
d30588b2731fb0 Xiao Ni 2021-02-04  1602  		return -EAGAIN;
d30588b2731fb0 Xiao Ni 2021-02-04  1603  
d30588b2731fb0 Xiao Ni 2021-02-04  1604  	wait_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1605  
d30588b2731fb0 Xiao Ni 2021-02-04  1606  	/*
d30588b2731fb0 Xiao Ni 2021-02-04  1607  	 * Check reshape again to avoid reshape happens after checking
d30588b2731fb0 Xiao Ni 2021-02-04  1608  	 * MD_RECOVERY_RESHAPE and before wait_barrier
d30588b2731fb0 Xiao Ni 2021-02-04  1609  	 */
d30588b2731fb0 Xiao Ni 2021-02-04  1610  	if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
d30588b2731fb0 Xiao Ni 2021-02-04  1611  		goto out;
d30588b2731fb0 Xiao Ni 2021-02-04  1612  
d30588b2731fb0 Xiao Ni 2021-02-04  1613  	if (geo->near_copies)
d30588b2731fb0 Xiao Ni 2021-02-04  1614  		stripe_data_disks = geo->raid_disks / geo->near_copies +
d30588b2731fb0 Xiao Ni 2021-02-04  1615  					geo->raid_disks % geo->near_copies;
d30588b2731fb0 Xiao Ni 2021-02-04  1616  	else
d30588b2731fb0 Xiao Ni 2021-02-04  1617  		stripe_data_disks = geo->raid_disks;
d30588b2731fb0 Xiao Ni 2021-02-04  1618  
d30588b2731fb0 Xiao Ni 2021-02-04  1619  	stripe_size = stripe_data_disks << geo->chunk_shift;
d30588b2731fb0 Xiao Ni 2021-02-04  1620  
d30588b2731fb0 Xiao Ni 2021-02-04  1621  	bio_start = bio->bi_iter.bi_sector;
d30588b2731fb0 Xiao Ni 2021-02-04  1622  	bio_end = bio_end_sector(bio);
d30588b2731fb0 Xiao Ni 2021-02-04  1623  
d30588b2731fb0 Xiao Ni 2021-02-04  1624  	/*
d30588b2731fb0 Xiao Ni 2021-02-04  1625  	 * Maybe one discard bio is smaller than strip size or across one
d30588b2731fb0 Xiao Ni 2021-02-04  1626  	 * stripe and discard region is larger than one stripe size. For far
d30588b2731fb0 Xiao Ni 2021-02-04  1627  	 * offset layout, if the discard region is not aligned with stripe
d30588b2731fb0 Xiao Ni 2021-02-04  1628  	 * size, there is hole when we submit discard bio to member disk.
d30588b2731fb0 Xiao Ni 2021-02-04  1629  	 * For simplicity, we only handle discard bio which discard region
d30588b2731fb0 Xiao Ni 2021-02-04  1630  	 * is bigger than stripe_size * 2
d30588b2731fb0 Xiao Ni 2021-02-04  1631  	 */
d30588b2731fb0 Xiao Ni 2021-02-04  1632  	if (bio_sectors(bio) < stripe_size*2)
d30588b2731fb0 Xiao Ni 2021-02-04  1633  		goto out;
d30588b2731fb0 Xiao Ni 2021-02-04  1634  
d30588b2731fb0 Xiao Ni 2021-02-04  1635  	/*
d30588b2731fb0 Xiao Ni 2021-02-04  1636  	 * Keep bio aligned with strip size.
d30588b2731fb0 Xiao Ni 2021-02-04  1637  	 */
d30588b2731fb0 Xiao Ni 2021-02-04  1638  	div_u64_rem(bio_start, stripe_size, &remainder);
d30588b2731fb0 Xiao Ni 2021-02-04  1639  	if (remainder) {
d30588b2731fb0 Xiao Ni 2021-02-04  1640  		split_size = stripe_size - remainder;
d30588b2731fb0 Xiao Ni 2021-02-04  1641  		split = bio_split(bio, split_size, GFP_NOIO, &conf->bio_split);
d30588b2731fb0 Xiao Ni 2021-02-04  1642  		bio_chain(split, bio);
d30588b2731fb0 Xiao Ni 2021-02-04  1643  		allow_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1644  		/* Resend the fist split part */
d30588b2731fb0 Xiao Ni 2021-02-04  1645  		submit_bio_noacct(split);
d30588b2731fb0 Xiao Ni 2021-02-04  1646  		wait_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1647  	}
d30588b2731fb0 Xiao Ni 2021-02-04  1648  	div_u64_rem(bio_end, stripe_size, &remainder);
d30588b2731fb0 Xiao Ni 2021-02-04  1649  	if (remainder) {
d30588b2731fb0 Xiao Ni 2021-02-04  1650  		split_size = bio_sectors(bio) - remainder;
d30588b2731fb0 Xiao Ni 2021-02-04  1651  		split = bio_split(bio, split_size, GFP_NOIO, &conf->bio_split);
d30588b2731fb0 Xiao Ni 2021-02-04  1652  		bio_chain(split, bio);
d30588b2731fb0 Xiao Ni 2021-02-04  1653  		allow_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1654  		/* Resend the second split part */
d30588b2731fb0 Xiao Ni 2021-02-04  1655  		submit_bio_noacct(bio);
d30588b2731fb0 Xiao Ni 2021-02-04  1656  		bio = split;
d30588b2731fb0 Xiao Ni 2021-02-04  1657  		wait_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1658  	}
d30588b2731fb0 Xiao Ni 2021-02-04  1659  
d30588b2731fb0 Xiao Ni 2021-02-04  1660  	bio_start = bio->bi_iter.bi_sector;
d30588b2731fb0 Xiao Ni 2021-02-04  1661  	bio_end = bio_end_sector(bio);
d30588b2731fb0 Xiao Ni 2021-02-04  1662  
d30588b2731fb0 Xiao Ni 2021-02-04  1663  	/*
d30588b2731fb0 Xiao Ni 2021-02-04  1664  	 * Raid10 uses chunk as the unit to store data. It's similar like raid0.
d30588b2731fb0 Xiao Ni 2021-02-04  1665  	 * One stripe contains the chunks from all member disk (one chunk from
d30588b2731fb0 Xiao Ni 2021-02-04  1666  	 * one disk at the same HBA address). For layout detail, see 'man md 4'
d30588b2731fb0 Xiao Ni 2021-02-04  1667  	 */
d30588b2731fb0 Xiao Ni 2021-02-04  1668  	chunk = bio_start >> geo->chunk_shift;
d30588b2731fb0 Xiao Ni 2021-02-04  1669  	chunk *= geo->near_copies;
d30588b2731fb0 Xiao Ni 2021-02-04  1670  	first_stripe_index = chunk;
d30588b2731fb0 Xiao Ni 2021-02-04  1671  	start_disk_index = sector_div(first_stripe_index, geo->raid_disks);
d30588b2731fb0 Xiao Ni 2021-02-04  1672  	if (geo->far_offset)
d30588b2731fb0 Xiao Ni 2021-02-04  1673  		first_stripe_index *= geo->far_copies;
d30588b2731fb0 Xiao Ni 2021-02-04  1674  	start_disk_offset = (bio_start & geo->chunk_mask) +
d30588b2731fb0 Xiao Ni 2021-02-04  1675  				(first_stripe_index << geo->chunk_shift);
d30588b2731fb0 Xiao Ni 2021-02-04  1676  
d30588b2731fb0 Xiao Ni 2021-02-04  1677  	chunk = bio_end >> geo->chunk_shift;
d30588b2731fb0 Xiao Ni 2021-02-04  1678  	chunk *= geo->near_copies;
d30588b2731fb0 Xiao Ni 2021-02-04  1679  	last_stripe_index = chunk;
d30588b2731fb0 Xiao Ni 2021-02-04  1680  	end_disk_index = sector_div(last_stripe_index, geo->raid_disks);
d30588b2731fb0 Xiao Ni 2021-02-04  1681  	if (geo->far_offset)
d30588b2731fb0 Xiao Ni 2021-02-04  1682  		last_stripe_index *= geo->far_copies;
d30588b2731fb0 Xiao Ni 2021-02-04  1683  	end_disk_offset = (bio_end & geo->chunk_mask) +
d30588b2731fb0 Xiao Ni 2021-02-04  1684  				(last_stripe_index << geo->chunk_shift);
d30588b2731fb0 Xiao Ni 2021-02-04  1685  
254c271da0712e Xiao Ni 2021-02-04  1686  retry_discard:
254c271da0712e Xiao Ni 2021-02-04  1687  	r10_bio = mempool_alloc(&conf->r10bio_pool, GFP_NOIO);
254c271da0712e Xiao Ni 2021-02-04  1688  	r10_bio->mddev = mddev;
254c271da0712e Xiao Ni 2021-02-04  1689  	r10_bio->state = 0;
254c271da0712e Xiao Ni 2021-02-04  1690  	r10_bio->sectors = 0;
254c271da0712e Xiao Ni 2021-02-04  1691  	memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * geo->raid_disks);
254c271da0712e Xiao Ni 2021-02-04  1692  	wait_blocked_dev(mddev, r10_bio);
254c271da0712e Xiao Ni 2021-02-04  1693  
254c271da0712e Xiao Ni 2021-02-04  1694  	/*
254c271da0712e Xiao Ni 2021-02-04  1695  	 * For far layout it needs more than one r10bio to cover all regions.
254c271da0712e Xiao Ni 2021-02-04  1696  	 * Inspired by raid10_sync_request, we can use the first r10bio->master_bio
254c271da0712e Xiao Ni 2021-02-04  1697  	 * to record the discard bio. Other r10bio->master_bio record the first
254c271da0712e Xiao Ni 2021-02-04  1698  	 * r10bio. The first r10bio only release after all other r10bios finish.
254c271da0712e Xiao Ni 2021-02-04  1699  	 * The discard bio returns only first r10bio finishes
254c271da0712e Xiao Ni 2021-02-04  1700  	 */
254c271da0712e Xiao Ni 2021-02-04  1701  	if (first_copy) {
254c271da0712e Xiao Ni 2021-02-04  1702  		r10_bio->master_bio = bio;
254c271da0712e Xiao Ni 2021-02-04  1703  		set_bit(R10BIO_Discard, &r10_bio->state);
254c271da0712e Xiao Ni 2021-02-04  1704  		first_copy = false;
254c271da0712e Xiao Ni 2021-02-04  1705  		first_r10bio = r10_bio;
254c271da0712e Xiao Ni 2021-02-04  1706  	} else
254c271da0712e Xiao Ni 2021-02-04 @1707  		r10_bio->master_bio = (struct bio *)first_r10bio;
254c271da0712e Xiao Ni 2021-02-04  1708  
d30588b2731fb0 Xiao Ni 2021-02-04  1709  	rcu_read_lock();
d30588b2731fb0 Xiao Ni 2021-02-04  1710  	for (disk = 0; disk < geo->raid_disks; disk++) {
d30588b2731fb0 Xiao Ni 2021-02-04  1711  		struct md_rdev *rdev = rcu_dereference(conf->mirrors[disk].rdev);
d30588b2731fb0 Xiao Ni 2021-02-04  1712  		struct md_rdev *rrdev = rcu_dereference(
d30588b2731fb0 Xiao Ni 2021-02-04  1713  			conf->mirrors[disk].replacement);
d30588b2731fb0 Xiao Ni 2021-02-04  1714  
d30588b2731fb0 Xiao Ni 2021-02-04  1715  		r10_bio->devs[disk].bio = NULL;
d30588b2731fb0 Xiao Ni 2021-02-04  1716  		r10_bio->devs[disk].repl_bio = NULL;
d30588b2731fb0 Xiao Ni 2021-02-04  1717  
d30588b2731fb0 Xiao Ni 2021-02-04  1718  		if (rdev && (test_bit(Faulty, &rdev->flags)))
d30588b2731fb0 Xiao Ni 2021-02-04  1719  			rdev = NULL;
d30588b2731fb0 Xiao Ni 2021-02-04  1720  		if (rrdev && (test_bit(Faulty, &rrdev->flags)))
d30588b2731fb0 Xiao Ni 2021-02-04  1721  			rrdev = NULL;
d30588b2731fb0 Xiao Ni 2021-02-04  1722  		if (!rdev && !rrdev)
d30588b2731fb0 Xiao Ni 2021-02-04  1723  			continue;
d30588b2731fb0 Xiao Ni 2021-02-04  1724  
d30588b2731fb0 Xiao Ni 2021-02-04  1725  		if (rdev) {
d30588b2731fb0 Xiao Ni 2021-02-04  1726  			r10_bio->devs[disk].bio = bio;
d30588b2731fb0 Xiao Ni 2021-02-04  1727  			atomic_inc(&rdev->nr_pending);
d30588b2731fb0 Xiao Ni 2021-02-04  1728  		}
d30588b2731fb0 Xiao Ni 2021-02-04  1729  		if (rrdev) {
d30588b2731fb0 Xiao Ni 2021-02-04  1730  			r10_bio->devs[disk].repl_bio = bio;
d30588b2731fb0 Xiao Ni 2021-02-04  1731  			atomic_inc(&rrdev->nr_pending);
d30588b2731fb0 Xiao Ni 2021-02-04  1732  		}
d30588b2731fb0 Xiao Ni 2021-02-04  1733  	}
d30588b2731fb0 Xiao Ni 2021-02-04  1734  	rcu_read_unlock();
d30588b2731fb0 Xiao Ni 2021-02-04  1735  
d30588b2731fb0 Xiao Ni 2021-02-04  1736  	atomic_set(&r10_bio->remaining, 1);
d30588b2731fb0 Xiao Ni 2021-02-04  1737  	for (disk = 0; disk < geo->raid_disks; disk++) {
d30588b2731fb0 Xiao Ni 2021-02-04  1738  		sector_t dev_start, dev_end;
d30588b2731fb0 Xiao Ni 2021-02-04  1739  		struct bio *mbio, *rbio = NULL;
d30588b2731fb0 Xiao Ni 2021-02-04  1740  		struct md_rdev *rdev = rcu_dereference(conf->mirrors[disk].rdev);
d30588b2731fb0 Xiao Ni 2021-02-04  1741  		struct md_rdev *rrdev = rcu_dereference(
d30588b2731fb0 Xiao Ni 2021-02-04  1742  			conf->mirrors[disk].replacement);
d30588b2731fb0 Xiao Ni 2021-02-04  1743  
d30588b2731fb0 Xiao Ni 2021-02-04  1744  		/*
d30588b2731fb0 Xiao Ni 2021-02-04  1745  		 * Now start to calculate the start and end address for each disk.
d30588b2731fb0 Xiao Ni 2021-02-04  1746  		 * The space between dev_start and dev_end is the discard region.
d30588b2731fb0 Xiao Ni 2021-02-04  1747  		 *
d30588b2731fb0 Xiao Ni 2021-02-04  1748  		 * For dev_start, it needs to consider three conditions:
d30588b2731fb0 Xiao Ni 2021-02-04  1749  		 * 1st, the disk is before start_disk, you can imagine the disk in
d30588b2731fb0 Xiao Ni 2021-02-04  1750  		 * the next stripe. So the dev_start is the start address of next
d30588b2731fb0 Xiao Ni 2021-02-04  1751  		 * stripe.
d30588b2731fb0 Xiao Ni 2021-02-04  1752  		 * 2st, the disk is after start_disk, it means the disk is at the
d30588b2731fb0 Xiao Ni 2021-02-04  1753  		 * same stripe of first disk
d30588b2731fb0 Xiao Ni 2021-02-04  1754  		 * 3st, the first disk itself, we can use start_disk_offset directly
d30588b2731fb0 Xiao Ni 2021-02-04  1755  		 */
d30588b2731fb0 Xiao Ni 2021-02-04  1756  		if (disk < start_disk_index)
d30588b2731fb0 Xiao Ni 2021-02-04  1757  			dev_start = (first_stripe_index + 1) * mddev->chunk_sectors;
d30588b2731fb0 Xiao Ni 2021-02-04  1758  		else if (disk > start_disk_index)
d30588b2731fb0 Xiao Ni 2021-02-04  1759  			dev_start = first_stripe_index * mddev->chunk_sectors;
d30588b2731fb0 Xiao Ni 2021-02-04  1760  		else
d30588b2731fb0 Xiao Ni 2021-02-04  1761  			dev_start = start_disk_offset;
d30588b2731fb0 Xiao Ni 2021-02-04  1762  
d30588b2731fb0 Xiao Ni 2021-02-04  1763  		if (disk < end_disk_index)
d30588b2731fb0 Xiao Ni 2021-02-04  1764  			dev_end = (last_stripe_index + 1) * mddev->chunk_sectors;
d30588b2731fb0 Xiao Ni 2021-02-04  1765  		else if (disk > end_disk_index)
d30588b2731fb0 Xiao Ni 2021-02-04  1766  			dev_end = last_stripe_index * mddev->chunk_sectors;
d30588b2731fb0 Xiao Ni 2021-02-04  1767  		else
d30588b2731fb0 Xiao Ni 2021-02-04  1768  			dev_end = end_disk_offset;
d30588b2731fb0 Xiao Ni 2021-02-04  1769  
d30588b2731fb0 Xiao Ni 2021-02-04  1770  		/*
d30588b2731fb0 Xiao Ni 2021-02-04  1771  		 * It only handles discard bio which size is >= stripe size, so
d30588b2731fb0 Xiao Ni 2021-02-04  1772  		 * dev_end > dev_start all the time
d30588b2731fb0 Xiao Ni 2021-02-04  1773  		 */
d30588b2731fb0 Xiao Ni 2021-02-04  1774  		if (r10_bio->devs[disk].bio) {
d30588b2731fb0 Xiao Ni 2021-02-04  1775  			mbio = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set);
d30588b2731fb0 Xiao Ni 2021-02-04  1776  			mbio->bi_end_io = raid10_end_discard_request;
d30588b2731fb0 Xiao Ni 2021-02-04  1777  			mbio->bi_private = r10_bio;
d30588b2731fb0 Xiao Ni 2021-02-04  1778  			r10_bio->devs[disk].bio = mbio;
d30588b2731fb0 Xiao Ni 2021-02-04  1779  			r10_bio->devs[disk].devnum = disk;
d30588b2731fb0 Xiao Ni 2021-02-04  1780  			atomic_inc(&r10_bio->remaining);
d30588b2731fb0 Xiao Ni 2021-02-04  1781  			md_submit_discard_bio(mddev, rdev, mbio,
d30588b2731fb0 Xiao Ni 2021-02-04  1782  					dev_start + choose_data_offset(r10_bio, rdev),
d30588b2731fb0 Xiao Ni 2021-02-04  1783  					dev_end - dev_start);
d30588b2731fb0 Xiao Ni 2021-02-04  1784  			bio_endio(mbio);
d30588b2731fb0 Xiao Ni 2021-02-04  1785  		}
d30588b2731fb0 Xiao Ni 2021-02-04  1786  		if (r10_bio->devs[disk].repl_bio) {
d30588b2731fb0 Xiao Ni 2021-02-04  1787  			rbio = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set);
d30588b2731fb0 Xiao Ni 2021-02-04  1788  			rbio->bi_end_io = raid10_end_discard_request;
d30588b2731fb0 Xiao Ni 2021-02-04  1789  			rbio->bi_private = r10_bio;
d30588b2731fb0 Xiao Ni 2021-02-04  1790  			r10_bio->devs[disk].repl_bio = rbio;
d30588b2731fb0 Xiao Ni 2021-02-04  1791  			r10_bio->devs[disk].devnum = disk;
d30588b2731fb0 Xiao Ni 2021-02-04  1792  			atomic_inc(&r10_bio->remaining);
d30588b2731fb0 Xiao Ni 2021-02-04  1793  			md_submit_discard_bio(mddev, rrdev, rbio,
d30588b2731fb0 Xiao Ni 2021-02-04  1794  					dev_start + choose_data_offset(r10_bio, rrdev),
d30588b2731fb0 Xiao Ni 2021-02-04  1795  					dev_end - dev_start);
d30588b2731fb0 Xiao Ni 2021-02-04  1796  			bio_endio(rbio);
d30588b2731fb0 Xiao Ni 2021-02-04  1797  		}
d30588b2731fb0 Xiao Ni 2021-02-04  1798  	}
d30588b2731fb0 Xiao Ni 2021-02-04  1799  
254c271da0712e Xiao Ni 2021-02-04  1800  	if (!geo->far_offset && --far_copies) {
254c271da0712e Xiao Ni 2021-02-04  1801  		first_stripe_index += geo->stride >> geo->chunk_shift;
254c271da0712e Xiao Ni 2021-02-04  1802  		start_disk_offset += geo->stride;
254c271da0712e Xiao Ni 2021-02-04  1803  		last_stripe_index += geo->stride >> geo->chunk_shift;
254c271da0712e Xiao Ni 2021-02-04  1804  		end_disk_offset += geo->stride;
254c271da0712e Xiao Ni 2021-02-04  1805  		atomic_inc(&first_r10bio->remaining);
254c271da0712e Xiao Ni 2021-02-04  1806  		raid_end_discard_bio(r10_bio);
254c271da0712e Xiao Ni 2021-02-04  1807  		wait_barrier(conf);
254c271da0712e Xiao Ni 2021-02-04  1808  		goto retry_discard;
d30588b2731fb0 Xiao Ni 2021-02-04  1809  	}
d30588b2731fb0 Xiao Ni 2021-02-04  1810  
254c271da0712e Xiao Ni 2021-02-04  1811  	raid_end_discard_bio(r10_bio);
254c271da0712e Xiao Ni 2021-02-04  1812  
d30588b2731fb0 Xiao Ni 2021-02-04  1813  	return 0;
d30588b2731fb0 Xiao Ni 2021-02-04  1814  out:
d30588b2731fb0 Xiao Ni 2021-02-04  1815  	allow_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1816  	return -EAGAIN;
d30588b2731fb0 Xiao Ni 2021-02-04  1817  }
d30588b2731fb0 Xiao Ni 2021-02-04  1818  

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

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

* drivers/md/raid10.c:1707:39: warning: Uninitialized variable: first_r10bio [uninitvar]
@ 2021-12-26  7:57 kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2021-12-26  7:57 UTC (permalink / raw)
  To: kbuild

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

CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Xiao Ni <xni@redhat.com>
CC: Song Liu <songliubraving@fb.com>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   438645193e59e91761ccb3fa55f6ce70b615ff93
commit: 254c271da0712ea8914f187588e0f81f7678ee2f md/raid10: improve discard request for far layout
date:   9 months ago
:::::: branch date: 3 hours ago
:::::: commit date: 9 months ago
compiler: powerpc64-linux-gcc (GCC) 11.2.0

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


cppcheck possible warnings: (new ones prefixed by >>, may not real problems)

   In file included from drivers/md/raid10.c:
>> drivers/md/raid10.c:1707:39: warning: Uninitialized variable: first_r10bio [uninitvar]
     r10_bio->master_bio = (struct bio *)first_r10bio;
                                         ^

vim +1707 drivers/md/raid10.c

d30588b2731fb0 Xiao Ni 2021-02-04  1573  
d30588b2731fb0 Xiao Ni 2021-02-04  1574  /*
d30588b2731fb0 Xiao Ni 2021-02-04  1575   * There are some limitations to handle discard bio
d30588b2731fb0 Xiao Ni 2021-02-04  1576   * 1st, the discard size is bigger than stripe_size*2.
d30588b2731fb0 Xiao Ni 2021-02-04  1577   * 2st, if the discard bio spans reshape progress, we use the old way to
d30588b2731fb0 Xiao Ni 2021-02-04  1578   * handle discard bio
d30588b2731fb0 Xiao Ni 2021-02-04  1579   */
d30588b2731fb0 Xiao Ni 2021-02-04  1580  static int raid10_handle_discard(struct mddev *mddev, struct bio *bio)
d30588b2731fb0 Xiao Ni 2021-02-04  1581  {
d30588b2731fb0 Xiao Ni 2021-02-04  1582  	struct r10conf *conf = mddev->private;
d30588b2731fb0 Xiao Ni 2021-02-04  1583  	struct geom *geo = &conf->geo;
254c271da0712e Xiao Ni 2021-02-04  1584  	int far_copies = geo->far_copies;
254c271da0712e Xiao Ni 2021-02-04  1585  	bool first_copy = true;
254c271da0712e Xiao Ni 2021-02-04  1586  	struct r10bio *r10_bio, *first_r10bio;
d30588b2731fb0 Xiao Ni 2021-02-04  1587  	struct bio *split;
d30588b2731fb0 Xiao Ni 2021-02-04  1588  	int disk;
d30588b2731fb0 Xiao Ni 2021-02-04  1589  	sector_t chunk;
d30588b2731fb0 Xiao Ni 2021-02-04  1590  	unsigned int stripe_size;
d30588b2731fb0 Xiao Ni 2021-02-04  1591  	unsigned int stripe_data_disks;
d30588b2731fb0 Xiao Ni 2021-02-04  1592  	sector_t split_size;
d30588b2731fb0 Xiao Ni 2021-02-04  1593  	sector_t bio_start, bio_end;
d30588b2731fb0 Xiao Ni 2021-02-04  1594  	sector_t first_stripe_index, last_stripe_index;
d30588b2731fb0 Xiao Ni 2021-02-04  1595  	sector_t start_disk_offset;
d30588b2731fb0 Xiao Ni 2021-02-04  1596  	unsigned int start_disk_index;
d30588b2731fb0 Xiao Ni 2021-02-04  1597  	sector_t end_disk_offset;
d30588b2731fb0 Xiao Ni 2021-02-04  1598  	unsigned int end_disk_index;
d30588b2731fb0 Xiao Ni 2021-02-04  1599  	unsigned int remainder;
d30588b2731fb0 Xiao Ni 2021-02-04  1600  
d30588b2731fb0 Xiao Ni 2021-02-04  1601  	if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
d30588b2731fb0 Xiao Ni 2021-02-04  1602  		return -EAGAIN;
d30588b2731fb0 Xiao Ni 2021-02-04  1603  
d30588b2731fb0 Xiao Ni 2021-02-04  1604  	wait_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1605  
d30588b2731fb0 Xiao Ni 2021-02-04  1606  	/*
d30588b2731fb0 Xiao Ni 2021-02-04  1607  	 * Check reshape again to avoid reshape happens after checking
d30588b2731fb0 Xiao Ni 2021-02-04  1608  	 * MD_RECOVERY_RESHAPE and before wait_barrier
d30588b2731fb0 Xiao Ni 2021-02-04  1609  	 */
d30588b2731fb0 Xiao Ni 2021-02-04  1610  	if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
d30588b2731fb0 Xiao Ni 2021-02-04  1611  		goto out;
d30588b2731fb0 Xiao Ni 2021-02-04  1612  
d30588b2731fb0 Xiao Ni 2021-02-04  1613  	if (geo->near_copies)
d30588b2731fb0 Xiao Ni 2021-02-04  1614  		stripe_data_disks = geo->raid_disks / geo->near_copies +
d30588b2731fb0 Xiao Ni 2021-02-04  1615  					geo->raid_disks % geo->near_copies;
d30588b2731fb0 Xiao Ni 2021-02-04  1616  	else
d30588b2731fb0 Xiao Ni 2021-02-04  1617  		stripe_data_disks = geo->raid_disks;
d30588b2731fb0 Xiao Ni 2021-02-04  1618  
d30588b2731fb0 Xiao Ni 2021-02-04  1619  	stripe_size = stripe_data_disks << geo->chunk_shift;
d30588b2731fb0 Xiao Ni 2021-02-04  1620  
d30588b2731fb0 Xiao Ni 2021-02-04  1621  	bio_start = bio->bi_iter.bi_sector;
d30588b2731fb0 Xiao Ni 2021-02-04  1622  	bio_end = bio_end_sector(bio);
d30588b2731fb0 Xiao Ni 2021-02-04  1623  
d30588b2731fb0 Xiao Ni 2021-02-04  1624  	/*
d30588b2731fb0 Xiao Ni 2021-02-04  1625  	 * Maybe one discard bio is smaller than strip size or across one
d30588b2731fb0 Xiao Ni 2021-02-04  1626  	 * stripe and discard region is larger than one stripe size. For far
d30588b2731fb0 Xiao Ni 2021-02-04  1627  	 * offset layout, if the discard region is not aligned with stripe
d30588b2731fb0 Xiao Ni 2021-02-04  1628  	 * size, there is hole when we submit discard bio to member disk.
d30588b2731fb0 Xiao Ni 2021-02-04  1629  	 * For simplicity, we only handle discard bio which discard region
d30588b2731fb0 Xiao Ni 2021-02-04  1630  	 * is bigger than stripe_size * 2
d30588b2731fb0 Xiao Ni 2021-02-04  1631  	 */
d30588b2731fb0 Xiao Ni 2021-02-04  1632  	if (bio_sectors(bio) < stripe_size*2)
d30588b2731fb0 Xiao Ni 2021-02-04  1633  		goto out;
d30588b2731fb0 Xiao Ni 2021-02-04  1634  
d30588b2731fb0 Xiao Ni 2021-02-04  1635  	/*
d30588b2731fb0 Xiao Ni 2021-02-04  1636  	 * Keep bio aligned with strip size.
d30588b2731fb0 Xiao Ni 2021-02-04  1637  	 */
d30588b2731fb0 Xiao Ni 2021-02-04  1638  	div_u64_rem(bio_start, stripe_size, &remainder);
d30588b2731fb0 Xiao Ni 2021-02-04  1639  	if (remainder) {
d30588b2731fb0 Xiao Ni 2021-02-04  1640  		split_size = stripe_size - remainder;
d30588b2731fb0 Xiao Ni 2021-02-04  1641  		split = bio_split(bio, split_size, GFP_NOIO, &conf->bio_split);
d30588b2731fb0 Xiao Ni 2021-02-04  1642  		bio_chain(split, bio);
d30588b2731fb0 Xiao Ni 2021-02-04  1643  		allow_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1644  		/* Resend the fist split part */
d30588b2731fb0 Xiao Ni 2021-02-04  1645  		submit_bio_noacct(split);
d30588b2731fb0 Xiao Ni 2021-02-04  1646  		wait_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1647  	}
d30588b2731fb0 Xiao Ni 2021-02-04  1648  	div_u64_rem(bio_end, stripe_size, &remainder);
d30588b2731fb0 Xiao Ni 2021-02-04  1649  	if (remainder) {
d30588b2731fb0 Xiao Ni 2021-02-04  1650  		split_size = bio_sectors(bio) - remainder;
d30588b2731fb0 Xiao Ni 2021-02-04  1651  		split = bio_split(bio, split_size, GFP_NOIO, &conf->bio_split);
d30588b2731fb0 Xiao Ni 2021-02-04  1652  		bio_chain(split, bio);
d30588b2731fb0 Xiao Ni 2021-02-04  1653  		allow_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1654  		/* Resend the second split part */
d30588b2731fb0 Xiao Ni 2021-02-04  1655  		submit_bio_noacct(bio);
d30588b2731fb0 Xiao Ni 2021-02-04  1656  		bio = split;
d30588b2731fb0 Xiao Ni 2021-02-04  1657  		wait_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1658  	}
d30588b2731fb0 Xiao Ni 2021-02-04  1659  
d30588b2731fb0 Xiao Ni 2021-02-04  1660  	bio_start = bio->bi_iter.bi_sector;
d30588b2731fb0 Xiao Ni 2021-02-04  1661  	bio_end = bio_end_sector(bio);
d30588b2731fb0 Xiao Ni 2021-02-04  1662  
d30588b2731fb0 Xiao Ni 2021-02-04  1663  	/*
d30588b2731fb0 Xiao Ni 2021-02-04  1664  	 * Raid10 uses chunk as the unit to store data. It's similar like raid0.
d30588b2731fb0 Xiao Ni 2021-02-04  1665  	 * One stripe contains the chunks from all member disk (one chunk from
d30588b2731fb0 Xiao Ni 2021-02-04  1666  	 * one disk at the same HBA address). For layout detail, see 'man md 4'
d30588b2731fb0 Xiao Ni 2021-02-04  1667  	 */
d30588b2731fb0 Xiao Ni 2021-02-04  1668  	chunk = bio_start >> geo->chunk_shift;
d30588b2731fb0 Xiao Ni 2021-02-04  1669  	chunk *= geo->near_copies;
d30588b2731fb0 Xiao Ni 2021-02-04  1670  	first_stripe_index = chunk;
d30588b2731fb0 Xiao Ni 2021-02-04  1671  	start_disk_index = sector_div(first_stripe_index, geo->raid_disks);
d30588b2731fb0 Xiao Ni 2021-02-04  1672  	if (geo->far_offset)
d30588b2731fb0 Xiao Ni 2021-02-04  1673  		first_stripe_index *= geo->far_copies;
d30588b2731fb0 Xiao Ni 2021-02-04  1674  	start_disk_offset = (bio_start & geo->chunk_mask) +
d30588b2731fb0 Xiao Ni 2021-02-04  1675  				(first_stripe_index << geo->chunk_shift);
d30588b2731fb0 Xiao Ni 2021-02-04  1676  
d30588b2731fb0 Xiao Ni 2021-02-04  1677  	chunk = bio_end >> geo->chunk_shift;
d30588b2731fb0 Xiao Ni 2021-02-04  1678  	chunk *= geo->near_copies;
d30588b2731fb0 Xiao Ni 2021-02-04  1679  	last_stripe_index = chunk;
d30588b2731fb0 Xiao Ni 2021-02-04  1680  	end_disk_index = sector_div(last_stripe_index, geo->raid_disks);
d30588b2731fb0 Xiao Ni 2021-02-04  1681  	if (geo->far_offset)
d30588b2731fb0 Xiao Ni 2021-02-04  1682  		last_stripe_index *= geo->far_copies;
d30588b2731fb0 Xiao Ni 2021-02-04  1683  	end_disk_offset = (bio_end & geo->chunk_mask) +
d30588b2731fb0 Xiao Ni 2021-02-04  1684  				(last_stripe_index << geo->chunk_shift);
d30588b2731fb0 Xiao Ni 2021-02-04  1685  
254c271da0712e Xiao Ni 2021-02-04  1686  retry_discard:
254c271da0712e Xiao Ni 2021-02-04  1687  	r10_bio = mempool_alloc(&conf->r10bio_pool, GFP_NOIO);
254c271da0712e Xiao Ni 2021-02-04  1688  	r10_bio->mddev = mddev;
254c271da0712e Xiao Ni 2021-02-04  1689  	r10_bio->state = 0;
254c271da0712e Xiao Ni 2021-02-04  1690  	r10_bio->sectors = 0;
254c271da0712e Xiao Ni 2021-02-04  1691  	memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * geo->raid_disks);
254c271da0712e Xiao Ni 2021-02-04  1692  	wait_blocked_dev(mddev, r10_bio);
254c271da0712e Xiao Ni 2021-02-04  1693  
254c271da0712e Xiao Ni 2021-02-04  1694  	/*
254c271da0712e Xiao Ni 2021-02-04  1695  	 * For far layout it needs more than one r10bio to cover all regions.
254c271da0712e Xiao Ni 2021-02-04  1696  	 * Inspired by raid10_sync_request, we can use the first r10bio->master_bio
254c271da0712e Xiao Ni 2021-02-04  1697  	 * to record the discard bio. Other r10bio->master_bio record the first
254c271da0712e Xiao Ni 2021-02-04  1698  	 * r10bio. The first r10bio only release after all other r10bios finish.
254c271da0712e Xiao Ni 2021-02-04  1699  	 * The discard bio returns only first r10bio finishes
254c271da0712e Xiao Ni 2021-02-04  1700  	 */
254c271da0712e Xiao Ni 2021-02-04  1701  	if (first_copy) {
254c271da0712e Xiao Ni 2021-02-04  1702  		r10_bio->master_bio = bio;
254c271da0712e Xiao Ni 2021-02-04  1703  		set_bit(R10BIO_Discard, &r10_bio->state);
254c271da0712e Xiao Ni 2021-02-04  1704  		first_copy = false;
254c271da0712e Xiao Ni 2021-02-04  1705  		first_r10bio = r10_bio;
254c271da0712e Xiao Ni 2021-02-04  1706  	} else
254c271da0712e Xiao Ni 2021-02-04 @1707  		r10_bio->master_bio = (struct bio *)first_r10bio;
254c271da0712e Xiao Ni 2021-02-04  1708  
d30588b2731fb0 Xiao Ni 2021-02-04  1709  	rcu_read_lock();
d30588b2731fb0 Xiao Ni 2021-02-04  1710  	for (disk = 0; disk < geo->raid_disks; disk++) {
d30588b2731fb0 Xiao Ni 2021-02-04  1711  		struct md_rdev *rdev = rcu_dereference(conf->mirrors[disk].rdev);
d30588b2731fb0 Xiao Ni 2021-02-04  1712  		struct md_rdev *rrdev = rcu_dereference(
d30588b2731fb0 Xiao Ni 2021-02-04  1713  			conf->mirrors[disk].replacement);
d30588b2731fb0 Xiao Ni 2021-02-04  1714  
d30588b2731fb0 Xiao Ni 2021-02-04  1715  		r10_bio->devs[disk].bio = NULL;
d30588b2731fb0 Xiao Ni 2021-02-04  1716  		r10_bio->devs[disk].repl_bio = NULL;
d30588b2731fb0 Xiao Ni 2021-02-04  1717  
d30588b2731fb0 Xiao Ni 2021-02-04  1718  		if (rdev && (test_bit(Faulty, &rdev->flags)))
d30588b2731fb0 Xiao Ni 2021-02-04  1719  			rdev = NULL;
d30588b2731fb0 Xiao Ni 2021-02-04  1720  		if (rrdev && (test_bit(Faulty, &rrdev->flags)))
d30588b2731fb0 Xiao Ni 2021-02-04  1721  			rrdev = NULL;
d30588b2731fb0 Xiao Ni 2021-02-04  1722  		if (!rdev && !rrdev)
d30588b2731fb0 Xiao Ni 2021-02-04  1723  			continue;
d30588b2731fb0 Xiao Ni 2021-02-04  1724  
d30588b2731fb0 Xiao Ni 2021-02-04  1725  		if (rdev) {
d30588b2731fb0 Xiao Ni 2021-02-04  1726  			r10_bio->devs[disk].bio = bio;
d30588b2731fb0 Xiao Ni 2021-02-04  1727  			atomic_inc(&rdev->nr_pending);
d30588b2731fb0 Xiao Ni 2021-02-04  1728  		}
d30588b2731fb0 Xiao Ni 2021-02-04  1729  		if (rrdev) {
d30588b2731fb0 Xiao Ni 2021-02-04  1730  			r10_bio->devs[disk].repl_bio = bio;
d30588b2731fb0 Xiao Ni 2021-02-04  1731  			atomic_inc(&rrdev->nr_pending);
d30588b2731fb0 Xiao Ni 2021-02-04  1732  		}
d30588b2731fb0 Xiao Ni 2021-02-04  1733  	}
d30588b2731fb0 Xiao Ni 2021-02-04  1734  	rcu_read_unlock();
d30588b2731fb0 Xiao Ni 2021-02-04  1735  
d30588b2731fb0 Xiao Ni 2021-02-04  1736  	atomic_set(&r10_bio->remaining, 1);
d30588b2731fb0 Xiao Ni 2021-02-04  1737  	for (disk = 0; disk < geo->raid_disks; disk++) {
d30588b2731fb0 Xiao Ni 2021-02-04  1738  		sector_t dev_start, dev_end;
d30588b2731fb0 Xiao Ni 2021-02-04  1739  		struct bio *mbio, *rbio = NULL;
d30588b2731fb0 Xiao Ni 2021-02-04  1740  		struct md_rdev *rdev = rcu_dereference(conf->mirrors[disk].rdev);
d30588b2731fb0 Xiao Ni 2021-02-04  1741  		struct md_rdev *rrdev = rcu_dereference(
d30588b2731fb0 Xiao Ni 2021-02-04  1742  			conf->mirrors[disk].replacement);
d30588b2731fb0 Xiao Ni 2021-02-04  1743  
d30588b2731fb0 Xiao Ni 2021-02-04  1744  		/*
d30588b2731fb0 Xiao Ni 2021-02-04  1745  		 * Now start to calculate the start and end address for each disk.
d30588b2731fb0 Xiao Ni 2021-02-04  1746  		 * The space between dev_start and dev_end is the discard region.
d30588b2731fb0 Xiao Ni 2021-02-04  1747  		 *
d30588b2731fb0 Xiao Ni 2021-02-04  1748  		 * For dev_start, it needs to consider three conditions:
d30588b2731fb0 Xiao Ni 2021-02-04  1749  		 * 1st, the disk is before start_disk, you can imagine the disk in
d30588b2731fb0 Xiao Ni 2021-02-04  1750  		 * the next stripe. So the dev_start is the start address of next
d30588b2731fb0 Xiao Ni 2021-02-04  1751  		 * stripe.
d30588b2731fb0 Xiao Ni 2021-02-04  1752  		 * 2st, the disk is after start_disk, it means the disk is at the
d30588b2731fb0 Xiao Ni 2021-02-04  1753  		 * same stripe of first disk
d30588b2731fb0 Xiao Ni 2021-02-04  1754  		 * 3st, the first disk itself, we can use start_disk_offset directly
d30588b2731fb0 Xiao Ni 2021-02-04  1755  		 */
d30588b2731fb0 Xiao Ni 2021-02-04  1756  		if (disk < start_disk_index)
d30588b2731fb0 Xiao Ni 2021-02-04  1757  			dev_start = (first_stripe_index + 1) * mddev->chunk_sectors;
d30588b2731fb0 Xiao Ni 2021-02-04  1758  		else if (disk > start_disk_index)
d30588b2731fb0 Xiao Ni 2021-02-04  1759  			dev_start = first_stripe_index * mddev->chunk_sectors;
d30588b2731fb0 Xiao Ni 2021-02-04  1760  		else
d30588b2731fb0 Xiao Ni 2021-02-04  1761  			dev_start = start_disk_offset;
d30588b2731fb0 Xiao Ni 2021-02-04  1762  
d30588b2731fb0 Xiao Ni 2021-02-04  1763  		if (disk < end_disk_index)
d30588b2731fb0 Xiao Ni 2021-02-04  1764  			dev_end = (last_stripe_index + 1) * mddev->chunk_sectors;
d30588b2731fb0 Xiao Ni 2021-02-04  1765  		else if (disk > end_disk_index)
d30588b2731fb0 Xiao Ni 2021-02-04  1766  			dev_end = last_stripe_index * mddev->chunk_sectors;
d30588b2731fb0 Xiao Ni 2021-02-04  1767  		else
d30588b2731fb0 Xiao Ni 2021-02-04  1768  			dev_end = end_disk_offset;
d30588b2731fb0 Xiao Ni 2021-02-04  1769  
d30588b2731fb0 Xiao Ni 2021-02-04  1770  		/*
d30588b2731fb0 Xiao Ni 2021-02-04  1771  		 * It only handles discard bio which size is >= stripe size, so
d30588b2731fb0 Xiao Ni 2021-02-04  1772  		 * dev_end > dev_start all the time
d30588b2731fb0 Xiao Ni 2021-02-04  1773  		 */
d30588b2731fb0 Xiao Ni 2021-02-04  1774  		if (r10_bio->devs[disk].bio) {
d30588b2731fb0 Xiao Ni 2021-02-04  1775  			mbio = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set);
d30588b2731fb0 Xiao Ni 2021-02-04  1776  			mbio->bi_end_io = raid10_end_discard_request;
d30588b2731fb0 Xiao Ni 2021-02-04  1777  			mbio->bi_private = r10_bio;
d30588b2731fb0 Xiao Ni 2021-02-04  1778  			r10_bio->devs[disk].bio = mbio;
d30588b2731fb0 Xiao Ni 2021-02-04  1779  			r10_bio->devs[disk].devnum = disk;
d30588b2731fb0 Xiao Ni 2021-02-04  1780  			atomic_inc(&r10_bio->remaining);
d30588b2731fb0 Xiao Ni 2021-02-04  1781  			md_submit_discard_bio(mddev, rdev, mbio,
d30588b2731fb0 Xiao Ni 2021-02-04  1782  					dev_start + choose_data_offset(r10_bio, rdev),
d30588b2731fb0 Xiao Ni 2021-02-04  1783  					dev_end - dev_start);
d30588b2731fb0 Xiao Ni 2021-02-04  1784  			bio_endio(mbio);
d30588b2731fb0 Xiao Ni 2021-02-04  1785  		}
d30588b2731fb0 Xiao Ni 2021-02-04  1786  		if (r10_bio->devs[disk].repl_bio) {
d30588b2731fb0 Xiao Ni 2021-02-04  1787  			rbio = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set);
d30588b2731fb0 Xiao Ni 2021-02-04  1788  			rbio->bi_end_io = raid10_end_discard_request;
d30588b2731fb0 Xiao Ni 2021-02-04  1789  			rbio->bi_private = r10_bio;
d30588b2731fb0 Xiao Ni 2021-02-04  1790  			r10_bio->devs[disk].repl_bio = rbio;
d30588b2731fb0 Xiao Ni 2021-02-04  1791  			r10_bio->devs[disk].devnum = disk;
d30588b2731fb0 Xiao Ni 2021-02-04  1792  			atomic_inc(&r10_bio->remaining);
d30588b2731fb0 Xiao Ni 2021-02-04  1793  			md_submit_discard_bio(mddev, rrdev, rbio,
d30588b2731fb0 Xiao Ni 2021-02-04  1794  					dev_start + choose_data_offset(r10_bio, rrdev),
d30588b2731fb0 Xiao Ni 2021-02-04  1795  					dev_end - dev_start);
d30588b2731fb0 Xiao Ni 2021-02-04  1796  			bio_endio(rbio);
d30588b2731fb0 Xiao Ni 2021-02-04  1797  		}
d30588b2731fb0 Xiao Ni 2021-02-04  1798  	}
d30588b2731fb0 Xiao Ni 2021-02-04  1799  
254c271da0712e Xiao Ni 2021-02-04  1800  	if (!geo->far_offset && --far_copies) {
254c271da0712e Xiao Ni 2021-02-04  1801  		first_stripe_index += geo->stride >> geo->chunk_shift;
254c271da0712e Xiao Ni 2021-02-04  1802  		start_disk_offset += geo->stride;
254c271da0712e Xiao Ni 2021-02-04  1803  		last_stripe_index += geo->stride >> geo->chunk_shift;
254c271da0712e Xiao Ni 2021-02-04  1804  		end_disk_offset += geo->stride;
254c271da0712e Xiao Ni 2021-02-04  1805  		atomic_inc(&first_r10bio->remaining);
254c271da0712e Xiao Ni 2021-02-04  1806  		raid_end_discard_bio(r10_bio);
254c271da0712e Xiao Ni 2021-02-04  1807  		wait_barrier(conf);
254c271da0712e Xiao Ni 2021-02-04  1808  		goto retry_discard;
d30588b2731fb0 Xiao Ni 2021-02-04  1809  	}
d30588b2731fb0 Xiao Ni 2021-02-04  1810  
254c271da0712e Xiao Ni 2021-02-04  1811  	raid_end_discard_bio(r10_bio);
254c271da0712e Xiao Ni 2021-02-04  1812  
d30588b2731fb0 Xiao Ni 2021-02-04  1813  	return 0;
d30588b2731fb0 Xiao Ni 2021-02-04  1814  out:
d30588b2731fb0 Xiao Ni 2021-02-04  1815  	allow_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1816  	return -EAGAIN;
d30588b2731fb0 Xiao Ni 2021-02-04  1817  }
d30588b2731fb0 Xiao Ni 2021-02-04  1818  

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

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

* drivers/md/raid10.c:1707:39: warning: Uninitialized variable: first_r10bio [uninitvar]
@ 2021-07-24  2:49 kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2021-07-24  2:49 UTC (permalink / raw)
  To: kbuild

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

CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Xiao Ni <xni@redhat.com>
CC: Song Liu <songliubraving@fb.com>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   f0fddcec6b6254b4b3611388786bbafb703ad257
commit: 254c271da0712ea8914f187588e0f81f7678ee2f md/raid10: improve discard request for far layout
date:   4 months ago
:::::: branch date: 7 hours ago
:::::: commit date: 4 months ago
compiler: h8300-linux-gcc (GCC) 10.3.0

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


cppcheck possible warnings: (new ones prefixed by >>, may not real problems)

   In file included from drivers/md/raid10.c:
>> drivers/md/raid10.c:1707:39: warning: Uninitialized variable: first_r10bio [uninitvar]
     r10_bio->master_bio = (struct bio *)first_r10bio;
                                         ^

vim +1707 drivers/md/raid10.c

d30588b2731fb0 Xiao Ni 2021-02-04  1573  
d30588b2731fb0 Xiao Ni 2021-02-04  1574  /*
d30588b2731fb0 Xiao Ni 2021-02-04  1575   * There are some limitations to handle discard bio
d30588b2731fb0 Xiao Ni 2021-02-04  1576   * 1st, the discard size is bigger than stripe_size*2.
d30588b2731fb0 Xiao Ni 2021-02-04  1577   * 2st, if the discard bio spans reshape progress, we use the old way to
d30588b2731fb0 Xiao Ni 2021-02-04  1578   * handle discard bio
d30588b2731fb0 Xiao Ni 2021-02-04  1579   */
d30588b2731fb0 Xiao Ni 2021-02-04  1580  static int raid10_handle_discard(struct mddev *mddev, struct bio *bio)
d30588b2731fb0 Xiao Ni 2021-02-04  1581  {
d30588b2731fb0 Xiao Ni 2021-02-04  1582  	struct r10conf *conf = mddev->private;
d30588b2731fb0 Xiao Ni 2021-02-04  1583  	struct geom *geo = &conf->geo;
254c271da0712e Xiao Ni 2021-02-04  1584  	int far_copies = geo->far_copies;
254c271da0712e Xiao Ni 2021-02-04  1585  	bool first_copy = true;
254c271da0712e Xiao Ni 2021-02-04  1586  	struct r10bio *r10_bio, *first_r10bio;
d30588b2731fb0 Xiao Ni 2021-02-04  1587  	struct bio *split;
d30588b2731fb0 Xiao Ni 2021-02-04  1588  	int disk;
d30588b2731fb0 Xiao Ni 2021-02-04  1589  	sector_t chunk;
d30588b2731fb0 Xiao Ni 2021-02-04  1590  	unsigned int stripe_size;
d30588b2731fb0 Xiao Ni 2021-02-04  1591  	unsigned int stripe_data_disks;
d30588b2731fb0 Xiao Ni 2021-02-04  1592  	sector_t split_size;
d30588b2731fb0 Xiao Ni 2021-02-04  1593  	sector_t bio_start, bio_end;
d30588b2731fb0 Xiao Ni 2021-02-04  1594  	sector_t first_stripe_index, last_stripe_index;
d30588b2731fb0 Xiao Ni 2021-02-04  1595  	sector_t start_disk_offset;
d30588b2731fb0 Xiao Ni 2021-02-04  1596  	unsigned int start_disk_index;
d30588b2731fb0 Xiao Ni 2021-02-04  1597  	sector_t end_disk_offset;
d30588b2731fb0 Xiao Ni 2021-02-04  1598  	unsigned int end_disk_index;
d30588b2731fb0 Xiao Ni 2021-02-04  1599  	unsigned int remainder;
d30588b2731fb0 Xiao Ni 2021-02-04  1600  
d30588b2731fb0 Xiao Ni 2021-02-04  1601  	if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
d30588b2731fb0 Xiao Ni 2021-02-04  1602  		return -EAGAIN;
d30588b2731fb0 Xiao Ni 2021-02-04  1603  
d30588b2731fb0 Xiao Ni 2021-02-04  1604  	wait_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1605  
d30588b2731fb0 Xiao Ni 2021-02-04  1606  	/*
d30588b2731fb0 Xiao Ni 2021-02-04  1607  	 * Check reshape again to avoid reshape happens after checking
d30588b2731fb0 Xiao Ni 2021-02-04  1608  	 * MD_RECOVERY_RESHAPE and before wait_barrier
d30588b2731fb0 Xiao Ni 2021-02-04  1609  	 */
d30588b2731fb0 Xiao Ni 2021-02-04  1610  	if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
d30588b2731fb0 Xiao Ni 2021-02-04  1611  		goto out;
d30588b2731fb0 Xiao Ni 2021-02-04  1612  
d30588b2731fb0 Xiao Ni 2021-02-04  1613  	if (geo->near_copies)
d30588b2731fb0 Xiao Ni 2021-02-04  1614  		stripe_data_disks = geo->raid_disks / geo->near_copies +
d30588b2731fb0 Xiao Ni 2021-02-04  1615  					geo->raid_disks % geo->near_copies;
d30588b2731fb0 Xiao Ni 2021-02-04  1616  	else
d30588b2731fb0 Xiao Ni 2021-02-04  1617  		stripe_data_disks = geo->raid_disks;
d30588b2731fb0 Xiao Ni 2021-02-04  1618  
d30588b2731fb0 Xiao Ni 2021-02-04  1619  	stripe_size = stripe_data_disks << geo->chunk_shift;
d30588b2731fb0 Xiao Ni 2021-02-04  1620  
d30588b2731fb0 Xiao Ni 2021-02-04  1621  	bio_start = bio->bi_iter.bi_sector;
d30588b2731fb0 Xiao Ni 2021-02-04  1622  	bio_end = bio_end_sector(bio);
d30588b2731fb0 Xiao Ni 2021-02-04  1623  
d30588b2731fb0 Xiao Ni 2021-02-04  1624  	/*
d30588b2731fb0 Xiao Ni 2021-02-04  1625  	 * Maybe one discard bio is smaller than strip size or across one
d30588b2731fb0 Xiao Ni 2021-02-04  1626  	 * stripe and discard region is larger than one stripe size. For far
d30588b2731fb0 Xiao Ni 2021-02-04  1627  	 * offset layout, if the discard region is not aligned with stripe
d30588b2731fb0 Xiao Ni 2021-02-04  1628  	 * size, there is hole when we submit discard bio to member disk.
d30588b2731fb0 Xiao Ni 2021-02-04  1629  	 * For simplicity, we only handle discard bio which discard region
d30588b2731fb0 Xiao Ni 2021-02-04  1630  	 * is bigger than stripe_size * 2
d30588b2731fb0 Xiao Ni 2021-02-04  1631  	 */
d30588b2731fb0 Xiao Ni 2021-02-04  1632  	if (bio_sectors(bio) < stripe_size*2)
d30588b2731fb0 Xiao Ni 2021-02-04  1633  		goto out;
d30588b2731fb0 Xiao Ni 2021-02-04  1634  
d30588b2731fb0 Xiao Ni 2021-02-04  1635  	/*
d30588b2731fb0 Xiao Ni 2021-02-04  1636  	 * Keep bio aligned with strip size.
d30588b2731fb0 Xiao Ni 2021-02-04  1637  	 */
d30588b2731fb0 Xiao Ni 2021-02-04  1638  	div_u64_rem(bio_start, stripe_size, &remainder);
d30588b2731fb0 Xiao Ni 2021-02-04  1639  	if (remainder) {
d30588b2731fb0 Xiao Ni 2021-02-04  1640  		split_size = stripe_size - remainder;
d30588b2731fb0 Xiao Ni 2021-02-04  1641  		split = bio_split(bio, split_size, GFP_NOIO, &conf->bio_split);
d30588b2731fb0 Xiao Ni 2021-02-04  1642  		bio_chain(split, bio);
d30588b2731fb0 Xiao Ni 2021-02-04  1643  		allow_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1644  		/* Resend the fist split part */
d30588b2731fb0 Xiao Ni 2021-02-04  1645  		submit_bio_noacct(split);
d30588b2731fb0 Xiao Ni 2021-02-04  1646  		wait_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1647  	}
d30588b2731fb0 Xiao Ni 2021-02-04  1648  	div_u64_rem(bio_end, stripe_size, &remainder);
d30588b2731fb0 Xiao Ni 2021-02-04  1649  	if (remainder) {
d30588b2731fb0 Xiao Ni 2021-02-04  1650  		split_size = bio_sectors(bio) - remainder;
d30588b2731fb0 Xiao Ni 2021-02-04  1651  		split = bio_split(bio, split_size, GFP_NOIO, &conf->bio_split);
d30588b2731fb0 Xiao Ni 2021-02-04  1652  		bio_chain(split, bio);
d30588b2731fb0 Xiao Ni 2021-02-04  1653  		allow_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1654  		/* Resend the second split part */
d30588b2731fb0 Xiao Ni 2021-02-04  1655  		submit_bio_noacct(bio);
d30588b2731fb0 Xiao Ni 2021-02-04  1656  		bio = split;
d30588b2731fb0 Xiao Ni 2021-02-04  1657  		wait_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1658  	}
d30588b2731fb0 Xiao Ni 2021-02-04  1659  
d30588b2731fb0 Xiao Ni 2021-02-04  1660  	bio_start = bio->bi_iter.bi_sector;
d30588b2731fb0 Xiao Ni 2021-02-04  1661  	bio_end = bio_end_sector(bio);
d30588b2731fb0 Xiao Ni 2021-02-04  1662  
d30588b2731fb0 Xiao Ni 2021-02-04  1663  	/*
d30588b2731fb0 Xiao Ni 2021-02-04  1664  	 * Raid10 uses chunk as the unit to store data. It's similar like raid0.
d30588b2731fb0 Xiao Ni 2021-02-04  1665  	 * One stripe contains the chunks from all member disk (one chunk from
d30588b2731fb0 Xiao Ni 2021-02-04  1666  	 * one disk at the same HBA address). For layout detail, see 'man md 4'
d30588b2731fb0 Xiao Ni 2021-02-04  1667  	 */
d30588b2731fb0 Xiao Ni 2021-02-04  1668  	chunk = bio_start >> geo->chunk_shift;
d30588b2731fb0 Xiao Ni 2021-02-04  1669  	chunk *= geo->near_copies;
d30588b2731fb0 Xiao Ni 2021-02-04  1670  	first_stripe_index = chunk;
d30588b2731fb0 Xiao Ni 2021-02-04  1671  	start_disk_index = sector_div(first_stripe_index, geo->raid_disks);
d30588b2731fb0 Xiao Ni 2021-02-04  1672  	if (geo->far_offset)
d30588b2731fb0 Xiao Ni 2021-02-04  1673  		first_stripe_index *= geo->far_copies;
d30588b2731fb0 Xiao Ni 2021-02-04  1674  	start_disk_offset = (bio_start & geo->chunk_mask) +
d30588b2731fb0 Xiao Ni 2021-02-04  1675  				(first_stripe_index << geo->chunk_shift);
d30588b2731fb0 Xiao Ni 2021-02-04  1676  
d30588b2731fb0 Xiao Ni 2021-02-04  1677  	chunk = bio_end >> geo->chunk_shift;
d30588b2731fb0 Xiao Ni 2021-02-04  1678  	chunk *= geo->near_copies;
d30588b2731fb0 Xiao Ni 2021-02-04  1679  	last_stripe_index = chunk;
d30588b2731fb0 Xiao Ni 2021-02-04  1680  	end_disk_index = sector_div(last_stripe_index, geo->raid_disks);
d30588b2731fb0 Xiao Ni 2021-02-04  1681  	if (geo->far_offset)
d30588b2731fb0 Xiao Ni 2021-02-04  1682  		last_stripe_index *= geo->far_copies;
d30588b2731fb0 Xiao Ni 2021-02-04  1683  	end_disk_offset = (bio_end & geo->chunk_mask) +
d30588b2731fb0 Xiao Ni 2021-02-04  1684  				(last_stripe_index << geo->chunk_shift);
d30588b2731fb0 Xiao Ni 2021-02-04  1685  
254c271da0712e Xiao Ni 2021-02-04  1686  retry_discard:
254c271da0712e Xiao Ni 2021-02-04  1687  	r10_bio = mempool_alloc(&conf->r10bio_pool, GFP_NOIO);
254c271da0712e Xiao Ni 2021-02-04  1688  	r10_bio->mddev = mddev;
254c271da0712e Xiao Ni 2021-02-04  1689  	r10_bio->state = 0;
254c271da0712e Xiao Ni 2021-02-04  1690  	r10_bio->sectors = 0;
254c271da0712e Xiao Ni 2021-02-04  1691  	memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * geo->raid_disks);
254c271da0712e Xiao Ni 2021-02-04  1692  	wait_blocked_dev(mddev, r10_bio);
254c271da0712e Xiao Ni 2021-02-04  1693  
254c271da0712e Xiao Ni 2021-02-04  1694  	/*
254c271da0712e Xiao Ni 2021-02-04  1695  	 * For far layout it needs more than one r10bio to cover all regions.
254c271da0712e Xiao Ni 2021-02-04  1696  	 * Inspired by raid10_sync_request, we can use the first r10bio->master_bio
254c271da0712e Xiao Ni 2021-02-04  1697  	 * to record the discard bio. Other r10bio->master_bio record the first
254c271da0712e Xiao Ni 2021-02-04  1698  	 * r10bio. The first r10bio only release after all other r10bios finish.
254c271da0712e Xiao Ni 2021-02-04  1699  	 * The discard bio returns only first r10bio finishes
254c271da0712e Xiao Ni 2021-02-04  1700  	 */
254c271da0712e Xiao Ni 2021-02-04  1701  	if (first_copy) {
254c271da0712e Xiao Ni 2021-02-04  1702  		r10_bio->master_bio = bio;
254c271da0712e Xiao Ni 2021-02-04  1703  		set_bit(R10BIO_Discard, &r10_bio->state);
254c271da0712e Xiao Ni 2021-02-04  1704  		first_copy = false;
254c271da0712e Xiao Ni 2021-02-04  1705  		first_r10bio = r10_bio;
254c271da0712e Xiao Ni 2021-02-04  1706  	} else
254c271da0712e Xiao Ni 2021-02-04 @1707  		r10_bio->master_bio = (struct bio *)first_r10bio;
254c271da0712e Xiao Ni 2021-02-04  1708  
d30588b2731fb0 Xiao Ni 2021-02-04  1709  	rcu_read_lock();
d30588b2731fb0 Xiao Ni 2021-02-04  1710  	for (disk = 0; disk < geo->raid_disks; disk++) {
d30588b2731fb0 Xiao Ni 2021-02-04  1711  		struct md_rdev *rdev = rcu_dereference(conf->mirrors[disk].rdev);
d30588b2731fb0 Xiao Ni 2021-02-04  1712  		struct md_rdev *rrdev = rcu_dereference(
d30588b2731fb0 Xiao Ni 2021-02-04  1713  			conf->mirrors[disk].replacement);
d30588b2731fb0 Xiao Ni 2021-02-04  1714  
d30588b2731fb0 Xiao Ni 2021-02-04  1715  		r10_bio->devs[disk].bio = NULL;
d30588b2731fb0 Xiao Ni 2021-02-04  1716  		r10_bio->devs[disk].repl_bio = NULL;
d30588b2731fb0 Xiao Ni 2021-02-04  1717  
d30588b2731fb0 Xiao Ni 2021-02-04  1718  		if (rdev && (test_bit(Faulty, &rdev->flags)))
d30588b2731fb0 Xiao Ni 2021-02-04  1719  			rdev = NULL;
d30588b2731fb0 Xiao Ni 2021-02-04  1720  		if (rrdev && (test_bit(Faulty, &rrdev->flags)))
d30588b2731fb0 Xiao Ni 2021-02-04  1721  			rrdev = NULL;
d30588b2731fb0 Xiao Ni 2021-02-04  1722  		if (!rdev && !rrdev)
d30588b2731fb0 Xiao Ni 2021-02-04  1723  			continue;
d30588b2731fb0 Xiao Ni 2021-02-04  1724  
d30588b2731fb0 Xiao Ni 2021-02-04  1725  		if (rdev) {
d30588b2731fb0 Xiao Ni 2021-02-04  1726  			r10_bio->devs[disk].bio = bio;
d30588b2731fb0 Xiao Ni 2021-02-04  1727  			atomic_inc(&rdev->nr_pending);
d30588b2731fb0 Xiao Ni 2021-02-04  1728  		}
d30588b2731fb0 Xiao Ni 2021-02-04  1729  		if (rrdev) {
d30588b2731fb0 Xiao Ni 2021-02-04  1730  			r10_bio->devs[disk].repl_bio = bio;
d30588b2731fb0 Xiao Ni 2021-02-04  1731  			atomic_inc(&rrdev->nr_pending);
d30588b2731fb0 Xiao Ni 2021-02-04  1732  		}
d30588b2731fb0 Xiao Ni 2021-02-04  1733  	}
d30588b2731fb0 Xiao Ni 2021-02-04  1734  	rcu_read_unlock();
d30588b2731fb0 Xiao Ni 2021-02-04  1735  
d30588b2731fb0 Xiao Ni 2021-02-04  1736  	atomic_set(&r10_bio->remaining, 1);
d30588b2731fb0 Xiao Ni 2021-02-04  1737  	for (disk = 0; disk < geo->raid_disks; disk++) {
d30588b2731fb0 Xiao Ni 2021-02-04  1738  		sector_t dev_start, dev_end;
d30588b2731fb0 Xiao Ni 2021-02-04  1739  		struct bio *mbio, *rbio = NULL;
d30588b2731fb0 Xiao Ni 2021-02-04  1740  		struct md_rdev *rdev = rcu_dereference(conf->mirrors[disk].rdev);
d30588b2731fb0 Xiao Ni 2021-02-04  1741  		struct md_rdev *rrdev = rcu_dereference(
d30588b2731fb0 Xiao Ni 2021-02-04  1742  			conf->mirrors[disk].replacement);
d30588b2731fb0 Xiao Ni 2021-02-04  1743  
d30588b2731fb0 Xiao Ni 2021-02-04  1744  		/*
d30588b2731fb0 Xiao Ni 2021-02-04  1745  		 * Now start to calculate the start and end address for each disk.
d30588b2731fb0 Xiao Ni 2021-02-04  1746  		 * The space between dev_start and dev_end is the discard region.
d30588b2731fb0 Xiao Ni 2021-02-04  1747  		 *
d30588b2731fb0 Xiao Ni 2021-02-04  1748  		 * For dev_start, it needs to consider three conditions:
d30588b2731fb0 Xiao Ni 2021-02-04  1749  		 * 1st, the disk is before start_disk, you can imagine the disk in
d30588b2731fb0 Xiao Ni 2021-02-04  1750  		 * the next stripe. So the dev_start is the start address of next
d30588b2731fb0 Xiao Ni 2021-02-04  1751  		 * stripe.
d30588b2731fb0 Xiao Ni 2021-02-04  1752  		 * 2st, the disk is after start_disk, it means the disk is at the
d30588b2731fb0 Xiao Ni 2021-02-04  1753  		 * same stripe of first disk
d30588b2731fb0 Xiao Ni 2021-02-04  1754  		 * 3st, the first disk itself, we can use start_disk_offset directly
d30588b2731fb0 Xiao Ni 2021-02-04  1755  		 */
d30588b2731fb0 Xiao Ni 2021-02-04  1756  		if (disk < start_disk_index)
d30588b2731fb0 Xiao Ni 2021-02-04  1757  			dev_start = (first_stripe_index + 1) * mddev->chunk_sectors;
d30588b2731fb0 Xiao Ni 2021-02-04  1758  		else if (disk > start_disk_index)
d30588b2731fb0 Xiao Ni 2021-02-04  1759  			dev_start = first_stripe_index * mddev->chunk_sectors;
d30588b2731fb0 Xiao Ni 2021-02-04  1760  		else
d30588b2731fb0 Xiao Ni 2021-02-04  1761  			dev_start = start_disk_offset;
d30588b2731fb0 Xiao Ni 2021-02-04  1762  
d30588b2731fb0 Xiao Ni 2021-02-04  1763  		if (disk < end_disk_index)
d30588b2731fb0 Xiao Ni 2021-02-04  1764  			dev_end = (last_stripe_index + 1) * mddev->chunk_sectors;
d30588b2731fb0 Xiao Ni 2021-02-04  1765  		else if (disk > end_disk_index)
d30588b2731fb0 Xiao Ni 2021-02-04  1766  			dev_end = last_stripe_index * mddev->chunk_sectors;
d30588b2731fb0 Xiao Ni 2021-02-04  1767  		else
d30588b2731fb0 Xiao Ni 2021-02-04  1768  			dev_end = end_disk_offset;
d30588b2731fb0 Xiao Ni 2021-02-04  1769  
d30588b2731fb0 Xiao Ni 2021-02-04  1770  		/*
d30588b2731fb0 Xiao Ni 2021-02-04  1771  		 * It only handles discard bio which size is >= stripe size, so
d30588b2731fb0 Xiao Ni 2021-02-04  1772  		 * dev_end > dev_start all the time
d30588b2731fb0 Xiao Ni 2021-02-04  1773  		 */
d30588b2731fb0 Xiao Ni 2021-02-04  1774  		if (r10_bio->devs[disk].bio) {
d30588b2731fb0 Xiao Ni 2021-02-04  1775  			mbio = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set);
d30588b2731fb0 Xiao Ni 2021-02-04  1776  			mbio->bi_end_io = raid10_end_discard_request;
d30588b2731fb0 Xiao Ni 2021-02-04  1777  			mbio->bi_private = r10_bio;
d30588b2731fb0 Xiao Ni 2021-02-04  1778  			r10_bio->devs[disk].bio = mbio;
d30588b2731fb0 Xiao Ni 2021-02-04  1779  			r10_bio->devs[disk].devnum = disk;
d30588b2731fb0 Xiao Ni 2021-02-04  1780  			atomic_inc(&r10_bio->remaining);
d30588b2731fb0 Xiao Ni 2021-02-04  1781  			md_submit_discard_bio(mddev, rdev, mbio,
d30588b2731fb0 Xiao Ni 2021-02-04  1782  					dev_start + choose_data_offset(r10_bio, rdev),
d30588b2731fb0 Xiao Ni 2021-02-04  1783  					dev_end - dev_start);
d30588b2731fb0 Xiao Ni 2021-02-04  1784  			bio_endio(mbio);
d30588b2731fb0 Xiao Ni 2021-02-04  1785  		}
d30588b2731fb0 Xiao Ni 2021-02-04  1786  		if (r10_bio->devs[disk].repl_bio) {
d30588b2731fb0 Xiao Ni 2021-02-04  1787  			rbio = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set);
d30588b2731fb0 Xiao Ni 2021-02-04  1788  			rbio->bi_end_io = raid10_end_discard_request;
d30588b2731fb0 Xiao Ni 2021-02-04  1789  			rbio->bi_private = r10_bio;
d30588b2731fb0 Xiao Ni 2021-02-04  1790  			r10_bio->devs[disk].repl_bio = rbio;
d30588b2731fb0 Xiao Ni 2021-02-04  1791  			r10_bio->devs[disk].devnum = disk;
d30588b2731fb0 Xiao Ni 2021-02-04  1792  			atomic_inc(&r10_bio->remaining);
d30588b2731fb0 Xiao Ni 2021-02-04  1793  			md_submit_discard_bio(mddev, rrdev, rbio,
d30588b2731fb0 Xiao Ni 2021-02-04  1794  					dev_start + choose_data_offset(r10_bio, rrdev),
d30588b2731fb0 Xiao Ni 2021-02-04  1795  					dev_end - dev_start);
d30588b2731fb0 Xiao Ni 2021-02-04  1796  			bio_endio(rbio);
d30588b2731fb0 Xiao Ni 2021-02-04  1797  		}
d30588b2731fb0 Xiao Ni 2021-02-04  1798  	}
d30588b2731fb0 Xiao Ni 2021-02-04  1799  
254c271da0712e Xiao Ni 2021-02-04  1800  	if (!geo->far_offset && --far_copies) {
254c271da0712e Xiao Ni 2021-02-04  1801  		first_stripe_index += geo->stride >> geo->chunk_shift;
254c271da0712e Xiao Ni 2021-02-04  1802  		start_disk_offset += geo->stride;
254c271da0712e Xiao Ni 2021-02-04  1803  		last_stripe_index += geo->stride >> geo->chunk_shift;
254c271da0712e Xiao Ni 2021-02-04  1804  		end_disk_offset += geo->stride;
254c271da0712e Xiao Ni 2021-02-04  1805  		atomic_inc(&first_r10bio->remaining);
254c271da0712e Xiao Ni 2021-02-04  1806  		raid_end_discard_bio(r10_bio);
254c271da0712e Xiao Ni 2021-02-04  1807  		wait_barrier(conf);
254c271da0712e Xiao Ni 2021-02-04  1808  		goto retry_discard;
d30588b2731fb0 Xiao Ni 2021-02-04  1809  	}
d30588b2731fb0 Xiao Ni 2021-02-04  1810  
254c271da0712e Xiao Ni 2021-02-04  1811  	raid_end_discard_bio(r10_bio);
254c271da0712e Xiao Ni 2021-02-04  1812  
d30588b2731fb0 Xiao Ni 2021-02-04  1813  	return 0;
d30588b2731fb0 Xiao Ni 2021-02-04  1814  out:
d30588b2731fb0 Xiao Ni 2021-02-04  1815  	allow_barrier(conf);
d30588b2731fb0 Xiao Ni 2021-02-04  1816  	return -EAGAIN;
d30588b2731fb0 Xiao Ni 2021-02-04  1817  }
d30588b2731fb0 Xiao Ni 2021-02-04  1818  

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

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

end of thread, other threads:[~2021-12-26  7:57 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-26 15:08 drivers/md/raid10.c:1707:39: warning: Uninitialized variable: first_r10bio [uninitvar] kernel test robot
2021-07-24  2:49 kernel test robot
2021-12-26  7:57 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.