• Linus Torvalds's avatar
    capability: just use a 'u64' instead of a 'u32[2]' array · f122a08b
    Linus Torvalds authored
    Back in 2008 we extended the capability bits from 32 to 64, and we did
    it by extending the single 32-bit capability word from one word to an
    array of two words.  It was then obfuscated by hiding the "2" behind two
    macro expansions, with the reasoning being that maybe it gets extended
    further some day.
    
    That reasoning may have been valid at the time, but the last thing we
    want to do is to extend the capability set any more.  And the array of
    values not only causes source code oddities (with loops to deal with
    it), but also results in worse code generation.  It's a lose-lose
    situation.
    
    So just change the 'u32[2]' into a 'u64' and be done with it.
    
    We still have to deal with the fact that the user space interface is
    designed around an array of these 32-bit values, but that was the case
    before too, since the array layouts were different (ie user space
    doesn't use an array of 32-bit values for individual capability masks,
    but an array of 32-bit slices of multiple masks).
    
    So that marshalling of data is actually simplified too, even if it does
    remain somewhat obscure and odd.
    
    This was all triggered by my reaction to the new "cap_isidentical()"
    introduced recently.  By just using a saner data structure, it went from
    
    	unsigned __capi;
    	CAP_FOR_EACH_U32(__capi) {
    		if (a.cap[__capi] != b.cap[__capi])
    			return false;
    	}
    	return true;
    
    to just being
    
    	return a.val == b.val;
    
    instead.  Which is rather more obvious both to humans and to compilers.
    
    Cc: Mateusz Guzik <mjguzik@gmail.com>
    Cc: Casey Schaufler <casey@schaufler-ca.com>
    Cc: Serge Hallyn <serge@hallyn.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Paul Moore <paul@paul-moore.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    f122a08b
array.c 22.1 KB