ex->ee_len   = orig_ex.ee_len;
                ext4_ext_store_pblock(ex, ext_pblock(&orig_ex));
                ext4_ext_dirty(handle, inode, path + depth);
-               return le16_to_cpu(ex->ee_len);
+               /* zeroed the full extent */
+               return allocated;
        }
 
        /* ex1: ee_block to iblock - 1 : uninitialized */
                                ex->ee_len   = orig_ex.ee_len;
                                ext4_ext_store_pblock(ex, ext_pblock(&orig_ex));
                                ext4_ext_dirty(handle, inode, path + depth);
-                               return le16_to_cpu(ex->ee_len);
+                               /* zeroed the full extent */
+                               return allocated;
 
                        } else if (err)
                                goto fix_extent_len;
 
+                       /*
+                        * We need to zero out the second half because
+                        * an fallocate request can update file size and
+                        * converting the second half to initialized extent
+                        * implies that we can leak some junk data to user
+                        * space.
+                        */
+                       err =  ext4_ext_zeroout(inode, ex3);
+                       if (err) {
+                               /*
+                                * We should actually mark the
+                                * second half as uninit and return error
+                                * Insert would have changed the extent
+                                */
+                               depth = ext_depth(inode);
+                               ext4_ext_drop_refs(path);
+                               path = ext4_ext_find_extent(inode,
+                                                               iblock, path);
+                               if (IS_ERR(path)) {
+                                       err = PTR_ERR(path);
+                                       return err;
+                               }
+                               ex = path[depth].p_ext;
+                               err = ext4_ext_get_access(handle, inode,
+                                                               path + depth);
+                               if (err)
+                                       return err;
+                               ext4_ext_mark_uninitialized(ex);
+                               ext4_ext_dirty(handle, inode, path + depth);
+                               return err;
+                       }
+
+                       /* zeroed the second half */
                        return allocated;
                }
                ex3 = &newex;
                        ex->ee_len   = orig_ex.ee_len;
                        ext4_ext_store_pblock(ex, ext_pblock(&orig_ex));
                        ext4_ext_dirty(handle, inode, path + depth);
-                       return le16_to_cpu(ex->ee_len);
+                       /* zeroed the full extent */
+                       return allocated;
 
                } else if (err)
                        goto fix_extent_len;
                        ex->ee_len   = orig_ex.ee_len;
                        ext4_ext_store_pblock(ex, ext_pblock(&orig_ex));
                        ext4_ext_dirty(handle, inode, path + depth);
-                       return le16_to_cpu(ex->ee_len);
+                       /* zero out the first half */
+                       return allocated;
                }
        }
        /*
                ex->ee_len   = orig_ex.ee_len;
                ext4_ext_store_pblock(ex, ext_pblock(&orig_ex));
                ext4_ext_dirty(handle, inode, path + depth);
-               return le16_to_cpu(ex->ee_len);
+               /* zero out the first half */
+               return allocated;
        } else if (err)
                goto fix_extent_len;
 out: