[PATCH v4 00/59] struct filename series

Al Viro <[email protected]>
Newsgroups org.kernel.vger.audit,org.kernel.vger.io-uring,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
[See https://lore.kernel.org/all/[email protected]/
for previous variant]

Changes compared to v3:
	* rebased to v6.19-rc4
	* the size of embedded name is increased to the point where struct filename
is 192 bytes long
	* introduction of CLASS machinery moved up by several commits, so
that "allow incomplete imports of filenames" could make use of it immediately;
as the result, a couple of followups in io_uring/* fold into it.
	* __getname_maybe_null() makes use of CLASS(filename_flags)
	* calls of refname() (all 3 of them, all in kernel/auditsc.c) expanded.
	* convert init_mkdir() et.al. to use of do_mkdirat() and friends, similar
to how init_rmdir() and init_unlink() are done.

Practically all destructor calls are done via CLASS(filename...) now;
only 3 explicit calls left (one in audit, dropping the references it has
grabbed for itself, two in the vicinity of fsconfig - separate story).
No uses of __free(putname) remain; I haven't removed DEFINE_FREE yet,
but it's really tempting.

I've got some continuations for that series (non-consuming variants of
do_renameat2() and friends, now that it can be done with minimal PITA
in the callers; with that added we get almost all constructors done via
CLASS(...); the only exceptions are around fsconfig), but that's in
a separate branch (#experimental.filename) on top of this one.

The branch lives in
git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git #work.filename
now; individual patches in followups.

Please, review; if nobody objects, I'm putting that in #for-next on Saturday.

Rough overview:
1--9:
	moving pathname import out of retry loops
10:
	now we can get rid of "reuse the struct filename if
we'd just imported it from the same address _and_ audit is
enabled" logics.
11:
	get rid of names_cachep abuse in ntfs
12--15:
	embed reasonably short pathnames into struct filename,
*always* get struct filename out names_cachep, take the long
names into explicitly kmalloc'ed objects.
16:
	runtime_const machinery for names_cachep; there's
a potentially better variant (statically allocated kmem_cache),
but that's a separate series.
17:
	infrastructure for CLASS(filename...)
18:
	switch __getname_maybe_null() to that.
19:
	delayed_filename machinery, solves the audit vs. io_uring
problems.
20:
	now we don't need filename->refcnt to be atomic.
21--25:
	simplify checks in callers of pathwalk primitives -
	they (with exception of do_filp_open()) will do
	the right thing if given ERR_PTR() for name.
26--32:	... get rid of that one exception and simplify
	more callers.
33--56:
	conversions to CLASS(filename...), cleanups
57, 58:
	... and these should not have been using getname().
59:
	trimming fs/init.c down - doing to init_mkdir() et.al. what's
	already been done to init_rmdir() and init_unlink().

Shortlog:
Al Viro (58):
      do_faccessat(): import pathname only once
      do_fchmodat(): import pathname only once
      do_fchownat(): import pathname only once
      do_utimes_path(): import pathname only once
      chdir(2): import pathname only once
      chroot(2): import pathname only once
      user_statfs(): import pathname only once
      do_sys_truncate(): import pathname only once
      do_readlinkat(): import pathname only once
      get rid of audit_reusename()
      ntfs: ->d_compare() must not block
      getname_flags() massage, part 1
      getname_flags() massage, part 2
      struct filename: use names_cachep only for getname() and friends
      struct filename: saner handling of long names
      allow to use CLASS() for struct filename *
      switch __getname_maybe_null() to CLASS(filename_flags)
      allow incomplete imports of filenames
      struct filename ->refcnt doesn't need to be atomic
      file_getattr(): filename_lookup() accepts ERR_PTR() as filename
      file_setattr(): filename_lookup() accepts ERR_PTR() as filename
      move_mount(): filename_lookup() accepts ERR_PTR() as filename
      ksmbd_vfs_path_lookup(): vfs_path_parent_lookup() accepts ERR_PTR() as name
      ksmbd_vfs_rename(): vfs_path_parent_lookup() accepts ERR_PTR() as name
      do_filp_open(): DTRT when getting ERR_PTR() as pathname
      rename do_filp_open() to do_file_open()
      do_sys_openat2(): get rid of useless check, switch to CLASS(filename)
      simplify the callers of file_open_name()
      simplify the callers of do_open_execat()
      simplify the callers of alloc_bprm()
      switch {alloc,free}_bprm() to CLASS()
      file_[gs]etattr(2): switch to CLASS(filename_maybe_null)
      mount_setattr(2): don't mess with LOOKUP_EMPTY
      do_open_execat(): don't care about LOOKUP_EMPTY
      vfs_open_tree(): use CLASS(filename_uflags)
      name_to_handle_at(): use CLASS(filename_uflags)
      fspick(2): use CLASS(filename_flags)
      do_fchownat(): unspaghettify a bit...
      chdir(2): unspaghettify a bit...
      do_utimes_path(): switch to CLASS(filename_uflags)
      do_sys_truncate(): switch to CLASS(filename)
      do_readlinkat(): switch to CLASS(filename_flags)
      do_f{chmod,chown,access}at(): use CLASS(filename_uflags)
      do_{renameat2,linkat,symlinkat}(): use CLASS(filename_consume)
      do_{mknodat,mkdirat,unlinkat,rmdir}(): use CLASS(filename_consume)
      namei.c: convert getname_kernel() callers to CLASS(filename_kernel)
      namei.c: switch user pathname imports to CLASS(filename{,_flags})
      filename_...xattr(): don't consume filename reference
      move_mount(2): switch to CLASS(filename_maybe_null)
      chroot(2): switch to CLASS(filename)
      quotactl_block(): switch to CLASS(filename)
      statx: switch to CLASS(filename_maybe_null)
      user_statfs(): switch to CLASS(filename)
      mqueue: switch to CLASS(filename)
      ksmbd: use CLASS(filename_kernel)
      alpha: switch osf_mount() to strndup_user()
      sysfs(2): fs_index() argument is _not_ a pathname
      switch init_mkdir() to use of do_mkdirat(), etc.

Mateusz Guzik (1):
      fs: hide names_cache behind runtime const machinery

Diffstat:
 arch/alpha/kernel/osf_sys.c       |  34 ++--
 fs/dcache.c                       |   8 +-
 fs/exec.c                         |  99 ++++------
 fs/fhandle.c                      |   5 +-
 fs/file_attr.c                    |  12 +-
 fs/filesystems.c                  |   9 +-
 fs/fsopen.c                       |   6 +-
 fs/init.c                         |  88 +--------
 fs/internal.h                     |   5 +-
 fs/namei.c                        | 370 ++++++++++++++++++++------------------
 fs/namespace.c                    |  22 +--
 fs/ntfs3/dir.c                    |   5 +-
 fs/ntfs3/fsntfs.c                 |   4 +-
 fs/ntfs3/inode.c                  |  13 +-
 fs/ntfs3/namei.c                  |  17 +-
 fs/ntfs3/xattr.c                  |   5 +-
 fs/open.c                         | 119 +++++-------
 fs/quota/quota.c                  |   3 +-
 fs/smb/server/vfs.c               |  15 +-
 fs/stat.c                         |  28 +--
 fs/statfs.c                       |   3 +-
 fs/utimes.c                       |   8 +-
 fs/xattr.c                        |  33 +---
 include/asm-generic/vmlinux.lds.h |   3 +-
 include/linux/audit.h             |  11 --
 include/linux/fs.h                |  42 +++--
 io_uring/fs.c                     | 101 ++++++-----
 io_uring/openclose.c              |  26 +--
 io_uring/statx.c                  |  17 +-
 io_uring/xattr.c                  |  30 ++--
 ipc/mqueue.c                      |  11 +-
 kernel/acct.c                     |   4 +-
 kernel/auditsc.c                  |  29 +--
 mm/huge_memory.c                  |  15 +-
 mm/swapfile.c                     |  21 +--
 35 files changed, 483 insertions(+), 738 deletions(-)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.