dm zoned: add 'message' callback
authorHannes Reinecke <hare@suse.de>
Mon, 11 May 2020 08:24:17 +0000 (10:24 +0200)
committerMike Snitzer <snitzer@redhat.com>
Fri, 15 May 2020 14:29:36 +0000 (10:29 -0400)
Add callback for 'dmsetup message' to allow the reclaim process
to be triggered manually.
Eg.

dmsetup message /dev/dm-X 0 message

will start the reclaim process even if the default threshold
of 50 percent of free random zones is not reached.

Signed-off-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Bob Liu <bob.liu@oracle.com>
Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Documentation/admin-guide/device-mapper/dm-zoned.rst
drivers/md/dm-zoned-target.c

index 4165fbf1aeb692cbeffedd3fc3fa7e1ab9f20fd0..7547ce635161aa4df5f3a360456adb00d99a6911 100644 (file)
@@ -160,3 +160,15 @@ where <nr_zones> is the total number of zones, <nr_unmap_rnd> is the number
 of unmapped (ie free) random zones, <nr_rnd> the total number of zones,
 <nr_unmap_seq> the number of unmapped sequential zones, and <nr_seq> the
 total number of sequential zones.
+
+Normally the reclaim process will be started once there are less than 50
+percent free random zones. In order to start the reclaim process manually
+even before reaching this threshold the 'dmsetup message' function can be
+used:
+
+Ex::
+
+       dmsetup message /dev/dm-X 0 reclaim
+
+will start the reclaim process and random zones will be moved to sequential
+zones.
index 0b4b27d280fbbb85f1c2b3ae61c6546fd4632cba..0bfe34162dbb033efe1c61f337725ec28e5df108 100644 (file)
@@ -990,6 +990,20 @@ static void dmz_status(struct dm_target *ti, status_type_t type,
        return;
 }
 
+static int dmz_message(struct dm_target *ti, unsigned int argc, char **argv,
+                      char *result, unsigned int maxlen)
+{
+       struct dmz_target *dmz = ti->private;
+       int r = -EINVAL;
+
+       if (!strcasecmp(argv[0], "reclaim")) {
+               dmz_schedule_reclaim(dmz->reclaim);
+               r = 0;
+       } else
+               DMERR("unrecognized message %s", argv[0]);
+       return r;
+}
+
 static struct target_type dmz_type = {
        .name            = "zoned",
        .version         = {1, 1, 0},
@@ -1004,6 +1018,7 @@ static struct target_type dmz_type = {
        .resume          = dmz_resume,
        .iterate_devices = dmz_iterate_devices,
        .status          = dmz_status,
+       .message         = dmz_message,
 };
 
 static int __init dmz_init(void)