From: Vitaliy Kuznetsov Date: Wed, 29 May 2024 15:00:30 +0000 (+0200) Subject: EX-9121 lipe: Trivial improvements for report merging X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=59250ca07a079a5f213e80543543fd392f5d34ea;p=fs%2Flustre-release.git EX-9121 lipe: Trivial improvements for report merging Small changes that do not affect the functionality, but allow to reuse some functions in other parts of lipe3, for example in the utility for merging different directory stats reports. Test-Parameters: trivial testlist=sanity-lipe-scan3,sanity-lipe-find3 Signed-off-by: Vitaliy Kuznetsov Change-Id: Ib7eeeccb651e7bcff4ddfc78c66a35793df7bd1d Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/55232 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger --- diff --git a/lipe/src/lipe_scan3/ls3_dir_stats.c b/lipe/src/lipe_scan3/ls3_dir_stats.c index 08e65d5..71e5fc3 100644 --- a/lipe/src/lipe_scan3/ls3_dir_stats.c +++ b/lipe/src/lipe_scan3/ls3_dir_stats.c @@ -166,15 +166,15 @@ static void ls3_stats_insert_heap(struct ls3_stats_dir_rating* heap, } } -static void ls3_stats_init_heap(void) +static void ls3_stats_init_heap(struct ls3_stats_dir_general *d_stats) { - if (!dir_stats) + if (!d_stats) return; - if (dir_stats->lsdg_top_size == NULL) + if (d_stats->lsdg_top_size == NULL) /* Create/init HEAP */ - dir_stats->lsdg_top_size = - ls3_stats_create_heap(dir_stats->lsdg_top_rating_limit); + d_stats->lsdg_top_size = + ls3_stats_create_heap(d_stats->lsdg_top_rating_limit); } /* ls3_stats_get_dots - Generates dots to display @@ -227,6 +227,7 @@ const char *ls3_stats_fmt_size_units(uint64_t bytes) * file if all conditions are met. */ static void ls3_stats_fprintf_out_recursive(FILE *out_fd, + struct ls3_stats_dir_general *stats, struct ls3_stats_dir_obj *dir_ptr, bool top_rating_only, uint64_t *total_size, @@ -244,7 +245,7 @@ static void ls3_stats_fprintf_out_recursive(FILE *out_fd, *total_alloc_size += dir_ptr->lsdo_alloc_size_in_sectors * 512; } - /* dir_stats->lsdg_min_size_value_for_print is initialized + /* stats->lsdg_min_size_value_for_print is initialized * to 0 by default unless the user has specified this * option with a value in Lipe_find3. This is necessary * when there are a lot of directories and it won't be @@ -259,7 +260,7 @@ static void ls3_stats_fprintf_out_recursive(FILE *out_fd, * And skip first dir. */ if (dir_ptr->lsdo_depth >= 0 && - dir_ptr->lsdo_size >= dir_stats->lsdg_min_size_value_for_print && + dir_ptr->lsdo_size >= stats->lsdg_min_size_value_for_print && !top_rating_only && out_fd) { allocate_dir_size = dir_ptr->lsdo_alloc_size_in_sectors * 512; tabulation = ls3_stats_get_dots(dir_ptr->lsdo_depth); @@ -279,27 +280,29 @@ static void ls3_stats_fprintf_out_recursive(FILE *out_fd, } /* Trying to add a directory to the rating table */ - if (dir_stats->lsdg_top_size) - ls3_stats_insert_heap(dir_stats->lsdg_top_size, dir_ptr); + if (stats->lsdg_top_size) + ls3_stats_insert_heap(stats->lsdg_top_size, dir_ptr); for (i = 0; i < dir_ptr->lsdo_last_child + 1; i++) { child_ptr = dir_ptr->lsdo_child[i]; if (child_ptr == NULL) continue; - ls3_stats_fprintf_out_recursive(out_fd, child_ptr, + ls3_stats_fprintf_out_recursive(out_fd, stats, child_ptr, top_rating_only, total_size, total_alloc_size); } } static void ls3_stats_printf_rating_out(FILE *out_fd, - struct ls3_stats_dir_rating *heap) + struct ls3_stats_dir_general *d_stats) { + struct ls3_stats_dir_rating *heap = d_stats->lsdg_top_size; + struct fstats_report *d_fstats = d_stats->lsdg_files_report; int i; fprintf(out_fd, "\n\nTop %d largest directories:\n", - dir_stats->lsdg_top_rating_limit); + d_stats->lsdg_top_rating_limit); fprintf(out_fd, "____Size____ _Alloc_Size_ __Files_Count__" " ___Dirs_Count__ __User_ID___ _____________FID______________" " ____________________Directory_name_______________________\n"); @@ -323,8 +326,9 @@ static void ls3_stats_printf_rating_out(FILE *out_fd, snprintf(tmp_alocte_size_str, sizeof(tmp_alocte_size_str), "%s", ls3_stats_fmt_size_units(allocate_dir_size)); - if (heap->lsdr_array[i]->lsdo_fid.f_seq != 0) { - rc = llapi_fid2path(reports_with_stats->client_mount_path, + if (heap->lsdr_array[i]->lsdo_fid.f_seq != 0 && + !d_fstats->merging) { + rc = llapi_fid2path(d_fstats->client_mount_path, fid_str, path, PATH_MAX, NULL, NULL); if (rc != 0) llapi_error(LLAPI_MSG_ERROR, rc, @@ -350,33 +354,32 @@ static void ls3_stats_printf_rating_out(FILE *out_fd, * size statistics in an easy-to-read format into a general stats report * with the *.out extension. */ -void ls3_stats_fprintf_out(FILE *out_fd) +void ls3_stats_fprintf_out(struct ls3_stats_dir_general *d_stats, FILE *out_fd) { uint64_t total_size; uint64_t total_alloc_size; char tmp_alocte_size_str[LS3_STATS_NUM_STR_MAX_WITH_NULL]; + struct fstats_report *f_stats = d_stats->lsdg_files_report; - if (!dir_stats) + if (!d_stats) return; - if (!dir_stats->lsdg_start_dir) + if (!d_stats->lsdg_start_dir) return; - ls3_stats_init_heap(); - + ls3_stats_init_heap(d_stats); fprintf(out_fd, "\n\nDirectory statistics for: '%s' [files count:%u size:%s]\n", - dir_stats->lsdg_start_path[0] ? - dir_stats->lsdg_start_path : "/", - dir_stats->lsdg_start_dir->lsdo_files_count, - ls3_stats_fmt_size_units(dir_stats->lsdg_start_dir->lsdo_size)); + d_stats->lsdg_start_path, + d_stats->lsdg_start_dir->lsdo_files_count, + ls3_stats_fmt_size_units(d_stats->lsdg_start_dir->lsdo_size)); fprintf(out_fd, "____Size____ _Alloc_Size_ __Files_Count__ ___Dirs_Count__" " _____________FID______________" " _____________Structure_and_directory_name________________\n"); - ls3_stats_fprintf_out_recursive(out_fd, dir_stats->lsdg_start_dir, + ls3_stats_fprintf_out_recursive(out_fd, d_stats, d_stats->lsdg_start_dir, false, &total_size, &total_alloc_size); fprintf(out_fd, "____________ ____________ _______________ _______________" @@ -388,17 +391,16 @@ void ls3_stats_fprintf_out(FILE *out_fd) fprintf(out_fd, "Total size of directories on %s: %s | allocate size: %s", - reports_with_stats->device_name, + f_stats->device_name, ls3_stats_fmt_size_units(total_size), tmp_alocte_size_str); - /* Update total size counters for next reports (*.all) */ - dir_stats->lsdg_total_size = total_size; - dir_stats->lsdg_total_alloc_size = total_alloc_size; + d_stats->lsdg_total_size = total_size; + d_stats->lsdg_total_alloc_size = total_alloc_size; - if (dir_stats->lsdg_top_size) { - ls3_stats_heap_sort(dir_stats->lsdg_top_size); - ls3_stats_printf_rating_out(out_fd, dir_stats->lsdg_top_size); + if (d_stats->lsdg_top_size) { + ls3_stats_heap_sort(d_stats->lsdg_top_size); + ls3_stats_printf_rating_out(out_fd, d_stats); } else { LS3_WARNING("the size of the rating table has not been " "specified or is equal to 0, the rating table " @@ -411,6 +413,7 @@ void ls3_stats_fprintf_out(FILE *out_fd) * file if all conditions are met. */ static struct json_object *ls3_stats_fprintf_dir_json_recursive( + struct ls3_stats_dir_general *d_stats, struct ls3_stats_dir_obj *dir_ptr, bool top_rating_only, uint64_t *total_size, @@ -419,6 +422,7 @@ static struct json_object *ls3_stats_fprintf_dir_json_recursive( struct json_object *jobj_dir_obj; struct json_object *jobj_dir_child; struct ls3_stats_dir_obj *child_ptr; + struct fstats_report *f_stats = d_stats->lsdg_files_report; int i; jobj_dir_obj = json_object_new_object(); @@ -433,7 +437,7 @@ static struct json_object *ls3_stats_fprintf_dir_json_recursive( } if (dir_ptr->lsdo_depth >= 0 && - dir_ptr->lsdo_size >= dir_stats->lsdg_min_size_value_for_print && + dir_ptr->lsdo_size >= d_stats->lsdg_min_size_value_for_print && !top_rating_only) { uint64_t allocate_dir_size; char fid_str[60]; @@ -443,10 +447,10 @@ static struct json_object *ls3_stats_fprintf_dir_json_recursive( snprintf(fid_str, sizeof(fid_str), DFID_NOBRACE, PFID(&dir_ptr->lsdo_fid)); - if (dir_ptr->lsdo_fid.f_seq != 0) { + if (dir_ptr->lsdo_fid.f_seq != 0 && !f_stats->merging) { int rc; - rc = llapi_fid2path(reports_with_stats->client_mount_path, + rc = llapi_fid2path(f_stats->client_mount_path, fid_str, path, PATH_MAX, NULL, NULL); if (rc != 0) llapi_error(LLAPI_MSG_ERROR, rc, @@ -500,10 +504,9 @@ static struct json_object *ls3_stats_fprintf_dir_json_recursive( } /* Trying to add a directory to the rating table */ - if (dir_stats->lsdg_top_size && - !(reports_with_stats->report_extension & - LS3_STATS_FILE_EXTENSION_OUT)) { - ls3_stats_insert_heap(dir_stats->lsdg_top_size, dir_ptr); + if (d_stats->lsdg_top_size && + !(f_stats->report_extension & LS3_STATS_FILE_EXTENSION_OUT)) { + ls3_stats_insert_heap(d_stats->lsdg_top_size, dir_ptr); } /* We always have at least 10 pointers in stock dir_ptr->lsdo_child[] */ @@ -515,7 +518,7 @@ static struct json_object *ls3_stats_fprintf_dir_json_recursive( continue; tmp_jobj_dir_obj = - ls3_stats_fprintf_dir_json_recursive(child_ptr, + ls3_stats_fprintf_dir_json_recursive(d_stats, child_ptr, top_rating_only, total_size, total_alloc_size); @@ -528,37 +531,39 @@ static struct json_object *ls3_stats_fprintf_dir_json_recursive( return jobj_dir_obj; } -struct json_object *ls3_stats_fprintf_dirs_json(void) +struct json_object *ls3_stats_fprintf_dirs_json( + struct ls3_stats_dir_general *d_stats) { + struct fstats_report *d_fstats = d_stats->lsdg_files_report; struct json_object *jobj_dirs_rating; struct json_object *jobj_objects; /* Rating */ struct json_object *jobj_tree; struct ls3_stats_dir_rating *heap; uint64_t total_size; uint64_t total_alloc_size; - int extension = reports_with_stats->report_extension; + int extension = d_fstats->report_extension; int i; - if (!dir_stats) + if (!d_stats) return NULL; - if (!dir_stats->lsdg_start_dir) + if (!d_stats->lsdg_start_dir) return NULL; - ls3_stats_init_heap(); - if (!dir_stats->lsdg_top_size) + ls3_stats_init_heap(d_stats); + if (!d_stats->lsdg_top_size) return NULL; jobj_dirs_rating = json_object_new_object(); - jobj_tree = ls3_stats_fprintf_dir_json_recursive( - dir_stats->lsdg_start_dir, - false, &total_size, - &total_alloc_size); + jobj_tree = ls3_stats_fprintf_dir_json_recursive(d_stats, + d_stats->lsdg_start_dir, + false, &total_size, + &total_alloc_size); if (!(extension & LS3_STATS_FILE_EXTENSION_OUT)) - ls3_stats_heap_sort(dir_stats->lsdg_top_size); + ls3_stats_heap_sort(d_stats->lsdg_top_size); - heap = dir_stats->lsdg_top_size; + heap = d_stats->lsdg_top_size; jobj_objects = json_object_new_array(); if (!jobj_objects) { json_object_put(jobj_dirs_rating); @@ -587,8 +592,8 @@ struct json_object *ls3_stats_fprintf_dirs_json(void) snprintf(fid_str, sizeof(fid_str), DFID_NOBRACE, PFID(&tmp_obj->lsdo_fid)); - if (tmp_obj->lsdo_fid.f_seq != 0) { - rc = llapi_fid2path(reports_with_stats->client_mount_path, + if (tmp_obj->lsdo_fid.f_seq != 0 && !d_fstats->merging) { + rc = llapi_fid2path(d_fstats->client_mount_path, fid_str, path, PATH_MAX, NULL, NULL); if (rc != 0) @@ -634,10 +639,13 @@ struct json_object *ls3_stats_fprintf_dirs_json(void) } json_object_object_add(jobj_dirs_rating, "SourceDirectory", - json_object_new_string(dir_stats->lsdg_start_path)); + json_object_new_string(d_stats->lsdg_start_path)); json_object_object_add(jobj_dirs_rating, "MaxDepth", - json_object_new_int64(dir_stats->lsdg_max_depth)); + json_object_new_int64(d_stats->lsdg_max_depth)); + + json_object_object_add(jobj_dirs_rating, "TopRatingLimit", + json_object_new_int(d_stats->lsdg_top_rating_limit)); json_object_object_add(jobj_dirs_rating, "TotalSizeBytes", json_object_new_int64(total_size)); @@ -687,7 +695,7 @@ static void ls3_stats_dir_incr_counters(struct ls3_object_attrs *loa_all, /* ls3_expand_num_of_dirs expanding the number of child directories * for a directory in statistics. */ -static void ls3_expand_num_of_dirs(struct ls3_stats_dir_obj *dir_ptr) +void ls3_expand_num_of_dirs(struct ls3_stats_dir_obj *dir_ptr) { struct ls3_stats_dir_obj **new_dirs_array; unsigned int old_size = dir_ptr->lsdo_child_max; @@ -741,9 +749,10 @@ static void ls3_stats_dir_update_fid(struct ls3_object_attrs *loa_all, /* ls3_stats_allocate_new_dir allocates memory for a new * directory in statistics. */ -static struct ls3_stats_dir_obj - *ls3_stats_allocate_new_dir(struct ls3_object_attrs *loa_all, - char *dir_name, int depth) +struct ls3_stats_dir_obj + *ls3_stats_allocate_new_dir(struct ls3_stats_dir_general *d_stats, + struct ls3_object_attrs *loa_all, + const char *dir_name, int depth) { struct ls3_stats_dir_obj *new_dir_ptr; int rc; @@ -763,8 +772,7 @@ static struct ls3_stats_dir_obj if (!loa_all) /* skip first dir from ls3_stats_init_first_dir() */ return new_dir_ptr; - dir_stats->lsdg_dirs_count++; - + d_stats->lsdg_dirs_count++; return new_dir_ptr; } @@ -805,7 +813,7 @@ static void ls3_stats_init_first_dir(char *path) * have attributes for the first directory. */ dir_stats->lsdg_start_dir = - ls3_stats_allocate_new_dir(NULL, + ls3_stats_allocate_new_dir(dir_stats, NULL, (last_slash ? last_slash + 1 : tmp_path), -1); free(tmp_path); @@ -983,7 +991,7 @@ static void ls3_stats_check_dir_in_mem(struct ls3_object_attrs *loa_all, uint64_t current_index = 0; int i; - /* Check array with dir */ + /* Check array with dir */ if ((*count) == 0 || (*dirs)[0] == NULL) return; /* catalogs are out */ @@ -1039,7 +1047,8 @@ static void ls3_stats_check_dir_in_mem(struct ls3_object_attrs *loa_all, child_ptr = dir_ptr->lsdo_child[current_index]; if (child_ptr == NULL) { - child_ptr = ls3_stats_allocate_new_dir(loa_all, (*dirs)[0], + child_ptr = ls3_stats_allocate_new_dir(dir_stats, loa_all, + (*dirs)[0], dir_ptr->lsdo_depth + 1); dir_ptr->lsdo_child[current_index] = child_ptr; dir_ptr->lsdo_last_child = current_index; @@ -1131,6 +1140,14 @@ void ls3_stats_dir_init(void) if (rc != 0) LS3_FATAL("failed to initialize mutex\n"); + if (reports_with_stats) + /* Assign a pointer so don't have to reference the global + * variable in the rest of code. + */ + dir_stats->lsdg_files_report = reports_with_stats; + else + LS3_FATAL("failed to get pointer for fstats_report\n"); + } static void ls3_stats_destroy_dirs(struct ls3_stats_dir_obj *dir_ptr) @@ -1152,19 +1169,19 @@ static void ls3_stats_destroy_dirs(struct ls3_stats_dir_obj *dir_ptr) free(dir_ptr); } -void ls3_stats_dir_destroy(void) +void ls3_stats_dir_destroy(struct ls3_stats_dir_general *d_stats) { - if (dir_stats->lsdg_start_dir) - ls3_stats_destroy_dirs(dir_stats->lsdg_start_dir); + if (d_stats->lsdg_start_dir) + ls3_stats_destroy_dirs(d_stats->lsdg_start_dir); - if (dir_stats->lsdg_top_size) { - free(dir_stats->lsdg_top_size->lsdr_array); - free(dir_stats->lsdg_top_size); + if (d_stats->lsdg_top_size) { + free(d_stats->lsdg_top_size->lsdr_array); + free(d_stats->lsdg_top_size); } - pthread_mutex_destroy(&dir_stats->lsdg_mutex); - if (dir_stats->lsdg_start_path) - free(dir_stats->lsdg_start_path); + pthread_mutex_destroy(&d_stats->lsdg_mutex); + if (d_stats->lsdg_start_path) + free(d_stats->lsdg_start_path); - free(dir_stats); + free(d_stats); } diff --git a/lipe/src/lipe_scan3/ls3_dir_stats.h b/lipe/src/lipe_scan3/ls3_dir_stats.h index 57ee33a..7dbc220 100644 --- a/lipe/src/lipe_scan3/ls3_dir_stats.h +++ b/lipe/src/lipe_scan3/ls3_dir_stats.h @@ -82,15 +82,21 @@ struct ls3_stats_dir_general { char *lsdg_start_path; struct ls3_stats_dir_obj *lsdg_start_dir; struct ls3_stats_dir_rating *lsdg_top_size; + struct fstats_report *lsdg_files_report; }; extern struct ls3_stats_dir_general *dir_stats; const char *ls3_stats_fmt_size_units(uint64_t bytes); -void ls3_stats_fprintf_out(FILE *out_fd); -struct json_object *ls3_stats_fprintf_dirs_json(void); +void ls3_stats_fprintf_out(struct ls3_stats_dir_general *d_stats, FILE *out_fd); +struct json_object *ls3_stats_fprintf_dirs_json( + struct ls3_stats_dir_general *d_stats); +struct ls3_stats_dir_obj *ls3_stats_allocate_new_dir( + struct ls3_stats_dir_general *main_stats, + struct ls3_object_attrs *loa_all, const char *dir_name, int depth); +void ls3_expand_num_of_dirs(struct ls3_stats_dir_obj *dir_ptr); void ls3_stats_dir_init(void); -void ls3_stats_dir_destroy(void); +void ls3_stats_dir_destroy(struct ls3_stats_dir_general *dirs); void ls3_stats_dir_distributor(struct ls3_object_attrs *loa_all); #endif /* _LS3_DIR_STATS_H_ */ diff --git a/lipe/src/lipe_scan3/ls3_main.c b/lipe/src/lipe_scan3/ls3_main.c index 515d744..d45b8ad 100644 --- a/lipe/src/lipe_scan3/ls3_main.c +++ b/lipe/src/lipe_scan3/ls3_main.c @@ -1712,13 +1712,13 @@ static void ls3_main_scm(void *data, int argc, char *argv[]) } if (save_fsize_stats) - ls3_stats_printf(reports_with_stats); + ls3_stats_printf(reports_with_stats, dir_stats); if (show_counters) ls3_counters_print(); ls3_stats_destroy(reports_with_stats); - ls3_stats_dir_destroy(); + ls3_stats_dir_destroy(dir_stats); LS3_DEBUG_D(exit_status); exit(exit_status); } diff --git a/lipe/src/lipe_scan3/ls3_merge_stats.c b/lipe/src/lipe_scan3/ls3_merge_stats.c index b64a413..62ddbe0 100644 --- a/lipe/src/lipe_scan3/ls3_merge_stats.c +++ b/lipe/src/lipe_scan3/ls3_merge_stats.c @@ -469,11 +469,12 @@ static struct fstats_report * ls3_m_report_init(void) void ls3_stats_merge_reports(const char *dir_with_reports) { struct fstats_report *main_report; + struct ls3_stats_dir_general *dirs_report = NULL; main_report = ls3_m_report_init(); main_report->merging = true; main_report->report_file_name = xstrdup("merged_report.all"); ls3_m_read_reports(main_report, dir_with_reports); - ls3_stats_printf(main_report); + ls3_stats_printf(main_report, dirs_report); ls3_stats_destroy(main_report); } diff --git a/lipe/src/lipe_scan3/ls3_stats.c b/lipe/src/lipe_scan3/ls3_stats.c index c5dd321..21df12a 100644 --- a/lipe/src/lipe_scan3/ls3_stats.c +++ b/lipe/src/lipe_scan3/ls3_stats.c @@ -1151,6 +1151,7 @@ static char* ls3_stats_get_title_for_user_report(ls3_stats_users_reports rtype) } static void ls3_stats_print_to_json(struct fstats_report *report, + struct ls3_stats_dir_general *dir_report, const char *f_time, double e_time) { FILE *json_fd; @@ -1419,7 +1420,7 @@ static void ls3_stats_print_to_json(struct fstats_report *report, if (report->client_mount_path) { struct json_object *jobj_dirs_rating; - jobj_dirs_rating = ls3_stats_fprintf_dirs_json(); + jobj_dirs_rating = ls3_stats_fprintf_dirs_json(dir_report); if (jobj_dirs_rating) json_object_object_add(jobj_main, "DirectoriesStats", @@ -1610,6 +1611,7 @@ static void ls3_stats_print_to_yaml(struct fstats_report *report, } static void ls3_stats_print_to_out(struct fstats_report *report, + struct ls3_stats_dir_general *dir_report, const char *f_time, double e_time) { struct report_template *report_ptr; @@ -1768,7 +1770,7 @@ static void ls3_stats_print_to_out(struct fstats_report *report, } } - ls3_stats_fprintf_out(out_fd); + ls3_stats_fprintf_out(dir_report, out_fd); fclose(out_fd); printf(" Path to out: %s\n", report->format_report_file_name); @@ -1928,7 +1930,8 @@ static void ls3_stats_print_to_csv(struct fstats_report *report, /* ls3_stats_printf - Generates a report file for the * user with the required extension */ -void ls3_stats_printf(struct fstats_report *report) +void ls3_stats_printf(struct fstats_report *report, + struct ls3_stats_dir_general *dir_report) { time_t current_time = time(NULL); double elapsed_time; @@ -1950,13 +1953,15 @@ void ls3_stats_printf(struct fstats_report *report) printf("File with the results:\n"); if (report->report_extension & LS3_STATS_FILE_EXTENSION_OUT) - ls3_stats_print_to_out(report, formatted_time, elapsed_time); + ls3_stats_print_to_out(report, dir_report, formatted_time, + elapsed_time); if (report->report_extension & LS3_STATS_FILE_EXTENSION_YAML) ls3_stats_print_to_yaml(report, formatted_time, elapsed_time); if (report->report_extension & LS3_STATS_FILE_EXTENSION_JSON) - ls3_stats_print_to_json(report, formatted_time, elapsed_time); + ls3_stats_print_to_json(report, dir_report, formatted_time, + elapsed_time); if (report->report_extension & LS3_STATS_FILE_EXTENSION_CSV) ls3_stats_print_to_csv(report, formatted_time, elapsed_time); diff --git a/lipe/src/lipe_scan3/ls3_stats.h b/lipe/src/lipe_scan3/ls3_stats.h index 47da62f..11e1424 100644 --- a/lipe/src/lipe_scan3/ls3_stats.h +++ b/lipe/src/lipe_scan3/ls3_stats.h @@ -24,6 +24,7 @@ #endif #include "ls3_debug.h" #include "ls3_object_attrs.h" +#include "ls3_dir_stats.h" #define LS3_STATS_VERSION 1.1 #define LS3_STATS_EMPTY_VALUE 0 @@ -216,6 +217,7 @@ struct ls3_stats_user_report_template *ls3_stats_find_user_reports(struct fstats_report *stats, uint64_t uid); int ls3_stats_update_info(struct ls3_object_attrs *loa_all); void ls3_stats_calculate_values(struct fstats_report *report); -void ls3_stats_printf(struct fstats_report *report); +void ls3_stats_printf(struct fstats_report *report, + struct ls3_stats_dir_general *dir_report); #endif /* _LS3_STATS_H_ */