Linux 5.4.87
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.4.87 kernel.
All users of the 5.4 kernel series must upgrade.
The updated 5.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.4.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/um/drivers/ubd_kern.c | 191 +++++++++++++++++++------------- arch/x86/kvm/cpuid.h | 14 ++ arch/x86/kvm/svm.c | 17 +- arch/x86/kvm/vmx/vmx.c | 13 +- arch/x86/kvm/x86.c | 22 +++ arch/x86/kvm/x86.h | 1 block/blk-pm.c | 15 +- drivers/block/null_blk_zoned.c | 19 ++- drivers/bluetooth/hci_h5.c | 8 + drivers/i3c/master.c | 5 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-pl031.c | 6 - drivers/rtc/rtc-sun6i.c | 8 - drivers/scsi/cxgbi/cxgb4i/Kconfig | 1 drivers/thermal/cpu_cooling.c | 9 + drivers/vfio/pci/vfio_pci.c | 3 fs/bfs/inode.c | 2 fs/btrfs/ioctl.c | 39 ++++++ fs/crypto/fscrypt_private.h | 5 fs/crypto/hooks.c | 10 - fs/crypto/keysetup.c | 2 fs/crypto/policy.c | 6 - fs/ext4/namei.c | 3 fs/ext4/super.c | 14 +- fs/f2fs/checkpoint.c | 2 fs/f2fs/debug.c | 11 + fs/f2fs/f2fs.h | 12 +- fs/f2fs/node.c | 29 +++- fs/f2fs/node.h | 4 fs/f2fs/shrinker.c | 4 fs/f2fs/super.c | 9 - fs/fcntl.c | 10 + fs/jffs2/jffs2_fs_sb.h | 1 fs/jffs2/super.c | 17 +- fs/namespace.c | 9 + fs/nfs/nfs4super.c | 2 fs/nfs/pnfs.c | 33 +++++ fs/nfs/pnfs.h | 5 fs/pnode.h | 2 fs/quota/quota_tree.c | 8 - fs/reiserfs/stree.c | 6 + fs/ubifs/dir.c | 17 ++ include/linux/fscrypt.h | 34 +++++ include/linux/of.h | 1 include/uapi/linux/const.h | 5 include/uapi/linux/ethtool.h | 2 include/uapi/linux/fscrypt.h | 5 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/cgroup/cgroup-v1.c | 2 kernel/module.c | 6 - kernel/time/tick-sched.c | 7 - net/sched/sch_taprio.c | 17 ++ sound/core/pcm_native.c | 9 + sound/core/rawmidi.c | 49 +++++--- sound/core/seq/seq_queue.h | 8 - tools/include/uapi/linux/const.h | 5 67 files changed, 562 insertions(+), 247 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()
Arnaldo Carvalho de Melo (1):
tools headers UAPI: Sync linux/const.h with the kernel headers
Bart Van Assche (1):
scsi: block: Fix a race in the runtime power management code
Boqun Feng (1):
fcntl: Fix potential deadlock in send_sig{io, urg}()
Chao Yu (1):
f2fs: fix shift-out-of-bounds in sanity_check_raw_super()
Christophe Leroy (1):
powerpc/bitops: Fix possible undefined behaviour with fls() and fls64()
Damien Le Moal (1):
null_blk: Fix zone size initialization
Davide Caratti (1):
net/sched: sch_taprio: reset child qdiscs before freeing them
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 (6):
ext4: prevent creating duplicate encrypted filenames
ubifs: prevent creating duplicate encrypted filenames
f2fs: prevent creating duplicate encrypted filenames
fscrypt: add fscrypt_is_nokey_name()
fscrypt: remove kernel-internal constants from UAPI header fs/namespace.c: WARN if mnt_count has become negative
Filipe Manana (1):
btrfs: fix race when defragmenting leads to unnecessary IO
Gabriel Krisman Bertazi (1):
um: ubd: Submit all data segments atomically
Greg Kroah-Hartman (1):
Linux 5.4.87
Hyeongseok Kim (1):
dm verity: skip verity work if I/O error when system is shutting down
Jaegeuk Kim (1):
f2fs: avoid race condition for shrinker count
Jamie Iles (1):
jffs2: Fix NULL pointer dereference in rp_size fs option parsing
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 (3):
KVM: x86: avoid incorrect writes to host MSR_IA32_SPEC_CTRL
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 (3):
cgroup: Fix memory leak when parsing multiple source parameters
powerpc: sysdev: add missing iounmap() on error in mpic_msgr_probe() i3c master: fix missing destroy_workqueue() on error in i3c_master_register
Randy Dunlap (2):
scsi: cxgb4i: Fix TLS dependency
bfs: don't use WARNING: string when it's just info.
Rustam Kovhaev (1):
reiserfs: add check for an invalid ih_entry_count
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
Thomas Gleixner (1):
tick/sched: Remove bogus boot "safety" check
Trond Myklebust (1):
NFSv4: Fix a pNFS layout related use-after-free race when freeing the inode
Zheng Liang (1):
rtc: pl031: fix resource leak in pl031_probe
Zhuguangqing (1):
thermal/drivers/cpufreq_cooling: Update cpufreq_state only if state has changed
lizhe (1):
jffs2: Allow setting rp_size to zero during remounting
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 86 +SUBLEVEL = 87 EXTRAVERSION = NAME = Kleptomaniac Octopus
arch/powerpc/include/asm/bitops.h +21 -2
@@ -217,15 +217,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
@@ -191,7 +191,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/um/drivers/ubd_kern.c +115 -76
311 lines not on this page · raw message
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 +6 -11
@@ -4233,8 +4233,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;
@@ -4318,16 +4317,13 @@ 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 */ -if (data & ~(SPEC_CTRL_IBRS |SPEC_CTRL_STIBP |SPEC_CTRL_SSBD )) +if (data & ~kvm_spec_ctrl_valid_bits (vcpu))return 1 ; svm->spec_ctrl = data; -if (!data)break ;
@@ -4346,18 +4342,17 @@ 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 (!boot_cpu_has (X86_FEATURE_IBPB )) +return 1 ;if (!data)break ;wrmsrl (MSR_IA32_PRED_CMD ,PRED_CMD_IBPB ); -if (is_guest_mode (vcpu)) -break ;set_msr_interception (svm->msrpm,MSR_IA32_PRED_CMD ,0 ,1 );break ;case MSR_AMD64_VIRT_SPEC_CTRL :
arch/x86/kvm/vmx/vmx.c +6 -7
@@ -1788,7 +1788,7 @@ static int vmx_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_SPEC_CTRL )) + !guest_has_spec_ctrl_msr (vcpu))return 1 ; msr_info->data =to_vmx (vcpu)->spec_ctrl;
@@ -1971,15 +1971,13 @@ 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 */ -if (data & ~(SPEC_CTRL_IBRS |SPEC_CTRL_STIBP |SPEC_CTRL_SSBD )) +if (data & ~kvm_spec_ctrl_valid_bits (vcpu))return 1 ; vmx->spec_ctrl = data; -if (!data)break ;
@@ -2001,12 +1999,13 @@ 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 )return 1 ; - +if (!boot_cpu_has (X86_FEATURE_IBPB )) +return 1 ;if (!data)break ;
arch/x86/kvm/x86.c +22 -0
@@ -10369,6 +10369,28 @@ bool kvm_arch_no_poll(struct kvm_vcpu *vcpu) }EXPORT_SYMBOL_GPL (kvm_arch_no_poll); +u64 kvm_spec_ctrl_valid_bits (struct kvm_vcpu *vcpu) +{ +uint64_t bits =SPEC_CTRL_IBRS |SPEC_CTRL_STIBP |SPEC_CTRL_SSBD ; + +/* The STIBP bit doesn't fault even if it's not advertised */ +if (!guest_cpuid_has (vcpu,X86_FEATURE_SPEC_CTRL ) && + !guest_cpuid_has (vcpu,X86_FEATURE_AMD_IBRS )) + bits &= ~(SPEC_CTRL_IBRS |SPEC_CTRL_STIBP ); +if (!boot_cpu_has (X86_FEATURE_SPEC_CTRL ) && + !boot_cpu_has (X86_FEATURE_AMD_IBRS )) + bits &= ~(SPEC_CTRL_IBRS |SPEC_CTRL_STIBP ); + +if (!guest_cpuid_has (vcpu,X86_FEATURE_SPEC_CTRL_SSBD ) && + !guest_cpuid_has (vcpu,X86_FEATURE_AMD_SSBD )) + bits &= ~SPEC_CTRL_SSBD ; +if (!boot_cpu_has (X86_FEATURE_SPEC_CTRL_SSBD ) && + !boot_cpu_has (X86_FEATURE_AMD_SSBD )) + bits &= ~SPEC_CTRL_SSBD ; + +return bits; +} +EXPORT_SYMBOL_GPL (kvm_spec_ctrl_valid_bits);EXPORT_TRACEPOINT_SYMBOL_GPL (kvm_exit);EXPORT_TRACEPOINT_SYMBOL_GPL (kvm_fast_mmio);
arch/x86/kvm/x86.h +1 -0
@@ -368,5 +368,6 @@ static inline bool kvm_pat_valid(u64 data)void kvm_load_guest_xcr0 (struct kvm_vcpu *vcpu);void kvm_put_guest_xcr0 (struct kvm_vcpu *vcpu); +u64 kvm_spec_ctrl_valid_bits (struct kvm_vcpu *vcpu);#endif
block/blk-pm.c +9 -6
@@ -67,6 +67,10 @@ int blk_pre_runtime_suspend(struct request_queue *q)WARN_ON_ONCE (q->rpm_status !=RPM_ACTIVE ); +spin_lock_irq (&q->queue_lock); + q->rpm_status =RPM_SUSPENDING ; +spin_unlock_irq (&q->queue_lock); +/* * Increase the pm_only counter before checking whether any * non-PM blk_queue_enter() calls are in progress to avoid that any
@@ -89,15 +93,14 @@ int blk_pre_runtime_suspend(struct request_queue *q)/* Switch q_usage_counter back to per-cpu mode. */ blk_mq_unfreeze_queue (q); -spin_lock_irq (&q->queue_lock); -if (ret <0 ) +if (ret <0 ) { +spin_lock_irq (&q->queue_lock); + q->rpm_status =RPM_ACTIVE ;pm_runtime_mark_last_busy (q->dev); -else - q->rpm_status =RPM_SUSPENDING ; -spin_unlock_irq (&q->queue_lock); +spin_unlock_irq (&q->queue_lock); -if (ret)blk_clear_pm_only (q); + }return ret; }
drivers/block/null_blk_zoned.c +12 -7
@@ -2,8 +2,7 @@#include <linux/vmalloc.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 +11,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 +24,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)
@@ -55,7 +57,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
@@ -250,8 +250,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/i3c/master.c +4 -1
@@ -2492,7 +2492,7 @@ int i3c_master_register(struct i3c_master_controller *master, ret =i3c_master_bus_init (master);if (ret) - goto err_put_dev; + goto err_destroy_wq; ret =device_add (&master->dev);if (ret)
@@ -2523,6 +2523,9 @@ int i3c_master_register(struct i3c_master_controller *master, err_cleanup_bus:i3c_master_bus_cleanup (master); +err_destroy_wq: +destroy_workqueue (master->wq); + err_put_dev:put_device (&master->dev);
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
@@ -1145,7 +1145,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,
@@ -1510,6 +1510,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
@@ -182,7 +182,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
@@ -743,7 +743,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-pl031.c +4 -2
@@ -379,8 +379,10 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)device_init_wakeup (&adev->dev, true); ldata->rtc =devm_rtc_allocate_device (&adev->dev); -if (IS_ERR (ldata->rtc)) -return PTR_ERR (ldata->rtc); +if (IS_ERR (ldata->rtc)) { + ret =PTR_ERR (ldata->rtc); + goto out; + } ldata->rtc->ops = ops;
drivers/rtc/rtc-sun6i.c +5 -3
@@ -276,7 +276,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);
@@ -292,7 +292,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,
@@ -303,7 +303,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 ;
@@ -316,6 +316,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/scsi/cxgbi/cxgb4i/Kconfig +1 -0
@@ -4,6 +4,7 @@ config SCSI_CXGB4_ISCSI depends on PCI && INET && (IPV6 || IPV6=n) depends on THERMAL || !THERMAL depends on ETHERNET + depends on TLS || TLS=n select NET_VENDOR_CHELSIO select CHELSIO_T4 select CHELSIO_LIB
drivers/thermal/cpu_cooling.c +6 -3
@@ -320,6 +320,7 @@ static int cpufreq_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state) {struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata; +int ret;/* Request state should be less than max_level */ if (WARN_ON (state > cpufreq_cdev->max_level))
@@ -329,10 +330,12 @@ static int cpufreq_set_cur_state(struct thermal_cooling_device *cdev,if (cpufreq_cdev->cpufreq_state == state)return 0 ; - cpufreq_cdev->cpufreq_state = state; + ret =freq_qos_update_request (&cpufreq_cdev->qos_req, + cpufreq_cdev->freq_table[state].frequency); +if (ret >0 ) + cpufreq_cdev->cpufreq_state = state; -return freq_qos_update_request (&cpufreq_cdev->qos_req, - cpufreq_cdev->freq_table[state].frequency); +return ret; }/**
drivers/vfio/pci/vfio_pci.c +1 -2
@@ -114,8 +114,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;
@@ -1606,6 +1604,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);
fs/bfs/inode.c +1 -1
@@ -351,7 +351,7 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent) info->si_lasti = (le32_to_cpu (bfs_sb->s_start) -BFS_BSIZE ) /sizeof (struct bfs_inode ) +BFS_ROOT_INO -1 ;if (info->si_lasti ==BFS_MAX_LASTI ) -printf ("WARNING: filesystem %s was created with 512 inodes, the real maximum is 511, mounting anyway\n" , s->s_id); +printf ("NOTE: filesystem %s was created with 512 inodes, the real maximum is 511, mounting anyway\n" , s->s_id);else if (info->si_lasti >BFS_MAX_LASTI ) {printf ("Impossible last inode number %lu > %d on %s\n" , info->si_lasti,BFS_MAX_LASTI , s->s_id); goto out1;
fs/btrfs/ioctl.c +39 -0
@@ -1256,6 +1256,7 @@ static int cluster_pages_for_defrag(struct inode *inode,u64 page_end;u64 page_cnt;u64 start = (u64 )start_index <<PAGE_SHIFT ; +u64 search_start;int ret;int i;int i_done;
@@ -1352,6 +1353,40 @@ static int cluster_pages_for_defrag(struct inode *inode,lock_extent_bits (&BTRFS_I (inode)->io_tree, page_start, page_end -1 , &cached_state); + +/* +* When defragmenting we skip ranges that have holes or inline extents, +* (check should_defrag_range()), to avoid unnecessary IO and wasting +* space. At btrfs_defrag_file(), we check if a range should be defragged +* before locking the inode and then, if it should, we trigger a sync +* page cache readahead - we lock the inode only after that to avoid +* blocking for too long other tasks that possibly want to operate on +* other file ranges. But before we were able to get the inode lock, +* some other task may have punched a hole in the range, or we may have +* now an inline extent, in which case we should not defrag. So check +* for that here, where we have the inode and the range locked, and bail +* out if that happened. +*/ + search_start = page_start; +while (search_start < page_end) { +struct extent_map *em; + + em =btrfs_get_extent (BTRFS_I (inode),NULL ,0 , search_start, + page_end - search_start,0 ); +if (IS_ERR (em)) { + ret =PTR_ERR (em); + goto out_unlock_range; + } +if (em->block_start >=EXTENT_MAP_LAST_BYTE ) { +free_extent_map (em); +/* Ok, 0 means we did not defrag anything */ + ret =0 ; + goto out_unlock_range; + } + search_start =extent_map_end (em); +free_extent_map (em); + } +clear_extent_bit (&BTRFS_I (inode)->io_tree, page_start, page_end -1 ,EXTENT_DELALLOC |EXTENT_DO_ACCOUNTING |EXTENT_DEFRAG ,0 ,0 , &cached_state);
@@ -1382,6 +1417,10 @@ static int cluster_pages_for_defrag(struct inode *inode,btrfs_delalloc_release_extents (BTRFS_I (inode), page_cnt <<PAGE_SHIFT );extent_changeset_free (data_reserved);return i_done; + +out_unlock_range: +unlock_extent_cached (&BTRFS_I (inode)->io_tree, + page_start, page_end -1 , &cached_state); out:for (i =0 ; i < i_done; i++) {unlock_page (pages[i]);
fs/crypto/fscrypt_private.h +4 -1
@@ -23,6 +23,9 @@#define FSCRYPT_CONTEXT_V1 1#define FSCRYPT_CONTEXT_V2 2 +/* Keep this in sync with include/uapi/linux/fscrypt.h */ +#define FSCRYPT_MODE_MAX FSCRYPT_MODE_ADIANTUM +struct fscrypt_context_v1 {u8 version;/* FSCRYPT_CONTEXT_V1 */ u8 contents_encryption_mode;
@@ -387,7 +390,7 @@ struct fscrypt_master_key {spinlock_t mk_decrypted_inodes_lock;/* Per-mode tfms for DIRECT_KEY policies, allocated on-demand */ -struct crypto_skcipher *mk_mode_keys[__FSCRYPT_MODE_MAX +1 ]; +struct crypto_skcipher *mk_mode_keys[FSCRYPT_MODE_MAX +1 ]; } __randomize_layout;
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/crypto/keysetup.c +2 -0
@@ -55,6 +55,8 @@ static struct fscrypt_mode * select_encryption_mode(const union fscrypt_policy *policy, const struct inode *inode) { + BUILD_BUG_ON(ARRAY_SIZE(available_modes) != FSCRYPT_MODE_MAX + 1); +if (S_ISREG (inode->i_mode))return &available_modes[fscrypt_policy_contents_mode (policy)];
fs/crypto/policy.c +4 -2
@@ -55,7 +55,8 @@ bool fscrypt_supported_policy(const union fscrypt_policy *policy_u,return false; } -if (policy->flags & ~FSCRYPT_POLICY_FLAGS_VALID ) { +if (policy->flags & ~(FSCRYPT_POLICY_FLAGS_PAD_MASK | +FSCRYPT_POLICY_FLAG_DIRECT_KEY )) {fscrypt_warn (inode,"Unsupported encryption flags (0x%02x)" , policy->flags);
@@ -76,7 +77,8 @@ bool fscrypt_supported_policy(const union fscrypt_policy *policy_u,return false; } -if (policy->flags & ~FSCRYPT_POLICY_FLAGS_VALID ) { +if (policy->flags & ~(FSCRYPT_POLICY_FLAGS_PAD_MASK | +FSCRYPT_POLICY_FLAG_DIRECT_KEY )) {fscrypt_warn (inode,"Unsupported encryption flags (0x%02x)" , policy->flags);
fs/ext4/namei.c +3 -0
@@ -2192,6 +2192,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 ; +#ifdef CONFIG_UNICODE if (ext4_has_strict_mode (sbi) &&IS_CASEFOLDED (dir) && sbi->s_encoding &&utf8_validate (sbi->s_encoding, &dentry->d_name))
fs/ext4/super.c +6 -8
@@ -455,19 +455,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/checkpoint.c +1 -1
@@ -1596,7 +1596,7 @@ int f2fs_write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) goto out; } -if (NM_I (sbi)->dirty_nat_cnt ==0 && +if (NM_I (sbi)->nat_cnt[DIRTY_NAT ] ==0 &&SIT_I (sbi)->dirty_sentries ==0 &&prefree_segments (sbi) ==0 ) {f2fs_flush_sit_entries (sbi, cpc);
fs/f2fs/debug.c +6 -5
@@ -107,8 +107,8 @@ static void update_general_status(struct f2fs_sb_info *sbi) si->node_pages =NODE_MAPPING (sbi)->nrpages;if (sbi->meta_inode) si->meta_pages =META_MAPPING (sbi)->nrpages; - si->nats =NM_I (sbi)->nat_cnt; - si->dirty_nats =NM_I (sbi)->dirty_nat_cnt; + si->nats =NM_I (sbi)->nat_cnt[TOTAL_NAT ]; + si->dirty_nats =NM_I (sbi)->nat_cnt[DIRTY_NAT ]; si->sits =MAIN_SEGS (sbi); si->dirty_sits =SIT_I (sbi)->dirty_sentries; si->free_nids =NM_I (sbi)->nid_cnt[FREE_NID ];
@@ -254,9 +254,10 @@ static void update_mem_info(struct f2fs_sb_info *sbi) si->cache_mem += (NM_I (sbi)->nid_cnt[FREE_NID ] +NM_I (sbi)->nid_cnt[PREALLOC_NID ]) *sizeof (struct free_nid ); - si->cache_mem +=NM_I (sbi)->nat_cnt *sizeof (struct nat_entry ); - si->cache_mem +=NM_I (sbi)->dirty_nat_cnt * -sizeof (struct nat_entry_set ); + si->cache_mem +=NM_I (sbi)->nat_cnt[TOTAL_NAT ] * +sizeof (struct nat_entry ); + si->cache_mem +=NM_I (sbi)->nat_cnt[DIRTY_NAT ] * +sizeof (struct nat_entry_set ); si->cache_mem += si->inmem_pages *sizeof (struct inmem_pages );for (i =0 ; i <MAX_INO_ENTRY ; i++) si->cache_mem += sbi->im[i].ino_num *sizeof (struct ino_entry );
fs/f2fs/f2fs.h +10 -2
@@ -797,6 +797,13 @@ enum nid_state { MAX_NID_STATE, }; +enum nat_state { +TOTAL_NAT , +DIRTY_NAT , +RECLAIMABLE_NAT , +MAX_NAT_STATE , +}; +struct f2fs_nm_info {block_t nat_blkaddr;/* base disk address of NAT */ nid_t max_nid;/* maximum possible node ids */
@@ -812,8 +819,7 @@ struct f2fs_nm_info {struct rw_semaphore nat_tree_lock;/* protect nat_tree_lock */ struct list_head nat_entries;/* cached nat entry list (clean) */ spinlock_t nat_list_lock;/* protect clean nat entry list */ -unsigned int nat_cnt;/* the # of cached nat entries */ -unsigned int dirty_nat_cnt;/* total num of nat entries in set */ +unsigned int nat_cnt[MAX_NAT_STATE ];/* the # of cached nat entries */ unsigned int nat_blocks;/* # of nat blocks */ /* free node ids management */
@@ -2998,6 +3004,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/f2fs/node.c +18 -11
@@ -62,8 +62,8 @@ bool f2fs_available_free_memory(struct f2fs_sb_info *sbi, int type) sizeof(struct free_nid)) >> PAGE_SHIFT; res = mem_size < ((avail_ram * nm_i->ram_thresh /100 ) >>2 ); }else if (type ==NAT_ENTRIES ) { - mem_size = (nm_i->nat_cnt *sizeof (struct nat_entry )) >> -PAGE_SHIFT ; + mem_size = (nm_i->nat_cnt[TOTAL_NAT ] * +sizeof (struct nat_entry )) >>PAGE_SHIFT ; res = mem_size < ((avail_ram * nm_i->ram_thresh /100 ) >>2 );if (excess_cached_nats (sbi)) res = false;
@@ -177,7 +177,8 @@ static struct nat_entry *__init_nat_entry(struct f2fs_nm_info *nm_i,list_add_tail (&ne->list, &nm_i->nat_entries);spin_unlock (&nm_i->nat_list_lock); - nm_i->nat_cnt++; + nm_i->nat_cnt[TOTAL_NAT ]++; + nm_i->nat_cnt[RECLAIMABLE_NAT ]++;return ne; }
@@ -207,7 +208,8 @@ static unsigned int __gang_lookup_nat_cache(struct f2fs_nm_info *nm_i,static void __del_from_nat_cache (struct f2fs_nm_info *nm_i,struct nat_entry *e) {radix_tree_delete (&nm_i->nat_root,nat_get_nid (e)); - nm_i->nat_cnt--; + nm_i->nat_cnt[TOTAL_NAT ]--; + nm_i->nat_cnt[RECLAIMABLE_NAT ]--;__free_nat_entry (e); }
@@ -253,7 +255,8 @@ static void __set_nat_cache_dirty(struct f2fs_nm_info *nm_i,if (get_nat_flag (ne,IS_DIRTY )) goto refresh_list; - nm_i->dirty_nat_cnt++; + nm_i->nat_cnt[DIRTY_NAT ]++; + nm_i->nat_cnt[RECLAIMABLE_NAT ]--;set_nat_flag (ne,IS_DIRTY , true); refresh_list:spin_lock (&nm_i->nat_list_lock);
@@ -273,7 +276,8 @@ static void __clear_nat_cache_dirty(struct f2fs_nm_info *nm_i,set_nat_flag (ne,IS_DIRTY , false); set->entry_cnt--; - nm_i->dirty_nat_cnt--; + nm_i->nat_cnt[DIRTY_NAT ]--; + nm_i->nat_cnt[RECLAIMABLE_NAT ]++; } static unsigned int __gang_lookup_nat_set(struct f2fs_nm_info *nm_i,
@@ -2881,14 +2885,17 @@ int f2fs_flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc)LIST_HEAD (sets);int err =0 ; -/* during unmount, let's flush nat_bits before checking dirty_nat_cnt */ +/* +* during unmount, let's flush nat_bits before checking +* nat_cnt[DIRTY_NAT]. +*/ if (enabled_nat_bits (sbi, cpc)) {down_write (&nm_i->nat_tree_lock);remove_nats_in_journal (sbi);up_write (&nm_i->nat_tree_lock); } -if (!nm_i->dirty_nat_cnt) +if (!nm_i->nat_cnt[DIRTY_NAT ])return 0 ;down_write (&nm_i->nat_tree_lock);
@@ -2899,7 +2906,8 @@ int f2fs_flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc)* into nat entry set. */ if (enabled_nat_bits (sbi, cpc) || - !__has_cursum_space (journal, nm_i->dirty_nat_cnt,NAT_JOURNAL )) + !__has_cursum_space (journal, + nm_i->nat_cnt[DIRTY_NAT ],NAT_JOURNAL ))remove_nats_in_journal (sbi); while ((found = __gang_lookup_nat_set(nm_i,
@@ -3023,7 +3031,6 @@ static int init_node_manager(struct f2fs_sb_info *sbi)F2FS_RESERVED_NODE_NUM ; nm_i->nid_cnt[FREE_NID ] =0 ; nm_i->nid_cnt[PREALLOC_NID ] =0 ; - nm_i->nat_cnt =0 ; nm_i->ram_thresh =DEF_RAM_THRESHOLD ; nm_i->ra_nid_pages =DEF_RA_NID_PAGES ; nm_i->dirty_nats_ratio =DEF_DIRTY_NAT_RATIO_THRESHOLD ;
@@ -3160,7 +3167,7 @@ void f2fs_destroy_node_manager(struct f2fs_sb_info *sbi)__del_from_nat_cache (nm_i, natvec[idx]); } } -f2fs_bug_on (sbi, nm_i->nat_cnt); +f2fs_bug_on (sbi, nm_i->nat_cnt[TOTAL_NAT ]);/* destroy nat set cache */ nid =0 ;
fs/f2fs/node.h +2 -2
@@ -123,13 +123,13 @@ static inline void raw_nat_from_node_info(struct f2fs_nat_entry *raw_ne,static inline bool excess_dirty_nats (struct f2fs_sb_info *sbi) { -return NM_I (sbi)->dirty_nat_cnt >=NM_I (sbi)->max_nid * +return NM_I (sbi)->nat_cnt[DIRTY_NAT ] >=NM_I (sbi)->max_nid *NM_I (sbi)->dirty_nats_ratio /100 ; }static inline bool excess_cached_nats (struct f2fs_sb_info *sbi) { -return NM_I (sbi)->nat_cnt >=DEF_NAT_CACHE_THRESHOLD ; +return NM_I (sbi)->nat_cnt[TOTAL_NAT ] >=DEF_NAT_CACHE_THRESHOLD ; }static inline bool excess_dirty_nodes (struct f2fs_sb_info *sbi)
fs/f2fs/shrinker.c +1 -3
@@ -18,9 +18,7 @@ static unsigned int shrinker_run_no;static unsigned long __count_nat_entries (struct f2fs_sb_info *sbi) { -long count =NM_I (sbi)->nat_cnt -NM_I (sbi)->dirty_nat_cnt; - -return count >0 ? count :0 ; +return NM_I (sbi)->nat_cnt[RECLAIMABLE_NAT ]; }static unsigned long __count_free_nids (struct f2fs_sb_info *sbi)
fs/f2fs/super.c +4 -5
@@ -2523,7 +2523,6 @@ static int sanity_check_raw_super(struct f2fs_sb_info *sbi,block_t total_sections, blocks_per_seg;struct f2fs_super_block *raw_super = (struct f2fs_super_block *) (bh->b_data +F2FS_SUPER_OFFSET ); -unsigned int blocksize;size_t crc_offset =0 ;__u32 crc =0 ;
@@ -2557,10 +2556,10 @@ static int sanity_check_raw_super(struct f2fs_sb_info *sbi, }/* Currently, support only 4KB block size */ - blocksize =1 <<le32_to_cpu (raw_super->log_blocksize); -if (blocksize !=F2FS_BLKSIZE ) { -f2fs_info (sbi,"Invalid blocksize (%u), supports only 4KB" , - blocksize); +if (le32_to_cpu (raw_super->log_blocksize) !=F2FS_BLKSIZE_BITS ) { +f2fs_info (sbi,"Invalid log_blocksize (%u), supports only %u" , +le32_to_cpu (raw_super->log_blocksize), +F2FS_BLKSIZE_BITS );return -EFSCORRUPTED ; }
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/jffs2/jffs2_fs_sb.h +1 -0
@@ -38,6 +38,7 @@ struct jffs2_mount_opts {* users. This is implemented simply by means of not allowing the * latter users to write to the file system if the amount if the * available space is less then 'rp_size'. */ +bool set_rp_size;unsigned int rp_size; };
fs/jffs2/super.c +10 -7
@@ -88,7 +88,7 @@ static int jffs2_show_options(struct seq_file *s, struct dentry *root)if (opts->override_compr)seq_printf (s,",compr=%s" ,jffs2_compr_name (opts->compr)); -if (opts->rp_size) +if (opts->set_rp_size)seq_printf (s,",rp_size=%u" , opts->rp_size /1024 );return 0 ;
@@ -208,11 +208,8 @@ static int jffs2_parse_param(struct fs_context *fc, struct fs_parameter *param)case Opt_rp_size:if (result.uint_32 >UINT_MAX /1024 )return invalf (fc,"jffs2: rp_size unrepresentable" ); - opt = result.uint_32 *1024 ; -if (opt > c->mtd->size) -return invalf (fc,"jffs2: Too large reserve pool specified, max is %llu KB" , - c->mtd->size /1024 ); - c->mount_opts.rp_size = opt; + c->mount_opts.rp_size = result.uint_32 *1024 ; + c->mount_opts.set_rp_size = true;break ;default :return -EINVAL ;
@@ -231,8 +228,10 @@ static inline void jffs2_update_mount_opts(struct fs_context *fc) c->mount_opts.override_compr = new_c->mount_opts.override_compr; c->mount_opts.compr = new_c->mount_opts.compr; } -if (new_c->mount_opts.rp_size) +if (new_c->mount_opts.set_rp_size) { + c->mount_opts.set_rp_size = new_c->mount_opts.set_rp_size; c->mount_opts.rp_size = new_c->mount_opts.rp_size; + }mutex_unlock (&c->alloc_sem); }
@@ -272,6 +271,10 @@ static int jffs2_fill_super(struct super_block *sb, struct fs_context *fc) c->mtd = sb->s_mtd; c->os_priv = sb; +if (c->mount_opts.rp_size > c->mtd->size) +return invalf (fc,"jffs2: Too large reserve pool specified, max is %llu KB" , + c->mtd->size /1024 ); +/* Initialize JFFS2 superblock locks, the further initialization will * be done later */ mutex_init (&c->alloc_sem);
fs/namespace.c +6 -3
@@ -156,10 +156,10 @@ static inline void mnt_add_count(struct mount *mnt, int n)/* * vfsmount lock must be held for write */ -unsigned int mnt_get_count (struct mount *mnt) +int mnt_get_count (struct mount *mnt) {#ifdef CONFIG_SMP -unsigned int count =0 ; +int count =0 ;int cpu;for_each_possible_cpu (cpu) {
@@ -1123,6 +1123,7 @@ static DECLARE_DELAYED_WORK(delayed_mntput_work, delayed_mntput);static void mntput_no_expire (struct mount *mnt) {LIST_HEAD (list); +int count;rcu_read_lock ();if (likely (READ_ONCE (mnt->mnt_ns))) {
@@ -1146,7 +1147,9 @@ static void mntput_no_expire(struct mount *mnt)*/ smp_mb ();mnt_add_count (mnt,-1 ); -if (mnt_get_count (mnt)) { + count =mnt_get_count (mnt); +if (count !=0 ) { +WARN_ON (count <0 );rcu_read_unlock ();unlock_mount_hash ();return ;
fs/nfs/nfs4super.c +1 -1
@@ -96,7 +96,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); } }
@@ -723,8 +728,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);
@@ -742,9 +746,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
@@ -255,6 +255,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,
@@ -651,6 +652,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/pnode.h +1 -1
@@ -44,7 +44,7 @@ int propagate_mount_busy(struct mount *, int);void propagate_mount_unlock (struct mount *);void mnt_release_group_id (struct mount *);int get_dominating_id (struct mount *mnt,const struct path *root); -unsigned int mnt_get_count (struct mount *mnt); +int mnt_get_count (struct mount *mnt);void mnt_set_mountpoint (struct mount *,struct mountpoint *,struct mount *); void mnt_change_mountpoint(struct mount *parent, struct mountpoint *mp,
fs/quota/quota_tree.c +4 -4
@@ -62,7 +62,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)
@@ -71,7 +71,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 )
@@ -284,7 +284,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);
@@ -559,7 +559,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
@@ -278,6 +278,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) {
@@ -301,7 +310,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;
@@ -961,7 +970,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;
@@ -1046,7 +1055,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;
@@ -1130,7 +1139,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.h +34 -0
@@ -100,6 +100,35 @@ static inline void fscrypt_handle_d_move(struct dentry *dentry) dentry->d_flags &= ~DCACHE_ENCRYPTED_NAME ; } +/** +* 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 (gfp_t );
@@ -290,6 +319,11 @@ static inline void fscrypt_handle_d_move(struct dentry *dentry) { } +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/of.h +1 -0
@@ -1282,6 +1282,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/fscrypt.h +2 -3
@@ -17,7 +17,6 @@#define FSCRYPT_POLICY_FLAGS_PAD_32 0x03#define FSCRYPT_POLICY_FLAGS_PAD_MASK 0x03#define FSCRYPT_POLICY_FLAG_DIRECT_KEY 0x04 -#define FSCRYPT_POLICY_FLAGS_VALID 0x07/* Encryption algorithms */ #define FSCRYPT_MODE_AES_256_XTS 1
@@ -25,7 +24,7 @@#define FSCRYPT_MODE_AES_128_CBC 5#define FSCRYPT_MODE_AES_128_CTS 6#define FSCRYPT_MODE_ADIANTUM 9 -#define __FSCRYPT_MODE_MAX 9 +/* If adding a mode number > 9, update FSCRYPT_MODE_MAX in fscrypt_private.h */ /* * Legacy policy version; ad-hoc KDF and no key verification.
@@ -162,7 +161,7 @@ struct fscrypt_get_key_status_arg {#define FS_POLICY_FLAGS_PAD_32 FSCRYPT_POLICY_FLAGS_PAD_32#define FS_POLICY_FLAGS_PAD_MASK FSCRYPT_POLICY_FLAGS_PAD_MASK#define FS_POLICY_FLAG_DIRECT_KEY FSCRYPT_POLICY_FLAG_DIRECT_KEY -#define FS_POLICY_FLAGS_VALID FSCRYPT_POLICY_FLAGS_VALID +#define FS_POLICY_FLAGS_VALID 0x07/* contains old flags only */ #define FS_ENCRYPTION_MODE_INVALID 0/* never used */ #define FS_ENCRYPTION_MODE_AES_256_XTS FSCRYPT_MODE_AES_256_XTS#define FS_ENCRYPTION_MODE_AES_256_GCM 2/* never used */
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/cgroup/cgroup-v1.c +2 -0
@@ -914,6 +914,8 @@ int cgroup1_parse_param(struct fs_context *fc, struct fs_parameter *param) opt =fs_parse (fc, &cgroup1_fs_parameters, param, &result);if (opt == -ENOPARAM ) {if (strcmp (param->key,"source" ) ==0 ) { +if (fc->source) +return invalf (fc,"Multiple sources not supported" ); fc->source = param->string; param->string =NULL ;return 0 ;
kernel/module.c +4 -2
@@ -1863,7 +1863,6 @@ static int mod_sysfs_init(struct module *mod)if (err)mod_kobject_put (mod); -/* delay uevent until full sysfs population */ out:return err; }
@@ -1900,7 +1899,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:
@@ -3608,6 +3606,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
@@ -3953,6 +3954,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);
kernel/time/tick-sched.c +0 -7
@@ -916,13 +916,6 @@ static bool can_stop_idle_tick(int cpu, struct tick_sched *ts)*/ if (tick_do_timer_cpu == cpu)return false; -/* -* Boot safety: make sure the timekeeping duty has been -* assigned before entering dyntick-idle mode, -* tick_do_timer_cpu is TICK_DO_TIMER_BOOT -*/ -if (unlikely (tick_do_timer_cpu ==TICK_DO_TIMER_BOOT )) -return false;/* Should not happen for nohz-full */ if (WARN_ON_ONCE (tick_do_timer_cpu ==TICK_DO_TIMER_NONE ))
net/sched/sch_taprio.c +16 -1
@@ -1597,6 +1597,21 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt,return err; } +static void taprio_reset (struct Qdisc *sch) +{ +struct taprio_sched *q =qdisc_priv (sch); +struct net_device *dev =qdisc_dev (sch); +int i; + +hrtimer_cancel (&q->advance_timer); +if (q->qdiscs) { +for (i =0 ; i < dev->num_tx_queues && q->qdiscs[i]; i++) +qdisc_reset (q->qdiscs[i]); + } + sch->qstats.backlog =0 ; + sch->q.qlen =0 ; +} +static void taprio_destroy (struct Qdisc *sch) {struct taprio_sched *q =qdisc_priv (sch);
@@ -1607,7 +1622,6 @@ static void taprio_destroy(struct Qdisc *sch)list_del (&q->taprio_list);spin_unlock (&taprio_list_lock); -hrtimer_cancel (&q->advance_timer);taprio_disable_offload (dev, q,NULL );
@@ -1954,6 +1968,7 @@ static struct Qdisc_ops taprio_qdisc_ops __read_mostly = { .init = taprio_init, .change = taprio_change, .destroy = taprio_destroy, + .reset = taprio_reset, .peek = taprio_peek, .dequeue = taprio_dequeue, .enqueue = taprio_enqueue,
sound/core/pcm_native.c +7 -2
@@ -717,8 +717,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
@@ -26,10 +26,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 */
tools/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 */