2007-09-27 14:11:14

by Jan Blunck

[permalink] [raw]
Subject: [patch 08/10] Introduce path_get()

This introduces the symmetric function to path_put() for getting a reference
to the dentry and vfsmount of a struct path in the right order.

Signed-off-by: Jan Blunck <[email protected]>
Signed-off-by: Andreas Gruenbacher <[email protected]>
---
fs/namei.c | 17 +++++++++++++++--
include/linux/path.h | 1 +
2 files changed, 16 insertions(+), 2 deletions(-)

Index: b/fs/namei.c
===================================================================
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -348,6 +348,20 @@ int deny_write_access(struct file * file
}

/**
+ * path_get - get a reference to a path
+ * @path: path to get the reference to
+ *
+ * Given a path increment the reference count to the dentry and the vfsmount.
+ */
+struct path *path_get(struct path *path)
+{
+ mntget(path->mnt);
+ dget(path->dentry);
+ return path;
+}
+EXPORT_SYMBOL(path_get);
+
+/**
* path_put - put a reference to a path
* @path: path to put the reference to
*
@@ -1145,8 +1159,7 @@ static int fastcall do_path_lookup(int d
if (retval)
goto fput_fail;

- nd->path.mnt = mntget(file->f_path.mnt);
- nd->path.dentry = dget(dentry);
+ nd->path = *path_get(&file->f_path);

fput_light(file, fput_needed);
}
Index: b/include/linux/path.h
===================================================================
--- a/include/linux/path.h
+++ b/include/linux/path.h
@@ -9,6 +9,7 @@ struct path {
struct dentry *dentry;
};

+extern struct path *path_get(struct path *);
extern void path_put(struct path *);

#endif /* _LINUX_PATH_H */

--


2007-09-28 18:40:21

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [patch 08/10] Introduce path_get()

On Thu, Sep 27, 2007 at 04:12:08PM +0200, [email protected] wrote:
> This introduces the symmetric function to path_put() for getting a reference
> to the dentry and vfsmount of a struct path in the right order.

Looks good in general,

> /**
> + * path_get - get a reference to a path
> + * @path: path to get the reference to
> + *
> + * Given a path increment the reference count to the dentry and the vfsmount.
> + */
> +struct path *path_get(struct path *path)
> +{
> + mntget(path->mnt);
> + dget(path->dentry);
> + return path;
> +}

but the calling convention is rather odd, because the only thing callers
might do with this is to dereference and then assign it. Maybe this
should just return void to make it more clear what's going on?