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:
commit
062d26ad0b
14
fs/inode.c
14
fs/inode.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue