19 * CDDL HEADER END |
19 * CDDL HEADER END |
20 */ |
20 */ |
21 /* |
21 /* |
22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. |
22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. |
23 * Copyright (c) 2013 by Delphix. All rights reserved. |
23 * Copyright (c) 2013 by Delphix. All rights reserved. |
|
24 * Copyright (c) 2013 Martin Matuska. All rights reserved. |
24 */ |
25 */ |
25 |
26 |
26 #include <sys/dmu.h> |
27 #include <sys/dmu.h> |
27 #include <sys/dmu_objset.h> |
28 #include <sys/dmu_objset.h> |
28 #include <sys/dmu_tx.h> |
29 #include <sys/dmu_tx.h> |
965 dsl_dataset_t *ds; |
966 dsl_dataset_t *ds; |
966 uint64_t newval; |
967 uint64_t newval; |
967 |
968 |
968 VERIFY0(dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds)); |
969 VERIFY0(dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds)); |
969 |
970 |
970 dsl_prop_set_sync_impl(ds, zfs_prop_to_name(ZFS_PROP_QUOTA), |
971 if (spa_version(dp->dp_spa) >= SPA_VERSION_RECVD_PROPS) { |
971 ddsqra->ddsqra_source, sizeof (ddsqra->ddsqra_value), 1, |
972 dsl_prop_set_sync_impl(ds, zfs_prop_to_name(ZFS_PROP_QUOTA), |
972 &ddsqra->ddsqra_value, tx); |
973 ddsqra->ddsqra_source, sizeof (ddsqra->ddsqra_value), 1, |
973 |
974 &ddsqra->ddsqra_value, tx); |
974 VERIFY0(dsl_prop_get_int_ds(ds, |
975 |
975 zfs_prop_to_name(ZFS_PROP_QUOTA), &newval)); |
976 VERIFY0(dsl_prop_get_int_ds(ds, |
|
977 zfs_prop_to_name(ZFS_PROP_QUOTA), &newval)); |
|
978 } else { |
|
979 newval = ddsqra->ddsqra_value; |
|
980 spa_history_log_internal_ds(ds, "set", tx, "%s=%lld", |
|
981 zfs_prop_to_name(ZFS_PROP_QUOTA), (longlong_t)newval); |
|
982 } |
976 |
983 |
977 dmu_buf_will_dirty(ds->ds_dir->dd_dbuf, tx); |
984 dmu_buf_will_dirty(ds->ds_dir->dd_dbuf, tx); |
978 mutex_enter(&ds->ds_dir->dd_lock); |
985 mutex_enter(&ds->ds_dir->dd_lock); |
979 ds->ds_dir->dd_phys->dd_quota = newval; |
986 ds->ds_dir->dd_phys->dd_quota = newval; |
980 mutex_exit(&ds->ds_dir->dd_lock); |
987 mutex_exit(&ds->ds_dir->dd_lock); |
1081 dsl_dataset_t *ds; |
1088 dsl_dataset_t *ds; |
1082 uint64_t newval; |
1089 uint64_t newval; |
1083 |
1090 |
1084 VERIFY0(dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds)); |
1091 VERIFY0(dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds)); |
1085 |
1092 |
1086 dsl_prop_set_sync_impl(ds, zfs_prop_to_name(ZFS_PROP_RESERVATION), |
1093 if (spa_version(dp->dp_spa) >= SPA_VERSION_RECVD_PROPS) { |
1087 ddsqra->ddsqra_source, sizeof (ddsqra->ddsqra_value), 1, |
1094 dsl_prop_set_sync_impl(ds, |
1088 &ddsqra->ddsqra_value, tx); |
1095 zfs_prop_to_name(ZFS_PROP_RESERVATION), |
1089 |
1096 ddsqra->ddsqra_source, sizeof (ddsqra->ddsqra_value), 1, |
1090 VERIFY0(dsl_prop_get_int_ds(ds, |
1097 &ddsqra->ddsqra_value, tx); |
1091 zfs_prop_to_name(ZFS_PROP_RESERVATION), &newval)); |
1098 |
|
1099 VERIFY0(dsl_prop_get_int_ds(ds, |
|
1100 zfs_prop_to_name(ZFS_PROP_RESERVATION), &newval)); |
|
1101 } else { |
|
1102 newval = ddsqra->ddsqra_value; |
|
1103 spa_history_log_internal_ds(ds, "set", tx, "%s=%lld", |
|
1104 zfs_prop_to_name(ZFS_PROP_RESERVATION), |
|
1105 (longlong_t)newval); |
|
1106 } |
1092 |
1107 |
1093 dsl_dir_set_reservation_sync_impl(ds->ds_dir, newval, tx); |
1108 dsl_dir_set_reservation_sync_impl(ds->ds_dir, newval, tx); |
1094 dsl_dataset_rele(ds, FTAG); |
1109 dsl_dataset_rele(ds, FTAG); |
1095 } |
1110 } |
1096 |
1111 |