Add ioctl to control resync speed, userspace tool is dmsetup message, message format is: dmsetup message $device 0 "set $speed" e.g. dmsetup message /dev/dm-2 "set 12345" Signed-off-by: Guangliang Zhao <gzhao@xxxxxxxx> --- drivers/md/dm-raid1.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index fb87779..1da25eb 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c @@ -1361,6 +1361,49 @@ static void mirror_resume(struct dm_target *ti) } /* + * convert speed into members of ratelimit_state + */ +static void speed_to_rlimit(struct mirror_set *ms, struct ratelimit_state *rl, + unsigned int speed) +{ + sector_t region_size = dm_rh_get_region_size(ms->rh); + + rl->interval = RESYNC_JIFFIES; + rl->burst = (speed * (RESYNC_JIFFIES / HZ)) << 1; + rl->burst = DIV_ROUND_UP(rl->burst, region_size); +} + +/* + * Message interface + * set speed(KB/s) + */ +static int mirror_message(struct dm_target *ti, unsigned argc, char **argv) +{ + struct mirror_set *ms = ti->private; + unsigned int speed; + int ret = 0; + + if (!strcasecmp(argv[0], "set")) { + if (sscanf(argv[1], "%u", &speed) != 1) { + DMWARN("invalid speed parameter %s", argv[1]); + ret = -EINVAL; + goto error; + } + + speed_to_rlimit(ms, &ms->ms_rlimit, speed); + goto out; + } else { + ret = -EINVAL; + goto error; + } + +error: + DMWARN("unrecognised message received."); +out: + return ret; +} + +/* * device_status_char * @m: mirror device/leg we want the status of * @@ -1450,6 +1493,7 @@ static struct target_type mirror_target = { .presuspend = mirror_presuspend, .postsuspend = mirror_postsuspend, .resume = mirror_resume, + .message = mirror_message, .status = mirror_status, .iterate_devices = mirror_iterate_devices, }; -- 1.7.10.4 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel