Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1362729

Re: [PATCH v6 4/8] debugfs, coccinelle: check for obsolete DEFINE_SIMPLE_ATTRIBUTE() usage

From Julia Lawall <julia.lawall@lip6.fr>
Newsgroups linux.kernel
Subject Re: [PATCH v6 4/8] debugfs, coccinelle: check for obsolete DEFINE_SIMPLE_ATTRIBUTE() usage
Date 2016-03-22 14:20 +0100
Message-ID <rfuo3-4SV-29@gated-at.bofh.it> (permalink)
References <rfuo1-4SV-3@gated-at.bofh.it> <rfuo3-4SV-27@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw



On Tue, 22 Mar 2016, Nicolai Stange wrote:

> In order to protect against file removal races, debugfs files created via
> debugfs_create_file() now get wrapped by a struct file_operations at their
> opening.
>
> If the original struct file_operations are known to be safe against removal
> races by themselves already, the proxy creation may be bypassed by creating
> the files through debugfs_create_file_unsafe().
>
> In order to help debugfs users who use the common
>   DEFINE_SIMPLE_ATTRIBUTE() + debugfs_create_file()
> idiom to transition to removal safe struct file_operations, the helper
> macro DEFINE_DEBUGFS_ATTRIBUTE() has been introduced.
>
> Thus, the preferred strategy is to use
>   DEFINE_DEBUGFS_ATTRIBUTE() + debugfs_create_file_unsafe()
> now.
>
> Introduce a Coccinelle script that searches for
> DEFINE_SIMPLE_ATTRIBUTE()-defined struct file_operations handed into
> debugfs_create_file(). Suggest to turn these usages into the
>   DEFINE_DEBUGFS_ATTRIBUTE() + debugfs_create_file_unsafe()
> pattern.
>
> Signed-off-by: Nicolai Stange <nicstange@gmail.com>

In terms of the structure of the semantic patch:
Acked-by: Julia Lawall <Julia.Lawall@lip6.fr>

> ---
>  .../api/debugfs/debugfs_simple_attr.cocci          | 67 ++++++++++++++++++++++
>  1 file changed, 67 insertions(+)
>  create mode 100644 scripts/coccinelle/api/debugfs/debugfs_simple_attr.cocci
>
> diff --git a/scripts/coccinelle/api/debugfs/debugfs_simple_attr.cocci b/scripts/coccinelle/api/debugfs/debugfs_simple_attr.cocci
> new file mode 100644
> index 0000000..85cf540
> --- /dev/null
> +++ b/scripts/coccinelle/api/debugfs/debugfs_simple_attr.cocci
> @@ -0,0 +1,67 @@
> +/// Use DEFINE_DEBUGFS_ATTRIBUTE rather than DEFINE_SIMPLE_ATTRIBUTE
> +/// for debugfs files.
> +///
> +//# Rationale: DEFINE_SIMPLE_ATTRIBUTE + debugfs_create_file()
> +//# imposes some significant overhead as compared to
> +//# DEFINE_DEBUGFS_ATTRIBUTE + debugfs_create_file_unsafe().
> +//
> +// Copyright (C): 2016 Nicolai Stange
> +// Options: --no-includes
> +//
> +
> +virtual context
> +virtual patch
> +virtual org
> +virtual report
> +
> +@dsa@
> +declarer name DEFINE_SIMPLE_ATTRIBUTE;
> +identifier dsa_fops;
> +expression dsa_get, dsa_set, dsa_fmt;
> +position p;
> +@@
> +DEFINE_SIMPLE_ATTRIBUTE@p(dsa_fops, dsa_get, dsa_set, dsa_fmt);
> +
> +@dcf@
> +expression name, mode, parent, data;
> +identifier dsa.dsa_fops;
> +@@
> +debugfs_create_file(name, mode, parent, data, &dsa_fops)
> +
> +
> +@context_dsa depends on context && dcf@
> +declarer name DEFINE_DEBUGFS_ATTRIBUTE;
> +identifier dsa.dsa_fops;
> +expression dsa.dsa_get, dsa.dsa_set, dsa.dsa_fmt;
> +@@
> +* DEFINE_SIMPLE_ATTRIBUTE(dsa_fops, dsa_get, dsa_set, dsa_fmt);
> +
> +
> +@patch_dcf depends on patch expression@
> +expression name, mode, parent, data;
> +identifier dsa.dsa_fops;
> +@@
> +- debugfs_create_file(name, mode, parent, data, &dsa_fops)
> ++ debugfs_create_file_unsafe(name, mode, parent, data, &dsa_fops)
> +
> +@patch_dsa depends on patch_dcf && patch@
> +identifier dsa.dsa_fops;
> +expression dsa.dsa_get, dsa.dsa_set, dsa.dsa_fmt;
> +@@
> +- DEFINE_SIMPLE_ATTRIBUTE(dsa_fops, dsa_get, dsa_set, dsa_fmt);
> ++ DEFINE_DEBUGFS_ATTRIBUTE(dsa_fops, dsa_get, dsa_set, dsa_fmt);
> +
> +
> +@script:python depends on org && dcf@
> +fops << dsa.dsa_fops;
> +p << dsa.p;
> +@@
> +msg="%s should be defined with DEFINE_DEBUGFS_ATTRIBUTE" % (fops)
> +coccilib.org.print_todo(p[0], msg)
> +
> +@script:python depends on report && dcf@
> +fops << dsa.dsa_fops;
> +p << dsa.p;
> +@@
> +msg="WARNING: %s should be defined with DEFINE_DEBUGFS_ATTRIBUTE" % (fops)
> +coccilib.report.print_report(p[0], msg)
> --
> 2.7.4
>
>

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH v6 0/8] fix debugfs file removal races Nicolai Stange <nicstange@gmail.com> - 2016-03-22 14:20 +0100
  [PATCH v6 4/8] debugfs, coccinelle: check for obsolete DEFINE_SIMPLE_ATTRIBUTE() usage Nicolai Stange <nicstange@gmail.com> - 2016-03-22 14:20 +0100
    Re: [PATCH v6 4/8] debugfs, coccinelle: check for obsolete  DEFINE_SIMPLE_ATTRIBUTE() usage Julia Lawall <julia.lawall@lip6.fr> - 2016-03-22 14:20 +0100
  [PATCH v6 3/8] debugfs: add support for self-protecting attribute file fops Nicolai Stange <nicstange@gmail.com> - 2016-03-22 14:20 +0100
  [PATCH v6 8/8] debugfs: unproxify files created through debugfs_create_u32_array() Nicolai Stange <nicstange@gmail.com> - 2016-03-22 14:20 +0100
  [PATCH v6 2/8] debugfs: prevent access to removed files' private data Nicolai Stange <nicstange@gmail.com> - 2016-03-22 14:20 +0100
  [PATCH v6 6/8] debugfs: unproxify files created through debugfs_create_bool() Nicolai Stange <nicstange@gmail.com> - 2016-03-22 14:20 +0100

csiph-web