From: Cyril Hrubis <chrubis@suse.cz>
To: Li Wang <liwang@redhat.com>
Cc: ltp-list@lists.sourceforge.net
Subject: Re: [LTP] [PATCH] /vm/hugepage/thp/thp05: cleanup should not use safe macros
Date: Tue, 2 Dec 2014 13:00:37 +0100 [thread overview]
Message-ID: <20141202120036.GA16539@rei.suse.de> (raw)
In-Reply-To: <2046852420.5414979.1417513768451.JavaMail.zimbra@redhat.com>
Hi!
> Signed-off-by: Li Wang <liwang@redhat.com>
> ---
> include/safe_file_ops.h | 5 ++-
> lib/safe_file_ops.c | 92 ++++++++++++++++++++++++++++++++--------
> testcases/kernel/mem/thp/thp04.c | 10 ++---
> testcases/kernel/mem/thp/thp05.c | 10 ++---
> 4 files changed, 88 insertions(+), 29 deletions(-)
>
> diff --git a/include/safe_file_ops.h b/include/safe_file_ops.h
> index 1815984..17d009e 100644
> --- a/include/safe_file_ops.h
> +++ b/include/safe_file_ops.h
> @@ -42,6 +42,8 @@
> /*
> * All-in-one function to scanf value(s) from a file.
> */
> +int file_scanf(const char *file, const char *fmt, va_list va);
This prototype is wrong, the last one should be ... not va_list.
> void safe_file_scanf(const char *file, const int lineno,
> void (*cleanup_fn)(void),
> const char *path, const char *fmt, ...)
> @@ -50,10 +52,11 @@ void safe_file_scanf(const char *file, const int lineno,
> #define SAFE_FILE_SCANF(cleanup_fn, path, fmt, ...) \
> safe_file_scanf(__FILE__, __LINE__, (cleanup_fn), \
> (path), (fmt), ## __VA_ARGS__)
> -
> /*
> * All-in-one function that lets you printf directly into a file.
> */
> +int file_printf(const char *file, const char *fmt, va_list va);
Here as well.
Have you complied the code? It should have produced quite a lot of
warnings.
> void safe_file_printf(const char *file, const int lineno,
> void (*cleanup_fn)(void),
> const char *path, const char *fmt, ...)
> diff --git a/lib/safe_file_ops.c b/lib/safe_file_ops.c
> index 0325ce2..3ce53ff 100644
> --- a/lib/safe_file_ops.c
> +++ b/lib/safe_file_ops.c
> @@ -73,28 +73,54 @@ static int count_scanf_conversions(const char *fmt)
> return cnt;
> }
>
> +int file_vscanf(const char *file, const char *fmt, va_list va)
This function is not part of the public interface, therefore it would be
better to declare it as static.
> +{
> + FILE *f;
> + int ret;
> +
> + f = fopen(file, "r");
> +
> + if (f == NULL) {
> + return -2;
> + }
LKML coding style preffers not to include curly braces around single
line statements.
> + ret = vfscanf(f, fmt, va);
Close the file here, otherwise you leak memory.
> + return ret;
> +}
> +
> +/* Add file_scanf() to replace SAFE_FILE_SCANF() which used in cleanup()*/
Please do not add useless comments like this.
> +int file_scanf(const char *file, const char *fmt, ...)
> +{
> + va_list va;
> + int ret;
> +
> + va_start(va, fmt);
> + ret = file_vscanf(file, fmt, va);
> + va_end(va);
> +
> + return ret;
> +}
> +
> void safe_file_scanf(const char *file, const int lineno,
> void (*cleanup_fn) (void),
> const char *path, const char *fmt, ...)
> {
> va_list va;
> - FILE *f;
> int exp_convs, ret;
>
> - f = fopen(path, "r");
> + exp_convs = count_scanf_conversions(fmt);
>
> - if (f == NULL) {
> + va_start(va, fmt);
> + ret = file_vscanf(path, fmt, va);
> + va_end(va);
> +
> + if (ret == -2) {
> tst_brkm(TBROK | TERRNO, cleanup_fn,
> "Failed to open FILE '%s' for reading at %s:%d",
> path, file, lineno);
> }
>
> - exp_convs = count_scanf_conversions(fmt);
> -
> - va_start(va, fmt);
> - ret = vfscanf(f, fmt, va);
> - va_end(va);
> -
> if (ret == EOF) {
> tst_brkm(TBROK, cleanup_fn,
> "The FILE '%s' ended prematurely at %s:%d",
> @@ -109,32 +135,62 @@ void safe_file_scanf(const char *file, const int lineno,
>
> }
>
> +int file_vprintf(const char *file, const char *fmt, va_list va)
> +{
Should be static function as well.
> + FILE *f;
> +
> + f = fopen(file, "w");
> +
> + if (f == NULL) {
> + return -2;
> + }
> +
> + if (vfprintf(f, fmt, va) < 0) {
> + return -3;
> + }
> +
> + if (fclose(f)) {
> + return -4;
> + }
Useless curly braces as well.
> +}
> +
> +/* Add file_printf() to replace SAFE_FILE_PRINTF() which used in cleanup()*/
Useless comment as well.
> +int file_printf(const char *file, const char *fmt, ...)
> +{
> + va_list va;
> + int ret;
> +
> + va_start(va, fmt);
> + ret = file_vprintf(file, fmt, va);
> + va_end(va);
> +
> + return ret;
> +}
> +
> void safe_file_printf(const char *file, const int lineno,
> void (*cleanup_fn) (void),
> const char *path, const char *fmt, ...)
> {
> va_list va;
> - FILE *f;
> + int ret;
>
> - f = fopen(path, "w");
> + va_start(va, fmt);
> + ret = file_vprintf(path, fmt, va);
> + va_end(va);
>
> - if (f == NULL) {
> + if (ret == -2) {
> tst_brkm(TBROK | TERRNO, cleanup_fn,
> "Failed to open FILE '%s' for writing at %s:%d",
> path, file, lineno);
> }
>
> - va_start(va, fmt);
> -
> - if (vfprintf(f, fmt, va) < 0) {
> + if (ret == -3) {
> tst_brkm(TBROK, cleanup_fn,
> "Failed to print to FILE '%s' at %s:%d",
> path, file, lineno);
> }
>
> - va_end(va);
> -
> - if (fclose(f)) {
> + if (ret == -4) {
> tst_brkm(TBROK | TERRNO, cleanup_fn,
> "Failed to close FILE '%s' at %s:%d",
> path, file, lineno);
> diff --git a/testcases/kernel/mem/thp/thp04.c b/testcases/kernel/mem/thp/thp04.c
> index 0b6baeb..db9defc 100644
> --- a/testcases/kernel/mem/thp/thp04.c
> +++ b/testcases/kernel/mem/thp/thp04.c
> @@ -120,10 +120,10 @@ void setup(void)
>
> void cleanup(void)
> {
> - SAFE_FILE_PRINTF(NULL, PATH_KHPD "scan_sleep_millisecs",
> + file_printf(PATH_KHPD "scan_sleep_millisecs",
> "%d", pre_thp_scan_sleep_millisecs);
>
> - SAFE_FILE_PRINTF(NULL, PATH_KHPD "alloc_sleep_millisecs",
> + file_printf(PATH_KHPD "alloc_sleep_millisecs",
> "%d", pre_thp_alloc_sleep_millisecs);
>
> /*
> @@ -132,11 +132,11 @@ void cleanup(void)
> * the three mode: always, madvise, never.
> */
> if (strcmp(pre_thp_enabled, "[always] madvise never") == 0)
> - SAFE_FILE_PRINTF(NULL, PATH_THP "enabled", "always");
> + file_printf(PATH_THP "enabled", "always");
> else if (strcmp(pre_thp_enabled, "always [madvise] never") == 0)
> - SAFE_FILE_PRINTF(NULL, PATH_THP "enabled", "madvise");
> + file_printf(PATH_THP "enabled", "madvise");
> else
> - SAFE_FILE_PRINTF(NULL, PATH_THP "enabled", "never");
> + file_printf(PATH_THP "enabled", "never");
>
> TEST_CLEANUP;
> }
> diff --git a/testcases/kernel/mem/thp/thp05.c b/testcases/kernel/mem/thp/thp05.c
> index 8b595ca..b20d9bd 100644
> --- a/testcases/kernel/mem/thp/thp05.c
> +++ b/testcases/kernel/mem/thp/thp05.c
> @@ -129,18 +129,18 @@ void setup(void)
>
> void cleanup(void)
> {
> - SAFE_FILE_PRINTF(NULL, PATH_KHPD "scan_sleep_millisecs",
> + file_printf(PATH_KHPD "scan_sleep_millisecs",
> "%d", pre_thp_scan_sleep_millisecs);
>
> - SAFE_FILE_PRINTF(NULL, PATH_KHPD "alloc_sleep_millisecs",
> + file_printf(PATH_KHPD "alloc_sleep_millisecs",
> "%d", pre_thp_alloc_sleep_millisecs);
>
> if (strcmp(pre_thp_enabled, "[always] madvise never") == 0)
> - SAFE_FILE_PRINTF(NULL, PATH_THP "enabled", "always");
> + file_printf(PATH_THP "enabled", "always");
> else if (strcmp(pre_thp_enabled, "always [madvise] never") == 0)
> - SAFE_FILE_PRINTF(NULL, PATH_THP "enabled", "madvise");
> + file_printf(PATH_THP "enabled", "madvise");
> else
> - SAFE_FILE_PRINTF(NULL, PATH_THP "enabled", "never");
> + file_printf(PATH_THP "enabled", "never");
Looking at the change here, it would be better if file_printf() will
issue tst_resm(TWARN, "xyz has failed") in case that the file_printf()
will fail. Because otherwise it would be close to impossible to track
down the failure. Maybe it would be even better to create FILE_PRINTF()
macro similary to the SAFE_FILE_PRINTF(), what do you think?
--
Cyril Hrubis
chrubis@suse.cz
------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
next parent reply other threads:[~2014-12-02 12:00 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1417512939-6435-1-git-send-email-liwang@redhat.com>
[not found] ` <2046852420.5414979.1417513768451.JavaMail.zimbra@redhat.com>
2014-12-02 12:00 ` Cyril Hrubis [this message]
[not found] <1417612136-10890-1-git-send-email-liwang@redhat.com>
[not found] ` <152932834.6076324.1417612296820.JavaMail.zimbra@redhat.com>
2014-12-16 14:47 ` [LTP] [PATCH] /vm/hugepage/thp/thp05: cleanup should not use safe macros Cyril Hrubis
[not found] <1417596291-8540-1-git-send-email-liwang@redhat.com>
[not found] ` <373996084.5962831.1417596425167.JavaMail.zimbra@redhat.com>
2014-12-03 10:50 ` Cyril Hrubis
2014-10-23 3:31 Li Wang
2014-11-06 10:22 ` Cyril Hrubis
[not found] ` <857789373.5490769.1415284744752.JavaMail.zimbra@redhat.com>
2014-11-26 14:50 ` Cyril Hrubis
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=20141202120036.GA16539@rei.suse.de \
--to=chrubis@suse.cz \
--cc=liwang@redhat.com \
--cc=ltp-list@lists.sourceforge.net \
/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.