Author: mm
Date: Sat Mar 16 08:16:11 2013
New Revision: 248369
URL: http://svnweb.freebsd.org/changeset/base/248369

Log:
  MFC r247187,247265,247348,247398,247540,247585,247852,248265,248267
  Merge various ZFS improvements and bugfixes
  
  MFC r247187:
    Import vendor change to avoid "unitialized variable" warnings.
  
    Illumos ZFS issues:
    3522 zfs module should not allow uninitialized variables
  
  MFC r247265:
    Merge the ZFS I/O deadman thread from vendor (illumos).
    This feature panics the system on hanging ZFS I/O, helps debugging
    and resumes failed service.
  
    The panic behavior can be controlled with the loader-only tunables:
    vfs.zfs.deadman_enabled (enable or disable panic on stalled ZFS I/O)
    vfs.zfs.deadman_synctime (expiration time for stalled ZFS I/O)
  
    By default, ZFS I/O deadman is enabled by default on amd64 and i386
    excluding virtual guest machines.
  
  MFC r247348:
    Be more verbose on ZFS deadman I/O panic
    Patch suggested upstream.
  
  MFC r247398:
    Import metaslab_sync() speedup from vendor (illumos).
  
    Illumos ZFS issues:
    3552 condensing one space map burns 3 seconds of CPU in spa_sync() thread
    3564 spa_sync() spends 5-10% of its time in metaslab_sync() (when not
           condensing)
    3578 transferring the freed map to the defer map should be constant time
    3579 ztest trips assertion in metaslab_weight()
  
  MFC r247540:
    Fix the zfs_ioctl compat layer to support zfs_cmd size change introduced
    in r247265 (ZFS deadman thread). Both new utilities now support the old
    kernel and new kernel properly detects old utilities.
  
    For future backwards compatibility, the vfs.zfs.version.ioctl read-only
    sysctl has been introduced. With this sysctl zfs utilities will be able
    to detect the ioctl interface version of the currently loaded zfs module.
  
  MFC r247585:
    Merge new read-only zfs properties from vendor (illumos)
  
    Illumos ZFS issues:
    3588 provide zfs properties for logical (uncompressed) space used and
         referenced
  
  MFC r247852:
    Import ZFS bpobj bugfix from vendor.
  
    Illumos ZFS issues:
    3603 panic from bpobj_enqueue_subobj()
    3604 zdb should print bpobjs more verbosely
  
  MFC r248265:
    Update zfs.8 manpage date (missing in r247585)
  
  MFC r248267:
    Import minor ZFS changes from vendor
  
    Illumos ZFS issues:
    3604 zdb should print bpobjs more verbosely (fix zdb hang)
    3606 zpool status -x shouldn't warn about old on-disk format

Modified:
  stable/9/cddl/contrib/opensolaris/cmd/zdb/zdb.c
  stable/9/cddl/contrib/opensolaris/cmd/zfs/zfs.8
  stable/9/cddl/contrib/opensolaris/cmd/zinject/translate.c
  stable/9/cddl/contrib/opensolaris/cmd/zinject/zinject.c
  stable/9/cddl/contrib/opensolaris/cmd/zpool/zpool.8
  stable/9/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
  stable/9/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_impl.h
  stable/9/cddl/contrib/opensolaris/lib/libzpool/common/kernel.c
  stable/9/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h
  stable/9/sys/cddl/compat/opensolaris/sys/time.h
  stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.c
  stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.h
  stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/bpobj.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_scan.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/lzjb.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/refcount.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sa.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/space_map.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab_impl.h
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_boot.h
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/space_map.h
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev.h
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_context.h
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap_leaf.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_byteswap.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_fuid.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_log.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_rlock.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio_inject.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h
Directory Properties:
  stable/9/cddl/contrib/opensolaris/   (props changed)
  stable/9/cddl/contrib/opensolaris/cmd/zfs/   (props changed)
  stable/9/cddl/contrib/opensolaris/lib/libzfs/   (props changed)
  stable/9/sys/   (props changed)
  stable/9/sys/cddl/contrib/opensolaris/   (props changed)

