vfs-6.19-rc1.fixes

-----BEGIN PGP SIGNATURE-----
 
 iHUEABYKAB0WIQRAhzRXHqcMeLMyaSiRxhvAZXjcogUCaTLXbgAKCRCRxhvAZXjc
 og6oAP9QnawWV/g0vFt8O+jODb/JE54A6Vdb3Ai5Pt+yEB6iVgD/Reu8OhB694tO
 6j8j+lfPV35Z432VirfeKU7Vd4GUSwg=
 =HMln
 -----END PGP SIGNATURE-----

Merge tag 'vfs-6.19-rc1.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs

Pull vfs fixes from Christian Brauner:

 - Fix a type conversion bug in the ipc subsystem

 - Fix per-dentry timeout warning in autofs

 - Drop the fd conversion from sockets

 - Move assert from iput_not_last() to iput()

 - Fix reversed check in filesystems_freeze_callback()

 - Use proper uapi types for new struct delegation definitions

* tag 'vfs-6.19-rc1.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs:
  vfs: use UAPI types for new struct delegation definition
  mqueue: correct the type of ro to int
  Revert "net/socket: convert sock_map_fd() to FD_ADD()"
  autofs: fix per-dentry timeout warning
  fs: assert on I_FREEING not being set in iput() and iput_not_last()
  fs: PM: Fix reverse check in filesystems_freeze_callback()
This commit is contained in:
Linus Torvalds 2025-12-05 15:52:30 -08:00
commit 4b9d25b4d3
6 changed files with 33 additions and 25 deletions

View File

@ -432,16 +432,6 @@ static int autofs_dev_ioctl_timeout(struct file *fp,
if (!autofs_type_indirect(sbi->type)) if (!autofs_type_indirect(sbi->type))
return -EINVAL; return -EINVAL;
/* An expire timeout greater than the superblock timeout
* could be a problem at shutdown but the super block
* timeout itself can change so all we can really do is
* warn the user.
*/
if (timeout >= sbi->exp_timeout)
pr_warn("per-mount expire timeout is greater than "
"the parent autofs mount timeout which could "
"prevent shutdown\n");
dentry = try_lookup_noperm(&QSTR_LEN(param->path, path_len), dentry = try_lookup_noperm(&QSTR_LEN(param->path, path_len),
base); base);
if (IS_ERR_OR_NULL(dentry)) if (IS_ERR_OR_NULL(dentry))
@ -470,6 +460,18 @@ static int autofs_dev_ioctl_timeout(struct file *fp,
ino->flags |= AUTOFS_INF_EXPIRE_SET; ino->flags |= AUTOFS_INF_EXPIRE_SET;
ino->exp_timeout = timeout * HZ; ino->exp_timeout = timeout * HZ;
} }
/* An expire timeout greater than the superblock timeout
* could be a problem at shutdown but the super block
* timeout itself can change so all we can really do is
* warn the user.
*/
if (ino->flags & AUTOFS_INF_EXPIRE_SET &&
ino->exp_timeout > sbi->exp_timeout)
pr_warn("per-mount expire timeout is greater than "
"the parent autofs mount timeout which could "
"prevent shutdown\n");
dput(dentry); dput(dentry);
} }

View File

@ -1968,7 +1968,7 @@ void iput(struct inode *inode)
retry: retry:
lockdep_assert_not_held(&inode->i_lock); lockdep_assert_not_held(&inode->i_lock);
VFS_BUG_ON_INODE(inode_state_read_once(inode) & I_CLEAR, inode); VFS_BUG_ON_INODE(inode_state_read_once(inode) & (I_FREEING | I_CLEAR), inode);
/* /*
* Note this assert is technically racy as if the count is bogusly * Note this assert is technically racy as if the count is bogusly
* equal to one, then two CPUs racing to further drop it can both * equal to one, then two CPUs racing to further drop it can both
@ -2010,6 +2010,7 @@ EXPORT_SYMBOL(iput);
*/ */
void iput_not_last(struct inode *inode) void iput_not_last(struct inode *inode)
{ {
VFS_BUG_ON_INODE(inode_state_read_once(inode) & (I_FREEING | I_CLEAR), inode);
VFS_BUG_ON_INODE(atomic_read(&inode->i_count) < 2, inode); VFS_BUG_ON_INODE(atomic_read(&inode->i_count) < 2, inode);
WARN_ON(atomic_sub_return(1, &inode->i_count) == 0); WARN_ON(atomic_sub_return(1, &inode->i_count) == 0);

View File

@ -1189,7 +1189,7 @@ static void filesystems_freeze_callback(struct super_block *sb, void *freeze_all
if (!sb->s_op->freeze_fs && !sb->s_op->freeze_super) if (!sb->s_op->freeze_fs && !sb->s_op->freeze_super)
return; return;
if (freeze_all_ptr && !(sb->s_type->fs_flags & FS_POWER_FREEZE)) if (!freeze_all_ptr && !(sb->s_type->fs_flags & FS_POWER_FREEZE))
return; return;
if (!get_active_super(sb)) if (!get_active_super(sb))

View File

@ -4,11 +4,7 @@
#include <asm/fcntl.h> #include <asm/fcntl.h>
#include <linux/openat2.h> #include <linux/openat2.h>
#ifdef __KERNEL__
#include <linux/types.h> #include <linux/types.h>
#else
#include <stdint.h>
#endif
#define F_SETLEASE (F_LINUX_SPECIFIC_BASE + 0) #define F_SETLEASE (F_LINUX_SPECIFIC_BASE + 0)
#define F_GETLEASE (F_LINUX_SPECIFIC_BASE + 1) #define F_GETLEASE (F_LINUX_SPECIFIC_BASE + 1)
@ -90,9 +86,9 @@
/* Argument structure for F_GETDELEG and F_SETDELEG */ /* Argument structure for F_GETDELEG and F_SETDELEG */
struct delegation { struct delegation {
uint32_t d_flags; /* Must be 0 */ __u32 d_flags; /* Must be 0 */
uint16_t d_type; /* F_RDLCK, F_WRLCK, F_UNLCK */ __u16 d_type; /* F_RDLCK, F_WRLCK, F_UNLCK */
uint16_t __pad; /* Must be 0 */ __u16 __pad; /* Must be 0 */
}; };
/* /*

View File

@ -887,7 +887,7 @@ static int prepare_open(struct dentry *dentry, int oflag, int ro,
} }
static struct file *mqueue_file_open(struct filename *name, static struct file *mqueue_file_open(struct filename *name,
struct vfsmount *mnt, int oflag, bool ro, struct vfsmount *mnt, int oflag, int ro,
umode_t mode, struct mq_attr *attr) umode_t mode, struct mq_attr *attr)
{ {
struct dentry *dentry; struct dentry *dentry;

View File

@ -503,12 +503,21 @@ EXPORT_SYMBOL(sock_alloc_file);
static int sock_map_fd(struct socket *sock, int flags) static int sock_map_fd(struct socket *sock, int flags)
{ {
int fd; struct file *newfile;
int fd = get_unused_fd_flags(flags);
fd = FD_ADD(flags, sock_alloc_file(sock, flags, NULL)); if (unlikely(fd < 0)) {
if (fd < 0)
sock_release(sock); sock_release(sock);
return fd; return fd;
}
newfile = sock_alloc_file(sock, flags, NULL);
if (!IS_ERR(newfile)) {
fd_install(fd, newfile);
return fd;
}
put_unused_fd(fd);
return PTR_ERR(newfile);
} }
/** /**