2690 }
2691
2692
2693 ret = dlm_is_lockres_migrateable(dlm, res, &numlocks);
2694 if (ret >= 0 && numlocks == 0) {
2695 spin_unlock(&res->spinlock);
2696 goto leave;
2697 }
2698 spin_unlock(&res->spinlock);
2699
2700
2701 spin_unlock(&dlm->spinlock);
2702 lock_dropped = 1;
2703 while (1) {
2704 ret = dlm_migrate_lockres(dlm, res, O2NM_MAX_NODES);
2705 if (ret >= 0)
2706 break;
2707 if (ret == -ENOTEMPTY) {
2708 mlog(ML_ERROR, "lockres %.*s still has local locks!\n",
2709 res->lockname.len, res->lockname.name);
2710 BUG();
2711 }
2712
2713 mlog(0, "lockres %.*s: migrate failed, "
2714 "retrying\n", res->lockname.len,
2715 res->lockname.name);
2716 msleep(DLM_MIGRATION_RETRY_MS);
2717 }
2718 spin_lock(&dlm->spinlock);
2719leave:
2720 return lock_dropped;
2721}
2722
2723int dlm_lock_basts_flushed(struct dlm_ctxt *dlm, struct dlm_lock *lock)
2724{
2725 int ret;
2726 spin_lock(&dlm->ast_lock);
2727 spin_lock(&lock->spinlock);
2728 ret = (list_empty(&lock->bast_list) && !lock->bast_pending);
2729 spin_unlock(&lock->spinlock);
2730 spin_unlock(&dlm->ast_lock);