]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: msgr fixes to use proper connect_seq, avoid unnecessary faults
authorSage Weil <sage@newdream.net>
Thu, 3 Sep 2009 22:03:31 +0000 (15:03 -0700)
committerSage Weil <sage@newdream.net>
Thu, 3 Sep 2009 22:03:31 +0000 (15:03 -0700)
src/kernel/messenger.c

index 3f3ae7810b114d390bc33b54dd10e228309f7ad9..0370082651252a7967f4cd04faa105189b303dba 100644 (file)
@@ -229,6 +229,7 @@ static int con_close_socket(struct ceph_connection *con)
        rc = con->sock->ops->shutdown(con->sock, SHUT_RDWR);
        sock_release(con->sock);
        con->sock = NULL;
+       clear_bit(SOCK_CLOSED, &con->state);
        return rc;
 }
 
@@ -259,6 +260,7 @@ void ceph_con_close(struct ceph_connection *con)
        dout("close %p peer %u.%u.%u.%u:%u\n", con,
             IPQUADPORT(con->peer_addr.ipaddr));
        set_bit(CLOSED, &con->state);  /* in case there's queued work */
+       clear_bit(STANDBY, &con->state);  /* avoid connect_seq bump */
        reset_connection(con);
        queue_con(con);
 }
@@ -490,12 +492,13 @@ static void prepare_write_connect(struct ceph_messenger *msgr,
                                  struct ceph_connection *con)
 {
        int len = strlen(CEPH_BANNER);
+       unsigned global_seq = get_global_seq(con->msgr, 0);
 
-       dout("prepare_write_connect %p\n", con);
+       dout("prepare_write_connect %p connect_seq=%d global_seq=%d\n", con,
+            con->connect_seq, global_seq);
        con->out_connect.host_type = cpu_to_le32(CEPH_ENTITY_TYPE_CLIENT);
        con->out_connect.connect_seq = cpu_to_le32(con->connect_seq);
-       con->out_connect.global_seq =
-               cpu_to_le32(get_global_seq(con->msgr, 0));
+       con->out_connect.global_seq = cpu_to_le32(global_seq);
        con->out_connect.flags = 0;
        if (test_bit(LOSSYTX, &con->state))
                con->out_connect.flags = CEPH_MSG_CONNECT_LOSSY;
@@ -820,7 +823,8 @@ static int process_connect(struct ceph_connection *con)
 
                /* Tell ceph about it. */
                pr_info("reset on %s%d\n", ENTITY_NAME(con->peer_name));
-               con->ops->peer_reset(con);
+               if (con->ops->peer_reset)
+                       con->ops->peer_reset(con);
                break;
 
        case CEPH_MSGR_TAG_RETRY_SESSION:
@@ -1016,8 +1020,9 @@ static int read_partial_message(struct ceph_connection *con)
        while (middle_len > 0 && (!m->middle ||
                                  m->middle->vec.iov_len < middle_len)) {
                if (m->middle == NULL) {
-                       BUG_ON(!con->ops->alloc_middle);
-                       ret = con->ops->alloc_middle(con, m);
+                       ret = -EOPNOTSUPP;
+                       if (con->ops->alloc_middle)
+                               ret = con->ops->alloc_middle(con, m);
                        if (ret < 0) {
                                dout("alloc_middle failed, skipping payload\n");
                                con->in_base_pos = -middle_len - data_len
@@ -1052,9 +1057,9 @@ static int read_partial_message(struct ceph_connection *con)
                con->in_msg_pos.data_pos = 0;
                /* find pages for data payload */
                want = calc_pages_for(data_off & ~PAGE_MASK, data_len);
-               ret = 0;
-               BUG_ON(!con->ops->prepare_pages);
-               ret = con->ops->prepare_pages(con, m, want);
+               ret = -1;
+               if (con->ops->prepare_pages)
+                       ret = con->ops->prepare_pages(con, m, want);
                if (ret < 0) {
                        dout("%p prepare_pages failed, skipping payload\n", m);
                        con->in_base_pos = -data_len - sizeof(m->footer);