Commit 25610ff9 authored by Konstantin Komarov's avatar Konstantin Komarov

fs/ntfs3: Fix transform resident to nonresident for compressed files

Сorrected calculation of required space len (in clusters)
for attribute data storage in case of compression.

Fixes: be71b5cb ("fs/ntfs3: Add attrib operations")
Signed-off-by: default avatarKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
parent 3cdad499
...@@ -231,7 +231,7 @@ int attr_make_nonresident(struct ntfs_inode *ni, struct ATTRIB *attr, ...@@ -231,7 +231,7 @@ int attr_make_nonresident(struct ntfs_inode *ni, struct ATTRIB *attr,
struct ntfs_sb_info *sbi; struct ntfs_sb_info *sbi;
struct ATTRIB *attr_s; struct ATTRIB *attr_s;
struct MFT_REC *rec; struct MFT_REC *rec;
u32 used, asize, rsize, aoff, align; u32 used, asize, rsize, aoff;
bool is_data; bool is_data;
CLST len, alen; CLST len, alen;
char *next; char *next;
...@@ -252,10 +252,13 @@ int attr_make_nonresident(struct ntfs_inode *ni, struct ATTRIB *attr, ...@@ -252,10 +252,13 @@ int attr_make_nonresident(struct ntfs_inode *ni, struct ATTRIB *attr,
rsize = le32_to_cpu(attr->res.data_size); rsize = le32_to_cpu(attr->res.data_size);
is_data = attr->type == ATTR_DATA && !attr->name_len; is_data = attr->type == ATTR_DATA && !attr->name_len;
align = sbi->cluster_size; /* len - how many clusters required to store 'rsize' bytes */
if (is_attr_compressed(attr)) if (is_attr_compressed(attr)) {
align <<= NTFS_LZNT_CUNIT; u8 shift = sbi->cluster_bits + NTFS_LZNT_CUNIT;
len = (rsize + align - 1) >> sbi->cluster_bits; len = ((rsize + (1u << shift) - 1) >> shift) << NTFS_LZNT_CUNIT;
} else {
len = bytes_to_cluster(sbi, rsize);
}
run_init(run); run_init(run);
......
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