Modified: stable/9/cddl/contrib/opensolaris/cmd/zdb/zdb.c
==============================================================================
--- stable/9/cddl/contrib/opensolaris/cmd/zdb/zdb.c     Sat Mar 16 05:40:29 
2013        (r248368)
+++ stable/9/cddl/contrib/opensolaris/cmd/zdb/zdb.c     Sat Mar 16 08:16:11 
2013        (r248369)
@@ -545,7 +545,7 @@ static void
 dump_metaslab_stats(metaslab_t *msp)
 {
        char maxbuf[32];
-       space_map_t *sm = &msp->ms_map;
+       space_map_t *sm = msp->ms_map;
        avl_tree_t *t = sm->sm_pp_root;
        int free_pct = sm->sm_space * 100 / sm->sm_size;
 
@@ -561,7 +561,7 @@ dump_metaslab(metaslab_t *msp)
 {
        vdev_t *vd = msp->ms_group->mg_vd;
        spa_t *spa = vd->vdev_spa;
-       space_map_t *sm = &msp->ms_map;
+       space_map_t *sm = msp->ms_map;
        space_map_obj_t *smo = &msp->ms_smo;
        char freebuf[32];
 
@@ -1189,7 +1189,7 @@ dump_bpobj_cb(void *arg, const blkptr_t 
 }
 
 static void
-dump_bpobj(bpobj_t *bpo, char *name)
+dump_bpobj(bpobj_t *bpo, char *name, int indent)
 {
        char bytes[32];
        char comp[32];
@@ -1199,31 +1199,57 @@ dump_bpobj(bpobj_t *bpo, char *name)
                return;
 
        zdb_nicenum(bpo->bpo_phys->bpo_bytes, bytes);
-       if (bpo->bpo_havesubobj) {
+       if (bpo->bpo_havesubobj && bpo->bpo_phys->bpo_subobjs != 0) {
                zdb_nicenum(bpo->bpo_phys->bpo_comp, comp);
                zdb_nicenum(bpo->bpo_phys->bpo_uncomp, uncomp);
-               (void) printf("\n    %s: %llu local blkptrs, %llu subobjs, "
-                   "%s (%s/%s comp)\n",
-                   name, (u_longlong_t)bpo->bpo_phys->bpo_num_blkptrs,
+               (void) printf("    %*s: object %llu, %llu local blkptrs, "
+                   "%llu subobjs, %s (%s/%s comp)\n",
+                   indent * 8, name,
+                   (u_longlong_t)bpo->bpo_object,
+                   (u_longlong_t)bpo->bpo_phys->bpo_num_blkptrs,
                    (u_longlong_t)bpo->bpo_phys->bpo_num_subobjs,
                    bytes, comp, uncomp);
+
+               for (uint64_t i = 0; i < bpo->bpo_phys->bpo_num_subobjs; i++) {
+                       uint64_t subobj;
+                       bpobj_t subbpo;
+                       int error;
+                       VERIFY0(dmu_read(bpo->bpo_os,
+                           bpo->bpo_phys->bpo_subobjs,
+                           i * sizeof (subobj), sizeof (subobj), &subobj, 0));
+                       error = bpobj_open(&subbpo, bpo->bpo_os, subobj);
+                       if (error != 0) {
+                               (void) printf("ERROR %u while trying to open "
+                                   "subobj id %llu\n",
+                                   error, (u_longlong_t)subobj);
+                               continue;
+                       }
+                       dump_bpobj(&subbpo, "subobj", indent + 1);
+                       bpobj_close(&subbpo);
+               }
        } else {
-               (void) printf("\n    %s: %llu blkptrs, %s\n",
-                   name, (u_longlong_t)bpo->bpo_phys->bpo_num_blkptrs, bytes);
+               (void) printf("    %*s: object %llu, %llu blkptrs, %s\n",
+                   indent * 8, name,
+                   (u_longlong_t)bpo->bpo_object,
+                   (u_longlong_t)bpo->bpo_phys->bpo_num_blkptrs,
+                   bytes);
        }
 
        if (dump_opt['d'] < 5)
                return;
 
-       (void) printf("\n");
 
-       (void) bpobj_iterate_nofree(bpo, dump_bpobj_cb, NULL, NULL);
+       if (indent == 0) {
+               (void) bpobj_iterate_nofree(bpo, dump_bpobj_cb, NULL, NULL);
+               (void) printf("\n");
+       }
 }
 
 static void
 dump_deadlist(dsl_deadlist_t *dl)
 {
        dsl_deadlist_entry_t *dle;
+       uint64_t unused;
        char bytes[32];
        char comp[32];
        char uncomp[32];
@@ -1242,14 +1268,24 @@ dump_deadlist(dsl_deadlist_t *dl)
 
        (void) printf("\n");
 
+       /* force the tree to be loaded */
+       dsl_deadlist_space_range(dl, 0, UINT64_MAX, &unused, &unused, &unused);
+
        for (dle = avl_first(&dl->dl_tree); dle;
            dle = AVL_NEXT(&dl->dl_tree, dle)) {
-               (void) printf("      mintxg %llu -> obj %llu\n",
-                   (longlong_t)dle->dle_mintxg,
-                   (longlong_t)dle->dle_bpobj.bpo_object);
+               if (dump_opt['d'] >= 5) {
+                       char buf[128];
+                       (void) snprintf(buf, sizeof (buf), "mintxg %llu -> ",
+                           (longlong_t)dle->dle_mintxg,
+                           (longlong_t)dle->dle_bpobj.bpo_object);
 
-               if (dump_opt['d'] >= 5)
-                       dump_bpobj(&dle->dle_bpobj, "");
+                       dump_bpobj(&dle->dle_bpobj, buf, 0);
+               } else {
+                       (void) printf("mintxg %llu -> obj %llu\n",
+                           (longlong_t)dle->dle_mintxg,
+                           (longlong_t)dle->dle_bpobj.bpo_object);
+
+               }
        }
 }
 
@@ -1272,7 +1308,7 @@ fuid_table_destroy()
  * print uid or gid information.
  * For normal POSIX id just the id is printed in decimal format.
  * For CIFS files with FUID the fuid is printed in hex followed by
- * the doman-rid string.
+ * the domain-rid string.
  */
 static void
 print_idstr(uint64_t id, const char *id_type)
@@ -2160,11 +2196,11 @@ zdb_leak_init(spa_t *spa, zdb_cb_t *zcb)
                        for (int m = 0; m < vd->vdev_ms_count; m++) {
                                metaslab_t *msp = vd->vdev_ms[m];
                                mutex_enter(&msp->ms_lock);
-                               space_map_unload(&msp->ms_map);
-                               VERIFY(space_map_load(&msp->ms_map,
+                               space_map_unload(msp->ms_map);
+                               VERIFY(space_map_load(msp->ms_map,
                                    &zdb_space_map_ops, SM_ALLOC, &msp->ms_smo,
                                    spa->spa_meta_objset) == 0);
-                               msp->ms_map.sm_ppd = vd;
+                               msp->ms_map->sm_ppd = vd;
                                mutex_exit(&msp->ms_lock);
                        }
                }
@@ -2187,7 +2223,7 @@ zdb_leak_fini(spa_t *spa)
                        for (int m = 0; m < vd->vdev_ms_count; m++) {
                                metaslab_t *msp = vd->vdev_ms[m];
                                mutex_enter(&msp->ms_lock);
-                               space_map_unload(&msp->ms_map);
+                               space_map_unload(msp->ms_map);
                                mutex_exit(&msp->ms_lock);
                        }
                }
@@ -2529,10 +2565,11 @@ dump_zpool(spa_t *spa)
        if (dump_opt['d'] || dump_opt['i']) {
                dump_dir(dp->dp_meta_objset);
                if (dump_opt['d'] >= 3) {
-                       dump_bpobj(&spa->spa_deferred_bpobj, "Deferred frees");
+                       dump_bpobj(&spa->spa_deferred_bpobj,
+                           "Deferred frees", 0);
                        if (spa_version(spa) >= SPA_VERSION_DEADLISTS) {
                                dump_bpobj(&spa->spa_dsl_pool->dp_free_bpobj,
-                                   "Pool snapshot frees");
+                                   "Pool snapshot frees", 0);
                        }
 
                        if (spa_feature_is_active(spa,

Modified: stable/9/cddl/contrib/opensolaris/cmd/zfs/zfs.8
==============================================================================
--- stable/9/cddl/contrib/opensolaris/cmd/zfs/zfs.8     Sat Mar 16 05:40:29 
2013        (r248368)
+++ stable/9/cddl/contrib/opensolaris/cmd/zfs/zfs.8     Sat Mar 16 08:16:11 
2013        (r248369)
@@ -28,7 +28,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd February 10, 2013
+.Dd March 1, 2013
 .Dt ZFS 8
 .Os
 .Sh NAME
@@ -520,6 +520,39 @@ if the snapshot has been marked for defe
 .Qq Nm Cm destroy -d
 command. Otherwise, the property is
 .Cm off .
+.It Sy logicalreferenced
+The amount of space that is
+.Qq logically
+accessible by this dataset.
+See the
+.Sy referenced
+property.
+The logical space ignores the effect of the
+.Sy compression
+and
+.Sy copies
+properties, giving a quantity closer to the amount of data that applications
+see.
+However, it does include space consumed by metadata.
+.Pp
+This property can also be referred to by its shortened column name,
+.Sy lrefer .
+.It Sy logicalused
+The amount of space that is
+.Qq logically
+consumed by this dataset and all its descendents.
+See the
+.Sy used
+property.
+The logical space ignores the effect of the
+.Sy compression
+and
+.Sy copies
+properties, giving a quantity closer to the amount of data that applications
+see.
+.Pp
+This property can also be referred to by its shortened column name,
+.Sy lused .
 .It Sy mounted
 For file systems, indicates whether the file system is currently mounted. This
 property can be either

Modified: stable/9/cddl/contrib/opensolaris/cmd/zinject/translate.c
==============================================================================
--- stable/9/cddl/contrib/opensolaris/cmd/zinject/translate.c   Sat Mar 16 
05:40:29 2013        (r248368)
+++ stable/9/cddl/contrib/opensolaris/cmd/zinject/translate.c   Sat Mar 16 
08:16:11 2013        (r248369)
@@ -20,6 +20,7 @@
  */
 /*
  * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012 by Delphix. All rights reserved.
  */
 
 #include <libzfs.h>
@@ -455,6 +456,20 @@ translate_device(const char *pool, const
                    &record->zi_guid) == 0);
        }
 
+       /*
+        * Device faults can take on three different forms:
+        * 1). delayed or hanging I/O
+        * 2). zfs label faults
+        * 3). generic disk faults
+        */
+       if (record->zi_timer != 0) {
+               record->zi_cmd = ZINJECT_DELAY_IO;
+       } else if (label_type != TYPE_INVAL) {
+               record->zi_cmd = ZINJECT_LABEL_FAULT;
+       } else {
+               record->zi_cmd = ZINJECT_DEVICE_FAULT;
+       }
+
        switch (label_type) {
        case TYPE_LABEL_UBERBLOCK:
                record->zi_start = offsetof(vdev_label_t, vl_uberblock[0]);

Modified: stable/9/cddl/contrib/opensolaris/cmd/zinject/zinject.c
==============================================================================
--- stable/9/cddl/contrib/opensolaris/cmd/zinject/zinject.c     Sat Mar 16 
05:40:29 2013        (r248368)
+++ stable/9/cddl/contrib/opensolaris/cmd/zinject/zinject.c     Sat Mar 16 
08:16:11 2013        (r248369)
@@ -20,6 +20,7 @@
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012 by Delphix. All rights reserved.
  */
 
 /*
@@ -603,7 +604,7 @@ main(int argc, char **argv)
        }
 
        while ((c = getopt(argc, argv,
-           ":aA:b:d:f:Fg:qhIc:t:T:l:mr:s:e:uL:p:")) != -1) {
+           ":aA:b:d:D:f:Fg:qhIc:t:T:l:mr:s:e:uL:p:")) != -1) {
                switch (c) {
                case 'a':
                        flags |= ZINJECT_FLUSH_ARC;
@@ -629,6 +630,15 @@ main(int argc, char **argv)
                case 'd':
                        device = optarg;
                        break;
+               case 'D':
+                       record.zi_timer = strtoull(optarg, &end, 10);
+                       if (errno != 0 || *end != '\0') {
+                               (void) fprintf(stderr, "invalid i/o delay "
+                                   "value: '%s'\n", optarg);
+                               usage();
+                               return (1);
+                       }
+                       break;
                case 'e':
                        if (strcasecmp(optarg, "io") == 0) {
                                error = EIO;
@@ -693,6 +703,7 @@ main(int argc, char **argv)
                case 'p':
                        (void) strlcpy(record.zi_func, optarg,
                            sizeof (record.zi_func));
+                       record.zi_cmd = ZINJECT_PANIC;
                        break;
                case 'q':
                        quiet = 1;
@@ -766,13 +777,15 @@ main(int argc, char **argv)
        argc -= optind;
        argv += optind;
 
+       if (record.zi_duration != 0)
+               record.zi_cmd = ZINJECT_IGNORED_WRITES;
+
        if (cancel != NULL) {
                /*
                 * '-c' is invalid with any other options.
                 */
                if (raw != NULL || range != NULL || type != TYPE_INVAL ||
-                   level != 0 || record.zi_func[0] != '\0' ||
-                   record.zi_duration != 0) {
+                   level != 0 || record.zi_cmd != ZINJECT_UNINITIALIZED) {
                        (void) fprintf(stderr, "cancel (-c) incompatible with "
                            "any other options\n");
                        usage();
@@ -804,8 +817,7 @@ main(int argc, char **argv)
                 * for doing injection, so handle it separately here.
                 */
                if (raw != NULL || range != NULL || type != TYPE_INVAL ||
-                   level != 0 || record.zi_func[0] != '\0' ||
-                   record.zi_duration != 0) {
+                   level != 0 || record.zi_cmd != ZINJECT_UNINITIALIZED) {
                        (void) fprintf(stderr, "device (-d) incompatible with "
                            "data error injection\n");
                        usage();
@@ -839,7 +851,7 @@ main(int argc, char **argv)
 
        } else if (raw != NULL) {
                if (range != NULL || type != TYPE_INVAL || level != 0 ||
-                   record.zi_func[0] != '\0' || record.zi_duration != 0) {
+                   record.zi_cmd != ZINJECT_UNINITIALIZED) {
                        (void) fprintf(stderr, "raw (-b) format with "
                            "any other options\n");
                        usage();
@@ -862,13 +874,14 @@ main(int argc, char **argv)
                        return (1);
                }
 
+               record.zi_cmd = ZINJECT_DATA_FAULT;
                if (translate_raw(raw, &record) != 0)
                        return (1);
                if (!error)
                        error = EIO;
-       } else if (record.zi_func[0] != '\0') {
+       } else if (record.zi_cmd == ZINJECT_PANIC) {
                if (raw != NULL || range != NULL || type != TYPE_INVAL ||
-                   level != 0 || device != NULL || record.zi_duration != 0) {
+                   level != 0 || device != NULL) {
                        (void) fprintf(stderr, "panic (-p) incompatible with "
                            "other options\n");
                        usage();
@@ -886,7 +899,7 @@ main(int argc, char **argv)
                if (argv[1] != NULL)
                        record.zi_type = atoi(argv[1]);
                dataset[0] = '\0';
-       } else if (record.zi_duration != 0) {
+       } else if (record.zi_cmd == ZINJECT_IGNORED_WRITES) {
                if (nowrites == 0) {
                        (void) fprintf(stderr, "-s or -g meaningless "
                            "without -I (ignore writes)\n");
@@ -940,6 +953,7 @@ main(int argc, char **argv)
                        return (1);
                }
 
+               record.zi_cmd = ZINJECT_DATA_FAULT;
                if (translate_record(type, argv[0], range, level, &record, pool,
                    dataset) != 0)
                        return (1);

Modified: stable/9/cddl/contrib/opensolaris/cmd/zpool/zpool.8
==============================================================================
--- stable/9/cddl/contrib/opensolaris/cmd/zpool/zpool.8 Sat Mar 16 05:40:29 
2013        (r248368)
+++ stable/9/cddl/contrib/opensolaris/cmd/zpool/zpool.8 Sat Mar 16 08:16:11 
2013        (r248369)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd November 15, 2012
+.Dd March 14, 2013
 .Dt ZPOOL 8
 .Os
 .Sh NAME
@@ -1608,14 +1608,15 @@ is specified, the command exits after
 .Ar count
 reports are printed.
 .Pp
-If a scrub or resilver is in progress, this command reports the percentage done
-and the estimated time to completion. Both of these are only approximate,
+If a scrub or resilver is in progress, this command reports the percentage
+done and the estimated time to completion. Both of these are only approximate,
 because the amount of data in the pool and the other workloads on the system
 can change.
 .Bl -tag -width indent
 .It Fl x
 Only display status for pools that are exhibiting errors or are otherwise
 unavailable.
+Warnings about pools not using the latest on-disk format will not be included.
 .It Fl v
 Displays verbose data error information, printing out a complete list of all
 data errors since the last complete pool scrub.

Modified: stable/9/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
==============================================================================
--- stable/9/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c    Sat Mar 16 
05:40:29 2013        (r248368)
+++ stable/9/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c    Sat Mar 16 
08:16:11 2013        (r248369)
@@ -4030,7 +4030,10 @@ status_callback(zpool_handle_t *zhp, voi
         * If we were given 'zpool status -x', only report those pools with
         * problems.
         */
-       if (reason == ZPOOL_STATUS_OK && cbp->cb_explain) {
+       if (cbp->cb_explain &&
+           (reason == ZPOOL_STATUS_OK ||
+           reason == ZPOOL_STATUS_VERSION_OLDER ||
+           reason == ZPOOL_STATUS_FEAT_DISABLED)) {
                if (!cbp->cb_allpools) {
                        (void) printf(gettext("pool '%s' is healthy\n"),
                            zpool_get_name(zhp));

Modified: stable/9/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_impl.h
==============================================================================
--- stable/9/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_impl.h   Sat Mar 
16 05:40:29 2013        (r248368)
+++ stable/9/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_impl.h   Sat Mar 
16 08:16:11 2013        (r248369)
@@ -24,6 +24,7 @@
  * Copyright (c) 2011 Pawel Jakub Dawidek <pa...@dawidek.net>.
  * All rights reserved.
  * Copyright (c) 2011 by Delphix. All rights reserved.
+ * Copyright (c) 2013 Martin Matuska <m...@freebsd.org>. All rights reserved.
  */
 
 #ifndef        _LIBFS_IMPL_H
@@ -216,6 +217,7 @@ extern void libzfs_fru_clear(libzfs_hand
 
 #ifndef sun
 static int zfs_kernel_version = 0;
+static int zfs_ioctl_version = 0;
 
 /*
  * This is FreeBSD version of ioctl, because Solaris' ioctl() updates
@@ -225,19 +227,34 @@ static int zfs_kernel_version = 0;
 static __inline int
 zcmd_ioctl(int fd, unsigned long cmd, zfs_cmd_t *zc)
 {
-       size_t oldsize, zfs_kernel_version_size;
+       size_t oldsize, zfs_kernel_version_size, zfs_ioctl_version_size;
        int version, ret, cflag = ZFS_CMD_COMPAT_NONE;
 
-       zfs_kernel_version_size = sizeof(zfs_kernel_version);
-       if (zfs_kernel_version == 0) {
-               sysctlbyname("vfs.zfs.version.spa", &zfs_kernel_version,
-                   &zfs_kernel_version_size, NULL, 0);
+       zfs_ioctl_version_size = sizeof(zfs_ioctl_version);
+       if (zfs_ioctl_version == 0) {
+               sysctlbyname("vfs.zfs.version.ioctl", &zfs_ioctl_version,
+                   &zfs_ioctl_version_size, NULL, 0);
        }
 
-       if (zfs_kernel_version == SPA_VERSION_15 ||
-           zfs_kernel_version == SPA_VERSION_14 ||
-           zfs_kernel_version == SPA_VERSION_13)
-               cflag = ZFS_CMD_COMPAT_V15;
+       /*
+        * If vfs.zfs.version.ioctl is not defined, assume we have v28
+        * compatible binaries and use vfs.zfs.version.spa to test for v15
+        */
+       if (zfs_ioctl_version < ZFS_IOCVER_DEADMAN) {
+               cflag = ZFS_CMD_COMPAT_V28;
+               zfs_kernel_version_size = sizeof(zfs_kernel_version);
+
+               if (zfs_kernel_version == 0) {
+                       sysctlbyname("vfs.zfs.version.spa",
+                           &zfs_kernel_version,
+                           &zfs_kernel_version_size, NULL, 0);
+               }
+
+               if (zfs_kernel_version == SPA_VERSION_15 ||
+                   zfs_kernel_version == SPA_VERSION_14 ||
+                   zfs_kernel_version == SPA_VERSION_13)
+                       cflag = ZFS_CMD_COMPAT_V15;
+       }
 
        oldsize = zc->zc_nvlist_dst_size;
        ret = zcmd_ioctl_compat(fd, cmd, zc, cflag);

Modified: stable/9/cddl/contrib/opensolaris/lib/libzpool/common/kernel.c
==============================================================================
--- stable/9/cddl/contrib/opensolaris/lib/libzpool/common/kernel.c      Sat Mar 
16 05:40:29 2013        (r248368)
+++ stable/9/cddl/contrib/opensolaris/lib/libzpool/common/kernel.c      Sat Mar 
16 08:16:11 2013        (r248369)
@@ -45,6 +45,9 @@ int aok;
 uint64_t physmem;
 vnode_t *rootdir = (vnode_t *)0xabcd1234;
 char hw_serial[HW_HOSTID_LEN];
+#ifdef illumos
+kmutex_t cpu_lock;
+#endif
 
 struct utsname utsname = {
        "userland", "libzpool", "1", "1", "na"
@@ -842,6 +845,28 @@ ddi_strtoull(const char *str, char **npt
        return (0);
 }
 
+#ifdef illumos
+/* ARGSUSED */
+cyclic_id_t
+cyclic_add(cyc_handler_t *hdlr, cyc_time_t *when)
+{
+       return (1);
+}
+
+/* ARGSUSED */
+void
+cyclic_remove(cyclic_id_t id)
+{
+}
+
+/* ARGSUSED */
+int
+cyclic_reprogram(cyclic_id_t id, hrtime_t expiration)
+{
+       return (1);
+}
+#endif
+
 /*
  * =========================================================================
  * kernel emulation setup & teardown
@@ -875,6 +900,10 @@ kernel_init(int mode)
 
        system_taskq_init();
 
+#ifdef illumos
+       mutex_init(&cpu_lock, NULL, MUTEX_DEFAULT, NULL);
+#endif
+
        spa_init(mode);
 }
 

Modified: 
stable/9/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h
==============================================================================
--- stable/9/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h     
Sat Mar 16 05:40:29 2013        (r248368)
+++ stable/9/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h     
Sat Mar 16 08:16:11 2013        (r248369)
@@ -465,6 +465,9 @@ extern vnode_t *rootdir;
 
 extern void delay(clock_t ticks);
 
+#define        SEC_TO_TICK(sec)        ((sec) * hz)
+#define        NSEC_TO_TICK(usec)      ((usec) / (NANOSEC / hz))
+
 #define        gethrestime_sec() time(NULL)
 #define        gethrestime(t) \
        do {\
@@ -632,6 +635,36 @@ typedef    uint32_t        idmap_rid_t;
 #define        ERESTART        (-1)
 #endif
 
+#ifdef illumos
+/*
+ * Cyclic information
+ */
+extern kmutex_t cpu_lock;
+
+typedef uintptr_t cyclic_id_t;
+typedef uint16_t cyc_level_t;
+typedef void (*cyc_func_t)(void *);
+
+#define        CY_LOW_LEVEL    0
+#define        CY_INFINITY     INT64_MAX
+#define        CYCLIC_NONE     ((cyclic_id_t)0)
+
+typedef struct cyc_time {
+       hrtime_t cyt_when;
+       hrtime_t cyt_interval;
+} cyc_time_t;
+
+typedef struct cyc_handler {
+       cyc_func_t cyh_func;
+       void *cyh_arg;
+       cyc_level_t cyh_level;
+} cyc_handler_t;
+
+extern cyclic_id_t cyclic_add(cyc_handler_t *, cyc_time_t *);
+extern void cyclic_remove(cyclic_id_t);
+extern int cyclic_reprogram(cyclic_id_t, hrtime_t);
+#endif /* illumos */
+
 #ifdef __cplusplus
 }
 #endif

Modified: stable/9/sys/cddl/compat/opensolaris/sys/time.h
==============================================================================
--- stable/9/sys/cddl/compat/opensolaris/sys/time.h     Sat Mar 16 05:40:29 
2013        (r248368)
+++ stable/9/sys/cddl/compat/opensolaris/sys/time.h     Sat Mar 16 08:16:11 
2013        (r248369)
@@ -46,6 +46,9 @@ typedef longlong_t    hrtime_t;
        ((ts)->tv_sec < INT64_MIN || (ts)->tv_sec > INT64_MAX)
 #endif
 
+#define        SEC_TO_TICK(sec)        ((sec) * hz)
+#define        NSEC_TO_TICK(usec)      ((usec) / (NANOSEC / hz))
+
 #ifdef _KERNEL
 static __inline hrtime_t
 gethrtime(void) {

Modified: stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.c Sat Mar 
16 05:40:29 2013        (r248368)
+++ stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.c Sat Mar 
16 08:16:11 2013        (r248369)
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2010 Martin Matuska <m...@freebsd.org>. All rights reserved.
+ * Copyright 2013 Martin Matuska <m...@freebsd.org>. All rights reserved.
  * Portions Copyright 2005, 2010, Oracle and/or its affiliates.
  * All rights reserved.
  * Use is subject to license terms.
@@ -35,22 +35,100 @@
 #include <sys/zfs_ioctl.h>
 #include "zfs_ioctl_compat.h"
 
+static int zfs_version_ioctl = ZFS_IOCVER_CURRENT;
+SYSCTL_DECL(_vfs_zfs_version);
+SYSCTL_INT(_vfs_zfs_version, OID_AUTO, ioctl, CTLFLAG_RD, &zfs_version_ioctl,
+    0, "ZFS_IOCTL_VERSION");
+
 /*
- * FreeBSD zfs_cmd compatibility with v15 and older binaries
+ * FreeBSD zfs_cmd compatibility with older binaries
  * appropriately remap/extend the zfs_cmd_t structure
  */
 void
 zfs_cmd_compat_get(zfs_cmd_t *zc, caddr_t addr, const int cflag)
 {
        zfs_cmd_v15_t *zc_c;
+       zfs_cmd_v28_t *zc28_c;
 
-       if (cflag == ZFS_CMD_COMPAT_V15) {
+       switch (cflag) {
+       case ZFS_CMD_COMPAT_V28:
+               zc28_c = (void *)addr;
+
+               /* zc */
+               strlcpy(zc->zc_name, zc28_c->zc_name, MAXPATHLEN);
+               strlcpy(zc->zc_value, zc28_c->zc_value, MAXPATHLEN * 2);
+               strlcpy(zc->zc_string, zc28_c->zc_string, MAXPATHLEN);
+               strlcpy(zc->zc_top_ds, zc28_c->zc_top_ds, MAXPATHLEN);
+               zc->zc_guid = zc28_c->zc_guid;
+               zc->zc_nvlist_conf = zc28_c->zc_nvlist_conf;
+               zc->zc_nvlist_conf_size = zc28_c->zc_nvlist_conf_size;
+               zc->zc_nvlist_src = zc28_c->zc_nvlist_src;
+               zc->zc_nvlist_src_size = zc28_c->zc_nvlist_src_size;
+               zc->zc_nvlist_dst = zc28_c->zc_nvlist_dst;
+               zc->zc_nvlist_dst_size = zc28_c->zc_nvlist_dst_size;
+               zc->zc_cookie = zc28_c->zc_cookie;
+               zc->zc_objset_type = zc28_c->zc_objset_type;
+               zc->zc_perm_action = zc28_c->zc_perm_action;
+               zc->zc_history = zc28_c->zc_history;
+               zc->zc_history_len = zc28_c->zc_history_len;
+               zc->zc_history_offset = zc28_c->zc_history_offset;
+               zc->zc_obj = zc28_c->zc_obj;
+               zc->zc_iflags = zc28_c->zc_iflags;
+               zc->zc_share = zc28_c->zc_share;
+               zc->zc_jailid = zc28_c->zc_jailid;
+               zc->zc_objset_stats = zc28_c->zc_objset_stats;
+               zc->zc_begin_record = zc28_c->zc_begin_record;
+               zc->zc_defer_destroy = zc28_c->zc_defer_destroy;
+               zc->zc_temphold = zc28_c->zc_temphold;
+               zc->zc_action_handle = zc28_c->zc_action_handle;
+               zc->zc_cleanup_fd = zc28_c->zc_cleanup_fd;
+               zc->zc_simple = zc28_c->zc_simple;
+               bcopy(zc28_c->zc_pad, zc->zc_pad, sizeof(zc->zc_pad));
+               zc->zc_sendobj = zc28_c->zc_sendobj;
+               zc->zc_fromobj = zc28_c->zc_fromobj;
+               zc->zc_createtxg = zc28_c->zc_createtxg;
+               zc->zc_stat = zc28_c->zc_stat;
+
+               /* zc->zc_inject_record */
+               zc->zc_inject_record.zi_objset =
+                   zc28_c->zc_inject_record.zi_objset;
+               zc->zc_inject_record.zi_object =
+                   zc28_c->zc_inject_record.zi_object;
+               zc->zc_inject_record.zi_start =
+                   zc28_c->zc_inject_record.zi_start;
+               zc->zc_inject_record.zi_end =
+                   zc28_c->zc_inject_record.zi_end;
+               zc->zc_inject_record.zi_guid =
+                   zc28_c->zc_inject_record.zi_guid;
+               zc->zc_inject_record.zi_level =
+                   zc28_c->zc_inject_record.zi_level;
+               zc->zc_inject_record.zi_error =
+                   zc28_c->zc_inject_record.zi_error;
+               zc->zc_inject_record.zi_type =
+                   zc28_c->zc_inject_record.zi_type;
+               zc->zc_inject_record.zi_freq =
+                   zc28_c->zc_inject_record.zi_freq;
+               zc->zc_inject_record.zi_failfast =
+                   zc28_c->zc_inject_record.zi_failfast;
+               strlcpy(zc->zc_inject_record.zi_func,
+                   zc28_c->zc_inject_record.zi_func, MAXNAMELEN);
+               zc->zc_inject_record.zi_iotype =
+                   zc28_c->zc_inject_record.zi_iotype;
+               zc->zc_inject_record.zi_duration =
+                   zc28_c->zc_inject_record.zi_duration;
+               zc->zc_inject_record.zi_timer =
+                   zc28_c->zc_inject_record.zi_timer;
+               zc->zc_inject_record.zi_cmd = ZINJECT_UNINITIALIZED;
+               zc->zc_inject_record.zi_pad = 0;
+               break;
+
+       case ZFS_CMD_COMPAT_V15:
                zc_c = (void *)addr;
 
                /* zc */
-               strlcpy(zc->zc_name,zc_c->zc_name,MAXPATHLEN);
-               strlcpy(zc->zc_value,zc_c->zc_value,MAXPATHLEN);
-               strlcpy(zc->zc_string,zc_c->zc_string,MAXPATHLEN);
+               strlcpy(zc->zc_name, zc_c->zc_name, MAXPATHLEN);
+               strlcpy(zc->zc_value, zc_c->zc_value, MAXPATHLEN);
+               strlcpy(zc->zc_string, zc_c->zc_string, MAXPATHLEN);
                zc->zc_guid = zc_c->zc_guid;
                zc->zc_nvlist_conf = zc_c->zc_nvlist_conf;
                zc->zc_nvlist_conf_size = zc_c->zc_nvlist_conf_size;
@@ -91,6 +169,7 @@ zfs_cmd_compat_get(zfs_cmd_t *zc, caddr_
                    zc_c->zc_inject_record.zi_freq;
                zc->zc_inject_record.zi_failfast =
                    zc_c->zc_inject_record.zi_failfast;
+               break;
        }
 }
 
@@ -98,15 +177,84 @@ void
 zfs_cmd_compat_put(zfs_cmd_t *zc, caddr_t addr, const int cflag)
 {
        zfs_cmd_v15_t *zc_c;
+       zfs_cmd_v28_t *zc28_c;
 
        switch (cflag) {
+       case ZFS_CMD_COMPAT_V28:
+               zc28_c = (void *)addr;
+
+               strlcpy(zc28_c->zc_name, zc->zc_name, MAXPATHLEN);
+               strlcpy(zc28_c->zc_value, zc->zc_value, MAXPATHLEN * 2);
+               strlcpy(zc28_c->zc_string, zc->zc_string, MAXPATHLEN);
+               strlcpy(zc28_c->zc_top_ds, zc->zc_top_ds, MAXPATHLEN);
+               zc28_c->zc_guid = zc->zc_guid;
+               zc28_c->zc_nvlist_conf = zc->zc_nvlist_conf;
+               zc28_c->zc_nvlist_conf_size = zc->zc_nvlist_conf_size;
+               zc28_c->zc_nvlist_src = zc->zc_nvlist_src;
+               zc28_c->zc_nvlist_src_size = zc->zc_nvlist_src_size;
+               zc28_c->zc_nvlist_dst = zc->zc_nvlist_dst;
+               zc28_c->zc_nvlist_dst_size = zc->zc_nvlist_dst_size;
+               zc28_c->zc_cookie = zc->zc_cookie;
+               zc28_c->zc_objset_type = zc->zc_objset_type;
+               zc28_c->zc_perm_action = zc->zc_perm_action;
+               zc28_c->zc_history = zc->zc_history;
+               zc28_c->zc_history_len = zc->zc_history_len;
+               zc28_c->zc_history_offset = zc->zc_history_offset;
+               zc28_c->zc_obj = zc->zc_obj;
+               zc28_c->zc_iflags = zc->zc_iflags;
+               zc28_c->zc_share = zc->zc_share;
+               zc28_c->zc_jailid = zc->zc_jailid;
+               zc28_c->zc_objset_stats = zc->zc_objset_stats;
+               zc28_c->zc_begin_record = zc->zc_begin_record;
+               zc28_c->zc_defer_destroy = zc->zc_defer_destroy;
+               zc28_c->zc_temphold = zc->zc_temphold;
+               zc28_c->zc_action_handle = zc->zc_action_handle;
+               zc28_c->zc_cleanup_fd = zc->zc_cleanup_fd;
+               zc28_c->zc_simple = zc->zc_simple;
+               bcopy(zc->zc_pad, zc28_c->zc_pad, sizeof(zc28_c->zc_pad));
+               zc28_c->zc_sendobj = zc->zc_sendobj;
+               zc28_c->zc_fromobj = zc->zc_fromobj;
+               zc28_c->zc_createtxg = zc->zc_createtxg;
+               zc28_c->zc_stat = zc->zc_stat;
+
+               /* zc_inject_record */
+               zc28_c->zc_inject_record.zi_objset =
+                   zc->zc_inject_record.zi_objset;
+               zc28_c->zc_inject_record.zi_object =
+                   zc->zc_inject_record.zi_object;
+               zc28_c->zc_inject_record.zi_start =
+                   zc->zc_inject_record.zi_start;
+               zc28_c->zc_inject_record.zi_end =
+                   zc->zc_inject_record.zi_end;
+               zc28_c->zc_inject_record.zi_guid =
+                   zc->zc_inject_record.zi_guid;
+               zc28_c->zc_inject_record.zi_level =
+                   zc->zc_inject_record.zi_level;
+               zc28_c->zc_inject_record.zi_error =
+                   zc->zc_inject_record.zi_error;
+               zc28_c->zc_inject_record.zi_type =
+                   zc->zc_inject_record.zi_type;
+               zc28_c->zc_inject_record.zi_freq =
+                   zc->zc_inject_record.zi_freq;
+               zc28_c->zc_inject_record.zi_failfast =
+                   zc->zc_inject_record.zi_failfast;
+               strlcpy(zc28_c->zc_inject_record.zi_func,
+                   zc->zc_inject_record.zi_func, MAXNAMELEN);
+               zc28_c->zc_inject_record.zi_iotype =
+                   zc->zc_inject_record.zi_iotype;
+               zc28_c->zc_inject_record.zi_duration =
+                   zc->zc_inject_record.zi_duration;
+               zc28_c->zc_inject_record.zi_timer =
+                   zc->zc_inject_record.zi_timer;
+               break;
+
        case ZFS_CMD_COMPAT_V15:
                zc_c = (void *)addr;
 
                /* zc */
-               strlcpy(zc_c->zc_name,zc->zc_name,MAXPATHLEN);
-               strlcpy(zc_c->zc_value,zc->zc_value,MAXPATHLEN);
-               strlcpy(zc_c->zc_string,zc->zc_string,MAXPATHLEN);
+               strlcpy(zc_c->zc_name, zc->zc_name, MAXPATHLEN);
+               strlcpy(zc_c->zc_value, zc->zc_value, MAXPATHLEN);
+               strlcpy(zc_c->zc_string, zc->zc_string, MAXPATHLEN);
                zc_c->zc_guid = zc->zc_guid;
                zc_c->zc_nvlist_conf = zc->zc_nvlist_conf;
                zc_c->zc_nvlist_conf_size = zc->zc_nvlist_conf_size;
@@ -260,7 +408,7 @@ zfs_ioctl_compat_fix_stats_nvlist(nvlist
 }
 
 static int
-zfs_ioctl_compat_fix_stats(zfs_cmd_t *zc, const int cflag)
+zfs_ioctl_compat_fix_stats(zfs_cmd_t *zc, const int nc)
 {
        nvlist_t *nv, *nvp = NULL;
        nvpair_t *elem;
@@ -270,7 +418,7 @@ zfs_ioctl_compat_fix_stats(zfs_cmd_t *zc
            zc->zc_nvlist_dst_size, zc->zc_iflags, &nv)) != 0)
                return (error);
 
-       if (cflag == 5) { /* ZFS_IOC_POOL_STATS */
+       if (nc == 5) { /* ZFS_IOC_POOL_STATS */
                elem = NULL;
                while ((elem = nvlist_next_nvpair(nv, elem)) != NULL) {
                        if (nvpair_value_nvlist(elem, &nvp) == 0)
@@ -334,17 +482,22 @@ zcmd_ioctl_compat(int fd, unsigned long 
        void *zc_c;
        unsigned long ncmd;
 
-       if (cflag == ZFS_CMD_COMPAT_NONE) {
+       switch (cflag) {
+       case ZFS_CMD_COMPAT_NONE:
                ret = ioctl(fd, cmd, zc);
                return (ret);
-       }
-
-       if (cflag == ZFS_CMD_COMPAT_V15) {
+       case ZFS_CMD_COMPAT_V28:
+               zc_c = malloc(sizeof(zfs_cmd_v28_t));
+               ncmd = _IOWR('Z', ZFS_IOC(cmd), struct zfs_cmd_v28);
+               break;
+       case ZFS_CMD_COMPAT_V15:
                nc = zfs_ioctl_v28_to_v15[ZFS_IOC(cmd)];
                zc_c = malloc(sizeof(zfs_cmd_v15_t));
                ncmd = _IOWR('Z', nc, struct zfs_cmd_v15);
-       } else
+               break;
+       default:
                return (EINVAL);
+       }
 
        if (ZFS_IOC(ncmd) == ZFS_IOC_COMPAT_FAIL)
                return (ENOTSUP);
@@ -358,16 +511,18 @@ zcmd_ioctl_compat(int fd, unsigned long 
        zfs_cmd_compat_get(zc, (caddr_t)zc_c, cflag);
        free(zc_c);
 
-       switch (nc) {
-       case 2: /* ZFS_IOC_POOL_IMPORT */
-       case 4: /* ZFS_IOC_POOL_CONFIGS */
-       case 5: /* ZFS_IOC_POOL_STATS */
-       case 6: /* ZFS_IOC_POOL_TRYIMPORT */
-               zfs_ioctl_compat_fix_stats(zc, nc);
-               break;
-       case 41: /* ZFS_IOC_POOL_GET_PROPS (v15) */
-               zfs_ioctl_compat_pool_get_props(zc);
-               break;
+       if (cflag == ZFS_CMD_COMPAT_V15) {
+               switch (nc) {
+               case 2: /* ZFS_IOC_POOL_IMPORT */
+               case 4: /* ZFS_IOC_POOL_CONFIGS */
+               case 5: /* ZFS_IOC_POOL_STATS */
+               case 6: /* ZFS_IOC_POOL_TRYIMPORT */
+                       zfs_ioctl_compat_fix_stats(zc, nc);
+                       break;
+               case 41: /* ZFS_IOC_POOL_GET_PROPS (v15) */
+                       zfs_ioctl_compat_pool_get_props(zc);
+                       break;
+               }
        }
 
        return (ret);

Modified: stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.h
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.h Sat Mar 
16 05:40:29 2013        (r248368)
+++ stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_ioctl_compat.h Sat Mar 
16 08:16:11 2013        (r248369)
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2010 Martin Matuska <m...@freebsd.org>.  All rights reserved.
+ * Copyright 2013 Martin Matuska <m...@freebsd.org>.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -40,11 +40,21 @@
 extern "C" {
 #endif
 
-#define ZFS_CMD_COMPAT_NONE    0
+/*
+ * Backwards ioctl compatibility
+ */
+
+/* ioctl versions for vfs.zfs.version.ioctl */
+#define        ZFS_IOCVER_DEADMAN      1
+#define        ZFS_IOCVER_CURRENT      ZFS_IOCVER_DEADMAN
+
+/* compatibility conversion flag */
+#define        ZFS_CMD_COMPAT_NONE     0
 #define        ZFS_CMD_COMPAT_V15      1
+#define        ZFS_CMD_COMPAT_V28      2
 
-#define ZFS_IOC_COMPAT_PASS    254
-#define ZFS_IOC_COMPAT_FAIL    255
+#define        ZFS_IOC_COMPAT_PASS     254
+#define        ZFS_IOC_COMPAT_FAIL     255
 
 typedef struct zinject_record_v15 {
        uint64_t        zi_objset;
@@ -84,6 +94,60 @@ typedef struct zfs_cmd_v15 {
        zinject_record_v15_t zc_inject_record;
 } zfs_cmd_v15_t;
 
+typedef struct zinject_record_v28 {
+       uint64_t        zi_objset;
+       uint64_t        zi_object;
+       uint64_t        zi_start;
+       uint64_t        zi_end;
+       uint64_t        zi_guid;
+       uint32_t        zi_level;
+       uint32_t        zi_error;
+       uint64_t        zi_type;
+       uint32_t        zi_freq;
+       uint32_t        zi_failfast;
+       char            zi_func[MAXNAMELEN];
+       uint32_t        zi_iotype;
+       int32_t         zi_duration;
+       uint64_t        zi_timer;
+} zinject_record_v28_t;
+
+typedef struct zfs_cmd_v28 {
+       char            zc_name[MAXPATHLEN];
+       char            zc_value[MAXPATHLEN * 2];
+       char            zc_string[MAXNAMELEN];
+       char            zc_top_ds[MAXPATHLEN];
+       uint64_t        zc_guid;
+       uint64_t        zc_nvlist_conf;         /* really (char *) */
+       uint64_t        zc_nvlist_conf_size;
+       uint64_t        zc_nvlist_src;          /* really (char *) */
+       uint64_t        zc_nvlist_src_size;
+       uint64_t        zc_nvlist_dst;          /* really (char *) */
+       uint64_t        zc_nvlist_dst_size;
+       uint64_t        zc_cookie;
+       uint64_t        zc_objset_type;
+       uint64_t        zc_perm_action;
+       uint64_t        zc_history;             /* really (char *) */
+       uint64_t        zc_history_len;
+       uint64_t        zc_history_offset;
+       uint64_t        zc_obj;
+       uint64_t        zc_iflags;              /* internal to zfs(7fs) */
+       zfs_share_t     zc_share;
+       uint64_t        zc_jailid;
+       dmu_objset_stats_t zc_objset_stats;
+       struct drr_begin zc_begin_record;
+       zinject_record_v28_t zc_inject_record;
+       boolean_t       zc_defer_destroy;
+       boolean_t       zc_temphold;
+       uint64_t        zc_action_handle;
+       int             zc_cleanup_fd;
+       uint8_t         zc_simple;
+       uint8_t         zc_pad[3];              /* alignment */
+       uint64_t        zc_sendobj;
+       uint64_t        zc_fromobj;
+       uint64_t        zc_createtxg;
+       zfs_stat_t      zc_stat;
+} zfs_cmd_v28_t;
+
 #ifdef _KERNEL
 unsigned static long zfs_ioctl_v15_to_v28[] = {
        0,      /*  0 ZFS_IOC_POOL_CREATE */

Modified: stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c Sat Mar 16 
05:40:29 2013        (r248368)
+++ stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c Sat Mar 16 
08:16:11 2013        (r248369)
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2011 by Delphix. All rights reserved.
+ * Copyright (c) 2012 by Delphix. All rights reserved.
  * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
  */
 
@@ -350,6 +350,10 @@ zfs_prop_init(void)
            ZFS_TYPE_SNAPSHOT, "<count>", "USERREFS");
        zprop_register_number(ZFS_PROP_WRITTEN, "written", 0, PROP_READONLY,
            ZFS_TYPE_DATASET, "<size>", "WRITTEN");
+       zprop_register_number(ZFS_PROP_LOGICALUSED, "logicalused", 0,
+           PROP_READONLY, ZFS_TYPE_DATASET, "<size>", "LUSED");
+       zprop_register_number(ZFS_PROP_LOGICALREFERENCED, "logicalreferenced",
+           0, PROP_READONLY, ZFS_TYPE_DATASET, "<size>", "LREFER");
 
        /* default number properties */
        zprop_register_number(ZFS_PROP_QUOTA, "quota", 0, PROP_DEFAULT,

Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c       Sat Mar 
16 05:40:29 2013        (r248368)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c       Sat Mar 
16 08:16:11 2013        (r248369)
@@ -2973,7 +2973,7 @@ arc_read(zio_t *pio, spa_t *spa, const b
     const zbookmark_t *zb)
 {
        arc_buf_hdr_t *hdr;
-       arc_buf_t *buf;

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to