ocfs2: do LVB puts in place
Don't wait until the AST will be fired to do the LVB copy into the lock resource. Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
This commit is contained in:
Родитель
aa85235427
Коммит
c0a8520c73
|
@ -197,12 +197,14 @@ static void dlm_update_lvb(struct dlm_ctxt *dlm, struct dlm_lock_resource *res,
|
||||||
lock->ml.node == dlm->node_num ? "master" :
|
lock->ml.node == dlm->node_num ? "master" :
|
||||||
"remote");
|
"remote");
|
||||||
memcpy(lksb->lvb, res->lvb, DLM_LVB_LEN);
|
memcpy(lksb->lvb, res->lvb, DLM_LVB_LEN);
|
||||||
} else if (lksb->flags & DLM_LKSB_PUT_LVB) {
|
|
||||||
mlog(0, "setting lvb from lockres for %s node\n",
|
|
||||||
lock->ml.node == dlm->node_num ? "master" :
|
|
||||||
"remote");
|
|
||||||
memcpy(res->lvb, lksb->lvb, DLM_LVB_LEN);
|
|
||||||
}
|
}
|
||||||
|
/* Do nothing for lvb put requests - they should be done in
|
||||||
|
* place when the lock is downconverted - otherwise we risk
|
||||||
|
* racing gets and puts which could result in old lvb data
|
||||||
|
* being propagated. We leave the put flag set and clear it
|
||||||
|
* here. In the future we might want to clear it at the time
|
||||||
|
* the put is actually done.
|
||||||
|
*/
|
||||||
spin_unlock(&res->spinlock);
|
spin_unlock(&res->spinlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -214,6 +214,9 @@ grant:
|
||||||
if (lock->ml.node == dlm->node_num)
|
if (lock->ml.node == dlm->node_num)
|
||||||
mlog(0, "doing in-place convert for nonlocal lock\n");
|
mlog(0, "doing in-place convert for nonlocal lock\n");
|
||||||
lock->ml.type = type;
|
lock->ml.type = type;
|
||||||
|
if (lock->lksb->flags & DLM_LKSB_PUT_LVB)
|
||||||
|
memcpy(res->lvb, lock->lksb->lvb, DLM_LVB_LEN);
|
||||||
|
|
||||||
status = DLM_NORMAL;
|
status = DLM_NORMAL;
|
||||||
*call_ast = 1;
|
*call_ast = 1;
|
||||||
goto unlock_exit;
|
goto unlock_exit;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче