mirror of https://gitee.com/openkylin/linux.git
Ocfs2/move_extents: Set several trivial constraints for threshold.
The threshold should be greater than clustersize and less than i_size. Signed-off-by: Tristan Ye <tristan.ye@oracle.com>
This commit is contained in:
parent
4dfa66bd59
commit
dda54e76d7
|
@ -220,6 +220,9 @@ static int ocfs2_lock_allocators_move_extents(struct inode *inode,
|
||||||
/*
|
/*
|
||||||
* Using one journal handle to guarantee the data consistency in case
|
* Using one journal handle to guarantee the data consistency in case
|
||||||
* crash happens anywhere.
|
* crash happens anywhere.
|
||||||
|
*
|
||||||
|
* XXX: defrag can end up with finishing partial extent as requested,
|
||||||
|
* due to not enough contiguous clusters can be found in allocator.
|
||||||
*/
|
*/
|
||||||
static int ocfs2_defrag_extent(struct ocfs2_move_extents_context *context,
|
static int ocfs2_defrag_extent(struct ocfs2_move_extents_context *context,
|
||||||
u32 cpos, u32 phys_cpos, u32 *len, int ext_flags)
|
u32 cpos, u32 phys_cpos, u32 *len, int ext_flags)
|
||||||
|
@ -876,9 +879,11 @@ static int __ocfs2_move_extents_range(struct buffer_head *di_bh,
|
||||||
else
|
else
|
||||||
len_to_move = 0;
|
len_to_move = 0;
|
||||||
|
|
||||||
if (do_defrag)
|
if (do_defrag) {
|
||||||
defrag_thresh = range->me_threshold >> osb->s_clustersize_bits;
|
defrag_thresh = range->me_threshold >> osb->s_clustersize_bits;
|
||||||
else
|
if (defrag_thresh <= 1)
|
||||||
|
goto done;
|
||||||
|
} else
|
||||||
new_phys_cpos = ocfs2_blocks_to_clusters(inode->i_sb,
|
new_phys_cpos = ocfs2_blocks_to_clusters(inode->i_sb,
|
||||||
range->me_goal);
|
range->me_goal);
|
||||||
|
|
||||||
|
@ -950,6 +955,7 @@ static int __ocfs2_move_extents_range(struct buffer_head *di_bh,
|
||||||
len_to_move -= alloc_size;
|
len_to_move -= alloc_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
range->me_flags |= OCFS2_MOVE_EXT_FL_COMPLETE;
|
range->me_flags |= OCFS2_MOVE_EXT_FL_COMPLETE;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -1098,13 +1104,17 @@ int ocfs2_ioctl_move_extents(struct file *filp, void __user *argp)
|
||||||
|
|
||||||
if (range.me_flags & OCFS2_MOVE_EXT_FL_AUTO_DEFRAG) {
|
if (range.me_flags & OCFS2_MOVE_EXT_FL_AUTO_DEFRAG) {
|
||||||
context->auto_defrag = 1;
|
context->auto_defrag = 1;
|
||||||
|
/*
|
||||||
|
* ok, the default theshold for the defragmentation
|
||||||
|
* is 1M, since our maximum clustersize was 1M also.
|
||||||
|
* any thought?
|
||||||
|
*/
|
||||||
if (!range.me_threshold)
|
if (!range.me_threshold)
|
||||||
/*
|
|
||||||
* ok, the default theshold for the defragmentation
|
|
||||||
* is 1M, since our maximum clustersize was 1M also.
|
|
||||||
* any thought?
|
|
||||||
*/
|
|
||||||
range.me_threshold = 1024 * 1024;
|
range.me_threshold = 1024 * 1024;
|
||||||
|
|
||||||
|
if (range.me_threshold > i_size_read(inode))
|
||||||
|
range.me_threshold = i_size_read(inode);
|
||||||
|
|
||||||
if (range.me_flags & OCFS2_MOVE_EXT_FL_PART_DEFRAG)
|
if (range.me_flags & OCFS2_MOVE_EXT_FL_PART_DEFRAG)
|
||||||
context->partial = 1;
|
context->partial = 1;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue