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;