Currently dircache per-group bucket explicitly initialized only if IEF candidates are found for a group, but dircache is also required for IAF files. Let's initialize all popilated groups.
https://jira.sw.ru/browse/PSBM-40027 Signed-off-by: Dmitry Monakhov <[email protected]> --- misc/e4defrag2.c | 33 +++++++++++++++++++++------------ 1 files changed, 21 insertions(+), 12 deletions(-) diff --git a/misc/e4defrag2.c b/misc/e4defrag2.c index 7be14a8..f217a40 100644 --- a/misc/e4defrag2.c +++ b/misc/e4defrag2.c @@ -864,6 +864,21 @@ static int do_iaf_defrag_one(struct defrag_context *dfx, int dirfd, const char * typedef int proc_inode_t (struct defrag_context *dfx, int fd, struct stat64 *st, int dirfd, const char *name); + +static int group_info_init(struct defrag_context *dfx, dgrp_t group) +{ + struct group_info *gi; + + dfx->group[group] = malloc(sizeof(struct group_info) + + dfx->root_fhp->handle_bytes * GROUP_DIR_CACHE_SZ); + if (!dfx->group[group]) { + fprintf(stderr, "%s: Can not allocate memory errno:%d\n", __func__, errno); + return 0; + } + memset(dfx->group[group], 0, sizeof(struct group_info)); + dfx->group[group]->fh_root = RB_ROOT; + return 1; +} /* Add ief candidate for later processing */ static int group_add_ief_candidate(struct defrag_context *dfx, int dirfd, const char* name, dgrp_t group, __u64 pblock, @@ -878,16 +893,8 @@ static int group_add_ief_candidate(struct defrag_context *dfx, int dirfd, const assert(flags & SP_FL_IEF_RELOC); - if (!dfx->group[group]) { - dfx->group[group] = malloc(sizeof(struct group_info) + - dfx->root_fhp->handle_bytes * GROUP_DIR_CACHE_SZ); - if (!dfx->group[group]) { - fprintf(stderr, "%s: Can not allocate memory errno:%d\n", __func__, errno); - return -1; - } - memset(dfx->group[group], 0, sizeof(struct group_info)); - dfx->group[group]->fh_root = RB_ROOT; - } + if (!dfx->group[group] && !group_info_init(dfx, group)) + return -1; fhp = malloc(sizeof(struct file_handle) + dfx->root_fhp->handle_bytes); if (!fhp) { @@ -1051,8 +1058,10 @@ static void group_add_dircache(struct defrag_context *dfx, int dirfd, struct sta struct file_handle *fhp = NULL; dgrp_t grp = e4d_group_of_ino(dfx, stat->st_ino); - if (!dfx->group[grp] || - dfx->group[grp]->dir_cached == GROUP_DIR_CACHE_SZ) + if (!dfx->group[grp] && !group_info_init(dfx, grp)) + return; + + if (dfx->group[grp]->dir_cached == GROUP_DIR_CACHE_SZ) return; for (i = 0; i < dfx->group[grp]->dir_cached; i++) { -- 1.7.1 _______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
