|
@@ -2949,7 +2949,7 @@ static int dlm_do_migrate_request(struct dlm_ctxt *dlm,
|
|
struct dlm_node_iter *iter)
|
|
struct dlm_node_iter *iter)
|
|
{
|
|
{
|
|
struct dlm_migrate_request migrate;
|
|
struct dlm_migrate_request migrate;
|
|
- int ret, status = 0;
|
|
|
|
|
|
+ int ret, skip, status = 0;
|
|
int nodenum;
|
|
int nodenum;
|
|
|
|
|
|
memset(&migrate, 0, sizeof(migrate));
|
|
memset(&migrate, 0, sizeof(migrate));
|
|
@@ -2966,12 +2966,27 @@ static int dlm_do_migrate_request(struct dlm_ctxt *dlm,
|
|
nodenum == new_master)
|
|
nodenum == new_master)
|
|
continue;
|
|
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,
|
|
ret = o2net_send_message(DLM_MIGRATE_REQUEST_MSG, dlm->key,
|
|
&migrate, sizeof(migrate), nodenum,
|
|
&migrate, sizeof(migrate), nodenum,
|
|
&status);
|
|
&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",
|
|
mlog(0, "migrate request (node %u) returned %d!\n",
|
|
nodenum, status);
|
|
nodenum, status);
|
|
ret = status;
|
|
ret = status;
|