+/*
+ * zap_cursor_retrieve read from current record.
+ * to read bytes we need to call zap_lookup explicitly.
+ */
+static int osd_zap_cursor_retrieve_value(const struct lu_env *env,
+ struct osd_it_quota *it,
+ char *buf, int buf_size,
+ int *bytes_read)
+{
+ const struct lu_fid *fid = lu_object_fid(&it->oiq_obj->oo_dt.do_lu);
+ zap_attribute_t *za = &osd_oti_get(env)->oti_za;
+ zap_cursor_t *zc = it->oiq_zc;
+ struct osd_device *osd = osd_obj2dev(it->oiq_obj);
+ int rc, actual_size;
+
+ rc = -zap_cursor_retrieve(zc, za);
+ if (unlikely(rc != 0))
+ return rc;
+
+ if (unlikely(za->za_integer_length <= 0))
+ return -ERANGE;
+
+ actual_size = za->za_integer_length * za->za_num_integers;
+
+ if (actual_size > buf_size) {
+ actual_size = buf_size;
+ buf_size = actual_size / za->za_integer_length;
+ } else {
+ buf_size = za->za_num_integers;
+ }
+
+ /* use correct special ID to request bytes used */
+ rc = osd_zap_lookup(osd, fid_oid(fid) == ACCT_GROUP_OID ?
+ DMU_GROUPUSED_OBJECT : DMU_USERUSED_OBJECT, NULL,
+ za->za_name, za->za_integer_length, buf_size, buf);
+ if (likely(rc == 0))
+ *bytes_read = actual_size;
+
+ return rc;
+}
+