}
 
 kick:
-               dout("kicking tid %llu osd%d\n", req->r_tid, req->r_osd->o_osd);
+               dout("kicking %p tid %llu osd%d\n", req, req->r_tid,
+                    req->r_osd->o_osd);
                req->r_flags |= CEPH_OSD_FLAG_RETRY;
                err = __send_request(osdc, req);
                if (err) {
                            struct ceph_osd_request *req,
                            bool nofail)
 {
-       int rc;
+       int rc = 0;
 
        req->r_request->pages = req->r_pages;
        req->r_request->nr_pages = req->r_num_pages;
 
        down_read(&osdc->map_sem);
        mutex_lock(&osdc->request_mutex);
-       rc = __send_request(osdc, req);
-       if (rc) {
-               if (nofail) {
-                       dout("osdc_start_request failed send, marking %lld\n",
-                            req->r_tid);
-                       req->r_resend = true;
-                       rc = 0;
-               } else {
-                       __unregister_request(osdc, req);
+       /*
+        * a racing kick_requests() may have sent the message for us
+        * while we dropped request_mutex above, so only send now if
+        * the request still han't been touched yet.
+        */
+       if (req->r_sent == 0) {
+               rc = __send_request(osdc, req);
+               if (rc) {
+                       if (nofail) {
+                               dout("osdc_start_request failed send, "
+                                    " marking %lld\n", req->r_tid);
+                               req->r_resend = true;
+                               rc = 0;
+                       } else {
+                               __unregister_request(osdc, req);
+                       }
                }
        }
        mutex_unlock(&osdc->request_mutex);