fs.fixes.v6.0-rc3

-----BEGIN PGP SIGNATURE-----
 
 iHUEABYKAB0WIQRAhzRXHqcMeLMyaSiRxhvAZXjcogUCYwSG9QAKCRCRxhvAZXjc
 or0AAP0ddEPI06qpWdQEvrv2wBJtpZ/3DG3mmAAlYVhVWXwKdwEA8AoYyRkcVaba
 Um476CdoNti4BwIUA5j7PZw625ax+AM=
 =FAYy
 -----END PGP SIGNATURE-----

Merge tag 'fs.fixes.v6.0-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/idmapping

Pull file_remove_privs() fix from Christian Brauner:
 "As part of Stefan's and Jens' work to add async buffered write
  support to xfs we refactored file_remove_privs() and added
  __file_remove_privs() to avoid calling __remove_privs() when
  IOCB_NOWAIT is passed.

  While debugging a recent performance regression report I found that
  during review we missed that commit faf99b5635 ("fs: add
  __remove_file_privs() with flags parameter") accidently changed
  behavior when dentry_needs_remove_privs() returns zero.

  Before the commit it would still call inode_has_no_xattr() setting
  the S_NOSEC bit and thereby avoiding even calling into
  dentry_needs_remove_privs() the next time this function is called.
  After that commit inode_has_no_xattr() would only be called if
  __remove_privs() had to be called.

  Restore the old behavior. This is likely the cause of the performance
  regression"

* tag 'fs.fixes.v6.0-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/idmapping:
  fs: __file_remove_privs(): restore call to inode_has_no_xattr()
This commit is contained in:
Linus Torvalds 2022-08-23 19:17:26 -07:00
commit 062d26ad0b
1 changed files with 8 additions and 6 deletions

View File

@ -2018,23 +2018,25 @@ static int __file_remove_privs(struct file *file, unsigned int flags)
{ {
struct dentry *dentry = file_dentry(file); struct dentry *dentry = file_dentry(file);
struct inode *inode = file_inode(file); struct inode *inode = file_inode(file);
int error; int error = 0;
int kill; int kill;
if (IS_NOSEC(inode) || !S_ISREG(inode->i_mode)) if (IS_NOSEC(inode) || !S_ISREG(inode->i_mode))
return 0; return 0;
kill = dentry_needs_remove_privs(dentry); kill = dentry_needs_remove_privs(dentry);
if (kill <= 0) if (kill < 0)
return kill; return kill;
if (flags & IOCB_NOWAIT) if (kill) {
return -EAGAIN; if (flags & IOCB_NOWAIT)
return -EAGAIN;
error = __remove_privs(file_mnt_user_ns(file), dentry, kill);
}
error = __remove_privs(file_mnt_user_ns(file), dentry, kill);
if (!error) if (!error)
inode_has_no_xattr(inode); inode_has_no_xattr(inode);
return error; return error;
} }