Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
[pandora-kernel.git] / net / sunrpc / xprt.c
index a74a128..3c654e0 100644 (file)
@@ -145,8 +145,6 @@ __xprt_lock_write(struct rpc_xprt *xprt, struct rpc_task *task)
        if (test_and_set_bit(XPRT_LOCKED, &xprt->sockstate)) {
                if (task == xprt->snd_task)
                        return 1;
-               if (task == NULL)
-                       return 0;
                goto out_sleep;
        }
        if (xprt->nocong || __xprt_get_cong(xprt, task)) {
@@ -569,8 +567,11 @@ void xprt_connect(struct rpc_task *task)
                if (xprt->sock != NULL)
                        schedule_delayed_work(&xprt->sock_connect,
                                        RPC_REESTABLISH_TIMEOUT);
-               else
+               else {
                        schedule_work(&xprt->sock_connect);
+                       if (!RPC_IS_ASYNC(task))
+                               flush_scheduled_work();
+               }
        }
        return;
  out_write:
@@ -967,7 +968,7 @@ tcp_read_request(struct rpc_xprt *xprt, skb_reader_t *desc)
                goto out;
        }
 
-       dprintk("RPC:      XID %08x read %u bytes\n",
+       dprintk("RPC:      XID %08x read %Zd bytes\n",
                        ntohl(xprt->tcp_xid), r);
        dprintk("RPC:      xprt = %p, tcp_copied = %lu, tcp_offset = %u, tcp_reclen = %u\n",
                        xprt, xprt->tcp_copied, xprt->tcp_offset, xprt->tcp_reclen);
@@ -1003,7 +1004,7 @@ tcp_read_discard(struct rpc_xprt *xprt, skb_reader_t *desc)
        desc->count -= len;
        desc->offset += len;
        xprt->tcp_offset += len;
-       dprintk("RPC:      discarded %u bytes\n", len);
+       dprintk("RPC:      discarded %Zu bytes\n", len);
        tcp_check_recm(xprt);
 }
 
@@ -1101,8 +1102,7 @@ tcp_state_change(struct sock *sk)
        case TCP_SYN_RECV:
                break;
        default:
-               if (xprt_test_and_clear_connected(xprt))
-                       rpc_wake_up_status(&xprt->pending, -ENOTCONN);
+               xprt_disconnect(xprt);
                break;
        }
  out:
@@ -1686,6 +1686,10 @@ xprt_shutdown(struct rpc_xprt *xprt)
        rpc_wake_up(&xprt->backlog);
        wake_up(&xprt->cong_wait);
        del_timer_sync(&xprt->timer);
+
+       /* synchronously wait for connect worker to finish */
+       cancel_delayed_work(&xprt->sock_connect);
+       flush_scheduled_work();
 }
 
 /*