]> git.proxmox.com Git - mirror_zfs.git/blobdiff - module/zfs/vdev.c
Create zap for root vdev
[mirror_zfs.git] / module / zfs / vdev.c
index 241be8fd856c23e9bb67f3687e715d6863269ea6..4bfd95861e02659a75c1be04b1b7ffd5a8ae0788 100644 (file)
@@ -397,7 +397,9 @@ vdev_prop_get_int(vdev_t *vd, vdev_prop_t prop, uint64_t *value)
        uint64_t objid;
        int err;
 
-       if (vd->vdev_top_zap != 0) {
+       if (vd->vdev_root_zap != 0) {
+               objid = vd->vdev_root_zap;
+       } else if (vd->vdev_top_zap != 0) {
                objid = vd->vdev_top_zap;
        } else if (vd->vdev_leaf_zap != 0) {
                objid = vd->vdev_leaf_zap;
@@ -898,6 +900,14 @@ vdev_alloc(spa_t *spa, vdev_t **vdp, nvlist_t *nv, vdev_t *parent, uint_t id,
        (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_CREATE_TXG,
            &vd->vdev_crtxg);
 
+       if (vd->vdev_ops == &vdev_root_ops &&
+           (alloctype == VDEV_ALLOC_LOAD ||
+           alloctype == VDEV_ALLOC_SPLIT ||
+           alloctype == VDEV_ALLOC_ROOTPOOL)) {
+               (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_VDEV_ROOT_ZAP,
+                   &vd->vdev_root_zap);
+       }
+
        /*
         * If we're a top-level vdev, try to load the allocation parameters.
         */
@@ -3347,6 +3357,12 @@ vdev_construct_zaps(vdev_t *vd, dmu_tx_t *tx)
                                vdev_zap_allocation_data(vd, tx);
                }
        }
+       if (vd->vdev_ops == &vdev_root_ops && vd->vdev_root_zap == 0 &&
+           spa_feature_is_enabled(vd->vdev_spa, SPA_FEATURE_AVZ_V2)) {
+               if (!spa_feature_is_active(vd->vdev_spa, SPA_FEATURE_AVZ_V2))
+                       spa_feature_incr(vd->vdev_spa, SPA_FEATURE_AVZ_V2, tx);
+               vd->vdev_root_zap = vdev_create_link_zap(vd, tx);
+       }
 
        for (uint64_t i = 0; i < vd->vdev_children; i++) {
                vdev_construct_zaps(vd->vdev_child[i], tx);
@@ -5683,12 +5699,17 @@ vdev_props_set_sync(void *arg, dmu_tx_t *tx)
                /*
                 * Set vdev property values in the vdev props mos object.
                 */
-               if (vd->vdev_top_zap != 0) {
+               if (vd->vdev_root_zap != 0) {
+                       objid = vd->vdev_root_zap;
+               } else if (vd->vdev_top_zap != 0) {
                        objid = vd->vdev_top_zap;
                } else if (vd->vdev_leaf_zap != 0) {
                        objid = vd->vdev_leaf_zap;
                } else {
-                       panic("vdev not top or leaf");
+                       /*
+                        * XXX: implement vdev_props_set_check()
+                        */
+                       panic("vdev not root/top/leaf");
                }
 
                switch (prop = vdev_name_to_prop(propname)) {
@@ -5891,7 +5912,9 @@ vdev_prop_get(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl)
 
        nvlist_lookup_nvlist(innvl, ZPOOL_VDEV_PROPS_GET_PROPS, &nvprops);
 
-       if (vd->vdev_top_zap != 0) {
+       if (vd->vdev_root_zap != 0) {
+               objid = vd->vdev_root_zap;
+       } else if (vd->vdev_top_zap != 0) {
                objid = vd->vdev_top_zap;
        } else if (vd->vdev_leaf_zap != 0) {
                objid = vd->vdev_leaf_zap;