ext4: Avoid corrupting the uninitialized bit in the extent during truncate
The unitialized bit was not properly getting preserved in in an extent which is partially truncated because the it was geting set to the value of the first extent to be removed or truncated as part of the truncate operation, and if there are multiple extents are getting removed or modified as part of the truncate operation, it is only the last extent which will might be partially truncated, and its uninitalized bit is not necessarily the same as the first extent to be truncated. Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
parent
0eab928221
commit
a41f207169
|
@ -2083,12 +2083,16 @@ ext4_ext_rm_leaf(handle_t *handle, struct inode *inode,
|
||||||
ex = EXT_LAST_EXTENT(eh);
|
ex = EXT_LAST_EXTENT(eh);
|
||||||
|
|
||||||
ex_ee_block = le32_to_cpu(ex->ee_block);
|
ex_ee_block = le32_to_cpu(ex->ee_block);
|
||||||
if (ext4_ext_is_uninitialized(ex))
|
|
||||||
uninitialized = 1;
|
|
||||||
ex_ee_len = ext4_ext_get_actual_len(ex);
|
ex_ee_len = ext4_ext_get_actual_len(ex);
|
||||||
|
|
||||||
while (ex >= EXT_FIRST_EXTENT(eh) &&
|
while (ex >= EXT_FIRST_EXTENT(eh) &&
|
||||||
ex_ee_block + ex_ee_len > start) {
|
ex_ee_block + ex_ee_len > start) {
|
||||||
|
|
||||||
|
if (ext4_ext_is_uninitialized(ex))
|
||||||
|
uninitialized = 1;
|
||||||
|
else
|
||||||
|
uninitialized = 0;
|
||||||
|
|
||||||
ext_debug("remove ext %lu:%u\n", ex_ee_block, ex_ee_len);
|
ext_debug("remove ext %lu:%u\n", ex_ee_block, ex_ee_len);
|
||||||
path[depth].p_ext = ex;
|
path[depth].p_ext = ex;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue