187
188 ret = dlm_drop_lockres_ref(dlm, res);
189 if (ret < 0) {
190 mlog_errno(ret);
191 if (!dlm_is_host_down(ret))
192 BUG();
193 }
194 mlog(0, "%s:%.*s: dlm_deref_lockres returned %d\n",
195 dlm->name, res->lockname.len, res->lockname.name, ret);
196 spin_lock(&dlm->spinlock);
197 }
198
199 if (!list_empty(&res->purge)) {
200 mlog(0, "removing lockres %.*s:%p from purgelist, "
201 "master = %d\n", res->lockname.len, res->lockname.name,
202 res, master);
203 list_del_init(&res->purge);
204 dlm_lockres_put(res);
205 dlm->purge_count--;
206 }
207 __dlm_unhash_lockres(res);
208
209
210
211 if (!master) {
212 spin_lock(&res->spinlock);
213 res->state &= ~DLM_LOCK_RES_DROPPING_REF;
214 spin_unlock(&res->spinlock);
215 wake_up(&res->wq);
216 }
217 return 0;
218}
219
220static void dlm_run_purge_list(struct dlm_ctxt *dlm,
221 int purge_now)
222{
223 unsigned int run_max, unused;
224 unsigned long purge_jiffies;
225 struct dlm_lock_resource *lockres;
226
227 spin_lock(&dlm->spinlock);