• Milos Vyletel's avatar
    perf tools: Avoid possible race condition in copyfile() · d7c72606
    Milos Vyletel authored
    Use unique temporary files when copying to buildid dir to prevent races
    in case multiple instances are trying to copy same file. This is done by
    
    - creating template in form <path>/.<filename>.XXXXXX where the suffix is
      used by mkstemp() to create unique file
    - change file mode
    - copy content
    - if successful link temp file to target file
    - unlink temp file
    
    At this point the only file left at target path should be the desired
    one either created by us or other instance if we raced. This should also
    prevent not yet fully copied files to be visible to to other perf
    instances that could try to parse them.
    
    On top of that slow_copyfile no longer needs to deal with file mode when
    creating file since temporary file is already created and mode is set.
    
    Succesfully tested by myself by running perf record, archive and reading
    the data on other system and by running perf buildid-cache on perf
    binary itself. I also did revert fix from 0635b0f7 that to exposes
    previously fixed race with EEXIST and recreator test passed sucessfully.
    Signed-off-by: default avatarMilos Vyletel <milos@redhat.com>
    Acked-by: default avatarIngo Molnar <mingo@kernel.org>
    Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Cc: Don Zickus <dzickus@redhat.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Link: http://lkml.kernel.org/r/1433775018-19868-1-git-send-email-milos@redhat.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    d7c72606
util.c 11.6 KB