Linux 4.19.292
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.19.292 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/alpha/kernel/setup.c | 3 arch/sparc/Kconfig | 2 arch/x86/entry/vdso/vma.c | 4 arch/x86/include/asm/processor.h | 2 arch/x86/kernel/cpu/amd.c | 1 arch/x86/kvm/x86.c | 2 drivers/android/binder.c | 1 drivers/android/binder_alloc.c | 6 drivers/android/binder_alloc.h | 1 drivers/dma/pl330.c | 18 + drivers/gpu/drm/nouveau/nouveau_connector.c | 2 drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h | 1 drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk104.c | 4 drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110.c | 10 drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110b.c | 1 drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk208.c | 1 drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm107.c | 1 drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c | 2 drivers/infiniband/hw/hfi1/chip.c | 1 drivers/isdn/mISDN/dsp.h | 2 drivers/isdn/mISDN/dsp_cmx.c | 2 drivers/isdn/mISDN/dsp_core.c | 2 drivers/mmc/host/moxart-mmc.c | 8 drivers/net/bonding/bond_main.c | 4 drivers/net/ethernet/ibm/ibmvnic.c | 15 - drivers/net/tun.c | 2 drivers/scsi/53c700.c | 2 drivers/scsi/raid_class.c | 1 drivers/scsi/scsi_proc.c | 30 +- drivers/scsi/snic/snic_disc.c | 1 drivers/scsi/storvsc_drv.c | 4 drivers/usb/dwc3/gadget.c | 9 drivers/usb/storage/alauda.c | 9 fs/btrfs/extent_io.c | 7 fs/nilfs2/inode.c | 8 fs/nilfs2/segment.c | 2 fs/nilfs2/the_nilfs.h | 2 include/net/cfg80211.h | 3 include/net/netfilter/nf_tables.h | 35 ++ net/dccp/output.c | 2 net/dccp/proto.c | 10 net/ipv6/ndisc.c | 3 net/netfilter/nf_tables_api.c | 180 +++++++++----- net/netfilter/nft_flow_offload.c | 23 + net/netfilter/nft_objref.c | 8 net/packet/af_packet.c | 16 - net/sched/sch_netem.c | 59 +--- tools/testing/radix-tree/regression1.c | 2 49 files changed, 348 insertions(+), 168 deletions(-)
Alan Stern (1):
usb-storage: alauda: Fix uninit-value in alauda_check_media()
Alexandra Diupina (1):
scsi: 53c700: Check that command slot is not NULL
Andrew Kanner (1):
drivers: net: prevent tun_build_skb() to exceed the packet size limit
Arnd Bergmann (1):
x86: Move gds_ucode_mitigated() declaration to header
Christoph Hellwig (1):
btrfs: don't stop integrity writeback too early
Colin Ian King (1):
radix tree test suite: fix incorrect allocation size for pthreads
Cristian Ciocaltea (1):
x86/cpu/amd: Enable Zenbleed fix for AMD Custom APU 0405
Douglas Miller (1):
IB/hfi1: Fix possible panic during hotplug remove
Elson Roy Serrao (1):
usb: dwc3: Properly handle processing of pending events
Eric Dumazet (3):
net/packet: annotate data-races around tp->status
dccp: fix data-race around dp->dccps_mss_cache
sch_netem: fix issues in netem_change() vs get_dist_table()Felix Fietkau (1):
wifi: cfg80211: fix sband iftype data lookup for AP_VLAN
Greg Kroah-Hartman (2):
sparc: fix up arch_cpu_finalize_init() build breakage. Linux 4.19.292
Ilpo Järvinen (1):
dmaengine: pl330: Return DMA_PAUSED when transaction is paused
Karol Herbst (2):
drm/nouveau/gr: enable memory loads on helper invocation on all channels drm/nouveau/disp: Revert a NULL check inside nouveau_connector_get_modes
Kirill A. Shutemov (1):
x86/mm: Fix VDSO and VVAR placement on 5-level paging machines
Maciej Żenczykowski (1):
ipv6: adjust ndisc_is_useropt() to also return true for PIO
Masahiro Yamada (1):
alpha: remove __init annotation from exported page_is_ram()
Michael Kelley (1):
scsi: storvsc: Fix handling of virtual Fibre Channel timeouts
Nathan Chancellor (1):
mISDN: Update parameter type of dsp_cmx_send()
Nick Child (1):
ibmvnic: Handle DMA unmapping of login buffs in release functions
Pablo Neira Ayuso (2):
netfilter: nf_tables: bogus EBUSY when deleting flowtable after flush
netfilter: nf_tables: report use refcount overflow
Qi Zheng (1):
binder: fix memory leak in binder_init()
Ryusuke Konishi (1):
nilfs2: fix use-after-free of nilfs_root in dirtying inodes via iput
Sergei Antonov (1):
mmc: moxart: read scr register without changing byte order
Tony Battersby (1):
scsi: core: Fix legacy /proc parsing buffer overflow
Yiyuan Guo (1):
iio: cros_ec: Fix the allocation size for cros_ec_command
Zhu Wang (2):
scsi: snic: Fix possible memory leak if device_add() fails
scsi: core: Fix possible memory leak if device_add() fails
Ziyang Xuan (1):
bonding: Fix incorrect deletion of ETH_P_8021AD protocol vid from slaves
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 19 -SUBLEVEL = 291 +SUBLEVEL = 292 EXTRAVERSION = NAME = "People's Front"
arch/alpha/kernel/setup.c +1 -2
@@ -469,8 +469,7 @@ setup_memory(void *kernel_end)extern void setup_memory (void *);#endif /* !CONFIG_DISCONTIGMEM */ -int __init -page_is_ram (unsigned long pfn) +int page_is_ram (unsigned long pfn) {struct memclust_struct * cluster;struct memdesc_struct * memdesc;
arch/sparc/Kconfig +1 -1
@@ -12,7 +12,6 @@ config 64BIT config SPARC bool default y - select ARCH_HAS_CPU_FINALIZE_INIT if !SMP select ARCH_MIGHT_HAVE_PC_PARPORT if SPARC64 && PCI select ARCH_MIGHT_HAVE_PC_SERIO select OF
@@ -51,6 +50,7 @@ config SPARC config SPARC32 def_bool !64BIT + select ARCH_HAS_CPU_FINALIZE_INIT if !SMP select ARCH_HAS_SYNC_DMA_FOR_CPU select DMA_NONCOHERENT_OPS select GENERIC_ATOMIC64
arch/x86/entry/vdso/vma.c +2 -2
@@ -228,8 +228,8 @@ static unsigned long vdso_addr(unsigned long start, unsigned len)/* Round the lowest possible end address up to a PMD boundary. */ end = (start + len +PMD_SIZE -1 ) &PMD_MASK ; -if (end >=TASK_SIZE_MAX ) - end =TASK_SIZE_MAX ; +if (end >=DEFAULT_MAP_WINDOW ) + end =DEFAULT_MAP_WINDOW ; end -= len;if (end > start) {
arch/x86/include/asm/processor.h +2 -0
@@ -1001,4 +1001,6 @@ enum taa_mitigations { TAA_MITIGATION_TSX_DISABLED, }; +extern bool gds_ucode_mitigated (void ); +#endif /* _ASM_X86_PROCESSOR_H */
arch/x86/kernel/cpu/amd.c +1 -0
@@ -69,6 +69,7 @@ static const int amd_erratum_1054[] =static const int amd_zenbleed[] =AMD_LEGACY_ERRATUM (AMD_MODEL_RANGE (0x17 ,0x30 ,0x0 ,0x4f ,0xf ),AMD_MODEL_RANGE (0x17 ,0x60 ,0x0 ,0x7f ,0xf ), +AMD_MODEL_RANGE (0x17 ,0x90 ,0x0 ,0x91 ,0xf ),AMD_MODEL_RANGE (0x17 ,0xa0 ,0x0 ,0xaf ,0xf ));static bool cpu_has_amd_erratum (struct cpuinfo_x86 *cpu,const int *erratum)
arch/x86/kvm/x86.c +0 -2
@@ -217,8 +217,6 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {u64 __read_mostly host_xcr0; -extern bool gds_ucode_mitigated (void ); -static int emulator_fix_hypercall (struct x86_emulate_ctxt *ctxt);static inline void kvm_async_pf_hash_reset (struct kvm_vcpu *vcpu)
drivers/android/binder.c +1 -0
@@ -5742,6 +5742,7 @@ static int __init binder_init(void) err_alloc_device_names_failed:debugfs_remove_recursive (binder_debugfs_dir_entry_root); +binder_alloc_shrinker_exit ();return ret; }
drivers/android/binder_alloc.c +6 -0
@@ -1033,6 +1033,12 @@ static struct shrinker binder_shrinker = { .seeks = DEFAULT_SEEKS, }; +void binder_alloc_shrinker_exit (void ) +{ +unregister_shrinker (&binder_shrinker); +list_lru_destroy (&binder_alloc_lru); +} +/** * binder_alloc_init() - called by binder_open() for per-proc initialization * @alloc: binder_alloc for this proc
drivers/android/binder_alloc.h +1 -0
@@ -130,6 +130,7 @@ extern struct binder_buffer *binder_alloc_new_buf(struct binder_alloc *alloc, int is_async);extern void binder_alloc_init (struct binder_alloc *alloc);extern int binder_alloc_shrinker_init (void ); +extern void binder_alloc_shrinker_exit (void );extern void binder_alloc_vma_close (struct binder_alloc *alloc);extern struct binder_buffer * binder_alloc_prepare_to_free(struct binder_alloc *alloc,
drivers/dma/pl330.c +16 -2
@@ -404,6 +404,12 @@ enum desc_status {* of a channel can be BUSY at any time. */ BUSY , +/* +* Pause was called while descriptor was BUSY. Due to hardware +* limitations, only termination is possible for descriptors +* that have been paused. +*/ + PAUSED,/* * Sitting on the channel work_list but xfer done * by PL330 core
@@ -2028,7 +2034,7 @@ static inline void fill_queue(struct dma_pl330_chan *pch)list_for_each_entry (desc, &pch->work_list, node) {/* If already submitted */ -if (desc->status ==BUSY ) +if (desc->status ==BUSY || desc->status ==PAUSED )continue ; ret =pl330_submit_req (pch->thread, desc);
@@ -2305,6 +2311,7 @@ static int pl330_pause(struct dma_chan *chan) {struct dma_pl330_chan *pch =to_pchan (chan);struct pl330_dmac *pl330 = pch->dmac; +struct dma_pl330_desc *desc;unsigned long flags;pm_runtime_get_sync (pl330->ddma.dev);
@@ -2314,6 +2321,10 @@ static int pl330_pause(struct dma_chan *chan)_stop (pch->thread);spin_unlock (&pl330->lock); +list_for_each_entry (desc, &pch->work_list, node) { +if (desc->status ==BUSY ) + desc->status =PAUSED ; + }spin_unlock_irqrestore (&pch->lock, flags);pm_runtime_mark_last_busy (pl330->ddma.dev);pm_runtime_put_autosuspend (pl330->ddma.dev);
@@ -2404,7 +2415,7 @@ pl330_tx_status(struct dma_chan *chan, dma_cookie_t cookie,else if (running && desc == running) transferred =pl330_get_current_xferred_count (pch, desc); -else if (desc->status ==BUSY ) +else if (desc->status ==BUSY || desc->status ==PAUSED )/* * Busy but not running means either just enqueued, * or finished and not yet marked done
@@ -2421,6 +2432,9 @@ pl330_tx_status(struct dma_chan *chan, dma_cookie_t cookie,case DONE : ret =DMA_COMPLETE ;break ; +case PAUSED : + ret =DMA_PAUSED ; +break ;case PREP :case BUSY : ret =DMA_IN_PROGRESS ;
drivers/gpu/drm/nouveau/nouveau_connector.c +1 -1
@@ -921,7 +921,7 @@ nouveau_connector_get_modes(struct drm_connector *connector)/* Determine display colour depth for everything except LVDS now, * DP requires this before mode_valid() is called. */ -if (connector->connector_type !=DRM_MODE_CONNECTOR_LVDS && nv_connector->native_mode) +if (connector->connector_type !=DRM_MODE_CONNECTOR_LVDS )nouveau_connector_detect_depth (connector);/* Find the native mode if this is a digital panel, if we didn't
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h +1 -0
@@ -121,6 +121,7 @@ void gk104_grctx_generate_r418800(struct gf100_gr *);extern const struct gf100_grctx_func gk110_grctx;void gk110_grctx_generate_r419eb0 (struct gf100_gr *); +void gk110_grctx_generate_r419f78 (struct gf100_gr *);extern const struct gf100_grctx_func gk110b_grctx;extern const struct gf100_grctx_func gk208_grctx;
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk104.c +3 -1
@@ -916,7 +916,9 @@ static void gk104_grctx_generate_r419f78(struct gf100_gr *gr) {struct nvkm_device *device = gr->base.engine.subdev.device; -nvkm_mask (device,0x419f78 ,0x00000001 ,0x00000000 ); + +/* bit 3 set disables loads in fp helper invocations, we need it enabled */ +nvkm_mask (device,0x419f78 ,0x00000009 ,0x00000000 ); }void
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110.c +10 -0
@@ -820,6 +820,15 @@ gk110_grctx_generate_r419eb0(struct gf100_gr *gr)nvkm_mask (device,0x419eb0 ,0x00001000 ,0x00001000 ); } +void +gk110_grctx_generate_r419f78 (struct gf100_gr *gr) +{ +struct nvkm_device *device = gr->base.engine.subdev.device; + +/* bit 3 set disables loads in fp helper invocations, we need it enabled */ +nvkm_mask (device,0x419f78 ,0x00000008 ,0x00000000 ); +} +const struct gf100_grctx_func gk110_grctx = { .main = gf100_grctx_generate_main,
@@ -852,4 +861,5 @@ gk110_grctx = { .gpc_tpc_nr = gk104_grctx_generate_gpc_tpc_nr, .r418800 = gk104_grctx_generate_r418800, .r419eb0 = gk110_grctx_generate_r419eb0, + .r419f78 = gk110_grctx_generate_r419f78, };
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110b.c +1 -0
@@ -101,4 +101,5 @@ gk110b_grctx = { .gpc_tpc_nr = gk104_grctx_generate_gpc_tpc_nr, .r418800 = gk104_grctx_generate_r418800, .r419eb0 = gk110_grctx_generate_r419eb0, + .r419f78 = gk110_grctx_generate_r419f78, };
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk208.c +1 -0
@@ -566,4 +566,5 @@ gk208_grctx = { .dist_skip_table = gf117_grctx_generate_dist_skip_table, .gpc_tpc_nr = gk104_grctx_generate_gpc_tpc_nr, .r418800 = gk104_grctx_generate_r418800, + .r419f78 = gk110_grctx_generate_r419f78, };
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm107.c +1 -0
@@ -991,4 +991,5 @@ gm107_grctx = { .r406500 = gm107_grctx_generate_r406500, .gpc_tpc_nr = gk104_grctx_generate_gpc_tpc_nr, .r419e00 = gm107_grctx_generate_r419e00, + .r419f78 = gk110_grctx_generate_r419f78, };
drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c +1 -1
@@ -46,7 +46,7 @@ int cros_ec_sensors_core_init(struct platform_device *pdev,platform_set_drvdata (pdev, indio_dev); state->ec = ec->ec_dev; - state->msg =devm_kzalloc (&pdev->dev, + state->msg =devm_kzalloc (&pdev->dev,sizeof (*state->msg) +max ((u16 )sizeof (struct ec_params_motion_sense ), state->ec->max_response),GFP_KERNEL );if (!state->msg)
drivers/infiniband/hw/hfi1/chip.c +1 -0
@@ -12178,6 +12178,7 @@ static void free_cntrs(struct hfi1_devdata *dd)if (dd->synth_stats_timer.function)del_timer_sync (&dd->synth_stats_timer); +cancel_work_sync (&dd->update_cntr_work); ppd = (struct hfi1_pportdata *)(dd +1 );for (i =0 ; i < dd->num_pports; i++, ppd++) {kfree (ppd->cntrs);
drivers/isdn/mISDN/dsp.h +1 -1
@@ -247,7 +247,7 @@ extern void dsp_cmx_hardware(struct dsp_conf *conf, struct dsp *dsp);extern int dsp_cmx_conf (struct dsp *dsp,u32 conf_id);extern void dsp_cmx_receive (struct dsp *dsp,struct sk_buff *skb);extern void dsp_cmx_hdlc (struct dsp *dsp,struct sk_buff *skb); -extern void dsp_cmx_send (void *arg); +extern void dsp_cmx_send (struct timer_list *arg);extern void dsp_cmx_transmit (struct dsp *dsp,struct sk_buff *skb);extern int dsp_cmx_del_conf_member (struct dsp *dsp);extern int dsp_cmx_del_conf (struct dsp_conf *conf);
drivers/isdn/mISDN/dsp_cmx.c +1 -1
@@ -1625,7 +1625,7 @@ static u16 dsp_count; /* last sample count */static int dsp_count_valid;/* if we have last sample count */ void -dsp_cmx_send (void *arg) +dsp_cmx_send (struct timer_list *arg) {struct dsp_conf *conf;struct dsp_conf_member *member;
drivers/isdn/mISDN/dsp_core.c +1 -1
@@ -1202,7 +1202,7 @@ static int __init dsp_init(void) }/* set sample timer */ -timer_setup (&dsp_spl_tl, (void *)dsp_cmx_send,0 ); +timer_setup (&dsp_spl_tl, dsp_cmx_send,0 ); dsp_spl_tl.expires = jiffies + dsp_tics; dsp_spl_jiffies = dsp_spl_tl.expires;add_timer (&dsp_spl_tl);
drivers/mmc/host/moxart-mmc.c +1 -7
@@ -339,13 +339,7 @@ static void moxart_transfer_pio(struct moxart_host *host)return ; }for (len =0 ; len < remain && len < host->fifo_width;) { -/* SCR data must be read in big endian. */ -if (data->mrq->cmd->opcode ==SD_APP_SEND_SCR ) - *sgp =ioread32be (host->base + -REG_DATA_WINDOW ); -else - *sgp =ioread32 (host->base + -REG_DATA_WINDOW ); + *sgp =ioread32 (host->base +REG_DATA_WINDOW ); sgp++; len +=4 ; }
drivers/net/bonding/bond_main.c +3 -1
@@ -4395,7 +4395,9 @@ void bond_setup(struct net_device *bond_dev) bond_dev->hw_features =BOND_VLAN_FEATURES |NETIF_F_HW_VLAN_CTAG_RX | -NETIF_F_HW_VLAN_CTAG_FILTER ; +NETIF_F_HW_VLAN_CTAG_FILTER | +NETIF_F_HW_VLAN_STAG_RX | +NETIF_F_HW_VLAN_STAG_FILTER ; bond_dev->hw_features |=NETIF_F_GSO_ENCAP_ALL |NETIF_F_GSO_UDP_L4 ; bond_dev->features |= bond_dev->hw_features;
drivers/net/ethernet/ibm/ibmvnic.c +10 -5
@@ -884,12 +884,22 @@ static int ibmvnic_login(struct net_device *netdev)static void release_login_buffer (struct ibmvnic_adapter *adapter) { +if (!adapter->login_buf) +return ; + +dma_unmap_single (&adapter->vdev->dev, adapter->login_buf_token, + adapter->login_buf_sz,DMA_TO_DEVICE );kfree (adapter->login_buf); adapter->login_buf =NULL ; }static void release_login_rsp_buffer (struct ibmvnic_adapter *adapter) { +if (!adapter->login_rsp_buf) +return ; + +dma_unmap_single (&adapter->vdev->dev, adapter->login_rsp_buf_token, + adapter->login_rsp_buf_sz,DMA_FROM_DEVICE );kfree (adapter->login_rsp_buf); adapter->login_rsp_buf =NULL ; }
@@ -4061,11 +4071,6 @@ static int handle_login_rsp(union ibmvnic_crq *login_rsp_crq,struct ibmvnic_login_buffer *login = adapter->login_buf;int i; -dma_unmap_single (dev, adapter->login_buf_token, adapter->login_buf_sz, -DMA_TO_DEVICE ); -dma_unmap_single (dev, adapter->login_rsp_buf_token, - adapter->login_rsp_buf_sz,DMA_FROM_DEVICE ); -/* If the number of queues requested can't be allocated by the * server, the login response will return with code 1. We will need * to resend the login buffer with fewer queues requested.
drivers/net/tun.c +1 -1
@@ -1654,7 +1654,7 @@ static bool tun_can_build_skb(struct tun_struct *tun, struct tun_file *tfile,if (zerocopy)return false; -if (SKB_DATA_ALIGN (len +TUN_RX_PAD ) + +if (SKB_DATA_ALIGN (len +TUN_RX_PAD +XDP_PACKET_HEADROOM ) +SKB_DATA_ALIGN (sizeof (struct skb_shared_info )) >PAGE_SIZE )return false;
drivers/scsi/53c700.c +1 -1
@@ -1594,7 +1594,7 @@ NCR_700_intr(int irq, void *dev_id)printk ("scsi%d (%d:%d) PHASE MISMATCH IN SEND MESSAGE %d remain, return %p[%04x], phase %s\n" , host->host_no, pun, lun, count, (void *)temp, temp - hostdata->pScript,sbcl_to_string (NCR_700_readb (host,SBCL_REG )));#endif resume_offset = hostdata->pScript + Ent_SendMessagePhaseMismatch; - }else if (dsp >=to32bit (&slot->pSG[0 ].ins) && + }else if (slot && dsp >=to32bit (&slot->pSG[0 ].ins) && dsp <=to32bit (&slot->pSG[NCR_700_SG_SEGMENTS ].ins)) {int data_transfer =NCR_700_readl (host,DBC_REG ) &0xffffff ;int SGcount = (dsp -to32bit (&slot->pSG[0 ].ins))/sizeof (struct NCR_700_SG_List );
drivers/scsi/raid_class.c +1 -0
@@ -249,6 +249,7 @@ int raid_component_add(struct raid_template *r,struct device *raid_dev,return 0 ; err_out: +put_device (&rc->dev);list_del (&rc->node); rd->component_count--;put_device (component_dev);
drivers/scsi/scsi_proc.c +17 -13
@@ -311,7 +311,7 @@ static ssize_t proc_scsi_write(struct file *file, const char __user *buf, size_t length, loff_t *ppos) { int host, channel, id, lun; -char *buffer, *p; +char *buffer, *end, *p;int err;if (!buf || length >PAGE_SIZE )
@@ -326,10 +326,14 @@ static ssize_t proc_scsi_write(struct file *file, const char __user *buf, goto out; err = -EINVAL ; -if (length <PAGE_SIZE ) - buffer[length] ='\0' ; -else if (buffer[PAGE_SIZE -1 ]) - goto out; +if (length <PAGE_SIZE ) { + end = buffer + length; + *end ='\0' ; + }else { + end = buffer +PAGE_SIZE -1 ; +if (*end) + goto out; + }/* * Usage: echo "scsi add-single-device 0 1 2 3" >/proc/scsi/scsi
@@ -338,10 +342,10 @@ static ssize_t proc_scsi_write(struct file *file, const char __user *buf,if (!strncmp ("scsi add-single-device" , buffer,22 )) { p = buffer +23 ; - host =simple_strtoul (p, &p,0 ); - channel =simple_strtoul (p +1 , &p,0 ); - id =simple_strtoul (p +1 , &p,0 ); - lun =simple_strtoul (p +1 , &p,0 ); + host = (p < end) ?simple_strtoul (p, &p,0 ) :0 ; + channel = (p +1 < end) ?simple_strtoul (p +1 , &p,0 ) :0 ; + id = (p +1 < end) ?simple_strtoul (p +1 , &p,0 ) :0 ; + lun = (p +1 < end) ?simple_strtoul (p +1 , &p,0 ) :0 ; err =scsi_add_single_device (host, channel, id, lun);
@@ -352,10 +356,10 @@ static ssize_t proc_scsi_write(struct file *file, const char __user *buf, }else if (!strncmp ("scsi remove-single-device" , buffer,25 )) { p = buffer +26 ; - host =simple_strtoul (p, &p,0 ); - channel =simple_strtoul (p +1 , &p,0 ); - id =simple_strtoul (p +1 , &p,0 ); - lun =simple_strtoul (p +1 , &p,0 ); + host = (p < end) ?simple_strtoul (p, &p,0 ) :0 ; + channel = (p +1 < end) ?simple_strtoul (p +1 , &p,0 ) :0 ; + id = (p +1 < end) ?simple_strtoul (p +1 , &p,0 ) :0 ; + lun = (p +1 < end) ?simple_strtoul (p +1 , &p,0 ) :0 ; err =scsi_remove_single_device (host, channel, id, lun); }
drivers/scsi/snic/snic_disc.c +1 -0
@@ -316,6 +316,7 @@ snic_tgt_create(struct snic *snic, struct snic_tgt_id *tgtid)"Snic Tgt: device_add, with err = %d\n" , ret); +put_device (&tgt->dev);put_device (&snic->shost->shost_gendev);spin_lock_irqsave (snic->shost->host_lock, flags);list_del (&tgt->list);
drivers/scsi/storvsc_drv.c +0 -4
@@ -1540,10 +1540,6 @@ static int storvsc_host_reset_handler(struct scsi_cmnd *scmnd)*/ static enum blk_eh_timer_return storvsc_eh_timed_out (struct scsi_cmnd *scmnd) { -#if IS_ENABLED (CONFIG_SCSI_FC_ATTRS ) -if (scmnd->device->host->transportt == fc_transport_template) -return fc_eh_timed_out (scmnd); -#endif return BLK_EH_RESET_TIMER ; }
drivers/usb/dwc3/gadget.c +8 -1
@@ -3234,9 +3234,14 @@ static irqreturn_t dwc3_check_event_buf(struct dwc3_event_buffer *evt)u32 reg;if (pm_runtime_suspended (dwc->dev)) { + dwc->pending_events = true; +/* +* Trigger runtime resume. The get() function will be balanced +* after processing the pending events in dwc3_process_pending +* events(). +*/ pm_runtime_get (dwc->dev);disable_irq_nosync (dwc->irq_gadget); - dwc->pending_events = true;return IRQ_HANDLED ; }
@@ -3474,6 +3479,8 @@ void dwc3_gadget_process_pending_events(struct dwc3 *dwc) {if (dwc->pending_events) {dwc3_interrupt (dwc->irq_gadget, dwc->ev_buf); +dwc3_thread_interrupt (dwc->irq_gadget, dwc->ev_buf); +pm_runtime_put (dwc->dev); dwc->pending_events = false;enable_irq (dwc->irq_gadget); }
drivers/usb/storage/alauda.c +7 -2
@@ -317,7 +317,8 @@ static int alauda_get_media_status(struct us_data *us, unsigned char *data) rc =usb_stor_ctrl_transfer (us, us->recv_ctrl_pipe, command,0xc0 ,0 ,1 , data,2 ); -usb_stor_dbg (us,"Media status %02X %02X\n" , data[0 ], data[1 ]); +if (rc ==USB_STOR_XFER_GOOD ) +usb_stor_dbg (us,"Media status %02X %02X\n" , data[0 ], data[1 ]);return rc; }
@@ -453,10 +454,14 @@ static int alauda_init_media(struct us_data *us)static int alauda_check_media (struct us_data *us) {struct alauda_info *info = (struct alauda_info *) us->extra; -unsigned char status[2 ]; +unsigned char *status = us->iobuf;int rc; rc =alauda_get_media_status (us, status); +if (rc !=USB_STOR_XFER_GOOD ) { + status[0 ] =0xF0 ;/* Pretend there's no media */ + status[1 ] =0 ; + }/* Check for no media or door open */ if ((status[0] & 0x80) || ((status[0] & 0x1F) == 0x10)
fs/btrfs/extent_io.c +4 -3
@@ -3928,11 +3928,12 @@ int btree_write_cache_pages(struct address_space *mapping,free_extent_buffer (eb);/* -* the filesystem may choose to bump up nr_to_write. +* The filesystem may choose to bump up nr_to_write. * We have to make sure to honor the new nr_to_write -* at any time +* at any time. */ - nr_to_write_done = wbc->nr_to_write <=0 ; + nr_to_write_done = (wbc->sync_mode ==WB_SYNC_NONE && + wbc->nr_to_write <=0 ); }pagevec_release (&pvec);cond_resched ();
fs/nilfs2/inode.c +8 -0
@@ -1112,9 +1112,17 @@ int nilfs_set_file_dirty(struct inode *inode, unsigned int nr_dirty)int __nilfs_mark_inode_dirty (struct inode *inode,int flags) { +struct the_nilfs *nilfs = inode->i_sb->s_fs_info;struct buffer_head *ibh;int err; +/* +* Do not dirty inodes after the log writer has been detached +* and its nilfs_root struct has been freed. +*/ +if (unlikely (nilfs_purging (nilfs))) +return 0 ; + err =nilfs_load_inode_block (inode, &ibh);if (unlikely (err)) { nilfs_msg(inode->i_sb, KERN_WARNING,
fs/nilfs2/segment.c +2 -0
@@ -2845,6 +2845,7 @@ void nilfs_detach_log_writer(struct super_block *sb)nilfs_segctor_destroy (nilfs->ns_writer); nilfs->ns_writer =NULL ; } +set_nilfs_purging (nilfs);/* Force to free the list of dirty files */ spin_lock (&nilfs->ns_inode_lock);
@@ -2857,4 +2858,5 @@ void nilfs_detach_log_writer(struct super_block *sb)up_write (&nilfs->ns_segctor_sem);nilfs_dispose_list (nilfs, &garbage_list,1 ); +clear_nilfs_purging (nilfs); }
fs/nilfs2/the_nilfs.h +2 -0
@@ -29,6 +29,7 @@ enum {THE_NILFS_DISCONTINUED ,/* 'next' pointer chain has broken */ THE_NILFS_GC_RUNNING ,/* gc process is running */ THE_NILFS_SB_DIRTY ,/* super block is dirty */ + THE_NILFS_PURGING, /* disposing dirty files for cleanup */ };/**
@@ -208,6 +209,7 @@ THE_NILFS_FNS(INIT, init) THE_NILFS_FNS(DISCONTINUED, discontinued) THE_NILFS_FNS(GC_RUNNING, gc_running) THE_NILFS_FNS(SB_DIRTY, sb_dirty) +THE_NILFS_FNS (PURGING , purging)/* * Mount option operations
include/net/cfg80211.h +3 -0
@@ -370,6 +370,9 @@ ieee80211_get_sband_iftype_data(const struct ieee80211_supported_band *sband,if (WARN_ON (iftype >=NL80211_IFTYPE_MAX ))return NULL ; +if (iftype ==NL80211_IFTYPE_AP_VLAN ) + iftype =NL80211_IFTYPE_AP ; +for (i =0 ; i < sband->n_iftype_data; i++) {const struct ieee80211_sband_iftype_data *data = &sband->iftype_data[i];
include/net/netfilter/nf_tables.h +31 -4
@@ -992,6 +992,29 @@ int __nft_release_basechain(struct nft_ctx *ctx);unsigned int nft_do_chain (struct nft_pktinfo *pkt,void *priv); +static inline bool nft_use_inc (u32 *use) +{ +if (*use ==UINT_MAX ) +return false; + + (*use)++; + +return true; +} + +static inline void nft_use_dec (u32 *use) +{ +WARN_ON_ONCE ((*use)-- ==0 ); +} + +/* For error and abort path: restore use counter to previous state. */ +static inline void nft_use_inc_restore (u32 *use) +{ +WARN_ON_ONCE (!nft_use_inc (use)); +} + +#define nft_use_dec_restore nft_use_dec +/** * struct nft_table - nf_tables table *
@@ -1050,8 +1073,8 @@ struct nft_object {struct list_head list;char *name;struct nft_table *table; - u32 genmask:2, - use:30; + u32 genmask:2; +u32 use;u64 handle;/* runtime data below here */ const struct nft_object_ops *ops____cacheline_aligned ;
@@ -1149,8 +1172,8 @@ struct nft_flowtable {int hooknum;int priority;int ops_len; - u32 genmask:2, - use:30; + u32 genmask:2; +u32 use;u64 handle;/* runtime data below here */ struct nf_hook_ops *ops____cacheline_aligned ;
@@ -1161,6 +1184,10 @@ struct nft_flowtable *nft_flowtable_lookup(const struct nft_table *table,const struct nlattr *nla, u8 genmask); +void nf_tables_deactivate_flowtable (const struct nft_ctx *ctx, +struct nft_flowtable *flowtable, +enum nft_trans_phase phase); +void nft_register_flowtable_type (struct nf_flowtable_type *type);void nft_unregister_flowtable_type (struct nf_flowtable_type *type);
net/dccp/output.c +1 -1
@@ -189,7 +189,7 @@ unsigned int dccp_sync_mss(struct sock *sk, u32 pmtu)/* And store cached results */ icsk->icsk_pmtu_cookie = pmtu; - dp->dccps_mss_cache = cur_mps; +WRITE_ONCE (dp->dccps_mss_cache, cur_mps);return cur_mps; }
net/dccp/proto.c +8 -2
@@ -648,7 +648,7 @@ static int do_dccp_getsockopt(struct sock *sk, int level, int optname,return dccp_getsockopt_service (sk, len, (__be32 __user *)optval, optlen);case DCCP_SOCKOPT_GET_CUR_MPS : - val = dp->dccps_mss_cache; + val =READ_ONCE (dp->dccps_mss_cache);break ;case DCCP_SOCKOPT_AVAILABLE_CCIDS :return ccid_getsockopt_builtin_ccids (sk, len, optval, optlen);
@@ -770,7 +770,7 @@ int dccp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)trace_dccp_probe (sk, len); -if (len > dp->dccps_mss_cache) +if (len >READ_ONCE (dp->dccps_mss_cache))return -EMSGSIZE ;lock_sock (sk);
@@ -803,6 +803,12 @@ int dccp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) goto out_discard; } +/* We need to check dccps_mss_cache after socket is locked. */ +if (len > dp->dccps_mss_cache) { + rc = -EMSGSIZE ; + goto out_discard; + } +skb_reserve (skb, sk->sk_prot->max_header); rc =memcpy_from_msg (skb_put (skb, len), msg, len);if (rc !=0 )
net/ipv6/ndisc.c +2 -1
@@ -195,7 +195,8 @@ static struct nd_opt_hdr *ndisc_next_option(struct nd_opt_hdr *cur,static inline int ndisc_is_useropt (const struct net_device *dev,struct nd_opt_hdr *opt) { -return opt->nd_opt_type ==ND_OPT_RDNSS || +return opt->nd_opt_type ==ND_OPT_PREFIX_INFO || + opt->nd_opt_type ==ND_OPT_RDNSS || opt->nd_opt_type ==ND_OPT_DNSSL ||ndisc_ops_is_useropt (dev, opt->nd_opt_type); }
net/netfilter/nf_tables_api.c +119 -61
529 lines not on this page · raw message
net/netfilter/nft_flow_offload.c +22 -1
@@ -169,12 +169,31 @@ static int nft_flow_offload_init(const struct nft_ctx *ctx,if (IS_ERR (flowtable))return PTR_ERR (flowtable); +if (!nft_use_inc (&flowtable->use)) +return -EMFILE ; + priv->flowtable = flowtable; - flowtable->use++;return nf_ct_netns_get (ctx->net, ctx->family); } +static void nft_flow_offload_deactivate (const struct nft_ctx *ctx, +const struct nft_expr *expr, +enum nft_trans_phase phase) +{ +struct nft_flow_offload *priv =nft_expr_priv (expr); + +nf_tables_deactivate_flowtable (ctx, priv->flowtable, phase); +} + +static void nft_flow_offload_activate (const struct nft_ctx *ctx, +const struct nft_expr *expr) +{ +struct nft_flow_offload *priv =nft_expr_priv (expr); + +nft_use_inc_restore (&priv->flowtable->use); +} +static void nft_flow_offload_destroy (const struct nft_ctx *ctx,const struct nft_expr *expr) {
@@ -203,6 +222,8 @@ static const struct nft_expr_ops nft_flow_offload_ops = { .size = NFT_EXPR_SIZE(sizeof(struct nft_flow_offload)), .eval = nft_flow_offload_eval, .init = nft_flow_offload_init, + .activate = nft_flow_offload_activate, + .deactivate = nft_flow_offload_deactivate, .destroy = nft_flow_offload_destroy, .validate = nft_flow_offload_validate, .dump = nft_flow_offload_dump,
net/netfilter/nft_objref.c +5 -3
@@ -43,8 +43,10 @@ static int nft_objref_init(const struct nft_ctx *ctx,if (IS_ERR (obj))return -ENOENT ; +if (!nft_use_inc (&obj->use)) +return -EMFILE ; +nft_objref_priv (expr) = obj; - obj->use++;return 0 ; }
@@ -73,7 +75,7 @@ static void nft_objref_deactivate(const struct nft_ctx *ctx,if (phase ==NFT_TRANS_COMMIT )return ; - obj->use--; +nft_use_dec (&obj->use); } static void nft_objref_activate(const struct nft_ctx *ctx,
@@ -81,7 +83,7 @@ static void nft_objref_activate(const struct nft_ctx *ctx, {struct nft_object *obj =nft_objref_priv (expr); - obj->use++; +nft_use_inc_restore (&obj->use); }static struct nft_expr_type nft_objref_type;
net/packet/af_packet.c +10 -6
@@ -370,18 +370,20 @@ static void __packet_set_status(struct packet_sock *po, void *frame, int status) {union tpacket_uhdr h; +/* WRITE_ONCE() are paired with READ_ONCE() in __packet_get_status */ + h.raw = frame;switch (po->tp_version) {case TPACKET_V1 : - h.h1->tp_status = status; +WRITE_ONCE (h.h1->tp_status, status);flush_dcache_page (pgv_to_page (&h.h1->tp_status));break ;case TPACKET_V2 : - h.h2->tp_status = status; +WRITE_ONCE (h.h2->tp_status, status);flush_dcache_page (pgv_to_page (&h.h2->tp_status));break ;case TPACKET_V3 : - h.h3->tp_status = status; +WRITE_ONCE (h.h3->tp_status, status);flush_dcache_page (pgv_to_page (&h.h3->tp_status));break ;default :
@@ -398,17 +400,19 @@ static int __packet_get_status(struct packet_sock *po, void *frame)smp_rmb (); +/* READ_ONCE() are paired with WRITE_ONCE() in __packet_set_status */ + h.raw = frame;switch (po->tp_version) {case TPACKET_V1 :flush_dcache_page (pgv_to_page (&h.h1->tp_status)); -return h.h1->tp_status; +return READ_ONCE (h.h1->tp_status);case TPACKET_V2 :flush_dcache_page (pgv_to_page (&h.h2->tp_status)); -return h.h2->tp_status; +return READ_ONCE (h.h2->tp_status);case TPACKET_V3 :flush_dcache_page (pgv_to_page (&h.h3->tp_status)); -return h.h3->tp_status; +return READ_ONCE (h.h3->tp_status);default :WARN (1 ,"TPACKET version not supported.\n" );BUG ();
net/sched/sch_netem.c +25 -34
105 lines not on this page · raw message
tools/testing/radix-tree/regression1.c +1 -1
@@ -198,7 +198,7 @@ void regression1_test(void) nr_threads =2 ;pthread_barrier_init (&worker_barrier,NULL , nr_threads); - threads =malloc (nr_threads *sizeof (pthread_t *)); + threads =malloc (nr_threads *sizeof (*threads));for (i =0 ; i < nr_threads; i++) { arg = i;