Linux 4.9.250
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.9.250 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:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 - arch/powerpc/sysdev/mpic_msgr.c | 2 - arch/x86/entry/entry_64.S | 2 - drivers/block/xen-blkback/xenbus.c | 3 + drivers/iio/imu/bmi160/bmi160_core.c | 12 ++++-- drivers/iio/magnetometer/mag3110.c | 13 ++++--- drivers/media/usb/dvb-usb/gp8psk.c | 2 - drivers/misc/vmw_vmci/vmci_context.c | 2 - drivers/net/wireless/marvell/mwifiex/join.c | 2 + drivers/net/xen-netback/xenbus.c | 4 +- drivers/s390/block/dasd_alias.c | 10 ++++- drivers/usb/serial/digi_acceleport.c | 45 +++++++----------------- drivers/vfio/pci/vfio_pci.c | 4 -- drivers/xen/xen-pciback/xenbus.c | 2 - drivers/xen/xenbus/xenbus_client.c | 8 +++- drivers/xen/xenbus/xenbus_probe.c | 1 drivers/xen/xenbus/xenbus_probe.h | 2 + drivers/xen/xenbus/xenbus_probe_backend.c | 7 +++ drivers/xen/xenbus/xenbus_xs.c | 38 +++++++++++++------- fs/quota/quota_tree.c | 8 ++-- fs/reiserfs/stree.c | 6 +++ include/linux/kdev_t.h | 22 +++++------ include/linux/of.h | 1 include/uapi/linux/const.h | 5 ++ include/uapi/linux/ethtool.h | 2 - include/uapi/linux/kernel.h | 9 ---- include/uapi/linux/lightnvm.h | 2 - include/uapi/linux/mroute6.h | 2 - include/uapi/linux/netfilter/x_tables.h | 2 - include/uapi/linux/netlink.h | 2 - include/uapi/linux/sysctl.h | 2 - include/xen/xenbus.h | 15 +++++++- kernel/module.c | 6 ++- net/ipv6/datagram.c | 21 +++++++++-- net/l2tp/l2tp_core.c | 38 +++++++++----------- net/l2tp/l2tp_core.h | 3 - sound/core/seq/seq_queue.h | 8 ++-- sound/pci/hda/patch_ca0132.c | 16 +++++++- sound/pci/hda/patch_realtek.c | 25 +++++++++++-- sound/usb/pcm.c | 52 ++++++++++------------------ 40 files changed, 243 insertions(+), 165 deletions(-)
Alberto Aguirre (1):
ALSA: usb-audio: simplify set_sync_ep_implicit_fb_quirk
Anant Thazhemadam (1):
misc: vmw_vmci: fix kernel info-leak by initializing dbells in vmci_ctx_get_chkpt_doorbells()
Eric Auger (1):
vfio/pci: Move dummy_resources_list init in vfio_pci_probe()
Greg Kroah-Hartman (1):
Linux 4.9.250
Hui Wang (1):
ALSA: hda - Fix a wrong FIXUP for alc289 on Dell machines
Jan Beulich (1):
x86/entry/64: Add instruction suffix
Jan Kara (1):
quota: Don't overflow quota file offsets
Jessica Yu (1):
module: delay kobject uevent until after module init call
Johan Hovold (3):
ALSA: usb-audio: fix sync-ep altsetting sanity check
USB: serial: digi_acceleport: fix write-wakeup deadlocks
of: fix linker-section match-table corruption
Jonathan Cameron (3):
iio:imu:bmi160: Fix too large a buffer. iio:imu:bmi160: Fix alignment and data leak issues iio:magnetometer:mag3110: Fix alignment and data leak issues.
Josh Poimboeuf (1):
kdev_t: always inline major/minor helper functions
Kailang Yang (2):
ALSA: hda/realtek - Support Dell headset mode for ALC3271
ALSA: hda/realtek - Dell headphone has noise on unmute for ALC236
Mauro Carvalho Chehab (1):
media: gp8psk: initialize stats at power control logic
Miroslav Benes (1):
module: set MODULE_STATE_GOING state when a module fails to load
Paolo Abeni (2):
net: ipv6: keep sk status consistent after datagram connect failure
l2tp: fix races with ipv4-mapped ipv6 addresses
Petr Vorel (1):
uapi: move constants from <linux/kernel.h> to <linux/const.h>
Qinglang Miao (1):
powerpc: sysdev: add missing iounmap() on error in mpic_msgr_probe()
Rustam Kovhaev (1):
reiserfs: add check for an invalid ih_entry_count
SeongJae Park (5):
xen/xenbus: Allow watches discard events before queueing xen/xenbus: Add 'will_handle' callback support in xenbus_watch_path() xen/xenbus/xen_bus_type: Support will_handle watch callback xen/xenbus: Count pending messages for each watch xenbus/xenbus_backend: Disallow pending watch messages
Stefan Haberland (1):
s390/dasd: fix hanging device offline processing
Takashi Iwai (2):
ALSA: hda/ca0132 - Fix work handling in delayed HP detection
ALSA: seq: Use bool for snd_seq_queue internal flags
Zhang Xiaohui (1):
mwifiex: Fix possible buffer overflows in mwifiex_cmd_802_11_ad_hoc_start
sayli karnik (1):
iio: bmi160_core: Fix sparse warning due to incorrect type in assignment
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 9 -SUBLEVEL = 249 +SUBLEVEL = 250 EXTRAVERSION = NAME = Roaring Lionus
arch/powerpc/sysdev/mpic_msgr.c +1 -1
@@ -196,7 +196,7 @@ static int mpic_msgr_probe(struct platform_device *dev)/* IO map the message register block. */ of_address_to_resource (np,0 , &rsrc); - msgr_block_addr =ioremap (rsrc.start,resource_size (&rsrc)); + msgr_block_addr =devm_ioremap (&dev->dev, rsrc.start,resource_size (&rsrc));if (!msgr_block_addr) {dev_err (&dev->dev,"Failed to iomap MPIC message registers" );return -EFAULT ;
arch/x86/entry/entry_64.S +1 -1
@@ -58,7 +58,7 @@ ENDPROC(native_usergs_sysret64) .macro TRACE_IRQS_IRETQ #ifdef CONFIG_TRACE_IRQFLAGS - bt $9, EFLAGS(%rsp) /* interrupts off? */ + btl $9, EFLAGS(%rsp) /* interrupts off? */ jnc 1f TRACE_IRQS_ON 1:
drivers/block/xen-blkback/xenbus.c +2 -1
@@ -646,7 +646,8 @@ static int xen_blkbk_probe(struct xenbus_device *dev,/* setup back pointer */ be->blkif->be = be; - err =xenbus_watch_pathfmt (dev, &be->backend_watch, backend_changed, + err =xenbus_watch_pathfmt (dev, &be->backend_watch,NULL , + backend_changed,"%s/%s" , dev->nodename,"physical-device" );if (err) goto fail;
drivers/iio/imu/bmi160/bmi160_core.c +9 -3
@@ -110,6 +110,13 @@ enum bmi160_sensor_type {struct bmi160_data {struct regmap *regmap; +/* +* Ensure natural alignment for timestamp if present. +* Max length needed: 2 * 3 channels + 4 bytes padding + 8 byte ts. +* If fewer channels are enabled, less space may be needed, as +* long as the timestamp is still aligned to 8 bytes. +*/ +__le16 buf[12 ]__aligned(8) ; };const struct regmap_config bmi160_regmap_config = {
@@ -385,7 +392,6 @@ static irqreturn_t bmi160_trigger_handler(int irq, void *p)struct iio_poll_func *pf = p;struct iio_dev *indio_dev = pf->indio_dev;struct bmi160_data *data =iio_priv (indio_dev); -s16 buf[16 ];/* 3 sens x 3 axis x s16 + 3 x s16 pad + 4 x s16 tstamp */ int i, ret, j =0 , base =BMI160_REG_DATA_MAGN_XOUT_L ;__le16 sample;
@@ -395,10 +401,10 @@ static irqreturn_t bmi160_trigger_handler(int irq, void *p) &sample, sizeof(__le16));if (ret <0 ) goto done; - buf[j++] = sample; + data->buf[j++] = sample; } -iio_push_to_buffers_with_timestamp (indio_dev, buf, +iio_push_to_buffers_with_timestamp (indio_dev, data->buf,iio_get_time_ns (indio_dev)); done:iio_trigger_notify_done (indio_dev->trig);
drivers/iio/magnetometer/mag3110.c +9 -4
@@ -52,6 +52,12 @@ struct mag3110_data {struct i2c_client *client;struct mutex lock;u8 ctrl_reg1; +/* Ensure natural alignment of timestamp */ +struct { +__be16 channels[3 ]; +u8 temperature; +s64 ts__aligned(8) ; + } scan; };static int mag3110_request (struct mag3110_data *data)
@@ -262,10 +268,9 @@ static irqreturn_t mag3110_trigger_handler(int irq, void *p)struct iio_poll_func *pf = p;struct iio_dev *indio_dev = pf->indio_dev;struct mag3110_data *data =iio_priv (indio_dev); -u8 buffer[16 ];/* 3 16-bit channels + 1 byte temp + padding + ts */ int ret; - ret =mag3110_read (data, (__be16 *) buffer); + ret =mag3110_read (data, data->scan.channels);if (ret <0 ) goto done;
@@ -274,10 +279,10 @@ static irqreturn_t mag3110_trigger_handler(int irq, void *p) MAG3110_DIE_TEMP);if (ret <0 ) goto done; - buffer[6 ] = ret; + data->scan.temperature = ret; } -iio_push_to_buffers_with_timestamp (indio_dev, buffer, +iio_push_to_buffers_with_timestamp (indio_dev, &data->scan,iio_get_time_ns (indio_dev)); done:
drivers/media/usb/dvb-usb/gp8psk.c +1 -1
@@ -186,7 +186,7 @@ static int gp8psk_load_bcm4500fw(struct dvb_usb_device *d)static int gp8psk_power_ctrl (struct dvb_usb_device *d,int onoff) { -u8 status, buf; +u8 status =0 , buf;int gp_product_id =le16_to_cpu (d->udev->descriptor.idProduct);if (onoff) {
drivers/misc/vmw_vmci/vmci_context.c +1 -1
@@ -750,7 +750,7 @@ static int vmci_ctx_get_chkpt_doorbells(struct vmci_ctx *context,return VMCI_ERROR_MORE_DATA ; } - dbells =kmalloc (data_size,GFP_ATOMIC ); + dbells =kzalloc (data_size,GFP_ATOMIC );if (!dbells)return VMCI_ERROR_NO_MEM ;
drivers/net/wireless/marvell/mwifiex/join.c +2 -0
@@ -877,6 +877,8 @@ mwifiex_cmd_802_11_ad_hoc_start(struct mwifiex_private *priv,memset (adhoc_start->ssid,0 ,IEEE80211_MAX_SSID_LEN ); +if (req_ssid->ssid_len >IEEE80211_MAX_SSID_LEN ) + req_ssid->ssid_len =IEEE80211_MAX_SSID_LEN ;memcpy (adhoc_start->ssid, req_ssid->ssid, req_ssid->ssid_len); mwifiex_dbg(adapter, INFO, "info: ADHOC_S_CMD: SSID = %s\n",
drivers/net/xen-netback/xenbus.c +3 -1
@@ -770,12 +770,14 @@ static int xen_register_credit_watch(struct xenbus_device *dev,return -ENOMEM ;snprintf (node, maxlen,"%s/rate" , dev->nodename); vif->credit_watch.node = node; + vif->credit_watch.will_handle =NULL ; vif->credit_watch.callback = xen_net_rate_changed; err =register_xenbus_watch (&vif->credit_watch);if (err) {pr_err ("Failed to set watcher %s\n" , vif->credit_watch.node);kfree (node); vif->credit_watch.node =NULL ; + vif->credit_watch.will_handle =NULL ; vif->credit_watch.callback =NULL ; }return err;
@@ -1038,7 +1040,7 @@ static void connect(struct backend_info *be)xenvif_carrier_on (be->vif);unregister_hotplug_status_watch (be); - err =xenbus_watch_pathfmt (dev, &be->hotplug_status_watch, + err =xenbus_watch_pathfmt (dev, &be->hotplug_status_watch,NULL , hotplug_status_changed,"%s/%s" , dev->nodename,"hotplug-status" );if (!err)
drivers/s390/block/dasd_alias.c +9 -1
@@ -461,11 +461,19 @@ static int read_unit_address_configuration(struct dasd_device *device,spin_unlock_irqrestore (&lcu->lock, flags); rc =dasd_sleep_on (cqr); -if (rc && !suborder_not_supported (cqr)) { +if (!rc) + goto out; + +if (suborder_not_supported (cqr)) { +/* suborder not supported or device unusable for IO */ + rc = -EOPNOTSUPP ; + }else { +/* IO failed but should be retried */ spin_lock_irqsave (&lcu->lock, flags); lcu->flags |=NEED_UAC_UPDATE ;spin_unlock_irqrestore (&lcu->lock, flags); } +out:dasd_kfree_request (cqr, cqr->memdev);return rc; }
drivers/usb/serial/digi_acceleport.c +13 -32
117 lines not on this page · raw message
drivers/vfio/pci/vfio_pci.c +1 -3
@@ -118,8 +118,6 @@ static void vfio_pci_probe_mmaps(struct vfio_pci_device *vdev)int bar;struct vfio_pci_dummy_resource *dummy_res; -INIT_LIST_HEAD (&vdev->dummy_resources_list); -for (bar =PCI_STD_RESOURCES ; bar <=PCI_STD_RESOURCE_END ; bar++) { res = vdev->pdev->resource + bar;
@@ -1547,7 +1545,7 @@ static int vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) vdev->irq_type =VFIO_PCI_NUM_IRQS ;mutex_init (&vdev->igate);spin_lock_init (&vdev->irqlock); - +INIT_LIST_HEAD (&vdev->dummy_resources_list);mutex_init (&vdev->vma_lock);INIT_LIST_HEAD (&vdev->vma_list);init_rwsem (&vdev->memory_lock);
drivers/xen/xen-pciback/xenbus.c +1 -1
@@ -689,7 +689,7 @@ static int xen_pcibk_xenbus_probe(struct xenbus_device *dev,/* watch the backend node for backend configuration information */ err =xenbus_watch_path (dev, dev->nodename, &pdev->be_watch, - xen_pcibk_be_watch); +NULL , xen_pcibk_be_watch);if (err) goto out;
drivers/xen/xenbus/xenbus_client.c +7 -1
@@ -114,18 +114,22 @@ EXPORT_SYMBOL_GPL(xenbus_strstate);*/ int xenbus_watch_path (struct xenbus_device *dev,const char *path,struct xenbus_watch *watch, +bool (*will_handle)(struct xenbus_watch *, +const char **,unsigned int ),void (*callback)(struct xenbus_watch *,const char **,unsigned int )) {int err; watch->node = path; + watch->will_handle = will_handle; watch->callback = callback; err =register_xenbus_watch (watch);if (err) { watch->node =NULL ; + watch->will_handle =NULL ; watch->callback =NULL ;xenbus_dev_fatal (dev, err,"adding watch on %s" , path); }
@@ -152,6 +156,8 @@ EXPORT_SYMBOL_GPL(xenbus_watch_path);*/ int xenbus_watch_pathfmt (struct xenbus_device *dev,struct xenbus_watch *watch, +bool (*will_handle)(struct xenbus_watch *, +const char **,unsigned int ),void (*callback)(struct xenbus_watch *,const char **,unsigned int ),const char *pathfmt, ...)
@@ -168,7 +174,7 @@ int xenbus_watch_pathfmt(struct xenbus_device *dev,xenbus_dev_fatal (dev, -ENOMEM ,"allocating path for watch" );return -ENOMEM ; } - err =xenbus_watch_path (dev, path, watch, callback); + err =xenbus_watch_path (dev, path, watch, will_handle, callback);if (err)kfree (path);
drivers/xen/xenbus/xenbus_probe.c +1 -0
@@ -137,6 +137,7 @@ static int watch_otherend(struct xenbus_device *dev) container_of(dev->dev.bus, struct xen_bus_type, bus);return xenbus_watch_pathfmt (dev, &dev->otherend_watch, + bus->otherend_will_handle, bus->otherend_changed,"%s/%s" , dev->otherend,"state" ); }
drivers/xen/xenbus/xenbus_probe.h +2 -0
@@ -42,6 +42,8 @@ struct xen_bus_type {int (*get_bus_id)(char bus_id[XEN_BUS_ID_SIZE ],const char *nodename);int (*probe)(struct xen_bus_type *bus,const char *type,const char *dir); +bool (*otherend_will_handle)(struct xenbus_watch *watch, +const char **vec,unsigned int len);void (*otherend_changed)(struct xenbus_watch *watch,const char **vec,unsigned int len);struct bus_type bus;
drivers/xen/xenbus/xenbus_probe_backend.c +7 -0
@@ -181,6 +181,12 @@ static int xenbus_probe_backend(struct xen_bus_type *bus, const char *type,return err; } +static bool frontend_will_handle (struct xenbus_watch *watch, +const char **vec,unsigned int len) +{ +return watch->nr_pending ==0 ; +} +static void frontend_changed (struct xenbus_watch *watch,const char **vec,unsigned int len) {
@@ -192,6 +198,7 @@ static struct xen_bus_type xenbus_backend = { .levels = 3, /* backend/type/<frontend>/<id> */ .get_bus_id = backend_bus_id, .probe = xenbus_probe_backend, + .otherend_will_handle = frontend_will_handle, .otherend_changed = frontend_changed, .bus = { .name = "xen-backend",
drivers/xen/xenbus/xenbus_xs.c +25 -13
@@ -699,6 +699,8 @@ int register_xenbus_watch(struct xenbus_watch *watch)sprintf (token,"%lX" , (long )watch); + watch->nr_pending =0 ; +down_read (&xs_state.watch_mutex);spin_lock (&watches_lock);
@@ -748,12 +750,15 @@ void unregister_xenbus_watch(struct xenbus_watch *watch)/* Cancel pending watch events. */ spin_lock (&watch_events_lock); -list_for_each_entry_safe (msg, tmp, &watch_events, list) { -if (msg->u.watch.handle != watch) -continue ; -list_del (&msg->list); -kfree (msg->u.watch.vec); -kfree (msg); +if (watch->nr_pending) { +list_for_each_entry_safe (msg, tmp, &watch_events, list) { +if (msg->u.watch.handle != watch) +continue ; +list_del (&msg->list); +kfree (msg->u.watch.vec); +kfree (msg); + } + watch->nr_pending =0 ; }spin_unlock (&watch_events_lock);
@@ -800,7 +805,6 @@ void xs_suspend_cancel(void)static int xenwatch_thread (void *unused) { -struct list_head *ent;struct xs_stored_msg *msg;for (;;) {
@@ -813,13 +817,15 @@ static int xenwatch_thread(void *unused)mutex_lock (&xenwatch_mutex);spin_lock (&watch_events_lock); - ent = watch_events.next; -if (ent != &watch_events) -list_del (ent); + msg =list_first_entry_or_null (&watch_events, + struct xs_stored_msg, list); +if (msg) { +list_del (&msg->list); + msg->u.watch.handle->nr_pending--; + }spin_unlock (&watch_events_lock); -if (ent != &watch_events) { - msg = list_entry(ent, struct xs_stored_msg, list); +if (msg) { msg->u.watch.handle->callback( msg->u.watch.handle, (const char **)msg->u.watch.vec,
@@ -901,9 +907,15 @@ static int process_msg(void)spin_lock (&watches_lock); msg->u.watch.handle =find_watch ( msg->u.watch.vec[XS_WATCH_TOKEN ]); -if (msg->u.watch.handle !=NULL ) { +if (msg->u.watch.handle !=NULL && + (!msg->u.watch.handle->will_handle || + msg->u.watch.handle->will_handle ( + msg->u.watch.handle, + (const char **)msg->u.watch.vec, + msg->u.watch.vec_size))) {spin_lock (&watch_events_lock);list_add_tail (&msg->list, &watch_events); + msg->u.watch.handle->nr_pending++;wake_up (&watch_events_waitq);spin_unlock (&watch_events_lock); }else {
fs/quota/quota_tree.c +4 -4
@@ -61,7 +61,7 @@ static ssize_t read_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf)memset (buf,0 , info->dqi_usable_bs);return sb->s_op->quota_read (sb, info->dqi_type, buf, - info->dqi_usable_bs, blk << info->dqi_blocksize_bits); + info->dqi_usable_bs, (loff_t )blk << info->dqi_blocksize_bits); }static ssize_t write_blk (struct qtree_mem_dqinfo *info,uint blk,char *buf)
@@ -70,7 +70,7 @@ static ssize_t write_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf)ssize_t ret; ret = sb->s_op->quota_write (sb, info->dqi_type, buf, - info->dqi_usable_bs, blk << info->dqi_blocksize_bits); + info->dqi_usable_bs, (loff_t )blk << info->dqi_blocksize_bits);if (ret != info->dqi_usable_bs) {quota_error (sb,"dquota write failed" );if (ret >=0 )
@@ -283,7 +283,7 @@ static uint find_free_dqentry(struct qtree_mem_dqinfo *info, blk); goto out_buf; } - dquot->dq_off = (blk << info->dqi_blocksize_bits) + + dquot->dq_off = ((loff_t )blk << info->dqi_blocksize_bits) +sizeof (struct qt_disk_dqdbheader ) + i * info->dqi_entry_size;kfree (buf);
@@ -558,7 +558,7 @@ static loff_t find_block_dqentry(struct qtree_mem_dqinfo *info, ret = -EIO ; goto out_buf; }else { - ret = (blk << info->dqi_blocksize_bits) +sizeof (struct + ret = ((loff_t )blk << info->dqi_blocksize_bits) +sizeof (struct qt_disk_dqdbheader ) + i * info->dqi_entry_size; } out_buf:
fs/reiserfs/stree.c +6 -0
@@ -453,6 +453,12 @@ static int is_leaf(char *buf, int blocksize, struct buffer_head *bh) "(second one): %h", ih);return 0 ; } +if (is_direntry_le_ih (ih) && (ih_item_len (ih) < (ih_entry_count (ih) *IH_SIZE ))) { +reiserfs_warning (NULL ,"reiserfs-5093" , +"item entry count seems wrong %h" , + ih); +return 0 ; + } prev_location =ih_location (ih); }
include/linux/kdev_t.h +11 -11
@@ -20,61 +20,61 @@ })/* acceptable for old filesystems */ -static inline bool old_valid_dev (dev_t dev) +static __always_inline bool old_valid_dev(dev_t dev) {return MAJOR (dev) <256 &&MINOR (dev) <256 ; } -static inline u16 old_encode_dev (dev_t dev) +static __always_inline u16 old_encode_dev(dev_t dev) {return (MAJOR (dev) <<8 ) |MINOR (dev); } -static inline dev_t old_decode_dev (u16 val) +static __always_inline dev_t old_decode_dev(u16 val) {return MKDEV ((val >>8 ) &255 , val &255 ); } -static inline u32 new_encode_dev (dev_t dev) +static __always_inline u32 new_encode_dev(dev_t dev) {unsigned major =MAJOR (dev);unsigned minor =MINOR (dev);return (minor &0xff ) | (major <<8 ) | ((minor & ~0xff ) <<12 ); } -static inline dev_t new_decode_dev (u32 dev) +static __always_inline dev_t new_decode_dev(u32 dev) {unsigned major = (dev &0xfff00 ) >>8 ;unsigned minor = (dev &0xff ) | ((dev >>12 ) &0xfff00 );return MKDEV (major, minor); } -static inline u64 huge_encode_dev (dev_t dev) +static __always_inline u64 huge_encode_dev(dev_t dev) {return new_encode_dev (dev); } -static inline dev_t huge_decode_dev (u64 dev) +static __always_inline dev_t huge_decode_dev(u64 dev) {return new_decode_dev (dev); } -static inline int sysv_valid_dev (dev_t dev) +static __always_inline int sysv_valid_dev(dev_t dev) {return MAJOR (dev) < (1 <<14 ) &&MINOR (dev) < (1 <<18 ); } -static inline u32 sysv_encode_dev (dev_t dev) +static __always_inline u32 sysv_encode_dev(dev_t dev) {return MINOR (dev) | (MAJOR (dev) <<18 ); } -static inline unsigned sysv_major (u32 dev) +static __always_inline unsigned sysv_major (u32 dev) {return (dev >>18 ) &0x3fff ; } -static inline unsigned sysv_minor (u32 dev) +static __always_inline unsigned sysv_minor (u32 dev) {return dev &0x3ffff ; }
include/linux/of.h +1 -0
@@ -1132,6 +1132,7 @@ static inline int of_get_available_child_count(const struct device_node *np)#define _OF_DECLARE (table, name, compat, fn, fn_type) \ static const struct of_device_id __of_table_##name \ __used __section(__##table##_of_table) \ + __aligned(__alignof__(struct of_device_id)) \ = { .compatible = compat, \ .data = (fn == (fn_type)NULL) ? fn : fn }#else
include/uapi/linux/const.h +5 -0
@@ -24,4 +24,9 @@#define _BITUL (x) (_AC(1,UL) << (x))#define _BITULL (x) (_AC(1,ULL) << (x)) +#define __ALIGN_KERNEL (x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) +#define __ALIGN_KERNEL_MASK (x, mask) (((x) + (mask)) & ~(mask)) + +#define __KERNEL_DIV_ROUND_UP (n, d) (((n) + (d) - 1) / (d)) +#endif /* !(_LINUX_CONST_H) */
include/uapi/linux/ethtool.h +1 -1
@@ -13,7 +13,7 @@#ifndef _UAPI_LINUX_ETHTOOL_H#define _UAPI_LINUX_ETHTOOL_H -#include <linux/kernel.h> +#include <linux/const.h> #include <linux/types.h> #include <linux/if_ether.h>
include/uapi/linux/kernel.h +1 -8
@@ -2,13 +2,6 @@#define _UAPI_LINUX_KERNEL_H#include <linux/sysinfo.h> - -/* -* 'kernel.h' contains some often-used function prototypes etc -*/ -#define __ALIGN_KERNEL (x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) -#define __ALIGN_KERNEL_MASK (x, mask) (((x) + (mask)) & ~(mask)) - -#define __KERNEL_DIV_ROUND_UP (n, d) (((n) + (d) - 1) / (d)) +#include <linux/const.h> #endif /* _UAPI_LINUX_KERNEL_H */
include/uapi/linux/lightnvm.h +1 -1
@@ -20,7 +20,7 @@#define _UAPI_LINUX_LIGHTNVM_H#ifdef __KERNEL__ -#include <linux/kernel.h> +#include <linux/const.h> #include <linux/ioctl.h> #else /* __KERNEL__ */ #include <stdio.h>
include/uapi/linux/mroute6.h +1 -1
@@ -1,7 +1,7 @@#ifndef _UAPI__LINUX_MROUTE6_H#define _UAPI__LINUX_MROUTE6_H -#include <linux/kernel.h> +#include <linux/const.h> #include <linux/types.h> #include <linux/sockios.h> #include <linux/in6.h> /* For struct sockaddr_in6. */
include/uapi/linux/netfilter/x_tables.h +1 -1
@@ -1,6 +1,6 @@#ifndef _UAPI_X_TABLES_H#define _UAPI_X_TABLES_H -#include <linux/kernel.h> +#include <linux/const.h> #include <linux/types.h> #define XT_FUNCTION_MAXNAMELEN 30
include/uapi/linux/netlink.h +1 -1
@@ -1,7 +1,7 @@#ifndef _UAPI__LINUX_NETLINK_H#define _UAPI__LINUX_NETLINK_H -#include <linux/kernel.h> +#include <linux/const.h> #include <linux/socket.h> /* for __kernel_sa_family_t */ #include <linux/types.h>
include/uapi/linux/sysctl.h +1 -1
@@ -22,7 +22,7 @@#ifndef _UAPI_LINUX_SYSCTL_H#define _UAPI_LINUX_SYSCTL_H -#include <linux/kernel.h> +#include <linux/const.h> #include <linux/types.h> #include <linux/compiler.h>
include/xen/xenbus.h +14 -1
@@ -58,6 +58,15 @@ struct xenbus_watch/* Path being watched. */ const char *node; +unsigned int nr_pending; + +/* +* Called just before enqueing new event while a spinlock is held. +* The event will be discarded if this callback returns false. +*/ +bool (*will_handle)(struct xenbus_watch *, +const char **vec,unsigned int len); +/* Callback (executed in a process context with no locks held). */ void (*callback)(struct xenbus_watch *,const char **vec,unsigned int len);
@@ -194,10 +203,14 @@ void xenbus_suspend_cancel(void);int xenbus_watch_path (struct xenbus_device *dev,const char *path,struct xenbus_watch *watch, +bool (*will_handle)(struct xenbus_watch *, +const char **,unsigned int ),void (*callback)(struct xenbus_watch *,const char **,unsigned int )); -__printf(4, 5) +__printf(5, 6)int xenbus_watch_pathfmt (struct xenbus_device *dev,struct xenbus_watch *watch, +bool (*will_handle)(struct xenbus_watch *, +const char **,unsigned int ),void (*callback)(struct xenbus_watch *,const char **,unsigned int ),const char *pathfmt, ...);
kernel/module.c +4 -2
@@ -1762,7 +1762,6 @@ static int mod_sysfs_init(struct module *mod)if (err)mod_kobject_put (mod); -/* delay uevent until full sysfs population */ out:return err; }
@@ -1796,7 +1795,6 @@ static int mod_sysfs_setup(struct module *mod,add_sect_attrs (mod, info);add_notes_attrs (mod, info); -kobject_uevent (&mod->mkobj.kobj,KOBJ_ADD );return 0 ; out_unreg_param:
@@ -3427,6 +3425,9 @@ static noinline int do_init_module(struct module *mod)blocking_notifier_call_chain (&module_notify_list,MODULE_STATE_LIVE , mod); +/* Delay uevent until module has finished its init routine */ +kobject_uevent (&mod->mkobj.kobj,KOBJ_ADD ); +/* * We need to finish all async code before the module init sequence * is done. This has potential to deadlock. For example, a newly
@@ -3738,6 +3739,7 @@ static int load_module(struct load_info *info, const char __user *uargs, MODULE_STATE_GOING, mod);klp_module_going (mod); bug_cleanup: + mod->state =MODULE_STATE_GOING ;/* module_bug_cleanup needs module_mutex protection */ mutex_lock (&module_mutex);module_bug_cleanup (mod);
net/ipv6/datagram.c +17 -4
@@ -145,10 +145,12 @@ int __ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr,struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;struct inet_sock *inet =inet_sk (sk);struct ipv6_pinfo *np =inet6_sk (sk); -struct in6_addr *daddr; +struct in6_addr *daddr, old_daddr; +__be32 fl6_flowlabel =0 ; +__be32 old_fl6_flowlabel; +__be32 old_dport;int addr_type;int err; -__be32 fl6_flowlabel =0 ;if (usin->sin6_family ==AF_INET ) {if (__ipv6_only_sock (sk))
@@ -238,9 +240,13 @@ int __ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, } } +/* save the current peer information before updating it */ + old_daddr = sk->sk_v6_daddr; + old_fl6_flowlabel = np->flow_label; + old_dport = inet->inet_dport; + sk->sk_v6_daddr = *daddr; np->flow_label = fl6_flowlabel; - inet->inet_dport = usin->sin6_port;/*
@@ -249,8 +255,15 @@ int __ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr,*/ err =ip6_datagram_dst_update (sk, true); -if (err) +if (err) { +/* Restore the socket peer info, to keep it consistent with +* the old socket state +*/ + sk->sk_v6_daddr = old_daddr; + np->flow_label = old_fl6_flowlabel; + inet->inet_dport = old_dport; goto out; + } sk->sk_state =TCP_ESTABLISHED ;sk_set_txhash (sk);
net/l2tp/l2tp_core.c +18 -20
@@ -112,6 +112,13 @@ struct l2tp_net {spinlock_t l2tp_session_hlist_lock; }; +#if IS_ENABLED (CONFIG_IPV6 ) +static bool l2tp_sk_is_v6 (struct sock *sk) +{ +return sk->sk_family ==PF_INET6 && + !ipv6_addr_v4mapped (&sk->sk_v6_daddr); +} +#endif static inline struct l2tp_tunnel *l2tp_tunnel (struct sock *sk) {
@@ -1136,7 +1143,7 @@ static int l2tp_xmit_core(struct l2tp_session *session, struct sk_buff *skb, skb->ignore_df =1 ;skb_dst_drop (skb);#if IS_ENABLED (CONFIG_IPV6 ) -if (tunnel->sock->sk_family ==PF_INET6 && !tunnel->v4mapped) +if (l2tp_sk_is_v6 (tunnel->sock)) error =inet6_csk_xmit (tunnel->sock, skb,NULL ); else#endif
@@ -1199,6 +1206,15 @@ int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len goto out_unlock; } +/* The user-space may change the connection status for the user-space +* provided socket at run time: we must check it under the socket lock +*/ +if (tunnel->fd >=0 && sk->sk_state !=TCP_ESTABLISHED ) { +kfree_skb (skb); + ret =NET_XMIT_DROP ; + goto out_unlock; + } + inet =inet_sk (sk); fl = &inet->cork.fl;switch (tunnel->encap) {
@@ -1214,7 +1230,7 @@ int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len/* Calculate UDP checksum if configured to do so */ #if IS_ENABLED (CONFIG_IPV6 ) -if (sk->sk_family ==PF_INET6 && !tunnel->v4mapped) +if (l2tp_sk_is_v6 (sk))udp6_set_csum (udp_get_no_check6_tx (sk), skb, &inet6_sk (sk)->saddr, &sk->sk_v6_daddr, udp_len);
@@ -1620,24 +1636,6 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32if (cfg !=NULL ) tunnel->debug = cfg->debug; -#if IS_ENABLED (CONFIG_IPV6 ) -if (sk->sk_family ==PF_INET6 ) { -struct ipv6_pinfo *np =inet6_sk (sk); - -if (ipv6_addr_v4mapped (&np->saddr) && -ipv6_addr_v4mapped (&sk->sk_v6_daddr)) { -struct inet_sock *inet =inet_sk (sk); - - tunnel->v4mapped = true; - inet->inet_saddr = np->saddr.s6_addr32[3 ]; - inet->inet_rcv_saddr = sk->sk_v6_rcv_saddr.s6_addr32[3 ]; - inet->inet_daddr = sk->sk_v6_daddr.s6_addr32[3 ]; - }else { - tunnel->v4mapped = false; - } - } -#endif -/* Mark socket as an encapsulation socket. See net/ipv4/udp.c */ tunnel->encap = encap;if (encap ==L2TP_ENCAPTYPE_UDP ) {
net/l2tp/l2tp_core.h +0 -3
@@ -191,9 +191,6 @@ struct l2tp_tunnel {struct sock *sock;/* Parent socket */ int fd;/* Parent fd, if tunnel socket * was created by userspace */ -#if IS_ENABLED (CONFIG_IPV6 ) -bool v4mapped; -#endif struct work_struct del_work;
sound/core/seq/seq_queue.h +4 -4
@@ -40,10 +40,10 @@ struct snd_seq_queue {struct snd_seq_timer *timer;/* time keeper for this queue */ int owner;/* client that 'owns' the timer */ - unsigned int locked:1, /* timer is only accesibble by owner if set */ - klocked:1, /* kernel lock (after START) */ - check_again:1, - check_blocked:1; +bool locked;/* timer is only accesibble by owner if set */ +bool klocked;/* kernel lock (after START) */ +bool check_again;/* concurrent access happened during check */ +bool check_blocked;/* queue being checked */ unsigned int flags;/* status flags */ unsigned int info_flags;/* info for sync */
sound/pci/hda/patch_ca0132.c +14 -2
@@ -4443,11 +4443,10 @@ static void hp_callback(struct hda_codec *codec, struct hda_jack_callback *cb)/* Delay enabling the HP amp, to let the mic-detection * state machine run. */ -cancel_delayed_work (&spec->unsol_hp_work); -schedule_delayed_work (&spec->unsol_hp_work,msecs_to_jiffies (500 )); tbl =snd_hda_jack_tbl_get (codec, cb->nid);if (tbl) tbl->block_report =1 ; +schedule_delayed_work (&spec->unsol_hp_work,msecs_to_jiffies (500 )); }static void amic_callback (struct hda_codec *codec,struct hda_jack_callback *cb)
@@ -4625,12 +4624,25 @@ static void ca0132_free(struct hda_codec *codec)kfree (codec->spec); } +#ifdef CONFIG_PM +static int ca0132_suspend (struct hda_codec *codec) +{ +struct ca0132_spec *spec = codec->spec; + +cancel_delayed_work_sync (&spec->unsol_hp_work); +return 0 ; +} +#endif +static const struct hda_codec_ops ca0132_patch_ops = { .build_controls = ca0132_build_controls, .build_pcms = ca0132_build_pcms, .init = ca0132_init, .free = ca0132_free, .unsol_event = snd_hda_jack_unsol_event, +#ifdef CONFIG_PM + .suspend = ca0132_suspend, +#endif };static void ca0132_config (struct hda_codec *codec)
sound/pci/hda/patch_realtek.c +22 -3
@@ -330,9 +330,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)case 0x10ec0225 :case 0x10ec0233 :case 0x10ec0235 : -case 0x10ec0236 :case 0x10ec0255 : -case 0x10ec0256 :case 0x10ec0257 :case 0x10ec0282 :case 0x10ec0283 :
@@ -343,6 +341,11 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)case 0x10ec0299 :alc_update_coef_idx (codec,0x10 ,1 <<9 ,0 );break ; +case 0x10ec0236 : +case 0x10ec0256 : +alc_write_coef_idx (codec,0x36 ,0x5757 ); +alc_update_coef_idx (codec,0x10 ,1 <<9 ,0 ); +break ;case 0x10ec0285 :case 0x10ec0293 :alc_update_coef_idx (codec,0xa ,1 <<13 ,0 );
@@ -4896,6 +4899,7 @@ enum {ALC269_FIXUP_DELL1_MIC_NO_PRESENCE ,ALC269_FIXUP_DELL2_MIC_NO_PRESENCE ,ALC269_FIXUP_DELL3_MIC_NO_PRESENCE , +ALC269_FIXUP_DELL4_MIC_NO_PRESENCE ,ALC269_FIXUP_HEADSET_MODE ,ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC , ALC269_FIXUP_ASPIRE_HEADSET_MIC,
@@ -5199,6 +5203,16 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id =ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC }, + [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl []) { + {0x19 ,0x01a1913c },/* use as headset mic, without its own jack detect */ + {0x1b ,0x01a1913d },/* use as headphone mic, without its own jack detect */ + { } + }, + .chained = true, + .chain_id =ALC269_FIXUP_HEADSET_MODE + }, [ALC269_FIXUP_HEADSET_MODE] = { .type = HDA_FIXUP_FUNC, .v.func = alc_fixup_headset_mode,
@@ -6183,7 +6197,7 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { {0x12, 0x90a60120}, {0x14, 0x90170110}, {0x21, 0x0321101f}), -SND_HDA_PIN_QUIRK (0x10ec0289 ,0x1028 ,"Dell" ,ALC225_FIXUP_DELL1_MIC_NO_PRESENCE , +SND_HDA_PIN_QUIRK (0x10ec0289 ,0x1028 ,"Dell" ,ALC269_FIXUP_DELL4_MIC_NO_PRESENCE , {0x12, 0xb7a60130}, {0x14, 0x90170110}, {0x21, 0x04211020}),
@@ -6267,6 +6281,11 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { {0x17, 0x90170110}, {0x1a, 0x03011020}, {0x21, 0x03211030}), +SND_HDA_PIN_QUIRK (0x10ec0299 ,0x1028 ,"Dell" ,ALC269_FIXUP_DELL4_MIC_NO_PRESENCE , +ALC225_STANDARD_PINS , + {0x12, 0xb7a60130}, + {0x13, 0xb8a60140}, + {0x17, 0x90170110}), {} };
sound/usb/pcm.c +20 -32
76 lines not on this page · raw message