+static int get_dir_name_by_number(uint64_t *dirnum, char **name)
+{
+ char *result = NULL, *tmp;
+ struct osl_row *row;
+ uint64_t val = *dirnum;
+ struct osl_object obj = {.data = &val, .size = sizeof(val)};
+ int ret;
+
+again:
+ ret = osl(osl_get_row(dir_table, DT_NUM, &obj, &row));
+ if (ret < 0)
+ goto out;
+ ret = osl(osl_get_object(dir_table, row, DT_NAME, &obj));
+ if (ret < 0)
+ goto out;
+ if (result) {
+ tmp = make_message("%s/%s", (char *)obj.data, result);
+ free(result);
+ result = tmp;
+ } else
+ result = para_strdup((char *)obj.data);
+ ret = osl(osl_get_object(dir_table, row, DT_PARENT_NUM, &obj));
+ if (ret < 0)
+ goto out;
+ val = *(uint64_t *)obj.data;
+ if (val)
+ goto again;
+out:
+ if (ret < 0) {
+ free(result);
+ *name = NULL;
+ } else
+ *name = result;
+ return ret;
+}
+
+static int get_dir_name_of_row(struct osl_row *dir_table_row, char **name)