Import of kernel-4.18.0-553.157.1.el8_10
This commit is contained in:
parent
49821798bc
commit
664b924c93
@ -12,7 +12,7 @@ RHEL_MINOR = 10
|
||||
#
|
||||
# Use this spot to avoid future merge conflicts.
|
||||
# Do not trim this comment.
|
||||
RHEL_RELEASE = 553.156.1
|
||||
RHEL_RELEASE = 553.157.1
|
||||
|
||||
#
|
||||
# ZSTREAM
|
||||
|
||||
@ -2343,8 +2343,8 @@ iscsit_handle_text_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
|
||||
|
||||
if (conn->conn_ops->DataDigest) {
|
||||
iscsit_do_crypto_hash_buf(conn->conn_rx_hash,
|
||||
text_in, rx_size, 0, NULL,
|
||||
&data_crc);
|
||||
text_in, ALIGN(payload_length, 4),
|
||||
0, NULL, &data_crc);
|
||||
|
||||
if (checksum != data_crc) {
|
||||
pr_err("Text data CRC32C DataDigest"
|
||||
@ -2364,6 +2364,7 @@ iscsit_handle_text_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
|
||||
" Command CmdSN: 0x%08x due to"
|
||||
" DataCRC error.\n", hdr->cmdsn);
|
||||
kfree(text_in);
|
||||
cmd->text_in_ptr = NULL;
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
|
||||
@ -913,10 +913,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);
|
||||
@ -1000,6 +1004,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) {
|
||||
|
||||
@ -1427,19 +1427,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;
|
||||
@ -1451,10 +1474,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);
|
||||
@ -1464,10 +1489,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);
|
||||
@ -1477,14 +1504,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 *,
|
||||
|
||||
@ -884,7 +884,7 @@ static void parse_dacl(struct cifs_acl *pdacl, char *end_of_acl,
|
||||
*/
|
||||
fattr->cf_mode &= ~07777;
|
||||
fattr->cf_mode |=
|
||||
le32_to_cpu(ppace[i]->sid.sub_auth[2]);
|
||||
le32_to_cpu(ppace[i]->sid.sub_auth[2]) & 07777;
|
||||
break;
|
||||
} else {
|
||||
if (compare_sids(&(ppace[i]->sid), pownersid) == 0) {
|
||||
|
||||
@ -3821,6 +3821,7 @@ static int smb3_simple_fallocate_range(unsigned int xid,
|
||||
struct file_allocated_range_buffer in_data, *out_data = NULL, *tmp_data;
|
||||
u32 out_data_len;
|
||||
char *buf = NULL;
|
||||
u64 range_start, range_len, range_end;
|
||||
loff_t l;
|
||||
int rc;
|
||||
|
||||
@ -3857,13 +3858,21 @@ static int smb3_simple_fallocate_range(unsigned int xid,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (off < le64_to_cpu(tmp_data->file_offset)) {
|
||||
range_start = le64_to_cpu(tmp_data->file_offset);
|
||||
range_len = le64_to_cpu(tmp_data->length);
|
||||
if (check_add_overflow(range_start, range_len, &range_end) ||
|
||||
range_end > S64_MAX) {
|
||||
rc = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (off < range_start) {
|
||||
/*
|
||||
* We are at a hole. Write until the end of the region
|
||||
* or until the next allocated data,
|
||||
* whichever comes next.
|
||||
*/
|
||||
l = le64_to_cpu(tmp_data->file_offset) - off;
|
||||
l = range_start - off;
|
||||
if (len < l)
|
||||
l = len;
|
||||
rc = smb3_simple_fallocate_write_range(xid, tcon,
|
||||
@ -3880,11 +3889,13 @@ static int smb3_simple_fallocate_range(unsigned int xid,
|
||||
* until the end of the data or the end of the region
|
||||
* we are supposed to fallocate, whichever comes first.
|
||||
*/
|
||||
l = le64_to_cpu(tmp_data->length);
|
||||
if (len < l)
|
||||
l = len;
|
||||
off += l;
|
||||
len -= l;
|
||||
if (off < range_end) {
|
||||
l = range_end - off;
|
||||
if (len < l)
|
||||
l = len;
|
||||
off += l;
|
||||
len -= l;
|
||||
}
|
||||
|
||||
tmp_data = &tmp_data[1];
|
||||
out_data_len -= sizeof(struct file_allocated_range_buffer);
|
||||
|
||||
@ -27,18 +27,19 @@ void psi_memstall_enter(unsigned long *flags);
|
||||
void psi_memstall_leave(unsigned long *flags);
|
||||
|
||||
int psi_show(struct seq_file *s, struct psi_group *group, enum psi_res res);
|
||||
struct psi_trigger *psi_trigger_create(struct psi_group *group,
|
||||
char *buf, enum psi_res res,
|
||||
bool *need_rtpoll_worker);
|
||||
int psi_trigger_create_rtpoll_worker(struct psi_group *group);
|
||||
void psi_trigger_destroy(struct psi_trigger *t);
|
||||
|
||||
__poll_t psi_trigger_poll(void **trigger_ptr, struct file *file,
|
||||
poll_table *wait);
|
||||
|
||||
#ifdef CONFIG_CGROUPS
|
||||
int psi_cgroup_alloc(struct cgroup *cgrp);
|
||||
void psi_cgroup_free(struct cgroup *cgrp);
|
||||
void cgroup_move_task(struct task_struct *p, struct css_set *to);
|
||||
|
||||
struct psi_trigger *psi_trigger_create(struct psi_group *group,
|
||||
char *buf, size_t nbytes, enum psi_res res);
|
||||
void psi_trigger_destroy(struct psi_trigger *t);
|
||||
|
||||
__poll_t psi_trigger_poll(void **trigger_ptr, struct file *file,
|
||||
poll_table *wait);
|
||||
#endif
|
||||
|
||||
#else /* CONFIG_PSI */
|
||||
|
||||
@ -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.156.1.el8.x86_64,mailto:secalert@redhat.com
|
||||
kernel.centos,1,Red Hat,kernel-core,4.18.0-553.157.1.el8.x86_64,mailto:secalert@redhat.com
|
||||
|
||||
@ -3730,33 +3730,61 @@ static int cgroup_cpu_pressure_show(struct seq_file *seq, void *v)
|
||||
static ssize_t cgroup_pressure_write(struct kernfs_open_file *of, char *buf,
|
||||
size_t nbytes, enum psi_res res)
|
||||
{
|
||||
struct cgroup_file_ctx *ctx = of->priv;
|
||||
struct cgroup_file_ctx *ctx;
|
||||
struct psi_trigger *new;
|
||||
struct cgroup *cgrp;
|
||||
struct psi_group *psi;
|
||||
bool need_rtpoll_worker;
|
||||
ssize_t ret = 0;
|
||||
|
||||
cgrp = cgroup_kn_lock_live(of->kn, false);
|
||||
if (!cgrp)
|
||||
return -ENODEV;
|
||||
|
||||
cgroup_get(cgrp);
|
||||
cgroup_kn_unlock(of->kn);
|
||||
ctx = of->priv;
|
||||
if (!ctx) {
|
||||
ret = -ENODEV;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/* Allow only one trigger per file descriptor */
|
||||
if (ctx->psi.trigger) {
|
||||
cgroup_put(cgrp);
|
||||
return -EBUSY;
|
||||
ret = -EBUSY;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
psi = cgroup_ino(cgrp) == 1 ? &psi_system : &cgrp->psi;
|
||||
new = psi_trigger_create(psi, buf, nbytes, res);
|
||||
new = psi_trigger_create(psi, buf, res, &need_rtpoll_worker);
|
||||
if (IS_ERR(new)) {
|
||||
cgroup_put(cgrp);
|
||||
return PTR_ERR(new);
|
||||
ret = PTR_ERR(new);
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/*
|
||||
* The worker fork must run with neither cgroup_mutex nor the file's
|
||||
* kernfs active reference held. The latter is broken since
|
||||
* cgroup_kn_lock_live(). @of->priv may be released while unlocked, so
|
||||
* recheck before publishing @new.
|
||||
*/
|
||||
if (need_rtpoll_worker) {
|
||||
mutex_unlock(&cgroup_mutex);
|
||||
ret = psi_trigger_create_rtpoll_worker(psi);
|
||||
mutex_lock(&cgroup_mutex);
|
||||
|
||||
if (!ret && !of->priv)
|
||||
ret = -ENODEV;
|
||||
if (ret) {
|
||||
psi_trigger_destroy(new);
|
||||
goto out_unlock;
|
||||
}
|
||||
}
|
||||
|
||||
smp_store_release(&ctx->psi.trigger, new);
|
||||
cgroup_put(cgrp);
|
||||
|
||||
out_unlock:
|
||||
cgroup_kn_unlock(of->kn);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return nbytes;
|
||||
}
|
||||
@ -3847,6 +3875,7 @@ static void cgroup_file_release(struct kernfs_open_file *of)
|
||||
cft->release(of);
|
||||
put_cgroup_ns(ctx->ns);
|
||||
kfree(ctx);
|
||||
of->priv = NULL;
|
||||
}
|
||||
|
||||
static ssize_t cgroup_file_write(struct kernfs_open_file *of, char *buf,
|
||||
|
||||
@ -1126,14 +1126,51 @@ static int psi_cpu_open(struct inode *inode, struct file *file)
|
||||
return single_open(file, psi_cpu_show, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Create @group's rtpoll worker after psi_trigger_create() reported the need
|
||||
* for one. kthread creation depends on the whole fork path and we don't want
|
||||
* all of that nested inside cgroup_mutex, so the caller must drop it and any
|
||||
* other lock that forks can wait behind. If two callers race, the loser stops
|
||||
* its never-woken kthread.
|
||||
*/
|
||||
int psi_trigger_create_rtpoll_worker(struct psi_group *group)
|
||||
{
|
||||
struct task_struct *task;
|
||||
|
||||
task = kthread_create(psi_poll_worker, group, "psimon");
|
||||
if (IS_ERR(task))
|
||||
return PTR_ERR(task);
|
||||
|
||||
mutex_lock(&group->trigger_lock);
|
||||
if (!rcu_access_pointer(group->poll_task)) {
|
||||
atomic_set(&group->poll_wakeup, 0);
|
||||
wake_up_process(task);
|
||||
rcu_assign_pointer(group->poll_task, task);
|
||||
|
||||
/*
|
||||
* Poll once to catch up on scheduling attempts dropped
|
||||
* while there was no rtpoll worker.
|
||||
*/
|
||||
psi_schedule_poll_work(group, 1);
|
||||
mutex_unlock(&group->trigger_lock);
|
||||
return 0;
|
||||
}
|
||||
mutex_unlock(&group->trigger_lock);
|
||||
|
||||
kthread_stop(task);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct psi_trigger *psi_trigger_create(struct psi_group *group,
|
||||
char *buf, size_t nbytes, enum psi_res res)
|
||||
char *buf, enum psi_res res, bool *need_rtpoll_worker)
|
||||
{
|
||||
struct psi_trigger *t;
|
||||
enum psi_states state;
|
||||
u32 threshold_us;
|
||||
u32 window_us;
|
||||
|
||||
*need_rtpoll_worker = false;
|
||||
|
||||
if (static_branch_likely(&psi_disabled))
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
|
||||
@ -1172,26 +1209,14 @@ struct psi_trigger *psi_trigger_create(struct psi_group *group,
|
||||
|
||||
mutex_lock(&group->trigger_lock);
|
||||
|
||||
if (!rcu_access_pointer(group->poll_task)) {
|
||||
struct task_struct *task;
|
||||
|
||||
task = kthread_create(psi_poll_worker, group, "psimon");
|
||||
if (IS_ERR(task)) {
|
||||
kfree(t);
|
||||
mutex_unlock(&group->trigger_lock);
|
||||
return ERR_CAST(task);
|
||||
}
|
||||
atomic_set(&group->poll_wakeup, 0);
|
||||
wake_up_process(task);
|
||||
rcu_assign_pointer(group->poll_task, task);
|
||||
}
|
||||
|
||||
list_add(&t->node, &group->triggers);
|
||||
group->poll_min_period = min(group->poll_min_period,
|
||||
div_u64(t->win.size, UPDATES_PER_WINDOW));
|
||||
group->nr_triggers[t->state]++;
|
||||
group->poll_states |= (1 << t->state);
|
||||
|
||||
*need_rtpoll_worker = !rcu_access_pointer(group->poll_task);
|
||||
|
||||
mutex_unlock(&group->trigger_lock);
|
||||
|
||||
return t;
|
||||
@ -1293,6 +1318,8 @@ static ssize_t psi_write(struct file *file, const char __user *user_buf,
|
||||
size_t buf_size;
|
||||
struct seq_file *seq;
|
||||
struct psi_trigger *new;
|
||||
bool need_rtpoll_worker;
|
||||
int ret;
|
||||
|
||||
if (static_branch_likely(&psi_disabled))
|
||||
return -EOPNOTSUPP;
|
||||
@ -1317,12 +1344,21 @@ static ssize_t psi_write(struct file *file, const char __user *user_buf,
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
new = psi_trigger_create(&psi_system, buf, nbytes, res);
|
||||
new = psi_trigger_create(&psi_system, buf, res, &need_rtpoll_worker);
|
||||
if (IS_ERR(new)) {
|
||||
mutex_unlock(&seq->lock);
|
||||
return PTR_ERR(new);
|
||||
}
|
||||
|
||||
if (need_rtpoll_worker) {
|
||||
ret = psi_trigger_create_rtpoll_worker(&psi_system);
|
||||
if (ret) {
|
||||
psi_trigger_destroy(new);
|
||||
mutex_unlock(&seq->lock);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
smp_store_release(&seq->private, new);
|
||||
mutex_unlock(&seq->lock);
|
||||
|
||||
|
||||
@ -2088,7 +2088,9 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd,
|
||||
if (!PageReferenced(page) && pmd_young(old_pmd))
|
||||
SetPageReferenced(page);
|
||||
page_remove_rmap(page, true);
|
||||
add_mm_counter(mm, mm_counter_file(page), -HPAGE_PMD_NR);
|
||||
put_page(page);
|
||||
return;
|
||||
}
|
||||
add_mm_counter(mm, mm_counter_file(page), -HPAGE_PMD_NR);
|
||||
return;
|
||||
|
||||
@ -3719,7 +3719,7 @@ bool zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark,
|
||||
|
||||
static inline bool zone_watermark_fast(struct zone *z, unsigned int order,
|
||||
unsigned long mark, int highest_zoneidx,
|
||||
unsigned int alloc_flags)
|
||||
unsigned int alloc_flags, gfp_t gfp_mask)
|
||||
{
|
||||
long free_pages;
|
||||
|
||||
@ -3742,8 +3742,23 @@ static inline bool zone_watermark_fast(struct zone *z, unsigned int order,
|
||||
return true;
|
||||
}
|
||||
|
||||
return __zone_watermark_ok(z, order, mark, highest_zoneidx, alloc_flags,
|
||||
free_pages);
|
||||
if (__zone_watermark_ok(z, order, mark, highest_zoneidx, alloc_flags,
|
||||
free_pages))
|
||||
return true;
|
||||
/*
|
||||
* Ignore watermark boosting for GFP_ATOMIC order-0 allocations
|
||||
* when checking the min watermark. The min watermark is the
|
||||
* point where boosting is ignored so that kswapd is woken up
|
||||
* when below the low watermark.
|
||||
*/
|
||||
if (unlikely(!order && (gfp_mask & __GFP_ATOMIC) && z->watermark_boost
|
||||
&& ((alloc_flags & ALLOC_WMARK_MASK) == WMARK_MIN))) {
|
||||
mark = z->_watermark[WMARK_MIN];
|
||||
return __zone_watermark_ok(z, order, mark, highest_zoneidx,
|
||||
alloc_flags, free_pages);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool zone_watermark_ok_safe(struct zone *z, unsigned int order,
|
||||
@ -3897,7 +3912,8 @@ retry:
|
||||
|
||||
mark = wmark_pages(zone, alloc_flags & ALLOC_WMARK_MASK);
|
||||
if (!zone_watermark_fast(zone, order, mark,
|
||||
ac->highest_zoneidx, alloc_flags)) {
|
||||
ac->highest_zoneidx, alloc_flags,
|
||||
gfp_mask)) {
|
||||
int ret;
|
||||
|
||||
#ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT
|
||||
@ -8151,9 +8167,9 @@ static void __setup_per_zone_wmarks(void)
|
||||
mult_frac(zone_managed_pages(zone),
|
||||
watermark_scale_factor, 10000));
|
||||
|
||||
zone->watermark_boost = 0;
|
||||
zone->_watermark[WMARK_LOW] = min_wmark_pages(zone) + tmp;
|
||||
zone->_watermark[WMARK_HIGH] = min_wmark_pages(zone) + tmp * 2;
|
||||
zone->watermark_boost = 0;
|
||||
|
||||
spin_unlock_irqrestore(&zone->lock, flags);
|
||||
}
|
||||
|
||||
@ -1034,19 +1034,21 @@ static int ieee802154_create(struct net *net, struct socket *sock,
|
||||
|
||||
if (sk->sk_prot->hash) {
|
||||
rc = sk->sk_prot->hash(sk);
|
||||
if (rc) {
|
||||
sk_common_release(sk);
|
||||
goto out;
|
||||
}
|
||||
if (rc)
|
||||
goto out_sk_release;
|
||||
}
|
||||
|
||||
if (sk->sk_prot->init) {
|
||||
rc = sk->sk_prot->init(sk);
|
||||
if (rc)
|
||||
sk_common_release(sk);
|
||||
goto out_sk_release;
|
||||
}
|
||||
out:
|
||||
return rc;
|
||||
out_sk_release:
|
||||
sk_common_release(sk);
|
||||
sock->sk = NULL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
static const struct net_proto_family ieee802154_family_ops = {
|
||||
|
||||
@ -2296,10 +2296,11 @@ static int ip6erspan_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||
struct nlattr *data[],
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct ip6gre_net *ign = net_generic(dev_net(dev), ip6gre_net_id);
|
||||
struct ip6_tnl *t = netdev_priv(dev);
|
||||
struct __ip6_tnl_parm p;
|
||||
struct ip6_tnl *t;
|
||||
struct ip6gre_net *ign;
|
||||
|
||||
ign = net_generic(t->net, ip6gre_net_id);
|
||||
t = ip6gre_changelink_common(dev, tb, data, &p, extack);
|
||||
if (IS_ERR(t))
|
||||
return PTR_ERR(t);
|
||||
|
||||
@ -1340,7 +1340,8 @@ smc_v2_determine_accepted_chid(struct smc_clc_msg_accept_confirm_v2 *aclc,
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ini->ism_offered_cnt + 1; i++) {
|
||||
if (ini->ism_chid[i] == ntohs(aclc->d1.chid)) {
|
||||
if (ini->ism_dev[i] &&
|
||||
ini->ism_chid[i] == ntohs(aclc->d1.chid)) {
|
||||
ini->ism_selected = i;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user