All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Jiri Olsa <jolsa@kernel.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
	Ingo Molnar <mingo@kernel.org>,
	Namhyung Kim <namhyung@kernel.org>,
	David Ahern <dsahern@gmail.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Michael Petlan <mpetlan@redhat.com>
Subject: Re: [PATCH] perf tests: Handle properly readdir DT_UNKNOWN
Date: Thu, 7 Dec 2017 12:19:05 -0300	[thread overview]
Message-ID: <20171207151905.GC6458@kernel.org> (raw)
In-Reply-To: <20171206174535.25380-1-jolsa@kernel.org>

Em Wed, Dec 06, 2017 at 06:45:35PM +0100, Jiri Olsa escreveu:
> Some system can return DT_UNKNOWN in readdir's struct dirent::d_type
> and we must handle it properly. In this case we can directly check
> if the entity we found is directory and skip it.
 
> Making is_directory function global.

Split this part into a prep patch and left with the previous paragraph
the 'perf test' bits.

[acme@jouet perf]$ git log --oneline -2
de7cee586145 (HEAD -> perf/core, acme.korg/perf/core) perf test: Handle properly readdir DT_UNKNOWN
ef87e1133606 perf utils: Move is_directory() to path.h
[acme@jouet perf]$

Thanks,

- Arnaldo
 
> Reported-by: Michael Petlan <mpetlan@redhat.com>
> Link: http://lkml.kernel.org/n/tip-hgwpktyrx657m1i255da46p0@git.kernel.org
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  tools/perf/builtin-script.c     | 14 +-------------
>  tools/perf/tests/builtin-test.c | 10 +++++-----
>  tools/perf/util/path.c          | 13 +++++++++++++
>  tools/perf/util/path.h          |  4 ++++
>  4 files changed, 23 insertions(+), 18 deletions(-)
> 
> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
> index 39d8b55f0db3..a5c1361ccf26 100644
> --- a/tools/perf/builtin-script.c
> +++ b/tools/perf/builtin-script.c
> @@ -26,6 +26,7 @@
>  #include "util/string2.h"
>  #include "util/thread-stack.h"
>  #include "util/time-utils.h"
> +#include "util/path.h"
>  #include "print_binary.h"
>  #include <linux/bitmap.h>
>  #include <linux/kernel.h>
> @@ -2399,19 +2400,6 @@ static int parse_output_fields(const struct option *opt __maybe_unused,
>  	return rc;
>  }
>  
> -/* Helper function for filesystems that return a dent->d_type DT_UNKNOWN */
> -static int is_directory(const char *base_path, const struct dirent *dent)
> -{
> -	char path[PATH_MAX];
> -	struct stat st;
> -
> -	sprintf(path, "%s/%s", base_path, dent->d_name);
> -	if (stat(path, &st))
> -		return 0;
> -
> -	return S_ISDIR(st.st_mode);
> -}
> -
>  #define for_each_lang(scripts_path, scripts_dir, lang_dirent)		\
>  	while ((lang_dirent = readdir(scripts_dir)) != NULL)		\
>  		if ((lang_dirent->d_type == DT_DIR ||			\
> diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
> index 766573e236e4..fafa014240cd 100644
> --- a/tools/perf/tests/builtin-test.c
> +++ b/tools/perf/tests/builtin-test.c
> @@ -411,9 +411,9 @@ static const char *shell_test__description(char *description, size_t size,
>  	return description ? trim(description + 1) : NULL;
>  }
>  
> -#define for_each_shell_test(dir, ent)		\
> +#define for_each_shell_test(dir, base, ent)	\
>  	while ((ent = readdir(dir)) != NULL)	\
> -		if (ent->d_type == DT_REG && ent->d_name[0] != '.')
> +		if (!is_directory(base, ent))
>  
>  static const char *shell_tests__dir(char *path, size_t size)
>  {
> @@ -452,7 +452,7 @@ static int shell_tests__max_desc_width(void)
>  	if (!dir)
>  		return -1;
>  
> -	for_each_shell_test(dir, ent) {
> +	for_each_shell_test(dir, path, ent) {
>  		char bf[256];
>  		const char *desc = shell_test__description(bf, sizeof(bf), path, ent->d_name);
>  
> @@ -504,7 +504,7 @@ static int run_shell_tests(int argc, const char *argv[], int i, int width)
>  	if (!dir)
>  		return -1;
>  
> -	for_each_shell_test(dir, ent) {
> +	for_each_shell_test(dir, st.dir, ent) {
>  		int curr = i++;
>  		char desc[256];
>  		struct test test = {
> @@ -614,7 +614,7 @@ static int perf_test__list_shell(int argc, const char **argv, int i)
>  	if (!dir)
>  		return -1;
>  
> -	for_each_shell_test(dir, ent) {
> +	for_each_shell_test(dir, path, ent) {
>  		int curr = i++;
>  		char bf[256];
>  		struct test t = {
> diff --git a/tools/perf/util/path.c b/tools/perf/util/path.c
> index 933f5c6bffb4..ab1be320f3ef 100644
> --- a/tools/perf/util/path.c
> +++ b/tools/perf/util/path.c
> @@ -77,3 +77,16 @@ bool is_regular_file(const char *file)
>  
>  	return S_ISREG(st.st_mode);
>  }
> +
> +/* Helper function for filesystems that return a dent->d_type DT_UNKNOWN */
> +bool is_directory(const char *base_path, const struct dirent *dent)
> +{
> +	char path[PATH_MAX];
> +	struct stat st;
> +
> +	sprintf(path, "%s/%s", base_path, dent->d_name);
> +	if (stat(path, &st))
> +		return false;
> +
> +	return S_ISDIR(st.st_mode);
> +}
> diff --git a/tools/perf/util/path.h b/tools/perf/util/path.h
> index 14a254ada7eb..f0f3a6bedc57 100644
> --- a/tools/perf/util/path.h
> +++ b/tools/perf/util/path.h
> @@ -2,9 +2,13 @@
>  #ifndef _PERF_PATH_H
>  #define _PERF_PATH_H
>  
> +#include <sys/types.h>
> +#include <dirent.h>
> +
>  int path__join(char *bf, size_t size, const char *path1, const char *path2);
>  int path__join3(char *bf, size_t size, const char *path1, const char *path2, const char *path3);
>  
>  bool is_regular_file(const char *file);
> +bool is_directory(const char *base_path, const struct dirent *dent);
>  
>  #endif /* _PERF_PATH_H */
> -- 
> 2.13.6

  reply	other threads:[~2017-12-07 15:19 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-06 17:45 [PATCH] perf tests: Handle properly readdir DT_UNKNOWN Jiri Olsa
2017-12-07 15:19 ` Arnaldo Carvalho de Melo [this message]
2017-12-08 11:55   ` Jiri Olsa
2017-12-28 15:26 ` [tip:perf/core] perf utils: Move is_directory() to path.h tip-bot for Jiri Olsa
2017-12-28 15:27 ` [tip:perf/core] perf test: Handle properly readdir DT_UNKNOWN tip-bot for Jiri Olsa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171207151905.GC6458@kernel.org \
    --to=acme@kernel.org \
    --cc=a.p.zijlstra@chello.nl \
    --cc=dsahern@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=mpetlan@redhat.com \
    --cc=namhyung@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.