struct dlm_node_iter *iter)
 {
        struct dlm_migrate_request migrate;
-       int ret, status = 0;
+       int ret, skip, status = 0;
        int nodenum;
 
        memset(&migrate, 0, sizeof(migrate));
                    nodenum == new_master)
                        continue;
 
+               /* We could race exit domain. If exited, skip. */
+               spin_lock(&dlm->spinlock);
+               skip = (!test_bit(nodenum, dlm->domain_map));
+               spin_unlock(&dlm->spinlock);
+               if (skip) {
+                       clear_bit(nodenum, iter->node_map);
+                       continue;
+               }
+
                ret = o2net_send_message(DLM_MIGRATE_REQUEST_MSG, dlm->key,
                                         &migrate, sizeof(migrate), nodenum,
                                         &status);
-               if (ret < 0)
-                       mlog_errno(ret);
-               else if (status < 0) {
+               if (ret < 0) {
+                       mlog(0, "migrate_request returned %d!\n", ret);
+                       if (!dlm_is_host_down(ret)) {
+                               mlog(ML_ERROR, "unhandled error=%d!\n", ret);
+                               BUG();
+                       }
+                       clear_bit(nodenum, iter->node_map);
+                       ret = 0;
+               } else if (status < 0) {
                        mlog(0, "migrate request (node %u) returned %d!\n",
                             nodenum, status);
                        ret = status;