• Song Liu's avatar
    tracing: Fix bad use of igrab in trace_uprobe.c · 0c92c7a3
    Song Liu authored
    As Miklos reported and suggested:
    
      This pattern repeats two times in trace_uprobe.c and in
      kernel/events/core.c as well:
    
          ret = kern_path(filename, LOOKUP_FOLLOW, &path);
          if (ret)
              goto fail_address_parse;
    
          inode = igrab(d_inode(path.dentry));
          path_put(&path);
    
      And it's wrong.  You can only hold a reference to the inode if you
      have an active ref to the superblock as well (which is normally
      through path.mnt) or holding s_umount.
    
      This way unmounting the containing filesystem while the tracepoint is
      active will give you the "VFS: Busy inodes after unmount..." message
      and a crash when the inode is finally put.
    
      Solution: store path instead of inode.
    
    This patch fixes two instances in trace_uprobe.c. struct path is added to
    struct trace_uprobe to keep the inode and containing mount point
    referenced.
    
    Link: http://lkml.kernel.org/r/20180423172135.4050588-1-songliubraving@fb.com
    
    Fixes: f3f096cf ("tracing: Provide trace events interface for uprobes")
    Fixes: 33ea4b24 ("perf/core: Implement the 'perf_uprobe' PMU")
    Cc: stable@vger.kernel.org
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Howard McLauchlan <hmclauchlan@fb.com>
    Cc: Josef Bacik <jbacik@fb.com>
    Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    Acked-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
    Reported-by: default avatarMiklos Szeredi <miklos@szeredi.hu>
    Signed-off-by: default avatarSong Liu <songliubraving@fb.com>
    Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
    0c92c7a3
trace_uprobe.c 32 KB