[Cluster-devel] Re: [PATCH 1/2] dlm: add orphan purging code

Steven Whitehouse swhiteho at redhat.com
Mon Apr 2 14:18:10 UTC 2007


Hi,

Now pushed to the -nme git tree. Thanks,

Steve.

On Fri, 2007-03-30 at 15:02 -0500, David Teigland wrote:
> Add code for purging orphan locks.  A process can also purge all of its
> own non-orphan locks by passing a pid of zero.  Code already exists for
> processes to create persistent locks that become orphans when the process
> exits, but the complimentary capability for another process to then purge
> these orphans has been missing.
> 
> Signed-off-by: David Teigland <teigland at redhat.com>
> 
> Index: linux-2.6.21-rc5-quilt/fs/dlm/lock.c
> ===================================================================
> --- linux-2.6.21-rc5-quilt.orig/fs/dlm/lock.c	2007-03-28 12:39:43.000000000 -0500
> +++ linux-2.6.21-rc5-quilt/fs/dlm/lock.c	2007-03-30 11:59:48.000000000 -0500
> @@ -85,6 +85,7 @@
>  static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb,
>  				    struct dlm_message *ms);
>  static int receive_extralen(struct dlm_message *ms);
> +static void do_purge(struct dlm_ls *ls, int nodeid, int pid);
>  
>  /*
>   * Lock compatibilty matrix - thanks Steve
> @@ -2987,6 +2988,11 @@
>  	dlm_dir_remove_entry(ls, from_nodeid, ms->m_extra, len);
>  }
>  
> +static void receive_purge(struct dlm_ls *ls, struct dlm_message *ms)
> +{
> +	do_purge(ls, ms->m_nodeid, ms->m_pid);
> +}
> +
>  static void receive_request_reply(struct dlm_ls *ls, struct dlm_message *ms)
>  {
>  	struct dlm_lkb *lkb;
> @@ -3409,6 +3415,12 @@
>  		receive_lookup_reply(ls, ms);
>  		break;
>  
> +	/* other messages */
> +
> +	case DLM_MSG_PURGE:
> +		receive_purge(ls, ms);
> +		break;
> +
>  	default:
>  		log_error(ls, "unknown message type %d", ms->m_type);
>  	}
> @@ -4260,3 +4272,92 @@
>  	unlock_recovery(ls);
>  }
>  
> +static void purge_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc)
> +{
> +	struct dlm_lkb *lkb, *safe;
> +
> +	while (1) {
> +		lkb = NULL;
> +		spin_lock(&proc->locks_spin);
> +		if (!list_empty(&proc->locks)) {
> +			lkb = list_entry(proc->locks.next, struct dlm_lkb,
> +					 lkb_ownqueue);
> +			list_del_init(&lkb->lkb_ownqueue);
> +		}
> +		spin_unlock(&proc->locks_spin);
> +
> +		if (!lkb)
> +			break;
> +
> +		lkb->lkb_flags |= DLM_IFL_DEAD;
> +		unlock_proc_lock(ls, lkb);
> +		dlm_put_lkb(lkb); /* ref from proc->locks list */
> +	}
> +
> +	spin_lock(&proc->locks_spin);
> +	list_for_each_entry_safe(lkb, safe, &proc->unlocking, lkb_ownqueue) {
> +		list_del_init(&lkb->lkb_ownqueue);
> +		lkb->lkb_flags |= DLM_IFL_DEAD;
> +		dlm_put_lkb(lkb);
> +	}
> +	spin_unlock(&proc->locks_spin);
> +
> +	spin_lock(&proc->asts_spin);
> +	list_for_each_entry_safe(lkb, safe, &proc->asts, lkb_astqueue) {
> +		list_del(&lkb->lkb_astqueue);
> +		dlm_put_lkb(lkb);
> +	}
> +	spin_unlock(&proc->asts_spin);
> +}
> +
> +/* pid of 0 means purge all orphans */
> +
> +static void do_purge(struct dlm_ls *ls, int nodeid, int pid)
> +{
> +	struct dlm_lkb *lkb, *safe;
> +
> +	mutex_lock(&ls->ls_orphans_mutex);
> +	list_for_each_entry_safe(lkb, safe, &ls->ls_orphans, lkb_ownqueue) {
> +		if (pid && lkb->lkb_ownpid != pid)
> +			continue;
> +		unlock_proc_lock(ls, lkb);
> +		list_del_init(&lkb->lkb_ownqueue);
> +		dlm_put_lkb(lkb);
> +	}
> +	mutex_unlock(&ls->ls_orphans_mutex);
> +}
> +
> +static int send_purge(struct dlm_ls *ls, int nodeid, int pid)
> +{
> +	struct dlm_message *ms;
> +	struct dlm_mhandle *mh;
> +	int error;
> +
> +	error = _create_message(ls, sizeof(struct dlm_message), nodeid,
> +				DLM_MSG_PURGE, &ms, &mh);
> +	if (error)
> +		return error;
> +	ms->m_nodeid = nodeid;
> +	ms->m_pid = pid;
> +
> +	return send_message(mh, ms);
> +}
> +
> +int dlm_user_purge(struct dlm_ls *ls, struct dlm_user_proc *proc,
> +		   int nodeid, int pid)
> +{
> +	int error = 0;
> +
> +	if (nodeid != dlm_our_nodeid()) {
> +		error = send_purge(ls, nodeid, pid);
> +	} else {
> +		lock_recovery(ls);
> +		if (pid == current->pid)
> +			purge_proc_locks(ls, proc);
> +		else
> +			do_purge(ls, nodeid, pid);
> +		unlock_recovery(ls);
> +	}
> +	return error;
> +}
> +
> Index: linux-2.6.21-rc5-quilt/fs/dlm/dlm_internal.h
> ===================================================================
> --- linux-2.6.21-rc5-quilt.orig/fs/dlm/dlm_internal.h	2007-03-28 12:47:33.000000000 -0500
> +++ linux-2.6.21-rc5-quilt/fs/dlm/dlm_internal.h	2007-03-28 14:31:58.000000000 -0500
> @@ -342,6 +342,7 @@
>  #define DLM_MSG_LOOKUP		11
>  #define DLM_MSG_REMOVE		12
>  #define DLM_MSG_LOOKUP_REPLY	13
> +#define DLM_MSG_PURGE		14
>  
>  struct dlm_message {
>  	struct dlm_header	m_header;




More information about the Cluster-devel mailing list