* [Cluster-devel] [PATCH 1/6] dlm: block scand during recovery
@ 2007-05-18 13:58 David Teigland
2007-05-18 14:54 ` [Cluster-devel] " Steven Whitehouse
0 siblings, 1 reply; 2+ messages in thread
From: David Teigland @ 2007-05-18 13:58 UTC (permalink / raw)
To: cluster-devel.redhat.com
Don't let dlm_scand run during recovery since it may try to do a resource
directory removal while the directory nodes are changing.
Signed-off-by: David Teigland <teigland@redhat.com>
Index: linux-quilt/fs/dlm/lock.c
===================================================================
--- linux-quilt.orig/fs/dlm/lock.c 2007-05-14 15:48:15.000000000 -0500
+++ linux-quilt/fs/dlm/lock.c 2007-05-14 15:51:40.000000000 -0500
@@ -194,17 +194,17 @@
/* Threads cannot use the lockspace while it's being recovered */
-static inline void lock_recovery(struct dlm_ls *ls)
+static inline void dlm_lock_recovery(struct dlm_ls *ls)
{
down_read(&ls->ls_in_recovery);
}
-static inline void unlock_recovery(struct dlm_ls *ls)
+void dlm_unlock_recovery(struct dlm_ls *ls)
{
up_read(&ls->ls_in_recovery);
}
-static inline int lock_recovery_try(struct dlm_ls *ls)
+int dlm_lock_recovery_try(struct dlm_ls *ls)
{
return down_read_trylock(&ls->ls_in_recovery);
}
@@ -985,11 +985,10 @@
{
int i;
- if (dlm_locking_stopped(ls))
- return;
-
for (i = 0; i < ls->ls_rsbtbl_size; i++) {
shrink_bucket(ls, i);
+ if (dlm_locking_stopped(ls))
+ break;
cond_resched();
}
}
@@ -2274,7 +2273,7 @@
if (!ls)
return -EINVAL;
- lock_recovery(ls);
+ dlm_lock_recovery(ls);
if (convert)
error = find_lkb(ls, lksb->sb_lkid, &lkb);
@@ -2302,7 +2301,7 @@
if (error == -EAGAIN)
error = 0;
out:
- unlock_recovery(ls);
+ dlm_unlock_recovery(ls);
dlm_put_lockspace(ls);
return error;
}
@@ -2322,7 +2321,7 @@
if (!ls)
return -EINVAL;
- lock_recovery(ls);
+ dlm_lock_recovery(ls);
error = find_lkb(ls, lkid, &lkb);
if (error)
@@ -2344,7 +2343,7 @@
out_put:
dlm_put_lkb(lkb);
out:
- unlock_recovery(ls);
+ dlm_unlock_recovery(ls);
dlm_put_lockspace(ls);
return error;
}
@@ -3424,7 +3423,7 @@
}
}
- if (lock_recovery_try(ls))
+ if (dlm_lock_recovery_try(ls))
break;
schedule();
}
@@ -3503,7 +3502,7 @@
log_error(ls, "unknown message type %d", ms->m_type);
}
- unlock_recovery(ls);
+ dlm_unlock_recovery(ls);
out:
dlm_put_lockspace(ls);
dlm_astd_wake();
@@ -4040,7 +4039,7 @@
struct dlm_args args;
int error;
- lock_recovery(ls);
+ dlm_lock_recovery(ls);
error = create_lkb(ls, &lkb);
if (error) {
@@ -4094,7 +4093,7 @@
list_add_tail(&lkb->lkb_ownqueue, &ua->proc->locks);
spin_unlock(&ua->proc->locks_spin);
out:
- unlock_recovery(ls);
+ dlm_unlock_recovery(ls);
return error;
}
@@ -4106,7 +4105,7 @@
struct dlm_user_args *ua;
int error;
- lock_recovery(ls);
+ dlm_lock_recovery(ls);
error = find_lkb(ls, lkid, &lkb);
if (error)
@@ -4146,7 +4145,7 @@
out_put:
dlm_put_lkb(lkb);
out:
- unlock_recovery(ls);
+ dlm_unlock_recovery(ls);
kfree(ua_tmp);
return error;
}
@@ -4159,7 +4158,7 @@
struct dlm_user_args *ua;
int error;
- lock_recovery(ls);
+ dlm_lock_recovery(ls);
error = find_lkb(ls, lkid, &lkb);
if (error)
@@ -4194,7 +4193,7 @@
out_put:
dlm_put_lkb(lkb);
out:
- unlock_recovery(ls);
+ dlm_unlock_recovery(ls);
kfree(ua_tmp);
return error;
}
@@ -4207,7 +4206,7 @@
struct dlm_user_args *ua;
int error;
- lock_recovery(ls);
+ dlm_lock_recovery(ls);
error = find_lkb(ls, lkid, &lkb);
if (error)
@@ -4231,7 +4230,7 @@
out_put:
dlm_put_lkb(lkb);
out:
- unlock_recovery(ls);
+ dlm_unlock_recovery(ls);
kfree(ua_tmp);
return error;
}
@@ -4314,7 +4313,7 @@
{
struct dlm_lkb *lkb, *safe;
- lock_recovery(ls);
+ dlm_lock_recovery(ls);
while (1) {
lkb = del_proc_lock(ls, proc);
@@ -4347,7 +4346,7 @@
}
mutex_unlock(&ls->ls_clear_proc_locks);
- unlock_recovery(ls);
+ dlm_unlock_recovery(ls);
}
static void purge_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc)
@@ -4429,12 +4428,12 @@
if (nodeid != dlm_our_nodeid()) {
error = send_purge(ls, nodeid, pid);
} else {
- lock_recovery(ls);
+ dlm_lock_recovery(ls);
if (pid == current->pid)
purge_proc_locks(ls, proc);
else
do_purge(ls, nodeid, pid);
- unlock_recovery(ls);
+ dlm_unlock_recovery(ls);
}
return error;
}
Index: linux-quilt/fs/dlm/lock.h
===================================================================
--- linux-quilt.orig/fs/dlm/lock.h 2007-05-14 15:48:15.000000000 -0500
+++ linux-quilt/fs/dlm/lock.h 2007-05-14 15:51:40.000000000 -0500
@@ -24,6 +24,8 @@
void dlm_hold_rsb(struct dlm_rsb *r);
int dlm_put_lkb(struct dlm_lkb *lkb);
void dlm_scan_rsbs(struct dlm_ls *ls);
+int dlm_lock_recovery_try(struct dlm_ls *ls);
+void dlm_unlock_recovery(struct dlm_ls *ls);
int dlm_purge_locks(struct dlm_ls *ls);
void dlm_purge_mstcpy_locks(struct dlm_rsb *r);
Index: linux-quilt/fs/dlm/lockspace.c
===================================================================
--- linux-quilt.orig/fs/dlm/lockspace.c 2007-05-14 15:48:15.000000000 -0500
+++ linux-quilt/fs/dlm/lockspace.c 2007-05-14 15:51:40.000000000 -0500
@@ -234,8 +234,12 @@
struct dlm_ls *ls;
while (!kthread_should_stop()) {
- list_for_each_entry(ls, &lslist, ls_list)
- dlm_scan_rsbs(ls);
+ list_for_each_entry(ls, &lslist, ls_list) {
+ if (dlm_lock_recovery_try(ls)) {
+ dlm_scan_rsbs(ls);
+ dlm_unlock_recovery(ls);
+ }
+ }
schedule_timeout_interruptible(dlm_config.ci_scan_secs * HZ);
}
return 0;
^ permalink raw reply [flat|nested] 2+ messages in thread
* [Cluster-devel] Re: [PATCH 1/6] dlm: block scand during recovery
2007-05-18 13:58 [Cluster-devel] [PATCH 1/6] dlm: block scand during recovery David Teigland
@ 2007-05-18 14:54 ` Steven Whitehouse
0 siblings, 0 replies; 2+ messages in thread
From: Steven Whitehouse @ 2007-05-18 14:54 UTC (permalink / raw)
To: cluster-devel.redhat.com
Hi,
All six now in the -nmw git tree. Thanks,
Steve.
On Fri, 2007-05-18 at 08:58 -0500, David Teigland wrote:
> Don't let dlm_scand run during recovery since it may try to do a resource
> directory removal while the directory nodes are changing.
>
> Signed-off-by: David Teigland <teigland@redhat.com>
>
> Index: linux-quilt/fs/dlm/lock.c
> ===================================================================
> --- linux-quilt.orig/fs/dlm/lock.c 2007-05-14 15:48:15.000000000 -0500
> +++ linux-quilt/fs/dlm/lock.c 2007-05-14 15:51:40.000000000 -0500
> @@ -194,17 +194,17 @@
>
> /* Threads cannot use the lockspace while it's being recovered */
>
> -static inline void lock_recovery(struct dlm_ls *ls)
> +static inline void dlm_lock_recovery(struct dlm_ls *ls)
> {
> down_read(&ls->ls_in_recovery);
> }
>
> -static inline void unlock_recovery(struct dlm_ls *ls)
> +void dlm_unlock_recovery(struct dlm_ls *ls)
> {
> up_read(&ls->ls_in_recovery);
> }
>
> -static inline int lock_recovery_try(struct dlm_ls *ls)
> +int dlm_lock_recovery_try(struct dlm_ls *ls)
> {
> return down_read_trylock(&ls->ls_in_recovery);
> }
> @@ -985,11 +985,10 @@
> {
> int i;
>
> - if (dlm_locking_stopped(ls))
> - return;
> -
> for (i = 0; i < ls->ls_rsbtbl_size; i++) {
> shrink_bucket(ls, i);
> + if (dlm_locking_stopped(ls))
> + break;
> cond_resched();
> }
> }
> @@ -2274,7 +2273,7 @@
> if (!ls)
> return -EINVAL;
>
> - lock_recovery(ls);
> + dlm_lock_recovery(ls);
>
> if (convert)
> error = find_lkb(ls, lksb->sb_lkid, &lkb);
> @@ -2302,7 +2301,7 @@
> if (error == -EAGAIN)
> error = 0;
> out:
> - unlock_recovery(ls);
> + dlm_unlock_recovery(ls);
> dlm_put_lockspace(ls);
> return error;
> }
> @@ -2322,7 +2321,7 @@
> if (!ls)
> return -EINVAL;
>
> - lock_recovery(ls);
> + dlm_lock_recovery(ls);
>
> error = find_lkb(ls, lkid, &lkb);
> if (error)
> @@ -2344,7 +2343,7 @@
> out_put:
> dlm_put_lkb(lkb);
> out:
> - unlock_recovery(ls);
> + dlm_unlock_recovery(ls);
> dlm_put_lockspace(ls);
> return error;
> }
> @@ -3424,7 +3423,7 @@
> }
> }
>
> - if (lock_recovery_try(ls))
> + if (dlm_lock_recovery_try(ls))
> break;
> schedule();
> }
> @@ -3503,7 +3502,7 @@
> log_error(ls, "unknown message type %d", ms->m_type);
> }
>
> - unlock_recovery(ls);
> + dlm_unlock_recovery(ls);
> out:
> dlm_put_lockspace(ls);
> dlm_astd_wake();
> @@ -4040,7 +4039,7 @@
> struct dlm_args args;
> int error;
>
> - lock_recovery(ls);
> + dlm_lock_recovery(ls);
>
> error = create_lkb(ls, &lkb);
> if (error) {
> @@ -4094,7 +4093,7 @@
> list_add_tail(&lkb->lkb_ownqueue, &ua->proc->locks);
> spin_unlock(&ua->proc->locks_spin);
> out:
> - unlock_recovery(ls);
> + dlm_unlock_recovery(ls);
> return error;
> }
>
> @@ -4106,7 +4105,7 @@
> struct dlm_user_args *ua;
> int error;
>
> - lock_recovery(ls);
> + dlm_lock_recovery(ls);
>
> error = find_lkb(ls, lkid, &lkb);
> if (error)
> @@ -4146,7 +4145,7 @@
> out_put:
> dlm_put_lkb(lkb);
> out:
> - unlock_recovery(ls);
> + dlm_unlock_recovery(ls);
> kfree(ua_tmp);
> return error;
> }
> @@ -4159,7 +4158,7 @@
> struct dlm_user_args *ua;
> int error;
>
> - lock_recovery(ls);
> + dlm_lock_recovery(ls);
>
> error = find_lkb(ls, lkid, &lkb);
> if (error)
> @@ -4194,7 +4193,7 @@
> out_put:
> dlm_put_lkb(lkb);
> out:
> - unlock_recovery(ls);
> + dlm_unlock_recovery(ls);
> kfree(ua_tmp);
> return error;
> }
> @@ -4207,7 +4206,7 @@
> struct dlm_user_args *ua;
> int error;
>
> - lock_recovery(ls);
> + dlm_lock_recovery(ls);
>
> error = find_lkb(ls, lkid, &lkb);
> if (error)
> @@ -4231,7 +4230,7 @@
> out_put:
> dlm_put_lkb(lkb);
> out:
> - unlock_recovery(ls);
> + dlm_unlock_recovery(ls);
> kfree(ua_tmp);
> return error;
> }
> @@ -4314,7 +4313,7 @@
> {
> struct dlm_lkb *lkb, *safe;
>
> - lock_recovery(ls);
> + dlm_lock_recovery(ls);
>
> while (1) {
> lkb = del_proc_lock(ls, proc);
> @@ -4347,7 +4346,7 @@
> }
>
> mutex_unlock(&ls->ls_clear_proc_locks);
> - unlock_recovery(ls);
> + dlm_unlock_recovery(ls);
> }
>
> static void purge_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc)
> @@ -4429,12 +4428,12 @@
> if (nodeid != dlm_our_nodeid()) {
> error = send_purge(ls, nodeid, pid);
> } else {
> - lock_recovery(ls);
> + dlm_lock_recovery(ls);
> if (pid == current->pid)
> purge_proc_locks(ls, proc);
> else
> do_purge(ls, nodeid, pid);
> - unlock_recovery(ls);
> + dlm_unlock_recovery(ls);
> }
> return error;
> }
> Index: linux-quilt/fs/dlm/lock.h
> ===================================================================
> --- linux-quilt.orig/fs/dlm/lock.h 2007-05-14 15:48:15.000000000 -0500
> +++ linux-quilt/fs/dlm/lock.h 2007-05-14 15:51:40.000000000 -0500
> @@ -24,6 +24,8 @@
> void dlm_hold_rsb(struct dlm_rsb *r);
> int dlm_put_lkb(struct dlm_lkb *lkb);
> void dlm_scan_rsbs(struct dlm_ls *ls);
> +int dlm_lock_recovery_try(struct dlm_ls *ls);
> +void dlm_unlock_recovery(struct dlm_ls *ls);
>
> int dlm_purge_locks(struct dlm_ls *ls);
> void dlm_purge_mstcpy_locks(struct dlm_rsb *r);
> Index: linux-quilt/fs/dlm/lockspace.c
> ===================================================================
> --- linux-quilt.orig/fs/dlm/lockspace.c 2007-05-14 15:48:15.000000000 -0500
> +++ linux-quilt/fs/dlm/lockspace.c 2007-05-14 15:51:40.000000000 -0500
> @@ -234,8 +234,12 @@
> struct dlm_ls *ls;
>
> while (!kthread_should_stop()) {
> - list_for_each_entry(ls, &lslist, ls_list)
> - dlm_scan_rsbs(ls);
> + list_for_each_entry(ls, &lslist, ls_list) {
> + if (dlm_lock_recovery_try(ls)) {
> + dlm_scan_rsbs(ls);
> + dlm_unlock_recovery(ls);
> + }
> + }
> schedule_timeout_interruptible(dlm_config.ci_scan_secs * HZ);
> }
> return 0;
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2007-05-18 14:54 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-18 13:58 [Cluster-devel] [PATCH 1/6] dlm: block scand during recovery David Teigland
2007-05-18 14:54 ` [Cluster-devel] " Steven Whitehouse
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.