Skip to content

Commit

Permalink
d_path: Make get_dcookie() use a struct path argument
Browse files Browse the repository at this point in the history
get_dcookie() is always called with a dentry and a vfsmount from a struct
path.  Make get_dcookie() take it directly as an argument.

[[email protected]: coding-style fixes]
Signed-off-by: Jan Blunck <[email protected]>
Acked-by: Christoph Hellwig <[email protected]>
Cc: Al Viro <[email protected]>
Cc: "J. Bruce Fields" <[email protected]>
Cc: Neil Brown <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Jan Blunck authored and Linus Torvalds committed Feb 15, 2008
1 parent 3dcd25f commit 448678a
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 48 deletions.
15 changes: 6 additions & 9 deletions arch/powerpc/oprofile/cell/spu_task_sync.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,14 +198,13 @@ static int release_cached_info(int spu_index)
* dcookie user still being registered (namely, the reader
* of the event buffer).
*/
static inline unsigned long fast_get_dcookie(struct dentry *dentry,
struct vfsmount *vfsmnt)
static inline unsigned long fast_get_dcookie(struct path *path)
{
unsigned long cookie;

if (dentry->d_cookie)
return (unsigned long)dentry;
get_dcookie(dentry, vfsmnt, &cookie);
if (path->dentry->d_cookie)
return (unsigned long)path->dentry;
get_dcookie(path, &cookie);
return cookie;
}

Expand Down Expand Up @@ -240,8 +239,7 @@ get_exec_dcookie_and_offset(struct spu *spu, unsigned int *offsetp,
continue;
if (!(vma->vm_flags & VM_EXECUTABLE))
continue;
app_cookie = fast_get_dcookie(vma->vm_file->f_dentry,
vma->vm_file->f_vfsmnt);
app_cookie = fast_get_dcookie(&vma->vm_file->f_path);
pr_debug("got dcookie for %s\n",
vma->vm_file->f_dentry->d_name.name);
app = vma->vm_file;
Expand All @@ -262,8 +260,7 @@ get_exec_dcookie_and_offset(struct spu *spu, unsigned int *offsetp,
break;
}

*spu_bin_dcookie = fast_get_dcookie(vma->vm_file->f_dentry,
vma->vm_file->f_vfsmnt);
*spu_bin_dcookie = fast_get_dcookie(&vma->vm_file->f_path);
pr_debug("got dcookie for %s\n", vma->vm_file->f_dentry->d_name.name);

up_read(&mm->mmap_sem);
Expand Down
21 changes: 9 additions & 12 deletions drivers/oprofile/buffer_sync.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,23 +187,22 @@ void sync_stop(void)
end_sync();
}


/* Optimisation. We can manage without taking the dcookie sem
* because we cannot reach this code without at least one
* dcookie user still being registered (namely, the reader
* of the event buffer). */
static inline unsigned long fast_get_dcookie(struct dentry * dentry,
struct vfsmount * vfsmnt)
static inline unsigned long fast_get_dcookie(struct path *path)
{
unsigned long cookie;
if (dentry->d_cookie)
return (unsigned long)dentry;
get_dcookie(dentry, vfsmnt, &cookie);

if (path->dentry->d_cookie)
return (unsigned long)path->dentry;
get_dcookie(path, &cookie);
return cookie;
}


/* Look up the dcookie for the task's first VM_EXECUTABLE mapping,
* which corresponds loosely to "application name". This is
* not strictly necessary but allows oprofile to associate
Expand All @@ -222,8 +221,7 @@ static unsigned long get_exec_dcookie(struct mm_struct * mm)
continue;
if (!(vma->vm_flags & VM_EXECUTABLE))
continue;
cookie = fast_get_dcookie(vma->vm_file->f_path.dentry,
vma->vm_file->f_path.mnt);
cookie = fast_get_dcookie(&vma->vm_file->f_path);
break;
}

Expand All @@ -248,8 +246,7 @@ static unsigned long lookup_dcookie(struct mm_struct * mm, unsigned long addr, o
continue;

if (vma->vm_file) {
cookie = fast_get_dcookie(vma->vm_file->f_path.dentry,
vma->vm_file->f_path.mnt);
cookie = fast_get_dcookie(&vma->vm_file->f_path);
*offset = (vma->vm_pgoff << PAGE_SHIFT) + addr -
vma->vm_start;
} else {
Expand Down
34 changes: 15 additions & 19 deletions fs/dcookies.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@
#include <linux/errno.h>
#include <linux/dcookies.h>
#include <linux/mutex.h>
#include <linux/path.h>
#include <asm/uaccess.h>

/* The dcookies are allocated from a kmem_cache and
* hashed onto a small number of lists. None of the
* code here is particularly performance critical
*/
struct dcookie_struct {
struct dentry * dentry;
struct vfsmount * vfsmnt;
struct path path;
struct list_head hash_list;
};

