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:
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]