Wether the dlm_lock needs to access lvb or not depends on dlm_lock_resource it belongs to. So a new parameter "struct dlm_lock_resource *res" is added to dlm_new_lock() so that we can know if we need to allocate lvb for the dlm_lock. And we have to make the lockres availale for calling dlm_new_lock().
Signed-off-by: Wengang Wang <[email protected]> --- fs/ocfs2/dlm/dlmcommon.h | 3 +- fs/ocfs2/dlm/dlmlock.c | 55 ++++++++++++++++++++++--------------------- fs/ocfs2/dlm/dlmrecovery.c | 2 +- 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h index 49e6492..4e10aa6 100644 --- a/fs/ocfs2/dlm/dlmcommon.h +++ b/fs/ocfs2/dlm/dlmcommon.h @@ -785,7 +785,8 @@ static inline unsigned long long dlm_get_lock_cookie_seq(u64 cookie) } struct dlm_lock * dlm_new_lock(int type, u8 node, u64 cookie, - struct dlm_lockstatus *lksb); + struct dlm_lockstatus *lksb, + struct dlm_lock_resource *res); void dlm_lock_get(struct dlm_lock *lock); void dlm_lock_put(struct dlm_lock *lock); diff --git a/fs/ocfs2/dlm/dlmlock.c b/fs/ocfs2/dlm/dlmlock.c index 5c7ece7..7d0bef2 100644 --- a/fs/ocfs2/dlm/dlmlock.c +++ b/fs/ocfs2/dlm/dlmlock.c @@ -432,7 +432,8 @@ char *dlm_alloc_lvb(char **lvb) } struct dlm_lock * dlm_new_lock(int type, u8 node, u64 cookie, - struct dlm_lockstatus *lksb) + struct dlm_lockstatus *lksb, + struct dlm_lock_resource *res) { struct dlm_lock *lock; int kernel_allocated = 0; @@ -502,22 +503,6 @@ int dlm_create_lock_handler(struct o2net_msg *msg, u32 len, void *data, goto leave; } - status = DLM_SYSERR; - newlock = dlm_new_lock(create->requested_type, - create->node_idx, - be64_to_cpu(create->cookie), NULL); - if (!newlock) { - dlm_error(status); - goto leave; - } - - lksb = newlock->lksb; - - if (be32_to_cpu(create->flags) & LKM_GET_LVB) { - lksb->flags |= DLM_LKSB_GET_LVB; - mlog(0, "set DLM_LKSB_GET_LVB flag\n"); - } - status = DLM_IVLOCKID; res = dlm_lookup_lockres(dlm, name, namelen); if (!res) { @@ -534,6 +519,22 @@ int dlm_create_lock_handler(struct o2net_msg *msg, u32 len, void *data, goto leave; } + status = DLM_SYSERR; + newlock = dlm_new_lock(create->requested_type, + create->node_idx, + be64_to_cpu(create->cookie), NULL, res); + if (!newlock) { + dlm_error(status); + goto leave; + } + + lksb = newlock->lksb; + + if (be32_to_cpu(create->flags) & LKM_GET_LVB) { + lksb->flags |= DLM_LKSB_GET_LVB; + mlog(0, "set DLM_LKSB_GET_LVB flag\n"); + } + dlm_lock_attach_lockres(newlock, res); status = dlmlock_master(dlm, res, newlock, be32_to_cpu(create->flags)); @@ -678,16 +679,6 @@ retry_convert: goto error; } - dlm_get_next_cookie(dlm->node_num, &tmpcookie); - lock = dlm_new_lock(mode, dlm->node_num, tmpcookie, lksb); - if (!lock) { - dlm_error(status); - goto error; - } - - if (!recovery) - dlm_wait_for_recovery(dlm); - /* find or create the lock resource */ res = dlm_get_lock_resource(dlm, name, namelen, flags); if (!res) { @@ -699,6 +690,16 @@ retry_convert: mlog(0, "type=%d, flags = 0x%x\n", mode, flags); mlog(0, "creating lock: lock=%p res=%p\n", lock, res); + dlm_get_next_cookie(dlm->node_num, &tmpcookie); + lock = dlm_new_lock(mode, dlm->node_num, tmpcookie, lksb, res); + if (!lock) { + dlm_error(status); + goto error; + } + + if (!recovery) + dlm_wait_for_recovery(dlm); + dlm_lock_attach_lockres(lock, res); lock->ast = ast; lock->bast = bast; diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c index aaaffbc..e41780c 100644 --- a/fs/ocfs2/dlm/dlmrecovery.c +++ b/fs/ocfs2/dlm/dlmrecovery.c @@ -1865,7 +1865,7 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, /* lock is for another node. */ newlock = dlm_new_lock(ml->type, ml->node, - be64_to_cpu(ml->cookie), NULL); + be64_to_cpu(ml->cookie), NULL, res); if (!newlock) { ret = -ENOMEM; goto leave; -- 1.7.2.1 _______________________________________________ Ocfs2-devel mailing list [email protected] http://oss.oracle.com/mailman/listinfo/ocfs2-devel
