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

Reply via email to