[Ocfs2-devel] [PATCH 1/6] ocfs2/dlm: Add missing dlm_lock_put()s

Joel Becker Joel.Becker at oracle.com
Sun Mar 2 18:12:22 PST 2008


On Sat, Mar 01, 2008 at 02:04:20PM -0800, Sunil Mushran wrote:
> Normally locks for remote nodes are freed when that node sends an UNLOCK
> message to the master. The master node tags an DLM_UNLOCK_FREE_LOCK action
> to do an extra put on the lock at the end.
> 
> However, there are times when the master node has to free the locks for the
> remote nodes forcibly.
> 
> Two cases when this happens are:
> 1. When the master has migrated the lockres plus all locks to another node.
> 2. When the master is clearing all the locks of a dead node.
> 
> It was in the above two conditions that the dlm was missing the extra put.
> 
> Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com>
Signed-off-by: Joel Becker <joel.becker at oracle.com>

> ---
>  fs/ocfs2/dlm/dlmmaster.c   |    3 +++
>  fs/ocfs2/dlm/dlmrecovery.c |    9 +++++++++
>  2 files changed, 12 insertions(+), 0 deletions(-)
> 
> diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
> index a54d33d..eadf9bf 100644
> --- a/fs/ocfs2/dlm/dlmmaster.c
> +++ b/fs/ocfs2/dlm/dlmmaster.c
> @@ -2933,6 +2933,9 @@ static void dlm_remove_nonlocal_locks(struct dlm_ctxt *dlm,
>  				dlm_lockres_clear_refmap_bit(lock->ml.node, res);
>  				list_del_init(&lock->list);
>  				dlm_lock_put(lock);
> +				/* In a normal unlock, we would have added a
> +				 * DLM_UNLOCK_FREE_LOCK action. Force it. */
> +				dlm_lock_put(lock);
>  			}
>  		}
>  		queue++;
> diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c
> index 91f747b..8ef57c2 100644
> --- a/fs/ocfs2/dlm/dlmrecovery.c
> +++ b/fs/ocfs2/dlm/dlmrecovery.c
> @@ -2130,11 +2130,16 @@ static void dlm_free_dead_locks(struct dlm_ctxt *dlm,
>  	assert_spin_locked(&dlm->spinlock);
>  	assert_spin_locked(&res->spinlock);
>  
> +	/* We do two dlm_lock_put(). One for removing from list and the other is
> +	 * to force the DLM_UNLOCK_FREE_LOCK action so as to free the locks */
> +
>  	/* TODO: check pending_asts, pending_basts here */
>  	list_for_each_entry_safe(lock, next, &res->granted, list) {
>  		if (lock->ml.node == dead_node) {
>  			list_del_init(&lock->list);
>  			dlm_lock_put(lock);
> +			/* Can't schedule DLM_UNLOCK_FREE_LOCK - do manually */
> +			dlm_lock_put(lock);
>  			freed++;
>  		}
>  	}
> @@ -2142,6 +2147,8 @@ static void dlm_free_dead_locks(struct dlm_ctxt *dlm,
>  		if (lock->ml.node == dead_node) {
>  			list_del_init(&lock->list);
>  			dlm_lock_put(lock);
> +			/* Can't schedule DLM_UNLOCK_FREE_LOCK - do manually */
> +			dlm_lock_put(lock);
>  			freed++;
>  		}
>  	}
> @@ -2149,6 +2156,8 @@ static void dlm_free_dead_locks(struct dlm_ctxt *dlm,
>  		if (lock->ml.node == dead_node) {
>  			list_del_init(&lock->list);
>  			dlm_lock_put(lock);
> +			/* Can't schedule DLM_UNLOCK_FREE_LOCK - do manually */
> +			dlm_lock_put(lock);
>  			freed++;
>  		}
>  	}
> -- 
> 1.5.3.6
> 
> 
> _______________________________________________
> Ocfs2-devel mailing list
> Ocfs2-devel at oss.oracle.com
> http://oss.oracle.com/mailman/listinfo/ocfs2-devel

-- 

Life's Little Instruction Book #396

	"Never give anyone a fruitcake."

Joel Becker
Principal Software Developer
Oracle
E-mail: joel.becker at oracle.com
Phone: (650) 506-8127



More information about the Ocfs2-devel mailing list