Basically, "static" means 'this function is used only here, so omit
compiling it if it's always inlined', "extern" means 'this function is
never compiled, only inlined' and "(nothing)" means 'inline this, but also
compile it, just in case'.
The latter is obviously nonsense for header files because the linnker then
complains about multiple definitions. The first binds a static version into
every object file which includes the header if GCC doesn't see the
optimization (this usually happens if you compile something without -O).
'extern', therefore, is commonly used within the kernel, but it has the
disadvantage that it's impossible to compile anything which depends on the
inlined function without optimization (because unoptimized code is never
inlined with GCC).
-- Matthias Urlichs