]> git.proxmox.com Git - mirror_zfs.git/blobdiff - lib/libzfs/libzfs_pool.c
Add trim support to zpool wait
[mirror_zfs.git] / lib / libzfs / libzfs_pool.c
index 7f3ec5d0d4fa0d67c95bef0434a230bf075310f5..e0610a631e0ec0e1e51c95cdd55316990dc0cc53 100644 (file)
@@ -2263,6 +2263,30 @@ xlate_trim_err(int err)
        return (err);
 }
 
+static int
+zpool_trim_wait(zpool_handle_t *zhp, nvlist_t *vdev_guids)
+{
+       int err;
+       nvpair_t *elem;
+
+       for (elem = nvlist_next_nvpair(vdev_guids, NULL); elem != NULL;
+           elem = nvlist_next_nvpair(vdev_guids, elem)) {
+
+               uint64_t guid = fnvpair_value_uint64(elem);
+
+               err = lzc_wait_tag(zhp->zpool_name,
+                   ZPOOL_WAIT_TRIM, guid, NULL);
+               if (err != 0) {
+                       (void) zpool_standard_error_fmt(zhp->zpool_hdl,
+                           err, dgettext(TEXT_DOMAIN, "error "
+                           "waiting to trim '%s'"), nvpair_name(elem));
+
+                       return (err);
+               }
+       }
+       return (0);
+}
+
 /*
  * Begin, suspend, or cancel the TRIM (discarding of all free blocks) for
  * the given vdevs in the given pool.
@@ -2286,9 +2310,12 @@ zpool_trim(zpool_handle_t *zhp, pool_trim_func_t cmd_type, nvlist_t *vds,
                err = lzc_trim(zhp->zpool_name, cmd_type, trim_flags->rate,
                    trim_flags->secure, vdev_guids, &errlist);
                if (err == 0) {
+                       if (trim_flags->wait)
+                               err = zpool_trim_wait(zhp, vdev_guids);
+
                        fnvlist_free(vdev_guids);
                        fnvlist_free(guids_to_paths);
-                       return (0);
+                       return (err);
                }
 
                if (errlist != NULL) {