diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go
index 04e9c3a2142187162e2e96d3d6f901eb994f91c7..0cbf42d302d3d5eb8a157494ff9141524dd3b85a 100644
--- a/eth/downloader/downloader.go
+++ b/eth/downloader/downloader.go
@@ -190,32 +190,15 @@ func (d *Downloader) syncWithPeer(p *peer, hash common.Hash) (err error) {
 // Cancel cancels all of the operations and resets the queue. It returns true
 // if the cancel operation was completed.
 func (d *Downloader) Cancel() bool {
-	hs, bs := d.queue.Size()
 	// If we're not syncing just return.
+	hs, bs := d.queue.Size()
 	if atomic.LoadInt32(&d.synchronising) == 0 && hs == 0 && bs == 0 {
 		return false
 	}
-
+	// Close the current cancel channel
+	d.cancelLock.RLock()
 	close(d.cancelCh)
-
-	// clean up
-hashDone:
-	for {
-		select {
-		case <-d.hashCh:
-		default:
-			break hashDone
-		}
-	}
-
-blockDone:
-	for {
-		select {
-		case <-d.blockCh:
-		default:
-			break blockDone
-		}
-	}
+	d.cancelLock.RUnlock()
 
 	// reset the queue
 	d.queue.Reset()