aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorFilesLines
2015-05-10don't pass nameidata to ->follow_link()Al Viro31-44/+44
its only use is getting passed to nd_jump_link(), which can obtain it from current->nameidata Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: simplify the callers of follow_managed()Al Viro1-22/+10
now that it gets nameidata, no reason to have setting LOOKUP_JUMPED on mountpoint crossing and calling path_put_conditional() on failures done in every caller. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10VFS: replace {, total_}link_count in task_struct with pointer to nameidataNeilBrown2-32/+40
task_struct currently contains two ad-hoc members for use by the VFS: link_count and total_link_count. These are only interesting to fs/namei.c, so exposing them explicitly is poor layering. Incidentally, link_count isn't used anymore, so it can just die. This patches replaces those with a single pointer to 'struct nameidata'. This structure represents the current filename lookup of which there can only be one per process, and is a natural place to store total_link_count. This will allow the current "nameidata" argument to all follow_link operations to be removed as current->nameidata can be used instead in the _very_ few instances that care about it at all. As there are occasional circumstances where pathname lookup can recurse, such as through kern_path_locked, we always save and old current->nameidata (if there is one) when setting a new value, and make sure any active link_counts are preserved. follow_mount and follow_automount now get a 'struct nameidata *' rather than 'int flags' so that they can directly access total_link_count, rather than going through 'current'. Suggested-by: Al Viro <viro@ZenIV.linux.org.uk> Signed-off-by: NeilBrown <neilb@suse.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10lustre: rip the private symlink nesting limit outAl Viro1-12/+3
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: move link count check and stack allocation into pick_link()Al Viro1-15/+12
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: make should_follow_link() store the link in nd->linkAl Viro1-29/+33
... if it decides to follow, that is. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: new calling conventions for walk_component()Al Viro1-10/+20
instead of a single flag (!= 0 => we want to follow symlinks) pass two bits - WALK_GET (want to follow symlinks) and WALK_PUT (put_link() once we are done looking at the name). The latter matters only for success exits - on failure the caller will discard everything anyway. Suggestions for better variant are welcome; what this thing aims for is making sure that pending put_link() is done *before* walk_component() decides to pick a symlink up, rather than between picking it up and acting upon it. See the next commit for payoff. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: move the OK: inside the loopAl Viro1-15/+15
fewer labels that way; in particular, resuming after the end of nested symlink is straight-line. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: have terminate_walk() do put_link() on everything leftAl Viro1-8/+2
All callers of terminate_walk() are followed by more or less open-coded eqiuvalent of "do put_link() on everything left in nd->stack". Better done in terminate_walk() itself, and when we go for RCU symlink traversal we'll have to do it there anyway. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: take put_link() into {lookup,mountpoint,do}_last()Al Viro1-13/+21
rationale: we'll need to have terminate_walk() do put_link() on everything, which will mean that in some cases ..._last() will do put_link() anyway. Easier to have them do it in all cases. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: lift (open-coded) terminate_walk() into callers of get_link()Al Viro1-5/+4
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10lift terminate_walk() into callers of walk_component()Al Viro1-14/+11
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: lift (open-coded) terminate_walk() in follow_dotdot_rcu() into callersAl Viro1-9/+10
follow_dotdot_rcu() does an equivalent of terminate_walk() on failure; shifting it into callers makes for simpler rules and those callers already have terminate_walk() on other failure exits. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: we never need more than MAXSYMLINKS entries in nd->stackAl Viro1-1/+1
The only reason why we needed one more was that purely nested MAXSYMLINKS symlinks could lead to path_init() using that many entries in addition to nd->stack[0] which it left unused. That can't happen now - path_init() starts with entry 0 (and trailing_symlink() is called only when we'd already encountered one symlink, so no more than MAXSYMLINKS-1 are left). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: end of nd->depth massageAl Viro1-6/+2
get rid of orig_depth - we only use it on error exit to tell whether to stop doing put_link() when depth reaches 0 (call from path_init()) or when it reaches 1 (call from trailing_symlink()). However, in the latter case the caller would immediately follow with one more put_link(). Just keep doing it until the depth reaches zero (and simplify trailing_symlink() as the result). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: nd->depth massage, part 10Al Viro1-7/+10
Get rid of orig_depth checks in OK: logics. If nd->depth is zero, we had been called from path_init() and we are done. If it is greater than 1, we are not done, whether we'd been called from path_init() or trailing_symlink(). And in case when it's 1, we might have been called from path_init() and reached the end of nested symlink (in which case nd->stack[0].name will point to the rest of pathname and we are not done) or from trailing_symlink(), in which case we are done. Just have trailing_symlink() leave NULL in nd->stack[0].name and use that to discriminate between those cases. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: nd->depth massage, part 9Al Viro1-6/+4
Make link_path_walk() work with any value of nd->depth on entry - memorize it and use it in tests instead of comparing with 1. Don't bother with increment/decrement in path_init(). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10put_link: nd->depth massage, part 8Al Viro1-14/+4
all calls are preceded by decrement of nd->depth; move it into put_link() itself. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10trailing_symlink: nd->depth massage, part 7Al Viro1-4/+4
move decrement of nd->depth on successful returns into the callers. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10get_link: nd->depth massage, part 6Al Viro1-3/+2
make get_link() increment nd->depth on successful exit Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10trailing_symlink: nd->depth massage, part 5Al Viro1-5/+10
move increment of ->depth to the point where we'd discovered that get_link() has not returned an error, adjust exits accordingly. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: nd->depth massage, part 4Al Viro1-4/+6
lift increment/decrement into link_path_walk() callers. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: nd->depth massage, part 3Al Viro1-3/+1
remove decrement/increment surrounding nd_alloc_stack(), adjust the test in it. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: nd->depth massage, part 2Al Viro1-8/+0
collapse adjacent increment/decrement pairs. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: nd->depth massage, part 1Al Viro1-5/+17
nd->stack[0] is unused until the handling of trailing symlinks and we want to get rid of that. Having fucked that transformation up several times, I went for bloody pedantic series of provably equivalent transformations. Sorry. Step 1: keep nd->depth higher by one in link_path_walk() - increment upon entry, decrement on exits, adjust the arithmetics inside and surround the calls of functions that care about nd->depth value (nd_alloc_stack(), get_link(), put_link()) with decrement/increment pairs. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: remove restrictions on nesting depthAl Viro2-14/+54
The only restriction is that on the total amount of symlinks crossed; how they are nested does not matter Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: trim the arguments of get_link()Al Viro1-24/+21
same story as the previous commit Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: trim redundant arguments of fs/namei.c:put_link()Al Viro1-12/+13
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: trim redundant arguments of trailing_symlink()Al Viro1-13/+8
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: move link/cookie pairs into nameidataAl Viro1-17/+18
Array of MAX_NESTED_LINKS + 1 elements put into nameidata; what used to be a local array in link_path_walk() occupies entries 1 .. MAX_NESTED_LINKS in it, link and cookie from the trailing symlink handling loops - entry 0. This is _not_ the final arrangement; just an easily verified incremental step. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: cleanup - turn goto start; into continue;Al Viro1-3/+6
Deal with skipping leading slashes before what used to be the recursive call. That way we can get rid of that goto completely. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: split "return from recursive call" pathAl Viro1-23/+17
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: kill the recursionAl Viro1-11/+29
absolutely straightforward now - the only variables we need to preserve across the recursive call are name, link and cookie, and recursion depth is limited (and can is equal to nd->depth). So arrange an array of triples to hold instances of those and be done with that. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: final preparations to killing recursionAl Viro1-7/+11
reduce the number of returns in there - turn all places where it returns zero into goto OK and places where it returns non-zero into goto Err. The only non-trivial detail is that all breaks in the loop are guaranteed to be with non-zero err. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: get rid of duplicationAl Viro1-8/+2
What we do after the second walk_component() + put_link() + depth decrement in there is exactly equivalent to what's done right after the first walk_component(). Easy to verify and not at all surprising, seeing that there we have just walked the last component of nested symlink. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: massage a bit moreAl Viro1-6/+13
Pull the block after the if-else in the end of what used to be do-while body into all branches there. We are almost done with the massage... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: turn inner loop into explicit gotoAl Viro1-29/+32
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: don't bother with walk_component() after jumping linkAl Viro1-3/+7
... it does nothing if nd->last_type is LAST_BIND. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10link_path_walk: handle get_link() returning ERR_PTR() immediatelyAl Viro1-1/+3
If we get ERR_PTR() from get_link(), we are guaranteed to get err != 0 when we break out of do-while, so we are going to hit if (err) return err; shortly after it. Pull that into the if (IS_ERR(s)) body. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: rename follow_link to trailing_symlink, move it downAl Viro1-32/+30
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: move the calls of may_follow_link() into follow_link()Al Viro1-15/+6
All remaining callers of the former are preceded by the latter Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: expand the call of follow_link() in link_path_walk()Al Viro1-4/+22
... and strip __always_inline from follow_link() - remaining callers don't need that. Now link_path_walk() recursion is a direct one. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: expand nested_symlink() in its only callerAl Viro1-38/+23
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10do_last: move path there from caller's stack frameAl Viro1-25/+25
We used to need it to feed to follow_link(). No more... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: introduce nameidata->linkAl Viro1-28/+34
shares space with nameidata->next, walk_component() et.al. store the struct path of symlink instead of returning it into a variable passed by caller. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: don't bother with ->follow_link() if ->i_link is setAl Viro1-7/+13
with new calling conventions it's trivial Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Conflicts: fs/namei.c
2015-05-10namei.c: separate the parts of follow_link() that find the link bodyAl Viro1-29/+36
Split a piece of fs/namei.c:follow_link() that does obtaining the link body into a separate function. follow_link() itself is converted to calling get_link() and then doing the body traversal (if any). The next step will expand follow_link() call in link_path_walk() and this helps to keep the size down... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10new ->follow_link() and ->put_link() calling conventionsAl Viro31-273/+195
a) instead of storing the symlink body (via nd_set_link()) and returning an opaque pointer later passed to ->put_link(), ->follow_link() _stores_ that opaque pointer (into void * passed by address by caller) and returns the symlink body. Returning ERR_PTR() on error, NULL on jump (procfs magic symlinks) and pointer to symlink body for normal symlinks. Stored pointer is ignored in all cases except the last one. Storing NULL for opaque pointer (or not storing it at all) means no call of ->put_link(). b) the body used to be passed to ->put_link() implicitly (via nameidata). Now only the opaque pointer is. In the cases when we used the symlink body to free stuff, ->follow_link() now should store it as opaque pointer in addition to returning it. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10namei: lift nameidata into filename_mountpoint()Al Viro1-15/+13
when we go for on-demand allocation of saved state in link_path_walk(), we'll want nameidata to stay around for all 3 calls of path_mountpoint(). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2015-05-10name: shift nameidata down into user_path_walk()Al Viro1-57/+67
that avoids having nameidata on stack during the calls of ->rmdir()/->unlink() and *two* of those during the calls of ->rename(). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>