On Mon, Mar 25, 2024 at 07:54:13PM +0000, Al Viro wrote: > Note that cifs_sfu_make_node() is the only case in CIFS where that happens - > other codepaths (both in cifs_make_node() and in smb2_make_node()) will > instantiate. How painful would it be for cifs_sfu_make_node()? > AFAICS, you do open/sync_write/close there; would it be hard to do > an eqiuvalent of fstat and set the inode up? No need to reread the > file contents (as cifs_sfu_type() does), and you do have full path > anyway, so it's less work than for full ->lookup() even if you need > a path-based protocol operations... > > Does that thing have an equivalent of fstat() that would return the > metadata of opened file? You do have a FID there, so doing ->query_file_info() just before close, using the result to build inode (with type and ->i_rdev taken from what you've been given by the caller) and passing it to d_instantiate() looks not entirely implausible, but I'm really not familiar with the codebase, so take that with a cartload of salt. mknod() usually is followed by lookup of some sort pretty soon, and your lookup would have to do at least open/sync_read/close just to decode the device number. So if anything, *not* setting an inode up during mknod() is likely to be a pessimization... If we did it in vfs_mknod() callers, that would be something along the lines of err = vfs_mknod(..., dir, dentry, ...) if (err) fuck off if (unlikely(!dentry->d_inode)) { if (d_unhashed(dentry)) { struct dentry *d = dir->i_op->lookup(dir, dentry, 0); if (unlikely(d)) { if (IS_ERR(d)) { fuck off, lookup failed } else { // ->lookup returns a pointer to existing // alias *ONLY* for directories; WTF is // going on? dput(d); fuck off, wrong thing created there } } if (!dentry->d_inode) fuck off, it hasn't been created if (wrong type of dentry->d_inode)) fuck off, wrong thing created there OK, there we go } else { complain about bogus ->mknod() behavior fuck off - it hasn't been created, apparently } } at least in net/unix/af_unix.c:unix_bind(). So the minimal change would be to have your d_drop(dentry) in that codepath followed by cifs_lookup(<parent inode>, dentry, 0) and checking the result. But I would very much suspect that fetching metadata by fid before you close the file would be cheaper than full-blown cifs_lookup() there.