Loading fs/ntfs/ChangeLog +1 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ ToDo/Notes: index entry is in the index root, we forgot to set the @ir pointer in the index context. Thanks to Yura Pakhuchiy for finding this bug. - Remove bogus setting of PageError in ntfs_read_compressed_block(). - Add fs/ntfs/attrib.[hc]::ntfs_resident_attr_value_resize(). 2.1.23 - Implement extension of resident files and make writing safe as well as many bug fixes, cleanups, and enhancements... Loading fs/ntfs/attrib.c +40 −0 Original line number Diff line number Diff line Loading @@ -1246,6 +1246,46 @@ int ntfs_attr_record_resize(MFT_RECORD *m, ATTR_RECORD *a, u32 new_size) return 0; } /** * ntfs_resident_attr_value_resize - resize the value of a resident attribute * @m: mft record containing attribute record * @a: attribute record whose value to resize * @new_size: new size in bytes to which to resize the attribute value of @a * * Resize the value of the attribute @a in the mft record @m to @new_size bytes. * If the value is made bigger, the newly allocated space is cleared. * * Return 0 on success and -errno on error. The following error codes are * defined: * -ENOSPC - Not enough space in the mft record @m to perform the resize. * * Note: On error, no modifications have been performed whatsoever. * * Warning: If you make a record smaller without having copied all the data you * are interested in the data may be overwritten. */ int ntfs_resident_attr_value_resize(MFT_RECORD *m, ATTR_RECORD *a, const u32 new_size) { u32 old_size; /* Resize the resident part of the attribute record. */ if (ntfs_attr_record_resize(m, a, le16_to_cpu(a->data.resident.value_offset) + new_size)) return -ENOSPC; /* * The resize succeeded! If we made the attribute value bigger, clear * the area between the old size and @new_size. */ old_size = le32_to_cpu(a->data.resident.value_length); if (new_size > old_size) memset((u8*)a + le16_to_cpu(a->data.resident.value_offset) + old_size, 0, new_size - old_size); /* Finally update the length of the attribute value. */ a->data.resident.value_length = cpu_to_le32(new_size); return 0; } /** * ntfs_attr_make_non_resident - convert a resident to a non-resident attribute * @ni: ntfs inode describing the attribute to convert Loading fs/ntfs/attrib.h +2 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,8 @@ extern int ntfs_attr_can_be_resident(const ntfs_volume *vol, const ATTR_TYPE type); extern int ntfs_attr_record_resize(MFT_RECORD *m, ATTR_RECORD *a, u32 new_size); extern int ntfs_resident_attr_value_resize(MFT_RECORD *m, ATTR_RECORD *a, const u32 new_size); extern int ntfs_attr_make_non_resident(ntfs_inode *ni); Loading Loading
fs/ntfs/ChangeLog +1 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ ToDo/Notes: index entry is in the index root, we forgot to set the @ir pointer in the index context. Thanks to Yura Pakhuchiy for finding this bug. - Remove bogus setting of PageError in ntfs_read_compressed_block(). - Add fs/ntfs/attrib.[hc]::ntfs_resident_attr_value_resize(). 2.1.23 - Implement extension of resident files and make writing safe as well as many bug fixes, cleanups, and enhancements... Loading
fs/ntfs/attrib.c +40 −0 Original line number Diff line number Diff line Loading @@ -1246,6 +1246,46 @@ int ntfs_attr_record_resize(MFT_RECORD *m, ATTR_RECORD *a, u32 new_size) return 0; } /** * ntfs_resident_attr_value_resize - resize the value of a resident attribute * @m: mft record containing attribute record * @a: attribute record whose value to resize * @new_size: new size in bytes to which to resize the attribute value of @a * * Resize the value of the attribute @a in the mft record @m to @new_size bytes. * If the value is made bigger, the newly allocated space is cleared. * * Return 0 on success and -errno on error. The following error codes are * defined: * -ENOSPC - Not enough space in the mft record @m to perform the resize. * * Note: On error, no modifications have been performed whatsoever. * * Warning: If you make a record smaller without having copied all the data you * are interested in the data may be overwritten. */ int ntfs_resident_attr_value_resize(MFT_RECORD *m, ATTR_RECORD *a, const u32 new_size) { u32 old_size; /* Resize the resident part of the attribute record. */ if (ntfs_attr_record_resize(m, a, le16_to_cpu(a->data.resident.value_offset) + new_size)) return -ENOSPC; /* * The resize succeeded! If we made the attribute value bigger, clear * the area between the old size and @new_size. */ old_size = le32_to_cpu(a->data.resident.value_length); if (new_size > old_size) memset((u8*)a + le16_to_cpu(a->data.resident.value_offset) + old_size, 0, new_size - old_size); /* Finally update the length of the attribute value. */ a->data.resident.value_length = cpu_to_le32(new_size); return 0; } /** * ntfs_attr_make_non_resident - convert a resident to a non-resident attribute * @ni: ntfs inode describing the attribute to convert Loading
fs/ntfs/attrib.h +2 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,8 @@ extern int ntfs_attr_can_be_resident(const ntfs_volume *vol, const ATTR_TYPE type); extern int ntfs_attr_record_resize(MFT_RECORD *m, ATTR_RECORD *a, u32 new_size); extern int ntfs_resident_attr_value_resize(MFT_RECORD *m, ATTR_RECORD *a, const u32 new_size); extern int ntfs_attr_make_non_resident(ntfs_inode *ni); Loading