Linux 4.19.165
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.19.165 kernel.
All users of the 4.19 kernel series must upgrade.
The updated 4.19.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.19.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 - arch/powerpc/include/asm/bitops.h | 23 +++++++++++++-- arch/powerpc/sysdev/mpic_msgr.c | 2 - arch/x86/kvm/cpuid.h | 14 +++++++++ arch/x86/kvm/svm.c | 9 +---- arch/x86/kvm/vmx.c | 6 +-- drivers/block/null_blk_zoned.c | 20 ++++++++----- drivers/bluetooth/hci_h5.c | 8 +++-- drivers/md/dm-verity-target.c | 12 +++++++ drivers/md/raid10.c | 3 + drivers/media/usb/dvb-usb/gp8psk.c | 2 - drivers/misc/vmw_vmci/vmci_context.c | 2 - drivers/rtc/rtc-sun6i.c | 8 +++-- drivers/vfio/pci/vfio_pci.c | 3 - drivers/xen/gntdev.c | 17 +++++++---- fs/crypto/hooks.c | 10 +++--- fs/ext4/namei.c | 3 + fs/ext4/super.c | 14 +++------ fs/f2fs/f2fs.h | 2 + fs/fcntl.c | 10 +++--- fs/nfs/nfs4super.c | 2 - fs/nfs/pnfs.c | 33 ++++++++++++++++++++- fs/nfs/pnfs.h | 5 +++ fs/quota/quota_tree.c | 8 ++--- fs/reiserfs/stree.c | 6 +++ fs/ubifs/dir.c | 17 ++++++++--- include/linux/fscrypt_notsupp.h | 5 +++ include/linux/fscrypt_supp.h | 29 ++++++++++++++++++ include/linux/of.h | 1 include/uapi/linux/const.h | 5 +++ include/uapi/linux/ethtool.h | 2 - include/uapi/linux/kernel.h | 9 ----- include/uapi/linux/lightnvm.h | 2 - include/uapi/linux/mroute6.h | 2 - include/uapi/linux/netfilter/x_tables.h | 2 - include/uapi/linux/netlink.h | 2 - include/uapi/linux/sysctl.h | 2 - kernel/module.c | 6 ++- sound/core/pcm_native.c | 9 ++++- sound/core/rawmidi.c | 49 ++++++++++++++++++++++---------- sound/core/seq/seq_queue.h | 8 ++--- 41 files changed, 274 insertions(+), 100 deletions(-)
Anant Thazhemadam (2):
Bluetooth: hci_h5: close serdev device and free hu in h5_close
misc: vmw_vmci: fix kernel info-leak by initializing dbells in vmci_ctx_get_chkpt_doorbells()
Boqun Feng (1):
fcntl: Fix potential deadlock in send_sig{io, urg}()
Christophe Leroy (1):
powerpc/bitops: Fix possible undefined behaviour with fls() and fls64()
Damien Le Moal (1):
null_blk: Fix zone size initialization
Dinghao Liu (1):
rtc: sun6i: Fix memleak in sun6i_rtc_clk_init
Eric Auger (1):
vfio/pci: Move dummy_resources_list init in vfio_pci_probe()
Eric Biggers (4):
fscrypt: add fscrypt_is_nokey_name()
ext4: prevent creating duplicate encrypted filenames
f2fs: prevent creating duplicate encrypted filenames
ubifs: prevent creating duplicate encrypted filenames
Greg Kroah-Hartman (1):
Linux 4.19.165
Hyeongseok Kim (1):
dm verity: skip verity work if I/O error when system is shutting down
Jan Kara (2):
ext4: don't remount read-only with errors=continue on reboot
quota: Don't overflow quota file offsets
Jessica Yu (1):
module: delay kobject uevent until after module init call
Johan Hovold (1):
of: fix linker-section match-table corruption
Kevin Vigor (1):
md/raid10: initialize r10_bio->read_slot before use.
Mauro Carvalho Chehab (1):
media: gp8psk: initialize stats at power control logic
Miroslav Benes (1):
module: set MODULE_STATE_GOING state when a module fails to load
Paolo Bonzini (2):
KVM: SVM: relax conditions for allowing MSR_IA32_SPEC_CTRL accesses
KVM: x86: reinstate vendor-agnostic check on SPEC_CTRL cpuid bits
Petr Vorel (1):
uapi: move constants from <linux/kernel.h> to <linux/const.h>
Qinglang Miao (1):
powerpc: sysdev: add missing iounmap() on error in mpic_msgr_probe()
Rustam Kovhaev (1):
reiserfs: add check for an invalid ih_entry_count
Souptick Joarder (1):
xen/gntdev.c: Mark pages as dirty
Takashi Iwai (3):
ALSA: seq: Use bool for snd_seq_queue internal flags
ALSA: rawmidi: Access runtime->avail always in spinlock
ALSA: pcm: Clear the full allocated memory at hw_params
Trond Myklebust (1):
NFSv4: Fix a pNFS layout related use-after-free race when freeing the inode
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 19 -SUBLEVEL = 164 +SUBLEVEL = 165 EXTRAVERSION = NAME = "People's Front"
arch/powerpc/include/asm/bitops.h +21 -2
@@ -221,15 +221,34 @@ static __inline__ void __clear_bit_unlock(int nr, volatile unsigned long *addr)*/ static __inline__int fls (unsigned int x) { -return 32 -__builtin_clz (x); +int lz; + +if (__builtin_constant_p (x)) +return x ?32 -__builtin_clz (x) :0 ; + asm("cntlzw %0,%1" :"=r" (lz) :"r" (x)); +return 32 - lz; }#include <asm-generic/bitops/builtin-__fls.h> +/* +* 64-bit can do this using one cntlzd (count leading zeroes doubleword) +* instruction; for 32-bit we use the generic version, which does two +* 32-bit fls calls. +*/ +#ifdef CONFIG_PPC64 static __inline__int fls64 (__u64 x) { -return 64 -__builtin_clzll (x); +int lz; + +if (__builtin_constant_p (x)) +return x ?64 -__builtin_clzll (x) :0 ; + asm("cntlzd %0,%1" :"=r" (lz) :"r" (x)); +return 64 - lz; } +#else +#include <asm-generic/bitops/fls64.h> +#endif #ifdef CONFIG_PPC64 unsigned int __arch_hweight8 (unsigned int w);
arch/powerpc/sysdev/mpic_msgr.c +1 -1
@@ -196,7 +196,7 @@ static int mpic_msgr_probe(struct platform_device *dev)/* IO map the message register block. */ of_address_to_resource (np,0 , &rsrc); - msgr_block_addr =ioremap (rsrc.start,resource_size (&rsrc)); + msgr_block_addr =devm_ioremap (&dev->dev, rsrc.start,resource_size (&rsrc));if (!msgr_block_addr) {dev_err (&dev->dev,"Failed to iomap MPIC message registers" );return -EFAULT ;
arch/x86/kvm/cpuid.h +14 -0
@@ -154,6 +154,20 @@ static inline int guest_cpuid_stepping(struct kvm_vcpu *vcpu)return x86_stepping (best->eax); } +static inline bool guest_has_spec_ctrl_msr (struct kvm_vcpu *vcpu) +{ +return (guest_cpuid_has (vcpu,X86_FEATURE_SPEC_CTRL ) || +guest_cpuid_has (vcpu,X86_FEATURE_AMD_STIBP ) || +guest_cpuid_has (vcpu,X86_FEATURE_AMD_IBRS ) || +guest_cpuid_has (vcpu,X86_FEATURE_AMD_SSBD )); +} + +static inline bool guest_has_pred_cmd_msr (struct kvm_vcpu *vcpu) +{ +return (guest_cpuid_has (vcpu,X86_FEATURE_SPEC_CTRL ) || +guest_cpuid_has (vcpu,X86_FEATURE_AMD_IBPB )); +} +static inline bool supports_cpuid_fault (struct kvm_vcpu *vcpu) {return vcpu->arch.msr_platform_info &MSR_PLATFORM_INFO_CPUID_FAULT ;
arch/x86/kvm/svm.c +3 -6
@@ -4209,8 +4209,7 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)break ;case MSR_IA32_SPEC_CTRL :if (!msr_info->host_initiated && - !guest_cpuid_has (vcpu,X86_FEATURE_AMD_IBRS ) && - !guest_cpuid_has (vcpu,X86_FEATURE_AMD_SSBD )) + !guest_has_spec_ctrl_msr (vcpu))return 1 ; msr_info->data = svm->spec_ctrl;
@@ -4312,8 +4311,7 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)break ;case MSR_IA32_SPEC_CTRL :if (!msr->host_initiated && - !guest_cpuid_has (vcpu,X86_FEATURE_AMD_IBRS ) && - !guest_cpuid_has (vcpu,X86_FEATURE_AMD_SSBD )) + !guest_has_spec_ctrl_msr (vcpu))return 1 ;/* The STIBP bit doesn't fault even if it's not advertised */
@@ -4340,12 +4338,11 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)break ;case MSR_IA32_PRED_CMD :if (!msr->host_initiated && - !guest_cpuid_has (vcpu,X86_FEATURE_AMD_IBPB )) + !guest_has_pred_cmd_msr (vcpu))return 1 ;if (data & ~PRED_CMD_IBPB )return 1 ; -if (!data)break ;
arch/x86/kvm/vmx.c +3 -3
@@ -4066,7 +4066,7 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)return kvm_get_msr_common (vcpu, msr_info);case MSR_IA32_SPEC_CTRL :if (!msr_info->host_initiated && - !guest_cpuid_has (vcpu,X86_FEATURE_SPEC_CTRL )) + !guest_has_spec_ctrl_msr (vcpu))return 1 ; msr_info->data =to_vmx (vcpu)->spec_ctrl;
@@ -4180,7 +4180,7 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)break ;case MSR_IA32_SPEC_CTRL :if (!msr_info->host_initiated && - !guest_cpuid_has (vcpu,X86_FEATURE_SPEC_CTRL )) + !guest_has_spec_ctrl_msr (vcpu))return 1 ;/* The STIBP bit doesn't fault even if it's not advertised */
@@ -4210,7 +4210,7 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)break ;case MSR_IA32_PRED_CMD :if (!msr_info->host_initiated && - !guest_cpuid_has (vcpu,X86_FEATURE_SPEC_CTRL )) + !guest_has_pred_cmd_msr (vcpu))return 1 ;if (data & ~PRED_CMD_IBPB )
drivers/block/null_blk_zoned.c +13 -7
@@ -1,9 +1,9 @@// SPDX-License-Identifier: GPL-2.0 #include <linux/vmalloc.h> +#include <linux/sizes.h> #include "null_blk.h" -/* zone_size in MBs to sectors. */ -#define ZONE_SIZE_SHIFT 11 +#define MB_TO_SECTS (mb) (((sector_t)mb * SZ_1M) >> SECTOR_SHIFT)static inline unsigned int null_zone_no (struct nullb_device *dev,sector_t sect) {
@@ -12,7 +12,7 @@ static inline unsigned int null_zone_no(struct nullb_device *dev, sector_t sect)int null_zone_init (struct nullb_device *dev) { -sector_t dev_size = (sector_t )dev->size *1024 *1024 ; +sector_t dev_capacity_sects;sector_t sector =0 ;unsigned int i;
@@ -25,9 +25,12 @@ int null_zone_init(struct nullb_device *dev)return -EINVAL ; } - dev->zone_size_sects = dev->zone_size <<ZONE_SIZE_SHIFT ; - dev->nr_zones = dev_size >> - (SECTOR_SHIFT +ilog2 (dev->zone_size_sects)); + dev_capacity_sects =MB_TO_SECTS (dev->size); + dev->zone_size_sects =MB_TO_SECTS (dev->zone_size); + dev->nr_zones = dev_capacity_sects >>ilog2 (dev->zone_size_sects); +if (dev_capacity_sects & (dev->zone_size_sects -1 )) + dev->nr_zones++; + dev->zones =kvmalloc_array (dev->nr_zones,sizeof (struct blk_zone ),GFP_KERNEL | __GFP_ZERO);if (!dev->zones)
@@ -37,7 +40,10 @@ int null_zone_init(struct nullb_device *dev)struct blk_zone *zone = &dev->zones[i]; zone->start = zone->wp = sector; - zone->len = dev->zone_size_sects; +if (zone->start + dev->zone_size_sects > dev_capacity_sects) + zone->len = dev_capacity_sects - zone->start; +else + zone->len = dev->zone_size_sects; zone->type =BLK_ZONE_TYPE_SEQWRITE_REQ ; zone->cond =BLK_ZONE_COND_EMPTY ;
drivers/bluetooth/hci_h5.c +6 -2
@@ -263,8 +263,12 @@ static int h5_close(struct hci_uart *hu)if (h5->vnd && h5->vnd->close) h5->vnd->close (h5); -if (!hu->serdev) -kfree (h5); +if (hu->serdev) +serdev_device_close (hu->serdev); + +kfree_skb (h5->rx_skb); +kfree (h5); + h5 =NULL ;return 0 ; }
drivers/md/dm-verity-target.c +11 -1
@@ -533,6 +533,15 @@ static int verity_verify_io(struct dm_verity_io *io)return 0 ; } +/* +* Skip verity work in response to I/O error when system is shutting down. +*/ +static inline bool verity_is_system_shutting_down (void ) +{ +return system_state ==SYSTEM_HALT || system_state ==SYSTEM_POWER_OFF + || system_state ==SYSTEM_RESTART ; +} +/* * End one "io" structure with a given error. */
@@ -560,7 +569,8 @@ static void verity_end_io(struct bio *bio) {struct dm_verity_io *io = bio->bi_private; -if (bio->bi_status && !verity_fec_is_enabled (io->v)) { +if (bio->bi_status && + (!verity_fec_is_enabled (io->v) ||verity_is_system_shutting_down ())) {verity_finish_io (io, bio->bi_status);return ; }
drivers/md/raid10.c +2 -1
@@ -1138,7 +1138,7 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,struct md_rdev *err_rdev =NULL ;gfp_t gfp =GFP_NOIO ; -if (r10_bio->devs[slot].rdev) { +if (slot >=0 && r10_bio->devs[slot].rdev) {/* * This is an error retry, but we cannot * safely dereference the rdev in the r10_bio,
@@ -1547,6 +1547,7 @@ static void __make_request(struct mddev *mddev, struct bio *bio, int sectors) r10_bio->mddev = mddev; r10_bio->sector = bio->bi_iter.bi_sector; r10_bio->state =0 ; + r10_bio->read_slot =-1 ;memset (r10_bio->devs,0 ,sizeof (r10_bio->devs[0 ]) * conf->copies);if (bio_data_dir (bio) ==READ )
drivers/media/usb/dvb-usb/gp8psk.c +1 -1
@@ -185,7 +185,7 @@ static int gp8psk_load_bcm4500fw(struct dvb_usb_device *d)static int gp8psk_power_ctrl (struct dvb_usb_device *d,int onoff) { -u8 status, buf; +u8 status =0 , buf;int gp_product_id =le16_to_cpu (d->udev->descriptor.idProduct);if (onoff) {
drivers/misc/vmw_vmci/vmci_context.c +1 -1
@@ -751,7 +751,7 @@ static int vmci_ctx_get_chkpt_doorbells(struct vmci_ctx *context,return VMCI_ERROR_MORE_DATA ; } - dbells =kmalloc (data_size,GFP_ATOMIC ); + dbells =kzalloc (data_size,GFP_ATOMIC );if (!dbells)return VMCI_ERROR_NO_MEM ;
drivers/rtc/rtc-sun6i.c +5 -3
@@ -232,7 +232,7 @@ static void __init sun6i_rtc_clk_init(struct device_node *node) 300000000);if (IS_ERR (rtc->int_osc)) {pr_crit ("Couldn't register the internal oscillator\n" ); -return ; + goto err; } parents[0 ] =clk_hw_get_name (rtc->int_osc);
@@ -248,7 +248,7 @@ static void __init sun6i_rtc_clk_init(struct device_node *node) rtc->losc =clk_register (NULL , &rtc->hw);if (IS_ERR (rtc->losc)) {pr_crit ("Couldn't register the LOSC clock\n" ); -return ; + goto err_register; } of_property_read_string_index(node, "clock-output-names", 1,
@@ -259,7 +259,7 @@ static void __init sun6i_rtc_clk_init(struct device_node *node) &rtc->lock);if (IS_ERR (rtc->ext_losc)) {pr_crit ("Couldn't register the LOSC external gate\n" ); -return ; + goto err_register; } clk_data->num =2 ;
@@ -268,6 +268,8 @@ static void __init sun6i_rtc_clk_init(struct device_node *node)of_clk_add_hw_provider (node, of_clk_hw_onecell_get, clk_data);return ; +err_register: +clk_hw_unregister_fixed_rate (rtc->int_osc); err:kfree (clk_data); }
drivers/vfio/pci/vfio_pci.c +1 -2
@@ -118,8 +118,6 @@ static void vfio_pci_probe_mmaps(struct vfio_pci_device *vdev)int bar;struct vfio_pci_dummy_resource *dummy_res; -INIT_LIST_HEAD (&vdev->dummy_resources_list); -for (bar =PCI_STD_RESOURCES ; bar <=PCI_STD_RESOURCE_END ; bar++) { res = vdev->pdev->resource + bar;
@@ -1522,6 +1520,7 @@ static int vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)mutex_init (&vdev->igate);spin_lock_init (&vdev->irqlock);mutex_init (&vdev->ioeventfds_lock); +INIT_LIST_HEAD (&vdev->dummy_resources_list);INIT_LIST_HEAD (&vdev->ioeventfds_list);mutex_init (&vdev->vma_lock);INIT_LIST_HEAD (&vdev->vma_list);
drivers/xen/gntdev.c +12 -5
@@ -842,17 +842,18 @@ struct gntdev_copy_batch {s16 __user *status[GNTDEV_COPY_BATCH ];unsigned int nr_ops;unsigned int nr_pages; +bool writeable; };static int gntdev_get_page (struct gntdev_copy_batch *batch,void __user *virt, -bool writeable,unsigned long *gfn) +unsigned long *gfn) {unsigned long addr = (unsigned long )virt;struct page *page;unsigned long xen_pfn;int ret; - ret =get_user_pages_fast (addr,1 , writeable, &page); + ret =get_user_pages_fast (addr,1 , batch->writeable, &page);if (ret <0 )return ret;
@@ -868,9 +869,13 @@ static void gntdev_put_pages(struct gntdev_copy_batch *batch) {unsigned int i; -for (i =0 ; i < batch->nr_pages; i++) +for (i =0 ; i < batch->nr_pages; i++) { +if (batch->writeable && !PageDirty (batch->pages[i])) +set_page_dirty_lock (batch->pages[i]);put_page (batch->pages[i]); + } batch->nr_pages =0 ; + batch->writeable = false; }static int gntdev_copy (struct gntdev_copy_batch *batch)
@@ -959,8 +964,9 @@ static int gntdev_grant_copy_seg(struct gntdev_copy_batch *batch, virt = seg->source.virt + copied; off = (unsigned long )virt & ~XEN_PAGE_MASK ; len =min (len, (size_t )XEN_PAGE_SIZE - off); + batch->writeable = false; - ret =gntdev_get_page (batch, virt, false, &gfn); + ret =gntdev_get_page (batch, virt, &gfn);if (ret <0 )return ret;
@@ -978,8 +984,9 @@ static int gntdev_grant_copy_seg(struct gntdev_copy_batch *batch, virt = seg->dest.virt + copied; off = (unsigned long )virt & ~XEN_PAGE_MASK ; len =min (len, (size_t )XEN_PAGE_SIZE - off); + batch->writeable = true; - ret =gntdev_get_page (batch, virt, true, &gfn); + ret =gntdev_get_page (batch, virt, &gfn);if (ret <0 )return ret;
fs/crypto/hooks.c +5 -5
@@ -58,8 +58,8 @@ int __fscrypt_prepare_link(struct inode *inode, struct inode *dir,if (err)return err; -/* ... in case we looked up ciphertext name before key was added */ -if (dentry->d_flags &DCACHE_ENCRYPTED_NAME ) +/* ... in case we looked up no-key name before key was added */ +if (fscrypt_is_nokey_name (dentry))return -ENOKEY ;if (!fscrypt_has_permitted_context (dir, inode))
@@ -83,9 +83,9 @@ int __fscrypt_prepare_rename(struct inode *old_dir, struct dentry *old_dentry,if (err)return err; -/* ... in case we looked up ciphertext name(s) before key was added */ -if ((old_dentry->d_flags | new_dentry->d_flags) & -DCACHE_ENCRYPTED_NAME ) +/* ... in case we looked up no-key name(s) before key was added */ +if (fscrypt_is_nokey_name (old_dentry) || +fscrypt_is_nokey_name (new_dentry))return -ENOKEY ;if (old_dir != new_dir) {
fs/ext4/namei.c +3 -0
@@ -2106,6 +2106,9 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry,if (!dentry->d_name.len)return -EINVAL ; +if (fscrypt_is_nokey_name (dentry)) +return -ENOKEY ; + retval =ext4_fname_setup_filename (dir, &dentry->d_name,0 , &fname);if (retval)return retval;
fs/ext4/super.c +6 -8
@@ -454,19 +454,17 @@ static bool system_going_down(void)static void ext4_handle_error (struct super_block *sb) { +journal_t *journal =EXT4_SB (sb)->s_journal; +if (test_opt (sb,WARN_ON_ERROR ))WARN_ON_ONCE (1 ); -if (sb_rdonly (sb)) +if (sb_rdonly (sb) ||test_opt (sb,ERRORS_CONT ))return ; -if (!test_opt (sb,ERRORS_CONT )) { -journal_t *journal =EXT4_SB (sb)->s_journal; - -EXT4_SB (sb)->s_mount_flags |=EXT4_MF_FS_ABORTED ; -if (journal) -jbd2_journal_abort (journal, -EIO ); - } +EXT4_SB (sb)->s_mount_flags |=EXT4_MF_FS_ABORTED ; +if (journal) +jbd2_journal_abort (journal, -EIO );/* * We force ERRORS_RO behavior when system is rebooting. Otherwise we * could panic during 'reboot -f' as the underlying device got already
fs/f2fs/f2fs.h +2 -0
@@ -2857,6 +2857,8 @@ bool f2fs_empty_dir(struct inode *dir);static inline int f2fs_add_link (struct dentry *dentry,struct inode *inode) { +if (fscrypt_is_nokey_name (dentry)) +return -ENOKEY ;return f2fs_do_add_link (d_inode (dentry->d_parent), &dentry->d_name, inode, inode->i_ino, inode->i_mode); }
fs/fcntl.c +6 -4
@@ -779,9 +779,10 @@ void send_sigio(struct fown_struct *fown, int fd, int band) {struct task_struct *p;enum pid_type type; +unsigned long flags;struct pid *pid; -read_lock (&fown->lock); +read_lock_irqsave (&fown->lock, flags); type = fown->pid_type; pid = fown->pid;
@@ -802,7 +803,7 @@ void send_sigio(struct fown_struct *fown, int fd, int band)read_unlock (&tasklist_lock); } out_unlock_fown: -read_unlock (&fown->lock); +read_unlock_irqrestore (&fown->lock, flags); } static void send_sigurg_to_task(struct task_struct *p,
@@ -817,9 +818,10 @@ int send_sigurg(struct fown_struct *fown)struct task_struct *p;enum pid_type type;struct pid *pid; +unsigned long flags;int ret =0 ; -read_lock (&fown->lock); +read_lock_irqsave (&fown->lock, flags); type = fown->pid_type; pid = fown->pid;
@@ -842,7 +844,7 @@ int send_sigurg(struct fown_struct *fown)read_unlock (&tasklist_lock); } out_unlock_fown: -read_unlock (&fown->lock); +read_unlock_irqrestore (&fown->lock, flags);return ret; }
fs/nfs/nfs4super.c +1 -1
@@ -95,7 +95,7 @@ static void nfs4_evict_inode(struct inode *inode)nfs_inode_return_delegation_noreclaim (inode);/* Note that above delegreturn would trigger pnfs return-on-close */ pnfs_return_layout (inode); -pnfs_destroy_layout (NFS_I (inode)); +pnfs_destroy_layout_final (NFS_I (inode));/* First call standard NFS clear_inode() code */ nfs_clear_inode (inode); }
fs/nfs/pnfs.c +31 -2
@@ -294,6 +294,7 @@ void pnfs_put_layout_hdr(struct pnfs_layout_hdr *lo) {struct inode *inode; +unsigned long i_state;if (!lo)return ;
@@ -304,8 +305,12 @@ pnfs_put_layout_hdr(struct pnfs_layout_hdr *lo)if (!list_empty (&lo->plh_segs))WARN_ONCE (1 ,"NFS: BUG unfreed layout segments.\n" );pnfs_detach_layout_hdr (lo); + i_state = inode->i_state;spin_unlock (&inode->i_lock);pnfs_free_layout_hdr (lo); +/* Notify pnfs_destroy_layout_final() that we're done */ +if (i_state & (I_FREEING |I_CLEAR )) +wake_up_var (lo); } }
@@ -713,8 +718,7 @@ pnfs_free_lseg_list(struct list_head *free_me) } } -void -pnfs_destroy_layout (struct nfs_inode *nfsi) +static struct pnfs_layout_hdr *__pnfs_destroy_layout (struct nfs_inode *nfsi) {struct pnfs_layout_hdr *lo;LIST_HEAD (tmp_list);
@@ -732,9 +736,34 @@ pnfs_destroy_layout(struct nfs_inode *nfsi)pnfs_put_layout_hdr (lo); }else spin_unlock (&nfsi->vfs_inode.i_lock); +return lo; +} + +void pnfs_destroy_layout (struct nfs_inode *nfsi) +{ +__pnfs_destroy_layout (nfsi); }EXPORT_SYMBOL_GPL (pnfs_destroy_layout); +static bool pnfs_layout_removed (struct nfs_inode *nfsi, +struct pnfs_layout_hdr *lo) +{ +bool ret; + +spin_lock (&nfsi->vfs_inode.i_lock); + ret = nfsi->layout != lo; +spin_unlock (&nfsi->vfs_inode.i_lock); +return ret; +} + +void pnfs_destroy_layout_final (struct nfs_inode *nfsi) +{ +struct pnfs_layout_hdr *lo =__pnfs_destroy_layout (nfsi); + +if (lo) +wait_var_event (lo,pnfs_layout_removed (nfsi, lo)); +} +static bool pnfs_layout_add_bulk_destroy_list (struct inode *inode,struct list_head *layout_list)
fs/nfs/pnfs.h +5 -0
@@ -254,6 +254,7 @@ struct pnfs_layout_segment *pnfs_layout_process(struct nfs4_layoutget *lgp);void pnfs_layoutget_free (struct nfs4_layoutget *lgp);void pnfs_free_lseg_list (struct list_head *tmp_list);void pnfs_destroy_layout (struct nfs_inode *); +void pnfs_destroy_layout_final (struct nfs_inode *);void pnfs_destroy_all_layouts (struct nfs_client *); int pnfs_destroy_layouts_byfsid(struct nfs_client *clp, struct nfs_fsid *fsid,
@@ -645,6 +646,10 @@ static inline void pnfs_destroy_layout(struct nfs_inode *nfsi) { } +static inline void pnfs_destroy_layout_final (struct nfs_inode *nfsi) +{ +} +static inline struct pnfs_layout_segment *pnfs_get_lseg (struct pnfs_layout_segment *lseg) {
fs/quota/quota_tree.c +4 -4
@@ -61,7 +61,7 @@ static ssize_t read_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf)memset (buf,0 , info->dqi_usable_bs);return sb->s_op->quota_read (sb, info->dqi_type, buf, - info->dqi_usable_bs, blk << info->dqi_blocksize_bits); + info->dqi_usable_bs, (loff_t )blk << info->dqi_blocksize_bits); }static ssize_t write_blk (struct qtree_mem_dqinfo *info,uint blk,char *buf)
@@ -70,7 +70,7 @@ static ssize_t write_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf)ssize_t ret; ret = sb->s_op->quota_write (sb, info->dqi_type, buf, - info->dqi_usable_bs, blk << info->dqi_blocksize_bits); + info->dqi_usable_bs, (loff_t )blk << info->dqi_blocksize_bits);if (ret != info->dqi_usable_bs) {quota_error (sb,"dquota write failed" );if (ret >=0 )
@@ -283,7 +283,7 @@ static uint find_free_dqentry(struct qtree_mem_dqinfo *info, blk); goto out_buf; } - dquot->dq_off = (blk << info->dqi_blocksize_bits) + + dquot->dq_off = ((loff_t )blk << info->dqi_blocksize_bits) +sizeof (struct qt_disk_dqdbheader ) + i * info->dqi_entry_size;kfree (buf);
@@ -558,7 +558,7 @@ static loff_t find_block_dqentry(struct qtree_mem_dqinfo *info, ret = -EIO ; goto out_buf; }else { - ret = (blk << info->dqi_blocksize_bits) +sizeof (struct + ret = ((loff_t )blk << info->dqi_blocksize_bits) +sizeof (struct qt_disk_dqdbheader ) + i * info->dqi_entry_size; } out_buf:
fs/reiserfs/stree.c +6 -0
@@ -454,6 +454,12 @@ static int is_leaf(char *buf, int blocksize, struct buffer_head *bh) "(second one): %h", ih);return 0 ; } +if (is_direntry_le_ih (ih) && (ih_item_len (ih) < (ih_entry_count (ih) *IH_SIZE ))) { +reiserfs_warning (NULL ,"reiserfs-5093" , +"item entry count seems wrong %h" , + ih); +return 0 ; + } prev_location =ih_location (ih); }
fs/ubifs/dir.c +13 -4
@@ -290,6 +290,15 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry,return d_splice_alias (inode, dentry); } +static int ubifs_prepare_create (struct inode *dir,struct dentry *dentry, +struct fscrypt_name *nm) +{ +if (fscrypt_is_nokey_name (dentry)) +return -ENOKEY ; + +return fscrypt_setup_filename (dir, &dentry->d_name,0 , nm); +} +static int ubifs_create (struct inode *dir,struct dentry *dentry,umode_t mode,bool excl) {
@@ -313,7 +322,7 @@ static int ubifs_create(struct inode *dir, struct dentry *dentry, umode_t mode,if (err)return err; - err =fscrypt_setup_filename (dir, &dentry->d_name,0 , &nm); + err =ubifs_prepare_create (dir, dentry, &nm);if (err) goto out_budg;
@@ -977,7 +986,7 @@ static int ubifs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)if (err)return err; - err =fscrypt_setup_filename (dir, &dentry->d_name,0 , &nm); + err =ubifs_prepare_create (dir, dentry, &nm);if (err) goto out_budg;
@@ -1062,7 +1071,7 @@ static int ubifs_mknod(struct inode *dir, struct dentry *dentry,return err; } - err =fscrypt_setup_filename (dir, &dentry->d_name,0 , &nm); + err =ubifs_prepare_create (dir, dentry, &nm);if (err) {kfree (dev); goto out_budg;
@@ -1146,7 +1155,7 @@ static int ubifs_symlink(struct inode *dir, struct dentry *dentry,if (err)return err; - err =fscrypt_setup_filename (dir, &dentry->d_name,0 , &nm); + err =ubifs_prepare_create (dir, dentry, &nm);if (err) goto out_budg;
include/linux/fscrypt_notsupp.h +5 -0
@@ -24,6 +24,11 @@ static inline bool fscrypt_dummy_context_enabled(struct inode *inode)return false; } +static inline bool fscrypt_is_nokey_name (const struct dentry *dentry) +{ +return false; +} +/* crypto.c */ static inline void fscrypt_enqueue_decrypt_work (struct work_struct *work) {
include/linux/fscrypt_supp.h +29 -0
@@ -58,6 +58,35 @@ static inline bool fscrypt_dummy_context_enabled(struct inode *inode) inode->i_sb->s_cop->dummy_context (inode); } +/** +* fscrypt_is_nokey_name() - test whether a dentry is a no-key name +* @dentry: the dentry to check +* +* This returns true if the dentry is a no-key dentry. A no-key dentry is a +* dentry that was created in an encrypted directory that hasn't had its +* encryption key added yet. Such dentries may be either positive or negative. +* +* When a filesystem is asked to create a new filename in an encrypted directory +* and the new filename's dentry is a no-key dentry, it must fail the operation +* with ENOKEY. This includes ->create(), ->mkdir(), ->mknod(), ->symlink(), +* ->rename(), and ->link(). (However, ->rename() and ->link() are already +* handled by fscrypt_prepare_rename() and fscrypt_prepare_link().) +* +* This is necessary because creating a filename requires the directory's +* encryption key, but just checking for the key on the directory inode during +* the final filesystem operation doesn't guarantee that the key was available +* during the preceding dentry lookup. And the key must have already been +* available during the dentry lookup in order for it to have been checked +* whether the filename already exists in the directory and for the new file's +* dentry not to be invalidated due to it incorrectly having the no-key flag. +* +* Return: %true if the dentry is a no-key name +*/ +static inline bool fscrypt_is_nokey_name (const struct dentry *dentry) +{ +return dentry->d_flags &DCACHE_ENCRYPTED_NAME ; +} +/* crypto.c */ extern void fscrypt_enqueue_decrypt_work (struct work_struct *);extern struct fscrypt_ctx *fscrypt_get_ctx (const struct inode *,gfp_t );
include/linux/of.h +1 -0
@@ -1258,6 +1258,7 @@ static inline int of_get_available_child_count(const struct device_node *np)#define _OF_DECLARE (table, name, compat, fn, fn_type) \ static const struct of_device_id __of_table_##name \ __used __section(__##table##_of_table) \ + __aligned(__alignof__(struct of_device_id)) \ = { .compatible = compat, \ .data = (fn == (fn_type)NULL) ? fn : fn }#else
include/uapi/linux/const.h +5 -0
@@ -28,4 +28,9 @@#define _BITUL (x) (_UL(1) << (x))#define _BITULL (x) (_ULL(1) << (x)) +#define __ALIGN_KERNEL (x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) +#define __ALIGN_KERNEL_MASK (x, mask) (((x) + (mask)) & ~(mask)) + +#define __KERNEL_DIV_ROUND_UP (n, d) (((n) + (d) - 1) / (d)) +#endif /* _UAPI_LINUX_CONST_H */
include/uapi/linux/ethtool.h +1 -1
@@ -14,7 +14,7 @@#ifndef _UAPI_LINUX_ETHTOOL_H#define _UAPI_LINUX_ETHTOOL_H -#include <linux/kernel.h> +#include <linux/const.h> #include <linux/types.h> #include <linux/if_ether.h>
include/uapi/linux/kernel.h +1 -8
@@ -3,13 +3,6 @@#define _UAPI_LINUX_KERNEL_H#include <linux/sysinfo.h> - -/* -* 'kernel.h' contains some often-used function prototypes etc -*/ -#define __ALIGN_KERNEL (x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) -#define __ALIGN_KERNEL_MASK (x, mask) (((x) + (mask)) & ~(mask)) - -#define __KERNEL_DIV_ROUND_UP (n, d) (((n) + (d) - 1) / (d)) +#include <linux/const.h> #endif /* _UAPI_LINUX_KERNEL_H */
include/uapi/linux/lightnvm.h +1 -1
@@ -21,7 +21,7 @@#define _UAPI_LINUX_LIGHTNVM_H#ifdef __KERNEL__ -#include <linux/kernel.h> +#include <linux/const.h> #include <linux/ioctl.h> #else /* __KERNEL__ */ #include <stdio.h>
include/uapi/linux/mroute6.h +1 -1
@@ -2,7 +2,7 @@#ifndef _UAPI__LINUX_MROUTE6_H#define _UAPI__LINUX_MROUTE6_H -#include <linux/kernel.h> +#include <linux/const.h> #include <linux/types.h> #include <linux/sockios.h> #include <linux/in6.h> /* For struct sockaddr_in6. */
include/uapi/linux/netfilter/x_tables.h +1 -1
@@ -1,7 +1,7 @@/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ #ifndef _UAPI_X_TABLES_H#define _UAPI_X_TABLES_H -#include <linux/kernel.h> +#include <linux/const.h> #include <linux/types.h> #define XT_FUNCTION_MAXNAMELEN 30
include/uapi/linux/netlink.h +1 -1
@@ -2,7 +2,7 @@#ifndef _UAPI__LINUX_NETLINK_H#define _UAPI__LINUX_NETLINK_H -#include <linux/kernel.h> +#include <linux/const.h> #include <linux/socket.h> /* for __kernel_sa_family_t */ #include <linux/types.h>
include/uapi/linux/sysctl.h +1 -1
@@ -23,7 +23,7 @@#ifndef _UAPI_LINUX_SYSCTL_H#define _UAPI_LINUX_SYSCTL_H -#include <linux/kernel.h> +#include <linux/const.h> #include <linux/types.h> #include <linux/compiler.h>
kernel/module.c +4 -2
@@ -1806,7 +1806,6 @@ static int mod_sysfs_init(struct module *mod)if (err)mod_kobject_put (mod); -/* delay uevent until full sysfs population */ out:return err; }
@@ -1843,7 +1842,6 @@ static int mod_sysfs_setup(struct module *mod,add_sect_attrs (mod, info);add_notes_attrs (mod, info); -kobject_uevent (&mod->mkobj.kobj,KOBJ_ADD );return 0 ; out_unreg_modinfo_attrs:
@@ -3499,6 +3497,9 @@ static noinline int do_init_module(struct module *mod)blocking_notifier_call_chain (&module_notify_list,MODULE_STATE_LIVE , mod); +/* Delay uevent until module has finished its init routine */ +kobject_uevent (&mod->mkobj.kobj,KOBJ_ADD ); +/* * We need to finish all async code before the module init sequence * is done. This has potential to deadlock. For example, a newly
@@ -3841,6 +3842,7 @@ static int load_module(struct load_info *info, const char __user *uargs, MODULE_STATE_GOING, mod);klp_module_going (mod); bug_cleanup: + mod->state =MODULE_STATE_GOING ;/* module_bug_cleanup needs module_mutex protection */ mutex_lock (&module_mutex);module_bug_cleanup (mod);
sound/core/pcm_native.c +7 -2
@@ -753,8 +753,13 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream, runtime->boundary *=2 ;/* clear the buffer for avoiding possible kernel info leaks */ -if (runtime->dma_area && !substream->ops->copy_user) -memset (runtime->dma_area,0 , runtime->dma_bytes); +if (runtime->dma_area && !substream->ops->copy_user) { +size_t size = runtime->dma_bytes; + +if (runtime->info &SNDRV_PCM_INFO_MMAP ) + size =PAGE_ALIGN (size); +memset (runtime->dma_area,0 , size); + }snd_pcm_timer_resolution_change (substream);snd_pcm_set_state (substream,SNDRV_PCM_STATE_SETUP );
sound/core/rawmidi.c +35 -14
117 lines not on this page · raw message
sound/core/seq/seq_queue.h +4 -4
@@ -40,10 +40,10 @@ struct snd_seq_queue {struct snd_seq_timer *timer;/* time keeper for this queue */ int owner;/* client that 'owns' the timer */ - unsigned int locked:1, /* timer is only accesibble by owner if set */ - klocked:1, /* kernel lock (after START) */ - check_again:1, - check_blocked:1; +bool locked;/* timer is only accesibble by owner if set */ +bool klocked;/* kernel lock (after START) */ +bool check_again;/* concurrent access happened during check */ +bool check_blocked;/* queue being checked */ unsigned int flags;/* status flags */ unsigned int info_flags;/* info for sync */