libceph: use a do..while loop in con_work()
authorAlex Elder <elder@inktank.com>
Tue, 19 Feb 2013 18:25:57 +0000 (12:25 -0600)
committerAlex Elder <elder@inktank.com>
Mon, 25 Feb 2013 21:37:37 +0000 (15:37 -0600)
This just converts a manually-implemented loop into a do..while loop
in con_work().  It also moves handling of EAGAIN inside the blocks
where it's already been determined an error code was returned.

Also update a few dout() calls near the affected code for
consistency.

Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
net/ceph/messenger.c

index 18eb788bbb9df01a5dfe251621d3d1b1e416a239..2c0669fb54e33181f2834ea6725dd15291ec5a64 100644 (file)
@@ -2387,51 +2387,53 @@ static void con_work(struct work_struct *work)
 {
        struct ceph_connection *con = container_of(work, struct ceph_connection,
                                                   work.work);
-       bool fault = false;
-       int ret;
+       bool fault;
 
        mutex_lock(&con->mutex);
-restart:
-       if (con_sock_closed(con)) {
-               dout("%s: con %p SOCK_CLOSED\n", __func__, con);
-               fault = true;
-               goto done;
-       }
-       if (con_backoff(con)) {
-               dout("%s: con %p BACKOFF\n", __func__, con);
-               goto done;
-       }
-       if (con->state == CON_STATE_STANDBY) {
-               dout("con_work %p STANDBY\n", con);
-               goto done;
-       }
-       if (con->state == CON_STATE_CLOSED) {
-               dout("con_work %p CLOSED\n", con);
-               BUG_ON(con->sock);
-               goto done;
-       }
-       if (con->state == CON_STATE_PREOPEN) {
-               dout("%s: con %p OPENING\n", __func__, con);
-               BUG_ON(con->sock);
-       }
+       while (true) {
+               int ret;
 
-       ret = try_read(con);
-       if (ret == -EAGAIN)
-               goto restart;
-       if (ret < 0) {
-               con->error_msg = "socket error on read";
-               fault = true;
-               goto done;
-       }
+               if ((fault = con_sock_closed(con))) {
+                       dout("%s: con %p SOCK_CLOSED\n", __func__, con);
+                       break;
+               }
+               if (con_backoff(con)) {
+                       dout("%s: con %p BACKOFF\n", __func__, con);
+                       break;
+               }
+               if (con->state == CON_STATE_STANDBY) {
+                       dout("%s: con %p STANDBY\n", __func__, con);
+                       break;
+               }
+               if (con->state == CON_STATE_CLOSED) {
+                       dout("%s: con %p CLOSED\n", __func__, con);
+                       BUG_ON(con->sock);
+                       break;
+               }
+               if (con->state == CON_STATE_PREOPEN) {
+                       dout("%s: con %p PREOPEN\n", __func__, con);
+                       BUG_ON(con->sock);
+               }
 
-       ret = try_write(con);
-       if (ret == -EAGAIN)
-               goto restart;
-       if (ret < 0) {
-               con->error_msg = "socket error on write";
-               fault = true;
+               ret = try_read(con);
+               if (ret < 0) {
+                       if (ret == -EAGAIN)
+                               continue;
+                       con->error_msg = "socket error on read";
+                       fault = true;
+                       break;
+               }
+
+               ret = try_write(con);
+               if (ret < 0) {
+                       if (ret == -EAGAIN)
+                               continue;
+                       con->error_msg = "socket error on write";
+                       fault = true;
+               }
+
+               break;  /* If we make it to here, we're done */
        }
-done:
        if (fault)
                con_fault(con);
        mutex_unlock(&con->mutex);
@@ -2442,7 +2444,6 @@ done:
        con->ops->put(con);
 }
 
-
 /*
  * Generic error/fault handler.  A retry mechanism is used with
  * exponential backoff