Commit fa3be923 authored by Anton Altaparmakov's avatar Anton Altaparmakov

NTFS: Add an extra parameter @last_vcn to ntfs_get_size_for_mapping_pairs()

      and ntfs_mapping_pairs_build() to allow the runlist encoding to be
      partial which is desirable when filling holes in sparse attributes.
      Update all callers.
Signed-off-by: default avatarAnton Altaparmakov <aia21@cantab.net>
parent 1d58b27b
...@@ -135,6 +135,10 @@ ToDo/Notes: ...@@ -135,6 +135,10 @@ ToDo/Notes:
- Change the runlist terminator of the newly allocated cluster(s) to - Change the runlist terminator of the newly allocated cluster(s) to
LCN_ENOENT in ntfs_attr_make_non_resident(). Otherwise the runlist LCN_ENOENT in ntfs_attr_make_non_resident(). Otherwise the runlist
code gets confused. code gets confused.
- Add an extra parameter @last_vcn to ntfs_get_size_for_mapping_pairs()
and ntfs_mapping_pairs_build() to allow the runlist encoding to be
partial which is desirable when filling holes in sparse attributes.
Update all callers.
2.1.22 - Many bug and race fixes and error handling improvements. 2.1.22 - Many bug and race fixes and error handling improvements.
......
...@@ -1317,7 +1317,7 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni) ...@@ -1317,7 +1317,7 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni)
page = NULL; page = NULL;
} }
/* Determine the size of the mapping pairs array. */ /* Determine the size of the mapping pairs array. */
mp_size = ntfs_get_size_for_mapping_pairs(vol, rl, 0); mp_size = ntfs_get_size_for_mapping_pairs(vol, rl, 0, -1);
if (unlikely(mp_size < 0)) { if (unlikely(mp_size < 0)) {
err = mp_size; err = mp_size;
ntfs_debug("Failed to get size for mapping pairs array, error " ntfs_debug("Failed to get size for mapping pairs array, error "
...@@ -1416,7 +1416,7 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni) ...@@ -1416,7 +1416,7 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni)
cpu_to_sle64(attr_size); cpu_to_sle64(attr_size);
/* Generate the mapping pairs array into the attribute record. */ /* Generate the mapping pairs array into the attribute record. */
err = ntfs_mapping_pairs_build(vol, (u8*)a + mp_ofs, err = ntfs_mapping_pairs_build(vol, (u8*)a + mp_ofs,
arec_size - mp_ofs, rl, 0, NULL); arec_size - mp_ofs, rl, 0, -1, NULL);
if (unlikely(err)) { if (unlikely(err)) {
ntfs_debug("Failed to build mapping pairs, error code %i.", ntfs_debug("Failed to build mapping pairs, error code %i.",
err); err);
......
...@@ -1407,7 +1407,7 @@ static int ntfs_mft_bitmap_extend_allocation_nolock(ntfs_volume *vol) ...@@ -1407,7 +1407,7 @@ static int ntfs_mft_bitmap_extend_allocation_nolock(ntfs_volume *vol)
BUG_ON(ll < rl2->vcn); BUG_ON(ll < rl2->vcn);
BUG_ON(ll >= rl2->vcn + rl2->length); BUG_ON(ll >= rl2->vcn + rl2->length);
/* Get the size for the new mapping pairs array for this extent. */ /* Get the size for the new mapping pairs array for this extent. */
mp_size = ntfs_get_size_for_mapping_pairs(vol, rl2, ll); mp_size = ntfs_get_size_for_mapping_pairs(vol, rl2, ll, -1);
if (unlikely(mp_size <= 0)) { if (unlikely(mp_size <= 0)) {
ntfs_error(vol->sb, "Get size for mapping pairs failed for " ntfs_error(vol->sb, "Get size for mapping pairs failed for "
"mft bitmap attribute extent."); "mft bitmap attribute extent.");
...@@ -1441,7 +1441,7 @@ static int ntfs_mft_bitmap_extend_allocation_nolock(ntfs_volume *vol) ...@@ -1441,7 +1441,7 @@ static int ntfs_mft_bitmap_extend_allocation_nolock(ntfs_volume *vol)
/* Generate the mapping pairs array directly into the attr record. */ /* Generate the mapping pairs array directly into the attr record. */
ret = ntfs_mapping_pairs_build(vol, (u8*)a + ret = ntfs_mapping_pairs_build(vol, (u8*)a +
le16_to_cpu(a->data.non_resident.mapping_pairs_offset), le16_to_cpu(a->data.non_resident.mapping_pairs_offset),
mp_size, rl2, ll, NULL); mp_size, rl2, ll, -1, NULL);
if (unlikely(ret)) { if (unlikely(ret)) {
ntfs_error(vol->sb, "Failed to build mapping pairs array for " ntfs_error(vol->sb, "Failed to build mapping pairs array for "
"mft bitmap attribute."); "mft bitmap attribute.");
...@@ -1529,7 +1529,7 @@ static int ntfs_mft_bitmap_extend_allocation_nolock(ntfs_volume *vol) ...@@ -1529,7 +1529,7 @@ static int ntfs_mft_bitmap_extend_allocation_nolock(ntfs_volume *vol)
a->data.non_resident.mapping_pairs_offset), a->data.non_resident.mapping_pairs_offset),
old_alen - le16_to_cpu( old_alen - le16_to_cpu(
a->data.non_resident.mapping_pairs_offset), a->data.non_resident.mapping_pairs_offset),
rl2, ll, NULL)) { rl2, ll, -1, NULL)) {
ntfs_error(vol->sb, "Failed to restore mapping pairs " ntfs_error(vol->sb, "Failed to restore mapping pairs "
"array.%s", es); "array.%s", es);
NVolSetErrors(vol); NVolSetErrors(vol);
...@@ -1838,7 +1838,7 @@ static int ntfs_mft_data_extend_allocation_nolock(ntfs_volume *vol) ...@@ -1838,7 +1838,7 @@ static int ntfs_mft_data_extend_allocation_nolock(ntfs_volume *vol)
BUG_ON(ll < rl2->vcn); BUG_ON(ll < rl2->vcn);
BUG_ON(ll >= rl2->vcn + rl2->length); BUG_ON(ll >= rl2->vcn + rl2->length);
/* Get the size for the new mapping pairs array for this extent. */ /* Get the size for the new mapping pairs array for this extent. */
mp_size = ntfs_get_size_for_mapping_pairs(vol, rl2, ll); mp_size = ntfs_get_size_for_mapping_pairs(vol, rl2, ll, -1);
if (unlikely(mp_size <= 0)) { if (unlikely(mp_size <= 0)) {
ntfs_error(vol->sb, "Get size for mapping pairs failed for " ntfs_error(vol->sb, "Get size for mapping pairs failed for "
"mft data attribute extent."); "mft data attribute extent.");
...@@ -1877,7 +1877,7 @@ static int ntfs_mft_data_extend_allocation_nolock(ntfs_volume *vol) ...@@ -1877,7 +1877,7 @@ static int ntfs_mft_data_extend_allocation_nolock(ntfs_volume *vol)
/* Generate the mapping pairs array directly into the attr record. */ /* Generate the mapping pairs array directly into the attr record. */
ret = ntfs_mapping_pairs_build(vol, (u8*)a + ret = ntfs_mapping_pairs_build(vol, (u8*)a +
le16_to_cpu(a->data.non_resident.mapping_pairs_offset), le16_to_cpu(a->data.non_resident.mapping_pairs_offset),
mp_size, rl2, ll, NULL); mp_size, rl2, ll, -1, NULL);
if (unlikely(ret)) { if (unlikely(ret)) {
ntfs_error(vol->sb, "Failed to build mapping pairs array of " ntfs_error(vol->sb, "Failed to build mapping pairs array of "
"mft data attribute."); "mft data attribute.");
...@@ -1959,7 +1959,7 @@ static int ntfs_mft_data_extend_allocation_nolock(ntfs_volume *vol) ...@@ -1959,7 +1959,7 @@ static int ntfs_mft_data_extend_allocation_nolock(ntfs_volume *vol)
a->data.non_resident.mapping_pairs_offset), a->data.non_resident.mapping_pairs_offset),
old_alen - le16_to_cpu( old_alen - le16_to_cpu(
a->data.non_resident.mapping_pairs_offset), a->data.non_resident.mapping_pairs_offset),
rl2, ll, NULL)) { rl2, ll, -1, NULL)) {
ntfs_error(vol->sb, "Failed to restore mapping pairs " ntfs_error(vol->sb, "Failed to restore mapping pairs "
"array.%s", es); "array.%s", es);
NVolSetErrors(vol); NVolSetErrors(vol);
......
This diff is collapsed.
...@@ -84,11 +84,12 @@ extern runlist_element *ntfs_rl_find_vcn_nolock(runlist_element *rl, ...@@ -84,11 +84,12 @@ extern runlist_element *ntfs_rl_find_vcn_nolock(runlist_element *rl,
const VCN vcn); const VCN vcn);
extern int ntfs_get_size_for_mapping_pairs(const ntfs_volume *vol, extern int ntfs_get_size_for_mapping_pairs(const ntfs_volume *vol,
const runlist_element *rl, const VCN start_vcn); const runlist_element *rl, const VCN first_vcn,
const VCN last_vcn);
extern int ntfs_mapping_pairs_build(const ntfs_volume *vol, s8 *dst, extern int ntfs_mapping_pairs_build(const ntfs_volume *vol, s8 *dst,
const int dst_len, const runlist_element *rl, const int dst_len, const runlist_element *rl,
const VCN start_vcn, VCN *const stop_vcn); const VCN first_vcn, const VCN last_vcn, VCN *const stop_vcn);
extern int ntfs_rl_truncate_nolock(const ntfs_volume *vol, extern int ntfs_rl_truncate_nolock(const ntfs_volume *vol,
runlist *const runlist, const s64 new_length); runlist *const runlist, const s64 new_length);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment