Skip to content

Commit

Permalink
ksmbd: add refcnt to ksmbd_conn struct
Browse files Browse the repository at this point in the history
Signed-off-by: Namjae Jeon <[email protected]>
  • Loading branch information
namjaejeon committed Aug 29, 2024
1 parent e3db264 commit 1c21ea3
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 20 deletions.
4 changes: 3 additions & 1 deletion connection.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ void ksmbd_conn_free(struct ksmbd_conn *conn)
xa_destroy(&conn->sessions);
kvfree(conn->request_buf);
kfree(conn->preauth_info);
kfree(conn);
if (atomic_dec_and_test(&conn->refcnt))
kfree(conn);
}

/**
Expand Down Expand Up @@ -75,6 +76,7 @@ struct ksmbd_conn *ksmbd_conn_alloc(void)
conn->um = NULL;
atomic_set(&conn->req_running, 0);
atomic_set(&conn->r_count, 0);
atomic_set(&conn->refcnt, 1);
conn->total_credits = 1;
conn->outstanding_credits = 0;

Expand Down
1 change: 1 addition & 0 deletions connection.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ struct ksmbd_conn {
bool signing_negotiated;
__le16 signing_algorithm;
bool binding;
atomic_t refcnt;
};

struct ksmbd_conn_ops {
Expand Down
28 changes: 9 additions & 19 deletions oplock.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ static struct oplock_info *alloc_opinfo(struct ksmbd_work *work,
init_waitqueue_head(&opinfo->oplock_brk);
atomic_set(&opinfo->refcount, 1);
atomic_set(&opinfo->breaking_cnt, 0);
atomic_inc(&opinfo->conn->refcnt);

return opinfo;
}
Expand Down Expand Up @@ -130,6 +131,8 @@ static void free_opinfo(struct oplock_info *opinfo)
{
if (opinfo->is_lease)
free_lease(opinfo);
if (atomic_dec_and_test(&opinfo->conn->refcnt))
kfree(opinfo->conn);
kfree(opinfo);
}

Expand All @@ -155,8 +158,7 @@ static struct oplock_info *opinfo_get_list(struct ksmbd_inode *ci)
opinfo = list_first_entry(&ci->m_op_list, struct oplock_info,
op_entry);
if (opinfo) {
if (opinfo->conn == NULL ||
!atomic_inc_not_zero(&opinfo->refcount))
if (!atomic_inc_not_zero(&opinfo->refcount))
opinfo = NULL;
else {
atomic_inc(&opinfo->conn->r_count);
Expand Down Expand Up @@ -1320,7 +1322,7 @@ void smb_send_parent_lease_break_noti(struct ksmbd_file *fp,

down_read(&p_ci->m_lock);
list_for_each_entry(opinfo, &p_ci->m_op_list, op_entry) {
if (opinfo->conn == NULL || !opinfo->is_lease)
if (!opinfo->is_lease)
continue;

if (opinfo->o_lease->state != SMB2_OPLOCK_LEVEL_NONE &&
Expand All @@ -1330,11 +1332,8 @@ void smb_send_parent_lease_break_noti(struct ksmbd_file *fp,
if (!atomic_inc_not_zero(&opinfo->refcount))
continue;

atomic_inc(&opinfo->conn->r_count);
if (ksmbd_conn_releasing(opinfo->conn)) {
atomic_dec(&opinfo->conn->r_count);
if (ksmbd_conn_releasing(opinfo->conn))
continue;
}

oplock_break(opinfo, SMB2_OPLOCK_LEVEL_NONE);
opinfo_conn_put(opinfo);
Expand All @@ -1361,18 +1360,15 @@ void smb_lazy_parent_lease_break_close(struct ksmbd_file *fp)

down_read(&p_ci->m_lock);
list_for_each_entry(opinfo, &p_ci->m_op_list, op_entry) {
if (opinfo->conn == NULL || !opinfo->is_lease)
if (!opinfo->is_lease)
continue;

if (opinfo->o_lease->state != SMB2_OPLOCK_LEVEL_NONE) {
if (!atomic_inc_not_zero(&opinfo->refcount))
continue;

atomic_inc(&opinfo->conn->r_count);
if (ksmbd_conn_releasing(opinfo->conn)) {
atomic_dec(&opinfo->conn->r_count);
if (ksmbd_conn_releasing(opinfo->conn))
continue;
}
oplock_break(opinfo, SMB2_OPLOCK_LEVEL_NONE);
opinfo_conn_put(opinfo);
}
Expand Down Expand Up @@ -1571,17 +1567,11 @@ void smb_break_all_levII_oplock(struct ksmbd_work *work, struct ksmbd_file *fp,

down_read(&ci->m_lock);
list_for_each_entry(brk_op, &ci->m_op_list, op_entry) {
if (brk_op->conn == NULL)
continue;

if (!atomic_inc_not_zero(&brk_op->refcount))
continue;

atomic_inc(&brk_op->conn->r_count);
if (ksmbd_conn_releasing(brk_op->conn)) {
atomic_dec(&brk_op->conn->r_count);
if (ksmbd_conn_releasing(brk_op->conn))
continue;
}

#ifdef CONFIG_SMB_INSECURE_SERVER
if (brk_op->is_smb2) {
Expand Down

0 comments on commit 1c21ea3

Please sign in to comment.