On Tue, Aug 27, 2013 at 4:08 PM, Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote: > On Tue, Aug 27, 2013 at 12:16:34PM -0700, Andy Lutomirski wrote: >> This is an experiment to see if we can get nice semantics for all syscalls >> that either follow symlinks or allow AT_EMPTY_PATH without jumping through >> enormous hoops. This converts truncate (although you can't tell using >> truncate from coreutils, because it actually uses open + ftruncate). >> >> The basic idea is that there's a new helper function >> user_file_or_path_at. It takes an fd and a path and, depending on >> flags, the emptiness of the path, and whether path is a magic /proc >> symlink (or a symlink to a magic /proc/symlink), it returns either a >> struct path or a struct file *. > > No. I'm curious what's wrong with the general concept. (I agree that the implementation is heinous.) If I ever wanted to add a new *at syscall, I'd like to be able to do: int sys_whateverat(int dfd, const char __user *name, int flags) { resolve_the_thing(dfd, name, flags); if (it's a file) { check fmode; } else { inode_permission(); } actually_do_something(inode); unreference_whatever_i_got(); return ret; } thereby killing the fwhatever and whateverat birds with one stone. > >> + path_get(&nd->path); >> + if (nd->flags & LOOKUP_FILE) { >> + if (nd->last_symlink_file) >> + fput(nd->last_symlink_file); >> + nd->last_symlink_file = file; > > This is ugly (and costs quite a bit of overhead) > >> -static int proc_cwd_link(struct dentry *dentry, struct path *path) >> +static int proc_cwd_link(struct dentry *dentry, struct file_or_path *link) > > ... and this is even more vile. Vetoed, for being too ugly to live. ...phew. I wasn't looking forward to testing and debugging my crap :) --Andy -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html