Linux 4.4.44
Greg KH
maintainerI'm announcing the release of the 4.4.44 kernel.
All users of the 4.4 kernel series must upgrade.
The updated 4.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.4.y
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/powerpc/kernel/ibmebus.c | 16 + arch/x86/kernel/cpu/common.c | 2 arch/x86/kvm/emulate.c | 249 +++++++++++++++++++++++---- arch/x86/kvm/lapic.c | 6 arch/x86/kvm/lapic.h | 1 arch/x86/kvm/x86.c | 1 block/blk-mq.c | 4 block/cfq-iosched.c | 2 drivers/acpi/apei/ghes.c | 7 drivers/bus/vexpress-config.c | 7 drivers/cpufreq/powernv-cpufreq.c | 8 drivers/gpu/drm/radeon/si_dpm.c | 13 - drivers/i2c/i2c-core.c | 2 drivers/i2c/i2c-dev.c | 2 drivers/input/joystick/xpad.c | 6 drivers/input/serio/i8042-x86ia64io.h | 6 drivers/input/touchscreen/elants_i2c.c | 4 drivers/pinctrl/meson/pinctrl-meson.c | 2 drivers/pinctrl/sh-pfc/pinctrl.c | 3 drivers/tty/serial/atmel_serial.c | 11 + drivers/tty/sysrq.c | 4 drivers/usb/host/xhci-ring.c | 11 - drivers/usb/host/xhci.c | 13 - drivers/usb/serial/ch341.c | 84 +++++---- drivers/usb/serial/kl5kusb105.c | 9 drivers/vme/bridges/vme_ca91cx42.c | 2 fs/btrfs/extent-tree.c | 5 fs/dcache.c | 7 fs/namespace.c | 64 ++++-- fs/nfs/dir.c | 15 - fs/nfs/filelayout/filelayoutdev.c | 3 fs/nfs/pnfs.c | 8 fs/ocfs2/dlmglue.c | 10 + fs/ocfs2/stackglue.c | 6 fs/ocfs2/stackglue.h | 3 fs/proc/proc_sysctl.c | 3 include/linux/jump_label_ratelimit.h | 5 kernel/jump_label.c | 7 kernel/memremap.c | 4 mm/hugetlb.c | 37 +++- net/wireless/nl80211.c | 16 - tools/testing/selftests/Makefile | 2 tools/testing/selftests/net/run_netsocktests | 2 virt/lib/irqbypass.c | 4 45 files changed, 487 insertions(+), 191 deletions(-)
Akinobu Mita (1):
sysrq: attach sysrq handler correctly for 32-bit kernel
Alex Deucher (1):
drm/radeon: drop verde dpm quirks
Augusto Mecking Caringi (1):
vme: Fix wrong pointer utilization in ca91cx42_slave_get
Dan Williams (1):
mm: fix devm_memremap_pages crash, use mem_hotplug_{begin, done}David Matlack (2):
jump_labels: API for flushing deferred jump label updates
KVM: x86: flush pending lapic jump label updates on module unload
Denis Kirjanov (1):
cpufreq: powernv: Disable preemption while checking CPU throttling state
Eric Ren (1):
ocfs2: fix crash caused by stale lvb with fsdlm plugin
Eric W. Biederman (1):
mnt: Protect the mountpoint hashtable with mount_lock
Gabriel Krisman Bertazi (1):
blk-mq: Always schedule hctx->next_cpu
Greg Kroah-Hartman (1):
Linux 4.4.44
Guenter Roeck (1):
Input: elants_i2c - avoid divide by 0 errors on bad touchscreen data
Jeff Mahoney (2):
btrfs: fix locking when we put back a delayed ref that's too new
btrfs: fix error handling when run_delayed_extent_op fails
Johan Hovold (10):
USB: serial: kl5kusb105: fix line-state error handling
USB: serial: ch341: fix initial modem-control state
USB: serial: ch341: fix open error handling
USB: serial: ch341: fix control-message error handling
USB: serial: ch341: fix open and resume after B0
USB: serial: ch341: fix resume after reset
USB: serial: ch341: fix modem-control and B0 handling
bus: vexpress-config: fix device reference leak powerpc/ibmebus: Fix further device reference leaks powerpc/ibmebus: Fix device reference leaks in sysfs interface
Johannes Berg (1):
nl80211: fix sched scan netlink socket owner destruction
John Garry (1):
i2c: print correct device invalid address
Lukasz Odzioba (1):
x86/cpu: Fix bootup crashes by sanitizing the argument of the 'clearcpuid=' command-line option
Marcos Paulo de Souza (1):
Input: i8042 - add Pegatron touchpad to noloop table
Mathias Nyman (1):
xhci: fix deadlock at host remove by running watchdog correctly
Mike Kravetz (1):
mm/hugetlb.c: fix reservation race when freeing surplus pages
Neil Armstrong (1):
pinctrl: meson: fix gpio request disabling other modes
NeilBrown (1):
NFSv4.1: nfs4_fl_prepare_ds must be careful about reporting success.
Niklas Söderlund (1):
pinctrl: sh-pfc: Do not unconditionally support PIN_CONFIG_BIAS_DISABLE
Paolo Bonzini (1):
KVM: x86: fix emulation of "MOV SS, null selector"
Pavel Rojtberg (1):
Input: xpad - use correct product id for x360w controllers
Prarit Bhargava (1):
ACPI / APEI: Fix NMI notification handling
Radim Krčmář (3):
KVM: x86: add Align16 instruction flag
KVM: x86: add asm_safe wrapper
KVM: x86: emulate FXSAVE and FXRSTOR
Richard Genoud (1):
tty/serial: atmel_serial: BUG: stop DMA from transmitting in stop_tx
Rolf Eike Beer (2):
selftests: do not require bash to run netsocktests testcase
selftests: do not require bash for the generated test
Steve Rutherford (1):
KVM: x86: Introduce segmented_write_std
Tejun Heo (1):
block: cfq_cpd_alloc() should use @gfp
Trond Myklebust (2):
pNFS: Fix race in pnfs_wait_on_layoutreturn
NFS: Fix a performance regression in readdir
Vlad Tsyrklevich (1):
i2c: fix kernel memory disclosure in dev interface
Wanpeng Li (1):
KVM: eventfd: fix NULL deref irqbypass consumer
Zhou Chengming (1):
sysctl: Drop reference added by grab_header in proc_sys_readdir
Greg KH
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 4 -SUBLEVEL = 43 +SUBLEVEL = 44 EXTRAVERSION = NAME = Blurry Fish Butt
arch/powerpc/kernel/ibmebus.c +12 -4
@@ -180,6 +180,7 @@ static int ibmebus_create_device(struct device_node *dn)static int ibmebus_create_devices (const struct of_device_id *matches) {struct device_node *root, *child; +struct device *dev;int ret =0 ; root =of_find_node_by_path ("/" );
@@ -188,9 +189,12 @@ static int ibmebus_create_devices(const struct of_device_id *matches)if (!of_match_node (matches, child))continue ; -if (bus_find_device (&ibmebus_bus_type,NULL , child, - ibmebus_match_node)) + dev =bus_find_device (&ibmebus_bus_type,NULL , child, + ibmebus_match_node); +if (dev) { +put_device (dev);continue ; + } ret =ibmebus_create_device (child);if (ret) {
@@ -262,6 +266,7 @@ static ssize_t ibmebus_store_probe(struct bus_type *bus, const char *buf, size_t count) {struct device_node *dn =NULL ; +struct device *dev;char *path;ssize_t rc =0 ;
@@ -269,8 +274,10 @@ static ssize_t ibmebus_store_probe(struct bus_type *bus,if (!path)return -ENOMEM ; -if (bus_find_device (&ibmebus_bus_type,NULL , path, - ibmebus_match_path)) { + dev =bus_find_device (&ibmebus_bus_type,NULL , path, + ibmebus_match_path); +if (dev) { +put_device (dev);printk (KERN_WARNING "%s: %s has already been probed\n" , __func__, path); rc = -EEXIST ;
@@ -307,6 +314,7 @@ static ssize_t ibmebus_store_remove(struct bus_type *bus,if ((dev =bus_find_device (&ibmebus_bus_type,NULL , path, ibmebus_match_path))) {of_device_unregister (to_platform_device (dev)); +put_device (dev);kfree (path);return count;
arch/x86/kernel/cpu/common.c +1 -1
@@ -1129,7 +1129,7 @@ static __init int setup_disablecpuid(char *arg) {int bit; -if (get_option (&arg, &bit) && bit <NCAPINTS *32 ) +if (get_option (&arg, &bit) && bit >=0 && bit <NCAPINTS *32 )setup_clear_cpu_cap (bit);else return 0 ;
arch/x86/kvm/emulate.c +217 -32
338 lines not on this page · raw message
arch/x86/kvm/lapic.c +6 -0
@@ -2187,3 +2187,9 @@ void kvm_lapic_init(void)jump_label_rate_limit (&apic_hw_disabled,HZ );jump_label_rate_limit (&apic_sw_disabled,HZ ); } + +void kvm_lapic_exit (void ) +{ +static_key_deferred_flush (&apic_hw_disabled); +static_key_deferred_flush (&apic_sw_disabled); +}
arch/x86/kvm/lapic.h +1 -0
@@ -95,6 +95,7 @@ static inline bool kvm_hv_vapic_assist_page_enabled(struct kvm_vcpu *vcpu)int kvm_lapic_enable_pv_eoi (struct kvm_vcpu *vcpu,u64 data);void kvm_lapic_init (void ); +void kvm_lapic_exit (void );static inline u32 kvm_apic_get_reg (struct kvm_lapic *apic,int reg_off) {
arch/x86/kvm/x86.c +1 -0
@@ -5842,6 +5842,7 @@ out:void kvm_arch_exit (void ) { +kvm_lapic_exit ();perf_unregister_guest_info_callbacks (&kvm_guest_cbs);if (!boot_cpu_has (X86_FEATURE_CONSTANT_TSC ))
block/blk-mq.c +1 -3
@@ -842,7 +842,7 @@ static int blk_mq_hctx_next_cpu(struct blk_mq_hw_ctx *hctx)return WORK_CPU_UNBOUND ;if (--hctx->next_cpu_batch <=0 ) { -int cpu = hctx->next_cpu, next_cpu; +int next_cpu; next_cpu =cpumask_next (hctx->next_cpu, hctx->cpumask);if (next_cpu >= nr_cpu_ids)
@@ -850,8 +850,6 @@ static int blk_mq_hctx_next_cpu(struct blk_mq_hw_ctx *hctx) hctx->next_cpu = next_cpu; hctx->next_cpu_batch =BLK_MQ_CPU_WORK_BATCH ; - -return cpu; }return hctx->next_cpu;
block/cfq-iosched.c +1 -1
@@ -1572,7 +1572,7 @@ static struct blkcg_policy_data *cfq_cpd_alloc(gfp_t gfp) {struct cfq_group_data *cgd; - cgd =kzalloc (sizeof (*cgd),GFP_KERNEL ); + cgd =kzalloc (sizeof (*cgd), gfp);if (!cgd)return NULL ;return &cgd->cpd;
drivers/acpi/apei/ghes.c +4 -3
@@ -847,6 +847,8 @@ static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs)if (ghes_read_estatus (ghes,1 )) {ghes_clear_estatus (ghes);continue ; + }else { + ret =NMI_HANDLED ; } sev =ghes_severity (ghes->estatus->error_severity);
@@ -858,12 +860,11 @@ static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs)__process_error (ghes);ghes_clear_estatus (ghes); - - ret =NMI_HANDLED ; }#ifdef CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG -irq_work_queue (&ghes_proc_irq_work); +if (ret ==NMI_HANDLED ) +irq_work_queue (&ghes_proc_irq_work);#endif atomic_dec (&ghes_in_nmi);return ret;
drivers/bus/vexpress-config.c +6 -1
@@ -171,6 +171,7 @@ static int vexpress_config_populate(struct device_node *node) {struct device_node *bridge;struct device *parent; +int ret; bridge =of_parse_phandle (node,"arm,vexpress,config-bridge" ,0 );if (!bridge)
@@ -181,7 +182,11 @@ static int vexpress_config_populate(struct device_node *node)if (WARN_ON (!parent))return -ENODEV ; -return of_platform_populate (node,NULL ,NULL , parent); + ret =of_platform_populate (node,NULL ,NULL , parent); + +put_device (parent); + +return ret; }static int __init vexpress_config_init (void )
drivers/cpufreq/powernv-cpufreq.c +7 -1
@@ -373,8 +373,14 @@ static int powernv_cpufreq_target_index(struct cpufreq_policy *policy,if (unlikely (rebooting) && new_index !=get_nominal_index ())return 0 ; -if (!throttled) +if (!throttled) { +/* we don't want to be preempted while +* checking if the CPU frequency has been throttled +*/ +preempt_disable ();powernv_cpufreq_throttle_check (NULL ); +preempt_enable (); + } freq_data.pstate_id = powernv_freqs[new_index].driver_data;
drivers/gpu/drm/radeon/si_dpm.c +0 -13
@@ -3008,19 +3008,6 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, (rdev->pdev->device == 0x6817) || (rdev->pdev->device == 0x6806)) max_mclk =120000 ; - }else if (rdev->family ==CHIP_VERDE ) { -if ((rdev->pdev->revision ==0x81 ) || - (rdev->pdev->revision ==0x83 ) || - (rdev->pdev->revision ==0x87 ) || - (rdev->pdev->device ==0x6820 ) || - (rdev->pdev->device ==0x6821 ) || - (rdev->pdev->device ==0x6822 ) || - (rdev->pdev->device ==0x6823 ) || - (rdev->pdev->device ==0x682A ) || - (rdev->pdev->device ==0x682B )) { - max_sclk =75000 ; - max_mclk =80000 ; - } }else if (rdev->family ==CHIP_OLAND ) { if ((rdev->pdev->revision == 0xC7) || (rdev->pdev->revision == 0x80) ||
drivers/i2c/i2c-core.c +1 -1
@@ -1400,7 +1400,7 @@ static struct i2c_client *of_i2c_register_device(struct i2c_adapter *adap,if (i2c_check_addr_validity (addr, info.flags)) {dev_err (&adap->dev,"of_i2c: invalid addr=%x on %s\n" , - info.addr, node->full_name); + addr, node->full_name);return ERR_PTR (-EINVAL ); }
drivers/i2c/i2c-dev.c +1 -1
@@ -329,7 +329,7 @@ static noinline int i2cdev_ioctl_smbus(struct i2c_client *client, unsigned long arg) {struct i2c_smbus_ioctl_data data_arg; -union i2c_smbus_data temp; +union i2c_smbus_data temp = {};int datasize, res; if (copy_from_user(&data_arg,
drivers/input/joystick/xpad.c +6 -0
@@ -1238,6 +1238,12 @@ static int xpad_init_input(struct usb_xpad *xpad) input_dev->name = xpad->name; input_dev->phys = xpad->phys;usb_to_input_id (xpad->udev, &input_dev->id); + +if (xpad->xtype ==XTYPE_XBOX360W ) { +/* x360w controllers and the receiver have different ids */ + input_dev->id.product =0x02a1 ; + } + input_dev->dev.parent = &xpad->intf->dev;input_set_drvdata (input_dev, xpad);
drivers/input/serio/i8042-x86ia64io.h +6 -0
@@ -211,6 +211,12 @@ static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = { DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"), }, }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "PEGATRON CORPORATION"), + DMI_MATCH(DMI_PRODUCT_NAME, "C15B"), + }, + }, { } };
drivers/input/touchscreen/elants_i2c.c +2 -2
@@ -905,9 +905,9 @@ static irqreturn_t elants_i2c_irq(int irq, void *_dev)case QUEUE_HEADER_NORMAL : report_count = ts->buf[FW_HDR_COUNT ]; -if (report_count >3 ) { +if (report_count ==0 || report_count >3 ) {dev_err (&client->dev, -"too large report count: %*ph\n" , +"bad report count: %*ph\n" ,HEADER_SIZE , ts->buf);break ; }
drivers/pinctrl/meson/pinctrl-meson.c +1 -1
@@ -246,7 +246,7 @@ static int meson_pmx_request_gpio(struct pinctrl_dev *pcdev, {struct meson_pinctrl *pc =pinctrl_dev_get_drvdata (pcdev); -meson_pmx_disable_other_groups (pc, range->pin_base + offset,-1 ); +meson_pmx_disable_other_groups (pc, offset,-1 );return 0 ; }
drivers/pinctrl/sh-pfc/pinctrl.c +2 -1
@@ -483,7 +483,8 @@ static bool sh_pfc_pinconf_validate(struct sh_pfc *pfc, unsigned int _pin,switch (param) {case PIN_CONFIG_BIAS_DISABLE : -return true; +return pin->configs & + (SH_PFC_PIN_CFG_PULL_UP |SH_PFC_PIN_CFG_PULL_DOWN );case PIN_CONFIG_BIAS_PULL_UP :return pin->configs &SH_PFC_PIN_CFG_PULL_UP ;
drivers/tty/serial/atmel_serial.c +11 -0
@@ -470,6 +470,14 @@ static void atmel_stop_tx(struct uart_port *port)/* disable PDC transmit */ atmel_uart_writel (port,ATMEL_PDC_PTCR ,ATMEL_PDC_TXTDIS ); } + +/* +* Disable the transmitter. +* This is mandatory when DMA is used, otherwise the DMA buffer +* is fully transmitted. +*/ +atmel_uart_writel (port,ATMEL_US_CR ,ATMEL_US_TXDIS ); +/* Disable interrupts */ atmel_uart_writel (port,ATMEL_US_IDR , atmel_port->tx_done_mask);
@@ -502,6 +510,9 @@ static void atmel_start_tx(struct uart_port *port)/* Enable interrupts */ atmel_uart_writel (port,ATMEL_US_IER , atmel_port->tx_done_mask); + +/* re-enable the transmitter */ +atmel_uart_writel (port,ATMEL_US_CR ,ATMEL_US_TXEN ); }/*
drivers/tty/sysrq.c +2 -2
@@ -939,8 +939,8 @@ static const struct input_device_id sysrq_ids[] = { { .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT, - .evbit = { BIT_MASK(EV_KEY) }, - .keybit = { BIT_MASK(KEY_LEFTALT) }, + .evbit = { [BIT_WORD(EV_KEY)] = BIT_MASK(EV_KEY) }, + .keybit = { [BIT_WORD(KEY_LEFTALT)] = BIT_MASK(KEY_LEFTALT) }, }, { }, };
drivers/usb/host/xhci-ring.c +0 -11
@@ -913,17 +913,6 @@ void xhci_stop_endpoint_command_watchdog(unsigned long arg)spin_lock_irqsave (&xhci->lock, flags); ep->stop_cmds_pending--; -if (xhci->xhc_state &XHCI_STATE_REMOVING ) { -spin_unlock_irqrestore (&xhci->lock, flags); -return ; - } -if (xhci->xhc_state &XHCI_STATE_DYING ) { -xhci_dbg_trace (xhci, trace_xhci_dbg_cancel_urb, -"Stop EP timer ran, but another timer marked " -"xHCI as DYING, exiting." ); -spin_unlock_irqrestore (&xhci->lock, flags); -return ; - }if (!(ep->stop_cmds_pending ==0 && (ep->ep_state &EP_HALT_PENDING ))) {xhci_dbg_trace (xhci, trace_xhci_dbg_cancel_urb, "Stop EP timer ran, but no command pending, "
drivers/usb/host/xhci.c +0 -13
@@ -1569,19 +1569,6 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)xhci_urb_free_priv (urb_priv);return ret; } -if ((xhci->xhc_state &XHCI_STATE_DYING ) || - (xhci->xhc_state &XHCI_STATE_HALTED )) { -xhci_dbg_trace (xhci, trace_xhci_dbg_cancel_urb, -"Ep 0x%x: URB %p to be canceled on " -"non-responsive xHCI host." , - urb->ep->desc.bEndpointAddress, urb); -/* Let the stop endpoint command watchdog timer (which set this -* state) finish cleaning up the endpoint TD lists. We must -* have caught it in the middle of dropping a lock and giving -* back an URB. -*/ - goto done; - } ep_index =xhci_get_endpoint_index (&urb->ep->desc); ep = &xhci->devs[urb->dev->slot_id]->eps[ep_index];
drivers/usb/serial/ch341.c +54 -30
165 lines not on this page · raw message
drivers/usb/serial/kl5kusb105.c +5 -4
@@ -192,10 +192,11 @@ static int klsi_105_get_line_state(struct usb_serial_port *port, status_buf,KLSI_STATUSBUF_LEN ,10000 ); -if (rc <0 ) -dev_err (&port->dev,"Reading line status failed (error = %d)\n" , - rc); -else { +if (rc !=KLSI_STATUSBUF_LEN ) { +dev_err (&port->dev,"reading line status failed: %d\n" , rc); +if (rc >=0 ) + rc = -EIO ; + }else { status =get_unaligned_le16 (status_buf); dev_info(&port->serial->dev->dev, "read status %x %x\n",
drivers/vme/bridges/vme_ca91cx42.c +1 -1
@@ -467,7 +467,7 @@ static int ca91cx42_slave_get(struct vme_slave_resource *image, int *enabled, vme_bound =ioread32 (bridge->base +CA91CX42_VSI_BD [i]); pci_offset =ioread32 (bridge->base +CA91CX42_VSI_TO [i]); - *pci_base = (dma_addr_t )vme_base + pci_offset; + *pci_base = (dma_addr_t)*vme_base + pci_offset; *size = (unsigned long long )((vme_bound - *vme_base) + granularity); *enabled =0 ;
fs/btrfs/extent-tree.c +4 -1
@@ -2520,11 +2520,11 @@ static noinline int __btrfs_run_delayed_refs(struct btrfs_trans_handle *trans,if (ref && ref->seq &&btrfs_check_delayed_seq (fs_info, delayed_refs, ref->seq)) {spin_unlock (&locked_ref->lock); -btrfs_delayed_ref_unlock (locked_ref);spin_lock (&delayed_refs->lock); locked_ref->processing =0 ; delayed_refs->num_heads_ready++;spin_unlock (&delayed_refs->lock); +btrfs_delayed_ref_unlock (locked_ref); locked_ref =NULL ;cond_resched (); count++;
@@ -2570,7 +2570,10 @@ static noinline int __btrfs_run_delayed_refs(struct btrfs_trans_handle *trans,*/ if (must_insert_reserved) locked_ref->must_insert_reserved =1 ; +spin_lock (&delayed_refs->lock); locked_ref->processing =0 ; + delayed_refs->num_heads_ready++; +spin_unlock (&delayed_refs->lock);btrfs_debug (fs_info,"run_delayed_extent_op returned %d" , ret);btrfs_delayed_ref_unlock (locked_ref);return ret;
fs/dcache.c +5 -2
@@ -1322,8 +1322,11 @@ int d_set_mounted(struct dentry *dentry) }spin_lock (&dentry->d_lock);if (!d_unlinked (dentry)) { - dentry->d_flags |=DCACHE_MOUNTED ; - ret =0 ; + ret = -EBUSY ; +if (!d_mountpoint (dentry)) { + dentry->d_flags |=DCACHE_MOUNTED ; + ret =0 ; + } }spin_unlock (&dentry->d_lock); out:
fs/namespace.c +45 -19
116 lines not on this page · raw message
fs/nfs/dir.c +2 -13
@@ -462,7 +462,7 @@ void nfs_force_use_readdirplus(struct inode *dir) {if (!list_empty (&NFS_I (dir)->open_files)) {nfs_advise_use_readdirplus (dir); -nfs_zap_mapping (dir, dir->i_mapping); +invalidate_mapping_pages (dir->i_mapping,0 ,-1 ); } }
@@ -847,17 +847,6 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc) goto out; } -static bool nfs_dir_mapping_need_revalidate (struct inode *dir) -{ -struct nfs_inode *nfsi =NFS_I (dir); - -if (nfs_attribute_cache_expired (dir)) -return true; -if (nfsi->cache_validity &NFS_INO_INVALID_DATA ) -return true; -return false; -} -/* The file offset position represents the dirent entry number. A last cookie cache takes care of the common case of reading the whole directory.
@@ -890,7 +879,7 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx) desc->plus =nfs_use_readdirplus (inode, ctx) ?1 :0 ;nfs_block_sillyrename (dentry); -if (ctx->pos ==0 ||nfs_dir_mapping_need_revalidate (inode)) +if (ctx->pos ==0 ||nfs_attribute_cache_expired (inode)) res =nfs_revalidate_mapping (inode, file->f_mapping);if (res <0 ) goto out;
fs/nfs/filelayout/filelayoutdev.c +2 -1
@@ -283,7 +283,8 @@ nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx) s->nfs_client->cl_rpcclient->cl_auth->au_flavor); out_test_devid: -if (filelayout_test_devid_unavailable (devid)) +if (ret->ds_clp ==NULL || +filelayout_test_devid_unavailable (devid)) ret =NULL ; out:return ret;
fs/nfs/pnfs.c +3 -5
@@ -1185,13 +1185,11 @@ bool pnfs_wait_on_layoutreturn(struct inode *ino, struct rpc_task *task)* i_lock */ spin_lock (&ino->i_lock); lo = nfsi->layout; -if (lo &&test_bit (NFS_LAYOUT_RETURN , &lo->plh_flags)) +if (lo &&test_bit (NFS_LAYOUT_RETURN , &lo->plh_flags)) { +rpc_sleep_on (&NFS_SERVER (ino)->roc_rpcwaitq, task,NULL ); sleep = true; + }spin_unlock (&ino->i_lock); - -if (sleep) -rpc_sleep_on (&NFS_SERVER (ino)->roc_rpcwaitq, task,NULL ); -return sleep; }
fs/ocfs2/dlmglue.c +10 -0
@@ -3321,6 +3321,16 @@ static int ocfs2_downconvert_lock(struct ocfs2_super *osb,mlog (ML_BASTS ,"lockres %s, level %d => %d\n" , lockres->l_name, lockres->l_level, new_level); +/* +* On DLM_LKF_VALBLK, fsdlm behaves differently with o2cb. It always +* expects DLM_LKF_VALBLK being set if the LKB has LVB, so that +* we can recover correctly from node failure. Otherwise, we may get +* invalid LVB in LKB, but without DLM_SBF_VALNOTVALID�being set. +*/ +if (!ocfs2_is_o2cb_active () && + lockres->l_ops->flags &LOCK_TYPE_USES_LVB ) + lvb =1 ; +if (lvb) dlm_flags |=DLM_LKF_VALBLK ;
fs/ocfs2/stackglue.c +6 -0
@@ -48,6 +48,12 @@ static char ocfs2_hb_ctl_path[OCFS2_MAX_HB_CTL_PATH] = "/sbin/ocfs2_hb_ctl";*/ static struct ocfs2_stack_plugin *active_stack; +inline int ocfs2_is_o2cb_active (void ) +{ +return !strcmp (active_stack->sp_name,OCFS2_STACK_PLUGIN_O2CB ); +} +EXPORT_SYMBOL_GPL (ocfs2_is_o2cb_active); +static struct ocfs2_stack_plugin *ocfs2_stack_lookup (const char *name) {struct ocfs2_stack_plugin *p;
fs/ocfs2/stackglue.h +3 -0
@@ -298,4 +298,7 @@ void ocfs2_stack_glue_set_max_proto_version(struct ocfs2_protocol_version *max_pint ocfs2_stack_glue_register (struct ocfs2_stack_plugin *plugin);void ocfs2_stack_glue_unregister (struct ocfs2_stack_plugin *plugin); +/* In ocfs2_downconvert_lock(), we need to know which stack we are using */ +int ocfs2_is_o2cb_active (void ); +#endif /* STACKGLUE_H */
fs/proc/proc_sysctl.c +2 -1
@@ -703,7 +703,7 @@ static int proc_sys_readdir(struct file *file, struct dir_context *ctx) ctl_dir = container_of(head, struct ctl_dir, header);if (!dir_emit_dots (file, ctx)) -return 0 ; + goto out; pos =2 ;
@@ -713,6 +713,7 @@ static int proc_sys_readdir(struct file *file, struct dir_context *ctx)break ; } } +out:sysctl_head_finish (head);return 0 ; }
include/linux/jump_label_ratelimit.h +5 -0
@@ -14,6 +14,7 @@ struct static_key_deferred {#ifdef HAVE_JUMP_LABEL extern void static_key_slow_dec_deferred (struct static_key_deferred *key); +extern void static_key_deferred_flush (struct static_key_deferred *key);extern void jump_label_rate_limit (struct static_key_deferred *key,unsigned long rl);
@@ -26,6 +27,10 @@ static inline void static_key_slow_dec_deferred(struct static_key_deferred *key)STATIC_KEY_CHECK_USE ();static_key_slow_dec (&key->key); } +static inline void static_key_deferred_flush (struct static_key_deferred *key) +{ +STATIC_KEY_CHECK_USE (); +}static inline void jump_label_rate_limit (struct static_key_deferred *key,unsigned long rl)
kernel/jump_label.c +7 -0
@@ -138,6 +138,13 @@ void static_key_slow_dec_deferred(struct static_key_deferred *key) }EXPORT_SYMBOL_GPL (static_key_slow_dec_deferred); +void static_key_deferred_flush (struct static_key_deferred *key) +{ +STATIC_KEY_CHECK_USE (); +flush_delayed_work (&key->work); +} +EXPORT_SYMBOL_GPL (static_key_deferred_flush); +void jump_label_rate_limit (struct static_key_deferred *key,unsigned long rl) {
kernel/memremap.c +4 -0
@@ -159,7 +159,9 @@ static void devm_memremap_pages_release(struct device *dev, void *res)struct page_map *page_map = res;/* pages are dead and unused, undo the arch mapping */ +mem_hotplug_begin ();arch_remove_memory (page_map->res.start,resource_size (&page_map->res)); +mem_hotplug_done (); }void *devm_memremap_pages (struct device *dev,struct resource *res)
@@ -189,7 +191,9 @@ void *devm_memremap_pages(struct device *dev, struct resource *res)if (nid <0 ) nid =numa_mem_id (); +mem_hotplug_begin (); error =arch_add_memory (nid, res->start,resource_size (res), true); +mem_hotplug_done ();if (error) {devres_free (page_map);return ERR_PTR (error);
mm/hugetlb.c +28 -9
@@ -1723,23 +1723,32 @@ free: }/* -* When releasing a hugetlb pool reservation, any surplus pages that were -* allocated to satisfy the reservation must be explicitly freed if they were -* never used. -* Called with hugetlb_lock held. +* This routine has two main purposes: +* 1) Decrement the reservation count (resv_huge_pages) by the value passed +* in unused_resv_pages. This corresponds to the prior adjustments made +* to the associated reservation map. +* 2) Free any unused surplus pages that may have been allocated to satisfy +* the reservation. As many as unused_resv_pages may be freed. +* +* Called with hugetlb_lock held. However, the lock could be dropped (and +* reacquired) during calls to cond_resched_lock. Whenever dropping the lock, +* we must make sure nobody else can claim pages we are in the process of +* freeing. Do this by ensuring resv_huge_page always is greater than the +* number of huge pages we plan to free when dropping the lock. */ static void return_unused_surplus_pages (struct hstate *h,unsigned long unused_resv_pages) {unsigned long nr_pages; -/* Uncommit the reservation */ - h->resv_huge_pages -= unused_resv_pages; -/* Cannot return gigantic pages currently */ if (hstate_is_gigantic (h)) -return ; + goto out; +/* +* Part (or even all) of the reservation could have been backed +* by pre-allocated pages. Only free surplus pages. +*/ nr_pages =min (unused_resv_pages, h->surplus_huge_pages);/*
@@ -1749,12 +1758,22 @@ static void return_unused_surplus_pages(struct hstate *h,* when the nodes with surplus pages have no free pages. * free_pool_huge_page() will balance the the freed pages across the * on-line nodes with memory and will handle the hstate accounting. +* +* Note that we decrement resv_huge_pages as we free the pages. If +* we drop the lock, resv_huge_pages will still be sufficiently large +* to cover subsequent pages we may free. */ while (nr_pages--) { + h->resv_huge_pages--; + unused_resv_pages--;if (!free_pool_huge_page (h, &node_states[N_MEMORY ],1 )) -break ; + goto out;cond_resched_lock (&hugetlb_lock); } + +out: +/* Fully uncommit the reservation */ + h->resv_huge_pages -= unused_resv_pages; }
net/wireless/nl80211.c +7 -9
@@ -13168,13 +13168,17 @@ static int nl80211_netlink_notify(struct notifier_block * nb,list_for_each_entry_rcu (rdev, &cfg80211_rdev_list, list) {bool schedule_destroy_work = false; -bool schedule_scan_stop = false;struct cfg80211_sched_scan_request *sched_scan_req =rcu_dereference (rdev->sched_scan_req);if (sched_scan_req && notify->portid && - sched_scan_req->owner_nlportid == notify->portid) - schedule_scan_stop = true; + sched_scan_req->owner_nlportid == notify->portid) { + sched_scan_req->owner_nlportid =0 ; + +if (rdev->ops->sched_scan_stop && + rdev->wiphy.flags &WIPHY_FLAG_SUPPORTS_SCHED_SCAN ) +schedule_work (&rdev->sched_scan_stop_wk); + }list_for_each_entry_rcu (wdev, &rdev->wdev_list, list) {cfg80211_mlme_unregister_socket (wdev, notify->portid);
@@ -13205,12 +13209,6 @@ static int nl80211_netlink_notify(struct notifier_block * nb,spin_unlock (&rdev->destroy_list_lock);schedule_work (&rdev->destroy_work); } - }else if (schedule_scan_stop) { - sched_scan_req->owner_nlportid =0 ; - -if (rdev->ops->sched_scan_stop && - rdev->wiphy.flags &WIPHY_FLAG_SUPPORTS_SCHED_SCAN ) -schedule_work (&rdev->sched_scan_stop_wk); } }
tools/testing/selftests/Makefile +1 -1
@@ -83,7 +83,7 @@ ifdef INSTALL_PATH done; @# Ask all targets to emit their test scripts - echo "#!/bin/bash" > $(ALL_SCRIPT) + echo "#!/bin/sh" > $(ALL_SCRIPT) echo "cd \$$(dirname \$$0)" >> $(ALL_SCRIPT) echo "ROOT=\$$PWD" >> $(ALL_SCRIPT)
tools/testing/selftests/net/run_netsocktests +1 -1
@@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh echo "--------------------" echo "running socket test"
virt/lib/irqbypass.c +2 -2
@@ -188,7 +188,7 @@ int irq_bypass_register_consumer(struct irq_bypass_consumer *consumer)mutex_lock (&lock);list_for_each_entry (tmp, &consumers, node) { -if (tmp->token == consumer->token) { +if (tmp->token == consumer->token || tmp == consumer) {mutex_unlock (&lock);module_put (THIS_MODULE );return -EBUSY ;
@@ -235,7 +235,7 @@ void irq_bypass_unregister_consumer(struct irq_bypass_consumer *consumer)mutex_lock (&lock);list_for_each_entry (tmp, &consumers, node) { -if (tmp->token != consumer->token) +if (tmp != consumer)continue ;list_for_each_entry (producer, &producers, node) {