diff options
| author | Li Nan <linan122@huawei.com> | 2024-02-26 11:14:41 +0800 | 
|---|---|---|
| committer | Song Liu <song@kernel.org> | 2024-02-26 10:22:22 -0800 | 
| commit | f74aaf614e84d8e5767a062e1172b4907c7b775e (patch) | |
| tree | 793b9f9f44ba1ac0f05881d378618e94185a5be1 | |
| parent | 9674f54e41fffaf06f6a60202e1fa4cc13de3cf5 (diff) | |
md: factor out a helper to sync mddev
There are no functional changes, prepare to sync mddev in
array_state_store().
Signed-off-by: Li Nan <linan122@huawei.com>
Signed-off-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20240226031444.3606764-7-linan666@huaweicloud.com
| -rw-r--r-- | drivers/md/md.c | 32 | 
1 files changed, 21 insertions, 11 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 9f97e4041425..4d58e3496d16 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -529,6 +529,24 @@ void mddev_resume(struct mddev *mddev)  }  EXPORT_SYMBOL_GPL(mddev_resume); +/* sync bdev before setting device to readonly or stopping raid*/ +static int mddev_set_closing_and_sync_blockdev(struct mddev *mddev, int opener_num) +{ +	mutex_lock(&mddev->open_mutex); +	if (mddev->pers && atomic_read(&mddev->openers) > opener_num) { +		mutex_unlock(&mddev->open_mutex); +		return -EBUSY; +	} +	if (test_and_set_bit(MD_CLOSING, &mddev->flags)) { +		mutex_unlock(&mddev->open_mutex); +		return -EBUSY; +	} +	mutex_unlock(&mddev->open_mutex); + +	sync_blockdev(mddev->gendisk->part0); +	return 0; +} +  /*   * Generic flush handling for md   */ @@ -7658,17 +7676,9 @@ static int md_ioctl(struct block_device *bdev, blk_mode_t mode,  		/* Need to flush page cache, and ensure no-one else opens  		 * and writes  		 */ -		mutex_lock(&mddev->open_mutex); -		if (mddev->pers && atomic_read(&mddev->openers) > 1) { -			mutex_unlock(&mddev->open_mutex); -			return -EBUSY; -		} -		if (test_and_set_bit(MD_CLOSING, &mddev->flags)) { -			mutex_unlock(&mddev->open_mutex); -			return -EBUSY; -		} -		mutex_unlock(&mddev->open_mutex); -		sync_blockdev(bdev); +		err = mddev_set_closing_and_sync_blockdev(mddev, 1); +		if (err) +			return err;  	}  	if (!md_is_rdwr(mddev))  | 
