Linux 4.9.59
Greg KH
maintainerI'm announcing the release of the 4.9.59 kernel.
All users of the 4.9 kernel series must upgrade.
The updated 4.9.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.9.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/parisc/kernel/syscall.S | 6 arch/x86/kernel/cpu/microcode/intel.c | 19 + crypto/asymmetric_keys/pkcs7_parser.c | 3 drivers/bus/mvebu-mbus.c | 2 drivers/clocksource/cs5535-clockevt.c | 3 drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c | 2 drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.c | 2 drivers/i2c/busses/i2c-ismt.c | 5 drivers/i2c/busses/i2c-piix4.c | 30 + drivers/iio/dummy/iio_simple_dummy_events.c | 1 drivers/net/can/usb/esd_usb2.c | 2 drivers/net/can/usb/gs_usb.c | 10 drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c | 3 drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c | 197 +++++------ drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c | 2 drivers/usb/class/cdc-acm.c | 3 drivers/usb/core/config.c | 6 drivers/usb/core/devio.c | 6 drivers/usb/core/hub.c | 11 drivers/usb/core/quirks.c | 4 drivers/usb/host/xhci.c | 3 drivers/usb/musb/musb_core.c | 6 drivers/usb/musb/sunxi.c | 2 drivers/usb/serial/metro-usb.c | 1 fs/crypto/keyinfo.c | 5 fs/fscache/object-list.c | 7 fs/xfs/libxfs/xfs_ag_resv.c | 12 fs/xfs/libxfs/xfs_alloc.c | 8 fs/xfs/libxfs/xfs_bmap.c | 11 fs/xfs/libxfs/xfs_bmap.h | 1 fs/xfs/libxfs/xfs_log_format.h | 27 - fs/xfs/xfs_acl.c | 22 - fs/xfs/xfs_aops.c | 72 ++-- fs/xfs/xfs_attr_inactive.c | 2 fs/xfs/xfs_bmap_util.c | 40 ++ fs/xfs/xfs_bmap_util.h | 13 fs/xfs/xfs_error.c | 2 fs/xfs/xfs_file.c | 2 fs/xfs/xfs_inode.c | 8 fs/xfs/xfs_inode_item.c | 86 ++-- fs/xfs/xfs_iomap.c | 7 fs/xfs/xfs_iomap.h | 2 fs/xfs/xfs_ondisk.h | 2 fs/xfs/xfs_pnfs.c | 2 fs/xfs/xfs_reflink.c | 9 include/linux/hyperv.h | 4 include/linux/key.h | 47 +- include/linux/mbus.h | 4 lib/digsig.c | 6 net/dns_resolver/dns_key.c | 2 security/keys/big_key.c | 4 security/keys/encrypted-keys/encrypted.c | 9 security/keys/gc.c | 8 security/keys/key.c | 41 +- security/keys/keyctl.c | 9 security/keys/keyring.c | 10 security/keys/proc.c | 7 security/keys/process_keys.c | 2 security/keys/request_key.c | 7 security/keys/request_key_auth.c | 2 security/keys/trusted.c | 2 security/keys/user_defined.c | 4 sound/core/seq/seq_lock.c | 4 sound/core/seq/seq_lock.h | 12 sound/hda/hdac_controller.c | 5 sound/pci/hda/hda_codec.c | 2 sound/usb/quirks.c | 1 68 files changed, 542 insertions(+), 321 deletions(-)
Alan Stern (1):
USB: core: fix out-of-bounds access bug in usb_get_bos_descriptor()
Arnd Bergmann (1):
brcmsmac: make some local variables 'static const' to reduce stack size
Ben Hutchings (1):
ALSA: seq: Enable 'use' locking in all configurations
Ben Skeggs (1):
drm/nouveau/mmu: flush tlbs before deleting page tables
Borislav Petkov (1):
x86/microcode/intel: Disable late loading on model 79
Brian Foster (2):
xfs: reinit btree pointer on attr tree inactivation walk
xfs: trim writepage mapping to within eof
Carlos Maiolino (1):
xfs: Capture state of the right inode in xfs_iflush_done
Christoph Hellwig (1):
xfs: handle racy AIO in xfs_reflink_end_cow
Darrick J. Wong (4):
xfs: don't unconditionally clear the reflink flag on zero-block files
xfs: evict CoW fork extents when performing finsert/fcollapse
xfs: perag initialization should only touch m_ag_max_usable for AG 0
xfs: always swap the cow forks when swapping extents
Dave Chinner (4):
xfs: Don't log uninitialised fields in inode structures
xfs: move more RT specific code under CONFIG_XFS_RT
xfs: don't change inode mode if ACL update fails
xfs: cancel dirty pages on invalidation
David Howells (2):
KEYS: don't let add_key() update an uninstantiated key
KEYS: Fix race between updating and finding a negative key
David Kozub (1):
clockevents/drivers/cs5535: Improve resilience to spurious interrupts
Dexuan Cui (1):
vmbus: fix missing signaling in hv_signal_on_read()
Eric Biggers (4):
KEYS: encrypted: fix dereference of NULL user_key_payload lib/digsig: fix dereference of NULL user_key_payload
fscrypt: fix dereference of NULL user_key_payload
FS-Cache: fix dereference of NULL user_key_payload
Eric Sandeen (1):
xfs: handle error if xfs_btree_get_bufs fails
Eric Sesterhenn (1):
pkcs7: Prevent NULL pointer dereference, since sinfo is not always set.
Eryu Guan (2):
xfs: report zeroed or not correctly in xfs_zero_range()
xfs: update i_size after unwritten conversion in dio completion
Felipe Balbi (1):
usb: quirks: add quirk for WORLDE MINI MIDI keyboard
Greg Kroah-Hartman (1):
Linux 4.9.59
Guenter Roeck (1):
i2c: piix4: Fix SMBus port selection for AMD Family 17h chips
Hans de Goede (1):
USB: devio: Revert "USB: devio: Don't corrupt user memory"
Helge Deller (1):
fs/xfs: Use %pS printk format for direct addresses
Ilia Mirkin (1):
drm/nouveau/bsp/g92: disable by default
Jan Luebbe (1):
bus: mbus: fix window size calculation for 4GB windows
Johan Hovold (1):
USB: serial: metro-usb: add MS7820 device id
John David Anglin (1):
parisc: Fix double-word compare and exchange in LWS code on 32-bit kernels
Jonathan Liu (2):
usb: musb: sunxi: Explicitly release USB PHY on exit
usb: musb: Check for host-mode using is_host_active() on reset interrupt
Jussi Laako (1):
ALSA: usb-audio: Add native DSD support for Pro-Ject Pre Box S2 Digital
Kevin Cernekee (1):
brcmfmac: Add check for short event packets
Larry Finger (1):
rtlwifi: rtl8821ae: Fix connection lost problem
Lars-Peter Clausen (1):
iio: dummy: events: Add missing break
Maksim Salau (1):
usb: cdc_acm: Add quirk for Elatec TWN3
Mathias Nyman (2):
usb: hub: Allow reset retry for USB2 devices on connect bounce
xhci: Identify USB 3.1 capable hosts by their port protocol capability
Pontus Andersson (1):
i2c: ismt: Separate I2C block read from SMBus block read
Stefan Mätje (1):
can: esd_usb2: Fix can_dlc value for received RTR, frames
Takashi Iwai (2):
ALSA: hda: Remove superfluous '-' added by printk conversion
ALSA: hda: Abort capability probe at invalid register read
Wolfgang Grandegger (1):
can: gs_usb: fix busy loop if no more TX context is available
Greg KH
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 9 -SUBLEVEL = 58 +SUBLEVEL = 59 EXTRAVERSION = NAME = Roaring Lionus
arch/parisc/kernel/syscall.S +3 -3
@@ -742,7 +742,7 @@ lws_compare_and_swap_2: 10: ldd 0(%r25), %r25 11: ldd 0(%r24), %r24 #else - /* Load new value into r22/r23 - high/low */ + /* Load old value into r22/r23 - high/low */ 10: ldw 0(%r25), %r22 11: ldw 4(%r25), %r23 /* Load new value into fr4 for atomic store later */
@@ -834,11 +834,11 @@ cas2_action: copy %r0, %r28 #else /* Compare first word */ -19: ldw,ma 0(%r26), %r29 +19: ldw 0(%r26), %r29 sub,= %r29, %r22, %r0 b,n cas2_end /* Compare second word */ -20: ldw,ma 4(%r26), %r29 +20: ldw 4(%r26), %r29 sub,= %r29, %r23, %r0 b,n cas2_end /* Perform the store */
arch/x86/kernel/cpu/microcode/intel.c +19 -0
@@ -34,6 +34,7 @@#include <linux/mm.h> #include <asm/microcode_intel.h> +#include <asm/intel-family.h> #include <asm/processor.h> #include <asm/tlbflush.h> #include <asm/setup.h>
@@ -1046,6 +1047,18 @@ static int get_ucode_fw(void *to, const void *from, size_t n)return 0 ; } +static bool is_blacklisted (unsigned int cpu) +{ +struct cpuinfo_x86 *c = &cpu_data (cpu); + +if (c->x86 ==6 && c->x86_model ==INTEL_FAM6_BROADWELL_X ) { +pr_err_once ("late loading on model 79 is disabled.\n" ); +return true; + } + +return false; +} +static enum ucode_state request_microcode_fw (int cpu,struct device *device,bool refresh_fw) {
@@ -1054,6 +1067,9 @@ static enum ucode_state request_microcode_fw(int cpu, struct device *device,const struct firmware *firmware;enum ucode_state ret; +if (is_blacklisted (cpu)) +return UCODE_NFOUND ; +sprintf (name,"intel-ucode/%02x-%02x-%02x" , c->x86, c->x86_model, c->x86_mask);
@@ -1078,6 +1094,9 @@ static int get_ucode_user(void *to, const void *from, size_t n)static enum ucode_state request_microcode_user (int cpu,const void __user *buf,size_t size) { +if (is_blacklisted (cpu)) +return UCODE_NFOUND ; +return generic_load_microcode (cpu, (void *)buf, size, &get_ucode_user); }
crypto/asymmetric_keys/pkcs7_parser.c +3 -0
@@ -88,6 +88,9 @@ static int pkcs7_check_authattrs(struct pkcs7_message *msg)bool want = false; sinfo = msg->signed_infos; +if (!sinfo) + goto inconsistent; +if (sinfo->authattrs) { want = true; msg->have_authattrs = true;
drivers/bus/mvebu-mbus.c +1 -1
@@ -720,7 +720,7 @@ mvebu_mbus_default_setup_cpu_target(struct mvebu_mbus_state *mbus)if (mbus->hw_io_coherency) w->mbus_attr |=ATTR_HW_COHERENCY ; w->base = base &DDR_BASE_CS_LOW_MASK ; - w->size = (size | ~DDR_SIZE_MASK ) +1 ; + w->size = (u64)(size | ~DDR_SIZE_MASK ) +1 ; } } mvebu_mbus_dram_info.num_cs = cs;
drivers/clocksource/cs5535-clockevt.c +2 -1
@@ -117,7 +117,8 @@ static irqreturn_t mfgpt_tick(int irq, void *dev_id)/* Turn off the clock (and clear the event) */ disable_timer (cs5535_event_clock); -if (clockevent_state_shutdown (&cs5535_clockevent)) +if (clockevent_state_detached (&cs5535_clockevent) || +clockevent_state_shutdown (&cs5535_clockevent))return IRQ_HANDLED ;/* Clear the counter */
drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c +1 -1
@@ -39,5 +39,5 @@ int g84_bsp_new(struct nvkm_device *device, int index, struct nvkm_engine **pengine) { return nvkm_xtensa_new_(&g84_bsp, device, index, - true, 0x103000, pengine); + device->chipset != 0x92, 0x103000, pengine); }
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.c +2 -0
@@ -240,6 +240,8 @@ nvkm_vm_unmap_pgt(struct nvkm_vm *vm, int big, u32 fpde, u32 lpde) mmu->func->map_pgt (vpgd->obj, pde, vpgt->mem); } + mmu->func->flush (vm); +nvkm_memory_del (&pgt); } }
drivers/i2c/busses/i2c-ismt.c +4 -1
@@ -340,12 +340,15 @@ static int ismt_process_desc(const struct ismt_desc *desc, data->word = dma_buffer[0 ] | (dma_buffer[1 ] <<8 );break ;case I2C_SMBUS_BLOCK_DATA : -case I2C_SMBUS_I2C_BLOCK_DATA :if (desc->rxbytes != dma_buffer[0 ] +1 )return -EMSGSIZE ;memcpy (data->block, dma_buffer, desc->rxbytes);break ; +case I2C_SMBUS_I2C_BLOCK_DATA : +memcpy (&data->block[1 ], dma_buffer, desc->rxbytes); + data->block[0 ] = desc->rxbytes; +break ; }return 0 ; }
drivers/i2c/busses/i2c-piix4.c +26 -4
@@ -94,6 +94,12 @@#define SB800_PIIX4_PORT_IDX_ALT 0x2e#define SB800_PIIX4_PORT_IDX_SEL 0x2f#define SB800_PIIX4_PORT_IDX_MASK 0x06 +#define SB800_PIIX4_PORT_IDX_SHIFT 1 + +/* On kerncz, SmBus0Sel is at bit 20:19 of PMx00 DecodeEn */ +#define SB800_PIIX4_PORT_IDX_KERNCZ 0x02 +#define SB800_PIIX4_PORT_IDX_MASK_KERNCZ 0x18 +#define SB800_PIIX4_PORT_IDX_SHIFT_KERNCZ 3/* insmod parameters */
@@ -149,6 +155,8 @@ static const struct dmi_system_id piix4_dmi_ibm[] = {*/ static DEFINE_MUTEX (piix4_mutex_sb800);static u8 piix4_port_sel_sb800; +static u8 piix4_port_mask_sb800; +static u8 piix4_port_shift_sb800;static const char *piix4_main_port_names_sb800[PIIX4_MAX_ADAPTERS ] = {" port 0" ," port 2" ," port 3" ," port 4" };
@@ -347,7 +355,19 @@ static int piix4_setup_sb800(struct pci_dev *PIIX4_dev,/* Find which register is used for port selection */ if (PIIX4_dev->vendor ==PCI_VENDOR_ID_AMD ) { - piix4_port_sel_sb800 =SB800_PIIX4_PORT_IDX_ALT ; +switch (PIIX4_dev->device) { +case PCI_DEVICE_ID_AMD_KERNCZ_SMBUS : + piix4_port_sel_sb800 =SB800_PIIX4_PORT_IDX_KERNCZ ; + piix4_port_mask_sb800 =SB800_PIIX4_PORT_IDX_MASK_KERNCZ ; + piix4_port_shift_sb800 =SB800_PIIX4_PORT_IDX_SHIFT_KERNCZ ; +break ; +case PCI_DEVICE_ID_AMD_HUDSON2_SMBUS : +default : + piix4_port_sel_sb800 =SB800_PIIX4_PORT_IDX_ALT ; + piix4_port_mask_sb800 =SB800_PIIX4_PORT_IDX_MASK ; + piix4_port_shift_sb800 =SB800_PIIX4_PORT_IDX_SHIFT ; +break ; + } }else {mutex_lock (&piix4_mutex_sb800);outb_p (SB800_PIIX4_PORT_IDX_SEL ,SB800_PIIX4_SMB_IDX );
@@ -355,6 +375,8 @@ static int piix4_setup_sb800(struct pci_dev *PIIX4_dev, piix4_port_sel_sb800 = (port_sel &0x01 ) ?SB800_PIIX4_PORT_IDX_ALT :SB800_PIIX4_PORT_IDX ; + piix4_port_mask_sb800 =SB800_PIIX4_PORT_IDX_MASK ; + piix4_port_shift_sb800 =SB800_PIIX4_PORT_IDX_SHIFT ;mutex_unlock (&piix4_mutex_sb800); }
@@ -616,8 +638,8 @@ static s32 piix4_access_sb800(struct i2c_adapter *adap, u16 addr, smba_en_lo =inb_p (SB800_PIIX4_SMB_IDX +1 ); port = adapdata->port; -if ((smba_en_lo &SB800_PIIX4_PORT_IDX_MASK ) != port) -outb_p ((smba_en_lo & ~SB800_PIIX4_PORT_IDX_MASK ) | port, +if ((smba_en_lo & piix4_port_mask_sb800) != port) +outb_p ((smba_en_lo & ~piix4_port_mask_sb800) | port,SB800_PIIX4_SMB_IDX +1 ); retval = piix4_access(adap, addr, flags, read_write,
@@ -706,7 +728,7 @@ static int piix4_add_adapter(struct pci_dev *dev, unsigned short smba, adapdata->smba = smba; adapdata->sb800_main = sb800_main; - adapdata->port = port <<1 ; + adapdata->port = port << piix4_port_shift_sb800;/* set up the sysfs linkage to our parent device */ adap->dev.parent = &dev->dev;
drivers/iio/dummy/iio_simple_dummy_events.c +1 -0
@@ -72,6 +72,7 @@ int iio_simple_dummy_write_event_config(struct iio_dev *indio_dev, st->event_en = state; else return -EINVAL; +break ;default :return -EINVAL ; }
drivers/net/can/usb/esd_usb2.c +1 -1
@@ -333,7 +333,7 @@ static void esd_usb2_rx_can_msg(struct esd_usb2_net_priv *priv, } cf->can_id = id &ESD_IDMASK ; - cf->can_dlc =get_can_dlc (msg->msg.rx.dlc); + cf->can_dlc =get_can_dlc (msg->msg.rx.dlc & ~ESD_RTR );if (id &ESD_EXTID ) cf->can_id |=CAN_EFF_FLAG ;
drivers/net/can/usb/gs_usb.c +2 -8
@@ -375,6 +375,8 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)gs_free_tx_context (txc); +atomic_dec (&dev->active_tx_urbs); +netif_wake_queue (netdev); }
@@ -463,14 +465,6 @@ static void gs_usb_xmit_callback(struct urb *urb) urb->transfer_buffer_length, urb->transfer_buffer, urb->transfer_dma); - -atomic_dec (&dev->active_tx_urbs); - -if (!netif_device_present (netdev)) -return ; - -if (netif_queue_stopped (netdev)) -netif_wake_queue (netdev); } static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb,
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c +2 -1
@@ -429,7 +429,8 @@ void brcmf_fweh_process_event(struct brcmf_pub *drvr,if (code !=BRCMF_E_IF && !fweh->evt_handler[code])return ; -if (datalen >BRCMF_DCMD_MAXLEN ) +if (datalen >BRCMF_DCMD_MAXLEN || + datalen +sizeof (*event_packet) > packet_len)return ;if (in_interrupt ())
drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c +97 -100
374 lines not on this page · raw message
drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c +1 -1
@@ -1128,7 +1128,7 @@ static u8 _rtl8821ae_dbi_read(struct rtl_priv *rtlpriv, u16 addr) }if (0 == tmp) { read_addr =REG_DBI_RDATA + addr %4 ; - ret =rtl_read_byte (rtlpriv, read_addr); + ret =rtl_read_word (rtlpriv, read_addr); }return ret; }
drivers/usb/class/cdc-acm.c +3 -0
@@ -1773,6 +1773,9 @@ static const struct usb_device_id acm_ids[] = { { USB_DEVICE(0xfff0, 0x0100), /* DATECS FP-2000 */ .driver_info =NO_UNION_NORMAL ,/* reports zero length descriptor */ }, + { USB_DEVICE(0x09d8, 0x0320), /* Elatec GmbH TWN3 */ + .driver_info = NO_UNION_NORMAL, /* has misplaced union descriptor */ + }, { USB_DEVICE(0x2912, 0x0001), /* ATOL FPrint */ .driver_info = CLEAR_HALT_CONDITIONS,
drivers/usb/core/config.c +4 -2
@@ -955,10 +955,12 @@ int usb_get_bos_descriptor(struct usb_device *dev)for (i =0 ; i < num; i++) { buffer += length; cap = (struct usb_dev_cap_header *)buffer; - length = cap->bLength; -if (total_len < length) +if (total_len <sizeof (*cap) || total_len < cap->bLength) { + dev->bos->desc->bNumDeviceCaps = i;break ; + } + length = cap->bLength; total_len -= length;if (cap->bDescriptorType !=USB_DT_DEVICE_CAPABILITY ) {
drivers/usb/core/devio.c +1 -5
@@ -1577,11 +1577,7 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb totlen += isopkt[u].length; } u *=sizeof (struct usb_iso_packet_descriptor ); -if (totlen <= uurb->buffer_length) - uurb->buffer_length = totlen; -else -WARN_ONCE (1 ,"uurb->buffer_length is too short %d vs %d" , - totlen, uurb->buffer_length); + uurb->buffer_length = totlen;break ;default :
drivers/usb/core/hub.c +7 -4
@@ -2704,13 +2704,16 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1,if (!(portstatus &USB_PORT_STAT_CONNECTION ))return -ENOTCONN ; -/* bomb out completely if the connection bounced. A USB 3.0 -* connection may bounce if multiple warm resets were issued, +/* Retry if connect change is set but status is still connected. +* A USB 3.0 connection may bounce if multiple warm resets were issued, * but the device may have successfully re-connected. Ignore it. */ if (!hub_is_superspeed (hub->hdev) && - (portchange &USB_PORT_STAT_C_CONNECTION )) -return -ENOTCONN ; + (portchange &USB_PORT_STAT_C_CONNECTION )) { +usb_clear_port_feature (hub->hdev, port1, +USB_PORT_FEAT_C_CONNECTION ); +return -EAGAIN ; + }if (!(portstatus &USB_PORT_STAT_ENABLE ))return -EBUSY ;
drivers/usb/core/quirks.c +4 -0
@@ -221,6 +221,10 @@ static const struct usb_device_id usb_quirk_list[] = {/* Corsair Strafe RGB */ { USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT }, + /* MIDI keyboard WORLDE MINI */ + { USB_DEVICE(0x1c75, 0x0204), .driver_info = + USB_QUIRK_CONFIG_INTF_STRINGS }, + /* Acer C120 LED Projector */ { USB_DEVICE(0x1de1, 0xc102), .driver_info = USB_QUIRK_NO_LPM },
drivers/usb/host/xhci.c +2 -1
@@ -4855,7 +4855,8 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)*/ hcd->has_tt =1 ; }else { -if (xhci->sbrn ==0x31 ) { +/* Some 3.1 hosts return sbrn 0x30, can't rely on sbrn alone */ +if (xhci->sbrn ==0x31 || xhci->usb3_rhub.min_rev >=1 ) {xhci_info (xhci,"Host supports USB 3.1 Enhanced SuperSpeed\n" ); hcd->speed =HCD_USB31 ; hcd->self.root_hub->speed =USB_SPEED_SUPER_PLUS ;
drivers/usb/musb/musb_core.c +2 -4
@@ -890,7 +890,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,*/ if (int_usb &MUSB_INTR_RESET ) { handled =IRQ_HANDLED ; -if (devctl &MUSB_DEVCTL_HM ) { +if (is_host_active (musb)) {/* * When BABBLE happens what we can depends on which * platform MUSB is running, because some platforms
@@ -900,9 +900,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,* drop the session. */ dev_err (musb->controller,"Babble\n" ); - -if (is_host_active (musb)) -musb_recover_from_babble (musb); +musb_recover_from_babble (musb); }else {musb_dbg (musb,"BUS RESET as %s" ,usb_otg_state_string (musb->xceiv->otg->state));
drivers/usb/musb/sunxi.c +2 -0
@@ -313,6 +313,8 @@ static int sunxi_musb_exit(struct musb *musb)if (test_bit (SUNXI_MUSB_FL_HAS_SRAM , &glue->flags))sunxi_sram_release (musb->controller->parent); +devm_usb_put_phy (glue->dev, glue->xceiv); +return 0 ; }
drivers/usb/serial/metro-usb.c +1 -0
@@ -45,6 +45,7 @@ struct metrousb_private {static const struct usb_device_id id_table[] = { {USB_DEVICE (FOCUS_VENDOR_ID ,FOCUS_PRODUCT_ID_BI ) }, {USB_DEVICE (FOCUS_VENDOR_ID ,FOCUS_PRODUCT_ID_UNI ) }, + {USB_DEVICE_INTERFACE_CLASS (0x0c2e ,0x0730 ,0xff ) },/* MS7820 */ { },/* Terminating entry. */ };MODULE_DEVICE_TABLE (usb, id_table);
fs/crypto/keyinfo.c +5 -0
@@ -108,6 +108,11 @@ static int validate_user_key(struct fscrypt_info *crypt_info, goto out; } ukp =user_key_payload (keyring_key); +if (!ukp) { +/* key was revoked before we acquired its semaphore */ + res = -EKEYREVOKED ; + goto out; + }if (ukp->datalen !=sizeof (struct fscrypt_key )) { res = -EINVAL ; goto out;
fs/fscache/object-list.c +7 -0
@@ -330,6 +330,13 @@ static void fscache_objlist_config(struct fscache_objlist_data *data)rcu_read_lock (); confkey =user_key_payload (key); +if (!confkey) { +/* key was revoked */ +rcu_read_unlock (); +key_put (key); + goto no_config; + } + buf = confkey->data;for (len = confkey->datalen -1 ; len >=0 ; len--) {
fs/xfs/libxfs/xfs_ag_resv.c +10 -2
@@ -157,7 +157,8 @@ __xfs_ag_resv_free(trace_xfs_ag_resv_free (pag, type,0 ); resv =xfs_perag_resv (pag, type); - pag->pag_mount->m_ag_max_usable += resv->ar_asked; +if (pag->pag_agno ==0 ) + pag->pag_mount->m_ag_max_usable += resv->ar_asked;/* * AGFL blocks are always considered "free", so whatever * was reserved at mount time must be given back at umount.
@@ -217,7 +218,14 @@ __xfs_ag_resv_init(return error; } - mp->m_ag_max_usable -= ask; +/* +* Reduce the maximum per-AG allocation length by however much we're +* trying to reserve for an AG. Since this is a filesystem-wide +* counter, we only make the adjustment for AG 0. This assumes that +* there aren't any AGs hungrier for per-AG reservation than AG 0. +*/ +if (pag->pag_agno ==0 ) + mp->m_ag_max_usable -= ask; resv =xfs_perag_resv (pag, type); resv->ar_asked = ask;
fs/xfs/libxfs/xfs_alloc.c +8 -0
@@ -1579,6 +1579,10 @@ xfs_alloc_ag_vextent_small( bp =xfs_btree_get_bufs (args->mp, args->tp, args->agno, fbno,0 ); +if (!bp) { + error = -EFSCORRUPTED ; + goto error0; + }xfs_trans_binval (args->tp, bp); } args->len =1 ;
@@ -2136,6 +2140,10 @@ xfs_alloc_fix_freelist(if (error) goto out_agbp_relse; bp =xfs_btree_get_bufs (mp, tp, args->agno, bno,0 ); +if (!bp) { + error = -EFSCORRUPTED ; + goto out_agbp_relse; + }xfs_trans_binval (tp, bp); }
fs/xfs/libxfs/xfs_bmap.c +11 -0
@@ -4057,6 +4057,17 @@ xfs_trim_extent( } } +/* trim extent to within eof */ +void +xfs_trim_extent_eof ( +struct xfs_bmbt_irec *irec, +struct xfs_inode *ip) + +{ +xfs_trim_extent (irec,0 ,XFS_B_TO_FSB (ip->i_mount, +i_size_read (VFS_I (ip)))); +} +/* * Trim the returned map to the required bounds */
fs/xfs/libxfs/xfs_bmap.h +1 -0
@@ -196,6 +196,7 @@ void xfs_bmap_trace_exlist(struct xfs_inode *ip, xfs_extnum_t cnt,void xfs_trim_extent (struct xfs_bmbt_irec *irec,xfs_fileoff_t bno,xfs_filblks_t len); +void xfs_trim_extent_eof (struct xfs_bmbt_irec *,struct xfs_inode *);int xfs_bmap_add_attrfork (struct xfs_inode *ip,int size,int rsvd);void xfs_bmap_local_to_extents_empty (struct xfs_inode *ip,int whichfork); void xfs_bmap_add_free(struct xfs_mount *mp, struct xfs_defer_ops *dfops,
fs/xfs/libxfs/xfs_log_format.h +8 -19
@@ -270,6 +270,7 @@ typedef struct xfs_inode_log_format {__uint32_t ilf_fields;/* flags for fields logged */ __uint16_t ilf_asize;/* size of attr d/ext/root */ __uint16_t ilf_dsize;/* size of data/ext/root */ +__uint32_t ilf_pad;/* pad for 64 bit boundary */ __uint64_t ilf_ino;/* inode number */ union {__uint32_t ilfu_rdev;/* rdev value for dev inode*/
@@ -280,29 +281,17 @@ typedef struct xfs_inode_log_format {__int32_t ilf_boffset;/* off of inode in buffer */ } xfs_inode_log_format_t; -typedef struct xfs_inode_log_format_32 { -__uint16_t ilf_type;/* inode log item type */ -__uint16_t ilf_size;/* size of this item */ -__uint32_t ilf_fields;/* flags for fields logged */ -__uint16_t ilf_asize;/* size of attr d/ext/root */ -__uint16_t ilf_dsize;/* size of data/ext/root */ -__uint64_t ilf_ino;/* inode number */ -union { -__uint32_t ilfu_rdev;/* rdev value for dev inode*/ -uuid_t ilfu_uuid;/* mount point value */ - } ilf_u; -__int64_t ilf_blkno;/* blkno of inode buffer */ -__int32_t ilf_len;/* len of inode buffer */ -__int32_t ilf_boffset;/* off of inode in buffer */ -} __attribute__((packed))xfs_inode_log_format_32_t ; - -typedef struct xfs_inode_log_format_64 { +/* +* Old 32 bit systems will log in this format without the 64 bit +* alignment padding. Recovery will detect this and convert it to the +* correct format. +*/ +struct xfs_inode_log_format_32 {__uint16_t ilf_type;/* inode log item type */ __uint16_t ilf_size;/* size of this item */ __uint32_t ilf_fields;/* flags for fields logged */ __uint16_t ilf_asize;/* size of attr d/ext/root */ __uint16_t ilf_dsize;/* size of data/ext/root */ - __uint32_t ilf_pad; /* pad for 64 bit boundary */__uint64_t ilf_ino;/* inode number */ union {__uint32_t ilfu_rdev;/* rdev value for dev inode*/
@@ -311,7 +300,7 @@ typedef struct xfs_inode_log_format_64 {__int64_t ilf_blkno;/* blkno of inode buffer */ __int32_t ilf_len;/* len of inode buffer */ __int32_t ilf_boffset;/* off of inode in buffer */ -} xfs_inode_log_format_64_t; +} __attribute__((packed));/*
fs/xfs/xfs_acl.c +16 -6
@@ -247,6 +247,8 @@ xfs_set_mode(struct inode *inode, umode_t mode)int xfs_set_acl (struct inode *inode,struct posix_acl *acl,int type) { +umode_t mode; +bool set_mode = false;int error =0 ;if (!acl)
@@ -257,16 +259,24 @@ xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)return error;if (type ==ACL_TYPE_ACCESS ) { -umode_t mode; - error =posix_acl_update_mode (inode, &mode, &acl);if (error)return error; - error =xfs_set_mode (inode, mode); -if (error) -return error; + set_mode = true; } set_acl: -return __xfs_set_acl (inode, acl, type); + error =__xfs_set_acl (inode, acl, type); +if (error) +return error; + +/* +* We set the mode after successfully updating the ACL xattr because the +* xattr update can fail at ENOSPC and we don't want to change the mode +* if the ACL update hasn't been applied. +*/ +if (set_mode) + error =xfs_set_mode (inode, mode); + +return error; }
fs/xfs/xfs_aops.c +52 -20
115 lines not on this page · raw message
fs/xfs/xfs_attr_inactive.c +2 -0
@@ -302,6 +302,8 @@ xfs_attr3_node_inactive( &bp, XFS_ATTR_FORK);if (error)return error; + node = bp->b_addr; + btree = dp->d_ops->node_tree_p (node); child_fsb =be32_to_cpu (btree[i +1 ].before);xfs_trans_brelse (*trans, bp); }
fs/xfs/xfs_bmap_util.c +37 -3
@@ -84,6 +84,7 @@ xfs_zero_extent( GFP_NOFS, true); } +#ifdef CONFIG_XFS_RT int xfs_bmap_rtalloc (struct xfs_bmalloca *ap)/* bmap alloc argument struct */
@@ -195,6 +196,7 @@ xfs_bmap_rtalloc( }return 0 ; } +#endif /* CONFIG_XFS_RT */ /* * Check if the endoff is outside the last extent. If so the caller will grow
@@ -1445,7 +1447,19 @@ xfs_shift_file_space(return error;/* -* The extent shiting code works on extent granularity. So, if +* Clean out anything hanging around in the cow fork now that +* we've flushed all the dirty data out to disk to avoid having +* CoW extents at the wrong offsets. +*/ +if (xfs_is_reflink_inode (ip)) { + error =xfs_reflink_cancel_cow_range (ip, offset,NULLFILEOFF , + true); +if (error) +return error; + } + +/* +* The extent shifting code works on extent granularity. So, if * stop_fsb is not the starting block of extent, we need to split * the extent at stop_fsb. */
@@ -2094,11 +2108,31 @@ xfs_swap_extents( ip->i_d.di_flags2 |= tip->i_d.di_flags2 &XFS_DIFLAG2_REFLINK ; tip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK ; tip->i_d.di_flags2 |= f &XFS_DIFLAG2_REFLINK ; + } + +/* Swap the cow forks. */ +if (xfs_sb_version_hasreflink (&mp->m_sb)) { +xfs_extnum_t extnum; + +ASSERT (ip->i_cformat ==XFS_DINODE_FMT_EXTENTS ); +ASSERT (tip->i_cformat ==XFS_DINODE_FMT_EXTENTS ); + + extnum = ip->i_cnextents; + ip->i_cnextents = tip->i_cnextents; + tip->i_cnextents = extnum; + cowfp = ip->i_cowfp; ip->i_cowfp = tip->i_cowfp; tip->i_cowfp = cowfp; -xfs_inode_set_cowblocks_tag (ip); -xfs_inode_set_cowblocks_tag (tip); + +if (ip->i_cowfp && ip->i_cnextents) +xfs_inode_set_cowblocks_tag (ip); +else +xfs_inode_clear_cowblocks_tag (ip); +if (tip->i_cowfp && tip->i_cnextents) +xfs_inode_set_cowblocks_tag (tip); +else +xfs_inode_clear_cowblocks_tag (tip); }xfs_trans_log_inode (tp, ip, src_log_flags);
fs/xfs/xfs_bmap_util.h +13 -0
@@ -28,7 +28,20 @@ struct xfs_mount;struct xfs_trans ;struct xfs_bmalloca ; +#ifdef CONFIG_XFS_RT int xfs_bmap_rtalloc (struct xfs_bmalloca *ap); +#else /* !CONFIG_XFS_RT */ +/* +* Attempts to allocate RT extents when RT is disable indicates corruption and +* should trigger a shutdown. +*/ +static inline int +xfs_bmap_rtalloc (struct xfs_bmalloca *ap) +{ +return -EFSCORRUPTED ; +} +#endif /* CONFIG_XFS_RT */ +int xfs_bmap_eof (struct xfs_inode *ip,xfs_fileoff_t endoff,int whichfork,int *eof); int xfs_bmap_punch_delalloc_range(struct xfs_inode *ip,
fs/xfs/xfs_error.c +1 -1
@@ -167,7 +167,7 @@ xfs_verifier_error( {struct xfs_mount *mp = bp->b_target->bt_mount; -xfs_alert (mp,"Metadata %s detected at %pF, %s block 0x%llx" , +xfs_alert (mp,"Metadata %s detected at %pS, %s block 0x%llx" , bp->b_error == -EFSBADCRC ?"CRC error" :"corruption" , __return_address, bp->b_ops->name, bp->b_bn);
fs/xfs/xfs_file.c +1 -1
@@ -92,7 +92,7 @@ xfs_zero_range(xfs_off_t count, bool *did_zero) { - return iomap_zero_range(VFS_I(ip), pos, count, NULL, &xfs_iomap_ops); + return iomap_zero_range(VFS_I(ip), pos, count, did_zero, &xfs_iomap_ops); }int
fs/xfs/xfs_inode.c +5 -3
@@ -1632,10 +1632,12 @@ xfs_itruncate_extents( goto out;/* -* Clear the reflink flag if we truncated everything. +* Clear the reflink flag if there are no data fork blocks and +* there are no extents staged in the cow fork. */ -if (ip->i_d.di_nblocks ==0 &&xfs_is_reflink_inode (ip)) { - ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK ; +if (xfs_is_reflink_inode (ip) && ip->i_cnextents ==0 ) { +if (ip->i_d.di_nblocks ==0 ) + ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK ;xfs_inode_clear_cowblocks_tag (ip); }
fs/xfs/xfs_inode_item.c +43 -43
125 lines not on this page · raw message
fs/xfs/xfs_iomap.c +5 -2
@@ -836,7 +836,8 @@ intxfs_iomap_write_unwritten ( xfs_inode_t *ip, xfs_off_t offset, - xfs_off_t count) + xfs_off_t count, + bool update_isize) {xfs_mount_t *mp = ip->i_mount;xfs_fileoff_t offset_fsb;
@@ -847,6 +848,7 @@ xfs_iomap_write_unwritten(xfs_trans_t *tp;xfs_bmbt_irec_t imap;struct xfs_defer_ops dfops; +struct inode *inode =VFS_I (ip);xfs_fsize_t i_size;uint resblks;int error;
@@ -906,7 +908,8 @@ xfs_iomap_write_unwritten( i_size =XFS_FSB_TO_B (mp, offset_fsb + count_fsb);if (i_size > offset + count) i_size = offset + count; - +if (update_isize && i_size >i_size_read (inode)) +i_size_write (inode, i_size); i_size =xfs_new_eof (ip, i_size);if (i_size) { ip->i_d.di_size = i_size;
fs/xfs/xfs_iomap.h +1 -1
@@ -27,7 +27,7 @@ int xfs_iomap_write_direct(struct xfs_inode *, xfs_off_t, size_t, struct xfs_bmbt_irec *, int);int xfs_iomap_write_allocate (struct xfs_inode *,int ,xfs_off_t ,struct xfs_bmbt_irec *); -int xfs_iomap_write_unwritten (struct xfs_inode *,xfs_off_t ,xfs_off_t ); +int xfs_iomap_write_unwritten (struct xfs_inode *,xfs_off_t ,xfs_off_t ,bool );void xfs_bmbt_to_iomap (struct xfs_inode *,struct iomap *,struct xfs_bmbt_irec *);
fs/xfs/xfs_ondisk.h +1 -1
@@ -134,7 +134,7 @@ xfs_check_ondisk_structs(void) XFS_CHECK_STRUCT_SIZE(struct xfs_icreate_log, 28); XFS_CHECK_STRUCT_SIZE(struct xfs_ictimestamp, 8); XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_32, 52); - XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_64, 56); + XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format, 56); XFS_CHECK_STRUCT_SIZE(struct xfs_qoff_logformat, 20); XFS_CHECK_STRUCT_SIZE(struct xfs_trans_header, 16); }
fs/xfs/xfs_pnfs.c +1 -1
@@ -279,7 +279,7 @@ xfs_fs_commit_blocks( (end - 1) >> PAGE_SHIFT);WARN_ON_ONCE (error); - error =xfs_iomap_write_unwritten (ip, start, length); + error =xfs_iomap_write_unwritten (ip, start, length, false);if (error) goto out_drop_iolock; }
fs/xfs/xfs_reflink.c +8 -1
@@ -767,7 +767,13 @@ xfs_reflink_end_cow(/* If there is a hole at end_fsb - 1 go to the previous extent */ if (eof || got.br_startoff > end_fsb) { -ASSERT (idx >0 ); +/* +* In case of racing, overlapping AIO writes no COW extents +* might be left by the time I/O completes for the loser of +* the race. In that case we are done. +*/ +if (idx <=0 ) + goto out_cancel;xfs_bmbt_get_all (xfs_iext_get_ext (ifp, --idx), &got); }
@@ -841,6 +847,7 @@ xfs_reflink_end_cow( out_defer:xfs_defer_cancel (&dfops); +out_cancel:xfs_trans_cancel (tp);xfs_iunlock (ip,XFS_ILOCK_EXCL ); out:
include/linux/hyperv.h +2 -2
@@ -1521,11 +1521,11 @@ static inline void hv_signal_on_read(struct vmbus_channel *channel) cur_write_sz =hv_get_bytes_to_write (rbi); -if (cur_write_sz < pending_sz) +if (cur_write_sz <= pending_sz)return ; cached_write_sz =hv_get_cached_bytes_to_write (rbi); -if (cached_write_sz < pending_sz) +if (cached_write_sz <= pending_sz)vmbus_setevent (channel);return ;
include/linux/key.h +30 -17
84 lines not on this page · raw message
include/linux/mbus.h +2 -2
@@ -31,8 +31,8 @@ struct mbus_dram_target_infostruct mbus_dram_window {u8 cs_index;u8 mbus_attr; -u32 base; -u32 size; +u64 base; +u64 size; } cs[4 ]; };
lib/digsig.c +6 -0
@@ -87,6 +87,12 @@ static int digsig_verify_rsa(struct key *key,down_read (&key->sem); ukp =user_key_payload (key); +if (!ukp) { +/* key was revoked before we acquired its semaphore */ + err = -EKEYREVOKED ; + goto err1; + } +if (ukp->datalen <sizeof (*pkh)) goto err1;
net/dns_resolver/dns_key.c +1 -1
@@ -224,7 +224,7 @@ static int dns_resolver_match_preparse(struct key_match_data *match_data)static void dns_resolver_describe (const struct key *key,struct seq_file *m) {seq_puts (m, key->description); -if (key_is_instantiated (key)) { +if (key_is_positive (key)) {int err =PTR_ERR (key->payload.data[dns_key_error]);if (err)
security/keys/big_key.c +2 -2
@@ -245,7 +245,7 @@ void big_key_revoke(struct key *key)/* clear the quota */ key_payload_reserve (key,0 ); -if (key_is_instantiated (key) && +if (key_is_positive (key) && (size_t )key->payload.data[big_key_len] >BIG_KEY_FILE_THRESHOLD )vfs_truncate (path,0 ); }
@@ -277,7 +277,7 @@ void big_key_describe(const struct key *key, struct seq_file *m)seq_puts (m, key->description); -if (key_is_instantiated (key)) +if (key_is_positive (key))seq_printf (m,": %zu [%s]" , datalen, datalen >BIG_KEY_FILE_THRESHOLD ?"file" :"buff" );
security/keys/encrypted-keys/encrypted.c +8 -1
@@ -315,6 +315,13 @@ static struct key *request_user_key(const char *master_desc, const u8 **master_kdown_read (&ukey->sem); upayload =user_key_payload (ukey); +if (!upayload) { +/* key was revoked before we acquired its semaphore */ +up_read (&ukey->sem); +key_put (ukey); + ukey =ERR_PTR (-EKEYREVOKED ); + goto error; + } *master_key = upayload->data; *master_keylen = upayload->datalen; error:
@@ -867,7 +874,7 @@ static int encrypted_update(struct key *key, struct key_preparsed_payload *prep)size_t datalen = prep->datalen;int ret =0 ; -if (test_bit (KEY_FLAG_NEGATIVE , &key->flags)) +if (key_is_negative (key))return -ENOKEY ;if (datalen <=0 || datalen >32767 || !prep->data)return -EINVAL ;
security/keys/gc.c +4 -4
@@ -129,15 +129,15 @@ static noinline void key_gc_unused_keys(struct list_head *keys)while (!list_empty (keys)) {struct key *key = list_entry(keys->next, struct key, graveyard_link); +short state = key->state; +list_del (&key->graveyard_link);kdebug ("- %u" , key->serial);key_check (key);/* Throw away the key data if the key is instantiated */ -if (test_bit (KEY_FLAG_INSTANTIATED , &key->flags) && - !test_bit (KEY_FLAG_NEGATIVE , &key->flags) && - key->type->destroy) +if (state ==KEY_IS_POSITIVE && key->type->destroy) key->type->destroy (key);security_key_free (key);
@@ -151,7 +151,7 @@ static noinline void key_gc_unused_keys(struct list_head *keys) }atomic_dec (&key->user->nkeys); -if (test_bit (KEY_FLAG_INSTANTIATED , &key->flags)) +if (state !=KEY_IS_UNINSTANTIATED )atomic_dec (&key->user->nikeys);key_user_put (key->user);
security/keys/key.c +30 -11
85 lines not on this page · raw message
security/keys/keyctl.c +4 -5
@@ -766,10 +766,9 @@ long keyctl_read_key(key_serial_t keyid, char __user *buffer, size_t buflen) key =key_ref_to_ptr (key_ref); -if (test_bit (KEY_FLAG_NEGATIVE , &key->flags)) { - ret = -ENOKEY ; - goto error2; - } + ret =key_read_state (key); +if (ret <0 ) + goto error2;/* Negatively instantiated */ /* see if we can read it directly */ ret =key_permission (key_ref,KEY_NEED_READ );
@@ -901,7 +900,7 @@ long keyctl_chown_key(key_serial_t id, uid_t user, gid_t group)atomic_dec (&key->user->nkeys);atomic_inc (&newowner->nkeys); -if (test_bit (KEY_FLAG_INSTANTIATED , &key->flags)) { +if (key->state !=KEY_IS_UNINSTANTIATED ) {atomic_dec (&key->user->nikeys);atomic_inc (&newowner->nikeys); }
security/keys/keyring.c +5 -5
@@ -407,7 +407,7 @@ static void keyring_describe(const struct key *keyring, struct seq_file *m)else seq_puts (m,"[anon]" ); -if (key_is_instantiated (keyring)) { +if (key_is_positive (keyring)) {if (keyring->keys.nr_leaves_on_tree !=0 )seq_printf (m,": %lu" , keyring->keys.nr_leaves_on_tree);else
@@ -546,7 +546,8 @@ static int keyring_search_iterator(const void *object, void *iterator_data) {struct keyring_search_context *ctx = iterator_data;const struct key *key =keyring_ptr_to_key (object); -unsigned long kflags = key->flags; +unsigned long kflags =READ_ONCE (key->flags); +short state =READ_ONCE (key->state);kenter ("{%d}" , key->serial);
@@ -590,9 +591,8 @@ static int keyring_search_iterator(const void *object, void *iterator_data)if (ctx->flags &KEYRING_SEARCH_DO_STATE_CHECK ) {/* we set a different error code if we pass a negative key */ -if (kflags & (1 <<KEY_FLAG_NEGATIVE )) { -smp_rmb (); - ctx->result =ERR_PTR (key->reject_error); +if (state <0 ) { + ctx->result =ERR_PTR (state);kleave (" = %d [neg]" , ctx->skipped_ret); goto skipped; }
security/keys/proc.c +5 -2
@@ -182,6 +182,7 @@ static int proc_keys_show(struct seq_file *m, void *v)unsigned long timo;key_ref_t key_ref, skey_ref;char xbuf[16 ]; +short state;int rc;struct keyring_search_context ctx = {
@@ -240,17 +241,19 @@ static int proc_keys_show(struct seq_file *m, void *v)sprintf (xbuf,"%luw" , timo / (60 *60 *24 *7 )); } + state =key_read_state (key); +#define showflag (KEY ,LETTER ,FLAG ) \ (test_bit(FLAG, &(KEY)->flags) ? LETTER : '-') seq_printf(m, "%08x %c%c%c%c%c%c%c %5d %4s %08x %5d %5d %-9.9s ", key->serial, - showflag(key, 'I', KEY_FLAG_INSTANTIATED), + state != KEY_IS_UNINSTANTIATED ? 'I' : '-', showflag(key, 'R', KEY_FLAG_REVOKED), showflag(key, 'D', KEY_FLAG_DEAD), showflag(key, 'Q', KEY_FLAG_IN_QUOTA), showflag(key, 'U', KEY_FLAG_USER_CONSTRUCT), - showflag(key, 'N', KEY_FLAG_NEGATIVE), + state < 0 ? 'N' : '-', showflag(key, 'i', KEY_FLAG_INVALIDATED), atomic_read(&key->usage), xbuf,
security/keys/process_keys.c +1 -1
@@ -729,7 +729,7 @@ key_ref_t lookup_user_key(key_serial_t id, unsigned long lflags, ret = -EIO ;if (!(lflags &KEY_LOOKUP_PARTIAL ) && - !test_bit (KEY_FLAG_INSTANTIATED , &key->flags)) +key_read_state (key) ==KEY_IS_UNINSTANTIATED ) goto invalid_key;/* check the permissions */
security/keys/request_key.c +3 -4
@@ -594,10 +594,9 @@ int wait_for_key_construction(struct key *key, bool intr) intr ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE);if (ret)return -ERESTARTSYS ; -if (test_bit (KEY_FLAG_NEGATIVE , &key->flags)) { -smp_rmb (); -return key->reject_error; - } + ret =key_read_state (key); +if (ret <0 ) +return ret;return key_validate (key); }EXPORT_SYMBOL (wait_for_key_construction);
security/keys/request_key_auth.c +1 -1
@@ -73,7 +73,7 @@ static void request_key_auth_describe(const struct key *key,seq_puts (m,"key:" );seq_puts (m, key->description); -if (key_is_instantiated (key)) +if (key_is_positive (key))seq_printf (m," pid:%d ci:%zu" , rka->pid, rka->callout_len); }
security/keys/trusted.c +1 -1
@@ -1067,7 +1067,7 @@ static int trusted_update(struct key *key, struct key_preparsed_payload *prep)char *datablob;int ret =0 ; -if (test_bit (KEY_FLAG_NEGATIVE , &key->flags)) +if (key_is_negative (key))return -ENOKEY ; p = key->payload.data[0 ];if (!p->migratable)
security/keys/user_defined.c +2 -2
@@ -106,7 +106,7 @@ int user_update(struct key *key, struct key_preparsed_payload *prep)/* attach the new data, displacing the old */ key->expiry = prep->expiry; -if (!test_bit (KEY_FLAG_NEGATIVE , &key->flags)) +if (key_is_positive (key)) zap =rcu_dereference_key (key);rcu_assign_keypointer (key, prep->payload.data[0 ]); prep->payload.data[0 ] =NULL ;
@@ -154,7 +154,7 @@ EXPORT_SYMBOL_GPL(user_destroy);void user_describe (const struct key *key,struct seq_file *m) {seq_puts (m, key->description); -if (key_is_instantiated (key)) +if (key_is_positive (key))seq_printf (m,": %u" , key->datalen); }
sound/core/seq/seq_lock.c +0 -4
@@ -23,8 +23,6 @@#include <sound/core.h> #include "seq_lock.h" -#if defined(CONFIG_SMP ) || defined(CONFIG_SND_DEBUG ) -/* wait until all locks are released */ void snd_use_lock_sync_helper (snd_use_lock_t *lockp,const char *file,int line) {
@@ -42,5 +40,3 @@ void snd_use_lock_sync_helper(snd_use_lock_t *lockp, const char *file, int line) }EXPORT_SYMBOL (snd_use_lock_sync_helper); - -#endif
sound/core/seq/seq_lock.h +0 -12
@@ -3,8 +3,6 @@#include <linux/sched.h> -#if defined(CONFIG_SMP ) || defined(CONFIG_SND_DEBUG ) -typedef atomic_t snd_use_lock_t ;/* initialize lock */
@@ -20,14 +18,4 @@ typedef atomic_t snd_use_lock_t;void snd_use_lock_sync_helper (snd_use_lock_t *lock,const char *file,int line);#define snd_use_lock_sync (lockp) snd_use_lock_sync_helper(lockp, __BASE_FILE__, __LINE__) -#else /* SMP || CONFIG_SND_DEBUG */ - -typedef spinlock_t snd_use_lock_t ;/* dummy */ -#define snd_use_lock_init (lockp)/**/ -#define snd_use_lock_use (lockp)/**/ -#define snd_use_lock_free (lockp)/**/ -#define snd_use_lock_sync (lockp)/**/ - -#endif /* SMP || CONFIG_SND_DEBUG */ -#endif /* __SND_SEQ_LOCK_H */
sound/hda/hdac_controller.c +5 -0
@@ -284,6 +284,11 @@ int snd_hdac_bus_parse_capabilities(struct hdac_bus *bus)dev_dbg (bus->dev,"HDA capability ID: 0x%x\n" , (cur_cap &AZX_CAP_HDR_ID_MASK ) >>AZX_CAP_HDR_ID_OFF ); +if (cur_cap ==-1 ) { +dev_dbg (bus->dev,"Invalid capability reg read\n" ); +break ; + } +switch ((cur_cap &AZX_CAP_HDR_ID_MASK ) >>AZX_CAP_HDR_ID_OFF ) {case AZX_ML_CAP_ID :dev_dbg (bus->dev,"Found ML capability\n" );
sound/pci/hda/hda_codec.c +1 -1
@@ -1755,7 +1755,7 @@ static int get_kctl_0dB_offset(struct hda_codec *codec,return -1 ;if (*step_to_check && *step_to_check != step) {codec_err (codec,"Mismatching dB step for vmaster slave (%d!=%d)\n" , -- *step_to_check, step); + *step_to_check, step);return -1 ; } *step_to_check = step;
sound/usb/quirks.c +1 -0
@@ -1352,6 +1352,7 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,case USB_ID (0x20b1 ,0x2008 ):/* Matrix Audio X-Sabre */ case USB_ID (0x20b1 ,0x300a ):/* Matrix Audio Mini-i Pro */ case USB_ID (0x22d9 ,0x0416 ):/* OPPO HA-1 */ +case USB_ID (0x2772 ,0x0230 ):/* Pro-Ject Pre Box S2 Digital */ if (fp->altsetting ==2 )return SNDRV_PCM_FMTBIT_DSD_U32_BE ;break ;