fs/namei.c: keep track of nd->root refcount status
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 17 Jul 2019 01:20:17 +0000 (21:20 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 3 Sep 2019 13:30:45 +0000 (09:30 -0400)
commit84a2bd39405ffd5fa6d6d77e408c5b9210da98de
treebe5ba81e98be9f580b80729c0e24c1645a83f000
parentee594bfff389aa9105f713135211c0da736e5698
fs/namei.c: keep track of nd->root refcount status

The rules for nd->root are messy:
* if we have LOOKUP_ROOT, it doesn't contribute to refcounts
* if we have LOOKUP_RCU, it doesn't contribute to refcounts
* if nd->root.mnt is NULL, it doesn't contribute to refcounts
* otherwise it does contribute

terminate_walk() needs to drop the references if they are contributing.
So everything else should be careful not to confuse it, leading to
rather convoluted code.

It's easier to keep track of whether we'd grabbed the reference(s)
explicitly.  Use a new flag for that.  Don't bother with zeroing
nd->root.mnt on unlazy failures and in terminate_walk - it's not
needed anymore (terminate_walk() won't care and the next path_init()
will zero nd->root in !LOOKUP_ROOT case anyway).

Resulting rules for nd->root refcounts are much simpler: they are
contributing iff LOOKUP_ROOT_GRABBED is set in nd->flags.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namei.c
include/linux/namei.h