• Al Viro's avatar
    follow_dotdot{,_rcu}(): massage loops · 12487f30
    Al Viro authored
    The logics in both of them is the same:
    	while true
    		if in process' root	// uncommon
    			break
    		if *not* in mount root	// normal case
    			find the parent
    			return
    		if at absolute root	// very uncommon
    			break
    		move to underlying mountpoint
    	report that we are in root
    
    Pull the common path out of the loop:
    	if in process' root		// uncommon
    		goto in_root
    	if unlikely(in mount root)
    		while true
    			if at absolute root
    				goto in_root
    			move to underlying mountpoint
    			if in process' root
    				goto in_root
    			if in mount root
    				break;
    	find the parent	// we are not in mount root
    	return
    in_root:
    	report that we are in root
    
    The reason for that transformation is that we get to keep the
    common path straight *and* get a separate block for "move
    through underlying mountpoints", which will allow to sanitize
    NO_XDEV handling there.  What's more, the pared-down loops
    will be easier to deal with - in particular, non-RCU case
    has no need to grab mount_lock and rewriting it to the
    form that wouldn't do that is a non-trivial change.  Better
    do that with less stuff getting in the way...
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    12487f30
namei.c 120 KB