lkml.org 
[lkml]   [2009]   [Jul]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH] tracing: dont reset set_ftrace_filter/notrace when opened with r/w perm
    On Mon, Jul 20, 2009 at 09:11:34PM -0400, Steven Rostedt wrote:
    >
    > On Thu, 16 Jul 2009, Jiri Olsa wrote:
    >
    > > If user setup set_ftrace_filter/set_ftrace_notrace files and then opens them
    > > with read&write permissions, the previous setup will be removed.
    >
    > This is exactly what it was suppose to do.
    >
    > man fopen:
    >
    > w+ Open for reading and writing. The file is created if it does
    > not exist, otherwise it is truncated. The stream is positioned
    > at the beginning of the file.
    >
    > Which means that if you open a file for "w+" it will truncate it. Hence,
    > you will remove all previous settings.
    >
    > What you want is:
    >
    > a+ Open for reading and appending (writing at end of file). The
    > file is created if it does not exist. The initial file position
    > for reading is at the beginning of the file, but output is
    > always appended to the end of the file.
    >
    > Change the belowe code from "w+" to "a+" and you get your expected result.

    My point was that if you open set_ftrace_filter/set_ftrace_notrace with just O_RDWR
    perm. and will use the file just for reading, the filter will reset.

    You're right about the "w+", there's the O_CREAT|O_TRUNC, sry I missed that.. ;)
    Anyway with "r+" you'll get O_RDWR perm. only, showing the issue:


    sh-4.0# echo "sys_open sys_write" > ./set_ftrace_filter
    sh-4.0# cat ./set_ftrace_filter
    sys_open
    sys_write
    sh-4.0# /ft ./set_ftrace_filter r+
    #### all functions enabled ####
    sh-4.0# cat ./set_ftrace_filter
    #### all functions enabled ####
    sh-4.0#


    wbr,
    jirka

    >
    > Thus, the current code is correct.
    >
    > -- Steve
    >
    >
    >
    > >
    > > Tested with following program:
    > >
    > > [snip]
    > > #include <stdio.h>
    > > #include <string.h>
    > >
    > > int main(int argc, char **argv)
    > > {
    > > FILE *f;
    > > char *mode = "w+";
    > > char *file = argv[1];
    > >
    > > if (argc == 3)
    > > mode = argv[2];
    > >
    > > if (NULL == (f = fopen(file, mode))) {
    > > perror("fopen failed");
    > > return -1;
    > > }
    > >
    > > while(!feof(f)) {
    > > #define BUFLEN 100
    > > char buf[BUFLEN];
    > > memset(buf, 0, BUFLEN);
    > > fgets(buf, BUFLEN, f);
    > > printf(buf);
    > > }
    > >
    > > fclose(f);
    > > return 0;
    > > }
    > > [snip]
    > >
    > > wbr,
    > > jirka
    > >
    > >
    > > Signed-off-by: Jiri Olsa <jolsa@redhat.com>
    > >
    > > ---
    > > diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
    > > index 4521c77..11394bc 100644
    > > --- a/kernel/trace/ftrace.c
    > > +++ b/kernel/trace/ftrace.c
    > > @@ -1661,10 +1661,6 @@ ftrace_regex_open(struct inode *inode, struct file *file, int enable)
    > > return -ENOMEM;
    > >
    > > mutex_lock(&ftrace_regex_lock);
    > > - if ((file->f_mode & FMODE_WRITE) &&
    > > - !(file->f_flags & O_APPEND))
    > > - ftrace_filter_reset(enable);
    > > -
    > > if (file->f_mode & FMODE_READ) {
    > > iter->pg = ftrace_pages_start;
    > > iter->flags = enable ? FTRACE_ITER_FILTER :
    > > @@ -2260,6 +2256,9 @@ ftrace_regex_write(struct file *file, const char __user *ubuf,
    > > return 0;
    > >
    > > mutex_lock(&ftrace_regex_lock);
    > > + if ((file->f_mode & FMODE_WRITE) &&
    > > + !(file->f_flags & O_APPEND))
    > > + ftrace_filter_reset(enable);
    > >
    > > if (file->f_mode & FMODE_READ) {
    > > struct seq_file *m = file->private_data;
    > >


    \
     
     \ /
      Last update: 2009-07-22 09:45    [W:0.034 / U:33.880 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site