diff --git a/net/base/host_resolver_impl.cc b/net/base/host_resolver_impl.cc
index 61f075e5c81ec8caadefe3641a5af741e7603f98..c93c8eb6dab9acaaf66a7eb1da5968d9f84717ae 100644
--- a/net/base/host_resolver_impl.cc
+++ b/net/base/host_resolver_impl.cc
@@ -73,6 +73,9 @@ class HostResolverImpl::Request {
     job_ = NULL;
     callback_ = NULL;
     addresses_ = NULL;
+    // Clear the LoadLog to make sure it won't be released later on the
+    // worker thread. See http://crbug.com/22272
+    load_log_ = NULL;
   }
 
   bool was_cancelled() const {
@@ -187,10 +190,8 @@ class HostResolverImpl::Job
       origin_loop_ = NULL;
     }
 
-    // We don't have to do anything further to actually cancel the requests
-    // that were attached to this job (since they are unreachable now).
-    // But we will call HostResolverImpl::CancelRequest(Request*) on each one
-    // in order to notify any observers.
+    // We will call HostResolverImpl::CancelRequest(Request*) on each one
+    // in order to notify any observers, and also clear the LoadLog.
     for (RequestsList::const_iterator it = requests_.begin();
          it != requests_.end(); ++it) {
       HostResolverImpl::Request* req = *it;
@@ -395,9 +396,11 @@ void HostResolverImpl::CancelRequest(RequestHandle req_handle) {
   Request* req = reinterpret_cast<Request*>(req_handle);
   DCHECK(req);
   DCHECK(req->job());
+  // Hold a reference to the request's load log as we are about to clear it.
+  scoped_refptr<LoadLog> load_log(req->load_log());
   // NULL out the fields of req, to mark it as cancelled.
   req->MarkAsCancelled();
-  OnCancelRequest(req->load_log(), req->id(), req->info());
+  OnCancelRequest(load_log, req->id(), req->info());
 }
 
 void HostResolverImpl::AddObserver(Observer* observer) {