[Ocfs2-devel] [PATCH 22/39] ocfs2: Add refcount tree lock mechanism.
Tao Ma
tao.ma at oracle.com
Thu May 7 18:41:54 PDT 2009
Joel Becker wrote:
> On Thu, Apr 30, 2009 at 06:58:34AM +0800, Tao Ma wrote:
>> +/*
>> + * Lock the refcount tree pointed by ref_blkno and return the tree.
>> + * In most case, we lock the tree and read the refcount block.
>> + * So read it here if the caller really need it.
>> + */
>> +int ocfs2_lock_refcount_tree(struct ocfs2_super *osb, u64 ref_blkno, int rw,
>> + struct ocfs2_refcount_tree **ret_tree,
>> + struct buffer_head **ref_bh)
>> +{
>> + int ret;
>> + struct ocfs2_refcount_tree *tree = NULL;
>> +
>> + ret = ocfs2_get_refcount_tree(osb, ref_blkno, &tree);
>> + if (ret) {
>> + mlog_errno(ret);
>> + goto out;
>> + }
>> +
>> + ret = ocfs2_refcount_lock(&tree->rf_lockres, rw);
>> + if (ret) {
>> + mlog_errno(ret);
>> + goto out;
>> + }
>> +
>> + if (rw)
>> + down_write(&tree->rf_sem);
>> + else
>> + down_read(&tree->rf_sem);
>> +
>> + if (ref_bh) {
>> + ret = ocfs2_read_refcount_block(&tree->rf_ci,
>> + ref_blkno, ref_bh);
>> + if (ret) {
>> + mlog_errno(ret);
>> + ocfs2_unlock_refcount_tree(osb, tree, rw);
>> + goto out;
>> + }
>> + }
>> +
>> + *ret_tree = tree;
>> +out:
>> + return ret;
>> +}
>> +
>> +void ocfs2_unlock_refcount_tree(struct ocfs2_super *osb,
>> + struct ocfs2_refcount_tree *tree, int rw)
>> +{
>> + ocfs2_refcount_unlock(&tree->rf_lockres, rw);
>> +
>> + if (rw)
>> + up_write(&tree->rf_sem);
>> + else
>> + up_read(&tree->rf_sem);
>> +}
>
> You lock "cluster, mutex", but you also unlock "cluster, mutex".
> I would think you'd want to unlock "mutex, cluster".
yeah, I should use the reverse order.
Thanks.
Regards,
Tao
More information about the Ocfs2-devel
mailing list