diff options
author | David Smith <dsmith@redhat.com> | 2010-02-03 11:56:58 -0600 |
---|---|---|
committer | David Smith <dsmith@redhat.com> | 2010-02-03 11:56:58 -0600 |
commit | 23b7dbfaf1e9860f77b6bf1aa3da8610bf31b03c (patch) | |
tree | e04422de3d0c79bd1a2a62d97419a0cd01b292f7 /runtime/procfs.c | |
parent | 0d1ad607311857dc0b4666ce8a84c1a59c615ab9 (diff) | |
download | systemtap-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.c | 15 |
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: |