]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Relax error reporting in zpool import and zpool split
authorUmer Saleem <usaleem@ixsystems.com>
Sat, 2 Sep 2023 00:25:11 +0000 (05:25 +0500)
committerGitHub <noreply@github.com>
Sat, 2 Sep 2023 00:25:11 +0000 (17:25 -0700)
For zpool import and zpool split, zpool_enable_datasets is called
to mount and share all datasets in a pool. If there is an error
while mounting or sharing any dataset in the pool, the status of
import or split is reported as failure. However, the changes do
show up in zpool list.

This commit updates the error reporting in zpool import and zpool
split path. More descriptive messages are shown to user in case
there is an error during mount or share. Errors in mount or share
do not effect the overall status of zpool import and zpool split.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Signed-off-by: Umer Saleem <usaleem@ixsystems.com>
Closes #15216

cmd/zpool/zpool_main.c
include/libzfs.h
lib/libzfs/libzfs_mount.c

index 10a3b5b14fc9620925e404888e313e7a9be22747..6d0dae8d8b059d321a926757f5d33999a2a33120 100644 (file)
@@ -3143,6 +3143,7 @@ do_import(nvlist_t *config, const char *newname, const char *mntopts,
     nvlist_t *props, int flags)
 {
        int ret = 0;
+       int ms_status = 0;
        zpool_handle_t *zhp;
        const char *name;
        uint64_t version;
@@ -3232,10 +3233,15 @@ do_import(nvlist_t *config, const char *newname, const char *mntopts,
                        ret = 1;
 
        if (zpool_get_state(zhp) != POOL_STATE_UNAVAIL &&
-           !(flags & ZFS_IMPORT_ONLY) &&
-           zpool_enable_datasets(zhp, mntopts, 0) != 0) {
-               zpool_close(zhp);
-               return (1);
+           !(flags & ZFS_IMPORT_ONLY)) {
+               ms_status = zpool_enable_datasets(zhp, mntopts, 0);
+               if (ms_status == EZFS_SHAREFAILED) {
+                       (void) fprintf(stderr, gettext("Import was "
+                           "successful, but unable to share some datasets"));
+               } else if (ms_status == EZFS_MOUNTFAILED) {
+                       (void) fprintf(stderr, gettext("Import was "
+                           "successful, but unable to mount some datasets"));
+               }
        }
 
        zpool_close(zhp);
@@ -6755,6 +6761,7 @@ zpool_do_split(int argc, char **argv)
        char *mntopts = NULL;
        splitflags_t flags;
        int c, ret = 0;
+       int ms_status = 0;
        boolean_t loadkeys = B_FALSE;
        zpool_handle_t *zhp;
        nvlist_t *config, *props = NULL;
@@ -6891,13 +6898,18 @@ zpool_do_split(int argc, char **argv)
                        ret = 1;
        }
 
-       if (zpool_get_state(zhp) != POOL_STATE_UNAVAIL &&
-           zpool_enable_datasets(zhp, mntopts, 0) != 0) {
-               ret = 1;
-               (void) fprintf(stderr, gettext("Split was successful, but "
-                   "the datasets could not all be mounted\n"));
-               (void) fprintf(stderr, gettext("Try doing '%s' with a "
-                   "different altroot\n"), "zpool import");
+       if (zpool_get_state(zhp) != POOL_STATE_UNAVAIL) {
+               ms_status = zpool_enable_datasets(zhp, mntopts, 0);
+               if (ms_status == EZFS_SHAREFAILED) {
+                       (void) fprintf(stderr, gettext("Split was successful, "
+                           "datasets are mounted but sharing of some datasets "
+                           "has failed\n"));
+               } else if (ms_status == EZFS_MOUNTFAILED) {
+                       (void) fprintf(stderr, gettext("Split was successful"
+                           ", but some datasets could not be mounted\n"));
+                       (void) fprintf(stderr, gettext("Try doing '%s' with a "
+                           "different altroot\n"), "zpool import");
+               }
        }
        zpool_close(zhp);
        nvlist_free(config);
index a7037e3e62664d0f960ba5707344cb62ee3d7103..fa05b7921bb51a9712ac7c2e8196d69e1b9a64cd 100644 (file)
@@ -156,6 +156,7 @@ typedef enum zfs_error {
        EZFS_NOT_USER_NAMESPACE,        /* a file is not a user namespace */
        EZFS_CKSUM,             /* insufficient replicas */
        EZFS_RESUME_EXISTS,     /* Resume on existing dataset without force */
+       EZFS_SHAREFAILED,       /* filesystem share failed */
        EZFS_UNKNOWN
 } zfs_error_t;
 
index 5d1fe651c97e4b8637fe5b7744f605a188e9b522..b38ad88096b2405ce07fc70954029b3603d0cd3d 100644 (file)
@@ -1300,7 +1300,7 @@ zpool_enable_datasets(zpool_handle_t *zhp, const char *mntopts, int flags)
        zfs_foreach_mountpoint(zhp->zpool_hdl, cb.cb_handles, cb.cb_used,
            zfs_mount_one, &ms, B_TRUE);
        if (ms.ms_mntstatus != 0)
-               ret = ms.ms_mntstatus;
+               ret = EZFS_MOUNTFAILED;
 
        /*
         * Share all filesystems that need to be shared. This needs to be
@@ -1311,7 +1311,7 @@ zpool_enable_datasets(zpool_handle_t *zhp, const char *mntopts, int flags)
        zfs_foreach_mountpoint(zhp->zpool_hdl, cb.cb_handles, cb.cb_used,
            zfs_share_one, &ms, B_FALSE);
        if (ms.ms_mntstatus != 0)
-               ret = ms.ms_mntstatus;
+               ret = EZFS_SHAREFAILED;
        else
                zfs_commit_shares(NULL);