Commit 1c03b1a9 authored by John Levon's avatar John Levon Committed by Linus Torvalds

[PATCH] fix sys_lookup_dcookie prototype

We need to use u64 because the future 64-bit ports can theoretically
return the same value for two different dentries, as pointed out by
Ulrich Weigand.

The patch also changes return value of the syscall to give length of
data copied, needed for valgrind support (this bit is by Philippe Elie).

Note this is not a complete fix for mixed 32/64: userspace needs to
figure out the kernel pointer size when reading from the buffer. But
that's another fix...

NOTE! any oprofile users will need to upgrade after this goes in, and
the user-space equivalent is checked into CVS.  Sorry for the inconvenience
parent 97679f9c
......@@ -118,13 +118,13 @@ void sync_stop(void)
* because we cannot reach this code without at least one
* dcookie user still being registered (namely, the reader
* of the event buffer). */
static inline u32 fast_get_dcookie(struct dentry * dentry,
static inline unsigned long fast_get_dcookie(struct dentry * dentry,
struct vfsmount * vfsmnt)
{
u32 cookie;
unsigned long cookie;
if (dentry->d_cookie)
return (u32)dentry;
return (unsigned long)dentry;
get_dcookie(dentry, vfsmnt, &cookie);
return cookie;
}
......@@ -135,9 +135,9 @@ static inline u32 fast_get_dcookie(struct dentry * dentry,
* not strictly necessary but allows oprofile to associate
* shared-library samples with particular applications
*/
static u32 get_exec_dcookie(struct mm_struct * mm)
static unsigned long get_exec_dcookie(struct mm_struct * mm)
{
u32 cookie = 0;
unsigned long cookie = 0;
struct vm_area_struct * vma;
if (!mm)
......@@ -163,9 +163,9 @@ static u32 get_exec_dcookie(struct mm_struct * mm)
* sure to do this lookup before a mm->mmap modification happens so
* we don't lose track.
*/
static u32 lookup_dcookie(struct mm_struct * mm, unsigned long addr, off_t * offset)
static unsigned long lookup_dcookie(struct mm_struct * mm, unsigned long addr, off_t * offset)
{
u32 cookie = 0;
unsigned long cookie = 0;
struct vm_area_struct * vma;
for (vma = find_vma(mm, addr); vma; vma = vma->vm_next) {
......@@ -188,7 +188,7 @@ static u32 lookup_dcookie(struct mm_struct * mm, unsigned long addr, off_t * off
}
static u32 last_cookie = ~0UL;
static unsigned long last_cookie = ~0UL;
static void add_cpu_switch(int i)
{
......@@ -199,7 +199,7 @@ static void add_cpu_switch(int i)
}
static void add_ctx_switch(pid_t pid, u32 cookie)
static void add_ctx_switch(pid_t pid, unsigned long cookie)
{
add_event_entry(ESCAPE_CODE);
add_event_entry(CTX_SWITCH_CODE);
......@@ -208,7 +208,7 @@ static void add_ctx_switch(pid_t pid, u32 cookie)
}
static void add_cookie_switch(u32 cookie)
static void add_cookie_switch(unsigned long cookie)
{
add_event_entry(ESCAPE_CODE);
add_event_entry(COOKIE_SWITCH_CODE);
......@@ -225,7 +225,7 @@ static void add_sample_entry(unsigned long offset, unsigned long event)
static void add_us_sample(struct mm_struct * mm, struct op_sample * s)
{
u32 cookie;
unsigned long cookie;
off_t offset;
cookie = lookup_dcookie(mm, s->eip, &offset);
......@@ -317,7 +317,7 @@ static void sync_buffer(struct oprofile_cpu_buffer * cpu_buf)
{
struct mm_struct * mm = 0;
struct task_struct * new;
u32 cookie;
unsigned long cookie;
int i;
for (i=0; i < cpu_buf->pos; ++i) {
......
......@@ -8,7 +8,7 @@
* non-transitory that can be processed at a later date.
* This is done by locking the dentry/vfsmnt pair in the
* kernel until released by the tasks needing the persistent
* objects. The tag is simply an u32 that refers
* objects. The tag is simply an unsigned long that refers
* to the pair and can be looked up from userspace.
*/
......@@ -46,19 +46,19 @@ static inline int is_live(void)
/* The dentry is locked, its address will do for the cookie */
static inline u32 dcookie_value(struct dcookie_struct * dcs)
static inline unsigned long dcookie_value(struct dcookie_struct * dcs)
{
return (u32)dcs->dentry;
return (unsigned long)dcs->dentry;
}
static size_t dcookie_hash(u32 dcookie)
static size_t dcookie_hash(unsigned long dcookie)
{
return (dcookie >> 2) & (hash_size - 1);
return (dcookie >> L1_CACHE_SHIFT) & (hash_size - 1);
}
static struct dcookie_struct * find_dcookie(u32 dcookie)
static struct dcookie_struct * find_dcookie(unsigned long dcookie)
{
struct dcookie_struct * found = 0;
struct dcookie_struct * dcs;
......@@ -109,7 +109,7 @@ static struct dcookie_struct * alloc_dcookie(struct dentry * dentry,
* value for a dentry/vfsmnt pair.
*/
int get_dcookie(struct dentry * dentry, struct vfsmount * vfsmnt,
u32 * cookie)
unsigned long * cookie)
{
int err = 0;
struct dcookie_struct * dcs;
......@@ -142,11 +142,12 @@ int get_dcookie(struct dentry * dentry, struct vfsmount * vfsmnt,
/* And here is where the userspace process can look up the cookie value
* to retrieve the path.
*/
asmlinkage int sys_lookup_dcookie(u32 cookie, char * buf, size_t len)
asmlinkage int sys_lookup_dcookie(u64 cookie64, char * buf, size_t len)
{
unsigned long cookie = (unsigned long)cookie64;
int err = -EINVAL;
char * kbuf;
char * path;
int err = -EINVAL;
size_t pathlen;
struct dcookie_struct * dcs;
......@@ -170,19 +171,18 @@ asmlinkage int sys_lookup_dcookie(u32 cookie, char * buf, size_t len)
kbuf = kmalloc(PAGE_SIZE, GFP_KERNEL);
if (!kbuf)
goto out;
memset(kbuf, 0, PAGE_SIZE);
/* FIXME: (deleted) ? */
path = d_path(dcs->dentry, dcs->vfsmnt, kbuf, PAGE_SIZE);
err = 0;
err = -ERANGE;
pathlen = kbuf + PAGE_SIZE - path;
if (len > pathlen)
len = pathlen;
if (copy_to_user(buf, path, len))
err = -EFAULT;
if (pathlen <= len) {
err = pathlen;
if (copy_to_user(buf, path, pathlen))
err = -EFAULT;
}
kfree(kbuf);
out:
......
......@@ -44,7 +44,7 @@ void dcookie_unregister(struct dcookie_user * user);
* Returns 0 on success, with *cookie filled in
*/
int get_dcookie(struct dentry * dentry, struct vfsmount * vfsmnt,
u32 * cookie);
unsigned long * cookie);
#else
......@@ -59,7 +59,7 @@ void dcookie_unregister(struct dcookie_user * user)
}
static inline int get_dcookie(struct dentry * dentry,
struct vfsmount * vfsmnt, u32 * cookie)
struct vfsmount * vfsmnt, unsigned long * cookie)
{
return -ENOSYS;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment