Print this page
NEX-5366 Race between unique_insert() and unique_remove() causes ZFS fsid change
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Dan Vatca <dan.vatca@gmail.com>
6160 /usr/lib/fs/zfs/bootinstall should use bootadm
Reviewed by: Igor Kozhukhov <ikozhukhov@gmail.com>
Reviewed by: Adam Števko <adam.stevko@gmail.com>
Reviewed by: Josef Sipek <jeffpc@josefsipek.net>
Approved by: Richard Lowe <richlowe@richlowe.net>
4185 add new cryptographic checksums to ZFS: SHA-512, Skein, Edon-R (NULL is not an int)
6171 dsl_prop_unregister() slows down dataset eviction.
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Approved by: Dan McDonald <danmcd@omniti.com>
5610 zfs clone from different source and target pools produces coredump
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Approved by: Dan McDonald <danmcd@omniti.com>
re #12585 rb4049 ZFS++ work port - refactoring to improve separation of open/closed code, bug fixes, performance improvements - open code

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/zfs/dsl_dir.c
          +++ new/usr/src/uts/common/fs/zfs/dsl_dir.c
↓ open down ↓ 119 lines elided ↑ open up ↑
 120  120   * never update the filesystem counts for temporary clones.
 121  121   *
 122  122   * Likewise, we do not update the snapshot counts for temporary snapshots,
 123  123   * such as those created by zfs diff.
 124  124   */
 125  125  
 126  126  extern inline dsl_dir_phys_t *dsl_dir_phys(dsl_dir_t *dd);
 127  127  
 128  128  static uint64_t dsl_dir_space_towrite(dsl_dir_t *dd);
 129  129  
 130      -typedef struct ddulrt_arg {
 131      -        dsl_dir_t       *ddulrta_dd;
 132      -        uint64_t        ddlrta_txg;
 133      -} ddulrt_arg_t;
 134      -
 135  130  static void
 136  131  dsl_dir_evict_async(void *dbu)
 137  132  {
 138  133          dsl_dir_t *dd = dbu;
 139  134          dsl_pool_t *dp = dd->dd_pool;
 140  135          int t;
 141  136  
 142  137          dd->dd_dbuf = NULL;
 143  138  
 144  139          for (t = 0; t < TXG_SIZE; t++) {
↓ open down ↓ 582 lines elided ↑ open up ↑
 727  722                  enforce = ENFORCE_ALWAYS;
 728  723          } else {
 729  724                  if (dsl_deleg_access_impl(ds, zfs_prop_to_name(prop), cr) == 0)
 730  725                          enforce = ENFORCE_ABOVE;
 731  726          }
 732  727  
 733  728          dsl_dataset_rele(ds, FTAG);
 734  729          return (enforce);
 735  730  }
 736  731  
 737      -static void
 738      -dsl_dir_update_last_remap_txg_sync(void *varg, dmu_tx_t *tx)
 739      -{
 740      -        ddulrt_arg_t *arg = varg;
 741      -        uint64_t last_remap_txg;
 742      -        dsl_dir_t *dd = arg->ddulrta_dd;
 743      -        objset_t *mos = dd->dd_pool->dp_meta_objset;
 744      -
 745      -        dsl_dir_zapify(dd, tx);
 746      -        if (zap_lookup(mos, dd->dd_object, DD_FIELD_LAST_REMAP_TXG,
 747      -            sizeof (last_remap_txg), 1, &last_remap_txg) != 0 ||
 748      -            last_remap_txg < arg->ddlrta_txg) {
 749      -                VERIFY0(zap_update(mos, dd->dd_object, DD_FIELD_LAST_REMAP_TXG,
 750      -                    sizeof (arg->ddlrta_txg), 1, &arg->ddlrta_txg, tx));
 751      -        }
 752      -}
 753      -
 754      -int
 755      -dsl_dir_update_last_remap_txg(dsl_dir_t *dd, uint64_t txg)
 756      -{
 757      -        ddulrt_arg_t arg;
 758      -        arg.ddulrta_dd = dd;
 759      -        arg.ddlrta_txg = txg;
 760      -
 761      -        return (dsl_sync_task(spa_name(dd->dd_pool->dp_spa),
 762      -            NULL, dsl_dir_update_last_remap_txg_sync, &arg,
 763      -            1, ZFS_SPACE_CHECK_RESERVED));
 764      -}
 765      -
 766  732  /*
 767  733   * Check if adding additional child filesystem(s) would exceed any filesystem
 768  734   * limits or adding additional snapshot(s) would exceed any snapshot limits.
 769  735   * The prop argument indicates which limit to check.
 770  736   *
 771  737   * Note that all filesystem limits up to the root (or the highest
 772  738   * initialized) filesystem or the given ancestor must be satisfied.
 773  739   */
 774  740  int
 775  741  dsl_fs_ss_limit_check(dsl_dir_t *dd, uint64_t delta, zfs_prop_t prop,
↓ open down ↓ 271 lines elided ↑ open up ↑
1047 1013  {
1048 1014          if (dsl_dir_is_zapified(dd)) {
1049 1015                  objset_t *os = dd->dd_pool->dp_meta_objset;
1050 1016                  return (zap_lookup(os, dd->dd_object, DD_FIELD_SNAPSHOT_COUNT,
1051 1017                      sizeof (*count), 1, count));
1052 1018          } else {
1053 1019                  return (ENOENT);
1054 1020          }
1055 1021  }
1056 1022  
1057      -int
1058      -dsl_dir_get_remaptxg(dsl_dir_t *dd, uint64_t *count)
1059      -{
1060      -        if (dsl_dir_is_zapified(dd)) {
1061      -                objset_t *os = dd->dd_pool->dp_meta_objset;
1062      -                return (zap_lookup(os, dd->dd_object, DD_FIELD_LAST_REMAP_TXG,
1063      -                    sizeof (*count), 1, count));
1064      -        } else {
1065      -                return (ENOENT);
1066      -        }
1067      -}
1068      -
1069 1023  void
1070 1024  dsl_dir_stats(dsl_dir_t *dd, nvlist_t *nv)
1071 1025  {
1072 1026          mutex_enter(&dd->dd_lock);
1073 1027          dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_QUOTA,
1074 1028              dsl_dir_get_quota(dd));
1075 1029          dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_RESERVATION,
1076 1030              dsl_dir_get_reservation(dd));
1077 1031          dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_LOGICALUSED,
1078 1032              dsl_dir_get_logicalused(dd));
↓ open down ↓ 11 lines elided ↑ open up ↑
1090 1044  
1091 1045          uint64_t count;
1092 1046          if (dsl_dir_get_filesystem_count(dd, &count) == 0) {
1093 1047                  dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_FILESYSTEM_COUNT,
1094 1048                      count);
1095 1049          }
1096 1050          if (dsl_dir_get_snapshot_count(dd, &count) == 0) {
1097 1051                  dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_SNAPSHOT_COUNT,
1098 1052                      count);
1099 1053          }
1100      -        if (dsl_dir_get_remaptxg(dd, &count) == 0) {
1101      -                dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_REMAPTXG,
1102      -                    count);
1103      -        }
1104 1054  
1105 1055          if (dsl_dir_is_clone(dd)) {
1106 1056                  char buf[ZFS_MAX_DATASET_NAME_LEN];
1107 1057                  dsl_dir_get_origin(dd, buf);
1108 1058                  dsl_prop_nvlist_add_string(nv, ZFS_PROP_ORIGIN, buf);
1109 1059          }
1110 1060  
1111 1061  }
1112 1062  
1113 1063  void
↓ open down ↓ 997 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX