|
@@ -157,18 +157,14 @@ out:
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * lock allocators, and reserving appropriate number of bits for
|
|
|
- * meta blocks and data clusters.
|
|
|
- *
|
|
|
- * in some cases, we don't need to reserve clusters, just let data_ac
|
|
|
- * be NULL.
|
|
|
+ * lock allocator, and reserve appropriate number of bits for
|
|
|
+ * meta blocks.
|
|
|
*/
|
|
|
-static int ocfs2_lock_allocators_move_extents(struct inode *inode,
|
|
|
+static int ocfs2_lock_meta_allocator_move_extents(struct inode *inode,
|
|
|
struct ocfs2_extent_tree *et,
|
|
|
u32 clusters_to_move,
|
|
|
u32 extents_to_split,
|
|
|
struct ocfs2_alloc_context **meta_ac,
|
|
|
- struct ocfs2_alloc_context **data_ac,
|
|
|
int extra_blocks,
|
|
|
int *credits)
|
|
|
{
|
|
@@ -193,13 +189,6 @@ static int ocfs2_lock_allocators_move_extents(struct inode *inode,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- if (data_ac) {
|
|
|
- ret = ocfs2_reserve_clusters(osb, clusters_to_move, data_ac);
|
|
|
- if (ret) {
|
|
|
- mlog_errno(ret);
|
|
|
- goto out;
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
*credits += ocfs2_calc_extend_credits(osb->sb, et->et_root_el);
|
|
|
|
|
@@ -259,10 +248,10 @@ static int ocfs2_defrag_extent(struct ocfs2_move_extents_context *context,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- ret = ocfs2_lock_allocators_move_extents(inode, &context->et, *len, 1,
|
|
|
- &context->meta_ac,
|
|
|
- &context->data_ac,
|
|
|
- extra_blocks, &credits);
|
|
|
+ ret = ocfs2_lock_meta_allocator_move_extents(inode, &context->et,
|
|
|
+ *len, 1,
|
|
|
+ &context->meta_ac,
|
|
|
+ extra_blocks, &credits);
|
|
|
if (ret) {
|
|
|
mlog_errno(ret);
|
|
|
goto out;
|
|
@@ -285,6 +274,21 @@ static int ocfs2_defrag_extent(struct ocfs2_move_extents_context *context,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Make sure ocfs2_reserve_cluster is called after
|
|
|
+ * __ocfs2_flush_truncate_log, otherwise, dead lock may happen.
|
|
|
+ *
|
|
|
+ * If ocfs2_reserve_cluster is called
|
|
|
+ * before __ocfs2_flush_truncate_log, dead lock on global bitmap
|
|
|
+ * may happen.
|
|
|
+ *
|
|
|
+ */
|
|
|
+ ret = ocfs2_reserve_clusters(osb, *len, &context->data_ac);
|
|
|
+ if (ret) {
|
|
|
+ mlog_errno(ret);
|
|
|
+ goto out_unlock_mutex;
|
|
|
+ }
|
|
|
+
|
|
|
handle = ocfs2_start_trans(osb, credits);
|
|
|
if (IS_ERR(handle)) {
|
|
|
ret = PTR_ERR(handle);
|
|
@@ -617,9 +621,10 @@ static int ocfs2_move_extent(struct ocfs2_move_extents_context *context,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- ret = ocfs2_lock_allocators_move_extents(inode, &context->et, len, 1,
|
|
|
- &context->meta_ac,
|
|
|
- NULL, extra_blocks, &credits);
|
|
|
+ ret = ocfs2_lock_meta_allocator_move_extents(inode, &context->et,
|
|
|
+ len, 1,
|
|
|
+ &context->meta_ac,
|
|
|
+ extra_blocks, &credits);
|
|
|
if (ret) {
|
|
|
mlog_errno(ret);
|
|
|
goto out;
|