[Ocfs2-devel] [PATCH 2/5] ocfs2/dlm: add lockres as parameter to dlm_new_lock()
Wengang Wang
wen.gang.wang at oracle.com
Thu Aug 26 06:07:15 PDT 2010
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 <wen.gang.wang at oracle.com>
---
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
More information about the Ocfs2-devel
mailing list