Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a30ec4b3 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'md/4.1-rc4-fixes' of git://neil.brown.name/md

Pull md bugfixes from Neil Brown:
 "I have a few more raid5 bugfixes pending, but I want them to get a bit
  more review first.  In the meantime:

   - one serious RAID0 data corruption - caused by recent bugfix that
     wasn't reviewed properly.

   - one raid5 fix in new code (a couple more of those to come).

   - one little fix to stop static analysis complaining about silly rcu
     annotation"

* tag 'md/4.1-rc4-fixes' of git://neil.brown.name/md:
  md/bitmap: remove rcu annotation from pointer arithmetic.
  md/raid0: fix restore to sector variable in raid0_make_request
  raid5: fix broken async operation chain
parents 1d82b0ba 8532e343
Loading
Loading
Loading
Loading
+6 −1
Original line number Original line Diff line number Diff line
@@ -177,11 +177,16 @@ static struct md_rdev *next_active_rdev(struct md_rdev *rdev, struct mddev *mdde
	 * nr_pending is 0 and In_sync is clear, the entries we return will
	 * nr_pending is 0 and In_sync is clear, the entries we return will
	 * still be in the same position on the list when we re-enter
	 * still be in the same position on the list when we re-enter
	 * list_for_each_entry_continue_rcu.
	 * list_for_each_entry_continue_rcu.
	 *
	 * Note that if entered with 'rdev == NULL' to start at the
	 * beginning, we temporarily assign 'rdev' to an address which
	 * isn't really an rdev, but which can be used by
	 * list_for_each_entry_continue_rcu() to find the first entry.
	 */
	 */
	rcu_read_lock();
	rcu_read_lock();
	if (rdev == NULL)
	if (rdev == NULL)
		/* start at the beginning */
		/* start at the beginning */
		rdev = list_entry_rcu(&mddev->disks, struct md_rdev, same_set);
		rdev = list_entry(&mddev->disks, struct md_rdev, same_set);
	else {
	else {
		/* release the previous rdev and start from there. */
		/* release the previous rdev and start from there. */
		rdev_dec_pending(rdev, mddev);
		rdev_dec_pending(rdev, mddev);
+3 −1
Original line number Original line Diff line number Diff line
@@ -524,6 +524,9 @@ static void raid0_make_request(struct mddev *mddev, struct bio *bio)
			 ? (sector & (chunk_sects-1))
			 ? (sector & (chunk_sects-1))
			 : sector_div(sector, chunk_sects));
			 : sector_div(sector, chunk_sects));


		/* Restore due to sector_div */
		sector = bio->bi_iter.bi_sector;

		if (sectors < bio_sectors(bio)) {
		if (sectors < bio_sectors(bio)) {
			split = bio_split(bio, sectors, GFP_NOIO, fs_bio_set);
			split = bio_split(bio, sectors, GFP_NOIO, fs_bio_set);
			bio_chain(split, bio);
			bio_chain(split, bio);
@@ -531,7 +534,6 @@ static void raid0_make_request(struct mddev *mddev, struct bio *bio)
			split = bio;
			split = bio;
		}
		}


		sector = bio->bi_iter.bi_sector;
		zone = find_zone(mddev->private, &sector);
		zone = find_zone(mddev->private, &sector);
		tmp_dev = map_sector(mddev, zone, sector, &sector);
		tmp_dev = map_sector(mddev, zone, sector, &sector);
		split->bi_bdev = tmp_dev->bdev;
		split->bi_bdev = tmp_dev->bdev;
+1 −1
Original line number Original line Diff line number Diff line
@@ -1822,7 +1822,7 @@ ops_run_reconstruct6(struct stripe_head *sh, struct raid5_percpu *percpu,
	} else
	} else
		init_async_submit(&submit, 0, tx, NULL, NULL,
		init_async_submit(&submit, 0, tx, NULL, NULL,
				  to_addr_conv(sh, percpu, j));
				  to_addr_conv(sh, percpu, j));
	async_gen_syndrome(blocks, 0, count+2, STRIPE_SIZE,  &submit);
	tx = async_gen_syndrome(blocks, 0, count+2, STRIPE_SIZE,  &submit);
	if (!last_stripe) {
	if (!last_stripe) {
		j++;
		j++;
		sh = list_first_entry(&sh->batch_list, struct stripe_head,
		sh = list_first_entry(&sh->batch_list, struct stripe_head,