On Sat, Jul 3, 2021 at 1:33 AM Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > I wonder if the semantics couldn't be that __filename_create() never > eats the name, and filename_create() keeps the old semantics? This is how I originally thought it is going to be, but Al suggested that it eats the name on the failure. Now that I spent slightly more time with it I *suspect* the reason (or a part of it) is making it keep the name on failure would require A LOT of changes, since a lot of functions that __filename_create() calls eat the name on failure. How about we change the functions (__filename_create(), __filename_lookup()) to do what filename_parentat() does since 5c31b6cedb675 ("namei: saner calling conventions for filename_parentat()"), namely return struct filename *. The nice thing here is we end up having the functions working the same way, so it's much easier to reason about. In particular, all of the functions seem to be expected to consume struct filename that was passed to it. And it is going to be the same with these two new ones instead of introducing a class of functions that do not do that. The not-so-nice thing is for __filename_create we'd have to move struct dentry to args. But as far as I can see there are quite a few "out" args anyway, and struct path is an "out" arg already. So maybe it's not a big deal. Maybe it is. Comments are welcome. The code in question then will look like this: old = __filename_lookup(olddfd, old, how, &old_path, NULL); if (IS_ERR(old)) goto out_putnames; new = __filename_create(newdfd, new, &new_path, &new_dentry, (how & LOOKUP_REVAL)); if (IS_ERR(new)) goto out_putpath; Thoughts? -- Dmitry Kadashev