mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
NTFS: Fixup handling of sparse, compressed, and encrypted attributes in
fs/ntfs/aops.c::ntfs_readpage(). Signed-off-by: Anton Altaparmakov <aia21@cantab.net>
This commit is contained in:
parent
8273d5d4c2
commit
311120eca0
@ -76,11 +76,10 @@ ToDo/Notes:
|
|||||||
- Truncate {a,c,m}time to the ntfs supported time granularity when
|
- Truncate {a,c,m}time to the ntfs supported time granularity when
|
||||||
updating the times in the inode in ntfs_setattr().
|
updating the times in the inode in ntfs_setattr().
|
||||||
- Fixup handling of sparse, compressed, and encrypted attributes in
|
- Fixup handling of sparse, compressed, and encrypted attributes in
|
||||||
fs/ntfs/inode.c::ntfs_read_locked_{,attr_,index_}inode().
|
fs/ntfs/inode.c::ntfs_read_locked_{,attr_,index_}inode(),
|
||||||
|
fs/ntfs/aops.c::ntfs_{read,write}page().
|
||||||
- Make ntfs_write_block() not instantiate sparse blocks if they contain
|
- Make ntfs_write_block() not instantiate sparse blocks if they contain
|
||||||
only zeroes.
|
only zeroes.
|
||||||
- Fixup handling of sparse, compressed, and encrypted attributes in
|
|
||||||
fs/ntfs/aops.c::ntfs_writepage().
|
|
||||||
- Optimize fs/ntfs/aops.c::ntfs_write_block() by extending the page
|
- Optimize fs/ntfs/aops.c::ntfs_write_block() by extending the page
|
||||||
lock protection over the buffer submission for i/o which allows the
|
lock protection over the buffer submission for i/o which allows the
|
||||||
removal of the get_bh()/put_bh() pairs for each buffer.
|
removal of the get_bh()/put_bh() pairs for each buffer.
|
||||||
|
@ -379,31 +379,38 @@ retry_readpage:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
ni = NTFS_I(page->mapping->host);
|
ni = NTFS_I(page->mapping->host);
|
||||||
|
/*
|
||||||
|
* Only $DATA attributes can be encrypted and only unnamed $DATA
|
||||||
|
* attributes can be compressed. Index root can have the flags set but
|
||||||
|
* this means to create compressed/encrypted files, not that the
|
||||||
|
* attribute is compressed/encrypted.
|
||||||
|
*/
|
||||||
|
if (ni->type != AT_INDEX_ROOT) {
|
||||||
|
/* If attribute is encrypted, deny access, just like NT4. */
|
||||||
|
if (NInoEncrypted(ni)) {
|
||||||
|
BUG_ON(ni->type != AT_DATA);
|
||||||
|
err = -EACCES;
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
|
/* Compressed data streams are handled in compress.c. */
|
||||||
|
if (NInoNonResident(ni) && NInoCompressed(ni)) {
|
||||||
|
BUG_ON(ni->type != AT_DATA);
|
||||||
|
BUG_ON(ni->name_len);
|
||||||
|
return ntfs_read_compressed_block(page);
|
||||||
|
}
|
||||||
|
}
|
||||||
/* NInoNonResident() == NInoIndexAllocPresent() */
|
/* NInoNonResident() == NInoIndexAllocPresent() */
|
||||||
if (NInoNonResident(ni)) {
|
if (NInoNonResident(ni)) {
|
||||||
/*
|
/* Normal, non-resident data stream. */
|
||||||
* Only unnamed $DATA attributes can be compressed or
|
|
||||||
* encrypted.
|
|
||||||
*/
|
|
||||||
if (ni->type == AT_DATA && !ni->name_len) {
|
|
||||||
/* If file is encrypted, deny access, just like NT4. */
|
|
||||||
if (NInoEncrypted(ni)) {
|
|
||||||
err = -EACCES;
|
|
||||||
goto err_out;
|
|
||||||
}
|
|
||||||
/* Compressed data streams are handled in compress.c. */
|
|
||||||
if (NInoCompressed(ni))
|
|
||||||
return ntfs_read_compressed_block(page);
|
|
||||||
}
|
|
||||||
/* Normal data stream. */
|
|
||||||
return ntfs_read_block(page);
|
return ntfs_read_block(page);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Attribute is resident, implying it is not compressed or encrypted.
|
* Attribute is resident, implying it is not compressed or encrypted.
|
||||||
* This also means the attribute is smaller than an mft record and
|
* This also means the attribute is smaller than an mft record and
|
||||||
* hence smaller than a page, so can simply zero out any pages with
|
* hence smaller than a page, so can simply zero out any pages with
|
||||||
* index above 0.
|
* index above 0. Note the attribute can actually be marked compressed
|
||||||
|
* but if it is resident the actual data is not compressed so we are
|
||||||
|
* ok to ignore the compressed flag here.
|
||||||
*/
|
*/
|
||||||
if (unlikely(page->index > 0)) {
|
if (unlikely(page->index > 0)) {
|
||||||
kaddr = kmap_atomic(page, KM_USER0);
|
kaddr = kmap_atomic(page, KM_USER0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user