summaryrefslogtreecommitdiffstats
path: root/runtime/procfs.c
diff options
context:
space:
mode:
authorDavid Smith <dsmith@redhat.com>2010-02-03 11:56:58 -0600
committerDavid Smith <dsmith@redhat.com>2010-02-03 11:56:58 -0600
commit23b7dbfaf1e9860f77b6bf1aa3da8610bf31b03c (patch)
treee04422de3d0c79bd1a2a62d97419a0cd01b292f7 /runtime/procfs.c
parent0d1ad607311857dc0b4666ce8a84c1a59c615ab9 (diff)
downloadsystemtap-steved-23b7dbfaf1e9860f77b6bf1aa3da8610bf31b03c.tar.gz
systemtap-steved-23b7dbfaf1e9860f77b6bf1aa3da8610bf31b03c.tar.xz
systemtap-steved-23b7dbfaf1e9860f77b6bf1aa3da8610bf31b03c.zip
Fixed PR 11078. Changed code to avoided procfs race condition.
* runtime/procfs.c: Allow STP_MAX_PROCFS_FILES define to be overridden. (_stp_create_procfs): Calls proc_create() instead of create_proc_entry() to avoid a race condition. * runtime/procfs-probes.c: New file containing procfs probe support routines. * tapset-procfs.cxx (procfs_derived_probe::join_group): Update struct _stp_procfs_data definition. (procfs_derived_probe::emit_module_decls): Include procfs-probes.c, which is where the definition of struct stap_procfs_probe exists. Update generated routines to read/write procfs data. (procfs_derived_probe_group::emit_module_init): Pass file_operations argument to _stp_create_procfs(). Initialize mutex. (procfs_var_expanding_visitor::visit_target_symbol): Update generated code.
Diffstat (limited to 'runtime/procfs.c')
-rw-r--r--runtime/procfs.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/runtime/procfs.c b/runtime/procfs.c
index 1d2ad837..1fd9fcc5 100644
--- a/runtime/procfs.c
+++ b/runtime/procfs.c
@@ -17,7 +17,10 @@
#ifndef _STP_PROCFS_C_
#define _STP_PROCFS_C_
+#ifndef STP_MAX_PROCFS_FILES
#define STP_MAX_PROCFS_FILES 16
+#endif
+
static int _stp_num_pde = 0;
static struct proc_dir_entry *_stp_pde[STP_MAX_PROCFS_FILES];
static struct proc_dir_entry *_stp_procfs_files[STP_MAX_PROCFS_FILES];
@@ -131,7 +134,8 @@ static struct proc_dir_entry *_stp_procfs_lookup(const char *dir, struct proc_di
return NULL;
}
-static int _stp_create_procfs(const char *path, int num)
+static int _stp_create_procfs(const char *path, int num,
+ const struct file_operations *fops)
{
const char *p;
char *next;
@@ -182,15 +186,18 @@ static int _stp_create_procfs(const char *path, int num)
if (_stp_num_pde == STP_MAX_PROCFS_FILES)
goto too_many;
- de = create_proc_entry (p, 0600, last_dir);
+ de = proc_create(p, 0600, last_dir, fops);
if (de == NULL) {
_stp_error("Could not create file \"%s\" in path \"%s\"\n", p, path);
goto err;
}
- _stp_pde[_stp_num_pde++] = de;
- _stp_procfs_files[num] = de;
+#ifdef AUTOCONF_PROCFS_OWNER
+ de->owner = THIS_MODULE;
+#endif
de->uid = _stp_uid;
de->gid = _stp_gid;
+ _stp_pde[_stp_num_pde++] = de;
+ _stp_procfs_files[num] = de;
return 0;
too_many: