2007-09-27 14:10:18

by Jan Blunck

[permalink] [raw]
Subject: [patch 00/10] Use struct path in struct nameidata

This is a respin of the patch series Andreas posted last month. It leaves out
the restructuring of the intent which will be done at a later point in time.

There are three preparing patches that remove unneeded code IMHO. I haven't
got feedback from Takashi since he is on holiday. Please, can somebody else
acknowledge the changes?

Comments?
Jan
--


2007-09-28 20:43:18

by Andreas Gruenbacher

[permalink] [raw]
Subject: [patch] Combine path_put and path_put_conditional

Here is another cleanup on top of Jan's set. Comments?


The name path_put_conditional (formerly, dput_path) is a little unclear.
Replace (path_put_conditional + path_put) with path_walk_put_both,
"put a pair of paths after a path_walk" (see the kerneldoc).

Signed-off-by: Andreas Gruenbacher <[email protected]>

Index: linux-2.6/fs/namei.c
===================================================================
--- linux-2.6.orig/fs/namei.c
+++ linux-2.6/fs/namei.c
@@ -582,11 +582,22 @@ fail:
return PTR_ERR(link);
}

-static void path_put_conditional(struct path *path, struct nameidata *nd)
-{
- dput(path->dentry);
- if (path->mnt != nd->path.mnt)
- mntput(path->mnt);
+/**
+ * path_walk_put_both - put a pair of paths after a path_walk
+ * @path1: first path to put
+ * @path2: second path to put
+ *
+ * When walking a path we keep the same vfsmnt reference while on the same
+ * filesystem, and grab a reference to the new vfsmnt when crossing mount
+ * points. Put both @path1 and @path2 under this assumption.
+ */
+static void path_walk_put_both(struct path *path1, struct path *path2)
+{
+ dput(path1->dentry);
+ dput(path2->dentry);
+ mntput(path1->mnt);
+ if (path1->mnt != path2->mnt)
+ mntput(path2->mnt);
}

static inline void path_to_nameidata(struct path *path, struct nameidata *nd)
@@ -654,8 +665,7 @@ static inline int do_follow_link(struct
nd->depth--;
return err;
loop:
- path_put_conditional(path, nd);
- path_put(&nd->path);
+ path_walk_put_both(path, &nd->path);
return err;
}

@@ -996,8 +1006,8 @@ return_reval:
return_base:
return 0;
out_dput:
- path_put_conditional(&next, nd);
- break;
+ path_walk_put_both(&next, &nd->path);
+ goto return_err;
}
path_put(&nd->path);
return_err:
@@ -1777,11 +1787,15 @@ ok:
return 0;

exit_dput:
- path_put_conditional(&path, nd);
+ path_walk_put_both(&path, &nd->path);
+ goto exit_intent;
+
exit:
+ path_put(&nd->path);
+
+exit_intent:
if (!IS_ERR(nd->intent.open.file))
release_open_intent(nd);
- path_put(&nd->path);
return error;

do_link:

2007-09-29 09:26:13

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [patch] Combine path_put and path_put_conditional

On Fri, Sep 28, 2007 at 10:43:50PM +0200, Andreas Gruenbacher wrote:
> Here is another cleanup on top of Jan's set. Comments?
>
>
> The name path_put_conditional (formerly, dput_path) is a little unclear.
> Replace (path_put_conditional + path_put) with path_walk_put_both,
> "put a pair of paths after a path_walk" (see the kerneldoc).

I think this function is a good idea. The name seems odd to me, but
I don't really have a better idea either.

> +static void path_walk_put_both(struct path *path1, struct path *path2)
> +{
> + dput(path1->dentry);
> + dput(path2->dentry);
> + mntput(path1->mnt);
> + if (path1->mnt != path2->mnt)
> + mntput(path2->mnt);
> }

Why do you opencode the path_put for path1?

2007-09-29 12:36:22

by Jan Blunck

[permalink] [raw]
Subject: Re: [patch] Combine path_put and path_put_conditional

On Fri, Sep 28, Andreas Gruenbacher wrote:

> The name path_put_conditional (formerly, dput_path) is a little unclear.
> Replace (path_put_conditional + path_put) with path_walk_put_both,
> "put a pair of paths after a path_walk" (see the kerneldoc).

Hmm, I don't know. To put both the nd and path is at the moment only used in
some error paths. I have another series of patches pending which is using
path_put_conditional outside of error paths. So please don't remove
it. Besides that the naming completely hides that the conditional release of
the vfsmount reference. Besides that I would name it path_put_both() just to
make it more "beautiful" wrt the other path_put*() functions.

> @@ -996,8 +1006,8 @@ return_reval:
> return_base:
> return 0;
> out_dput:
> - path_put_conditional(&next, nd);
> - break;
> + path_walk_put_both(&next, &nd->path);
> + goto return_err;
> }
> path_put(&nd->path);
> return_err:
> @@ -1777,11 +1787,15 @@ ok:
> return 0;
>
> exit_dput:
> - path_put_conditional(&path, nd);
> + path_walk_put_both(&path, &nd->path);
> + goto exit_intent;
> +
> exit:
> + path_put(&nd->path);
> +
> +exit_intent:
> if (!IS_ERR(nd->intent.open.file))
> release_open_intent(nd);
> - path_put(&nd->path);
> return error;
>
> do_link:

IMHO introducing another label just to use it here isn't worth the change.

2007-09-29 22:18:44

by Ingo Oeser

[permalink] [raw]
Subject: Re: [patch] Combine path_put and path_put_conditional

Hi Andreas,

On Friday 28 September 2007, Andreas Gruenbacher wrote:
> The name path_put_conditional (formerly, dput_path) is a little unclear.
> Replace (path_put_conditional + path_put) with path_walk_put_both,
> "put a pair of paths after a path_walk" (see the kerneldoc).
^^^^^^^^^^^^^

So why not name it path_walk_put_pair() then?

Rationale: "_both" is just counting, "_pair"
means they are related somehow.


Best regards

Ingo Oeser

2007-10-09 09:17:05

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [patch 00/10] Use struct path in struct nameidata

Any reasons this didn't go into -mm? It's all straight-forward cleanup
and it would be a pity not to see it in 2.6.24

On Thu, Sep 27, 2007 at 04:12:00PM +0200, [email protected] wrote:
> This is a respin of the patch series Andreas posted last month. It leaves out
> the restructuring of the intent which will be done at a later point in time.
>
> There are three preparing patches that remove unneeded code IMHO. I haven't
> got feedback from Takashi since he is on holiday. Please, can somebody else
> acknowledge the changes?
>
> Comments?
> Jan
> --
---end quoted text---