Import of kernel-4.18.0-553.159.1.el8_10
This commit is contained in:
parent
57e502d298
commit
a72a9f015d
@ -12,7 +12,7 @@ RHEL_MINOR = 10
|
||||
#
|
||||
# Use this spot to avoid future merge conflicts.
|
||||
# Do not trim this comment.
|
||||
RHEL_RELEASE = 553.158.1
|
||||
RHEL_RELEASE = 553.159.1
|
||||
|
||||
#
|
||||
# ZSTREAM
|
||||
|
||||
@ -636,8 +636,7 @@ static ssize_t update_mpp(u64 *entitlement, u8 *weight)
|
||||
static ssize_t lparcfg_write(struct file *file, const char __user * buf,
|
||||
size_t count, loff_t * off)
|
||||
{
|
||||
int kbuf_sz = 64;
|
||||
char kbuf[kbuf_sz];
|
||||
char kbuf[64];
|
||||
char *tmp;
|
||||
u64 new_entitled, *new_entitled_ptr = &new_entitled;
|
||||
u8 new_weight, *new_weight_ptr = &new_weight;
|
||||
@ -646,7 +645,7 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf,
|
||||
if (!firmware_has_feature(FW_FEATURE_SPLPAR))
|
||||
return -EINVAL;
|
||||
|
||||
if (count > kbuf_sz)
|
||||
if (count == 0 || count > sizeof(kbuf))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(kbuf, buf, count))
|
||||
|
||||
@ -1759,7 +1759,9 @@ static void cpumsf_pmu_stop(struct perf_event *event, int flags)
|
||||
event->hw.state |= PERF_HES_STOPPED;
|
||||
|
||||
if ((flags & PERF_EF_UPDATE) && !(event->hw.state & PERF_HES_UPTODATE)) {
|
||||
hw_perf_event_update(event, 1);
|
||||
/* CPU hotplug off removes SDBs. No samples to extract. */
|
||||
if (cpuhw->flags & PMU_F_RESERVED)
|
||||
hw_perf_event_update(event, 1);
|
||||
event->hw.state |= PERF_HES_UPTODATE;
|
||||
}
|
||||
perf_pmu_enable(event->pmu);
|
||||
|
||||
@ -805,7 +805,7 @@ _partial_block_done_\@:
|
||||
|
||||
.if (\i == 5) || (\i == 6) || (\i == 7)
|
||||
|
||||
MOVADQ ONE(%RIP),\TMP1
|
||||
MOVADQ ONE(%rip),\TMP1
|
||||
MOVADQ 0(%arg1),\TMP2
|
||||
.irpc index, \i_seq
|
||||
paddd \TMP1, \XMM0 # INCR Y0
|
||||
@ -877,7 +877,7 @@ aes_loop_initial_\@:
|
||||
* Precomputations for HashKey parallel with encryption of first 4 blocks.
|
||||
* Haskey_i_k holds XORed values of the low and high parts of the Haskey_i
|
||||
*/
|
||||
MOVADQ ONE(%RIP),\TMP1
|
||||
MOVADQ ONE(%rip),\TMP1
|
||||
paddd \TMP1, \XMM0 # INCR Y0
|
||||
MOVADQ \XMM0, \XMM1
|
||||
PSHUFB_XMM %xmm14, \XMM1 # perform a 16 byte swap
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
#include <asm/percpu.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/processor-flags.h>
|
||||
#include <asm/ptrace-abi.h>
|
||||
#include <asm/msr.h>
|
||||
#include <asm/nospec-branch.h>
|
||||
|
||||
@ -64,41 +65,6 @@ For 32-bit we have the following conventions - kernel is built with
|
||||
* for assembly code:
|
||||
*/
|
||||
|
||||
/* The layout forms the "struct pt_regs" on the stack: */
|
||||
/*
|
||||
* C ABI says these regs are callee-preserved. They aren't saved on kernel entry
|
||||
* unless syscall needs a complete, fully filled "struct pt_regs".
|
||||
*/
|
||||
#define R15 0*8
|
||||
#define R14 1*8
|
||||
#define R13 2*8
|
||||
#define R12 3*8
|
||||
#define RBP 4*8
|
||||
#define RBX 5*8
|
||||
/* These regs are callee-clobbered. Always saved on kernel entry. */
|
||||
#define R11 6*8
|
||||
#define R10 7*8
|
||||
#define R9 8*8
|
||||
#define R8 9*8
|
||||
#define RAX 10*8
|
||||
#define RCX 11*8
|
||||
#define RDX 12*8
|
||||
#define RSI 13*8
|
||||
#define RDI 14*8
|
||||
/*
|
||||
* On syscall entry, this is syscall#. On CPU exception, this is error code.
|
||||
* On hw interrupt, it's IRQ number:
|
||||
*/
|
||||
#define ORIG_RAX 15*8
|
||||
/* Return frame for iretq */
|
||||
#define RIP 16*8
|
||||
#define CS 17*8
|
||||
#define EFLAGS 18*8
|
||||
#define RSP 19*8
|
||||
#define SS 20*8
|
||||
|
||||
#define SIZEOF_PTREGS 21*8
|
||||
|
||||
.macro PUSH_AND_CLEAR_REGS rdx=%rdx rax=%rax save_ret=0
|
||||
.if \save_ret
|
||||
pushq %rsi /* pt_regs->si */
|
||||
|
||||
@ -1324,6 +1324,8 @@ SYM_CODE_START_LOCAL(paranoid_entry)
|
||||
IBRS_ENTER save_reg=%r15
|
||||
UNTRAIN_RET
|
||||
|
||||
HANDLE_INTR_SAFERET 8(%rsp)
|
||||
|
||||
RET
|
||||
SYM_CODE_END(paranoid_entry)
|
||||
|
||||
@ -1448,6 +1450,9 @@ SYM_CODE_START_LOCAL(error_entry)
|
||||
movl %ecx, %eax /* zero extend */
|
||||
cmpq %rax, RIP+8(%rsp)
|
||||
je .Lbstep_iret
|
||||
|
||||
HANDLE_INTR_SAFERET 8(%rsp)
|
||||
|
||||
cmpq $.Lgs_change, RIP+8(%rsp)
|
||||
jne .Lerror_entry_done_lfence
|
||||
|
||||
|
||||
@ -11,6 +11,7 @@
|
||||
#include <asm/msr-index.h>
|
||||
#include <asm/unwind_hints.h>
|
||||
#include <asm/percpu.h>
|
||||
#include <asm/ptrace-abi.h>
|
||||
|
||||
/*
|
||||
* This should be used immediately before a retpoline alternative. It tells
|
||||
@ -71,6 +72,50 @@
|
||||
/* barrier for jnz misprediction */ \
|
||||
lfence;
|
||||
|
||||
/*
|
||||
* Helper for detecting if an interrupt occurred at an unsafe location within
|
||||
* Safe-RET. If Safe-RET is interrupted after the CALL or LEA the RSB may get
|
||||
* poisoned by the interrupt handler.
|
||||
*
|
||||
* The Safe-RET sequence is:
|
||||
*
|
||||
* CALL
|
||||
* LEA 8(%RSP), %RSP
|
||||
* RET
|
||||
*
|
||||
* The two CMPs below check whether RIP points to after the CALL or after the
|
||||
* LEA.
|
||||
*
|
||||
* The LFENCE below is to address this particular speculation case:
|
||||
*
|
||||
* 1. Userspace runs and poisons the BTB around the safe-RET routine
|
||||
*
|
||||
* 2. Userspace triggers some kind of exception
|
||||
*
|
||||
* 3. Kernel executes error_entry() and mis-speculates the branch into thinking
|
||||
* it actually came from kernel space
|
||||
*
|
||||
* 4. The kernel then further mis-speculates that the exception occurred due
|
||||
* to an interrupted safe-RET
|
||||
*
|
||||
* 5. The handle_interrupted_saferet() routine speculatively executes and
|
||||
* speculatively does a safe-RET. But this is unsafe since it was never
|
||||
* untrained.
|
||||
*
|
||||
* The LFENCE fixes this by ensuring step 5 is never reached speculatively.
|
||||
* Note that this LFENCE only occurs if safe-RET was actually interrupted (so
|
||||
* it's outside of the normal path).
|
||||
*/
|
||||
#define __HANDLE_INTR_SAFERET(name, pt_regs) \
|
||||
cmpq $(name), RIP+pt_regs; \
|
||||
jb 1f; \
|
||||
cmpq $(name)+5, RIP+pt_regs; \
|
||||
ja 1f; \
|
||||
lfence; \
|
||||
leaq pt_regs, %rdi; \
|
||||
call handle_interrupted_saferet; \
|
||||
1:
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
|
||||
/*
|
||||
@ -204,6 +249,15 @@
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro HANDLE_INTR_SAFERET pt_regs
|
||||
#ifdef CONFIG_MITIGATION_SRSO
|
||||
ALTERNATIVE_2 "", \
|
||||
__stringify(__HANDLE_INTR_SAFERET(srso_safe_ret, \pt_regs)), X86_FEATURE_SRSO, \
|
||||
__stringify(__HANDLE_INTR_SAFERET(srso_alias_safe_ret, \pt_regs)), X86_FEATURE_SRSO_ALIAS
|
||||
|
||||
#endif
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Macro to execute VERW instruction that mitigate transient data sampling
|
||||
* attacks such as MDS. On affected systems a microcode update overloaded VERW
|
||||
@ -454,6 +508,11 @@ static inline void mds_idle_clear_cpu_buffers(void)
|
||||
mds_clear_cpu_buffers();
|
||||
}
|
||||
|
||||
struct pt_regs;
|
||||
void srso_safe_ret(void);
|
||||
void srso_alias_safe_ret(void);
|
||||
void handle_interrupted_saferet(struct pt_regs *regs);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
/*
|
||||
|
||||
@ -3200,3 +3200,42 @@ ssize_t cpu_show_vmscape(struct device *dev, struct device_attribute *attr, char
|
||||
return cpu_show_common(dev, attr, buf, X86_BUG_VMSCAPE);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MITIGATION_SRSO
|
||||
/*
|
||||
* Called during exception/interrupt entry if interrupted during the
|
||||
* safe-RET sequence. The safe-RET sequence consists of 3 instructions:
|
||||
*
|
||||
* CALL
|
||||
* LEA 8(%RSP), %RSP
|
||||
* RET
|
||||
*
|
||||
* An interrupt after the CALL or after the LEA could potentially lead
|
||||
* to branch predictor poisoning and results in the sequence not being
|
||||
* able to be safely resumed.
|
||||
*
|
||||
* Therefore, modify the regs state as if the remaining part of the
|
||||
* safe-RET sequence executed so the interrupt returns back to the
|
||||
* desired return target, instead of the to the safe-RET sequence.
|
||||
*/
|
||||
void noinstr handle_interrupted_saferet(struct pt_regs *regs)
|
||||
{
|
||||
unsigned long rip = regs->ip;
|
||||
|
||||
if (rip == (unsigned long) srso_safe_ret ||
|
||||
rip == (unsigned long) srso_alias_safe_ret) {
|
||||
/* Modify stack pointer as if LEA executed: */
|
||||
regs->sp += 8;
|
||||
}
|
||||
|
||||
/*
|
||||
* Adjust registers as if RET executed:
|
||||
*
|
||||
* 1. Read the return address off the stack and into rIP:
|
||||
*/
|
||||
regs->ip = *(unsigned long *)(regs->sp);
|
||||
|
||||
/* 2. Pop rIP off the stack: */
|
||||
regs->sp += 8;
|
||||
}
|
||||
#endif /* CONFIG_MITIGATION_SRSO */
|
||||
|
||||
@ -75,7 +75,7 @@ SYM_CODE_START_NOALIGN(startup_64)
|
||||
mov %rsi, %r15
|
||||
|
||||
/* Set up the stack for verify_cpu(), similar to initial_stack below */
|
||||
leaq (__end_init_task - SIZEOF_PTREGS)(%rip), %rsp
|
||||
leaq (__end_init_task - FRAME_SIZE)(%rip), %rsp
|
||||
|
||||
leaq _text(%rip), %rdi
|
||||
|
||||
@ -402,10 +402,10 @@ SYM_DATA(initial_vc_handler, .quad handle_vc_boot_ghcb)
|
||||
#endif
|
||||
GLOBAL(initial_stack)
|
||||
/*
|
||||
* The SIZEOF_PTREGS gap is a convention which helps the in-kernel
|
||||
* The FRAME_SIZE gap is a convention which helps the in-kernel
|
||||
* unwinder reliably detect the end of the stack.
|
||||
*/
|
||||
.quad init_thread_union + THREAD_SIZE - SIZEOF_PTREGS
|
||||
.quad init_thread_union + THREAD_SIZE - FRAME_SIZE
|
||||
__FINITDATA
|
||||
|
||||
__INIT
|
||||
|
||||
@ -14,6 +14,8 @@
|
||||
#include <asm/nospec-branch.h>
|
||||
#include <asm/unwind_hints.h>
|
||||
|
||||
#undef RSP
|
||||
|
||||
/*
|
||||
* Must be relocatable PIC code callable as a C function, in particular
|
||||
* there must be a plain RET and not jump to return thunk.
|
||||
|
||||
@ -91,10 +91,24 @@ SYM_FUNC_END(srso_alias_untrain_ret)
|
||||
|
||||
.pushsection .text..__x86.rethunk_safe
|
||||
SYM_CODE_START_NOALIGN(srso_alias_safe_ret)
|
||||
|
||||
/*
|
||||
* Tell objtool that those are not function pointers referenced by
|
||||
* __HANDLE_INTR_SAFERET(). Below too.
|
||||
*/
|
||||
ANNOTATE_NOENDBR
|
||||
|
||||
/*
|
||||
* Safe-RET sequence. If you need to change it, adjust
|
||||
* handle_interrupted_saferet() too.
|
||||
*/
|
||||
lea 8(%_ASM_SP), %_ASM_SP
|
||||
UNWIND_HINT_FUNC
|
||||
|
||||
ANNOTATE_NOENDBR
|
||||
ANNOTATE_UNRET_SAFE
|
||||
ret
|
||||
/* End of Safe-RET sequence */
|
||||
int3
|
||||
SYM_FUNC_END(srso_alias_safe_ret)
|
||||
|
||||
@ -129,8 +143,14 @@ SYM_CODE_START_LOCAL_NOALIGN(srso_untrain_ret)
|
||||
* the stack.
|
||||
*/
|
||||
SYM_INNER_LABEL(srso_safe_ret, SYM_L_GLOBAL)
|
||||
/*
|
||||
* Safe-RET sequence. If you need to change it, adjust
|
||||
* handle_interrupted_saferet() too.
|
||||
*/
|
||||
lea 8(%_ASM_SP), %_ASM_SP
|
||||
ret
|
||||
/* End of Safe-RET sequence */
|
||||
|
||||
int3
|
||||
int3
|
||||
/* end of movabs */
|
||||
|
||||
@ -1764,7 +1764,7 @@ CONFIG_BLK_DEV_NULL_BLK=m
|
||||
CONFIG_CDROM=m
|
||||
# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
|
||||
CONFIG_ZRAM=m
|
||||
CONFIG_ZRAM_WRITEBACK=y
|
||||
# CONFIG_ZRAM_WRITEBACK is not set
|
||||
# CONFIG_ZRAM_MEMORY_TRACKING is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
# CONFIG_BLK_DEV_UMEM is not set
|
||||
|
||||
@ -1782,7 +1782,7 @@ CONFIG_BLK_DEV_NULL_BLK=m
|
||||
CONFIG_CDROM=m
|
||||
# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
|
||||
CONFIG_ZRAM=m
|
||||
CONFIG_ZRAM_WRITEBACK=y
|
||||
# CONFIG_ZRAM_WRITEBACK is not set
|
||||
# CONFIG_ZRAM_MEMORY_TRACKING is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
# CONFIG_BLK_DEV_UMEM is not set
|
||||
|
||||
@ -1721,7 +1721,7 @@ CONFIG_CDROM=m
|
||||
# CONFIG_PARIDE is not set
|
||||
# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
|
||||
CONFIG_ZRAM=m
|
||||
CONFIG_ZRAM_WRITEBACK=y
|
||||
# CONFIG_ZRAM_WRITEBACK is not set
|
||||
# CONFIG_ZRAM_MEMORY_TRACKING is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
# CONFIG_BLK_DEV_UMEM is not set
|
||||
|
||||
@ -1722,7 +1722,7 @@ CONFIG_CDROM=m
|
||||
# CONFIG_PARIDE is not set
|
||||
# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
|
||||
CONFIG_ZRAM=m
|
||||
CONFIG_ZRAM_WRITEBACK=y
|
||||
# CONFIG_ZRAM_WRITEBACK is not set
|
||||
# CONFIG_ZRAM_MEMORY_TRACKING is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
# CONFIG_BLK_DEV_UMEM is not set
|
||||
|
||||
@ -848,6 +848,15 @@ int siw_proc_rresp(struct siw_qp *qp)
|
||||
}
|
||||
mem_p = *mem;
|
||||
|
||||
if (unlikely(wqe->processed + srx->fpdu_part_rem > wqe->bytes)) {
|
||||
siw_dbg_qp(qp, "rresp len: %d + %d > %d\n",
|
||||
wqe->processed, srx->fpdu_part_rem, wqe->bytes);
|
||||
wqe->wc_status = SIW_WC_LOC_LEN_ERR;
|
||||
siw_init_terminate(qp, TERM_ERROR_LAYER_DDP,
|
||||
DDP_ETYPE_TAGGED_BUF,
|
||||
DDP_ECODE_T_BASE_BOUNDS, 0);
|
||||
return -EINVAL;
|
||||
}
|
||||
bytes = min(srx->fpdu_part_rem, srx->skb_new);
|
||||
|
||||
if (mem_p->mem_obj == NULL)
|
||||
|
||||
@ -3912,9 +3912,13 @@ static int bond_close(struct net_device *bond_dev)
|
||||
|
||||
bond_work_cancel_all(bond);
|
||||
bond->send_peer_notif = 0;
|
||||
WRITE_ONCE(bond->recv_probe, NULL);
|
||||
|
||||
/* Wait for any in-flight RX handlers */
|
||||
synchronize_net();
|
||||
|
||||
if (bond_is_lb(bond))
|
||||
bond_alb_deinitialize(bond);
|
||||
bond->recv_probe = NULL;
|
||||
|
||||
if (bond_uses_primary(bond)) {
|
||||
rcu_read_lock();
|
||||
|
||||
@ -225,6 +225,12 @@ static void mana_hwc_rx_event_handler(void *ctx, u32 gdma_rxq_id,
|
||||
rq_base_addr = hwc_rxq->msg_buf->mem_info.dma_handle;
|
||||
rx_req_idx = (sge->address - rq_base_addr) / hwc->max_req_msg_size;
|
||||
|
||||
if (rx_req_idx >= hwc_rxq->msg_buf->num_reqs) {
|
||||
dev_err(hwc->dev, "HWC RX: wrong rx_req_idx=%llu, num_reqs=%u\n",
|
||||
rx_req_idx, hwc_rxq->msg_buf->num_reqs);
|
||||
return;
|
||||
}
|
||||
|
||||
rx_req = &hwc_rxq->msg_buf->reqs[rx_req_idx];
|
||||
resp = (struct gdma_resp_hdr *)rx_req->buf_va;
|
||||
|
||||
|
||||
@ -764,6 +764,9 @@ qede_tpa_rx_build_skb(struct qede_dev *edev,
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = qede_build_skb(rxq, bd, len, pad);
|
||||
if (unlikely(!skb))
|
||||
return NULL;
|
||||
|
||||
bd->page_offset += rxq->rx_buf_seg_size;
|
||||
|
||||
if (bd->page_offset == PAGE_SIZE) {
|
||||
@ -811,6 +814,8 @@ qede_rx_build_skb(struct qede_dev *edev,
|
||||
}
|
||||
|
||||
skb = qede_build_skb(rxq, bd, len, pad);
|
||||
if (unlikely(!skb))
|
||||
return NULL;
|
||||
|
||||
if (unlikely(qede_realloc_rx_buffer(rxq, bd))) {
|
||||
/* Incr page ref count to reuse on allocation failure so
|
||||
|
||||
@ -528,15 +528,7 @@ static inline void smc_rcv(struct net_device *dev)
|
||||
* any other concurrent access and C would always interrupt B. But life
|
||||
* isn't that easy in a SMP world...
|
||||
*/
|
||||
#define smc_special_trylock(lock, flags) \
|
||||
({ \
|
||||
int __ret; \
|
||||
local_irq_save(flags); \
|
||||
__ret = spin_trylock(lock); \
|
||||
if (!__ret) \
|
||||
local_irq_restore(flags); \
|
||||
__ret; \
|
||||
})
|
||||
#define smc_special_trylock(lock, flags) spin_trylock_irqsave(lock, flags)
|
||||
#define smc_special_lock(lock, flags) spin_lock_irqsave(lock, flags)
|
||||
#define smc_special_unlock(lock, flags) spin_unlock_irqrestore(lock, flags)
|
||||
#else
|
||||
@ -2293,7 +2285,7 @@ static int smc_drv_probe(struct platform_device *pdev)
|
||||
ret = try_toggle_control_gpio(&pdev->dev, &lp->power_gpio,
|
||||
"power", 0, 0, 100);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out_free_netdev;
|
||||
|
||||
/*
|
||||
* Optional reset GPIO configured? Minimum 100 ns reset needed
|
||||
@ -2302,7 +2294,7 @@ static int smc_drv_probe(struct platform_device *pdev)
|
||||
ret = try_toggle_control_gpio(&pdev->dev, &lp->reset_gpio,
|
||||
"reset", 0, 0, 100);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out_free_netdev;
|
||||
|
||||
/*
|
||||
* Need to wait for optional EEPROM to load, max 750 us according
|
||||
|
||||
@ -3161,6 +3161,8 @@ static int nfs_open_permission_mask(int openflags)
|
||||
mask |= MAY_READ;
|
||||
if ((openflags & O_ACCMODE) != O_RDONLY)
|
||||
mask |= MAY_WRITE;
|
||||
if (openflags & O_TRUNC)
|
||||
mask |= MAY_WRITE;
|
||||
}
|
||||
|
||||
return mask;
|
||||
|
||||
@ -459,6 +459,10 @@ ff_layout_alloc_lseg(struct pnfs_layout_hdr *lh,
|
||||
if (!p)
|
||||
goto out_err_free;
|
||||
fh_count = be32_to_cpup(p);
|
||||
if (fh_count == 0) {
|
||||
rc = -EINVAL;
|
||||
goto out_err_free;
|
||||
}
|
||||
|
||||
fls->mirror_array[i]->fh_versions =
|
||||
kcalloc(fh_count, sizeof(struct nfs_fh),
|
||||
|
||||
@ -2063,11 +2063,11 @@ lookup_again:
|
||||
dprintk("%s wait for layoutreturn\n", __func__);
|
||||
lseg = ERR_PTR(pnfs_prepare_to_retry_layoutget(lo));
|
||||
if (!IS_ERR(lseg)) {
|
||||
pnfs_put_layout_hdr(lo);
|
||||
dprintk("%s retrying\n", __func__);
|
||||
trace_pnfs_update_layout(ino, pos, count, iomode, lo,
|
||||
lseg,
|
||||
PNFS_UPDATE_LAYOUT_RETRY);
|
||||
pnfs_put_layout_hdr(lo);
|
||||
goto lookup_again;
|
||||
}
|
||||
trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
|
||||
|
||||
@ -1058,14 +1058,14 @@ nfs4_decode_mp_ds_addr(struct net *net, struct xdr_stream *xdr, gfp_t gfp_flags)
|
||||
/* r_netid */
|
||||
nlen = xdr_stream_decode_string_dup(xdr, &netid, XDR_MAX_NETOBJ,
|
||||
gfp_flags);
|
||||
if (unlikely(nlen < 0))
|
||||
if (unlikely(nlen <= 0))
|
||||
goto out_err;
|
||||
|
||||
/* r_addr: ip/ip6addr with port in dec octets - see RFC 5665 */
|
||||
/* port is ".ABC.DEF", 8 chars max */
|
||||
rlen = xdr_stream_decode_string_dup(xdr, &buf, INET6_ADDRSTRLEN +
|
||||
IPV6_SCOPE_ID_LEN + 8, gfp_flags);
|
||||
if (unlikely(rlen < 0))
|
||||
if (unlikely(rlen <= 0))
|
||||
goto out_free_netid;
|
||||
|
||||
/* replace port '.' with '-' */
|
||||
|
||||
@ -127,10 +127,7 @@ static __be32 nfsacld_proc_setacl(struct svc_rqst *rqstp)
|
||||
resp->status = fh_getattr(fh, &resp->stat);
|
||||
|
||||
out:
|
||||
/* argp->acl_{access,default} may have been allocated in
|
||||
nfssvc_decode_setaclargs. */
|
||||
posix_acl_release(argp->acl_access);
|
||||
posix_acl_release(argp->acl_default);
|
||||
/* argp->acl_{access,default} are released in nfsaclsvc_release_setacl. */
|
||||
return rpc_success;
|
||||
|
||||
out_drop_lock:
|
||||
@ -308,6 +305,16 @@ static void nfsaclsvc_release_access(struct svc_rqst *rqstp)
|
||||
|
||||
struct nfsd3_voidargs { int dummy; };
|
||||
|
||||
static void nfsaclsvc_release_setacl(struct svc_rqst *rqstp)
|
||||
{
|
||||
struct nfsd3_setaclargs *argp = rqstp->rq_argp;
|
||||
struct nfsd_attrstat *resp = rqstp->rq_resp;
|
||||
|
||||
fh_put(&resp->fh);
|
||||
posix_acl_release(argp->acl_access);
|
||||
posix_acl_release(argp->acl_default);
|
||||
}
|
||||
|
||||
#define ST 1 /* status*/
|
||||
#define AT 21 /* attributes */
|
||||
#define pAT (1+AT) /* post attributes - conditional */
|
||||
@ -339,7 +346,7 @@ static const struct svc_procedure nfsd_acl_procedures2[5] = {
|
||||
.pc_func = nfsacld_proc_setacl,
|
||||
.pc_decode = nfsaclsvc_decode_setaclargs,
|
||||
.pc_encode = nfssvc_encode_attrstatres,
|
||||
.pc_release = nfssvc_release_attrstat,
|
||||
.pc_release = nfsaclsvc_release_setacl,
|
||||
.pc_argsize = sizeof(struct nfsd3_setaclargs),
|
||||
.pc_ressize = sizeof(struct nfsd_attrstat),
|
||||
.pc_cachetype = RC_NOCACHE,
|
||||
|
||||
@ -114,10 +114,7 @@ out_drop_lock:
|
||||
out_errno:
|
||||
resp->status = nfserrno(error);
|
||||
out:
|
||||
/* argp->acl_{access,default} may have been allocated in
|
||||
nfs3svc_decode_setaclargs. */
|
||||
posix_acl_release(argp->acl_access);
|
||||
posix_acl_release(argp->acl_default);
|
||||
/* argp->acl_{access,default} are released in nfs3svc_release_setacl. */
|
||||
return rpc_success;
|
||||
}
|
||||
|
||||
@ -221,6 +218,16 @@ static void nfs3svc_release_getacl(struct svc_rqst *rqstp)
|
||||
|
||||
struct nfsd3_voidargs { int dummy; };
|
||||
|
||||
static void nfs3svc_release_setacl(struct svc_rqst *rqstp)
|
||||
{
|
||||
struct nfsd3_setaclargs *argp = rqstp->rq_argp;
|
||||
struct nfsd3_attrstat *resp = rqstp->rq_resp;
|
||||
|
||||
fh_put(&resp->fh);
|
||||
posix_acl_release(argp->acl_access);
|
||||
posix_acl_release(argp->acl_default);
|
||||
}
|
||||
|
||||
#define ST 1 /* status*/
|
||||
#define AT 21 /* attributes */
|
||||
#define pAT (1+AT) /* post attributes - conditional */
|
||||
@ -252,7 +259,7 @@ static const struct svc_procedure nfsd_acl_procedures3[3] = {
|
||||
.pc_func = nfsd3_proc_setacl,
|
||||
.pc_decode = nfs3svc_decode_setaclargs,
|
||||
.pc_encode = nfs3svc_encode_setaclres,
|
||||
.pc_release = nfs3svc_release_fhandle,
|
||||
.pc_release = nfs3svc_release_setacl,
|
||||
.pc_argsize = sizeof(struct nfsd3_setaclargs),
|
||||
.pc_ressize = sizeof(struct nfsd3_attrstat),
|
||||
.pc_cachetype = RC_NOCACHE,
|
||||
|
||||
@ -242,9 +242,7 @@ nfsd4_alloc_layout_stateid(struct nfsd4_compound_state *cstate,
|
||||
BUG_ON(!ls->ls_file);
|
||||
|
||||
if (nfsd4_layout_setlease(ls)) {
|
||||
fput(ls->ls_file);
|
||||
put_nfs4_file(fp);
|
||||
kmem_cache_free(nfs4_layout_stateid_cache, ls);
|
||||
nfs4_put_stid(stp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@ -1,2 +1,2 @@
|
||||
sbat,1,SBAT Version,sbat,1,https://github.com/rhboot/shim/blob/main/SBAT.md
|
||||
kernel.centos,1,Red Hat,kernel-core,4.18.0-553.158.1.el8.x86_64,mailto:secalert@redhat.com
|
||||
kernel.centos,1,Red Hat,kernel-core,4.18.0-553.159.1.el8.x86_64,mailto:secalert@redhat.com
|
||||
|
||||
@ -296,6 +296,7 @@ static bool fib6_rule_suppress(struct fib_rule *rule, struct fib_lookup_arg *arg
|
||||
|
||||
suppress_route:
|
||||
ip6_rt_put(rt);
|
||||
arg->result = NULL;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user