commit: c9bcd80ed661f00249bf33aecd1eda50e84500de Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> AuthorDate: Wed Jun 28 10:29:09 2023 +0000 Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> CommitDate: Wed Jun 28 10:29:09 2023 +0000 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=c9bcd80e
Linux patch 4.19.288 Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org> 0000_README | 4 + 1287_linux-4.19.288.patch | 1689 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1693 insertions(+) diff --git a/0000_README b/0000_README index 4b3f829e..47d5babb 100644 --- a/0000_README +++ b/0000_README @@ -1191,6 +1191,10 @@ Patch: 1286_linux-4.19.287.patch From: https://www.kernel.org Desc: Linux 4.19.287 +Patch: 1287_linux-4.19.288.patch +From: https://www.kernel.org +Desc: Linux 4.19.288 + Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1287_linux-4.19.288.patch b/1287_linux-4.19.288.patch new file mode 100644 index 00000000..7b0d397f --- /dev/null +++ b/1287_linux-4.19.288.patch @@ -0,0 +1,1689 @@ +diff --git a/Makefile b/Makefile +index 756d6e997cd23..0293da44bdcd2 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 4 + PATCHLEVEL = 19 +-SUBLEVEL = 287 ++SUBLEVEL = 288 + EXTRAVERSION = + NAME = "People's Front" + +diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h +index e90cf51b87eca..22266c7e2cc1e 100644 +--- a/arch/arm64/include/asm/sysreg.h ++++ b/arch/arm64/include/asm/sysreg.h +@@ -98,8 +98,14 @@ + (!!x)<<8 | 0x1f) + + #define SYS_DC_ISW sys_insn(1, 0, 7, 6, 2) ++#define SYS_DC_IGSW sys_insn(1, 0, 7, 6, 4) ++#define SYS_DC_IGDSW sys_insn(1, 0, 7, 6, 6) + #define SYS_DC_CSW sys_insn(1, 0, 7, 10, 2) ++#define SYS_DC_CGSW sys_insn(1, 0, 7, 10, 4) ++#define SYS_DC_CGDSW sys_insn(1, 0, 7, 10, 6) + #define SYS_DC_CISW sys_insn(1, 0, 7, 14, 2) ++#define SYS_DC_CIGSW sys_insn(1, 0, 7, 14, 4) ++#define SYS_DC_CIGDSW sys_insn(1, 0, 7, 14, 6) + + #define SYS_OSDTRRX_EL1 sys_reg(2, 0, 0, 0, 2) + #define SYS_MDCCINT_EL1 sys_reg(2, 0, 0, 2, 0) +diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c +index 8e70c2ba21b3d..fb17767552ef4 100644 +--- a/arch/x86/kernel/apic/x2apic_phys.c ++++ b/arch/x86/kernel/apic/x2apic_phys.c +@@ -102,7 +102,10 @@ static void init_x2apic_ldr(void) + + static int x2apic_phys_probe(void) + { +- if (x2apic_mode && (x2apic_phys || x2apic_fadt_phys())) ++ if (!x2apic_mode) ++ return 0; ++ ++ if (x2apic_phys || x2apic_fadt_phys()) + return 1; + + return apic == &apic_x2apic_phys; +diff --git a/arch/x86/purgatory/Makefile b/arch/x86/purgatory/Makefile +index 002f7a01af11f..00f104e341e57 100644 +--- a/arch/x86/purgatory/Makefile ++++ b/arch/x86/purgatory/Makefile +@@ -12,6 +12,11 @@ $(obj)/string.o: $(srctree)/arch/x86/boot/compressed/string.c FORCE + $(obj)/sha256.o: $(srctree)/lib/sha256.c FORCE + $(call if_changed_rule,cc_o_c) + ++# When profile-guided optimization is enabled, llvm emits two different ++# overlapping text sections, which is not supported by kexec. Remove profile ++# optimization flags. ++KBUILD_CFLAGS := $(filter-out -fprofile-sample-use=% -fprofile-use=%,$(KBUILD_CFLAGS)) ++ + LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined -nostdlib -z nodefaultlib + targets += purgatory.ro + +diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c +index 31cfa47d24984..988d0e37f87fd 100644 +--- a/drivers/char/ipmi/ipmi_msghandler.c ++++ b/drivers/char/ipmi/ipmi_msghandler.c +@@ -541,15 +541,20 @@ struct ipmi_smi { + atomic_t event_waiters; + unsigned int ticks_to_req_ev; + ++ spinlock_t watch_lock; /* For dealing with watch stuff below. */ ++ + /* How many users are waiting for commands? */ +- atomic_t command_waiters; ++ unsigned int command_waiters; + + /* How many users are waiting for watchdogs? */ +- atomic_t watchdog_waiters; ++ unsigned int watchdog_waiters; ++ ++ /* How many users are waiting for message responses? */ ++ unsigned int response_waiters; + + /* + * Tells what the lower layer has last been asked to watch for, +- * messages and/or watchdogs. Protected by xmit_msgs_lock. ++ * messages and/or watchdogs. Protected by watch_lock. + */ + unsigned int last_watch_mask; + +@@ -945,6 +950,64 @@ static void deliver_err_response(struct ipmi_smi *intf, + deliver_local_response(intf, msg); + } + ++static void smi_add_watch(struct ipmi_smi *intf, unsigned int flags) ++{ ++ unsigned long iflags; ++ ++ if (!intf->handlers->set_need_watch) ++ return; ++ ++ spin_lock_irqsave(&intf->watch_lock, iflags); ++ if (flags & IPMI_WATCH_MASK_CHECK_MESSAGES) ++ intf->response_waiters++; ++ ++ if (flags & IPMI_WATCH_MASK_CHECK_WATCHDOG) ++ intf->watchdog_waiters++; ++ ++ if (flags & IPMI_WATCH_MASK_CHECK_COMMANDS) ++ intf->command_waiters++; ++ ++ if ((intf->last_watch_mask & flags) != flags) { ++ intf->last_watch_mask |= flags; ++ intf->handlers->set_need_watch(intf->send_info, ++ intf->last_watch_mask); ++ } ++ spin_unlock_irqrestore(&intf->watch_lock, iflags); ++} ++ ++static void smi_remove_watch(struct ipmi_smi *intf, unsigned int flags) ++{ ++ unsigned long iflags; ++ ++ if (!intf->handlers->set_need_watch) ++ return; ++ ++ spin_lock_irqsave(&intf->watch_lock, iflags); ++ if (flags & IPMI_WATCH_MASK_CHECK_MESSAGES) ++ intf->response_waiters--; ++ ++ if (flags & IPMI_WATCH_MASK_CHECK_WATCHDOG) ++ intf->watchdog_waiters--; ++ ++ if (flags & IPMI_WATCH_MASK_CHECK_COMMANDS) ++ intf->command_waiters--; ++ ++ flags = 0; ++ if (intf->response_waiters) ++ flags |= IPMI_WATCH_MASK_CHECK_MESSAGES; ++ if (intf->watchdog_waiters) ++ flags |= IPMI_WATCH_MASK_CHECK_WATCHDOG; ++ if (intf->command_waiters) ++ flags |= IPMI_WATCH_MASK_CHECK_COMMANDS; ++ ++ if (intf->last_watch_mask != flags) { ++ intf->last_watch_mask = flags; ++ intf->handlers->set_need_watch(intf->send_info, ++ intf->last_watch_mask); ++ } ++ spin_unlock_irqrestore(&intf->watch_lock, iflags); ++} ++ + /* + * Find the next sequence number not being used and add the given + * message with the given timeout to the sequence table. This must be +@@ -988,6 +1051,7 @@ static int intf_next_seq(struct ipmi_smi *intf, + *seq = i; + *seqid = intf->seq_table[i].seqid; + intf->curr_seq = (i+1)%IPMI_IPMB_NUM_SEQ; ++ smi_add_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); + need_waiter(intf); + } else { + rv = -EAGAIN; +@@ -1026,6 +1090,7 @@ static int intf_find_seq(struct ipmi_smi *intf, + && (ipmi_addr_equal(addr, &msg->addr))) { + *recv_msg = msg; + intf->seq_table[seq].inuse = 0; ++ smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); + rv = 0; + } + } +@@ -1087,6 +1152,7 @@ static int intf_err_seq(struct ipmi_smi *intf, + struct seq_table *ent = &intf->seq_table[seq]; + + ent->inuse = 0; ++ smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); + msg = ent->recv_msg; + rv = 0; + } +@@ -1098,30 +1164,6 @@ static int intf_err_seq(struct ipmi_smi *intf, + return rv; + } + +-/* Must be called with xmit_msgs_lock held. */ +-static void smi_tell_to_watch(struct ipmi_smi *intf, +- unsigned int flags, +- struct ipmi_smi_msg *smi_msg) +-{ +- if (flags & IPMI_WATCH_MASK_CHECK_MESSAGES) { +- if (!smi_msg) +- return; +- +- if (!smi_msg->needs_response) +- return; +- } +- +- if (!intf->handlers->set_need_watch) +- return; +- +- if ((intf->last_watch_mask & flags) == flags) +- return; +- +- intf->last_watch_mask |= flags; +- intf->handlers->set_need_watch(intf->send_info, +- intf->last_watch_mask); +-} +- + static void free_user_work(struct work_struct *work) + { + struct ipmi_user *user = container_of(work, struct ipmi_user, +@@ -1198,12 +1240,9 @@ int ipmi_create_user(unsigned int if_num, + spin_lock_irqsave(&intf->seq_lock, flags); + list_add_rcu(&new_user->link, &intf->users); + spin_unlock_irqrestore(&intf->seq_lock, flags); +- if (handler->ipmi_watchdog_pretimeout) { ++ if (handler->ipmi_watchdog_pretimeout) + /* User wants pretimeouts, so make sure to watch for them. */ +- if (atomic_inc_return(&intf->watchdog_waiters) == 1) +- smi_tell_to_watch(intf, IPMI_WATCH_MASK_CHECK_WATCHDOG, +- NULL); +- } ++ smi_add_watch(intf, IPMI_WATCH_MASK_CHECK_WATCHDOG); + srcu_read_unlock(&ipmi_interfaces_srcu, index); + *user = new_user; + return 0; +@@ -1276,7 +1315,7 @@ static void _ipmi_destroy_user(struct ipmi_user *user) + user->handler->shutdown(user->handler_data); + + if (user->handler->ipmi_watchdog_pretimeout) +- atomic_dec(&intf->watchdog_waiters); ++ smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_WATCHDOG); + + if (user->gets_events) + atomic_dec(&intf->event_waiters); +@@ -1289,6 +1328,7 @@ static void _ipmi_destroy_user(struct ipmi_user *user) + if (intf->seq_table[i].inuse + && (intf->seq_table[i].recv_msg->user == user)) { + intf->seq_table[i].inuse = 0; ++ smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); + ipmi_free_recv_msg(intf->seq_table[i].recv_msg); + } + } +@@ -1634,8 +1674,7 @@ int ipmi_register_for_cmd(struct ipmi_user *user, + goto out_unlock; + } + +- if (atomic_inc_return(&intf->command_waiters) == 1) +- smi_tell_to_watch(intf, IPMI_WATCH_MASK_CHECK_COMMANDS, NULL); ++ smi_add_watch(intf, IPMI_WATCH_MASK_CHECK_COMMANDS); + + list_add_rcu(&rcvr->link, &intf->cmd_rcvrs); + +@@ -1685,7 +1724,7 @@ int ipmi_unregister_for_cmd(struct ipmi_user *user, + synchronize_rcu(); + release_ipmi_user(user, index); + while (rcvrs) { +- atomic_dec(&intf->command_waiters); ++ smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_COMMANDS); + rcvr = rcvrs; + rcvrs = rcvr->next; + kfree(rcvr); +@@ -1813,8 +1852,6 @@ static void smi_send(struct ipmi_smi *intf, + spin_lock_irqsave(&intf->xmit_msgs_lock, flags); + smi_msg = smi_add_send_msg(intf, smi_msg, priority); + +- smi_tell_to_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES, smi_msg); +- + if (!run_to_completion) + spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags); + +@@ -2014,9 +2051,6 @@ static int i_ipmi_req_ipmb(struct ipmi_smi *intf, + ipmb_seq, broadcast, + source_address, source_lun); + +- /* We will be getting a response in the BMC message queue. */ +- smi_msg->needs_response = true; +- + /* + * Copy the message into the recv message data, so we + * can retransmit it later if necessary. +@@ -2204,7 +2238,6 @@ static int i_ipmi_request(struct ipmi_user *user, + goto out; + } + } +- smi_msg->needs_response = false; + + rcu_read_lock(); + if (intf->in_shutdown) { +@@ -3425,9 +3458,8 @@ int ipmi_add_smi(struct module *owner, + INIT_LIST_HEAD(&intf->xmit_msgs); + INIT_LIST_HEAD(&intf->hp_xmit_msgs); + spin_lock_init(&intf->events_lock); ++ spin_lock_init(&intf->watch_lock); + atomic_set(&intf->event_waiters, 0); +- atomic_set(&intf->watchdog_waiters, 0); +- atomic_set(&intf->command_waiters, 0); + intf->ticks_to_req_ev = IPMI_REQUEST_EV_TIME; + INIT_LIST_HEAD(&intf->waiting_events); + intf->waiting_events_count = 0; +@@ -4207,7 +4239,53 @@ static int handle_one_recv_msg(struct ipmi_smi *intf, + int chan; + + ipmi_debug_msg("Recv:", msg->rsp, msg->rsp_size); +- if (msg->rsp_size < 2) { ++ ++ if ((msg->data_size >= 2) ++ && (msg->data[0] == (IPMI_NETFN_APP_REQUEST << 2)) ++ && (msg->data[1] == IPMI_SEND_MSG_CMD) ++ && (msg->user_data == NULL)) { ++ ++ if (intf->in_shutdown) ++ goto free_msg; ++ ++ /* ++ * This is the local response to a command send, start ++ * the timer for these. The user_data will not be ++ * NULL if this is a response send, and we will let ++ * response sends just go through. ++ */ ++ ++ /* ++ * Check for errors, if we get certain errors (ones ++ * that mean basically we can try again later), we ++ * ignore them and start the timer. Otherwise we ++ * report the error immediately. ++ */ ++ if ((msg->rsp_size >= 3) && (msg->rsp[2] != 0) ++ && (msg->rsp[2] != IPMI_NODE_BUSY_ERR) ++ && (msg->rsp[2] != IPMI_LOST_ARBITRATION_ERR) ++ && (msg->rsp[2] != IPMI_BUS_ERR) ++ && (msg->rsp[2] != IPMI_NAK_ON_WRITE_ERR)) { ++ int ch = msg->rsp[3] & 0xf; ++ struct ipmi_channel *chans; ++ ++ /* Got an error sending the message, handle it. */ ++ ++ chans = READ_ONCE(intf->channel_list)->c; ++ if ((chans[ch].medium == IPMI_CHANNEL_MEDIUM_8023LAN) ++ || (chans[ch].medium == IPMI_CHANNEL_MEDIUM_ASYNC)) ++ ipmi_inc_stat(intf, sent_lan_command_errs); ++ else ++ ipmi_inc_stat(intf, sent_ipmb_command_errs); ++ intf_err_seq(intf, msg->msgid, msg->rsp[2]); ++ } else ++ /* The message was sent, start the timer. */ ++ intf_start_seq_timer(intf, msg->msgid); ++free_msg: ++ requeue = 0; ++ goto out; ++ ++ } else if (msg->rsp_size < 2) { + /* Message is too small to be correct. */ + dev_warn(intf->si_dev, + PFX "BMC returned to small a message for netfn %x cmd %x, got %d bytes\n", +@@ -4447,8 +4525,6 @@ static void smi_recv_tasklet(unsigned long val) + } + } + +- smi_tell_to_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES, newmsg); +- + if (!run_to_completion) + spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags); + if (newmsg) +@@ -4466,62 +4542,16 @@ void ipmi_smi_msg_received(struct ipmi_smi *intf, + unsigned long flags = 0; /* keep us warning-free. */ + int run_to_completion = intf->run_to_completion; + +- if ((msg->data_size >= 2) +- && (msg->data[0] == (IPMI_NETFN_APP_REQUEST << 2)) +- && (msg->data[1] == IPMI_SEND_MSG_CMD) +- && (msg->user_data == NULL)) { +- +- if (intf->in_shutdown) +- goto free_msg; +- +- /* +- * This is the local response to a command send, start +- * the timer for these. The user_data will not be +- * NULL if this is a response send, and we will let +- * response sends just go through. +- */ +- +- /* +- * Check for errors, if we get certain errors (ones +- * that mean basically we can try again later), we +- * ignore them and start the timer. Otherwise we +- * report the error immediately. +- */ +- if ((msg->rsp_size >= 3) && (msg->rsp[2] != 0) +- && (msg->rsp[2] != IPMI_NODE_BUSY_ERR) +- && (msg->rsp[2] != IPMI_LOST_ARBITRATION_ERR) +- && (msg->rsp[2] != IPMI_BUS_ERR) +- && (msg->rsp[2] != IPMI_NAK_ON_WRITE_ERR)) { +- int ch = msg->rsp[3] & 0xf; +- struct ipmi_channel *chans; +- +- /* Got an error sending the message, handle it. */ +- +- chans = READ_ONCE(intf->channel_list)->c; +- if ((chans[ch].medium == IPMI_CHANNEL_MEDIUM_8023LAN) +- || (chans[ch].medium == IPMI_CHANNEL_MEDIUM_ASYNC)) +- ipmi_inc_stat(intf, sent_lan_command_errs); +- else +- ipmi_inc_stat(intf, sent_ipmb_command_errs); +- intf_err_seq(intf, msg->msgid, msg->rsp[2]); +- } else +- /* The message was sent, start the timer. */ +- intf_start_seq_timer(intf, msg->msgid); +- +-free_msg: +- ipmi_free_smi_msg(msg); +- } else { +- /* +- * To preserve message order, we keep a queue and deliver from +- * a tasklet. +- */ +- if (!run_to_completion) +- spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); +- list_add_tail(&msg->link, &intf->waiting_rcv_msgs); +- if (!run_to_completion) +- spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, +- flags); +- } ++ /* ++ * To preserve message order, we keep a queue and deliver from ++ * a tasklet. ++ */ ++ if (!run_to_completion) ++ spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); ++ list_add_tail(&msg->link, &intf->waiting_rcv_msgs); ++ if (!run_to_completion) ++ spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, ++ flags); + + if (!run_to_completion) + spin_lock_irqsave(&intf->xmit_msgs_lock, flags); +@@ -4576,7 +4606,7 @@ static void check_msg_timeout(struct ipmi_smi *intf, struct seq_table *ent, + struct list_head *timeouts, + unsigned long timeout_period, + int slot, unsigned long *flags, +- unsigned int *watch_mask) ++ bool *need_timer) + { + struct ipmi_recv_msg *msg; + +@@ -4588,13 +4618,14 @@ static void check_msg_timeout(struct ipmi_smi *intf, struct seq_table *ent, + + if (timeout_period < ent->timeout) { + ent->timeout -= timeout_period; +- *watch_mask |= IPMI_WATCH_MASK_CHECK_MESSAGES; ++ *need_timer = true; + return; + } + + if (ent->retries_left == 0) { + /* The message has used all its retries. */ + ent->inuse = 0; ++ smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); + msg = ent->recv_msg; + list_add_tail(&msg->link, timeouts); + if (ent->broadcast) +@@ -4607,7 +4638,7 @@ static void check_msg_timeout(struct ipmi_smi *intf, struct seq_table *ent, + struct ipmi_smi_msg *smi_msg; + /* More retries, send again. */ + +- *watch_mask |= IPMI_WATCH_MASK_CHECK_MESSAGES; ++ *need_timer = true; + + /* + * Start with the max timer, set to normal timer after +@@ -4652,20 +4683,20 @@ static void check_msg_timeout(struct ipmi_smi *intf, struct seq_table *ent, + } + } + +-static unsigned int ipmi_timeout_handler(struct ipmi_smi *intf, +- unsigned long timeout_period) ++static bool ipmi_timeout_handler(struct ipmi_smi *intf, ++ unsigned long timeout_period) + { + struct list_head timeouts; + struct ipmi_recv_msg *msg, *msg2; + unsigned long flags; + int i; +- unsigned int watch_mask = 0; ++ bool need_timer = false; + + if (!intf->bmc_registered) { + kref_get(&intf->refcount); + if (!schedule_work(&intf->bmc_reg_work)) { + kref_put(&intf->refcount, intf_free); +- watch_mask |= IPMI_WATCH_MASK_INTERNAL; ++ need_timer = true; + } + } + +@@ -4685,7 +4716,7 @@ static unsigned int ipmi_timeout_handler(struct ipmi_smi *intf, + for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) + check_msg_timeout(intf, &intf->seq_table[i], + &timeouts, timeout_period, i, +- &flags, &watch_mask); ++ &flags, &need_timer); + spin_unlock_irqrestore(&intf->seq_lock, flags); + + list_for_each_entry_safe(msg, msg2, &timeouts, link) +@@ -4716,7 +4747,7 @@ static unsigned int ipmi_timeout_handler(struct ipmi_smi *intf, + + tasklet_schedule(&intf->recv_tasklet); + +- return watch_mask; ++ return need_timer; + } + + static void ipmi_request_event(struct ipmi_smi *intf) +@@ -4736,9 +4767,8 @@ static atomic_t stop_operation; + static void ipmi_timeout(struct timer_list *unused) + { + struct ipmi_smi *intf; +- unsigned int watch_mask = 0; ++ bool need_timer = false; + int index; +- unsigned long flags; + + if (atomic_read(&stop_operation)) + return; +@@ -4751,28 +4781,14 @@ static void ipmi_timeout(struct timer_list *unused) + ipmi_request_event(intf); + intf->ticks_to_req_ev = IPMI_REQUEST_EV_TIME; + } +- watch_mask |= IPMI_WATCH_MASK_INTERNAL; ++ need_timer = true; + } + +- if (atomic_read(&intf->watchdog_waiters)) +- watch_mask |= IPMI_WATCH_MASK_CHECK_WATCHDOG; +- +- if (atomic_read(&intf->command_waiters)) +- watch_mask |= IPMI_WATCH_MASK_CHECK_COMMANDS; +- +- watch_mask |= ipmi_timeout_handler(intf, IPMI_TIMEOUT_TIME); +- +- spin_lock_irqsave(&intf->xmit_msgs_lock, flags); +- if (watch_mask != intf->last_watch_mask && +- intf->handlers->set_need_watch) +- intf->handlers->set_need_watch(intf->send_info, +- watch_mask); +- intf->last_watch_mask = watch_mask; +- spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags); ++ need_timer |= ipmi_timeout_handler(intf, IPMI_TIMEOUT_TIME); + } + srcu_read_unlock(&ipmi_interfaces_srcu, index); + +- if (watch_mask) ++ if (need_timer) + mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES); + } + +diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c +index 429fe063e33ff..8c7a1b8f96896 100644 +--- a/drivers/char/ipmi/ipmi_si_intf.c ++++ b/drivers/char/ipmi/ipmi_si_intf.c +@@ -1079,7 +1079,7 @@ static void set_need_watch(void *send_info, unsigned int watch_mask) + unsigned long flags; + int enable; + +- enable = !!(watch_mask & ~IPMI_WATCH_MASK_INTERNAL); ++ enable = !!watch_mask; + + atomic_set(&smi_info->need_watch, enable); + spin_lock_irqsave(&smi_info->si_lock, flags); +diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c +index 34c5b287c4125..fc4a96014161b 100644 +--- a/drivers/char/ipmi/ipmi_ssif.c ++++ b/drivers/char/ipmi/ipmi_ssif.c +@@ -1159,7 +1159,7 @@ static void ssif_set_need_watch(void *send_info, unsigned int watch_mask) + + if (watch_mask & IPMI_WATCH_MASK_CHECK_MESSAGES) + timeout = SSIF_WATCH_MSG_TIMEOUT; +- else if (watch_mask & ~IPMI_WATCH_MASK_INTERNAL) ++ else if (watch_mask) + timeout = SSIF_WATCH_WATCHDOG_TIMEOUT; + + flags = ipmi_ssif_lock_cond(ssif_info, &oflags); +diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c +index f2481a2014bb3..2b7ecc02b2774 100644 +--- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c ++++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c +@@ -1327,7 +1327,7 @@ int exynos_g2d_exec_ioctl(struct drm_device *drm_dev, void *data, + /* Let the runqueue know that there is work to do. */ + queue_work(g2d->g2d_workq, &g2d->runqueue_work); + +- if (runqueue_node->async) ++ if (req->async) + goto out; + + wait_for_completion(&runqueue_node->complete); +diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c +index 19697c1362d8f..947c9627c565a 100644 +--- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c ++++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c +@@ -480,8 +480,6 @@ static int vidi_remove(struct platform_device *pdev) + if (ctx->raw_edid != (struct edid *)fake_edid_info) { + kfree(ctx->raw_edid); + ctx->raw_edid = NULL; +- +- return -EINVAL; + } + + component_del(&pdev->dev, &vidi_component_ops); +diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c +index 27d8e7dd2d067..46f7789693ea0 100644 +--- a/drivers/gpu/drm/radeon/radeon_gem.c ++++ b/drivers/gpu/drm/radeon/radeon_gem.c +@@ -377,7 +377,6 @@ int radeon_gem_set_domain_ioctl(struct drm_device *dev, void *data, + struct radeon_device *rdev = dev->dev_private; + struct drm_radeon_gem_set_domain *args = data; + struct drm_gem_object *gobj; +- struct radeon_bo *robj; + int r; + + /* for now if someone requests domain CPU - +@@ -390,13 +389,12 @@ int radeon_gem_set_domain_ioctl(struct drm_device *dev, void *data, + up_read(&rdev->exclusive_lock); + return -ENOENT; + } +- robj = gem_to_radeon_bo(gobj); + + r = radeon_gem_set_domain(gobj, args->read_domains, args->write_domain); + + drm_gem_object_put_unlocked(gobj); + up_read(&rdev->exclusive_lock); +- r = radeon_gem_handle_lockup(robj->rdev, r); ++ r = radeon_gem_handle_lockup(rdev, r); + return r; + } + +diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c +index 4e4a3424c1f9f..c50b26a9bc445 100644 +--- a/drivers/hid/wacom_sys.c ++++ b/drivers/hid/wacom_sys.c +@@ -2390,8 +2390,13 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless) + goto fail_quirks; + } + +- if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR) ++ if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR) { + error = hid_hw_open(hdev); ++ if (error) { ++ hid_err(hdev, "hw open failed\n"); ++ goto fail_quirks; ++ } ++ } + + wacom_set_shared_values(wacom_wac); + devres_close_group(&hdev->dev, wacom); +diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c +index ccfa5ceb43c0c..f79346de7f889 100644 +--- a/drivers/hv/channel_mgmt.c ++++ b/drivers/hv/channel_mgmt.c +@@ -813,11 +813,22 @@ static void vmbus_wait_for_unload(void) + if (completion_done(&vmbus_connection.unload_event)) + goto completed; + +- for_each_online_cpu(cpu) { ++ for_each_present_cpu(cpu) { + struct hv_per_cpu_context *hv_cpu + = per_cpu_ptr(hv_context.cpu_context, cpu); + ++ /* ++ * In a CoCo VM the synic_message_page is not allocated ++ * in hv_synic_alloc(). Instead it is set/cleared in ++ * hv_synic_enable_regs() and hv_synic_disable_regs() ++ * such that it is set only when the CPU is online. If ++ * not all present CPUs are online, the message page ++ * might be NULL, so skip such CPUs. ++ */ + page_addr = hv_cpu->synic_message_page; ++ if (!page_addr) ++ continue; ++ + msg = (struct hv_message *)page_addr + + VMBUS_MESSAGE_SINT; + +@@ -851,11 +862,14 @@ completed: + * maybe-pending messages on all CPUs to be able to receive new + * messages after we reconnect. + */ +- for_each_online_cpu(cpu) { ++ for_each_present_cpu(cpu) { + struct hv_per_cpu_context *hv_cpu + = per_cpu_ptr(hv_context.cpu_context, cpu); + + page_addr = hv_cpu->synic_message_page; ++ if (!page_addr) ++ continue; ++ + msg = (struct hv_message *)page_addr + VMBUS_MESSAGE_SINT; + msg->header.message_type = HVMSG_NONE; + } +diff --git a/drivers/i2c/busses/i2c-imx-lpi2c.c b/drivers/i2c/busses/i2c-imx-lpi2c.c +index f494b27497005..a4f90796032b3 100644 +--- a/drivers/i2c/busses/i2c-imx-lpi2c.c ++++ b/drivers/i2c/busses/i2c-imx-lpi2c.c +@@ -206,8 +206,8 @@ static void lpi2c_imx_stop(struct lpi2c_imx_struct *lpi2c_imx) + /* CLKLO = I2C_CLK_RATIO * CLKHI, SETHOLD = CLKHI, DATAVD = CLKHI/2 */ + static int lpi2c_imx_config(struct lpi2c_imx_struct *lpi2c_imx) + { +- u8 prescale, filt, sethold, clkhi, clklo, datavd; +- unsigned int clk_rate, clk_cycle; ++ u8 prescale, filt, sethold, datavd; ++ unsigned int clk_rate, clk_cycle, clkhi, clklo; + enum lpi2c_imx_pincfg pincfg; + unsigned int temp; + +diff --git a/drivers/media/cec/cec-adap.c b/drivers/media/cec/cec-adap.c +index a42043379d676..2f49c4db49b35 100644 +--- a/drivers/media/cec/cec-adap.c ++++ b/drivers/media/cec/cec-adap.c +@@ -1032,7 +1032,8 @@ void cec_received_msg_ts(struct cec_adapter *adap, + mutex_lock(&adap->lock); + dprintk(2, "%s: %*ph\n", __func__, msg->len, msg->msg); + +- adap->last_initiator = 0xff; ++ if (!adap->transmit_in_progress) ++ adap->last_initiator = 0xff; + + /* Check if this message was for us (directed or broadcast). */ + if (!cec_msg_is_broadcast(msg)) +diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c +index 967e47770af67..d42c5da1a2260 100644 +--- a/drivers/mmc/host/mtk-sd.c ++++ b/drivers/mmc/host/mtk-sd.c +@@ -1912,7 +1912,7 @@ static int msdc_drv_probe(struct platform_device *pdev) + + host->irq = platform_get_irq(pdev, 0); + if (host->irq < 0) { +- ret = -EINVAL; ++ ret = host->irq; + goto host_free; + } + +diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c +index e22bbff89c8d2..fff9980a3ef28 100644 +--- a/drivers/mmc/host/mvsdio.c ++++ b/drivers/mmc/host/mvsdio.c +@@ -699,17 +699,15 @@ static int mvsd_probe(struct platform_device *pdev) + struct mmc_host *mmc = NULL; + struct mvsd_host *host = NULL; + const struct mbus_dram_target_info *dram; +- struct resource *r; + int ret, irq; + + if (!np) { + dev_err(&pdev->dev, "no DT node\n"); + return -ENODEV; + } +- r = platform_get_resource(pdev, IORESOURCE_MEM, 0); + irq = platform_get_irq(pdev, 0); +- if (!r || irq < 0) +- return -ENXIO; ++ if (irq < 0) ++ return irq; + + mmc = mmc_alloc_host(sizeof(struct mvsd_host), &pdev->dev); + if (!mmc) { +@@ -761,7 +759,7 @@ static int mvsd_probe(struct platform_device *pdev) + + spin_lock_init(&host->lock); + +- host->base = devm_ioremap_resource(&pdev->dev, r); ++ host->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(host->base)) { + ret = PTR_ERR(host->base); + goto out; +diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c +index b2873a2432b69..345b35483cee7 100644 +--- a/drivers/mmc/host/omap.c ++++ b/drivers/mmc/host/omap.c +@@ -1347,7 +1347,7 @@ static int mmc_omap_probe(struct platform_device *pdev) + + irq = platform_get_irq(pdev, 0); + if (irq < 0) +- return -ENXIO; ++ return irq; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + host->virt_base = devm_ioremap_resource(&pdev->dev, res); +diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c +index 0135693afa158..881d1de4a5635 100644 +--- a/drivers/mmc/host/omap_hsmmc.c ++++ b/drivers/mmc/host/omap_hsmmc.c +@@ -2006,9 +2006,11 @@ static int omap_hsmmc_probe(struct platform_device *pdev) + } + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- irq = platform_get_irq(pdev, 0); +- if (res == NULL || irq < 0) ++ if (!res) + return -ENXIO; ++ irq = platform_get_irq(pdev, 0); ++ if (irq < 0) ++ return irq; + + base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(base)) +diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c +index 6cc187ce3a329..069b9a07aca5d 100644 +--- a/drivers/mmc/host/sdhci-acpi.c ++++ b/drivers/mmc/host/sdhci-acpi.c +@@ -721,7 +721,7 @@ static int sdhci_acpi_probe(struct platform_device *pdev) + host->ops = &sdhci_acpi_ops_dflt; + host->irq = platform_get_irq(pdev, 0); + if (host->irq < 0) { +- err = -EINVAL; ++ err = host->irq; + goto err_free; + } + +diff --git a/drivers/mmc/host/usdhi6rol0.c b/drivers/mmc/host/usdhi6rol0.c +index b88728b686e8a..e436f7e7a3ee0 100644 +--- a/drivers/mmc/host/usdhi6rol0.c ++++ b/drivers/mmc/host/usdhi6rol0.c +@@ -1749,8 +1749,10 @@ static int usdhi6_probe(struct platform_device *pdev) + irq_cd = platform_get_irq_byname(pdev, "card detect"); + irq_sd = platform_get_irq_byname(pdev, "data"); + irq_sdio = platform_get_irq_byname(pdev, "SDIO"); +- if (irq_sd < 0 || irq_sdio < 0) +- return -ENODEV; ++ if (irq_sd < 0) ++ return irq_sd; ++ if (irq_sdio < 0) ++ return irq_sdio; + + mmc = mmc_alloc_host(sizeof(struct usdhi6_host), dev); + if (!mmc) +diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c +index 05cb2f7cc35c3..8603df2ae1736 100644 +--- a/drivers/net/ethernet/emulex/benet/be_main.c ++++ b/drivers/net/ethernet/emulex/benet/be_main.c +@@ -1136,8 +1136,8 @@ static struct sk_buff *be_lancer_xmit_workarounds(struct be_adapter *adapter, + eth_hdr_len = ntohs(skb->protocol) == ETH_P_8021Q ? + VLAN_ETH_HLEN : ETH_HLEN; + if (skb->len <= 60 && +- (lancer_chip(adapter) || skb_vlan_tag_present(skb)) && +- is_ipv4_pkt(skb)) { ++ (lancer_chip(adapter) || BE3_chip(adapter) || ++ skb_vlan_tag_present(skb)) && is_ipv4_pkt(skb)) { + ip = (struct iphdr *)ip_hdr(skb); + pskb_trim(skb, eth_hdr_len + ntohs(ip->tot_len)); + } +diff --git a/drivers/net/ethernet/qualcomm/qca_spi.c b/drivers/net/ethernet/qualcomm/qca_spi.c +index afd49c7fd87fe..3e6095f0cb5f5 100644 +--- a/drivers/net/ethernet/qualcomm/qca_spi.c ++++ b/drivers/net/ethernet/qualcomm/qca_spi.c +@@ -553,8 +553,7 @@ qcaspi_spi_thread(void *data) + while (!kthread_should_stop()) { + set_current_state(TASK_INTERRUPTIBLE); + if ((qca->intr_req == qca->intr_svc) && +- (qca->txr.skb[qca->txr.head] == NULL) && +- (qca->sync == QCASPI_SYNC_READY)) ++ !qca->txr.skb[qca->txr.head]) + schedule(); + + set_current_state(TASK_RUNNING); +diff --git a/drivers/net/ieee802154/mac802154_hwsim.c b/drivers/net/ieee802154/mac802154_hwsim.c +index d07e5571e07ae..1ac600d186886 100644 +--- a/drivers/net/ieee802154/mac802154_hwsim.c ++++ b/drivers/net/ieee802154/mac802154_hwsim.c +@@ -540,7 +540,7 @@ static int hwsim_del_edge_nl(struct sk_buff *msg, struct genl_info *info) + static int hwsim_set_edge_lqi(struct sk_buff *msg, struct genl_info *info) + { + struct nlattr *edge_attrs[MAC802154_HWSIM_EDGE_ATTR_MAX + 1]; +- struct hwsim_edge_info *einfo; ++ struct hwsim_edge_info *einfo, *einfo_old; + struct hwsim_phy *phy_v0; + struct hwsim_edge *e; + u32 v0, v1; +@@ -580,8 +580,10 @@ static int hwsim_set_edge_lqi(struct sk_buff *msg, struct genl_info *info) + list_for_each_entry_rcu(e, &phy_v0->edges, list) { + if (e->endpoint->idx == v1) { + einfo->lqi = lqi; +- rcu_assign_pointer(e->info, einfo); ++ einfo_old = rcu_replace_pointer(e->info, einfo, ++ lockdep_is_held(&hwsim_phys_lock)); + rcu_read_unlock(); ++ kfree_rcu(einfo_old, rcu); + mutex_unlock(&hwsim_phys_lock); + return 0; + } +diff --git a/drivers/nfc/nfcsim.c b/drivers/nfc/nfcsim.c +index 533e3aa6275cd..cf07b366500e9 100644 +--- a/drivers/nfc/nfcsim.c ++++ b/drivers/nfc/nfcsim.c +@@ -345,10 +345,6 @@ static struct dentry *nfcsim_debugfs_root; + static void nfcsim_debugfs_init(void) + { + nfcsim_debugfs_root = debugfs_create_dir("nfcsim", NULL); +- +- if (!nfcsim_debugfs_root) +- pr_err("Could not create debugfs entry\n"); +- + } + + static void nfcsim_debugfs_remove(void) +diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c +index 63c79e140f1a8..f5f201bfc814d 100644 +--- a/drivers/pci/controller/pci-hyperv.c ++++ b/drivers/pci/controller/pci-hyperv.c +@@ -2445,6 +2445,24 @@ static int hv_pci_query_relations(struct hv_device *hdev) + if (!ret) + ret = wait_for_response(hdev, &comp); + ++ /* ++ * In the case of fast device addition/removal, it's possible that ++ * vmbus_sendpacket() or wait_for_response() returns -ENODEV but we ++ * already got a PCI_BUS_RELATIONS* message from the host and the ++ * channel callback already scheduled a work to hbus->wq, which can be ++ * running pci_devices_present_work() -> survey_child_resources() -> ++ * complete(&hbus->survey_event), even after hv_pci_query_relations() ++ * exits and the stack variable 'comp' is no longer valid; as a result, ++ * a hang or a page fault may happen when the complete() calls ++ * raw_spin_lock_irqsave(). Flush hbus->wq before we exit from ++ * hv_pci_query_relations() to avoid the issues. Note: if 'ret' is ++ * -ENODEV, there can't be any more work item scheduled to hbus->wq ++ * after the flush_workqueue(): see vmbus_onoffer_rescind() -> ++ * vmbus_reset_channel_cb(), vmbus_rescind_cleanup() -> ++ * channel->rescind = true. ++ */ ++ flush_workqueue(hbus->wq); ++ + return ret; + } + +diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c +index c9bc9a6bd73b7..ee4338158ae2e 100644 +--- a/drivers/s390/cio/device.c ++++ b/drivers/s390/cio/device.c +@@ -1353,6 +1353,7 @@ void ccw_device_set_notoper(struct ccw_device *cdev) + enum io_sch_action { + IO_SCH_UNREG, + IO_SCH_ORPH_UNREG, ++ IO_SCH_UNREG_CDEV, + IO_SCH_ATTACH, + IO_SCH_UNREG_ATTACH, + IO_SCH_ORPH_ATTACH, +@@ -1385,7 +1386,7 @@ static enum io_sch_action sch_get_action(struct subchannel *sch) + } + if ((sch->schib.pmcw.pam & sch->opm) == 0) { + if (ccw_device_notify(cdev, CIO_NO_PATH) != NOTIFY_OK) +- return IO_SCH_UNREG; ++ return IO_SCH_UNREG_CDEV; + return IO_SCH_DISC; + } + if (device_is_disconnected(cdev)) +@@ -1447,6 +1448,7 @@ static int io_subchannel_sch_event(struct subchannel *sch, int process) + case IO_SCH_ORPH_ATTACH: + ccw_device_set_disconnected(cdev); + break; ++ case IO_SCH_UNREG_CDEV: + case IO_SCH_UNREG_ATTACH: + case IO_SCH_UNREG: + if (!cdev) +@@ -1480,6 +1482,7 @@ static int io_subchannel_sch_event(struct subchannel *sch, int process) + if (rc) + goto out; + break; ++ case IO_SCH_UNREG_CDEV: + case IO_SCH_UNREG_ATTACH: + spin_lock_irqsave(sch->lock, flags); + if (cdev->private->flags.resuming) { +diff --git a/drivers/target/iscsi/iscsi_target_nego.c b/drivers/target/iscsi/iscsi_target_nego.c +index 5db8842a80265..e39177f9fdb0a 100644 +--- a/drivers/target/iscsi/iscsi_target_nego.c ++++ b/drivers/target/iscsi/iscsi_target_nego.c +@@ -1072,6 +1072,7 @@ int iscsi_target_locate_portal( + iscsi_target_set_sock_callbacks(conn); + + login->np = np; ++ conn->tpg = NULL; + + login_req = (struct iscsi_login_req *) login->req; + payload_length = ntoh24(login_req->dlength); +@@ -1141,7 +1142,6 @@ int iscsi_target_locate_portal( + */ + sessiontype = strncmp(s_buf, DISCOVERY, 9); + if (!sessiontype) { +- conn->tpg = iscsit_global->discovery_tpg; + if (!login->leading_connection) + goto get_target; + +@@ -1158,9 +1158,11 @@ int iscsi_target_locate_portal( + * Serialize access across the discovery struct iscsi_portal_group to + * process login attempt. + */ ++ conn->tpg = iscsit_global->discovery_tpg; + if (iscsit_access_np(np, conn->tpg) < 0) { + iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, + ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE); ++ conn->tpg = NULL; + ret = -1; + goto out; + } +diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c +index 044128277248b..6cd168cb673fd 100644 +--- a/drivers/tty/serial/lantiq.c ++++ b/drivers/tty/serial/lantiq.c +@@ -113,6 +113,13 @@ struct ltq_uart_port { + unsigned int err_irq; + }; + ++static inline void asc_update_bits(u32 clear, u32 set, void __iomem *reg) ++{ ++ u32 tmp = __raw_readl(reg); ++ ++ __raw_writel((tmp & ~clear) | set, reg); ++} ++ + static inline struct + ltq_uart_port *to_ltq_uart_port(struct uart_port *port) + { +@@ -138,7 +145,7 @@ lqasc_start_tx(struct uart_port *port) + static void + lqasc_stop_rx(struct uart_port *port) + { +- ltq_w32(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE); ++ __raw_writel(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE); + } + + static int +@@ -147,11 +154,12 @@ lqasc_rx_chars(struct uart_port *port) + struct tty_port *tport = &port->state->port; + unsigned int ch = 0, rsr = 0, fifocnt; + +- fifocnt = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK; ++ fifocnt = __raw_readl(port->membase + LTQ_ASC_FSTAT) & ++ ASCFSTAT_RXFFLMASK; + while (fifocnt--) { + u8 flag = TTY_NORMAL; +- ch = ltq_r8(port->membase + LTQ_ASC_RBUF); +- rsr = (ltq_r32(port->membase + LTQ_ASC_STATE) ++ ch = readb(port->membase + LTQ_ASC_RBUF); ++ rsr = (__raw_readl(port->membase + LTQ_ASC_STATE) + & ASCSTATE_ANY) | UART_DUMMY_UER_RX; + tty_flip_buffer_push(tport); + port->icount.rx++; +@@ -163,16 +171,16 @@ lqasc_rx_chars(struct uart_port *port) + if (rsr & ASCSTATE_ANY) { + if (rsr & ASCSTATE_PE) { + port->icount.parity++; +- ltq_w32_mask(0, ASCWHBSTATE_CLRPE, ++ asc_update_bits(0, ASCWHBSTATE_CLRPE, + port->membase + LTQ_ASC_WHBSTATE); + } else if (rsr & ASCSTATE_FE) { + port->icount.frame++; +- ltq_w32_mask(0, ASCWHBSTATE_CLRFE, ++ asc_update_bits(0, ASCWHBSTATE_CLRFE, + port->membase + LTQ_ASC_WHBSTATE); + } + if (rsr & ASCSTATE_ROE) { + port->icount.overrun++; +- ltq_w32_mask(0, ASCWHBSTATE_CLRROE, ++ asc_update_bits(0, ASCWHBSTATE_CLRROE, + port->membase + LTQ_ASC_WHBSTATE); + } + +@@ -211,10 +219,10 @@ lqasc_tx_chars(struct uart_port *port) + return; + } + +- while (((ltq_r32(port->membase + LTQ_ASC_FSTAT) & ++ while (((__raw_readl(port->membase + LTQ_ASC_FSTAT) & + ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF) != 0) { + if (port->x_char) { +- ltq_w8(port->x_char, port->membase + LTQ_ASC_TBUF); ++ writeb(port->x_char, port->membase + LTQ_ASC_TBUF); + port->icount.tx++; + port->x_char = 0; + continue; +@@ -223,7 +231,7 @@ lqasc_tx_chars(struct uart_port *port) + if (uart_circ_empty(xmit)) + break; + +- ltq_w8(port->state->xmit.buf[port->state->xmit.tail], ++ writeb(port->state->xmit.buf[port->state->xmit.tail], + port->membase + LTQ_ASC_TBUF); + xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); + port->icount.tx++; +@@ -239,7 +247,7 @@ lqasc_tx_int(int irq, void *_port) + unsigned long flags; + struct uart_port *port = (struct uart_port *)_port; + spin_lock_irqsave(<q_asc_lock, flags); +- ltq_w32(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR); ++ __raw_writel(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR); + spin_unlock_irqrestore(<q_asc_lock, flags); + lqasc_start_tx(port); + return IRQ_HANDLED; +@@ -251,8 +259,9 @@ lqasc_err_int(int irq, void *_port) + unsigned long flags; + struct uart_port *port = (struct uart_port *)_port; + spin_lock_irqsave(<q_asc_lock, flags); ++ __raw_writel(ASC_IRNCR_EIR, port->membase + LTQ_ASC_IRNCR); + /* clear any pending interrupts */ +- ltq_w32_mask(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE | ++ asc_update_bits(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE | + ASCWHBSTATE_CLRROE, port->membase + LTQ_ASC_WHBSTATE); + spin_unlock_irqrestore(<q_asc_lock, flags); + return IRQ_HANDLED; +@@ -264,7 +273,7 @@ lqasc_rx_int(int irq, void *_port) + unsigned long flags; + struct uart_port *port = (struct uart_port *)_port; + spin_lock_irqsave(<q_asc_lock, flags); +- ltq_w32(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR); ++ __raw_writel(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR); + lqasc_rx_chars(port); + spin_unlock_irqrestore(<q_asc_lock, flags); + return IRQ_HANDLED; +@@ -274,7 +283,8 @@ static unsigned int + lqasc_tx_empty(struct uart_port *port) + { + int status; +- status = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK; ++ status = __raw_readl(port->membase + LTQ_ASC_FSTAT) & ++ ASCFSTAT_TXFFLMASK; + return status ? 0 : TIOCSER_TEMT; + } + +@@ -304,15 +314,15 @@ lqasc_startup(struct uart_port *port) + clk_enable(ltq_port->clk); + port->uartclk = clk_get_rate(ltq_port->fpiclk); + +- ltq_w32_mask(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET), ++ asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET), + port->membase + LTQ_ASC_CLC); + +- ltq_w32(0, port->membase + LTQ_ASC_PISEL); +- ltq_w32( ++ __raw_writel(0, port->membase + LTQ_ASC_PISEL); ++ __raw_writel( + ((TXFIFO_FL << ASCTXFCON_TXFITLOFF) & ASCTXFCON_TXFITLMASK) | + ASCTXFCON_TXFEN | ASCTXFCON_TXFFLU, + port->membase + LTQ_ASC_TXFCON); +- ltq_w32( ++ __raw_writel( + ((RXFIFO_FL << ASCRXFCON_RXFITLOFF) & ASCRXFCON_RXFITLMASK) + | ASCRXFCON_RXFEN | ASCRXFCON_RXFFLU, + port->membase + LTQ_ASC_RXFCON); +@@ -320,7 +330,7 @@ lqasc_startup(struct uart_port *port) + * setting enable bits + */ + wmb(); +- ltq_w32_mask(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN | ++ asc_update_bits(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN | + ASCCON_ROEN, port->membase + LTQ_ASC_CON); + + retval = request_irq(ltq_port->tx_irq, lqasc_tx_int, +@@ -344,7 +354,7 @@ lqasc_startup(struct uart_port *port) + goto err2; + } + +- ltq_w32(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX, ++ __raw_writel(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX, + port->membase + LTQ_ASC_IRNREN); + return 0; + +@@ -363,10 +373,10 @@ lqasc_shutdown(struct uart_port *port) + free_irq(ltq_port->rx_irq, port); + free_irq(ltq_port->err_irq, port); + +- ltq_w32(0, port->membase + LTQ_ASC_CON); +- ltq_w32_mask(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU, ++ __raw_writel(0, port->membase + LTQ_ASC_CON); ++ asc_update_bits(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU, + port->membase + LTQ_ASC_RXFCON); +- ltq_w32_mask(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU, ++ asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU, + port->membase + LTQ_ASC_TXFCON); + if (!IS_ERR(ltq_port->clk)) + clk_disable(ltq_port->clk); +@@ -438,7 +448,7 @@ lqasc_set_termios(struct uart_port *port, + spin_lock_irqsave(<q_asc_lock, flags); + + /* set up CON */ +- ltq_w32_mask(0, con, port->membase + LTQ_ASC_CON); ++ asc_update_bits(0, con, port->membase + LTQ_ASC_CON); + + /* Set baud rate - take a divider of 2 into account */ + baud = uart_get_baud_rate(port, new, old, 0, port->uartclk / 16); +@@ -446,22 +456,22 @@ lqasc_set_termios(struct uart_port *port, + divisor = divisor / 2 - 1; + + /* disable the baudrate generator */ +- ltq_w32_mask(ASCCON_R, 0, port->membase + LTQ_ASC_CON); ++ asc_update_bits(ASCCON_R, 0, port->membase + LTQ_ASC_CON); + + /* make sure the fractional divider is off */ +- ltq_w32_mask(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON); ++ asc_update_bits(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON); + + /* set up to use divisor of 2 */ +- ltq_w32_mask(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON); ++ asc_update_bits(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON); + + /* now we can write the new baudrate into the register */ +- ltq_w32(divisor, port->membase + LTQ_ASC_BG); ++ __raw_writel(divisor, port->membase + LTQ_ASC_BG); + + /* turn the baudrate generator back on */ +- ltq_w32_mask(0, ASCCON_R, port->membase + LTQ_ASC_CON); ++ asc_update_bits(0, ASCCON_R, port->membase + LTQ_ASC_CON); + + /* enable rx */ +- ltq_w32(ASCWHBSTATE_SETREN, port->membase + LTQ_ASC_WHBSTATE); ++ __raw_writel(ASCWHBSTATE_SETREN, port->membase + LTQ_ASC_WHBSTATE); + + spin_unlock_irqrestore(<q_asc_lock, flags); + +@@ -572,10 +582,10 @@ lqasc_console_putchar(struct uart_port *port, int ch) + return; + + do { +- fifofree = (ltq_r32(port->membase + LTQ_ASC_FSTAT) ++ fifofree = (__raw_readl(port->membase + LTQ_ASC_FSTAT) + & ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF; + } while (fifofree == 0); +- ltq_w8(ch, port->membase + LTQ_ASC_TBUF); ++ writeb(ch, port->membase + LTQ_ASC_TBUF); + } + + static void lqasc_serial_port_write(struct uart_port *port, const char *s, +diff --git a/drivers/usb/gadget/udc/amd5536udc_pci.c b/drivers/usb/gadget/udc/amd5536udc_pci.c +index 362284057d307..a3d15c3fb82a9 100644 +--- a/drivers/usb/gadget/udc/amd5536udc_pci.c ++++ b/drivers/usb/gadget/udc/amd5536udc_pci.c +@@ -171,6 +171,9 @@ static int udc_pci_probe( + retval = -ENODEV; + goto err_probe; + } ++ ++ udc = dev; ++ + return 0; + + err_probe: +diff --git a/fs/nilfs2/page.c b/fs/nilfs2/page.c +index c726b42ca92d1..e5fee7fac9154 100644 +--- a/fs/nilfs2/page.c ++++ b/fs/nilfs2/page.c +@@ -372,7 +372,15 @@ void nilfs_clear_dirty_pages(struct address_space *mapping, bool silent) + struct page *page = pvec.pages[i]; + + lock_page(page); +- nilfs_clear_dirty_page(page, silent); ++ ++ /* ++ * This page may have been removed from the address ++ * space by truncation or invalidation when the lock ++ * was acquired. Skip processing in that case. ++ */ ++ if (likely(page->mapping == mapping)) ++ nilfs_clear_dirty_page(page, silent); ++ + unlock_page(page); + } + pagevec_release(&pvec); +diff --git a/fs/nilfs2/segbuf.c b/fs/nilfs2/segbuf.c +index 20c479b5e41b8..e72466fc8ca93 100644 +--- a/fs/nilfs2/segbuf.c ++++ b/fs/nilfs2/segbuf.c +@@ -101,6 +101,12 @@ int nilfs_segbuf_extend_segsum(struct nilfs_segment_buffer *segbuf) + if (unlikely(!bh)) + return -ENOMEM; + ++ lock_buffer(bh); ++ if (!buffer_uptodate(bh)) { ++ memset(bh->b_data, 0, bh->b_size); ++ set_buffer_uptodate(bh); ++ } ++ unlock_buffer(bh); + nilfs_segbuf_add_segsum_buffer(segbuf, bh); + return 0; + } +diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c +index 3091d1a3eddea..d9e0b2b2b5552 100644 +--- a/fs/nilfs2/segment.c ++++ b/fs/nilfs2/segment.c +@@ -984,10 +984,13 @@ static void nilfs_segctor_fill_in_super_root(struct nilfs_sc_info *sci, + unsigned int isz, srsz; + + bh_sr = NILFS_LAST_SEGBUF(&sci->sc_segbufs)->sb_super_root; ++ ++ lock_buffer(bh_sr); + raw_sr = (struct nilfs_super_root *)bh_sr->b_data; + isz = nilfs->ns_inode_size; + srsz = NILFS_SR_BYTES(isz); + ++ raw_sr->sr_sum = 0; /* Ensure initialization within this update */ + raw_sr->sr_bytes = cpu_to_le16(srsz); + raw_sr->sr_nongc_ctime + = cpu_to_le64(nilfs_doing_gc() ? +@@ -1001,6 +1004,8 @@ static void nilfs_segctor_fill_in_super_root(struct nilfs_sc_info *sci, + nilfs_write_inode_common(nilfs->ns_sufile, (void *)raw_sr + + NILFS_SR_SUFILE_OFFSET(isz), 1); + memset((void *)raw_sr + srsz, 0, nilfs->ns_blocksize - srsz); ++ set_buffer_uptodate(bh_sr); ++ unlock_buffer(bh_sr); + } + + static void nilfs_redirty_inodes(struct list_head *head) +@@ -1778,6 +1783,7 @@ static void nilfs_abort_logs(struct list_head *logs, int err) + list_for_each_entry(segbuf, logs, sb_list) { + list_for_each_entry(bh, &segbuf->sb_segsum_buffers, + b_assoc_buffers) { ++ clear_buffer_uptodate(bh); + if (bh->b_page != bd_page) { + if (bd_page) + end_page_writeback(bd_page); +@@ -1789,6 +1795,7 @@ static void nilfs_abort_logs(struct list_head *logs, int err) + b_assoc_buffers) { + clear_buffer_async_write(bh); + if (bh == segbuf->sb_super_root) { ++ clear_buffer_uptodate(bh); + if (bh->b_page != bd_page) { + end_page_writeback(bd_page); + bd_page = bh->b_page; +diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c +index 221a54faab526..99bcb4ab47a61 100644 +--- a/fs/nilfs2/super.c ++++ b/fs/nilfs2/super.c +@@ -374,10 +374,31 @@ static int nilfs_move_2nd_super(struct super_block *sb, loff_t sb2off) + goto out; + } + nsbp = (void *)nsbh->b_data + offset; +- memset(nsbp, 0, nilfs->ns_blocksize); + ++ lock_buffer(nsbh); + if (sb2i >= 0) { ++ /* ++ * The position of the second superblock only changes by 4KiB, ++ * which is larger than the maximum superblock data size ++ * (= 1KiB), so there is no need to use memmove() to allow ++ * overlap between source and destination. ++ */ + memcpy(nsbp, nilfs->ns_sbp[sb2i], nilfs->ns_sbsize); ++ ++ /* ++ * Zero fill after copy to avoid overwriting in case of move ++ * within the same block. ++ */ ++ memset(nsbh->b_data, 0, offset); ++ memset((void *)nsbp + nilfs->ns_sbsize, 0, ++ nsbh->b_size - offset - nilfs->ns_sbsize); ++ } else { ++ memset(nsbh->b_data, 0, nsbh->b_size); ++ } ++ set_buffer_uptodate(nsbh); ++ unlock_buffer(nsbh); ++ ++ if (sb2i >= 0) { + brelse(nilfs->ns_sbh[sb2i]); + nilfs->ns_sbh[sb2i] = nsbh; + nilfs->ns_sbp[sb2i] = nsbp; +diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c +index 24f626e7d012a..d550a564645e2 100644 +--- a/fs/nilfs2/the_nilfs.c ++++ b/fs/nilfs2/the_nilfs.c +@@ -375,6 +375,18 @@ unsigned long nilfs_nrsvsegs(struct the_nilfs *nilfs, unsigned long nsegs) + 100)); + } + ++/** ++ * nilfs_max_segment_count - calculate the maximum number of segments ++ * @nilfs: nilfs object ++ */ ++static u64 nilfs_max_segment_count(struct the_nilfs *nilfs) ++{ ++ u64 max_count = U64_MAX; ++ ++ do_div(max_count, nilfs->ns_blocks_per_segment); ++ return min_t(u64, max_count, ULONG_MAX); ++} ++ + void nilfs_set_nsegments(struct the_nilfs *nilfs, unsigned long nsegs) + { + nilfs->ns_nsegments = nsegs; +@@ -384,6 +396,8 @@ void nilfs_set_nsegments(struct the_nilfs *nilfs, unsigned long nsegs) + static int nilfs_store_disk_layout(struct the_nilfs *nilfs, + struct nilfs_super_block *sbp) + { ++ u64 nsegments, nblocks; ++ + if (le32_to_cpu(sbp->s_rev_level) < NILFS_MIN_SUPP_REV) { + nilfs_msg(nilfs->ns_sb, KERN_ERR, + "unsupported revision (superblock rev.=%d.%d, current rev.=%d.%d). Please check the version of mkfs.nilfs(2).", +@@ -430,7 +444,35 @@ static int nilfs_store_disk_layout(struct the_nilfs *nilfs, + return -EINVAL; + } + +- nilfs_set_nsegments(nilfs, le64_to_cpu(sbp->s_nsegments)); ++ nsegments = le64_to_cpu(sbp->s_nsegments); ++ if (nsegments > nilfs_max_segment_count(nilfs)) { ++ nilfs_msg(nilfs->ns_sb, KERN_ERR, ++ "segment count %llu exceeds upper limit (%llu segments)", ++ (unsigned long long)nsegments, ++ (unsigned long long)nilfs_max_segment_count(nilfs)); ++ return -EINVAL; ++ } ++ ++ nblocks = (u64)i_size_read(nilfs->ns_sb->s_bdev->bd_inode) >> ++ nilfs->ns_sb->s_blocksize_bits; ++ if (nblocks) { ++ u64 min_block_count = nsegments * nilfs->ns_blocks_per_segment; ++ /* ++ * To avoid failing to mount early device images without a ++ * second superblock, exclude that block count from the ++ * "min_block_count" calculation. ++ */ ++ ++ if (nblocks < min_block_count) { ++ nilfs_msg(nilfs->ns_sb, KERN_ERR, ++ "total number of segment blocks %llu exceeds device size (%llu blocks)", ++ (unsigned long long)min_block_count, ++ (unsigned long long)nblocks); ++ return -EINVAL; ++ } ++ } ++ ++ nilfs_set_nsegments(nilfs, nsegments); + nilfs->ns_crc_seed = le32_to_cpu(sbp->s_crc_seed); + return 0; + } +diff --git a/include/linux/ipmi_smi.h b/include/linux/ipmi_smi.h +index 86b119400f301..75865064c70b2 100644 +--- a/include/linux/ipmi_smi.h ++++ b/include/linux/ipmi_smi.h +@@ -32,14 +32,11 @@ typedef struct ipmi_smi *ipmi_smi_t; + + /* + * Flags for set_check_watch() below. Tells if the SMI should be +- * waiting for watchdog timeouts, commands and/or messages. There is +- * also an internal flag for the message handler, SMIs should ignore +- * it. ++ * waiting for watchdog timeouts, commands and/or messages. + */ +-#define IPMI_WATCH_MASK_INTERNAL (1 << 0) +-#define IPMI_WATCH_MASK_CHECK_MESSAGES (1 << 1) +-#define IPMI_WATCH_MASK_CHECK_WATCHDOG (1 << 2) +-#define IPMI_WATCH_MASK_CHECK_COMMANDS (1 << 3) ++#define IPMI_WATCH_MASK_CHECK_MESSAGES (1 << 0) ++#define IPMI_WATCH_MASK_CHECK_WATCHDOG (1 << 1) ++#define IPMI_WATCH_MASK_CHECK_COMMANDS (1 << 2) + + /* + * Messages to/from the lower layer. The smi interface will take one +@@ -66,12 +63,6 @@ struct ipmi_smi_msg { + int rsp_size; + unsigned char rsp[IPMI_MAX_MSG_LENGTH]; + +- /* +- * There should be a response message coming back in the BMC +- * message queue. +- */ +- bool needs_response; +- + /* + * Will be called when the system is done with the message + * (presumably to free it). +diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h +index 68cbe111420bc..cf139d6e5c1d3 100644 +--- a/include/linux/rcupdate.h ++++ b/include/linux/rcupdate.h +@@ -410,6 +410,24 @@ static inline void rcu_preempt_sleep_check(void) { } + _r_a_p__v; \ + }) + ++/** ++ * rcu_replace_pointer() - replace an RCU pointer, returning its old value ++ * @rcu_ptr: RCU pointer, whose old value is returned ++ * @ptr: regular pointer ++ * @c: the lockdep conditions under which the dereference will take place ++ * ++ * Perform a replacement, where @rcu_ptr is an RCU-annotated ++ * pointer and @c is the lockdep argument that is passed to the ++ * rcu_dereference_protected() call used to read that pointer. The old ++ * value of @rcu_ptr is returned, and @rcu_ptr is set to @ptr. ++ */ ++#define rcu_replace_pointer(rcu_ptr, ptr, c) \ ++({ \ ++ typeof(ptr) __tmp = rcu_dereference_protected((rcu_ptr), (c)); \ ++ rcu_assign_pointer((rcu_ptr), (ptr)); \ ++ __tmp; \ ++}) ++ + /** + * rcu_swap_protected() - swap an RCU and a regular pointer + * @rcu_ptr: RCU pointer +diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c +index a8185cdb8587b..6322b56529e91 100644 +--- a/kernel/cgroup/cgroup.c ++++ b/kernel/cgroup/cgroup.c +@@ -1652,7 +1652,7 @@ int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask) + { + struct cgroup *dcgrp = &dst_root->cgrp; + struct cgroup_subsys *ss; +- int ssid, i, ret; ++ int ssid, ret; + u16 dfl_disable_ss_mask = 0; + + lockdep_assert_held(&cgroup_mutex); +@@ -1696,7 +1696,8 @@ int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask) + struct cgroup_root *src_root = ss->root; + struct cgroup *scgrp = &src_root->cgrp; + struct cgroup_subsys_state *css = cgroup_css(scgrp, ss); +- struct css_set *cset; ++ struct css_set *cset, *cset_pos; ++ struct css_task_iter *it; + + WARN_ON(!css || cgroup_css(dcgrp, ss)); + +@@ -1714,9 +1715,22 @@ int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask) + css->cgroup = dcgrp; + + spin_lock_irq(&css_set_lock); +- hash_for_each(css_set_table, i, cset, hlist) ++ WARN_ON(!list_empty(&dcgrp->e_csets[ss->id])); ++ list_for_each_entry_safe(cset, cset_pos, &scgrp->e_csets[ss->id], ++ e_cset_node[ss->id]) { + list_move_tail(&cset->e_cset_node[ss->id], + &dcgrp->e_csets[ss->id]); ++ /* ++ * all css_sets of scgrp together in same order to dcgrp, ++ * patch in-flight iterators to preserve correct iteration. ++ * since the iterator is always advanced right away and ++ * finished when it->cset_pos meets it->cset_head, so only ++ * update it->cset_head is enough here. ++ */ ++ list_for_each_entry(it, &cset->task_iters, iters_node) ++ if (it->cset_head == &scgrp->e_csets[ss->id]) ++ it->cset_head = &dcgrp->e_csets[ss->id]; ++ } + spin_unlock_irq(&css_set_lock); + + /* default hierarchy doesn't enable controllers by default */ +diff --git a/net/ipv4/esp4_offload.c b/net/ipv4/esp4_offload.c +index 58834a10c0be7..93045373e44bd 100644 +--- a/net/ipv4/esp4_offload.c ++++ b/net/ipv4/esp4_offload.c +@@ -237,6 +237,9 @@ static int esp_xmit(struct xfrm_state *x, struct sk_buff *skb, netdev_features_ + + secpath_reset(skb); + ++ if (skb_needs_linearize(skb, skb->dev->features) && ++ __skb_linearize(skb)) ++ return -ENOMEM; + return 0; + } + +diff --git a/net/ipv6/esp6_offload.c b/net/ipv6/esp6_offload.c +index eeee64a8a72c2..69313ec24264e 100644 +--- a/net/ipv6/esp6_offload.c ++++ b/net/ipv6/esp6_offload.c +@@ -272,6 +272,9 @@ static int esp6_xmit(struct xfrm_state *x, struct sk_buff *skb, netdev_features + + secpath_reset(skb); + ++ if (skb_needs_linearize(skb, skb->dev->features) && ++ __skb_linearize(skb)) ++ return -ENOMEM; + return 0; + } + +diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c +index 62bc4cd0b7bec..2968f21915ddf 100644 +--- a/net/netfilter/nf_tables_api.c ++++ b/net/netfilter/nf_tables_api.c +@@ -4640,7 +4640,8 @@ static int nf_tables_newsetelem(struct net *net, struct sock *nlsk, + if (IS_ERR(set)) + return PTR_ERR(set); + +- if (!list_empty(&set->bindings) && set->flags & NFT_SET_CONSTANT) ++ if (!list_empty(&set->bindings) && ++ (set->flags & (NFT_SET_CONSTANT | NFT_SET_ANONYMOUS))) + return -EBUSY; + + nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) { +@@ -4823,7 +4824,9 @@ static int nf_tables_delsetelem(struct net *net, struct sock *nlsk, + set = nft_set_lookup(ctx.table, nla[NFTA_SET_ELEM_LIST_SET], genmask); + if (IS_ERR(set)) + return PTR_ERR(set); +- if (!list_empty(&set->bindings) && set->flags & NFT_SET_CONSTANT) ++ ++ if (!list_empty(&set->bindings) && ++ (set->flags & (NFT_SET_CONSTANT | NFT_SET_ANONYMOUS))) + return -EBUSY; + + if (nla[NFTA_SET_ELEM_LIST_ELEMENTS] == NULL) { +diff --git a/net/netfilter/nfnetlink_osf.c b/net/netfilter/nfnetlink_osf.c +index 917f06110c823..21e4554c76955 100644 +--- a/net/netfilter/nfnetlink_osf.c ++++ b/net/netfilter/nfnetlink_osf.c +@@ -442,3 +442,4 @@ module_init(nfnl_osf_init); + module_exit(nfnl_osf_fini); + + MODULE_LICENSE("GPL"); ++MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_OSF); +diff --git a/net/netfilter/xt_osf.c b/net/netfilter/xt_osf.c +index bf7bba80e24c1..226a317d52a0d 100644 +--- a/net/netfilter/xt_osf.c ++++ b/net/netfilter/xt_osf.c +@@ -90,4 +90,3 @@ MODULE_AUTHOR("Evgeniy Polyakov <z...@ioremap.net>"); + MODULE_DESCRIPTION("Passive OS fingerprint matching."); + MODULE_ALIAS("ipt_osf"); + MODULE_ALIAS("ip6t_osf"); +-MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_OSF); +diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c +index 31793af1a77bd..93548b9e07cf1 100644 +--- a/net/sched/sch_netem.c ++++ b/net/sched/sch_netem.c +@@ -943,6 +943,7 @@ static int netem_change(struct Qdisc *sch, struct nlattr *opt, + if (ret < 0) + return ret; + ++ sch_tree_lock(sch); + /* backup q->clg and q->loss_model */ + old_clg = q->clg; + old_loss_model = q->loss_model; +@@ -951,7 +952,7 @@ static int netem_change(struct Qdisc *sch, struct nlattr *opt, + ret = get_loss_clg(q, tb[TCA_NETEM_LOSS]); + if (ret) { + q->loss_model = old_loss_model; +- return ret; ++ goto unlock; + } + } else { + q->loss_model = CLG_RANDOM; +@@ -1018,6 +1019,8 @@ static int netem_change(struct Qdisc *sch, struct nlattr *opt, + /* capping jitter to the range acceptable by tabledist() */ + q->jitter = min_t(s64, abs(q->jitter), INT_MAX); + ++unlock: ++ sch_tree_unlock(sch); + return ret; + + get_table_failure: +@@ -1027,7 +1030,8 @@ get_table_failure: + */ + q->clg = old_clg; + q->loss_model = old_loss_model; +- return ret; ++ ++ goto unlock; + } + + static int netem_init(struct Qdisc *sch, struct nlattr *opt, +diff --git a/sound/soc/codecs/nau8824.c b/sound/soc/codecs/nau8824.c +index 4f18bb272e929..0ecea65a80b46 100644 +--- a/sound/soc/codecs/nau8824.c ++++ b/sound/soc/codecs/nau8824.c +@@ -1899,6 +1899,30 @@ static const struct dmi_system_id nau8824_quirk_table[] = { + }, + .driver_data = (void *)(NAU8824_JD_ACTIVE_HIGH), + }, ++ { ++ /* Positivo CW14Q01P */ ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Positivo Tecnologia SA"), ++ DMI_MATCH(DMI_BOARD_NAME, "CW14Q01P"), ++ }, ++ .driver_data = (void *)(NAU8824_JD_ACTIVE_HIGH), ++ }, ++ { ++ /* Positivo K1424G */ ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Positivo Tecnologia SA"), ++ DMI_MATCH(DMI_BOARD_NAME, "K1424G"), ++ }, ++ .driver_data = (void *)(NAU8824_JD_ACTIVE_HIGH), ++ }, ++ { ++ /* Positivo N14ZP74G */ ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Positivo Tecnologia SA"), ++ DMI_MATCH(DMI_BOARD_NAME, "N14ZP74G"), ++ }, ++ .driver_data = (void *)(NAU8824_JD_ACTIVE_HIGH), ++ }, + {} + }; +