ext4: use EXT_MAX_BLOCKS in ext4_es_can_be_merged()
authorLukas Czerner <lczerner@redhat.com>
Tue, 13 May 2014 02:21:43 +0000 (22:21 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 13 May 2014 02:21:43 +0000 (22:21 -0400)
In ext4_es_can_be_merged() when checking whether we can merge two
extents we should use EXT_MAX_BLOCKS instead of defining it manually.
Also if it is really the case we should notify userspace because clearly
there is a bug in extent status tree implementation since this should
never happen.

Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Reviewed-by: Zheng Liu <wenqing.lz@taobao.com>
fs/ext4/extents_status.c

index 98c90f5834eec1a639cf5642705cac834b81328d..3f5c188953a46012d7552feef11f3911f63aad3e 100644 (file)
@@ -344,8 +344,14 @@ static int ext4_es_can_be_merged(struct extent_status *es1,
        if (ext4_es_status(es1) != ext4_es_status(es2))
                return 0;
 
-       if (((__u64) es1->es_len) + es2->es_len > 0xFFFFFFFFULL)
+       if (((__u64) es1->es_len) + es2->es_len > EXT_MAX_BLOCKS) {
+               pr_warn("ES assertion failed when merging extents. "
+                       "The sum of lengths of es1 (%d) and es2 (%d) "
+                       "is bigger than allowed file size (%d)\n",
+                       es1->es_len, es2->es_len, EXT_MAX_BLOCKS);
+               WARN_ON(1);
                return 0;
+       }
 
        if (((__u64) es1->es_lblk) + es1->es_len != es2->es_lblk)
                return 0;