[Ocfs2-devel] [PATCH 2/2] ocfs2: Use ocfs2_rec_clusters in ocfs2_adjust_adjacent_records.
Tao Ma
tao.ma at oracle.com
Tue Jul 21 17:32:32 PDT 2009
Joel Becker wrote:
> On Tue, Jul 21, 2009 at 03:42:06PM +0800, Tao Ma wrote:
>
>> In ocfs2_adjust_adjacent_records, we will adjust adjacent records
>> according to the extent_list in the lower level. But actually
>> the lower level tree will either be a leaf or a branch. So we
>> shouldn't use ocfs2_is_empty_extent which is only valid for a
>> tree leaf. Use ocfs2_rec_clusters instead. We will meet with some
>> problem when the tree depth > 2.
>>
>
> I think you mean "if we leave it as checking e_leaf_clusters,
> we'll have a problem rotating trees with depth > 2". Is that right?
> Can interior nodes have these empty l_rec[0]s? If they can't, perhaps
> we should be bugging?
>
sorry, It should be tree_depth >=2.
ocfs2_adjust_adjacent_records is used to for rotation. And it only use
e_cpos in most cases.
So we don't have a problem if the lower 16 bits of e_int_clusters isn't
equal to 0 for a branch.
But if the low 16 bits are 0, this ocfs2_is_empty_extent will treat it
as an empty record and use the l_recs[1] which will corrupt
the tree. So let me give you a test case I meet.
Tree Depth: 2 Count: 23 Next Free Rec: 2
## Offset Clusters Block#
0 0 9107457 28721
1 9107457 1922049 28728
Tree Depth: 1 Count: 28 Next Free Rec: 28
## Offset Clusters Block#
0 0 227105 28698
1 227105 197405 28699
...
26 8372225 542208 28725
27 8914433 193024 28726
Tree Depth: 1 Count: 28 Next Free Rec: 10
## Offset Clusters Block#
0 9107457 196608 28727
1 9304065 204544 28729
In this case: 196608=0x30000, so if we use ocfs2_is_empty_extent will
treat it as 0, and use 9394065.
Regards,
Tao
More information about the Ocfs2-devel
mailing list