Suggested by Linus in https://lore.kernel.org/io-uring/CAHk-=wh=cpt_tQCirzFZRPawRpbuFTZ2MxNpXiyUF+eBXF=+sw@xxxxxxxxxxxxxx/ This patchset does all the do_* functions one by one. The idea is to move the main logic to a helper function and handle stale retries / struct filename cleanups outside, which makes the logic easier to follow. There are a few minor changes in behavior: 1. filename_lookup() / filename_parentat() / filename_create() do their own retries on ESTALE (regardless of flags), and previously they were exempt from retries in the do_* functions (but they *were* called on retry - it's just the return code wasn't checked for ESTALE). And now the retry is done on the upper level, and so technically it could be called a behavior change. Hopefully it's an edge case where an additional check does not matter. 2. Some safety checks like may_mknod() / flags validation are now repeated on retry. Those are mostly trivial and retry is a slow path, so that should be OK. 3. retry_estale() is wrapped into unlikely() now On top of https://lore.kernel.org/io-uring/20210708063447.3556403-1-dkadashev@xxxxxxxxx/ v2: - Split flow changes and code reorganization to different commits; - Move more checks into the new helpers, to avoid gotos in the touched do_* functions completely; - Add unlikely() around retry_estale(); - Name the new helper functions try_* instead of *_helper; Dmitry Kadashev (14): namei: prepare do_rmdir for refactoring namei: clean up do_rmdir retry logic namei: prepare do_unlinkat for refactoring namei: clean up do_unlinkat retry logic namei: prepare do_mkdirat for refactoring namei: clean up do_mkdirat retry logic namei: prepare do_mknodat for refactoring namei: clean up do_mknodat retry logic namei: prepare do_symlinkat for refactoring namei: clean up do_symlinkat retry logic namei: prepare do_linkat for refactoring namei: clean up do_linkat retry logic namei: prepare do_renameat2 for refactoring namei: clean up do_renameat2 retry logic fs/namei.c | 252 +++++++++++++++++++++++++++++------------------------ 1 file changed, 140 insertions(+), 112 deletions(-) -- 2.30.2