]> granicus.if.org Git - zfs/commitdiff
zvol_wait script should ignore partially received zvols
authorPavel Zakharov <pavel.zakharov@delphix.com>
Tue, 3 Sep 2019 18:29:52 +0000 (14:29 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 3 Sep 2019 18:29:52 +0000 (11:29 -0700)
Partially received zvols won't have links in /dev/zvol.

Reviewed-by: Sebastien Roy <sebastien.roy@delphix.com>
Reviewed-by: Paul Dagnelie <pcd@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Pavel Zakharov <pavel.zakharov@delphix.com>
Closes #9260

cmd/zvol_wait/zvol_wait

index d512be41bcb5f342e80c78ba2d4f6315517ecd8c..e5df82dd376a8b0b87e4b64c4ae2ecf7fd426088 100755 (executable)
@@ -25,11 +25,30 @@ filter_out_deleted_zvols() {
 }
 
 list_zvols() {
-       zfs list -t volume -H -o name,volmode | while read -r zvol_line; do
+       zfs list -t volume -H -o name,volmode,receive_resume_token |
+               while read -r zvol_line; do
                name=$(echo "$zvol_line" | awk '{print $1}')
                volmode=$(echo "$zvol_line" | awk '{print $2}')
+               token=$(echo "$zvol_line" | awk '{print $3}')
+               #
                # /dev links are not created for zvols with volmode = "none".
-               [ "$volmode" = "none" ] || echo "$name"
+               #
+               [ "$volmode" = "none" ] && continue
+               #
+               # We also also ignore partially received zvols if it is
+               # not an incremental receive, as those won't even have a block
+               # device minor node created yet.
+               #
+               if [ "$token" != "-" ]; then
+                       #
+                       # Incremental receives create an invisible clone that
+                       # is not automatically displayed by zfs list.
+                       #
+                       if ! zfs list "$name/%recv" >/dev/null 2>&1; then
+                               continue
+                       fi
+               fi
+               echo "$name"
        done
 }