Commit 02705fc9 authored by Sebastian Andrzej Siewior's avatar Sebastian Andrzej Siewior
Browse files

Merge tag 'v5.14.1' into linux-5.14.y-rt

This is the 5.14.1 stable release
parents 896196be 66a613c5
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 5 VERSION = 5
PATCHLEVEL = 14 PATCHLEVEL = 14
SUBLEVEL = 0 SUBLEVEL = 1
EXTRAVERSION = EXTRAVERSION =
NAME = Opossums on Parade NAME = Opossums on Parade
......
...@@ -4029,23 +4029,23 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) ...@@ -4029,23 +4029,23 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)
if (fdc_state[FDC(drive)].rawcmd == 1) if (fdc_state[FDC(drive)].rawcmd == 1)
fdc_state[FDC(drive)].rawcmd = 2; fdc_state[FDC(drive)].rawcmd = 2;
if (mode & (FMODE_READ|FMODE_WRITE)) { if (!(mode & FMODE_NDELAY)) {
drive_state[drive].last_checked = 0; if (mode & (FMODE_READ|FMODE_WRITE)) {
clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &drive_state[drive].flags); drive_state[drive].last_checked = 0;
if (bdev_check_media_change(bdev)) clear_bit(FD_OPEN_SHOULD_FAIL_BIT,
floppy_revalidate(bdev->bd_disk); &drive_state[drive].flags);
if (test_bit(FD_DISK_CHANGED_BIT, &drive_state[drive].flags)) if (bdev_check_media_change(bdev))
goto out; floppy_revalidate(bdev->bd_disk);
if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &drive_state[drive].flags)) if (test_bit(FD_DISK_CHANGED_BIT, &drive_state[drive].flags))
goto out;
if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &drive_state[drive].flags))
goto out;
}
res = -EROFS;
if ((mode & FMODE_WRITE) &&
!test_bit(FD_DISK_WRITABLE_BIT, &drive_state[drive].flags))
goto out; goto out;
} }
res = -EROFS;
if ((mode & FMODE_WRITE) &&
!test_bit(FD_DISK_WRITABLE_BIT, &drive_state[drive].flags))
goto out;
mutex_unlock(&open_lock); mutex_unlock(&open_lock);
mutex_unlock(&floppy_mutex); mutex_unlock(&floppy_mutex);
return 0; return 0;
......
...@@ -525,6 +525,7 @@ static const struct dmi_system_id btusb_needs_reset_resume_table[] = { ...@@ -525,6 +525,7 @@ static const struct dmi_system_id btusb_needs_reset_resume_table[] = {
#define BTUSB_HW_RESET_ACTIVE 12 #define BTUSB_HW_RESET_ACTIVE 12
#define BTUSB_TX_WAIT_VND_EVT 13 #define BTUSB_TX_WAIT_VND_EVT 13
#define BTUSB_WAKEUP_DISABLE 14 #define BTUSB_WAKEUP_DISABLE 14
#define BTUSB_USE_ALT3_FOR_WBS 15
struct btusb_data { struct btusb_data {
struct hci_dev *hdev; struct hci_dev *hdev;
...@@ -1757,16 +1758,20 @@ static void btusb_work(struct work_struct *work) ...@@ -1757,16 +1758,20 @@ static void btusb_work(struct work_struct *work)
/* Bluetooth USB spec recommends alt 6 (63 bytes), but /* Bluetooth USB spec recommends alt 6 (63 bytes), but
* many adapters do not support it. Alt 1 appears to * many adapters do not support it. Alt 1 appears to
* work for all adapters that do not have alt 6, and * work for all adapters that do not have alt 6, and
* which work with WBS at all. * which work with WBS at all. Some devices prefer
* alt 3 (HCI payload >= 60 Bytes let air packet
* data satisfy 60 bytes), requiring
* MTU >= 3 (packets) * 25 (size) - 3 (headers) = 72
* see also Core spec 5, vol 4, B 2.1.1 & Table 2.1.
*/ */
new_alts = btusb_find_altsetting(data, 6) ? 6 : 1; if (btusb_find_altsetting(data, 6))
/* Because mSBC frames do not need to be aligned to the new_alts = 6;
* SCO packet boundary. If support the Alt 3, use the else if (btusb_find_altsetting(data, 3) &&
* Alt 3 for HCI payload >= 60 Bytes let air packet hdev->sco_mtu >= 72 &&
* data satisfy 60 bytes. test_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags))
*/
if (new_alts == 1 && btusb_find_altsetting(data, 3))
new_alts = 3; new_alts = 3;
else
new_alts = 1;
} }
if (btusb_switch_alt_setting(hdev, new_alts) < 0) if (btusb_switch_alt_setting(hdev, new_alts) < 0)
...@@ -4742,6 +4747,7 @@ static int btusb_probe(struct usb_interface *intf, ...@@ -4742,6 +4747,7 @@ static int btusb_probe(struct usb_interface *intf,
* (DEVICE_REMOTE_WAKEUP) * (DEVICE_REMOTE_WAKEUP)
*/ */
set_bit(BTUSB_WAKEUP_DISABLE, &data->flags); set_bit(BTUSB_WAKEUP_DISABLE, &data->flags);
set_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags);
} }
if (!reset) if (!reset)
......
...@@ -1308,11 +1308,8 @@ mt7530_port_bridge_leave(struct dsa_switch *ds, int port, ...@@ -1308,11 +1308,8 @@ mt7530_port_bridge_leave(struct dsa_switch *ds, int port,
/* Remove this port from the port matrix of the other ports /* Remove this port from the port matrix of the other ports
* in the same bridge. If the port is disabled, port matrix * in the same bridge. If the port is disabled, port matrix
* is kept and not being setup until the port becomes enabled. * is kept and not being setup until the port becomes enabled.
* And the other port's port matrix cannot be broken when the
* other port is still a VLAN-aware port.
*/ */
if (dsa_is_user_port(ds, i) && i != port && if (dsa_is_user_port(ds, i) && i != port) {
!dsa_port_is_vlan_filtering(dsa_to_port(ds, i))) {
if (dsa_to_port(ds, i)->bridge_dev != bridge) if (dsa_to_port(ds, i)->bridge_dev != bridge)
continue; continue;
if (priv->ports[i].enable) if (priv->ports[i].enable)
......
...@@ -246,6 +246,8 @@ int vt_waitactive(int n) ...@@ -246,6 +246,8 @@ int vt_waitactive(int n)
* *
* XXX It should at least call into the driver, fbdev's definitely need to * XXX It should at least call into the driver, fbdev's definitely need to
* restore their engine state. --BenH * restore their engine state. --BenH
*
* Called with the console lock held.
*/ */
static int vt_kdsetmode(struct vc_data *vc, unsigned long mode) static int vt_kdsetmode(struct vc_data *vc, unsigned long mode)
{ {
...@@ -262,7 +264,6 @@ static int vt_kdsetmode(struct vc_data *vc, unsigned long mode) ...@@ -262,7 +264,6 @@ static int vt_kdsetmode(struct vc_data *vc, unsigned long mode)
return -EINVAL; return -EINVAL;
} }
/* FIXME: this needs the console lock extending */
if (vc->vc_mode == mode) if (vc->vc_mode == mode)
return 0; return 0;
...@@ -271,12 +272,10 @@ static int vt_kdsetmode(struct vc_data *vc, unsigned long mode) ...@@ -271,12 +272,10 @@ static int vt_kdsetmode(struct vc_data *vc, unsigned long mode)
return 0; return 0;
/* explicitly blank/unblank the screen if switching modes */ /* explicitly blank/unblank the screen if switching modes */
console_lock();
if (mode == KD_TEXT) if (mode == KD_TEXT)
do_unblank_screen(1); do_unblank_screen(1);
else else
do_blank_screen(1); do_blank_screen(1);
console_unlock();
return 0; return 0;
} }
...@@ -378,7 +377,10 @@ static int vt_k_ioctl(struct tty_struct *tty, unsigned int cmd, ...@@ -378,7 +377,10 @@ static int vt_k_ioctl(struct tty_struct *tty, unsigned int cmd,
if (!perm) if (!perm)
return -EPERM; return -EPERM;
return vt_kdsetmode(vc, arg); console_lock();
ret = vt_kdsetmode(vc, arg);
console_unlock();
return ret;
case KDGETMODE: case KDGETMODE:
return put_user(vc->vc_mode, (int __user *)arg); return put_user(vc->vc_mode, (int __user *)arg);
......
...@@ -2137,7 +2137,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path, ...@@ -2137,7 +2137,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
if (IS_ERR(device)) { if (IS_ERR(device)) {
if (PTR_ERR(device) == -ENOENT && if (PTR_ERR(device) == -ENOENT &&
strcmp(device_path, "missing") == 0) device_path && strcmp(device_path, "missing") == 0)
ret = BTRFS_ERROR_DEV_MISSING_NOT_FOUND; ret = BTRFS_ERROR_DEV_MISSING_NOT_FOUND;
else else
ret = PTR_ERR(device); ret = PTR_ERR(device);
......
...@@ -384,3 +384,47 @@ const char *fscrypt_get_symlink(struct inode *inode, const void *caddr, ...@@ -384,3 +384,47 @@ const char *fscrypt_get_symlink(struct inode *inode, const void *caddr,
return ERR_PTR(err); return ERR_PTR(err);
} }
EXPORT_SYMBOL_GPL(fscrypt_get_symlink); EXPORT_SYMBOL_GPL(fscrypt_get_symlink);
/**
* fscrypt_symlink_getattr() - set the correct st_size for encrypted symlinks
* @path: the path for the encrypted symlink being queried
* @stat: the struct being filled with the symlink's attributes
*
* Override st_size of encrypted symlinks to be the length of the decrypted
* symlink target (or the no-key encoded symlink target, if the key is
* unavailable) rather than the length of the encrypted symlink target. This is
* necessary for st_size to match the symlink target that userspace actually
* sees. POSIX requires this, and some userspace programs depend on it.
*
* This requires reading the symlink target from disk if needed, setting up the
* inode's encryption key if possible, and then decrypting or encoding the
* symlink target. This makes lstat() more heavyweight than is normally the
* case. However, decrypted symlink targets will be cached in ->i_link, so
* usually the symlink won't have to be read and decrypted again later if/when
* it is actually followed, readlink() is called, or lstat() is called again.
*
* Return: 0 on success, -errno on failure
*/
int fscrypt_symlink_getattr(const struct path *path, struct kstat *stat)
{
struct dentry *dentry = path->dentry;
struct inode *inode = d_inode(dentry);
const char *link;
DEFINE_DELAYED_CALL(done);
/*
* To get the symlink target that userspace will see (whether it's the
* decrypted target or the no-key encoded target), we can just get it in
* the same way the VFS does during path resolution and readlink().
*/
link = READ_ONCE(inode->i_link);
if (!link) {
link = inode->i_op->get_link(dentry, inode, &done);
if (IS_ERR(link))
return PTR_ERR(link);
}
stat->size = strlen(link);
do_delayed_call(&done);
return 0;
}
EXPORT_SYMBOL_GPL(fscrypt_symlink_getattr);
...@@ -52,10 +52,20 @@ static const char *ext4_encrypted_get_link(struct dentry *dentry, ...@@ -52,10 +52,20 @@ static const char *ext4_encrypted_get_link(struct dentry *dentry,
return paddr; return paddr;
} }
static int ext4_encrypted_symlink_getattr(struct user_namespace *mnt_userns,
const struct path *path,
struct kstat *stat, u32 request_mask,
unsigned int query_flags)
{
ext4_getattr(mnt_userns, path, stat, request_mask, query_flags);
return fscrypt_symlink_getattr(path, stat);
}
const struct inode_operations ext4_encrypted_symlink_inode_operations = { const struct inode_operations ext4_encrypted_symlink_inode_operations = {
.get_link = ext4_encrypted_get_link, .get_link = ext4_encrypted_get_link,
.setattr = ext4_setattr, .setattr = ext4_setattr,
.getattr = ext4_getattr, .getattr = ext4_encrypted_symlink_getattr,
.listxattr = ext4_listxattr, .listxattr = ext4_listxattr,
}; };
......
...@@ -1323,9 +1323,19 @@ static const char *f2fs_encrypted_get_link(struct dentry *dentry, ...@@ -1323,9 +1323,19 @@ static const char *f2fs_encrypted_get_link(struct dentry *dentry,
return target; return target;
} }
static int f2fs_encrypted_symlink_getattr(struct user_namespace *mnt_userns,
const struct path *path,
struct kstat *stat, u32 request_mask,
unsigned int query_flags)
{
f2fs_getattr(mnt_userns, path, stat, request_mask, query_flags);
return fscrypt_symlink_getattr(path, stat);
}
const struct inode_operations f2fs_encrypted_symlink_inode_operations = { const struct inode_operations f2fs_encrypted_symlink_inode_operations = {
.get_link = f2fs_encrypted_get_link, .get_link = f2fs_encrypted_get_link,
.getattr = f2fs_getattr, .getattr = f2fs_encrypted_symlink_getattr,
.setattr = f2fs_setattr, .setattr = f2fs_setattr,
.listxattr = f2fs_listxattr, .listxattr = f2fs_listxattr,
}; };
......
...@@ -1630,6 +1630,17 @@ static const char *ubifs_get_link(struct dentry *dentry, ...@@ -1630,6 +1630,17 @@ static const char *ubifs_get_link(struct dentry *dentry,
return fscrypt_get_symlink(inode, ui->data, ui->data_len, done); return fscrypt_get_symlink(inode, ui->data, ui->data_len, done);
} }
static int ubifs_symlink_getattr(struct user_namespace *mnt_userns,
const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags)
{
ubifs_getattr(mnt_userns, path, stat, request_mask, query_flags);
if (IS_ENCRYPTED(d_inode(path->dentry)))
return fscrypt_symlink_getattr(path, stat);
return 0;
}
const struct address_space_operations ubifs_file_address_operations = { const struct address_space_operations ubifs_file_address_operations = {
.readpage = ubifs_readpage, .readpage = ubifs_readpage,
.writepage = ubifs_writepage, .writepage = ubifs_writepage,
...@@ -1655,7 +1666,7 @@ const struct inode_operations ubifs_file_inode_operations = { ...@@ -1655,7 +1666,7 @@ const struct inode_operations ubifs_file_inode_operations = {
const struct inode_operations ubifs_symlink_inode_operations = { const struct inode_operations ubifs_symlink_inode_operations = {
.get_link = ubifs_get_link, .get_link = ubifs_get_link,
.setattr = ubifs_setattr, .setattr = ubifs_setattr,
.getattr = ubifs_getattr, .getattr = ubifs_symlink_getattr,
.listxattr = ubifs_listxattr, .listxattr = ubifs_listxattr,
.update_time = ubifs_update_time, .update_time = ubifs_update_time,
}; };
......
...@@ -253,6 +253,7 @@ int __fscrypt_encrypt_symlink(struct inode *inode, const char *target, ...@@ -253,6 +253,7 @@ int __fscrypt_encrypt_symlink(struct inode *inode, const char *target,
const char *fscrypt_get_symlink(struct inode *inode, const void *caddr, const char *fscrypt_get_symlink(struct inode *inode, const void *caddr,
unsigned int max_size, unsigned int max_size,
struct delayed_call *done); struct delayed_call *done);
int fscrypt_symlink_getattr(const struct path *path, struct kstat *stat);
static inline void fscrypt_set_ops(struct super_block *sb, static inline void fscrypt_set_ops(struct super_block *sb,
const struct fscrypt_operations *s_cop) const struct fscrypt_operations *s_cop)
{ {
...@@ -583,6 +584,12 @@ static inline const char *fscrypt_get_symlink(struct inode *inode, ...@@ -583,6 +584,12 @@ static inline const char *fscrypt_get_symlink(struct inode *inode,
return ERR_PTR(-EOPNOTSUPP); return ERR_PTR(-EOPNOTSUPP);
} }
static inline int fscrypt_symlink_getattr(const struct path *path,
struct kstat *stat)
{
return -EOPNOTSUPP;
}
static inline void fscrypt_set_ops(struct super_block *sb, static inline void fscrypt_set_ops(struct super_block *sb,
const struct fscrypt_operations *s_cop) const struct fscrypt_operations *s_cop)
{ {
......
...@@ -4012,6 +4012,10 @@ int netdev_rx_handler_register(struct net_device *dev, ...@@ -4012,6 +4012,10 @@ int netdev_rx_handler_register(struct net_device *dev,
void netdev_rx_handler_unregister(struct net_device *dev); void netdev_rx_handler_unregister(struct net_device *dev);
bool dev_valid_name(const char *name); bool dev_valid_name(const char *name);
static inline bool is_socket_ioctl_cmd(unsigned int cmd)
{
return _IOC_TYPE(cmd) == SOCK_IOC_TYPE;
}
int dev_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr, int dev_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr,
bool *need_copyout); bool *need_copyout);
int dev_ifconf(struct net *net, struct ifconf *, int); int dev_ifconf(struct net *net, struct ifconf *, int);
......
...@@ -593,7 +593,6 @@ static void prune_tree_chunks(struct audit_tree *victim, bool tagged) ...@@ -593,7 +593,6 @@ static void prune_tree_chunks(struct audit_tree *victim, bool tagged)
spin_lock(&hash_lock); spin_lock(&hash_lock);
} }
spin_unlock(&hash_lock); spin_unlock(&hash_lock);
put_tree(victim);
} }
/* /*
...@@ -602,6 +601,7 @@ static void prune_tree_chunks(struct audit_tree *victim, bool tagged) ...@@ -602,6 +601,7 @@ static void prune_tree_chunks(struct audit_tree *victim, bool tagged)
static void prune_one(struct audit_tree *victim) static void prune_one(struct audit_tree *victim)
{ {
prune_tree_chunks(victim, false); prune_tree_chunks(victim, false);
put_tree(victim);
} }
/* trim the uncommitted chunks from tree */ /* trim the uncommitted chunks from tree */
......
...@@ -1109,7 +1109,7 @@ static long sock_do_ioctl(struct net *net, struct socket *sock, ...@@ -1109,7 +1109,7 @@ static long sock_do_ioctl(struct net *net, struct socket *sock,
rtnl_unlock(); rtnl_unlock();
if (!err && copy_to_user(argp, &ifc, sizeof(struct ifconf))) if (!err && copy_to_user(argp, &ifc, sizeof(struct ifconf)))
err = -EFAULT; err = -EFAULT;
} else { } else if (is_socket_ioctl_cmd(cmd)) {
struct ifreq ifr; struct ifreq ifr;
bool need_copyout; bool need_copyout;
if (copy_from_user(&ifr, argp, sizeof(struct ifreq))) if (copy_from_user(&ifr, argp, sizeof(struct ifreq)))
...@@ -1118,6 +1118,8 @@ static long sock_do_ioctl(struct net *net, struct socket *sock, ...@@ -1118,6 +1118,8 @@ static long sock_do_ioctl(struct net *net, struct socket *sock,
if (!err && need_copyout) if (!err && need_copyout)
if (copy_to_user(argp, &ifr, sizeof(struct ifreq))) if (copy_to_user(argp, &ifr, sizeof(struct ifreq)))
return -EFAULT; return -EFAULT;
} else {
err = -ENOTTY;
} }
return err; return err;
} }
...@@ -3306,6 +3308,8 @@ static int compat_ifr_data_ioctl(struct net *net, unsigned int cmd, ...@@ -3306,6 +3308,8 @@ static int compat_ifr_data_ioctl(struct net *net, unsigned int cmd,
struct ifreq ifreq; struct ifreq ifreq;
u32 data32; u32 data32;
if (!is_socket_ioctl_cmd(cmd))
return -ENOTTY;
if (copy_from_user(ifreq.ifr_name, u_ifreq32->ifr_name, IFNAMSIZ)) if (copy_from_user(ifreq.ifr_name, u_ifreq32->ifr_name, IFNAMSIZ))
return -EFAULT; return -EFAULT;
if (get_user(data32, &u_ifreq32->ifr_data)) if (get_user(data32, &u_ifreq32->ifr_data))
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment