Commit 969f9962 authored by Yu Kuai's avatar Yu Kuai
Browse files

md/raid10: check before referencing mddev->bitmap_ops

parent 8d31ed3b
Loading
Loading
Loading
Loading
+13 −7
Original line number Diff line number Diff line
@@ -3247,6 +3247,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
			}
			conf->fullsync = 0;
		}
		if (md_bitmap_enabled(mddev, false))
			mddev->bitmap_ops->close_sync(mddev);
		close_sync(conf);
		*skipped = 1;
@@ -3566,6 +3567,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
		 * safety reason, which ensures curr_resync_completed is
		 * updated in bitmap_cond_end_sync.
		 */
		if (md_bitmap_enabled(mddev, false))
			mddev->bitmap_ops->cond_end_sync(mddev, sector_nr,
					mddev_is_clustered(mddev) &&
					(sector_nr + 2 * RESYNC_SECTORS > conf->cluster_sync_high));
@@ -4220,7 +4222,6 @@ static int raid10_resize(struct mddev *mddev, sector_t sectors)
	 */
	struct r10conf *conf = mddev->private;
	sector_t oldsize, size;
	int ret;

	if (mddev->reshape_position != MaxSector)
		return -EBUSY;
@@ -4234,9 +4235,12 @@ static int raid10_resize(struct mddev *mddev, sector_t sectors)
	    mddev->array_sectors > size)
		return -EINVAL;

	ret = mddev->bitmap_ops->resize(mddev, size, 0);
	if (md_bitmap_enabled(mddev, false)) {
		int ret = mddev->bitmap_ops->resize(mddev, size, 0);

		if (ret)
			return ret;
	}

	md_set_array_sectors(mddev, size);
	if (sectors > mddev->dev_sectors &&
@@ -4502,7 +4506,8 @@ static int raid10_start_reshape(struct mddev *mddev)
		oldsize = raid10_size(mddev, 0, 0);
		newsize = raid10_size(mddev, 0, conf->geo.raid_disks);

		if (!mddev_is_clustered(mddev)) {
		if (!mddev_is_clustered(mddev) &&
		    md_bitmap_enabled(mddev, false)) {
			ret = mddev->bitmap_ops->resize(mddev, newsize, 0);
			if (ret)
				goto abort;
@@ -4525,6 +4530,7 @@ static int raid10_start_reshape(struct mddev *mddev)
			    MD_FEATURE_RESHAPE_ACTIVE)) || (oldsize == newsize))
			goto out;

		/* cluster can't be setup without bitmap */
		ret = mddev->bitmap_ops->resize(mddev, newsize, 0);
		if (ret)
			goto abort;