提交 d3002b97 编写于 作者: A Alex Elder

libceph: a few small changes

This gathers a number of very minor changes:
    - use %hu when formatting the a socket address's address family
    - null out the ceph_msgr_wq pointer after the queue has been
      destroyed
    - drop a needless cast in ceph_write_space()
    - add a WARN() call in ceph_state_change() in the event an
      unrecognized socket state is encountered
    - rearrange the logic in ceph_con_get() and ceph_con_put() so
      that:
        - the reference counts are only atomically read once
	- the values displayed via dout() calls are known to
	  be meaningful at the time they are formatted
Signed-off-by: NAlex Elder <elder@dreamhost.com>
Signed-off-by: NSage Weil <sage@newdream.net>
上级 41617d0c
...@@ -80,8 +80,8 @@ const char *ceph_pr_addr(const struct sockaddr_storage *ss) ...@@ -80,8 +80,8 @@ const char *ceph_pr_addr(const struct sockaddr_storage *ss)
break; break;
default: default:
snprintf(s, MAX_ADDR_STR_LEN, "(unknown sockaddr family %d)", snprintf(s, MAX_ADDR_STR_LEN, "(unknown sockaddr family %hu)",
(int)ss->ss_family); ss->ss_family);
} }
return s; return s;
...@@ -101,8 +101,10 @@ static struct workqueue_struct *ceph_msgr_wq; ...@@ -101,8 +101,10 @@ static struct workqueue_struct *ceph_msgr_wq;
void _ceph_msgr_exit(void) void _ceph_msgr_exit(void)
{ {
if (ceph_msgr_wq) if (ceph_msgr_wq) {
destroy_workqueue(ceph_msgr_wq); destroy_workqueue(ceph_msgr_wq);
ceph_msgr_wq = NULL;
}
BUG_ON(zero_page_address == NULL); BUG_ON(zero_page_address == NULL);
zero_page_address = NULL; zero_page_address = NULL;
...@@ -167,8 +169,7 @@ static void ceph_data_ready(struct sock *sk, int count_unused) ...@@ -167,8 +169,7 @@ static void ceph_data_ready(struct sock *sk, int count_unused)
/* socket has buffer space for writing */ /* socket has buffer space for writing */
static void ceph_write_space(struct sock *sk) static void ceph_write_space(struct sock *sk)
{ {
struct ceph_connection *con = struct ceph_connection *con = sk->sk_user_data;
(struct ceph_connection *)sk->sk_user_data;
/* only queue to workqueue if there is data we want to write, /* only queue to workqueue if there is data we want to write,
* and there is sufficient space in the socket buffer to accept * and there is sufficient space in the socket buffer to accept
...@@ -216,6 +217,8 @@ static void ceph_state_change(struct sock *sk) ...@@ -216,6 +217,8 @@ static void ceph_state_change(struct sock *sk)
dout("ceph_state_change TCP_ESTABLISHED\n"); dout("ceph_state_change TCP_ESTABLISHED\n");
queue_con(con); queue_con(con);
break; break;
default: /* Everything else is uninteresting */
break;
} }
} }
...@@ -420,22 +423,23 @@ bool ceph_con_opened(struct ceph_connection *con) ...@@ -420,22 +423,23 @@ bool ceph_con_opened(struct ceph_connection *con)
*/ */
struct ceph_connection *ceph_con_get(struct ceph_connection *con) struct ceph_connection *ceph_con_get(struct ceph_connection *con)
{ {
dout("con_get %p nref = %d -> %d\n", con, int nref = __atomic_add_unless(&con->nref, 1, 0);
atomic_read(&con->nref), atomic_read(&con->nref) + 1);
if (atomic_inc_not_zero(&con->nref)) dout("con_get %p nref = %d -> %d\n", con, nref, nref + 1);
return con;
return NULL; return nref ? con : NULL;
} }
void ceph_con_put(struct ceph_connection *con) void ceph_con_put(struct ceph_connection *con)
{ {
dout("con_put %p nref = %d -> %d\n", con, int nref = atomic_dec_return(&con->nref);
atomic_read(&con->nref), atomic_read(&con->nref) - 1);
BUG_ON(atomic_read(&con->nref) == 0); BUG_ON(nref < 0);
if (atomic_dec_and_test(&con->nref)) { if (nref == 0) {
BUG_ON(con->sock); BUG_ON(con->sock);
kfree(con); kfree(con);
} }
dout("con_put %p nref = %d -> %d\n", con, nref + 1, nref);
} }
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册