+/*
+ * 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,
+ zap_cursor_t *zc, char *buf,
+ int buf_size, int *bytes_read)
+{
+ zap_attribute_t *za = &osd_oti_get(env)->oti_za;
+ 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;
+ }
+
+ rc = -zap_lookup(zc->zc_objset, zc->zc_zapobj,
+ za->za_name, za->za_integer_length,
+ buf_size, buf);
+
+ if (likely(rc == 0))
+ *bytes_read = actual_size;
+
+ return rc;
+}
+