mirror of
https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9.git
synced 2026-09-09 00:08:12 +08:00
Merge: Merge tag 'kernel-5.14.0-741.2.1.el9_9' into centos-stream-9/main
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/8711 Merge kernel MRs from RHEL-9.9's kernel-5.14.0-741.2.1.el9_9 into the centos-stream-9/main repo for 9.10 inclusion. MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/8414 MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/8400 MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/8660 MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/8658 MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/8591 MR: https://gitlab.com/redhat/rhel/src/kernel/rhel-9/-/merge_requests/7144 Signed-off-by: Jarod Wilson <jarod@redhat.com> Merged-by: CKI GitLab Kmaint Pipeline Bot <26919896-cki-kmaint-pipeline-bot@users.noreply.gitlab.com>
This commit is contained in:
@@ -1710,7 +1710,7 @@ struct kvm_x86_ops {
|
||||
* Can potentially get non-canonical addresses through INVLPGs, which
|
||||
* the implementation may choose to ignore if appropriate.
|
||||
*/
|
||||
void (*flush_tlb_gva)(struct kvm_vcpu *vcpu, gva_t addr);
|
||||
void (*flush_tlb_gva)(struct kvm_vcpu *vcpu, gva_t addr, bool *full);
|
||||
|
||||
/*
|
||||
* Flush any TLB entries created by the guest. Like tlb_flush_gva(),
|
||||
|
||||
@@ -1968,6 +1968,7 @@ int kvm_hv_vcpu_flush_tlb(struct kvm_vcpu *vcpu)
|
||||
u64 entries[KVM_HV_TLB_FLUSH_FIFO_SIZE];
|
||||
int i, j, count;
|
||||
gva_t gva;
|
||||
bool full = false;
|
||||
|
||||
if (!tdp_enabled || !hv_vcpu)
|
||||
return -EINVAL;
|
||||
@@ -1976,20 +1977,21 @@ int kvm_hv_vcpu_flush_tlb(struct kvm_vcpu *vcpu)
|
||||
|
||||
count = kfifo_out(&tlb_flush_fifo->entries, entries, KVM_HV_TLB_FLUSH_FIFO_SIZE);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
for (i = 0; i < count && !full; i++) {
|
||||
if (entries[i] == KVM_HV_TLB_FLUSHALL_ENTRY)
|
||||
goto out_flush_all;
|
||||
|
||||
if (is_noncanonical_invlpg_address(entries[i], vcpu))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Lower 12 bits of 'address' encode the number of additional
|
||||
* pages to flush.
|
||||
*/
|
||||
gva = entries[i] & PAGE_MASK;
|
||||
for (j = 0; j < (entries[i] & ~PAGE_MASK) + 1; j++)
|
||||
kvm_x86_call(flush_tlb_gva)(vcpu, gva + j * PAGE_SIZE);
|
||||
for (j = 0; j < (entries[i] & ~PAGE_MASK) + 1 && !full; j++) {
|
||||
if (is_noncanonical_invlpg_address(gva + j * PAGE_SIZE, vcpu))
|
||||
continue;
|
||||
|
||||
kvm_x86_call(flush_tlb_gva)(vcpu, gva + j * PAGE_SIZE, &full);
|
||||
}
|
||||
|
||||
++vcpu->stat.tlb_flush;
|
||||
}
|
||||
|
||||
@@ -6141,7 +6141,7 @@ void kvm_mmu_invalidate_addr(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
|
||||
if (is_noncanonical_invlpg_address(addr, vcpu))
|
||||
return;
|
||||
|
||||
kvm_x86_call(flush_tlb_gva)(vcpu, addr);
|
||||
kvm_x86_call(flush_tlb_gva)(vcpu, addr, NULL);
|
||||
}
|
||||
|
||||
if (!mmu->sync_spte)
|
||||
|
||||
+14
-1
@@ -4083,11 +4083,24 @@ static void svm_flush_tlb_all(struct kvm_vcpu *vcpu)
|
||||
svm_flush_tlb_asid(vcpu);
|
||||
}
|
||||
|
||||
static void svm_flush_tlb_gva(struct kvm_vcpu *vcpu, gva_t gva)
|
||||
static void svm_flush_tlb_gva(struct kvm_vcpu *vcpu, gva_t gva, bool *full)
|
||||
{
|
||||
struct vcpu_svm *svm = to_svm(vcpu);
|
||||
|
||||
/*
|
||||
* INVLPGA has had errata on Genoa and Turin, and even on older
|
||||
* generations there were reports of Windows BSODs if INVLPGA
|
||||
* was used for Hyper-V tlbflush. Use it only for shadow paging
|
||||
* where it seems to be okay.
|
||||
*/
|
||||
if (!npt_enabled) {
|
||||
invlpga(gva, svm->vmcb->control.asid);
|
||||
return;
|
||||
}
|
||||
|
||||
svm_flush_tlb_asid(vcpu);
|
||||
if (full)
|
||||
*full = true;
|
||||
}
|
||||
|
||||
static inline void sync_cr8_to_lapic(struct kvm_vcpu *vcpu)
|
||||
|
||||
@@ -571,12 +571,12 @@ static void vt_flush_tlb_current(struct kvm_vcpu *vcpu)
|
||||
vmx_flush_tlb_current(vcpu);
|
||||
}
|
||||
|
||||
static void vt_flush_tlb_gva(struct kvm_vcpu *vcpu, gva_t addr)
|
||||
static void vt_flush_tlb_gva(struct kvm_vcpu *vcpu, gva_t addr, bool *full)
|
||||
{
|
||||
if (is_td_vcpu(vcpu))
|
||||
return;
|
||||
|
||||
vmx_flush_tlb_gva(vcpu, addr);
|
||||
vmx_flush_tlb_gva(vcpu, addr, full);
|
||||
}
|
||||
|
||||
static void vt_flush_tlb_guest(struct kvm_vcpu *vcpu)
|
||||
|
||||
@@ -3218,7 +3218,7 @@ void vmx_flush_tlb_current(struct kvm_vcpu *vcpu)
|
||||
vpid_sync_context(vmx_get_current_vpid(vcpu));
|
||||
}
|
||||
|
||||
void vmx_flush_tlb_gva(struct kvm_vcpu *vcpu, gva_t addr)
|
||||
void vmx_flush_tlb_gva(struct kvm_vcpu *vcpu, gva_t addr, bool *full)
|
||||
{
|
||||
/*
|
||||
* vpid_sync_vcpu_addr() is a nop if vpid==0, see the comment in
|
||||
|
||||
@@ -81,7 +81,7 @@ void vmx_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags);
|
||||
bool vmx_get_if_flag(struct kvm_vcpu *vcpu);
|
||||
void vmx_flush_tlb_all(struct kvm_vcpu *vcpu);
|
||||
void vmx_flush_tlb_current(struct kvm_vcpu *vcpu);
|
||||
void vmx_flush_tlb_gva(struct kvm_vcpu *vcpu, gva_t addr);
|
||||
void vmx_flush_tlb_gva(struct kvm_vcpu *vcpu, gva_t addr, bool *full);
|
||||
void vmx_flush_tlb_guest(struct kvm_vcpu *vcpu);
|
||||
void vmx_set_interrupt_shadow(struct kvm_vcpu *vcpu, int mask);
|
||||
u32 vmx_get_interrupt_shadow(struct kvm_vcpu *vcpu);
|
||||
|
||||
@@ -899,10 +899,14 @@ static int iscsi_target_handle_csg_zero(
|
||||
SENDER_TARGET,
|
||||
login->rsp_buf,
|
||||
&login->rsp_length,
|
||||
MAX_KEY_VALUE_PAIRS,
|
||||
conn->param_list,
|
||||
conn->tpg->tpg_attrib.login_keys_workaround);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
|
||||
ISCSI_LOGIN_STATUS_INIT_ERR);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!iscsi_check_negotiated_keys(conn->param_list)) {
|
||||
bool auth_required = iscsi_conn_auth_required(conn);
|
||||
@@ -986,6 +990,7 @@ static int iscsi_target_handle_csg_one(struct iscsit_conn *conn, struct iscsi_lo
|
||||
SENDER_TARGET,
|
||||
login->rsp_buf,
|
||||
&login->rsp_length,
|
||||
MAX_KEY_VALUE_PAIRS,
|
||||
conn->param_list,
|
||||
conn->tpg->tpg_attrib.login_keys_workaround);
|
||||
if (ret < 0) {
|
||||
|
||||
@@ -1419,19 +1419,42 @@ free_buffer:
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Append "key=value" plus a trailing NUL into @textbuf at *@length.
|
||||
* Returns 0 on success and advances *@length, or -EMSGSIZE if the
|
||||
* record (including the NUL) would not fit in the remaining buffer.
|
||||
*/
|
||||
static int iscsi_encode_text_record(char *textbuf, u32 *length,
|
||||
u32 textbuf_size,
|
||||
const char *key, const char *value)
|
||||
{
|
||||
int n;
|
||||
u32 avail;
|
||||
|
||||
if (*length >= textbuf_size)
|
||||
return -EMSGSIZE;
|
||||
|
||||
avail = textbuf_size - *length;
|
||||
n = snprintf(textbuf + *length, avail, "%s=%s", key, value);
|
||||
if (n < 0 || (u32)n + 1 > avail)
|
||||
return -EMSGSIZE;
|
||||
|
||||
*length += n + 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int iscsi_encode_text_output(
|
||||
u8 phase,
|
||||
u8 sender,
|
||||
char *textbuf,
|
||||
u32 *length,
|
||||
u32 textbuf_size,
|
||||
struct iscsi_param_list *param_list,
|
||||
bool keys_workaround)
|
||||
{
|
||||
char *output_buf = NULL;
|
||||
struct iscsi_extra_response *er;
|
||||
struct iscsi_param *param;
|
||||
|
||||
output_buf = textbuf + *length;
|
||||
int ret;
|
||||
|
||||
if (iscsi_enforce_integrity_rules(phase, param_list) < 0)
|
||||
return -1;
|
||||
@@ -1443,10 +1466,12 @@ int iscsi_encode_text_output(
|
||||
!IS_PSTATE_RESPONSE_SENT(param) &&
|
||||
!IS_PSTATE_REPLY_OPTIONAL(param) &&
|
||||
(param->phase & phase)) {
|
||||
*length += sprintf(output_buf, "%s=%s",
|
||||
param->name, param->value);
|
||||
*length += 1;
|
||||
output_buf = textbuf + *length;
|
||||
ret = iscsi_encode_text_record(textbuf, length,
|
||||
textbuf_size,
|
||||
param->name,
|
||||
param->value);
|
||||
if (ret < 0)
|
||||
goto err_overflow;
|
||||
SET_PSTATE_RESPONSE_SENT(param);
|
||||
pr_debug("Sending key: %s=%s\n",
|
||||
param->name, param->value);
|
||||
@@ -1456,10 +1481,12 @@ int iscsi_encode_text_output(
|
||||
!IS_PSTATE_ACCEPTOR(param) &&
|
||||
!IS_PSTATE_PROPOSER(param) &&
|
||||
(param->phase & phase)) {
|
||||
*length += sprintf(output_buf, "%s=%s",
|
||||
param->name, param->value);
|
||||
*length += 1;
|
||||
output_buf = textbuf + *length;
|
||||
ret = iscsi_encode_text_record(textbuf, length,
|
||||
textbuf_size,
|
||||
param->name,
|
||||
param->value);
|
||||
if (ret < 0)
|
||||
goto err_overflow;
|
||||
SET_PSTATE_PROPOSER(param);
|
||||
iscsi_check_proposer_for_optional_reply(param,
|
||||
keys_workaround);
|
||||
@@ -1469,14 +1496,21 @@ int iscsi_encode_text_output(
|
||||
}
|
||||
|
||||
list_for_each_entry(er, ¶m_list->extra_response_list, er_list) {
|
||||
*length += sprintf(output_buf, "%s=%s", er->key, er->value);
|
||||
*length += 1;
|
||||
output_buf = textbuf + *length;
|
||||
ret = iscsi_encode_text_record(textbuf, length, textbuf_size,
|
||||
er->key, er->value);
|
||||
if (ret < 0)
|
||||
goto err_overflow;
|
||||
pr_debug("Sending key: %s=%s\n", er->key, er->value);
|
||||
}
|
||||
iscsi_release_extra_responses(param_list);
|
||||
|
||||
return 0;
|
||||
|
||||
err_overflow:
|
||||
pr_err("iSCSI login response buffer (%u bytes) exhausted, dropping login.\n",
|
||||
textbuf_size);
|
||||
iscsi_release_extra_responses(param_list);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int iscsi_check_negotiated_keys(struct iscsi_param_list *param_list)
|
||||
|
||||
@@ -46,7 +46,7 @@ extern struct iscsi_param *iscsi_find_param_from_key(char *, struct iscsi_param_
|
||||
extern int iscsi_extract_key_value(char *, char **, char **);
|
||||
extern int iscsi_update_param_value(struct iscsi_param *, char *);
|
||||
extern int iscsi_decode_text_input(u8, u8, char *, u32, struct iscsit_conn *);
|
||||
extern int iscsi_encode_text_output(u8, u8, char *, u32 *,
|
||||
extern int iscsi_encode_text_output(u8, u8, char *, u32 *, u32,
|
||||
struct iscsi_param_list *, bool);
|
||||
extern int iscsi_check_negotiated_keys(struct iscsi_param_list *);
|
||||
extern void iscsi_set_connection_parameters(struct iscsi_conn_ops *,
|
||||
|
||||
+25
-17
@@ -56,30 +56,34 @@ static inline bool ifs_block_is_uptodate(struct iomap_folio_state *ifs,
|
||||
return test_bit(block, ifs->state);
|
||||
}
|
||||
|
||||
static void ifs_set_range_uptodate(struct folio *folio,
|
||||
static bool ifs_set_range_uptodate(struct folio *folio,
|
||||
struct iomap_folio_state *ifs, size_t off, size_t len)
|
||||
{
|
||||
struct inode *inode = folio->mapping->host;
|
||||
unsigned int first_blk = off >> inode->i_blkbits;
|
||||
unsigned int last_blk = (off + len - 1) >> inode->i_blkbits;
|
||||
unsigned int nr_blks = last_blk - first_blk + 1;
|
||||
unsigned long flags;
|
||||
unsigned int first_blk, last_blk;
|
||||
|
||||
spin_lock_irqsave(&ifs->state_lock, flags);
|
||||
bitmap_set(ifs->state, first_blk, nr_blks);
|
||||
if (ifs_is_fully_uptodate(folio, ifs))
|
||||
folio_mark_uptodate(folio);
|
||||
spin_unlock_irqrestore(&ifs->state_lock, flags);
|
||||
if (len) {
|
||||
first_blk = off >> inode->i_blkbits;
|
||||
last_blk = (off + len - 1) >> inode->i_blkbits;
|
||||
bitmap_set(ifs->state, first_blk, last_blk - first_blk + 1);
|
||||
}
|
||||
return ifs_is_fully_uptodate(folio, ifs);
|
||||
}
|
||||
|
||||
static void iomap_set_range_uptodate(struct folio *folio, size_t off,
|
||||
size_t len)
|
||||
{
|
||||
struct iomap_folio_state *ifs = folio->private;
|
||||
unsigned long flags;
|
||||
bool uptodate = true;
|
||||
|
||||
if (ifs)
|
||||
ifs_set_range_uptodate(folio, ifs, off, len);
|
||||
else
|
||||
if (ifs) {
|
||||
spin_lock_irqsave(&ifs->state_lock, flags);
|
||||
uptodate = ifs_set_range_uptodate(folio, ifs, off, len);
|
||||
spin_unlock_irqrestore(&ifs->state_lock, flags);
|
||||
}
|
||||
|
||||
if (uptodate)
|
||||
folio_mark_uptodate(folio);
|
||||
}
|
||||
|
||||
@@ -120,13 +124,17 @@ static void ifs_set_range_dirty(struct folio *folio,
|
||||
{
|
||||
struct inode *inode = folio->mapping->host;
|
||||
unsigned int blks_per_folio = i_blocks_per_folio(inode, folio);
|
||||
unsigned int first_blk = (off >> inode->i_blkbits);
|
||||
unsigned int last_blk = (off + len - 1) >> inode->i_blkbits;
|
||||
unsigned int nr_blks = last_blk - first_blk + 1;
|
||||
unsigned int first_blk, last_blk;
|
||||
unsigned long flags;
|
||||
|
||||
if (!len)
|
||||
return;
|
||||
|
||||
first_blk = off >> inode->i_blkbits;
|
||||
last_blk = (off + len - 1) >> inode->i_blkbits;
|
||||
spin_lock_irqsave(&ifs->state_lock, flags);
|
||||
bitmap_set(ifs->state, first_blk + blks_per_folio, nr_blks);
|
||||
bitmap_set(ifs->state, first_blk + blks_per_folio,
|
||||
last_blk - first_blk + 1);
|
||||
spin_unlock_irqrestore(&ifs->state_lock, flags);
|
||||
}
|
||||
|
||||
|
||||
@@ -3265,6 +3265,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;
|
||||
|
||||
@@ -460,6 +460,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),
|
||||
|
||||
+1
-1
@@ -2217,11 +2217,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,
|
||||
|
||||
+2
-2
@@ -1054,14 +1054,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 '-' */
|
||||
|
||||
+12
-5
@@ -131,10 +131,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:
|
||||
@@ -310,6 +307,16 @@ static void nfsaclsvc_release_access(struct svc_rqst *rqstp)
|
||||
fh_put(&resp->fh);
|
||||
}
|
||||
|
||||
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 */
|
||||
@@ -343,7 +350,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_argzero = sizeof(struct nfsd3_setaclargs),
|
||||
.pc_ressize = sizeof(struct nfsd_attrstat),
|
||||
|
||||
+12
-5
@@ -118,10 +118,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;
|
||||
}
|
||||
|
||||
@@ -223,6 +220,16 @@ static void nfs3svc_release_getacl(struct svc_rqst *rqstp)
|
||||
posix_acl_release(resp->acl_default);
|
||||
}
|
||||
|
||||
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 */
|
||||
@@ -256,7 +263,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_argzero = sizeof(struct nfsd3_setaclargs),
|
||||
.pc_ressize = sizeof(struct nfsd3_attrstat),
|
||||
|
||||
@@ -258,9 +258,7 @@ nfsd4_alloc_layout_stateid(struct nfsd4_compound_state *cstate,
|
||||
BUG_ON(!ls->ls_file);
|
||||
|
||||
if (nfsd4_layout_setlease(ls)) {
|
||||
nfsd_file_put(ls->ls_file);
|
||||
put_nfs4_file(fp);
|
||||
kmem_cache_free(nfs4_layout_stateid_cache, ls);
|
||||
nfs4_put_stid(stp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -301,6 +301,7 @@ INDIRECT_CALLABLE_SCOPE bool fib6_rule_suppress(struct fib_rule *rule,
|
||||
|
||||
suppress_route:
|
||||
ip6_rt_put_flags(rt, flags);
|
||||
res->rt6 = NULL;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,20 @@
|
||||
* Mon Aug 31 2026 CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> [5.14.0-741.2.1.el9_9]
|
||||
- net: ipv6: clear suppressed fib6 rule result (Paolo Abeni) [RHEL-246350] {CVE-2026-74581}
|
||||
- KEYS: fix overflow in keyctl_pkey_params_get_2() (Bruno Meneguele) [RHEL-229620] {CVE-2026-63824}
|
||||
- KEYS: fix length validation in keyctl_pkey_params_get_2() (Bruno Meneguele) [RHEL-229620] {CVE-2026-63824}
|
||||
- nfsd: release layout stid on setlease failure (Scott Mayhew) [RHEL-227787] {CVE-2026-53399}
|
||||
- NFSv4/flexfiles: reject zero filehandle version count (Scott Mayhew) [RHEL-229413] {CVE-2026-53392}
|
||||
- nfsd: fix posix_acl leak on SETACL decode failure (Scott Mayhew) [RHEL-225523] {CVE-2026-53397}
|
||||
- NFSv4: include MAY_WRITE in open permission mask for O_TRUNC (CKI Backport Bot) [RHEL-234058] {CVE-2026-64298}
|
||||
- NFSv4/pNFS: reject zero-length r_addr in nfs4_decode_mp_ds_addr (CKI Backport Bot) [RHEL-228034] {CVE-2026-53391}
|
||||
- pNFS: Fix use-after-free in pnfs_update_layout() (CKI Backport Bot) [RHEL-226326] {CVE-2026-63800}
|
||||
- iomap: fix out-of-bounds bitmap_set() with zero-length range (CKI Backport Bot) [RHEL-240184] {CVE-2026-68145}
|
||||
- iomap: hold state_lock over call to ifs_set_range_uptodate() (CKI Backport Bot) [RHEL-240184] {CVE-2026-68145}
|
||||
- scsi: target: iscsi: Bound iscsi_encode_text_output() appends to rsp_buf (CKI Backport Bot) [RHEL-213196] {CVE-2026-63887}
|
||||
- KVM: SVM: make svm_flush_tlb_gva do a full asid flush if NPT enabled (Paolo Bonzini) [RHEL-214433]
|
||||
- KVM: x86: hyper-v: Validate all GVAs during PV TLB flush (Paolo Bonzini) [RHEL-214433]
|
||||
Resolves: RHEL-213196, RHEL-214433, RHEL-225523, RHEL-226326, RHEL-227787, RHEL-228034, RHEL-229413, RHEL-229620, RHEL-234058, RHEL-240184, RHEL-246350
|
||||
|
||||
* Thu Aug 27 2026 CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> [5.14.0-741.1.1.el9_9]
|
||||
- xen/privcmd: fix double free via VMA splitting (Vitaly Kuznetsov) [RHEL-172489] {CVE-2026-31787}
|
||||
- Buffer overflow in drivers/xen/sys-hypervisor.c (Vitaly Kuznetsov) [RHEL-172511] {CVE-2026-31786}
|
||||
|
||||
@@ -135,23 +135,38 @@ static int keyctl_pkey_params_get_2(const struct keyctl_pkey_params __user *_par
|
||||
|
||||
switch (op) {
|
||||
case KEYCTL_PKEY_ENCRYPT:
|
||||
if (uparams.in_len > info.max_dec_size ||
|
||||
uparams.out_len > info.max_enc_size)
|
||||
return -EINVAL;
|
||||
|
||||
params->out_len = info.max_enc_size;
|
||||
break;
|
||||
case KEYCTL_PKEY_DECRYPT:
|
||||
if (uparams.in_len > info.max_enc_size ||
|
||||
uparams.out_len > info.max_dec_size)
|
||||
return -EINVAL;
|
||||
|
||||
params->out_len = info.max_dec_size;
|
||||
break;
|
||||
case KEYCTL_PKEY_SIGN:
|
||||
case KEYCTL_PKEY_VERIFY:
|
||||
if (uparams.in_len > info.max_sig_size ||
|
||||
uparams.out_len > info.max_data_size)
|
||||
if (uparams.in_len > info.max_data_size ||
|
||||
uparams.out_len > info.max_sig_size)
|
||||
return -EINVAL;
|
||||
|
||||
params->out_len = info.max_sig_size;
|
||||
break;
|
||||
case KEYCTL_PKEY_VERIFY:
|
||||
if (uparams.in_len > info.max_data_size ||
|
||||
uparams.in2_len > info.max_sig_size)
|
||||
return -EINVAL;
|
||||
|
||||
params->out_len = info.max_sig_size;
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
|
||||
params->in_len = uparams.in_len;
|
||||
params->out_len = uparams.out_len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user