perf symbols: Use lsdir() for the search in kcore cache directory
authorMasami Hiramatsu <[email protected]>
Wed, 11 May 2016 13:52:08 +0000 (22:52 +0900)
committerArnaldo Carvalho de Melo <[email protected]>
Wed, 11 May 2016 16:06:07 +0000 (13:06 -0300)
Use lsdir() to search in kcore cache directory. This also avoids
checking hidden dot directory entries, because kcore cache directories
must always have the name from timestamps when taking the kcore
snapshots, and it never start with dot.

Signed-off-by: Masami Hiramatsu <[email protected]>
Cc: Ananth N Mavinakayanahalli <[email protected]>
Cc: Brendan Gregg <[email protected]>
Cc: Hemant Kumar <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/20160511135208.23943.68071.stgit@devbox
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
tools/perf/util/symbol.c

index 4ada5a44aaf2ad9195085efd50dd7bef2ad1c370..7fb33304fb4ea66f1103c351b696a1e2b5e8bae8 100644 (file)
@@ -1608,25 +1608,27 @@ out:
        return err;
 }
 
+static bool visible_dir_filter(const char *name, struct dirent *d)
+{
+       if (d->d_type != DT_DIR)
+               return false;
+       return lsdir_no_dot_filter(name, d);
+}
+
 static int find_matching_kcore(struct map *map, char *dir, size_t dir_sz)
 {
        char kallsyms_filename[PATH_MAX];
-       struct dirent *dent;
        int ret = -1;
-       DIR *d;
+       struct strlist *dirs;
+       struct str_node *nd;
 
-       d = opendir(dir);
-       if (!d)
+       dirs = lsdir(dir, visible_dir_filter);
+       if (!dirs)
                return -1;
 
-       while (1) {
-               dent = readdir(d);
-               if (!dent)
-                       break;
-               if (dent->d_type != DT_DIR)
-                       continue;
+       strlist__for_each(nd, dirs) {
                scnprintf(kallsyms_filename, sizeof(kallsyms_filename),
-                         "%s/%s/kallsyms", dir, dent->d_name);
+                         "%s/%s/kallsyms", dir, nd->s);
                if (!validate_kcore_addresses(kallsyms_filename, map)) {
                        strlcpy(dir, kallsyms_filename, dir_sz);
                        ret = 0;
@@ -1634,7 +1636,7 @@ static int find_matching_kcore(struct map *map, char *dir, size_t dir_sz)
                }
        }
 
-       closedir(d);
+       strlist__delete(dirs);
 
        return ret;
 }