diff --git a/cmd/zfs/zfs_main.c b/cmd/zfs/zfs_main.c
index 234937340..d6935d103 100644
--- a/cmd/zfs/zfs_main.c
+++ b/cmd/zfs/zfs_main.c
@@ -2986,7 +2986,8 @@ us_type2str(unsigned field_type)
}
static int
-userspace_cb(void *arg, const char *domain, uid_t rid, uint64_t space)
+userspace_cb(void *arg, const char *domain, uid_t rid, uint64_t space,
+ uint64_t default_quota)
{
us_cbdata_t *cb = (us_cbdata_t *)arg;
zfs_userquota_prop_t prop = cb->cb_prop;
@@ -3142,7 +3143,7 @@ userspace_cb(void *arg, const char *domain, uid_t rid, uint64_t space)
prop == ZFS_PROP_PROJECTUSED) {
propname = "used";
if (!nvlist_exists(props, "quota"))
- (void) nvlist_add_uint64(props, "quota", 0);
+ (void) nvlist_add_uint64(props, "quota", default_quota);
} else if (prop == ZFS_PROP_USERQUOTA || prop == ZFS_PROP_GROUPQUOTA ||
prop == ZFS_PROP_PROJECTQUOTA) {
propname = "quota";
@@ -3151,8 +3152,10 @@ userspace_cb(void *arg, const char *domain, uid_t rid, uint64_t space)
} else if (prop == ZFS_PROP_USEROBJUSED ||
prop == ZFS_PROP_GROUPOBJUSED || prop == ZFS_PROP_PROJECTOBJUSED) {
propname = "objused";
- if (!nvlist_exists(props, "objquota"))
- (void) nvlist_add_uint64(props, "objquota", 0);
+ if (!nvlist_exists(props, "objquota")) {
+ (void) nvlist_add_uint64(props, "objquota",
+ default_quota);
+ }
} else if (prop == ZFS_PROP_USEROBJQUOTA ||
prop == ZFS_PROP_GROUPOBJQUOTA ||
prop == ZFS_PROP_PROJECTOBJQUOTA) {
diff --git a/include/libzfs.h b/include/libzfs.h
index 8774d490f..c3b3542bc 100644
--- a/include/libzfs.h
+++ b/include/libzfs.h
@@ -853,7 +853,7 @@ _LIBZFS_H uint64_t zvol_volsize_to_reservation(zpool_handle_t *, uint64_t,
nvlist_t *);
typedef int (*zfs_userspace_cb_t)(void *arg, const char *domain,
- uid_t rid, uint64_t space);
+ uid_t rid, uint64_t space, uint64_t default_quota);
_LIBZFS_H int zfs_userspace(zfs_handle_t *, zfs_userquota_prop_t,
zfs_userspace_cb_t, void *);
diff --git a/include/sys/zfs_quota.h b/include/sys/zfs_quota.h
index f12a0f2db..62389cd2f 100644
--- a/include/sys/zfs_quota.h
+++ b/include/sys/zfs_quota.h
@@ -35,7 +35,7 @@ extern int zpl_get_file_info(dmu_object_type_t,
extern int zfs_userspace_one(struct zfsvfs *, zfs_userquota_prop_t,
const char *, uint64_t, uint64_t *);
extern int zfs_userspace_many(struct zfsvfs *, zfs_userquota_prop_t,
- uint64_t *, void *, uint64_t *);
+ uint64_t *, void *, uint64_t *, uint64_t *);
extern int zfs_set_userquota(struct zfsvfs *, zfs_userquota_prop_t,
const char *, uint64_t, uint64_t);
diff --git a/lib/libzfs/libzfs.abi b/lib/libzfs/libzfs.abi
index 12496b083..7e6a9211b 100644
--- a/lib/libzfs/libzfs.abi
+++ b/lib/libzfs/libzfs.abi
@@ -3879,7 +3879,7 @@
-
+
@@ -4074,7 +4074,7 @@
-
+
@@ -5019,11 +5019,12 @@
-
+
+
diff --git a/lib/libzfs/libzfs_dataset.c b/lib/libzfs/libzfs_dataset.c
index f0d8c1953..6a99b0575 100644
--- a/lib/libzfs/libzfs_dataset.c
+++ b/lib/libzfs/libzfs_dataset.c
@@ -4966,7 +4966,7 @@ zfs_userspace(zfs_handle_t *zhp, zfs_userquota_prop_t type,
while (zc.zc_nvlist_dst_size > 0) {
if ((ret = func(arg, zua->zu_domain, zua->zu_rid,
- zua->zu_space)) != 0)
+ zua->zu_space, zc.zc_guid)) != 0)
return (ret);
zua++;
zc.zc_nvlist_dst_size -= sizeof (zfs_useracct_t);
diff --git a/module/zfs/zfs_ioctl.c b/module/zfs/zfs_ioctl.c
index bd92025aa..c37d8a1c0 100644
--- a/module/zfs/zfs_ioctl.c
+++ b/module/zfs/zfs_ioctl.c
@@ -6350,7 +6350,7 @@ zfs_ioc_userspace_many(zfs_cmd_t *zc)
void *buf = vmem_alloc(bufsize, KM_SLEEP);
error = zfs_userspace_many(zfsvfs, zc->zc_objset_type, &zc->zc_cookie,
- buf, &zc->zc_nvlist_dst_size);
+ buf, &zc->zc_nvlist_dst_size, &zc->zc_guid);
if (error == 0) {
error = xcopyout(buf,
diff --git a/module/zfs/zfs_quota.c b/module/zfs/zfs_quota.c
index f534dec58..b8fe512d4 100644
--- a/module/zfs/zfs_quota.c
+++ b/module/zfs/zfs_quota.c
@@ -160,9 +160,31 @@ zfs_userquota_prop_to_obj(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type)
}
}
+static uint64_t
+zfs_usedquota_prop_to_default(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type)
+{
+ switch (type) {
+ case ZFS_PROP_USERUSED:
+ return (zfsvfs->z_defaultuserquota);
+ case ZFS_PROP_USEROBJUSED:
+ return (zfsvfs->z_defaultuserobjquota);
+ case ZFS_PROP_GROUPUSED:
+ return (zfsvfs->z_defaultgroupquota);
+ case ZFS_PROP_GROUPOBJUSED:
+ return (zfsvfs->z_defaultgroupobjquota);
+ case ZFS_PROP_PROJECTUSED:
+ return (zfsvfs->z_defaultprojectquota);
+ case ZFS_PROP_PROJECTOBJUSED:
+ return (zfsvfs->z_defaultprojectobjquota);
+ default:
+ return (0);
+ }
+}
+
int
zfs_userspace_many(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type,
- uint64_t *cookiep, void *vbuf, uint64_t *bufsizep)
+ uint64_t *cookiep, void *vbuf, uint64_t *bufsizep,
+ uint64_t *default_quota)
{
int error;
zap_cursor_t zc;
@@ -187,6 +209,8 @@ zfs_userspace_many(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type,
!dmu_objset_userobjspace_present(zfsvfs->z_os))
return (SET_ERROR(ENOTSUP));
+ *default_quota = zfs_usedquota_prop_to_default(zfsvfs, type);
+
obj = zfs_userquota_prop_to_obj(zfsvfs, type);
if (obj == ZFS_NO_OBJECT) {
*bufsizep = 0;