forked from Minki/linux
NTFS: Add fs/ntfs/attrib.[hc]::ntfs_resident_attr_value_resize().
Signed-off-by: Anton Altaparmakov <aia21@cantab.net>
This commit is contained in:
parent
f25dfb5e44
commit
0aacceacf3
@ -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...
|
||||
|
@ -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
|
||||
|
@ -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…
Reference in New Issue
Block a user