OProfile: allow normal user to trigger sample dumps
PATCH 1/1 OProfile: allow normal user to trigger sample dumps
In 2.4, OProfile allowed normal users to trigger sample dumps (useful under low sample load). The patch below, by Will Cohen, allows this for 2.6 too. Against 2.6.7
Please apply
thanks
john
drivers/oprofile/oprofile_files.c renamed from drivers/oprofile/oprofile_files.c.userdump +1 -1
@@ -90,7 +90,7 @@void oprofile_create_files (struct super_block * sb,struct dentry * root) {oprofilefs_create_file (sb, root,"enable" , &enable_fops); -oprofilefs_create_file (sb, root,"dump" , &dump_fops); +oprofilefs_create_file_perm (sb, root,"dump" , &dump_fops,0666 );oprofilefs_create_file (sb, root,"buffer" , &event_buffer_fops);oprofilefs_create_ulong (sb, root,"buffer_size" , &fs_buffer_size);oprofilefs_create_ulong (sb, root,"buffer_watershed" , &fs_buffer_watershed);
drivers/oprofile/oprofilefs.c renamed from drivers/oprofile/oprofilefs.c.userdump +19 -6
@@ -165,7 +165,8 @@static struct dentry *__oprofilefs_create_file (struct super_block * sb, -struct dentry * root,char const * name,struct file_operations * fops) +struct dentry * root,char const * name,struct file_operations * fops, +int perm) {struct dentry * dentry;struct inode * inode;
@@ -176,7 +177,7 @@ dentry =d_alloc (root, &qname);if (!dentry)return 0 ; - inode =oprofilefs_get_inode (sb,S_IFREG |0644 ); + inode =oprofilefs_get_inode (sb,S_IFREG | perm);if (!inode) {dput (dentry);return 0 ;
@@ -190,7 +191,8 @@int oprofilefs_create_ulong (struct super_block * sb,struct dentry * root,char const * name,unsigned long * val) { -struct dentry * d =__oprofilefs_create_file (sb, root, name, &ulong_fops); +struct dentry * d =__oprofilefs_create_file (sb, root, name, + &ulong_fops,0644 );if (!d)return -EFAULT ;
@@ -202,7 +204,8 @@int oprofilefs_create_ro_ulong (struct super_block * sb,struct dentry * root,char const * name,unsigned long * val) { -struct dentry * d =__oprofilefs_create_file (sb, root, name, &ulong_ro_fops); +struct dentry * d =__oprofilefs_create_file (sb, root, name, + &ulong_ro_fops,0444 );if (!d)return -EFAULT ;
@@ -227,7 +230,8 @@int oprofilefs_create_ro_atomic (struct super_block * sb,struct dentry * root,char const * name,atomic_t * val) { -struct dentry * d =__oprofilefs_create_file (sb, root, name, &atomic_ro_fops); +struct dentry * d =__oprofilefs_create_file (sb, root, name, + &atomic_ro_fops,0444 );if (!d)return -EFAULT ;
@@ -239,7 +243,16 @@int oprofilefs_create_file (struct super_block * sb,struct dentry * root,char const * name,struct file_operations * fops) { -if (!__oprofilefs_create_file (sb, root, name, fops)) +if (!__oprofilefs_create_file (sb, root, name, fops,0644 )) +return -EFAULT ; +return 0 ; +} + + +int oprofilefs_create_file_perm (struct super_block * sb,struct dentry * root, +char const * name,struct file_operations * fops,int perm) +{ +if (!__oprofilefs_create_file (sb, root, name, fops, perm))return -EFAULT ;return 0 ; }
include/linux/oprofile.h renamed from include/linux/oprofile.h.userdump +3 -0
@@ -65,6 +65,9 @@*/ int oprofilefs_create_file (struct super_block * sb,struct dentry * root,char const * name,struct file_operations * fops); + +int oprofilefs_create_file_perm (struct super_block * sb,struct dentry * root, +char const * name,struct file_operations * fops,int perm);/** Create a file for read/write access to an unsigned long. */ int oprofilefs_create_ulong(struct super_block * sb, struct dentry * root,
Quoted 5 lines · John Levon
In 2.4, OProfile allowed normal users to trigger sample dumps (useful under low sample load). The patch below, by Will Cohen, allows this for 2.6 too. Against 2.6.7
The patch didn't apply cleanly (minor problem but I redo the diff), it works fine on my box and it's usefull imho. Please apply
regards,
Phil
drivers/oprofile/oprofile_files.c renamed from drivers/oprofile/oprofile_files.c.userdump +1 -1
@@ -90,7 +90,7 @@void oprofile_create_files (struct super_block * sb,struct dentry * root) {oprofilefs_create_file (sb, root,"enable" , &enable_fops); -oprofilefs_create_file (sb, root,"dump" , &dump_fops); +oprofilefs_create_file_perm (sb, root,"dump" , &dump_fops,0666 );oprofilefs_create_file (sb, root,"buffer" , &event_buffer_fops);oprofilefs_create_ulong (sb, root,"buffer_size" , &fs_buffer_size);oprofilefs_create_ulong (sb, root,"buffer_watershed" , &fs_buffer_watershed);
drivers/oprofile/oprofilefs.c renamed from drivers/oprofile/oprofilefs.c.userdump +19 -6
@@ -165,7 +165,8 @@static struct dentry *__oprofilefs_create_file (struct super_block * sb, -struct dentry * root,char const * name,struct file_operations * fops) +struct dentry * root,char const * name,struct file_operations * fops, +int perm) {struct dentry * dentry;struct inode * inode;
@@ -176,7 +177,7 @@ dentry =d_alloc (root, &qname);if (!dentry)return 0 ; - inode =oprofilefs_get_inode (sb,S_IFREG |0644 ); + inode =oprofilefs_get_inode (sb,S_IFREG | perm);if (!inode) {dput (dentry);return 0 ;
@@ -190,7 +191,8 @@int oprofilefs_create_ulong (struct super_block * sb,struct dentry * root,char const * name,unsigned long * val) { -struct dentry * d =__oprofilefs_create_file (sb, root, name, &ulong_fops); +struct dentry * d =__oprofilefs_create_file (sb, root, name, + &ulong_fops,0644 );if (!d)return -EFAULT ;
@@ -202,7 +204,8 @@int oprofilefs_create_ro_ulong (struct super_block * sb,struct dentry * root,char const * name,unsigned long * val) { -struct dentry * d =__oprofilefs_create_file (sb, root, name, &ulong_ro_fops); +struct dentry * d =__oprofilefs_create_file (sb, root, name, + &ulong_ro_fops,0444 );if (!d)return -EFAULT ;
@@ -227,7 +230,8 @@int oprofilefs_create_ro_atomic (struct super_block * sb,struct dentry * root,char const * name,atomic_t * val) { -struct dentry * d =__oprofilefs_create_file (sb, root, name, &atomic_ro_fops); +struct dentry * d =__oprofilefs_create_file (sb, root, name, + &atomic_ro_fops,0444 );if (!d)return -EFAULT ;
@@ -239,7 +243,16 @@int oprofilefs_create_file (struct super_block * sb,struct dentry * root,char const * name,struct file_operations * fops) { -if (!__oprofilefs_create_file (sb, root, name, fops)) +if (!__oprofilefs_create_file (sb, root, name, fops,0644 )) +return -EFAULT ; +return 0 ; +} + + +int oprofilefs_create_file_perm (struct super_block * sb,struct dentry * root, +char const * name,struct file_operations * fops,int perm) +{ +if (!__oprofilefs_create_file (sb, root, name, fops, perm))return -EFAULT ;return 0 ; }
include/linux/oprofile.h renamed from include/linux/oprofile.h.userdump +3 -0
@@ -65,6 +65,9 @@*/ int oprofilefs_create_file (struct super_block * sb,struct dentry * root,char const * name,struct file_operations * fops); + +int oprofilefs_create_file_perm (struct super_block * sb,struct dentry * root, +char const * name,struct file_operations * fops,int perm);/** Create a file for read/write access to an unsigned long. */ int oprofilefs_create_ulong(struct super_block * sb, struct dentry * root,