Expand All @@ -51,7 +51,7 @@ static inline int is_live(void)
/* The dentry is locked, its address will do for the cookie */
static inline unsigned long dcookie_value(struct dcookie_struct * dcs)
{
return (unsigned long)dcs->dentry;
return (unsigned long)dcs->path.dentry;
}


Expand Down Expand Up @@ -89,28 +89,25 @@ static void hash_dcookie(struct dcookie_struct * dcs)
}


static struct dcookie_struct * alloc_dcookie(struct dentry * dentry,
struct vfsmount * vfsmnt)
static struct dcookie_struct *alloc_dcookie(struct path *path)
{
struct dcookie_struct * dcs = kmem_cache_alloc(dcookie_cache, GFP_KERNEL);
struct dcookie_struct *dcs = kmem_cache_alloc(dcookie_cache,
GFP_KERNEL);
if (!dcs)
return NULL;

dentry->d_cookie = dcs;

dcs->dentry = dget(dentry);
dcs->vfsmnt = mntget(vfsmnt);
path->dentry->d_cookie = dcs;
dcs->path = *path;
path_get(path);
hash_dcookie(dcs);

return dcs;
}


/* This is the main kernel-side routine that retrieves the cookie
* value for a dentry/vfsmnt pair.
*/
int get_dcookie(struct dentry * dentry, struct vfsmount * vfsmnt,
unsigned long * cookie)
int get_dcookie(struct path *path, unsigned long *cookie)
{
int err = 0;
struct dcookie_struct * dcs;
Expand All @@ -122,10 +119,10 @@ int get_dcookie(struct dentry * dentry, struct vfsmount * vfsmnt,
goto out;
}

dcs = dentry->d_cookie;
dcs = path->dentry->d_cookie;

if (!dcs)
dcs = alloc_dcookie(dentry, vfsmnt);
dcs = alloc_dcookie(path);

if (!dcs) {
err = -ENOMEM;
Expand Down Expand Up @@ -174,7 +171,7 @@ asmlinkage long sys_lookup_dcookie(u64 cookie64, char __user * buf, size_t len)
goto out;

/* FIXME: (deleted) ? */
path = d_path(dcs->dentry, dcs->vfsmnt, kbuf, PAGE_SIZE);
path = d_path(dcs->path.dentry, dcs->path.mnt, kbuf, PAGE_SIZE);

if (IS_ERR(path)) {
err = PTR_ERR(path);
Expand Down Expand Up @@ -254,9 +251,8 @@ static int dcookie_init(void)

static void free_dcookie(struct dcookie_struct * dcs)
{
dcs->dentry->d_cookie = NULL;
dput(dcs->dentry);
mntput(dcs->vfsmnt);
dcs->path.dentry->d_cookie = NULL;
path_put(&dcs->path);
kmem_cache_free(dcookie_cache, dcs);
}

Expand Down
15 changes: 7 additions & 8 deletions include/linux/dcookies.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#ifdef CONFIG_PROFILING

#include <linux/dcache.h>
#include <linux/path.h>
#include <linux/types.h>

struct dcookie_user;
Expand Down Expand Up @@ -43,8 +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,
unsigned long * cookie);
int get_dcookie(struct path *path, unsigned long *cookie);

#else

Expand All @@ -57,13 +57,12 @@ static inline void dcookie_unregister(struct dcookie_user * user)
{
return;
}

static inline int get_dcookie(struct dentry * dentry,
struct vfsmount * vfsmnt, unsigned long * cookie)

static inline int get_dcookie(struct path *path, unsigned long *cookie)
{
return -ENOSYS;
}
}

#endif /* CONFIG_PROFILING */

#endif /* DCOOKIES_H */

0 comments on commit 448678a

Please sign in to comment.