Messages in this thread |  | | Date | Tue, 11 Apr 2017 07:48:40 +0100 | From | Al Viro <> | Subject | Re: [git pull] vfs fixes |
| |
On Mon, Apr 10, 2017 at 11:10:19PM -0700, Linus Torvalds wrote:
> It looks odd because the lock part is > > if (flags & LOOKUP_RCU) > rcu_read_lock(); > > ie it's locked conditionally, and the code in between does not seem to > return every time LOOKUP_RCU is clear. > > So mind giving this a look? Is it as obviously buggy as I think it is, > or is there something I'm missing?
It's more obscure than I would like, and can grow into a bug one day, but... nd_jump_root() can only return non-zero if you have LOOKUP_RCU. So without LOOKUP_RCU in flags, this if (flags & LOOKUP_RCU) rcu_read_lock(); set_root(nd); if (likely(!nd_jump_root(nd))) return s; nd->root.mnt = NULL; rcu_read_unlock(); won't get to that rcu_read_unlock() at all - it'll get zero from nd_jump_root() and proceed to return s;
|  |