[patch] Combine path_put and path_put_conditional

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: <jblunck@...>
Cc: <linux-kernel@...>, <viro@...>, <hch@...>, <tiwai@...>
Date: Friday, September 28, 2007 - 4:43 pm

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 <agruen@suse.de>

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:
-
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
Re: [patch 00/10] Use struct path in struct nameidata, Christoph Hellwig, (Tue Oct 9, 5:16 am)
[patch] Combine path_put and path_put_conditional, Andreas Gruenbacher, (Fri Sep 28, 4:43 pm)
Re: [patch] Combine path_put and path_put_conditional, Christoph Hellwig, (Sat Sep 29, 5:25 am)