diff options
| -rw-r--r-- | drivers/oprofile/oprof.c | 21 | ||||
| -rw-r--r-- | drivers/oprofile/oprof.h | 2 | ||||
| -rw-r--r-- | drivers/oprofile/oprofile_files.c | 7 | ||||
| -rw-r--r-- | drivers/oprofile/oprofilefs.c | 8 | 
4 files changed, 18 insertions, 20 deletions
| diff --git a/drivers/oprofile/oprof.c b/drivers/oprofile/oprof.c index b4a685719dba..f9bda64fcd1b 100644 --- a/drivers/oprofile/oprof.c +++ b/drivers/oprofile/oprof.c @@ -225,26 +225,17 @@ post_sync:  	mutex_unlock(&start_mutex);  } -int oprofile_set_backtrace(unsigned long val) +int oprofile_set_ulong(unsigned long *addr, unsigned long val)  { -	int err = 0; +	int err = -EBUSY;  	mutex_lock(&start_mutex); - -	if (oprofile_started) { -		err = -EBUSY; -		goto out; +	if (!oprofile_started) { +		*addr = val; +		err = 0;  	} - -	if (!oprofile_ops.backtrace) { -		err = -EINVAL; -		goto out; -	} - -	oprofile_backtrace_depth = val; - -out:  	mutex_unlock(&start_mutex); +  	return err;  } diff --git a/drivers/oprofile/oprof.h b/drivers/oprofile/oprof.h index 47e12cb4ee8b..177b73de5e5f 100644 --- a/drivers/oprofile/oprof.h +++ b/drivers/oprofile/oprof.h @@ -37,7 +37,7 @@ void oprofile_create_files(struct super_block *sb, struct dentry *root);  int oprofile_timer_init(struct oprofile_operations *ops);  void oprofile_timer_exit(void); -int oprofile_set_backtrace(unsigned long depth); +int oprofile_set_ulong(unsigned long *addr, unsigned long val);  int oprofile_set_timeout(unsigned long time);  #endif /* OPROF_H */ diff --git a/drivers/oprofile/oprofile_files.c b/drivers/oprofile/oprofile_files.c index bbd7516e0869..ccf099e684a4 100644 --- a/drivers/oprofile/oprofile_files.c +++ b/drivers/oprofile/oprofile_files.c @@ -79,14 +79,17 @@ static ssize_t depth_write(struct file *file, char const __user *buf, size_t cou  	if (*offset)  		return -EINVAL; +	if (!oprofile_ops.backtrace) +		return -EINVAL; +  	retval = oprofilefs_ulong_from_user(&val, buf, count);  	if (retval)  		return retval; -	retval = oprofile_set_backtrace(val); - +	retval = oprofile_set_ulong(&oprofile_backtrace_depth, val);  	if (retval)  		return retval; +  	return count;  } diff --git a/drivers/oprofile/oprofilefs.c b/drivers/oprofile/oprofilefs.c index 789a1a857ddf..1944621930d9 100644 --- a/drivers/oprofile/oprofilefs.c +++ b/drivers/oprofile/oprofilefs.c @@ -91,16 +91,20 @@ static ssize_t ulong_read_file(struct file *file, char __user *buf, size_t count  static ssize_t ulong_write_file(struct file *file, char const __user *buf, size_t count, loff_t *offset)  { -	unsigned long *value = file->private_data; +	unsigned long value;  	int retval;  	if (*offset)  		return -EINVAL; -	retval = oprofilefs_ulong_from_user(value, buf, count); +	retval = oprofilefs_ulong_from_user(&value, buf, count); +	if (retval) +		return retval; +	retval = oprofile_set_ulong(file->private_data, value);  	if (retval)  		return retval; +  	return count;  } |